pax_global_header00006660000000000000000000000064151502415070014512gustar00rootroot0000000000000052 comment=1157b746c37130685e0a02d8aa0871d1f164d5f4 ManimCommunity-manim-1157b74/000077500000000000000000000000001515024150700160335ustar00rootroot00000000000000ManimCommunity-manim-1157b74/.codecov.yml000066400000000000000000000003521515024150700202560ustar00rootroot00000000000000codecov: notify: require_ci_to_pass: no after_n_builds: 1 coverage: status: project: default: # Require 1% coverage, i.e., always succeed target: 1 patch: true changes: false comment: off ManimCommunity-manim-1157b74/.codespell_ignorewords000066400000000000000000000000451515024150700224270ustar00rootroot00000000000000 nam sherif falsy medias strager ManimCommunity-manim-1157b74/.codespellrc000066400000000000000000000002261515024150700203330ustar00rootroot00000000000000[codespell] check-hidden = True skip = .git,*.js,*.js.map,*.css,*.css.map,*.html,*.po,*.pot,uv.lock,*.log,*.svg ignore-words = .codespell_ignorewords ManimCommunity-manim-1157b74/.dockerignore000066400000000000000000000003171515024150700205100ustar00rootroot00000000000000.git # Development / test artifacts __pycache__ **/__pycache__ *.pyc *.pyo *.pyd *.egg-info dist/ build/ coverage.xml # Not needed to install the package docs/ tests/ example_scenes/ media/ logo/ scripts/ ManimCommunity-manim-1157b74/.flake8000066400000000000000000000026711515024150700172140ustar00rootroot00000000000000[flake8] # Exclude the grpc generated code exclude = ./manim/grpc/gen/*, __pycache__,.git, per-file-ignores = __init__.py:F401 max-complexity = 29 max-line-length = 88 statistics = True # Prevents some flake8-rst-docstrings errors rst-roles = attr,class,func,meth,mod,obj,ref,doc,exc rst-directives = manim, SEEALSO, seealso docstring-convention=numpy select = A,A00,B,B9,C4,C90,D,E,F,F,PT,RST,SIM,W,F401 # General Compatibility extend-ignore = E203, W503, D202, D212, D213, D404 # Misc F401, F403, F405, F841, E501, E731, E402, F811, F821, # multiple statements on one line (overload) E704, # Plug-in: flake8-builtins A001, A002, A003, # Plug-in: flake8-bugbear B006, B007, B008, B009, B010, B903, B950, # Plug-in: flake8-simplify SIM105, SIM106, SIM119, # Plug-in: flake8-pytest-style PT001, PT004, PT006, PT011, PT018, PT022, PT023, # Plug-in: flake8-docstrings D100, D101, D102, D103, D104, D105, D106, D107, D200, D202, D204, D205, D209, D301, D400, D401, D402, D403, D405, D406, D407, D409, D411, D412, D414, # Plug-in: flake8-rst-docstrings RST201, RST203, RST210, RST212, RST213, RST215, RST301, RST303, RST499 ManimCommunity-manim-1157b74/.git-blame-ignore-revs000066400000000000000000000001041515024150700221260ustar00rootroot00000000000000# Switched to ruff format: 24025b60d57301b0a59754c38d77bccd8ed69feb ManimCommunity-manim-1157b74/.gitattributes000066400000000000000000000003671515024150700207340ustar00rootroot00000000000000# Declare files that always have LF line endings on checkout * text eol=lf *.bat text eol=crlf # Denote all files that are truly binary and should not be modified *.npz binary *.png binary *.wav binary manim/grpc/gen/** linguist-generated=true ManimCommunity-manim-1157b74/.github/000077500000000000000000000000001515024150700173735ustar00rootroot00000000000000ManimCommunity-manim-1157b74/.github/ISSUE_TEMPLATE/000077500000000000000000000000001515024150700215565ustar00rootroot00000000000000ManimCommunity-manim-1157b74/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000032071515024150700242520ustar00rootroot00000000000000--- name: Manim bug about: Report a bug or unexpected behavior when running Manim title: "" labels: bug assignees: '' --- ## Description of bug / unexpected behavior ## Expected behavior ## How to reproduce the issue
Code for reproducing the problem ```py Paste your code here. ```
## Additional media files
Images/GIFs
## Logs
Terminal output ``` PASTE HERE OR PROVIDE LINK TO https://pastebin.com/ OR SIMILAR ```
## System specifications
System Details - OS (with version, e.g., Windows 10 v2004 or macOS 10.15 (Catalina)): - RAM: - Python version (`python/py/python3 --version`): - Installed modules (provide output from `pip list`): ``` PASTE HERE ```
LaTeX details + LaTeX distribution (e.g. TeX Live 2020): + Installed LaTeX packages:
## Additional comments ManimCommunity-manim-1157b74/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000007301515024150700253030ustar00rootroot00000000000000--- name: Feature request about: Request a new feature for Manim title: "" labels: new feature assignees: '' --- ## Description of proposed feature ## How can the new feature be used? ## Additional comments ManimCommunity-manim-1157b74/.github/ISSUE_TEMPLATE/installation_issue.md000066400000000000000000000031301515024150700260060ustar00rootroot00000000000000--- name: Installation issue about: Report issues with the installation process of Manim title: "" labels: bug, installation assignees: '' --- #### Preliminaries - [ ] I have followed the latest version of the [installation instructions](https://docs.manim.community/en/stable/installation.html). - [ ] I have checked the [installation FAQ](https://docs.manim.community/en/stable/faq/installation.html) and my problem is either not mentioned there, or the solution given there does not help. ## Description of error ## Installation logs
Terminal output ``` PASTE HERE OR PROVIDE LINK TO https://pastebin.com/ OR SIMILAR ```
## System specifications
System Details - OS (with version, e.g., Windows 10 v2004 or macOS 10.15 (Catalina)): - RAM: - Python version (`python/py/python3 --version`): - Installed modules (provide output from `pip list`): ``` PASTE HERE ```
LaTeX details + LaTeX distribution (e.g. TeX Live 2020): + Installed LaTeX packages:
## Additional comments ManimCommunity-manim-1157b74/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000023451515024150700232000ustar00rootroot00000000000000 ## Overview: What does this pull request change? ## Motivation and Explanation: Why and how do your changes improve the library? ## Links to added or changed documentation pages ## Further Information and Comments ## Reviewer Checklist - [ ] The PR title is descriptive enough for the changelog, and the PR is labeled correctly - [ ] If applicable: newly added non-private functions and classes have a docstring including a short summary and a PARAMETERS section - [ ] If applicable: newly added functions and classes are tested ManimCommunity-manim-1157b74/.github/PULL_REQUEST_TEMPLATE/000077500000000000000000000000001515024150700226525ustar00rootroot00000000000000ManimCommunity-manim-1157b74/.github/PULL_REQUEST_TEMPLATE/bugfix.md000066400000000000000000000017561515024150700244710ustar00rootroot00000000000000 ## Changelog ## Summary of Changes ## Checklist - [ ] I have read the [Contributing Guidelines](https://docs.manim.community/en/latest/contributing.html) - [ ] I have written a descriptive PR title (see top of PR template for examples) - [ ] I have added a test case to prevent software regression ## Reviewer Checklist - [ ] The PR title is descriptive enough - [ ] The PR is labeled appropriately - [ ] Regression test(s) are implemented ManimCommunity-manim-1157b74/.github/PULL_REQUEST_TEMPLATE/documentation.md000066400000000000000000000021221515024150700260420ustar00rootroot00000000000000 ## Summary of Changes ## Changelog ## Checklist - [ ] I have read the [Contributing Guidelines](https://docs.manim.community/en/latest/contributing.html) - [ ] I have written a descriptive PR title (see top of PR template for examples) - [ ] My new documentation builds, looks correctly formatted, and adds no additional build warnings ## Reviewer Checklist - [ ] The PR title is descriptive enough - [ ] The PR is labeled appropriately - [ ] Newly added documentation builds, looks correctly formatted, and adds no additional build warnings ManimCommunity-manim-1157b74/.github/PULL_REQUEST_TEMPLATE/hackathon.md000066400000000000000000000012541515024150700251360ustar00rootroot00000000000000Thanks for your contribution for the manim community hackathon! Please make sure your pull request has a meaningful title. E.g. "Example for the class Angle". Details for the submissions can be found in the [discord announcement channel](https://discord.com/channels/581738731934056449/581739610154074112/846460718479966228 ). Docstrings can be created in the discord channel with the manimator like this: ``` !mdocstring ``` ```python class HelloWorld(Scene): def construct(self): self.add(Circle()) ``` Copy+paste the output docstring to the right place in the source code. If you need any help, do not hesitate to ask the hackathon-mentors in the discord channel. ManimCommunity-manim-1157b74/.github/codeql.yml000066400000000000000000000010151515024150700213620ustar00rootroot00000000000000query-filters: - exclude: id: py/init-calls-subclass - exclude: id: py/unexpected-raise-in-special-method - exclude: id: py/modification-of-locals - exclude: id: py/multiple-calls-to-init - exclude: id: py/missing-call-to-init - exclude: id: py/method-first-arg-is-not-self - exclude: id: py/cyclic-import - exclude: id: py/unsafe-cyclic-import paths: - manim paths-ignore: - tests/ - example_scenes/ ManimCommunity-manim-1157b74/.github/dependabot.yml000066400000000000000000000004121515024150700222200ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" ignore: - dependency-name: "*" update-types: - "version-update:semver-minor" - "version-update:semver-patch" ManimCommunity-manim-1157b74/.github/manimdependency.json000066400000000000000000000024111515024150700234240ustar00rootroot00000000000000{ "windows": { "tinytex": [ "standalone", "preview", "doublestroke", "count1to", "multitoc", "prelim2e", "ragged2e", "everysel", "setspace", "rsfs", "relsize", "ragged2e", "fundus-calligra", "microtype", "wasysym", "physics", "dvisvgm", "jknapltx", "wasy", "cm-super", "babel-english", "gnu-freefont", "mathastext", "cbfonts-fd" ] }, "macos": { "tinytex": [ "standalone", "preview", "doublestroke", "count1to", "multitoc", "prelim2e", "ragged2e", "everysel", "setspace", "rsfs", "relsize", "ragged2e", "fundus-calligra", "microtype", "wasysym", "physics", "dvisvgm", "jknapltx", "wasy", "cm-super", "babel-english", "gnu-freefont", "mathastext", "cbfonts-fd" ] } } ManimCommunity-manim-1157b74/.github/release.yml000066400000000000000000000024031515024150700215350ustar00rootroot00000000000000# https://docs.github.com/en/repositories/releasing-projects-on-github/automatically-generated-release-notes changelog: exclude: labels: - duplicate/wontfix - invalid - question - release authors: - dependabot[bot] - pre-commit-ci[bot] categories: # High Impact - title: "Breaking Changes ๐Ÿšจ" labels: - breaking changes # Highlights - title: "Highlights ๐ŸŒŸ" labels: - highlight # User-facing - title: "New Features โœจ" labels: - new feature - title: "Enhancements ๐Ÿš€" labels: - enhancement - title: "Bug Fixes ๐Ÿ›" labels: - pr:bugfix - title: "Deprecations & Removals โš ๏ธ" labels: - pr:deprecation # Developer-facing - title: "Documentation ๐Ÿ“š" labels: - documentation - title: "Testing ๐Ÿงช" labels: - testing - title: "Infrastructure & Build ๐Ÿ”จ" labels: - infrastructure - title: "Code Quality & Refactoring ๐Ÿงน" labels: - maintenance - refactor - title: "Type Hints ๐Ÿ“" labels: - typehints # Catch-all (must be last) - title: "Other Changes" labels: - "*" ManimCommunity-manim-1157b74/.github/scripts/000077500000000000000000000000001515024150700210625ustar00rootroot00000000000000ManimCommunity-manim-1157b74/.github/scripts/ci_build_cairo.py000066400000000000000000000206301515024150700243640ustar00rootroot00000000000000# Logic is as follows: # 1. Download cairo source code: https://cairographics.org/releases/cairo-.tar.xz # 2. Verify the downloaded file using the sha256sums file: https://cairographics.org/releases/cairo-.tar.xz.sha256sum # 3. Extract the downloaded file. # 4. Create a virtual environment and install meson and ninja. # 5. Run meson build in the extracted directory. Also, set required prefix. # 6. Run meson compile -C build. # 7. Run meson install -C build. import hashlib import logging import os import subprocess import sys import tarfile import tempfile import urllib.request from collections.abc import Generator from contextlib import contextmanager from pathlib import Path from sys import stdout CAIRO_VERSION = "1.18.0" CAIRO_URL = f"https://cairographics.org/releases/cairo-{CAIRO_VERSION}.tar.xz" CAIRO_SHA256_URL = f"{CAIRO_URL}.sha256sum" VENV_NAME = "meson-venv" BUILD_DIR = "build" INSTALL_PREFIX = Path(__file__).parent.parent.parent / "third_party" / "cairo" logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") logger = logging.getLogger(__name__) def is_ci(): return os.getenv("CI", None) is not None def download_file(url, path): logger.info(f"Downloading {url} to {path}") block_size = 1024 * 1024 with urllib.request.urlopen(url) as response, open(path, "wb") as file: while True: data = response.read(block_size) if not data: break file.write(data) def verify_sha256sum(path, sha256sum): with open(path, "rb") as file: file_hash = hashlib.sha256(file.read()).hexdigest() if file_hash != sha256sum: raise Exception("SHA256SUM does not match") def extract_tar_xz(path, directory): with tarfile.open(path) as file: file.extractall(directory) def run_command(command, cwd=None, env=None): process = subprocess.Popen(command, cwd=cwd, env=env) process.communicate() if process.returncode != 0: raise Exception("Command failed") @contextmanager def gha_group(title: str) -> Generator: if not is_ci(): yield return print(f"\n::group::{title}") stdout.flush() try: yield finally: print("::endgroup::") stdout.flush() def set_env_var_gha(name: str, value: str) -> None: if not is_ci(): return env_file = os.getenv("GITHUB_ENV", None) if env_file is None: return with open(env_file, "a") as file: file.write(f"{name}={value}\n") stdout.flush() def get_ld_library_path(prefix: Path) -> str: # given a prefix, the ld library path can be found at # /lib/* or sometimes just /lib # this function returns the path to the ld library path # first, check if the ld library path exists at /lib/* ld_library_paths = list(prefix.glob("lib/*")) if len(ld_library_paths) == 1: return ld_library_paths[0].absolute().as_posix() # if the ld library path does not exist at /lib/*, # return /lib ld_library_path = prefix / "lib" if ld_library_path.exists(): return ld_library_path.absolute().as_posix() return "" def main(): if sys.platform == "win32": logger.info("Skipping build on windows") return with tempfile.TemporaryDirectory() as tmpdir: with gha_group("Downloading and Extracting Cairo"): logger.info(f"Downloading cairo version {CAIRO_VERSION}") download_file(CAIRO_URL, os.path.join(tmpdir, "cairo.tar.xz")) logger.info("Downloading cairo sha256sum") download_file(CAIRO_SHA256_URL, os.path.join(tmpdir, "cairo.sha256sum")) logger.info("Verifying cairo sha256sum") with open(os.path.join(tmpdir, "cairo.sha256sum")) as file: sha256sum = file.read().split()[0] verify_sha256sum(os.path.join(tmpdir, "cairo.tar.xz"), sha256sum) logger.info("Extracting cairo") extract_tar_xz(os.path.join(tmpdir, "cairo.tar.xz"), tmpdir) with gha_group("Installing meson and ninja"): logger.info("Creating virtual environment") run_command([sys.executable, "-m", "venv", os.path.join(tmpdir, VENV_NAME)]) logger.info("Installing meson and ninja") run_command( [ os.path.join(tmpdir, VENV_NAME, "bin", "pip"), "install", "meson", "ninja", ] ) # Inherit the current environment so PKG_CONFIG_PATH, CFLAGS, LDFLAGS, etc. are preserved. env_vars = os.environ.copy() # Prepend the venv bin directory so meson/ninja from the venv are used. env_vars["PATH"] = f"{os.path.join(tmpdir, VENV_NAME, 'bin')}{os.pathsep}{env_vars.get('PATH','')}" # Ensure Homebrew-provided pkgconfig and include/lib paths are present on macOS ARM. if sys.platform == "darwin": try: # Try to get specific prefix for lzo (safer for opt path), fall back to generic brew prefix. brew_prefix = subprocess.check_output(["brew", "--prefix", "lzo"], text=True).strip() except subprocess.CalledProcessError: try: brew_prefix = subprocess.check_output(["brew", "--prefix"], text=True).strip() except Exception: brew_prefix = None if brew_prefix: # pkg-config files can live in lib/pkgconfig or opt//lib/pkgconfig pkgconfig_paths = [f"{brew_prefix}/lib/pkgconfig", f"{brew_prefix}/opt/lzo/lib/pkgconfig"] # merge with any existing PKG_CONFIG_PATH existing_pc = env_vars.get("PKG_CONFIG_PATH", "") merged_pc = ":".join([p for p in pkgconfig_paths if p]) + (f":{existing_pc}" if existing_pc else "") env_vars["PKG_CONFIG_PATH"] = merged_pc # Ensure compiler & linker flags include brew include/lib existing_cflags = env_vars.get("CFLAGS", "") existing_ldflags = env_vars.get("LDFLAGS", "") env_vars["CFLAGS"] = f"-I{brew_prefix}/include {existing_cflags}".strip() env_vars["LDFLAGS"] = f"-L{brew_prefix}/lib {existing_ldflags}".strip() # Debugging: log environment keys relevant to detection # logger.info(f"env vars for meson: {env_vars}") with gha_group("Building and Installing Cairo"): logger.info("Running meson setup") run_command( [ os.path.join(tmpdir, VENV_NAME, "bin", "meson"), "setup", BUILD_DIR, f"--prefix={INSTALL_PREFIX.absolute().as_posix()}", "--buildtype=release", "-Dtests=disabled", ], cwd=os.path.join(tmpdir, f"cairo-{CAIRO_VERSION}"), env=env_vars, ) logger.info("Running meson compile") run_command( [ os.path.join(tmpdir, VENV_NAME, "bin", "meson"), "compile", "-C", BUILD_DIR, ], cwd=os.path.join(tmpdir, f"cairo-{CAIRO_VERSION}"), env=env_vars, ) logger.info("Running meson install") run_command( [ os.path.join(tmpdir, VENV_NAME, "bin", "meson"), "install", "-C", BUILD_DIR, ], cwd=os.path.join(tmpdir, f"cairo-{CAIRO_VERSION}"), env=env_vars, ) logger.info(f"Successfully built cairo and installed it to {INSTALL_PREFIX}") if __name__ == "__main__": if "--set-env-vars" in sys.argv: with gha_group("Setting environment variables"): # append the pkgconfig directory to PKG_CONFIG_PATH set_env_var_gha( "PKG_CONFIG_PATH", f"{Path(get_ld_library_path(INSTALL_PREFIX), 'pkgconfig').as_posix()}{os.pathsep}" f'{os.getenv("PKG_CONFIG_PATH", "")}', ) set_env_var_gha( "LD_LIBRARY_PATH", f"{get_ld_library_path(INSTALL_PREFIX)}{os.pathsep}" f'{os.getenv("LD_LIBRARY_PATH", "")}', ) sys.exit(0) main() ManimCommunity-manim-1157b74/.github/workflows/000077500000000000000000000000001515024150700214305ustar00rootroot00000000000000ManimCommunity-manim-1157b74/.github/workflows/cffconvert.yml000066400000000000000000000006321515024150700243130ustar00rootroot00000000000000name: cffconvert on: push: paths: - CITATION.cff jobs: validate: name: "validate" runs-on: ubuntu-latest steps: - name: Check out a copy of the repository uses: actions/checkout@v6 - name: Check whether the citation metadata from CITATION.cff is valid uses: citation-file-format/cffconvert-github-action@2.0.0 with: args: "--validate" ManimCommunity-manim-1157b74/.github/workflows/ci.yml000066400000000000000000000136701515024150700225550ustar00rootroot00000000000000name: CI concurrency: group: ${{ github.ref }} cancel-in-progress: true on: push: branches: - main pull_request: branches: - main jobs: test: runs-on: ${{ matrix.os }} env: DISPLAY: :0 PYTEST_ADDOPTS: "--color=yes" # colors in pytest PYTHONIOENCODING: "utf8" strategy: fail-fast: false matrix: os: [ubuntu-22.04, macos-latest, windows-latest] python: ["3.11", "3.12", "3.13", "3.14"] include: - os: macos-15-intel python: "3.13" steps: - name: Checkout the repository uses: actions/checkout@v6 - name: Setup Python ${{ matrix.python }} uses: actions/setup-python@v6 with: python-version: ${{ matrix.python }} - name: Install uv uses: astral-sh/setup-uv@v7 with: enable-cache: true - name: Setup cache variables shell: bash id: cache-vars run: | echo "date=$(/bin/date -u "+%m%w%Y")" >> $GITHUB_OUTPUT - name: Install system dependencies (Linux) if: runner.os == 'Linux' uses: awalsh128/cache-apt-pkgs-action@latest with: packages: python3-opengl libpango1.0-dev xvfb freeglut3-dev version: 1.0 - name: Install Texlive (Linux) if: runner.os == 'Linux' uses: zauguin/install-texlive@v4 with: packages: > scheme-basic latex fontspec tipa calligra xcolor standalone preview doublestroke setspace rsfs relsize ragged2e fundus-calligra microtype wasysym physics dvisvgm jknapltx wasy cm-super babel-english gnu-freefont mathastext cbfonts-fd xetex - name: Start virtual display (Linux) if: runner.os == 'Linux' run: | # start xvfb in background sudo /usr/bin/Xvfb $DISPLAY -screen 0 1280x1024x24 & - name: Setup Cairo Cache uses: actions/cache@v5 id: cache-cairo if: runner.os == 'Linux' || runner.os == 'macOS' with: path: ${{ github.workspace }}/third_party key: ${{ runner.os }}-${{ runner.arch }}-dependencies-cairo-${{ hashFiles('.github/scripts/ci_build_cairo.py') }} - name: Build and install Cairo (Linux and macOS) if: (runner.os == 'Linux' || runner.os == 'macOS') && steps.cache-cairo.outputs.cache-hit != 'true' run: python .github/scripts/ci_build_cairo.py - name: Set env vars for Cairo (Linux and macOS) if: runner.os == 'Linux' || runner.os == 'macOS' run: python .github/scripts/ci_build_cairo.py --set-env-vars - name: Setup macOS cache uses: actions/cache@v5 id: cache-macos if: runner.os == 'macOS' with: path: ${{ github.workspace }}/macos-cache key: ${{ runner.os }}-dependencies-tinytex-${{ hashFiles('.github/manimdependency.json') }}-${{ steps.cache-vars.outputs.date }}-1 - name: Install system dependencies (MacOS) if: runner.os == 'macOS' && steps.cache-macos.outputs.cache-hit != 'true' run: | tinyTexPackages=$(python -c "import json;print(' '.join(json.load(open('.github/manimdependency.json'))['macos']['tinytex']))") IFS=' ' read -a ttp <<< "$tinyTexPackages" oriPath=$PATH sudo mkdir -p $PWD/macos-cache echo "Install TinyTeX" sudo curl -L -o "/tmp/TinyTeX.tgz" "https://github.com/yihui/tinytex-releases/releases/download/daily/TinyTeX-1.tgz" sudo tar zxf "/tmp/TinyTeX.tgz" -C "$PWD/macos-cache" export PATH="$PWD/macos-cache/TinyTeX/bin/universal-darwin:$PATH" sudo tlmgr update --self for i in "${ttp[@]}"; do sudo tlmgr install "$i" done export PATH="$oriPath" echo "Completed TinyTeX" - name: Add macOS dependencies to PATH if: runner.os == 'macOS' shell: bash run: | echo "/Library/TeX/texbin" >> $GITHUB_PATH echo "$PWD/macos-cache/TinyTeX/bin/universal-darwin" >> $GITHUB_PATH - name: Setup Windows cache id: cache-windows if: runner.os == 'Windows' uses: actions/cache@v5 with: path: ${{ github.workspace }}\ManimCache key: ${{ runner.os }}-dependencies-tinytex-${{ hashFiles('.github/manimdependency.json') }}-${{ steps.cache-vars.outputs.date }}-1 - uses: ssciwr/setup-mesa-dist-win@v2 - name: Install system dependencies (Windows) if: runner.os == 'Windows' && steps.cache-windows.outputs.cache-hit != 'true' run: | $tinyTexPackages = $(python -c "import json;print(' '.join(json.load(open('.github/manimdependency.json'))['windows']['tinytex']))") -Split ' ' $OriPath = $env:PATH echo "Install Tinytex" Invoke-WebRequest "https://github.com/yihui/tinytex-releases/releases/download/daily/TinyTeX-1.zip" -OutFile "$($env:TMP)\TinyTex.zip" Expand-Archive -LiteralPath "$($env:TMP)\TinyTex.zip" -DestinationPath "$($PWD)\ManimCache\LatexWindows" $env:Path = "$($PWD)\ManimCache\LatexWindows\TinyTeX\bin\windows;$($env:PATH)" tlmgr update --self tlmgr install $tinyTexPackages $env:PATH=$OriPath echo "Completed Latex" - name: Add Windows dependencies to PATH if: runner.os == 'Windows' run: | $env:Path += ";" + "$($PWD)\ManimCache\LatexWindows\TinyTeX\bin\windows" echo "$env:Path" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - name: Install dependencies and manim run: | uv sync --all-extras --locked - name: Run tests run: | uv run python -m pytest - name: Run module doctests run: | uv run python -m pytest -v --cov-append --ignore-glob="*opengl*" --doctest-modules manim - name: Run doctests in rst files run: | cd docs && uv run make doctest O=-tskip-manim ManimCommunity-manim-1157b74/.github/workflows/codeql.yml000066400000000000000000000015561515024150700234310ustar00rootroot00000000000000name: "CodeQL" on: push: branches: [ "main" ] pull_request: branches: [ "main" ] schedule: - cron: "21 16 * * 3" jobs: analyze: name: Analyze runs-on: ubuntu-latest permissions: actions: read contents: read security-events: write strategy: fail-fast: false matrix: language: [ python ] steps: - name: Checkout uses: actions/checkout@v6 - name: Initialize CodeQL uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} config-file: ./.github/codeql.yml queries: +security-and-quality - name: Autobuild uses: github/codeql-action/autobuild@v4 - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v4 with: category: "/language:${{ matrix.language }}" ManimCommunity-manim-1157b74/.github/workflows/dependent-issues.yml000066400000000000000000000015771515024150700254440ustar00rootroot00000000000000name: Dependent Issues on: issues: types: - opened - edited - reopened pull_request_target: types: - opened - edited - reopened - synchronize schedule: - cron: '0 0 * * *' # schedule daily check jobs: check: runs-on: ubuntu-latest steps: - uses: z0al/dependent-issues@v1 env: # (Required) The token to use to make API calls to GitHub. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: # (Optional) The label to use to mark dependent issues label: dependent # (Optional) Enable checking for dependencies in issues. Enable by # setting the value to "on". Default "off" check_issues: on # (Optional) A comma-separated list of keywords. Default # "depends on, blocked by" keywords: depends on, blocked by ManimCommunity-manim-1157b74/.github/workflows/publish-docker.yml000066400000000000000000000035601515024150700250720ustar00rootroot00000000000000name: Publish Docker Image on: push: branches: - main release: types: [released] jobs: docker-latest: runs-on: ubuntu-latest if: github.event_name != 'release' steps: - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Build and push uses: docker/build-push-action@v6 with: platforms: linux/arm64,linux/amd64 push: true file: docker/Dockerfile tags: | manimcommunity/manim:latest docker-release: runs-on: ubuntu-latest if: github.event_name == 'release' steps: - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to DockerHub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Get Version id: create_release shell: python env: tag_act: ${{ github.ref }} run: | import os ref_tag = os.getenv('tag_act').split('/')[-1] with open(os.getenv('GITHUB_OUTPUT'), 'w') as f: print(f"tag_name={ref_tag}", file=f) - name: Build and push uses: docker/build-push-action@v6 with: platforms: linux/arm64,linux/amd64 push: true file: docker/Dockerfile tags: | manimcommunity/manim:stable manimcommunity/manim:latest manimcommunity/manim:${{ steps.create_release.outputs.tag_name }} ManimCommunity-manim-1157b74/.github/workflows/python-publish.yml000066400000000000000000000020331515024150700251360ustar00rootroot00000000000000name: Publish Release on: release: types: [released] jobs: release: name: "Publish release" runs-on: ubuntu-latest environment: release permissions: id-token: write contents: write steps: - uses: actions/checkout@v6 - name: Install dependencies run: sudo apt-get update && sudo apt-get install -y build-essential python3-dev libcairo2-dev libpango1.0-dev - name: Set up Python 3.13 uses: actions/setup-python@v6 with: python-version: 3.13 - name: Install uv uses: astral-sh/setup-uv@v7 - name: Build and push release to PyPI run: | uv build uv publish - name: Store artifacts uses: actions/upload-artifact@v6 with: path: dist/*.tar.gz name: manim.tar.gz - name: Upload Release Asset shell: bash env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | TAG=${{ github.event.release.tag_name }} gh release upload "$TAG" "dist/manim-${TAG#v}.tar.gz" ManimCommunity-manim-1157b74/.github/workflows/release-publish-documentation.yml000066400000000000000000000053341515024150700301130ustar00rootroot00000000000000name: Publish downloadable documentation on: release: types: [released] workflow_dispatch: jobs: build-and-publish-htmldocs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Set up Python uses: actions/setup-python@v6 with: python-version: 3.13 - name: Install uv uses: astral-sh/setup-uv@v7 - name: Install system dependencies run: | sudo apt update && sudo apt install -y \ pkg-config libcairo-dev libpango1.0-dev wget fonts-roboto wget -qO- "https://yihui.org/tinytex/install-bin-unix.sh" | sh echo ${HOME}/.TinyTeX/bin/x86_64-linux >> $GITHUB_PATH - name: Install LaTeX and Python dependencies run: | tlmgr update --self tlmgr install \ babel-english ctex doublestroke dvisvgm frcursive fundus-calligra jknapltx \ mathastext microtype physics preview ragged2e relsize rsfs setspace standalone \ wasy wasysym uv sync - name: Build and package documentation run: | cd docs/ uv run make html cd build/html/ tar -czvf ../html-docs.tar.gz * - name: Store artifacts uses: actions/upload-artifact@v6 with: path: ${{ github.workspace }}/docs/build/html-docs.tar.gz name: html-docs.tar.gz - name: Install Dependency run: pip install requests - name: Get Upload URL if: github.event == 'release' id: create_release shell: python env: access_token: ${{ secrets.GITHUB_TOKEN }} tag_act: ${{ github.ref }} run: | import requests import os ref_tag = os.getenv('tag_act').split('/')[-1] access_token = os.getenv('access_token') headers = { "Accept":"application/vnd.github.v3+json", "Authorization": f"token {access_token}" } url = f"https://api.github.com/repos/ManimCommunity/manim/releases/tags/{ref_tag}" c = requests.get(url,headers=headers) upload_url=c.json()['upload_url'] with open(os.getenv('GITHUB_OUTPUT'), 'w') as f: print(f"upload_url={upload_url}", file=f) print(f"tag_name={ref_tag[1:]}", file=f) - name: Upload Release Asset if: github.event == 'release' id: upload-release uses: actions/upload-release-asset@v1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: upload_url: ${{ steps.create_release.outputs.upload_url }} asset_path: ${{ github.workspace }}/docs/build/html-docs.tar.gz asset_name: manim-htmldocs-${{ steps.create_release.outputs.tag_name }}.tar.gz asset_content_type: application/gzip ManimCommunity-manim-1157b74/.gitignore000066400000000000000000000036241515024150700200300ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ *.log # Sphinx documentation docs/_build/ docs/build/ docs/source/_autosummary/ docs/source/reference/ docs/source/_build/ docs/rendering_times.csv #i18n docs/i18n/gettext/.doctrees docs/i18n/**/*.mo docs/i18n/translatable.po docs/i18n/untranslatable.po # PyBuilder target/ # Jupyter Notebook jupyter/ .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # PyCharm /.idea/ # Celery stuff celerybeat-schedule celerybeat.pid # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json *.pyc *.bak .DS_Store .floo .flooignore .vscode .vs *.xml *.iml media .eggs/ build/ dist/ /media_dir.txt # ^TODO: Remove the need for this with a proper config file # Ignore the built dependencies third_party/* ManimCommunity-manim-1157b74/.pre-commit-config.yaml000066400000000000000000000021461515024150700223170ustar00rootroot00000000000000default_stages: [pre-commit, pre-push] fail_fast: false exclude: ^(manim/grpc/gen/|docs/i18n/) repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: check-ast name: Validate Python - id: trailing-whitespace - id: mixed-line-ending - id: end-of-file-fixer - id: check-toml name: Validate pyproject.toml - repo: https://github.com/codespell-project/codespell rev: v2.4.1 hooks: - id: codespell files: ^.*\.(py|md|rst)$ args: ["-L", "medias,nam"] - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.14.10 hooks: - id: ruff name: ruff lint types: [python] args: [--exit-non-zero-on-fix] - id: ruff-format types: [python] - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.19.1 hooks: - id: mypy additional_dependencies: [ types-backports, types-decorator, types-docutils, types-requests, types-setuptools, ] files: ^manim/ ManimCommunity-manim-1157b74/.pylintrc000066400000000000000000000433051515024150700177050ustar00rootroot00000000000000[MASTER] # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code. extension-pkg-whitelist= # Specify a score threshold to be exceeded before program exits with error. fail-under=10.0 # Add files or directories to the blacklist. They should be base names, not # paths. ignore=CVS # Add files or directories matching the regex patterns to the blacklist. The # regex matches against base names, not paths. ignore-patterns= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the # number of processors available to use. jobs=1 # Control the amount of potential inferred values when inferring a single # object. This can help the performance when dealing with large functions or # complex, nested conditions. limit-inference-results=100 # List of plugins (as comma separated values of python module names) to load, # usually to register additional checkers. load-plugins= # Pickle collected data for later comparisons. persistent=yes # When enabled, pylint would attempt to guess common misconfiguration and emit # user-friendly hints instead of false-positive error messages. suggestion-mode=yes # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. confidence= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once). You can also use "--disable=all" to # disable everything first and then re-enable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use "--disable=all --enable=classes # --disable=W". disable=print-statement, parameter-unpacking, unpacking-in-except, old-raise-syntax, backtick, long-suffix, old-ne-operator, old-octal-literal, import-star-module-level, non-ascii-bytes-literal, raw-checker-failed, bad-inline-option, locally-disabled, file-ignored, suppressed-message, useless-suppression, deprecated-pragma, use-symbolic-message-instead, apply-builtin, basestring-builtin, buffer-builtin, cmp-builtin, coerce-builtin, execfile-builtin, file-builtin, long-builtin, raw_input-builtin, reduce-builtin, standarderror-builtin, unicode-builtin, xrange-builtin, coerce-method, delslice-method, getslice-method, setslice-method, no-absolute-import, old-division, dict-iter-method, dict-view-method, next-method-called, metaclass-assignment, indexing-exception, raising-string, reload-builtin, oct-method, hex-method, nonzero-method, cmp-method, input-builtin, round-builtin, intern-builtin, unichr-builtin, map-builtin-not-iterating, zip-builtin-not-iterating, range-builtin-not-iterating, filter-builtin-not-iterating, using-cmp-argument, eq-without-hash, div-method, idiv-method, rdiv-method, exception-message-attribute, invalid-str-codec, sys-max-int, bad-python3-import, deprecated-string-function, deprecated-str-translate-call, deprecated-itertools-function, deprecated-types-field, next-method-defined, dict-items-not-iterating, dict-keys-not-iterating, dict-values-not-iterating, deprecated-operator-function, deprecated-urllib-function, xreadlines-attribute, deprecated-sys-function, exception-escape, comprehension-escape, fixme, missing-function-docstring # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). See also the "--disable" option for examples. enable=c-extension-no-member [REPORTS] # Python expression which should return a score less than or equal to 10. You # have access to the variables 'error', 'warning', 'refactor', and 'convention' # which contain the number of messages in each category, as well as 'statement' # which is the total number of statements analyzed. This score is used by the # global evaluation report (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details. #msg-template= # Set the output format. Available formats are text, parseable, colorized, json # and msvs (visual studio). You can also give a reporter class, e.g. # mypackage.mymodule.MyReporterClass. output-format=text # Tells whether to display a full report or only the messages. reports=no # Activate the evaluation score. score=yes [REFACTORING] # Maximum number of nested blocks for function / method body max-nested-blocks=5 # Complete name of functions that never returns. When checking for # inconsistent-return-statements if a never returning function is called then # it will be considered as an explicit return statement and no message will be # printed. never-returning-functions=sys.exit [BASIC] # Naming style matching correct argument names. argument-naming-style=snake_case # Regular expression matching correct argument names. Overrides argument- # naming-style. #argument-rgx= # Naming style matching correct attribute names. attr-naming-style=snake_case # Regular expression matching correct attribute names. Overrides attr-naming- # style. #attr-rgx= # Bad variable names which should always be refused, separated by a comma. bad-names=foo, bar, baz, toto, tutu, tata # Bad variable names regexes, separated by a comma. If names match any regex, # they will always be refused bad-names-rgxs= # Naming style matching correct class attribute names. class-attribute-naming-style=any # Regular expression matching correct class attribute names. Overrides class- # attribute-naming-style. #class-attribute-rgx= # Naming style matching correct class names. class-naming-style=PascalCase # Regular expression matching correct class names. Overrides class-naming- # style. #class-rgx= # Naming style matching correct constant names. const-naming-style=UPPER_CASE # Regular expression matching correct constant names. Overrides const-naming- # style. #const-rgx= # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 # Naming style matching correct function names. function-naming-style=snake_case # Regular expression matching correct function names. Overrides function- # naming-style. #function-rgx= # Good variable names which should always be accepted, separated by a comma. good-names=i, j, k, e, Run, _ # Good variable names regexes, separated by a comma. If names match any regex, # they will always be accepted good-names-rgxs= # Include a hint for the correct naming format with invalid-name. include-naming-hint=no # Naming style matching correct inline iteration names. inlinevar-naming-style=any # Regular expression matching correct inline iteration names. Overrides # inlinevar-naming-style. #inlinevar-rgx= # Naming style matching correct method names. method-naming-style=snake_case # Regular expression matching correct method names. Overrides method-naming- # style. #method-rgx= # Naming style matching correct module names. module-naming-style=snake_case # Regular expression matching correct module names. Overrides module-naming- # style. #module-rgx= # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. # These decorators are taken in consideration only for invalid-name. property-classes=abc.abstractproperty # Naming style matching correct variable names. variable-naming-style=snake_case # Regular expression matching correct variable names. Overrides variable- # naming-style. #variable-rgx= [STRING] # This flag controls whether inconsistent-quotes generates a warning when the # character used as a quote delimiter is used inconsistently within a module. check-quote-consistency=no # This flag controls whether the implicit-str-concat should generate a warning # on implicit string concatenation in sequences defined over several lines. check-str-concat-over-line-jumps=no [FORMAT] # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # Maximum number of characters on a single line. max-line-length=88 # Maximum number of lines in a module. max-module-lines=1000 # Allow the body of a class to be on the same line as the declaration if body # contains single statement. single-line-class-stmt=no # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no [SPELLING] # Limits count of emitted suggestions for spelling mistakes. max-spelling-suggestions=4 # Spelling dictionary name. Available dictionaries: none. To make it work, # install the python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains the private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to the private dictionary (see the # --spelling-private-dict-file option) instead of raising a message. spelling-store-unknown-words=no [TYPECHECK] # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. contextmanager-decorators=contextlib.contextmanager # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # Tells whether to warn about missing members when the owner of the attribute # is inferred to be None. ignore-none=yes # This flag controls whether pylint should warn about no-member and similar # checks whenever an opaque object is returned when inferring. The inference # can return multiple potential results while evaluating a Python object, but # some branches might not be evaluated, which results in partial inference. In # that case, it might be useful to still emit no-member and other checks for # the rest of the inferred objects. ignore-on-opaque-inference=yes # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. ignored-classes=optparse.Values,thread._local,_thread._local # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis). It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # Show a hint with possible names when a member name was not found. The aspect # of finding the hint is based on edit distance. missing-member-hint=yes # The minimum edit distance a name should have in order to be considered a # similar match for a missing member name. missing-member-hint-distance=1 # The total number of similar names that should be taken in consideration when # showing a hint for a missing member. missing-member-max-choices=1 # List of decorators that change the signature of a decorated function. signature-mutators= [VARIABLES] # List of additional names supposed to be defined in builtins. Remember that # you should avoid defining new builtins when possible. additional-builtins= # Tells whether unused global variables should be treated as a violation. allow-global-unused-variables=yes # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_, _cb # A regular expression matching the name of dummy variables (i.e. expected to # not be used). dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ # Argument names that match this expression will be ignored. Default to name # with leading underscore. ignored-argument-names=_.*|^ignored_|^unused_ # Tells whether we should check for unused import in __init__ files. init-import=no # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io [SIMILARITIES] # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no # Minimum lines number of a similarity. min-similarity-lines=4 [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME, XXX, TODO # Regular expression of note tags to take in consideration. #notes-rgx= [LOGGING] # The type of string formatting that logging methods do. `old` means using % # formatting, `new` is for `{}` formatting. logging-format-style=old # Logging modules to check that the string format arguments are in logging # function parameter format. logging-modules=logging [DESIGN] # Maximum number of arguments for function / method. max-args=5 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Maximum number of boolean expressions in an if statement (see R0916). max-bool-expr=5 # Maximum number of branch for function / method body. max-branches=12 # Maximum number of locals for function / method body. max-locals=15 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # Maximum number of return / yield for function / method body. max-returns=6 # Maximum number of statements in function / method body. max-statements=50 # Minimum number of public methods for a class (see R0903). min-public-methods=2 [IMPORTS] # List of modules that can be imported at any level, not just the top level # one. allow-any-import-level= # Allow wildcard imports from modules that define __all__. allow-wildcard-with-all=no # Analyse import fallback blocks. This can be used to support both Python 2 and # 3 compatible code, which means that the block might have code that exists # only in one or another interpreter, leading to false positives when analysed. analyse-fallback-blocks=no # Deprecated modules which should not be used, separated by a comma. deprecated-modules=optparse,tkinter.tix # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled). ext-import-graph= # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled). import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled). int-import-graph= # Force import order to recognize a module as part of the standard # compatibility libraries. known-standard-library= # Force import order to recognize a module as part of a third party library. known-third-party=enchant # Couples of modules and preferred modules, separated by a comma. preferred-modules= [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__, __new__, setUp, __post_init__ # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict, _fields, _replace, _source, _make # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=cls [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "BaseException, Exception". overgeneral-exceptions=BaseException, Exception ManimCommunity-manim-1157b74/.readthedocs.yml000066400000000000000000000004741515024150700211260ustar00rootroot00000000000000version: 2 sphinx: configuration: docs/source/conf.py build: os: ubuntu-22.04 tools: python: "3.13" apt_packages: - libpango1.0-dev - graphviz python: install: - requirements: docs/rtd-requirements.txt - requirements: docs/requirements.txt - method: pip path: . ManimCommunity-manim-1157b74/CITATION.cff000066400000000000000000000007401515024150700177260ustar00rootroot00000000000000# YAML 1.2 --- authors: - name: "The Manim Community Developers" cff-version: "1.2.0" date-released: 2026-02-27 license: MIT message: "We acknowledge the importance of good software to support research, and we note that research becomes more valuable when it is communicated effectively. To demonstrate the value of Manim, we ask that you cite Manim in your work." title: Manim โ€“ Mathematical Animation Framework url: "https://www.manim.community/" version: "v0.20.1" ... ManimCommunity-manim-1157b74/CODE_OF_CONDUCT.md000066400000000000000000000330111515024150700206300ustar00rootroot00000000000000 # Code of Conduct > TL;DR Be excellent to each other; we're a community after all. If you run into issues with others in our community, please [contact](https://www.manim.community/discord/) a Manim Community Dev, or Moderator. ## Purpose The Manim Community includes members of varying skills, languages, personalities, cultural backgrounds, and experiences from around the globe. Through these differences, we continue to grow and collectively improve upon an open-source animation engine. When working in a community, it is important to remember that you are interacting with humans on the other end of your screen. This code of conduct will guide your interactions and keep Manim a positive environment for our developers, users, and fundamentally our growing community. ## Our Community Members of Manim Community are respectful, open, and considerate. Behaviors that reinforce these values contribute to our positive environment, and include: - **Being respectful.** Respectful of others, their positions, experiences, viewpoints, skills, commitments, time, and efforts. - **Being open.** Open to collaboration, whether it's on problems, Pull Requests, issues, or otherwise. - **Being considerate.** Considerate of their peers -- other Manim users and developers. - **Focusing on what is best for the community.** We're respectful of the processes set forth in the community, and we work within them. - **Showing empathy towards other community members.** We're attentive in our communications, whether in person or online, and we're tactful when approaching differing views. - **Gracefully accepting constructive criticism.** When we disagree, we are courteous in raising our issues. - **Using welcoming and inclusive language.** We're accepting of all who wish to take part in our activities, fostering an environment where anyone can participate and everyone can make a difference. ## Our Standards Every member of our community has the right to have their identity respected. Manim Community is dedicated to providing a positive environment for everyone, regardless of age, gender identity and expression, sexual orientation, disability, physical appearance, body size, ethnicity, nationality, race, religion (or lack thereof), education, or socioeconomic status. ## Inappropriate Behavior Examples of unacceptable behavior by participants include: * Harassment of any participants in any form * Deliberate intimidation, stalking, or following * Logging or taking screenshots of online activity for harassment purposes * Publishing others' private information, such as a physical or electronic address, without explicit permission * Violent threats or language directed against another person * Incitement of violence or harassment towards any individual, including encouraging a person to commit suicide or to engage in self-harm * Creating additional online accounts in order to harass another person or circumvent a ban * Sexual language and imagery in online communities or any conference venue, including talks * Insults, put-downs, or jokes that are based upon stereotypes, that are exclusionary, or that hold others up for ridicule * Excessive swearing * Unwelcome sexual attention or advances * Unwelcome physical contact, including simulated physical contact (eg, textual descriptions like "hug" or "backrub") without consent or after a request to stop * Pattern of inappropriate social contact, such as requesting/assuming inappropriate levels of intimacy with others * Sustained disruption of online community discussions, in-person presentations, or other in-person events * Continued one-on-one communication after requests to cease * Other conduct that is inappropriate for a professional audience including people of many different backgrounds Community members asked to stop any inappropriate behavior are expected to comply immediately. ## Manim Community Online Spaces This Code of Conduct applies to the following online spaces: - The [ManimCommunity GitHub Organization](https://github.com/ManimCommunity) and all of its repositories - The Manim [Discord](https://www.manim.community/discord/) - The Manim [Reddit](https://www.reddit.com/r/manim/) - The Manim [Twitter](https://twitter.com/manim\_community/) This Code of Conduct applies to every member in official Manim Community online spaces, including: - Moderators - Maintainers - Developers - Reviewers - Contributors - Users - All community members ## Consequences If a member's behavior violates this code of conduct, the Manim Community Code of Conduct team may take any action they deem appropriate, including, but not limited to: warning the offender, temporary bans, deletion of offending messages, and expulsion from the community and its online spaces. The full list of consequences for inappropriate behavior is listed below in the Enforcement Procedures. Thank you for helping make this a welcoming, friendly community for everyone. ## Contact Information If you believe someone is violating the code of conduct, or have any other concerns, please contact a Manim Community Dev, or Moderator immediately. They can be reached on Manim's Community [Discord](https://www.manim.community/discord/).

## Enforcement Procedures This document summarizes the procedures the Manim Community Code of Conduct team uses to enforce the Code of Conduct. ### Summary of processes When the team receives a report of a possible Code of Conduct violation, it will: 1. Acknowledge the receipt of the report. 1. Evaluate conflicts of interest. 1. Call a meeting of code of conduct team members without a conflict of interest. 1. Evaluate the reported incident. 1. Propose a behavioral modification plan. 1. Propose consequences for the reported behavior. 1. Vote on behavioral modification plan and consequences for the reported person. 1. Contact Manim Community moderators to approve the behavioral modification plan and consequences. 1. Follow up with the reported person. 1. Decide further responses. 1. Follow up with the reporter. ### Acknowledge the report Reporters should receive an acknowledgment of the receipt of their report within 48 hours. ### Conflict of interest policy Examples of conflicts of interest include: * You have a romantic or platonic relationship with either the reporter or the reported person. It's fine to participate if they are an acquaintance. * The reporter or reported person is someone you work closely with. This could be someone on your team or someone who works on the same project as you. * The reporter or reported person is a maintainer who regularly reviews your contributions * The reporter or reported person is your metamour. * The reporter or reported person is your family member Committee members do not need to state why they have a conflict of interest, only that one exists. Other team members should not ask why the person has a conflict of interest. Anyone who has a conflict of interest will remove themselves from the discussion of the incident, and recluse themselves from voting on a response to the report. ### Evaluating a report #### Jurisdiction * *Is this a Code of Conduct violation?* Is this behavior on our list of inappropriate behavior? Is it borderline inappropriate behavior? Does it violate our community norms? * *Did this occur in a space that is within our Code of Conduct's scope?* If the incident occurred outside the community, but a community member's mental health or physical safety may be negatively impacted if no action is taken, the incident may be in scope. Private conversations in community spaces are also in scope. #### Impact * *Did this incident occur in a private conversation or a public space?* Incidents that all community members can see will have a more negative impact. * *Does this behavior negatively impact a marginalized group in our community?* Is the reporter a person from a marginalized group in our community? How is the reporter being negatively impacted by the reported person's behavior? Are members of the marginalized group likely to disengage with the community if no action was taken on this report? * *Does this incident involve a community leader?* Community members often look up to community leaders to set the standard of acceptable behavior #### Risk * *Does this incident include sexual harassment?* * *Does this pose a safety risk?* Does the behavior put a person's physical safety at risk? Will this incident severely negatively impact someone's mental health? * *Is there a risk of this behavior being repeated?* Does the reported person understand why their behavior was inappropriate? Is there an established pattern of behavior from past reports? Reports which involve higher risk or higher impact may face more severe consequences than reports which involve lower risk or lower impact. ### Propose consequences What follows are examples of possible consequences of an incident report. This list of consequences is not exhaustive, and the Manim Community Code of Conduct team reserves the right to take any action it deems necessary. Possible private responses to an incident include: * Nothing, if the behavior was determined to not be a Code of Conduct violation * A warning * A final warning * Temporarily removing the reported person from the community's online space(s) * Permanently removing the reported person from the community's online space(s) * Publishing an account of the incident ### Team vote Some team members may have a conflict of interest and may be excluded from discussions of a particular incident report. Excluding those members, decisions on the behavioral modification plans and consequences will be determined by a two-thirds majority vote of the Manim Community Code of Conduct team. ### Moderators approval Once the team has approved the behavioral modification plans and consequences, they will communicate the recommended response to the Manim Community moderators. The team should not state who reported this incident. They should attempt to anonymize any identifying information from the report. Moderators are required to respond with whether they accept the recommended response to the report. If they disagree with the recommended response, they should provide a detailed response or additional context as to why they disagree. Moderators are encouraged to respond within a week. In cases where the moderators disagree on the suggested resolution for a report, the Manim Community Code of Conduct team may choose to notify the Manim Community Moderators. ### Follow up with the reported person The Manim Community Code of Conduct team will work with Manim Community moderators to draft a response to the reported person. The response should contain: * A description of the person's behavior in neutral language * The negative impact of that behavior * A concrete behavioral modification plan * Any consequences of their behavior The team should not state who reported this incident. They should attempt to anonymize any identifying information from the report. The reported person should be discouraged from contacting the reporter to discuss the report. If they wish to apologize to the reporter, the team can accept the apology on behalf of the reporter. ### Decide further responses If the reported person provides additional context, the Manim Community Code of Conduct team may need to re-evaluate the behavioral modification plan and consequences. ### Follow up with the reporter A person who makes a report should receive a follow-up response stating what action was taken in response to the report. If the team decided no response was needed, they should provide an explanation why it was not a Code of Conduct violation. Reports that are not made in good faith (such as "reverse sexism" or "reverse racism") may receive no response. The follow-up should be sent no later than one week after the receipt of the report. If deliberation or follow-up with the reported person takes longer than one week, the team should send a status update to the reporter. ### Changes to Code of Conduct When discussing a change to the Manim Community code of conduct or enforcement procedures, the Manim Community Code of Conduct team will follow this decision-making process: * **Brainstorm options.** Team members should discuss any relevant context and brainstorm a set of possible options. It is important to provide constructive feedback without getting side-tracked from the main question. * **Vote.** Proposed changes to the code of conduct will be decided by a two-thirds majority of all voting members of the Code of Conduct team. Team members are listed in the charter. Currently active voting members are listed in the following section. * **Board Vote.** Once a working draft is in place for the Code of Conduct and procedures, the Code of Conduct team shall provide the Manim Community Moderators with a draft of the changes. The Manim Community Moderators will vote on the changes at a board meeting. ### Current list of voting members - All available Community Developers (i.e. those with "write" permissions, or above, on the Manim Community GitHub organization). ## License This Code of Conduct is licensed under the [Creative Commons Attribution-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-sa/3.0/). ## Attributions This Code of Conduct was forked from the code of conduct from the [Python Software Foundation](https://www.python.org/psf/conduct/) and adapted by Manim Community. ManimCommunity-manim-1157b74/CONTRIBUTING.md000066400000000000000000000002421515024150700202620ustar00rootroot00000000000000# Thanks for your interest in contributing! Please read our contributing guidelines which are hosted at https://docs.manim.community/en/latest/contributing.html ManimCommunity-manim-1157b74/LICENSE000066400000000000000000000020601515024150700170360ustar00rootroot00000000000000MIT License Copyright (c) 2018 3Blue1Brown LLC Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ManimCommunity-manim-1157b74/LICENSE.community000066400000000000000000000021001515024150700210540ustar00rootroot00000000000000MIT License Copyright (c) 2024, the Manim Community Developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ManimCommunity-manim-1157b74/README.md000066400000000000000000000202721515024150700173150ustar00rootroot00000000000000

Manim Community logo

PyPI Latest Release Docker image Launch Binder MIT License Reddit Twitter Discord Documentation Status CI

An animation engine for explanatory math videos


Manim is an animation engine for explanatory math videos. It's used to create precise animations programmatically, as demonstrated in the videos of [3Blue1Brown](https://www.3blue1brown.com/). > [!NOTE] > The community edition of Manim (ManimCE) is a version maintained and developed by the community. It was forked from 3b1b/manim, a tool originally created and open-sourced by Grant Sanderson, also creator of the 3Blue1Brown educational math videos. While Grant Sanderson continues to maintain his own repository, we recommend this version for its continued development, improved features, enhanced documentation, and more active community-driven maintenance. If you would like to study how Grant makes his videos, head over to his repository ([3b1b/manim](https://github.com/3b1b/manim)). ## Table of Contents: - [Installation](#installation) - [Usage](#usage) - [Documentation](#documentation) - [Docker](#docker) - [Help with Manim](#help-with-manim) - [Contributing](#contributing) - [License](#license) ## Installation > [!CAUTION] > These instructions are for the community version _only_. Trying to use these instructions to install [3b1b/manim](https://github.com/3b1b/manim) or instructions there to install this version will cause problems. Read [this](https://docs.manim.community/en/stable/faq/installation.html#why-are-there-different-versions-of-manim) and decide which version you wish to install, then only follow the instructions for your desired version. Manim requires a few dependencies that must be installed prior to using it. If you want to try it out first before installing it locally, you can do so [in our online Jupyter environment](https://try.manim.community/). For local installation, please visit the [Documentation](https://docs.manim.community/en/stable/installation.html) and follow the appropriate instructions for your operating system. ## Usage Manim is an extremely versatile package. The following is an example `Scene` you can construct: ```python from manim import * class SquareToCircle(Scene): def construct(self): circle = Circle() square = Square() square.flip(RIGHT) square.rotate(-3 * TAU / 8) circle.set_fill(PINK, opacity=0.5) self.play(Create(square)) self.play(Transform(square, circle)) self.play(FadeOut(square)) ``` In order to view the output of this scene, save the code in a file called `example.py`. Then, run the following in a terminal window: ```sh manim -p -ql example.py SquareToCircle ``` You should see your native video player program pop up and play a simple scene in which a square is transformed into a circle. You may find some more simple examples within this [GitHub repository](example_scenes). You can also visit the [official gallery](https://docs.manim.community/en/stable/examples.html) for more advanced examples. Manim also ships with a `%%manim` IPython magic which allows to use it conveniently in JupyterLab (as well as classic Jupyter) notebooks. See the [corresponding documentation](https://docs.manim.community/en/stable/reference/manim.utils.ipython_magic.ManimMagic.html) for some guidance and [try it out online](https://mybinder.org/v2/gh/ManimCommunity/jupyter_examples/HEAD?filepath=basic_example_scenes.ipynb). ## Command line arguments The general usage of Manim is as follows: ![manim-illustration](https://raw.githubusercontent.com/ManimCommunity/manim/main/docs/source/_static/command.png) The `-p` flag in the command above is for previewing, meaning the video file will automatically open when it is done rendering. The `-ql` flag is for a faster rendering at a lower quality. Some other useful flags include: - `-s` to skip to the end and just show the final frame. - `-n ` to skip ahead to the `n`'th animation of a scene. - `-f` show the file in the file browser. For a thorough list of command line arguments, visit the [documentation](https://docs.manim.community/en/stable/guides/configuration.html). ## Documentation Documentation is in progress at [ReadTheDocs](https://docs.manim.community/). ## Docker The community also maintains a docker image (`manimcommunity/manim`), which can be found [on DockerHub](https://hub.docker.com/r/manimcommunity/manim). Instructions on how to install and use it can be found in our [documentation](https://docs.manim.community/en/stable/installation/docker.html). ## Help with Manim If you need help installing or using Manim, feel free to reach out to our [Discord Server](https://www.manim.community/discord/) or [Reddit Community](https://www.reddit.com/r/manim). If you would like to submit a bug report or feature request, please open an issue. ## Contributing Contributions to Manim are always welcome. In particular, there is a dire need for tests and documentation. For contribution guidelines, please see the [documentation](https://docs.manim.community/en/stable/contributing.html). However, please note that Manim is currently undergoing a major refactor. In general, contributions implementing new features will not be accepted in this period. The contribution guide may become outdated quickly; we highly recommend joining our [Discord server](https://www.manim.community/discord/) to discuss any potential contributions and keep up to date with the latest developments. Most developers on the project use `uv` for management. You'll want to have uv installed and available in your environment. Learn more about `uv` at its [documentation](https://docs.astral.sh/uv/) and find out how to install manim with uv at the [manim dev-installation guide](https://docs.manim.community/en/latest/contributing/development.html) in the manim documentation. ## How to Cite Manim We acknowledge the importance of good software to support research, and we note that research becomes more valuable when it is communicated effectively. To demonstrate the value of Manim, we ask that you cite Manim in your work. Currently, the best way to cite Manim is to go to our [repository page](https://github.com/ManimCommunity/manim) (if you aren't already) and click the "cite this repository" button on the right sidebar. This will generate a citation in your preferred format, and will also integrate well with citation managers. ## Code of Conduct Our full code of conduct, and how we enforce it, can be read on [our website](https://docs.manim.community/en/stable/conduct.html). ## License The software is double-licensed under the MIT license, with copyright by 3blue1brown LLC (see LICENSE), and copyright by Manim Community Developers (see LICENSE.community). ManimCommunity-manim-1157b74/crowdin.yml000066400000000000000000000001741515024150700202250ustar00rootroot00000000000000files: - source: /docs/i18n/gettext/**/*.pot translation: /docs/i18n/%two_letters_code%/LC_MESSAGES/**/%file_name%.po ManimCommunity-manim-1157b74/docker/000077500000000000000000000000001515024150700173025ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docker/Dockerfile000066400000000000000000000062151515024150700213000ustar00rootroot00000000000000# โ”€โ”€ Stage 1: builder โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ FROM python:3.14-slim AS builder RUN apt-get update -qq \ && apt-get install --no-install-recommends -y \ build-essential \ gcc \ cmake \ make \ pkg-config \ wget \ libcairo2-dev \ libffi-dev \ libpango1.0-dev \ libegl-dev \ && rm -rf /var/lib/apt/lists/* # Setup a minimal TeX Live installation (no ctex: drops ~100 MB of CJK fonts/packages) COPY docker/texlive-profile.txt /tmp/ ENV PATH=/usr/local/texlive/bin/armhf-linux:/usr/local/texlive/bin/aarch64-linux:/usr/local/texlive/bin/x86_64-linux:$PATH RUN wget -O /tmp/install-tl-unx.tar.gz http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz \ && mkdir /tmp/install-tl \ && tar -xzf /tmp/install-tl-unx.tar.gz -C /tmp/install-tl --strip-components=1 \ && /tmp/install-tl/install-tl --profile=/tmp/texlive-profile.txt \ && tlmgr install \ amsmath babel-english cbfonts-fd cm-super count1to doublestroke dvisvgm everysel \ fontspec frcursive fundus-calligra gnu-freefont jknapltx latex-bin \ mathastext microtype multitoc physics prelim2e preview ragged2e relsize rsfs \ setspace standalone tipa wasy wasysym xcolor xetex xkeyval \ && rm -rf /tmp/install-tl /tmp/install-tl-unx.tar.gz # Install manim into an isolated virtualenv ENV VIRTUAL_ENV=/opt/venv RUN python -m venv $VIRTUAL_ENV ENV PATH="$VIRTUAL_ENV/bin:$PATH" COPY . /opt/manim WORKDIR /opt/manim RUN pip install --no-cache-dir .[jupyterlab] # โ”€โ”€ Stage 2: runtime โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ FROM python:3.14-slim # Runtime libs only: # - no ffmpeg: PyAV (av package) bundles its own ffmpeg libraries in av.libs/ # - OpenGL: keep EGL for headless rendering and libGL as required by moderngl/glcontext # - fonts-noto-core instead of fonts-noto (drops CJK noto fonts) RUN apt-get update -qq \ && apt-get install --no-install-recommends -y \ libcairo2 \ libpango-1.0-0 \ libpangocairo-1.0-0 \ libpangoft2-1.0-0 \ libffi8 \ libegl1 \ libgl1 \ ghostscript \ fonts-noto-core \ fontconfig \ && rm -rf /var/lib/apt/lists/* RUN fc-cache -fv # Copy TeX Live from builder ENV PATH=/usr/local/texlive/bin/armhf-linux:/usr/local/texlive/bin/aarch64-linux:/usr/local/texlive/bin/x86_64-linux:$PATH COPY --from=builder /usr/local/texlive /usr/local/texlive # Copy the pre-built virtualenv from builder ENV VIRTUAL_ENV=/opt/venv COPY --from=builder /opt/venv /opt/venv ENV PATH="$VIRTUAL_ENV/bin:$PATH" ARG NB_USER=manimuser ARG NB_UID=1000 ENV USER=${NB_USER} ENV NB_UID=${NB_UID} ENV HOME=/manim RUN adduser --disabled-password \ --gecos "Default user" \ --uid ${NB_UID} \ ${NB_USER} WORKDIR ${HOME} RUN chown -R ${NB_USER}:${NB_USER} ${HOME} && chmod 777 ${HOME} USER ${NB_USER} CMD ["/bin/bash"] ManimCommunity-manim-1157b74/docker/readme.md000066400000000000000000000016451515024150700210670ustar00rootroot00000000000000See the [main README](https://github.com/ManimCommunity/manim/blob/main/README.md) for some instructions on how to use this image. # Building the image The docker image corresponding to the checked out version of the git repository can be built by running ``` docker build -t manimcommunity/manim:TAG -f docker/Dockerfile . ``` from the root directory of the repository. Multi-platform builds are possible by running ``` docker buildx build --push --platform linux/arm64/v8,linux/amd64 --tag manimcommunity/manim:TAG -f docker/Dockerfile . ``` from the root directory of the repository. # Runtime notes - The image is built via a multi-stage Dockerfile (build dependencies are not carried into the runtime stage). - The image does not include the `ffmpeg` CLI binary. - The default TeX installation is minimal and does not include `ctex`. - Headless OpenGL rendering relies on EGL/GL runtime libraries available in the image. ManimCommunity-manim-1157b74/docker/texlive-profile.txt000066400000000000000000000004511515024150700231610ustar00rootroot00000000000000selected_scheme scheme-minimal TEXDIR /usr/local/texlive TEXMFCONFIG ~/.texlive/texmf-config TEXMFHOME ~/texmf TEXMFLOCAL /usr/local/texlive/texmf-local TEXMFSYSCONFIG /usr/local/texlive/texmf-config TEXMFSYSVAR /usr/local/texlive/texmf-var TEXMFVAR ~/.texlive/texmf-var option_doc 0 option_src 0 ManimCommunity-manim-1157b74/docs/000077500000000000000000000000001515024150700167635ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/Makefile000066400000000000000000000021241515024150700204220ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line, and also # from the environment for the first two. SPHINXOPTS ?= SPHINXBUILD ?= sphinx-build # Path base is the source directory SOURCEDIR = . BUILDDIR = ../build # Put it first so that "make" without argument is like "make help". help: @(cd source; $(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)) .PHONY: help Makefile i18n # All the code is executed as if everything was launched in one shell. .ONESHELL: # Like make clean but also remove files generated by autosummary and # rendered videos. cleanall: clean @rm source/reference/* @rm -rf source/media @rm -f rendering_times.csv i18n: @(cd source; $(SPHINXBUILD) -M gettext "$(SOURCEDIR)" ../i18n/ -t skip-manim $(SPHINXOPTS) $(O);cd ../i18n;bash stripUntranslatable.sh) # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @(cd source; $(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)) ManimCommunity-manim-1157b74/docs/html000066400000000000000000000000001515024150700176400ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/000077500000000000000000000000001515024150700175425ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/fr/000077500000000000000000000000001515024150700201515ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/fr/LC_MESSAGES/000077500000000000000000000000001515024150700217365ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/fr/LC_MESSAGES/index.po000066400000000000000000000102721515024150700234070ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: fr\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/index.pot\n" "X-Crowdin-File-ID: 5163\n" "Language-Team: French\n" "Language: fr_FR\n" "PO-Revision-Date: 2021-11-06 12:29\n" #: ../../source/index.rst:7 msgid "Manim Community Overview" msgstr "Manim communautรฉ - Vue d'ensemble" #: ../../source/index.rst:9 msgid "Animating technical concepts is traditionally pretty tedious since it can be difficult to make the animations precise enough to convey them accurately. ``Manim`` uses Python to generate animations programmatically, making it possible to specify exactly how each one should run." msgstr "Animer des concepts techniques est traditionellement plutรดt compliquรฉ puisqu'il est difficile de rendre les animations assez precises pour bien reprรฉsenter ces concepts. ``Manim`` utilise Python pour gรฉnerer des animation en programmant, permettant de prรฉciser de maniรจre exacte leur execution." #: ../../source/index.rst:14 msgid "This project is still very much a work in progress, but we hope that the information here will make it easier for newcomers to get started using ``Manim``." msgstr "Ce projet est encore en grande partie en cours de dรฉveloppement, mais nous รฉspรฉrons que les informations fournies ici permettront aux nouveaux venus de mieux commencer ร  utiliser ``Manim``." #: ../../source/index.rst:20 msgid "All content of the docs is licensed under the MIT license. Especially for the examples you encounter: Feel free to use this code in your own projects!" msgstr "Le contenu de ces documentations est distribuรฉ sous licence MIT. C'est aussi vrai pour les exemples prรฉsentรฉs, vous pouvez utilisez les codes librement dans vos projets !" #: ../../source/index.rst:23 msgid "We are curious to see the awesome projects you build using this library, feel free to share your projects with us `on Twitter `_, `Reddit `_, or via `Discord `_." msgstr "Nous sommes curieux de voir les super projets que vous construisez avec cette librairie, partagez-les donc avec nous `sur Twitter `_, `Reddit `_, or sur `Discord `_. " #: ../../source/index.rst:27 msgid "In case you publish your work made with Manim, we would appreciate if you add a link to `our homepage `_ or `our GitHub repository `_. If you use Manim in a scientific context, instructions on how to cite a particular release can be found `in our README `_." msgstr "Si vous publiez votre travail fait avec Manim, nous apprรฉcierions si vous ajoutiez un lien vers `notre site principal `_ ou vers `notre repo GitHub `_. Si vous utilisez Manim dans un contexte scientifique, des instructions afin de citer une certaine version de Manim sont disponibles (en anglais) `dans notre fichier README `_." #: ../../source/index.rst:36 msgid "As a quick reference, here are some often used modules, classes and methods:" msgstr "Comme rapide indications, voici certains des modules, classes et mรฉthodes les plus utilisรฉes:" #: ../../source/index.rst:38 msgid "Modules: :mod:`~.moving_camera_scene`, :mod:`~.tex_mobject`, :mod:`~.geometry`," msgstr "Modules: :mod:`~.moving_camera_scene`, :mod:`~.tex_mobject`, :mod:`~.geometry`," #: ../../source/index.rst:43 msgid "Classes: :class:`~.Mobject` , :class:`~.VMobject`, :class:`~.ValueTracker`, :class:`~.MathTex`, :class:`~.Angle`, :class:`~.Tex`, :class:`~.Text`," msgstr "Classes: :class:`~.Mobject` , :class:`~.VMobject`, :class:`~.ValueTracker`, :class:`~.MathTex`, :class:`~.Angle`, :class:`~.Tex`, :class:`~.Text`," ManimCommunity-manim-1157b74/docs/i18n/fr/LC_MESSAGES/installation.po000066400000000000000000000173031515024150700250030ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: fr\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/installation.pot\n" "X-Crowdin-File-ID: 5165\n" "Language-Team: French\n" "Language: fr_FR\n" "PO-Revision-Date: 2021-11-06 12:29\n" #: ../../source/installation.rst:2 msgid "Installation" msgstr "Installation" #: ../../source/installation.rst:4 msgid "Depending on your use case, different installation options are recommended: if you just want to play around with Manim for a bit, interactive in-browser notebooks are a really simple way of exploring the library as they require no local installation. Head over to https://try.manim.community to give our interactive tutorial a try." msgstr "Suivant comment vous souhaitez utiliser Manim, diffรฉrentes options d'installation s'offrent ร  vous : Si vous voulez simplement vous amuser avec, les bloc-notes interactifs sur votre navigateur sont un moyen simple d'explorer les possibilitรฉs offertes par la bibliothรจque, puisqu'ils ne nรฉcessitent pas d'installer quoi que ce soit sur votre ordinateur. Allez donc voir ร  l'adresse https://try.manim.community pour tester notre tutoriel interactif." #: ../../source/installation.rst:10 msgid "Otherwise, if you intend to use Manim to work on an animation project, we recommend installing the library locally (either to your system's Python, or via Docker)." msgstr "Sinon, si vous souhaitez utiliser Manim pour travailler sur un projet d'animation, il vaut mieux installer la bibliothรจque sur votre ordinateur (sur le Python de votre sytรจme, ou viaย Docker)." #: ../../source/installation.rst:16 msgid "Note that there are several different versions of Manim. The instructions on this website are **only** for the *community edition*. Find out more about the :doc:`differences between Manim versions ` if you are unsure which version you should install." msgstr "Prenez garde, il y a plusieurs diffรฉrentes versions de Manim. Les instructions sur ce site sont **seulement** pour la *version communautaire* (*community edition*). Dรฉcouvrez en plus sur les :doc:`diffรฉrences entre les versions de manim ` si vous n'รชtes pas sรปrs de quelle version installer." #: ../../source/installation.rst:22 msgid ":ref:`Installing Manim to your system's Python `" msgstr ":ref:`Installer Manim sur le Python de votre systรจme `" #: ../../source/installation.rst:23 msgid ":ref:`Using Manim via Docker `" msgstr ":ref:`Utiliser Manim via Docker `" #: ../../source/installation.rst:24 msgid ":ref:`Interactive Jupyter notebooks via Binder / Google Colab `" msgstr ":ref:`Blocs-notes interactifs Jupyter via Binder / Google Colab `" #: ../../source/installation.rst:31 msgid "Installing Manim locally" msgstr "Installation de Manim sur l'ordinateur" #: ../../source/installation.rst:33 msgid "Manim is a Python library, and it can be `installed via pip `__. However, in order for Manim to work properly, some additional system dependencies need to be installed first. The following pages have operating system specific instructions for you to follow." msgstr "Manim est une bibliothรจque Python, et peut donc รชtre `installรฉe avec pip `__. Par contre, pour que Manim fonctionne correctement, quelques dรฉpendances doivent รชtre installรฉes avant. Les pages suivantes offrent les instructions ร  suivre selon votre systรจme d'exploitation." #: ../../source/installation.rst:41 msgid "Depending on your particular setup, the installation process might be slightly different. Make sure that you have tried to follow the steps on the following pages carefully, but in case you hit a wall we are happy to help: either `join our Discord `__, or start a new Discussion `directly on GitHub `__." msgstr "Suivant la configuration particuliรจre de votre ordinateur, le processus d'installation peut varier lรฉgรจrement. Assurez-vous d'avoir essayรฉ de suivre avec attention les รฉtapes sur les pages ci-dessous, mais si vous faites face ร  un problรจme, nous serons heureux de vous aider : vous pouvez `rejoindre notre serveur Discord `__, ou vous pouvez lancer une nouvelle Discussion `directement sur GitHub `__." #: ../../source/installation.rst:57 msgid "Once Manim is installed locally, you can proceed to our :doc:`quickstart guide ` which walks you through rendering a first simple scene." msgstr "Une fois que Manim est installรฉ sur votre ordinateur, vous pouvez allez lire notre :doc:`guide de dรฉmarage rapide ` qui va vous apprendre ร  rendre une premiรจre scรจne simpliste." #: ../../source/installation.rst:61 msgid "As mentioned above, do not worry if there are errors or other problems: consult our :doc:`troubleshooting guide ` for help, or get in touch with the community via `GitHub discussions `__ or `Discord `__." msgstr "Comme indiquรฉ ci-dessus, ne vous inquรฉtez pas si vous rencontrez des erreurs ou autres problรจmes : consultez notre :doc:`guide de dรฉpannage ` pour obtenir de l'aide, sinon, prenez contact avec la communautรฉ via `les discussions GitHub `__ ou via `Discord `__." #: ../../source/installation.rst:73 msgid "Using Manim via Docker" msgstr "Utiliser Manim via Docker" #: ../../source/installation.rst:75 msgid "`Docker `__ is a virtualization tool that allows the distribution of encapsulated software environments (containers)." msgstr "`Docker `__ est un outil de virtualisation qui permet la distribution de logiciels en environnement confinรฉ (*containers*)." #: ../../source/installation.rst:78 msgid "The following pages contain more information about the docker image maintained by the community, ``manimcommunity/manim``:" msgstr "Les pages suivantes contiennent plus d'informations ร  propos de l'image docker maintenue par la communautรฉ, ``manimcommunity/manim`` :" #: ../../source/installation.rst:89 msgid "Interactive Jupyter notebooks for your browser" msgstr "Bloc-notes interactifs Jupyter sur votre navigateur" #: ../../source/installation.rst:91 msgid "Manim ships with a built-in ``%%manim`` IPython magic command designed for the use within `Jupyter notebooks `__. Our interactive tutorial over at https://try.manim.community illustrates how Manim can be used from within a Jupyter notebook." msgstr "Le projet Manim contient une commande IPython ``%%manim`` prรฉvue pour รชtre utilisรฉe dans des `blocs-notes Jupyter `__. Notre tutoriel interactif ร  l'adresse https://try.manim.community illustre la faรงon d'utiliser Manim dans un bloc-notes Jupyter." #: ../../source/installation.rst:96 msgid "The following pages explain how you can setup interactive environments like that yourself:" msgstr "Les pages suivantes expliquent comment mettre en place de tels environnements interactifs vous-mรชme :" #: ../../source/installation.rst:105 msgid "Installation for developers" msgstr "Installation pour les dรฉveloppeurs" ManimCommunity-manim-1157b74/docs/i18n/gettext/000077500000000000000000000000001515024150700212265ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog.pot000066400000000000000000000002331515024150700236770ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/000077500000000000000000000000001515024150700231555ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.1.0-changelog.pot000066400000000000000000000257131515024150700262720ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.1.0-changelog.rst:3 msgid "v0.1.0" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:5 msgid "October 21, 2020" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:7 msgid "This is the first release of manimce after forking from 3b1b/manim. As such, developers have focused on cleaning up and refactoring the codebase while still maintaining backwards compatibility wherever possible." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:13 msgid "New Features" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:16 msgid "Command line" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:18 msgid "Output of 'manim --help' has been improved" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:19 msgid "Implement logging with the :code:`rich` library and a :code:`logger` object instead of plain ol' prints" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:20 msgid "Added a flag :code:`--dry_run`, which doesn't write any media" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:21 msgid "Allow for running manim with :code:`python3 -m manim`" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:22 msgid "Refactored Tex Template management. You can now use custom templates with command line args using :code:`--tex_template`!" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:23 msgid "Re-add :code:`--save_frames` flag, which will save each frame as a png" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:24 msgid "Re-introduce manim feature that allows you to type manim code in :code:`stdin` if you pass a minus sign :code:`(-)` as filename" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:25 msgid "Added the :code:`--custom_folders` flag which yields a simpler output folder structure" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:26 msgid "Re-implement GIF export with the :code:`-i` flag (using this flag outputs ONLY a .gif file, and no .mp4 file)" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:27 msgid "Added a :code:`--verbose` flag" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:28 msgid "You can save the logs to a file by using :code:`--log_to_file`" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:29 msgid "Read :code:`tex_template` from config file if not specified by :code:`--tex_template`." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:30 msgid "Add experimental javascript rendering with :code:`--use_js_renderer`" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:31 msgid "Add :code:`-q/--quality [k|p|h|m|l]` flag and removed :code:`-m/-l` flags." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:32 msgid "Removed :code:`--sound` flag" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:36 msgid "Config system" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:38 msgid "Implement a :code:`manim.cfg` config file system, that consolidates the global configuration, the command line argument parsing, and some of the constants defined in :code:`constants.py`" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:39 msgid "Added utilities for manipulating Manimโ€™s :code:`.cfg` files." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:40 msgid "Added a subcommand structure for easier use of utilities managing :code:`.cfg` files" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:41 msgid "Also some variables have been moved from ``constants.py`` to the new config system:" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:43 msgid "``FRAME_HEIGHT`` to ``config[\"frame_width\"]``" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:44 msgid "``TOP`` to ``config[\"frame_height\"] / 2 * UP``" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:45 msgid "``BOTTOM`` to ``config[\"frame_height\"] / 2 * DOWN``" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:46 msgid "``LEFT_SIDE`` to ``config[\"frame_width\"] / 2 * LEFT``" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:47 msgid "``RIGHT_SIDE`` to ``config[\"frame_width\"] / 2 * RIGHT``" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:48 msgid "``self.camera.frame_rate`` to ``config[\"frame_rate\"]``" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:54 msgid "Mobjects, Scenes, and Animations" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:56 msgid "Add customizable left and right bracket for :code:`Matrix` mobject and :code:`set_row_colors` method for matrix mobject" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:57 msgid "Add :code:`AddTeXLetterByLetter` animation" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:58 msgid "Enhanced GraphScene" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:60 msgid "You can now add arrow tips to axes" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:61 msgid "extend axes a bit at the start and/or end" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:62 msgid "have invisible axes" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:63 msgid "highlight the area between two curves" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:64 msgid "ThreeDScene now supports 3dillusion_camera_rotation" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:65 msgid "Add :code:`z_index` for manipulating depth of Objects on scene." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:66 msgid "Add a :code:`VDict` class: a :code:`VDict` is to a :code:`VGroup` what a :code:`dict` is to a :code:`list`" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:67 msgid "Added Scene-caching feature. Now, if a partial movie file is unchanged in your code, it isnโ€™t rendered again! [HIGHLY UNSTABLE We're working on it ;)]" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:68 msgid "Most :code:`get_` and :code:`set_` methods have been removed in favor of instance attributes and properties" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:69 msgid "The :code:`Container` class has been made into an AbstractBaseClass, i.e. in cannot be instantiated. Instead, use one of its children classes" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:70 msgid "The ``TextMobject`` and ``TexMobject`` objects have been deprecated, due to their confusing names, in favour of ``Tex`` and ``MathTex``. You can still, however, continue to use ``TextMobject`` and ``TexMobject``, albeit with Deprecation Warnings constantly reminding you to switch." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:71 msgid "Add a :code:`Variable` class for displaying text that continuously updates to reflect the value of a python variable." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:72 msgid "The ``Tex`` and ``MathTex`` objects allow you to specify a custom TexTemplate using the ``template`` keyword argument." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:73 msgid ":code:`VGroup` now supports printing the class names of contained mobjects and :code:`VDict` supports printing the internal dict of mobjects" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:74 msgid "Add all the standard easing functions" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:75 msgid ":code:`Scene` now renders when :code:`Scene.render()` is called rather than upon instantiation." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:76 msgid ":code:`ValueTracker` now supports increment using the `+=` operator (in addition to the already existing `increment_value` method)" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:77 msgid "Add :class:`PangoText` for rendering texts using Pango." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:81 msgid "Documentation" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:83 msgid "Added clearer installation instructions, tutorials, examples, and API reference [WIP]" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:87 msgid "Fixes" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:89 msgid "Initialization of directories has been moved to :code:`config.py`, and a bunch of bugs associated to file structure generation have been fixed" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:90 msgid "Nonfunctional file :code:`media_dir.txt` has been removed" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:91 msgid "Nonfunctional :code:`if` statements in :code:`scene_file_writer.py` have been removed" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:92 msgid "Fix a bug where trying to render the example scenes without specifying the scene would show all scene objects in the library" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:93 msgid "Many :code:`Exceptions` have been replaced for more specific exception subclasses" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:94 msgid "Fixed a couple of subtle bugs in :code:`ArcBetweenPoints`" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:98 msgid "Of interest to developers" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:100 msgid "Python code formatting is now enforced by using the :code:`black` tool" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:101 msgid "PRs now require two approving code reviews from community devs before they can be merged" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:102 msgid "Added tests to ensure stuff doesn't break between commits (For developers) [Uses Github CI, and Pytest]" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:103 msgid "Add contribution guidelines (for developers)" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:104 msgid "Added autogenerated documentation with sphinx and autodoc/autosummary [WIP]" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:105 msgid "Made manim internally use relative imports" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:106 msgid "Since the introduction of the :code:`TexTemplate` class, the files :code:`tex_template.tex` and :code:`ctex_template.tex` have been removed" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:107 msgid "Added logging tests tools." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:108 msgid "Added ability to save logs in json" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:109 msgid "Move to Poetry." msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:110 msgid "Colors have moved to an Enum" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:113 msgid "Other Changes" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:115 msgid "Cleanup 3b1b Specific Files" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:116 msgid "Rename package from manimlib to manim" msgstr "" #: ../../source/changelog/0.1.0-changelog.rst:117 msgid "Move all imports to :code:`__init__`, so :code:`from manim import *` replaces :code:`from manimlib.imports import *`" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.1.1-changelog.pot000066400000000000000000000112211515024150700262600ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.1.1-changelog.rst:3 msgid "v0.1.1" msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:5 msgid "December 1, 2020" msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:7 msgid "Changes since Manim Community release v0.1.0" msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:10 msgid "Plugins" msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:12 msgid "Provided a standardized method for plugin discoverability, creation, installation, and usage. See the :ref:`documentation `." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:16 msgid "Fixes" msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:18 msgid "JsRender is optional to install. (via :pr:`697`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:19 msgid "Allow importing modules from the same directory as the input file when using ``manim`` from the command line (via :pr:`724`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:21 msgid "Remove some unnecessary or unpythonic methods from :class:`~.Scene` (``get_mobjects``, ``add_mobjects_among``, ``get_mobject_copies``), via :pr:`758`." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:24 msgid "Fix formatting of :class:`~.Code` (via :pr:`798`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:27 msgid "Configuration" msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:29 msgid "Removed the ``skip_animations`` config option and added the ``Renderer.skip_animations`` attribute instead (via :pr:`696`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:31 msgid "The global ``config`` dict has been replaced by a global ``config`` instance of the new class :class:`~.ManimConfig`. This class has a dict-like API, so this should not break user code, only make it more robust. See the Configuration tutorial for details." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:35 msgid "Added the option to configure a directory for external assets (via :pr:`649`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:39 msgid "Documentation" msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:41 msgid "Add ``:issue:`` and ``:pr:`` directives for simplifying linking to issues and pull requests on GitHub (via :pr:`685`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:43 msgid "Add a ``skip-manim`` tag for skipping the ``.. manim::`` directive when building the documentation locally (via :pr:`796`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:48 msgid "Mobjects, Scenes, and Animations" msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:50 msgid "The ``alignment`` attribute to Tex and MathTex has been removed in favour of ``tex_environment``." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:51 msgid ":class:`~.Text` now uses Pango for rendering. ``PangoText`` has been removed. The old implementation is still available as a fallback as :class:`~.CairoText`." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:52 msgid "Variations of :class:`~.Dot` have been added as :class:`~.AnnotationDot` (a bigger dot with bolder stroke) and :class:`~.LabeledDot` (a dot containing a label)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:55 msgid "Scene.set_variables_as_attrs has been removed (via :pr:`692`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:56 msgid "Ensure that the axes for graphs (:class:`GraphScene`) always intersect (:pr:`580`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:57 msgid "Now Mobject.add_updater does not call the newly-added updater by default (use ``call_updater=True`` instead) (via :pr:`710`)" msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:59 msgid "VMobject now has methods to determine and change the direction of the points (via :pr:`647`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:60 msgid "Added BraceBetweenPoints (via :pr:`693`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:61 msgid "Added ArcPolygon and ArcPolygonFromArcs (via :pr:`707`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:62 msgid "Added Cutout (via :pr:`760`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:63 msgid "Added Mobject raise not implemented errors for dunder methods and implementations for VGroup dunder methods (via :pr:`790`)." msgstr "" #: ../../source/changelog/0.1.1-changelog.rst:64 msgid "Added :class:`~.ManimBanner` for a animated version of our logo and banner (via :pr:`729`)" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.10.0-changelog.pot000066400000000000000000000372021515024150700263460ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.10.0-changelog.rst:3 msgid "v0.10.0" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:5 msgid "September 01, 2021" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:10 msgid "A total of 40 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:14 msgid "Animfysyk +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:15 #: ../../source/changelog/0.10.0-changelog.rst:48 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:16 msgid "Christian Clauss" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:17 msgid "Daniel Adelodun +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:18 msgid "Darigov Research" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:19 #: ../../source/changelog/0.10.0-changelog.rst:49 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:20 msgid "Eric Biedert +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:21 #: ../../source/changelog/0.10.0-changelog.rst:53 msgid "Harivinay" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:22 #: ../../source/changelog/0.10.0-changelog.rst:55 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:23 msgid "Jephian Lin +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:24 msgid "Joy Bhalla +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:25 #: ../../source/changelog/0.10.0-changelog.rst:60 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:26 msgid "Lalourche +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:27 msgid "Max Stoumen" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:28 #: ../../source/changelog/0.10.0-changelog.rst:61 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:29 #: ../../source/changelog/0.10.0-changelog.rst:62 msgid "Oliver" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:30 msgid "Partha Das +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:31 msgid "Raj Dandekar +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:32 msgid "Rohan Sharma +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:33 #: ../../source/changelog/0.10.0-changelog.rst:65 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:34 msgid "Vรกclav Hlavรกฤ +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:35 msgid "asjadaugust +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:36 #: ../../source/changelog/0.10.0-changelog.rst:66 msgid "ccn" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:37 #: ../../source/changelog/0.10.0-changelog.rst:67 msgid "icedcoffeeee" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:38 #: ../../source/changelog/0.10.0-changelog.rst:69 msgid "sparshg" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:39 msgid "vinnniii15 +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:40 msgid "vladislav doster +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:41 msgid "xia0long +" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:44 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:47 msgid "Aathish Sivasubrahmanian" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:50 msgid "Devin Neal" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:51 msgid "Eric Biedert" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:52 msgid "GameDungeon" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:54 msgid "Hugues Devimeux" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:56 msgid "Jason Villanueva" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:57 msgid "Jephian Lin" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:58 msgid "Joy Bhalla" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:59 msgid "KingWampy" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:63 msgid "Raghav Goel" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:64 msgid "Raj Dandekar" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:68 msgid "ralphieraccoon" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:72 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:74 msgid "A total of 59 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:77 msgid "Breaking changes" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:81 msgid ":pr:`1843`: Dropped redundant OpenGL files and add metaclass support for :class:`~.Surface`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:80 msgid "``OpenGL`` classes from ``opengl_geometry.py``, ``opengl_text_mobject.py``, ``opengl_tex_mobject.py``, ``opengl_svg_path.py``, ``opengl_svg_mobject.py`` and most of ``opengl_three_dimensions.py`` have been removed." msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:81 msgid "``ParametricSurface`` has been renamed to :class:`~.Surface`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:84 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:86 msgid ":pr:`1941`: Added examples, tests and improved documentation for :mod:`~.coordinate_systems`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:89 msgid ":pr:`1694`: Added ``font_size`` parameter for :class:`~.Tex` and :class:`~.Text`, replaced ``scale`` parameters with ``font_size``" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:92 msgid ":pr:`1860`: Removed :class:`~.GraphScene`, :class:`~.NumberLineOld` and parameters for :class:`~.ChangingDecimal`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:96 msgid "New features" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:99 msgid ":pr:`1929`: Implementing a ``zoom`` parameter for :meth:`.ThreeDScene.move_camera`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:99 msgid "Zooming into a :class:`~.ThreeDScene` can now be done by calling, for example, ``self.move_camera(zoom=2)`` in the ``construct`` method." msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:101 msgid ":pr:`1980`: Added a ``dissipating_time`` keyword argument to :class:`~.TracedPath` to allow animating a dissipating path" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:105 msgid ":pr:`1899`: Allow switching the renderer to OpenGL at runtime" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:105 msgid "Previously, the metaclass approach only changed the inheritance chain to switch between OpenGL and cairo mobjects when the class objects are initialized, i.e., at import time. This PR also triggers the changes to the inheritance chain when the value of ``config.renderer`` is changed." msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:107 msgid ":pr:`1828`: Added configuration option ``zero_pad`` for zero padding PNG file names" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:111 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:113 msgid ":pr:`1882`: Added OpenGL support for :class:`~.PMobject` and its subclasses" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:116 msgid ":pr:`1881`: Added methods :meth:`.Angle.get_lines` and :meth:`.Angle.get_value` to :class:`~.Angle`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:119 msgid ":pr:`1952`: Added the option to save last frame for OpenGL" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:122 msgid ":pr:`1922`: Fixed IPython interface to exit cleanly when OpenGL renderer raises an error" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:125 msgid ":pr:`1923`: Fixed CLI help text for ``manim init`` subcommand so that it is not truncated" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:129 msgid ":pr:`1868`: Added OpenGL support to IPython magic" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:129 msgid "The OpenGL renderer can now be used in jupyter notebooks when using the ``%%manim`` magic command." msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:131 msgid ":pr:`1841`: Reduced default resolution of :class:`~.Dot3D`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:134 msgid ":pr:`1866`: Allow passing keyword argument ``corner_radius`` to :class:`~.SurroundingRectangle`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:137 msgid ":pr:`1847`: Allow :class:`~.Cross` to be created without requiring a mobject" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:141 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:143 msgid ":pr:`1985`: Use ``height`` to determine ``font_size`` instead of the ``_font_size`` attribute" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:146 msgid ":pr:`1758`: Fixed scene selection being ignored when using the OpenGL renderer" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:149 msgid ":pr:`1871`: Fixed broken :meth:`.VectorScene.vector_to_coords`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:152 msgid ":pr:`1973`: Fixed indexing of :meth:`.Table.get_entries` to respect row length" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:155 msgid ":pr:`1950`: Fixed passing custom arrow shapes to :class:`~.CurvedArrow`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:158 msgid ":pr:`1967`: Fixed :attr:`.Axes.coordinate_labels` referring to the entire axis, not just its labels" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:161 msgid ":pr:`1951`: Fixed :meth:`.Axes.get_line_graph` returning a graph rendered below the axes" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:164 msgid ":pr:`1943`: Added ``buff`` keyword argument to :class:`~.BraceLabel`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:167 msgid ":pr:`1938`: Fixed :class:`~.Rotate` for angles that are multiples of :math:`2\\pi`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:170 msgid ":pr:`1924`: Made arrow tips rotate ``IN`` and ``OUT`` properly" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:173 msgid ":pr:`1931`: Fixed ``row_heights`` in :meth:`.Mobject.arrange_in_grid`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:176 msgid ":pr:`1893`: Fixed CLI error when rendering a file containing a single scene without specifying the scene name" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:179 msgid ":pr:`1744`: Fixed bug in :class:`~.NumberPlane` with strictly positive or strictly negative values for ``x_range`` and ``y_range``" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:182 msgid ":pr:`1887`: Fixed ``custom_config`` not working in ``frames_comparison``" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:185 msgid ":pr:`1879`: Fixed how the installed version is determined by Poetry" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:189 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:191 msgid ":pr:`1979`: Corrected Japanese phrases in documentation" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:194 msgid ":pr:`1976`: Fixed labelling of languages in documentation example" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:197 msgid ":pr:`1949`: Rewrite installation instructions from scratch" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:200 msgid ":pr:`1963`: Added sitemap to ``robots.txt``" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:203 msgid ":pr:`1939`: Fixed formatting of parameter description of :class:`~.NumberPlane`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:206 msgid ":pr:`1918`: Fixed a typo in the text tutorial" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:209 msgid ":pr:`1915`: Improved the wording of the installation instructions for Google Colab" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:212 msgid ":pr:`1906`: Improved language and overall consistency in ``README``" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:215 msgid ":pr:`1880`: Updated tutorials to use ``.animate`` instead of :class:`~.ApplyMethod`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:218 msgid ":pr:`1877`: Remove duplicated imports in some documentation examples" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:221 msgid ":pr:`1869`: Fixed duplicated Parameters section in :meth:`.Mobject.arrange_in_grid`" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:225 msgid "Changes concerning the testing system" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:227 msgid ":pr:`1894`: Fixed an OpenGL test" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:231 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:233 msgid ":pr:`1987`: Added support for using OpenGL in subprocess in Windows pipeline" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:236 msgid ":pr:`1964`: Added ``CITATION.cff`` and a method to automatically update this citation with new releases" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:239 msgid ":pr:`1856`: Modified Dockerfile to support multi-platform builds via ``docker buildx``" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:242 msgid ":pr:`1955`: Partially support OpenGL rendering with Docker" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:245 msgid ":pr:`1896`: Made RTD apt install FFMPEG instead of installing a Python binding" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:248 msgid ":pr:`1864`: Shortened and simplified PR template" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:251 msgid ":pr:`1853`: Updated Sphinx to 4.1.2" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:255 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:257 msgid ":pr:`1960`: Ignore fewer flake8 errors" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:260 msgid ":pr:`1947`: Set flake8 not to ignore undefined names in Python code" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:263 msgid ":pr:`1948`: flake8: Set max-line-length instead of ignoring long lines" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:268 msgid ":pr:`1956`: Upgrade to modern Python syntax" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:267 msgid "This pull request was created `with the command `__ ``pyupgrade --py36-plus **/*.py``" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:268 msgid "Python f-strings simplify the code and `should speed up execution `__." msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:271 msgid ":pr:`1898`: Replaced ``self.data[\"attr\"]`` and ``self.uniforms[\"attr\"]`` with ``self.attr``" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:271 msgid "In particular, ``OpenGLVMobject.points`` can now be accessed directly." msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:273 msgid ":pr:`1934`: Improved code quality by implementing suggestions from LGTM" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:276 msgid ":pr:`1861`: Updated ``dearpygui`` version to 0.8.x" msgstr "" #: ../../source/changelog/0.10.0-changelog.rst:280 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.11.0-changelog.pot000066400000000000000000000340411515024150700263450ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.11.0-changelog.rst:3 msgid "v0.11.0" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:5 msgid "October 02, 2021" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:10 msgid "A total of 31 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:14 #: ../../source/changelog/0.11.0-changelog.rst:40 msgid "Aathish Sivasubrahmanian" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:15 #: ../../source/changelog/0.11.0-changelog.rst:41 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:16 msgid "Charlie +" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:17 msgid "Christopher Besch +" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:18 #: ../../source/changelog/0.11.0-changelog.rst:43 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:19 msgid "Evan Boehs +" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:20 #: ../../source/changelog/0.11.0-changelog.rst:45 msgid "GameDungeon" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:21 #: ../../source/changelog/0.11.0-changelog.rst:46 msgid "Hugues Devimeux" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:22 msgid "Jerรณnimo Squartini" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:23 #: ../../source/changelog/0.11.0-changelog.rst:49 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:24 msgid "Meredith Espinosa +" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:25 #: ../../source/changelog/0.11.0-changelog.rst:51 msgid "Mysaa" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:26 #: ../../source/changelog/0.11.0-changelog.rst:52 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:27 msgid "Nicolai Weitkemper +" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:28 #: ../../source/changelog/0.11.0-changelog.rst:54 msgid "Oliver" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:29 #: ../../source/changelog/0.11.0-changelog.rst:56 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:30 msgid "Tim +" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:31 #: ../../source/changelog/0.11.0-changelog.rst:59 msgid "icedcoffeeee" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:32 msgid "imadjamil +" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:33 msgid "leleogere +" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:34 msgid "ะœะฐะบัะธะผ ะ—ะฐัะบะธะฝ +" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:37 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:42 msgid "Charlie" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:44 msgid "Evan Boehs" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:47 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:48 msgid "Jason Villanueva" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:50 msgid "Mark Miller" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:53 msgid "Nicolai Weitkemper" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:55 msgid "Raghav Goel" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:57 msgid "Skaft" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:58 msgid "friedkeenan" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:60 msgid "leleogere" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:63 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:65 msgid "A total of 55 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:68 msgid "Breaking changes" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:71 msgid ":pr:`1990`: Changed and improved the implementation of :meth:`.CoordinateSystem.get_area` to work without Riemann rectangles" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:71 msgid "This changes how :meth:`.CoordinateSystem.get_area` is implemented. To mimic the old behavior (tiny Riemann rectangles), use :meth:`.CoordinateSystem.get_riemann_rectangles` with a small value for ``dx``." msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:74 msgid ":pr:`2095`: Changed angles for polar coordinates to use math convention" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:74 msgid "This PR switches the parameter names ``phi`` and ``theta`` in :func:`cartesian_to_spherical` and :func:`spherical_to_cartesian` to align with the `usual definition in mathematics `__." msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:77 msgid "Highlights" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:80 msgid ":pr:`2094`: Implemented :class:`~.ImplicitFunction` and :meth:`.CoordinateSystem.get_implicit_curve` for plotting implicit curves" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:80 msgid "An :class:`~.ImplicitFunction` that plots the points :math:`(x, y)` which satisfy some equation :math:`f(x,y) = 0`." msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:82 msgid ":pr:`2075`: Implemented :meth:`.Mobject.set_default`, a mechanism for changing default values of keyword arguments" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:87 msgid ":pr:`1998`: Added support for Boolean Operations on VMobjects" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:86 msgid "This PR introduces boolean operations for :class:`~.VMobject`; see details and examples at :class:`~.Union`, :class:`~.Difference`, :class:`~.Intersection` and :class:`~.Exclusion`." msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:90 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:92 msgid ":pr:`2123`: Renamed ``distance`` parameter of :class:`.ThreeDScene` and :class:`.ThreeDCamera` to ``focal_distance``" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:95 msgid ":pr:`2102`: Deprecated :class:`~.SampleSpaceScene` and :class:`~.ReconfigurableScene`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:98 msgid ":pr:`2061`: Removed deprecated ``u_min``, ``u_max``, ``v_min``, ``v_max`` in :class:`~.Surface`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:101 msgid ":pr:`2024`: Deprecated redundant methods :meth:`.Mobject.rotate_in_place`, :meth:`.Mobject.scale_in_place`, :meth:`.Mobject.scale_about_point`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:104 msgid ":pr:`1991`: Deprecated :meth:`.VMobject.get_points`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:108 msgid "New features" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:110 msgid ":pr:`2118`: Added 3D support for :class:`~.ArrowVectorField` and :class:`~.StreamLines`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:113 msgid ":pr:`1469`: Added :meth:`.VMobject.proportion_from_point` to measure the proportion of points along a Bezier curve" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:117 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:119 msgid ":pr:`2111`: Improved setting of OpenGL colors" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:122 msgid ":pr:`2113`: Added OpenGL compatibility to :meth:`.ThreeDScene.begin_ambient_camera_rotation` and :meth:`.ThreeDScene.move_camera`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:125 msgid ":pr:`2016`: Added OpenGL support for :mod:`~.mobject.boolean_ops`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:128 msgid ":pr:`2084`: Added :meth:`~Table.get_highlighted_cell` and fixed :meth:`~Table.add_highlighted_cell`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:131 msgid ":pr:`2013`: Removed unnecessary check in :class:`~.TransformMatchingAbstractBase`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:134 msgid ":pr:`1971`: Added OpenGL support for :class:`~.StreamLines`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:137 msgid ":pr:`2041`: Added config option to enable OpenGL wireframe for debugging" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:141 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:143 msgid ":pr:`2070`: Fixed :meth:`~OpenGLRenderer.get_frame` when window is created" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:146 msgid ":pr:`2071`: Fixed :class:`~AnimationGroup` OpenGL compatibility" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:149 msgid ":pr:`2108`: Fixed swapped axis step values in :class:`~.NumberPlane`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:152 msgid ":pr:`2072`: Added OpenGL compatibility for :class:`~.Cube`." msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:155 msgid ":pr:`2060`: Fixed OpenGL compatibility issue for meth:`~Line.set_opacity`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:158 msgid ":pr:`2037`: Fixed return value of :meth:`~.OpenGLMobject.apply_complex_function`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:161 msgid ":pr:`2039`: Added OpenGL compatibility for :meth:`~Cylinder.add_bases`." msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:164 msgid ":pr:`2066`: Fixed error raised by logging when cache is full" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:167 msgid ":pr:`2026`: Fixed OpenGL shift animation for :class:`~.Text`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:170 msgid ":pr:`2028`: Fixed OpenGL overriding SVG fill color" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:173 msgid ":pr:`2043`: Fixed bug where :meth:`.NumberLine.add_labels` cannot accept non-mobject labels" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:176 msgid ":pr:`2011`: Fixed ``-a`` flag for OpenGL rendering" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:179 msgid ":pr:`1994`: Fix :meth:`~.input_to_graph_point` when passing a line graph (from :meth:`.Axes.get_line_graph`)" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:182 msgid ":pr:`2017`: Avoided using deprecated ``get_points`` method and fixed :class:`~.OpenGLPMPoint` color" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:186 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:188 msgid ":pr:`2131`: Copyedited the configuration tutorial in the documentation" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:191 msgid ":pr:`2120`: Changed ``manim_directive`` to use a clean configuration via ``tempconfig``" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:194 msgid ":pr:`2122`: Fixed broken links in inheritance graphs by moving them to ``reference.rst``" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:197 msgid ":pr:`2115`: Improved docstring of :meth:`.PMobject.add_points`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:200 msgid ":pr:`2116`: Made type hint for ``line_spacing`` argument of :class:`~.Paragraph` more accurate" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:203 msgid ":pr:`2117`: Changed the way the background color was set in a documentation example to avoid leaking the setting to other examples" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:206 msgid ":pr:`2101`: Added note that translation process is not ready" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:209 msgid ":pr:`2055`: Fixed parameter types of :meth:`.Graph.add_edges` and :meth:`.Graph.add_vertices`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:212 msgid ":pr:`862`: Prepared documentation for translation (still work in progress)" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:215 msgid ":pr:`2035`: Fixed broken link in README" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:218 msgid ":pr:`2020`: Corrected paths to user-wide configuration files for MacOS and Linux" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:222 msgid "Changes concerning the testing system" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:224 msgid ":pr:`2008`: Reuse CLI flag tests for OpenGL" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:227 msgid ":pr:`2080`: Reused :class:`~.Mobject` tests for :class:`~.OpenGLMobject`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:231 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:233 msgid ":pr:`2004`: Cancel previous workflows in the same branch in Github Actions" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:237 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:239 msgid ":pr:`2050`: Make colour aliases IDE-friendly" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:242 msgid ":pr:`2126`: Fixed whitespace in info message issued by :meth:`.SceneFileWriter.clean_cache`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:245 msgid ":pr:`2124`: Upgraded several dependencies (in particular: ``skia-pathops``)" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:248 msgid ":pr:`2001`: Fixed several warnings issued by LGTM" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:251 msgid ":pr:`2064`: Removed duplicate insert shader directory" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:254 msgid ":pr:`2027`: Improved wording in info message issued by :meth:`.SceneFileWriter.clean_cache`" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:257 msgid ":pr:`1968`: Sharpened Flake8 configuration and fixed resulting warnings" msgstr "" #: ../../source/changelog/0.11.0-changelog.rst:261 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.12.0-changelog.pot000066400000000000000000000352521515024150700263530ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.12.0-changelog.rst:3 msgid "v0.12.0" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:5 msgid "November 02, 2021" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:10 msgid "A total of 40 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:14 msgid "Anima. +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:15 msgid "Arcstur +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:16 #: ../../source/changelog/0.12.0-changelog.rst:47 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:17 #: ../../source/changelog/0.12.0-changelog.rst:48 msgid "Christopher Besch" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:18 #: ../../source/changelog/0.12.0-changelog.rst:49 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:19 msgid "David Yang +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:20 msgid "Dhananjay Goratela +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:21 msgid "Ethan Rooke +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:22 msgid "Eugene Chung +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:23 msgid "GameDungeon" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:24 msgid "Gustav-Rixon +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:25 #: ../../source/changelog/0.12.0-changelog.rst:56 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:26 msgid "Josiah Winslow +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:27 #: ../../source/changelog/0.12.0-changelog.rst:58 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:28 msgid "Martmists +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:29 msgid "Michael Hill +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:30 #: ../../source/changelog/0.12.0-changelog.rst:60 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:31 msgid "Nick +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:32 msgid "NotWearingPants +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:33 msgid "Peeter Joot +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:34 #: ../../source/changelog/0.12.0-changelog.rst:63 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:35 msgid "Viicos +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:36 msgid "heitor +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:37 #: ../../source/changelog/0.12.0-changelog.rst:65 msgid "icedcoffeeee" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:38 msgid "kieran-pringle +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:39 msgid "ะ’ะธะบั‚ะพั€ ะ’ะธะบั‚ะพั€ +" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:42 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:45 msgid "Alex Lembcke" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:46 msgid "Anima." msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:50 msgid "David Yang" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:51 msgid "Dhananjay Goratela" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:52 msgid "Ethan Rooke" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:53 msgid "Eugene Chung" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:54 msgid "Gustav-Rixon" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:55 msgid "Hugues Devimeux" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:57 msgid "Jason Villanueva" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:59 msgid "Mysaa" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:61 msgid "Nick" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:62 msgid "Oliver" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:64 msgid "Viicos" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:66 msgid "kieran-pringle" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:69 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:71 msgid "A total of 52 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:74 msgid "Highlights" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:79 msgid ":pr:`1812`: Implemented logarithmic scaling for :class:`~.NumberLine` / :class:`~.Axes`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:77 msgid "This implements scaling bases that can be passed to the ``scaling`` keyword argument of :class:`.NumberLine`. See :class:`.LogBase` (for a logarithmic scale) and :class:`.LinearBase` (for the default scale) for more details and examples." msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:85 msgid ":pr:`2152`: Introduced API for scene sections via :meth:`.Scene.next_section`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:82 msgid "Sections divide a scene into multiple parts, resulting in multiple output videos (when using the ``--save_sections`` flag). The cuts between two sections are defined by the user in the :meth:`~.Scene.construct` method. Each section has an optional name and type, which can be used by a plugin (`see an example `__). You can skip rendering specific sections with the ``skip_animations`` keyword argument." msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:88 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:90 msgid ":pr:`1926`: OpenGL: changed ``submobjects`` to be a property" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:93 msgid ":pr:`2245`: Removed deprecated method ``get_center_point`` and parameters ``azimuth_label_scale``, ``number_scale_value``, ``label_scale``, ``scale_factor``, ``size``, ``x_min``, ``x_max``, ``delta_x``, ``y_min``, ``y_max``, ``delta_y``" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:96 msgid ":pr:`2187`: Renamed ``get_graph`` and its variants to :meth:`~.CoordinateSystem.plot`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:99 msgid ":pr:`2065`: Deprecated :class:`~.FullScreenFadeRectangle` and :class:`~.PictureInPictureFrame`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:103 msgid "New features" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:105 msgid ":pr:`2025`: Implemented :meth:`.CoordinateSystem.input_to_graph_coords` and fixed :meth:`.CoordinateSystem.angle_of_tangent`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:108 msgid ":pr:`2151`: Added option to set the input file from a config file" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:111 msgid ":pr:`2128`: Added keyword arguments ``match_center``, ``match_width`` etc. to :meth:`.Mobject.become`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:114 msgid ":pr:`2162`: Implemented :meth:`.MovingCamera.auto_zoom` for automatically zooming onto specified mobjects" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:117 msgid ":pr:`2236`: Added ``skip_animations`` argument to :meth:`.Scene.next_section`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:120 msgid ":pr:`2196`: Implemented :meth:`.Line3D.parallel_to` and :meth:`.Line3D.perpendicular_to`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:124 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:128 msgid ":pr:`2138`: Fixed example for :meth:`~.Vector.coordinate_label` and added more customization for :class:`~.Matrix`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:127 msgid "Additional keyword arguments for :meth:`~.Vector.coordinate_label` are passed to the constructed matrix." msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:128 msgid ":class:`~.Matrix` now accepts a ``bracket_config`` keyword argument." msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:130 msgid ":pr:`2139`: Changed the color of :class:`~.NumberLine` from ``LIGHT_GREY`` to ``WHITE``" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:133 msgid ":pr:`2157`: Added :meth:`.CoordinateSystem.plot_polar_graph`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:136 msgid ":pr:`2243`: Fixed wasteful recursion in :meth:`.Mobject.get_merged_array`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:139 msgid ":pr:`2205`: Improved last frame output handling for the OpenGL renderer" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:142 msgid ":pr:`2172`: Added ``should_render`` attribute to disable rendering mobjects" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:145 msgid ":pr:`2182`: Changed the default width of videos in Jupyter notebooks to 60%" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:149 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:151 msgid ":pr:`2244`: Fixed :meth:`.CoordinateSystem.get_area` when using few plot points and a boundary graph" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:154 msgid ":pr:`2232`: Fixed :class:`.Graph` stopping to update after animating additions/deletions of vertices or edges" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:157 msgid ":pr:`2142`: Fixed issue with duplicates in OpenGL family and added tests" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:160 msgid ":pr:`2168`: Fixed order of return values of :func:`.space_ops.cartesian_to_spherical`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:163 msgid ":pr:`2160`: Made projection shaders compatible with :class:`.StreamLines`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:166 msgid ":pr:`2140`: Fixed passing color lists to :meth:`.Mobject.set_color` for the OpenGL renderer" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:169 msgid ":pr:`2211`: Fixed animations not respecting the specified rate function" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:172 msgid ":pr:`2161`: Fixed ``IndexOutOfBoundsError`` in TeX logging" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:175 msgid ":pr:`2148`: Fixed :class:`~.Arrow` tip disorientation with :meth:`.Line.put_start_and_end_on`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:178 msgid ":pr:`2192`: Fixed :func:`.svg_path.string_to_numbers` sometimes returning strings" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:181 msgid ":pr:`2185`: Fixed type mismatch for height and width parameters of :class:`~.Text`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:185 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:187 msgid ":pr:`2228`: Added a new boolean operation example to the gallery" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:190 msgid ":pr:`2239`: Removed erroneous raw string from text tutorial" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:193 msgid ":pr:`2184`: Moved comments in :class:`~.VMobject` to documentation" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:196 msgid ":pr:`2217`: Removed superfluous dots in documentation of :class:`.Section`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:199 msgid ":pr:`2215`: Fixed typo in docstring of :meth:`.ThreeDAxes.get_z_axis_label`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:202 msgid ":pr:`2212`: Fixed Documentation for Sections" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:205 msgid ":pr:`2201`: Fixed a typo in the documentation" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:208 msgid ":pr:`2165`: Added Crowdin configuration and changed source files to ``.pot`` format" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:211 msgid ":pr:`2130`: Transferred troubleshooting installation related snippets from Discord to the documentation" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:214 msgid ":pr:`2176`: Modified :meth:`.Mobject.set_default` example to prevent leaking across the docs" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:218 msgid "Changes concerning the testing system" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:220 msgid ":pr:`2197`: Added tests for resolution flag" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:223 msgid ":pr:`2146`: Increased test coverage for OpenGL renderer" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:227 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:229 msgid ":pr:`2191`: Removed ``add-trailing-comma`` pre-commit hook" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:233 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:235 msgid ":pr:`2136`: Added type hints to all colors" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:238 msgid ":pr:`2220`: Cleanup: let ``Scene.renderer.time`` return something that makes sense" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:241 msgid ":pr:`2222`: Updated Classifiers in ``pyproject.toml``: removed Python 3.6, added Python 3.9" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:244 msgid ":pr:`2213`: Removed redundant ``partial_movie_files`` parameter in :meth:`.SceneFileWriter.combine_to_movie`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:251 msgid ":pr:`2200`: Addressed some maintenance TODOs" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:248 msgid "Changed an `Exception` to `ValueError`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:249 msgid "Fixed :meth:`.MappingCamera.points_to_pixel_coords` by adding the ``mobject`` argument of the parent" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:250 msgid "Rounded up width in :class:`.SplitScreenCamera`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:251 msgid "Added docstring to :meth:`.Camera.capture_mobject`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:253 msgid ":pr:`2194`: Added type hints to :mod:`.utils.images`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:256 msgid ":pr:`2171`: Added type hints to :mod:`.utils.ipython_magic`" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:259 msgid ":pr:`2164`: Improved readability of regular expression" msgstr "" #: ../../source/changelog/0.12.0-changelog.rst:263 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.13.0-changelog.pot000066400000000000000000000254531515024150700263560ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.13.0-changelog.rst:3 msgid "v0.13.0" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:5 msgid "December 04, 2021" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:10 msgid "A total of 27 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:14 #: ../../source/changelog/0.13.0-changelog.rst:38 msgid "Alex Lembcke" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:15 #: ../../source/changelog/0.13.0-changelog.rst:39 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:16 #: ../../source/changelog/0.13.0-changelog.rst:40 msgid "Christopher Besch" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:17 #: ../../source/changelog/0.13.0-changelog.rst:41 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:18 msgid "Filip +" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:19 msgid "John Ingles +" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:20 #: ../../source/changelog/0.13.0-changelog.rst:45 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:21 msgid "Lucas Ricci +" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:22 msgid "Marcin Serwin +" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:23 msgid "Mysaa" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:24 #: ../../source/changelog/0.13.0-changelog.rst:47 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:25 msgid "Ricky +" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:26 #: ../../source/changelog/0.13.0-changelog.rst:50 msgid "Viicos" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:27 msgid "ask09ok +" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:28 msgid "citrusmunch +" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:29 #: ../../source/changelog/0.13.0-changelog.rst:52 msgid "icedcoffeeee" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:30 msgid "mostlyaman +" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:31 msgid "vmiezys +" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:32 msgid "zhujisheng +" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:35 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:42 msgid "Filip" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:43 msgid "Hugues Devimeux" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:44 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:46 msgid "Lucas Ricci" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:48 msgid "Oliver" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:49 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:51 msgid "ask09ok" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:53 msgid "mostlyaman" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:56 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:58 msgid "A total of 39 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:61 msgid "Highlights" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:63 msgid ":pr:`2313`: Finalized translation process and documentation" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:67 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:75 msgid ":pr:`2331`: Removed deprecations up to ``v0.12.0``" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:70 msgid "Removed ``distance`` parameters from :class:`~.ThreeDCamera` (replacement: ``focal_distance``)" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:71 msgid "Removed ``min_distance_to_new_point`` parameter from :class:`~.TracedPath`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:72 msgid "Removed ``positive_space_ratio`` and ``dash_spacing`` parameters from :class:`~.DashedVMobject`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:73 msgid "Removed ``_in_place`` methods from :mod:`.mobject`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:74 msgid "Removed ``ReconfigurableScene``" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:75 msgid "Removed ``SampleSpaceScene``" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:77 msgid ":pr:`2312`: Replaced all occurrences of ``set_submobjects``" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:81 msgid "New features" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:85 msgid ":pr:`2314`: Added basic support for adding subcaptions via :meth:`.Scene.add_subcaption`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:84 msgid "New method :meth:`.Scene.add_subcaption`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:85 msgid "New keyword arguments ``subcaption``, ``subcaption_duration``, ``subcaption_offset`` for :meth:`.Scene.play`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:87 msgid ":pr:`2267`: Implemented :meth:`.CoordinateSystem.plot_antiderivative_graph`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:91 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:93 msgid ":pr:`2347`: Moved ``manim_directive.py`` to ``manim.utils.docbuild``" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:96 msgid ":pr:`2340`: Added documentation for :mod:`.animation.growing` and improved :class:`.SpinInFromNothing`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:99 msgid ":pr:`2343`: Replaced current tree layout algorithm with SageMath's for improved layout of large trees" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:102 msgid ":pr:`2351`: Added missing ``**kwargs`` parameter to :meth:`.Table.add_highlighted_cell`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:105 msgid ":pr:`2344`: Resized SVG logos, fit content to canvas" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:109 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:111 msgid ":pr:`2359`: Resolved ``ValueError`` when calling ``manim cfg write``" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:114 msgid ":pr:`2276`: Fixed bug with alignment of z-axis in :class:`~.ThreeDAxes`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:117 msgid ":pr:`2325`: Several improvements to handling of ``quality`` argument" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:120 msgid ":pr:`2335`: Fixed bug with zooming camera and :class:`~.PointCloud`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:123 msgid ":pr:`2328`: Fixed bug causing incorrect RGBA values to be passed to cairo" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:126 msgid ":pr:`2292`: Fixed positioning of :class:`~.Flash`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:129 msgid ":pr:`2262`: Fixed wrong cell coordinates with :meth:`.Table.get_cell` after scaling" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:132 msgid ":pr:`2280`: Fixed :class:`~.DecimalNumber` color when number of displayed digits changes" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:136 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:138 msgid ":pr:`2354`: Port over docs and typings from ``mobject.py`` and ``vectorized_mobject.py`` to their OpenGL counterparts" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:141 msgid ":pr:`2350`: Added mention of Manim sideview extension for VS Code" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:144 msgid ":pr:`2342`: Removed :meth:`~.CoordinateSystem.get_graph` usage from :class:`~.Axes` example" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:147 msgid ":pr:`2216`: Edited and added new sections to the quickstart tutorial" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:150 msgid ":pr:`2279`: Added documentation for discontinuous functions" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:153 msgid ":pr:`2319`: Swapped ``dotL`` and ``dotR`` in :meth:`.Mobject.interpolate` example" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:156 msgid ":pr:`2230`: Copyedited building blocks tutorial" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:159 msgid ":pr:`2310`: Clarified that Manim does not support Python 3.10 yet in the documentation" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:162 msgid ":pr:`2294`: Made documentation front page more concise and rearranged order of tutorials" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:165 msgid ":pr:`2287`: Replace link to old interactive notebook" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:169 msgid "Changes concerning the testing system" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:171 msgid ":pr:`2346`: Made ``frames_comparsion`` decorator for frame testing a proper module of the library" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:174 msgid ":pr:`2318`: Added tests for ``remover`` keyword argument of :class:`~.AnimationGroup`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:177 msgid ":pr:`2301`: Added a test for :meth:`.ThreeDScene.add_fixed_in_frame_mobjects`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:180 msgid ":pr:`2274`: Optimized some tests to reduce duration" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:183 msgid ":pr:`2272`: Added test for :class:`~.Broadcast`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:187 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:189 msgid ":pr:`2327`: Corrected type hint for ``labels`` keyword argument of :class:`~.Graph`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:192 msgid ":pr:`2329`: Remove unintended line break in README" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:195 msgid ":pr:`2305`: Corrected type hint ``discontinuities`` argument for :class:`~.ParametricFunction`" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:198 msgid ":pr:`2300`: Add contact email for PyPi" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:202 msgid "New releases" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:204 msgid ":pr:`2353`: Prepare new release: ``v0.13.0``" msgstr "" #: ../../source/changelog/0.13.0-changelog.rst:208 msgid "Unclassified changes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.13.1-changelog.pot000066400000000000000000000027031515024150700263500ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.13.1-changelog.rst:3 msgid "v0.13.1" msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:5 msgid "December 05, 2021" msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:10 msgid "A total of 2 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:14 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:17 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:20 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:23 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:25 msgid "A total of 2 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:28 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:30 msgid ":pr:`2363`: Fixed broken IPython magic command" msgstr "" #: ../../source/changelog/0.13.1-changelog.rst:34 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.14.0-changelog.pot000066400000000000000000000227731515024150700263610ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.14.0-changelog.rst:3 msgid "v0.14.0" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:5 msgid "January 07, 2022" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:10 msgid "A total of 29 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:14 #: ../../source/changelog/0.14.0-changelog.rst:38 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:15 msgid "BorisTheBrave +" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:16 #: ../../source/changelog/0.14.0-changelog.rst:41 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:17 #: ../../source/changelog/0.14.0-changelog.rst:42 msgid "GameDungeon" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:18 msgid "Gergely Bencsik +" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:19 #: ../../source/changelog/0.14.0-changelog.rst:45 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:20 msgid "Jihoon +" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:21 msgid "Kian Kasad +" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:22 msgid "Kiran-Raj-Dev +" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:23 #: ../../source/changelog/0.14.0-changelog.rst:47 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:24 msgid "Leo Xu +" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:25 #: ../../source/changelog/0.14.0-changelog.rst:50 msgid "Marcin Serwin" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:26 msgid "Matt Gleich +" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:27 #: ../../source/changelog/0.14.0-changelog.rst:51 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:28 msgid "Steven nguyen +" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:29 msgid "Vectozavr +" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:30 #: ../../source/changelog/0.14.0-changelog.rst:54 msgid "Viicos" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:31 msgid "citrusmunch" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:32 msgid "netwizard22 +" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:35 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:39 msgid "BorisTheBrave" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:40 msgid "Christopher Besch" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:43 msgid "Gergely Bencsik" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:44 msgid "Hugues Devimeux" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:46 msgid "Kiran-Raj-Dev" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:48 msgid "Leo Xu" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:49 msgid "Lucas Ricci" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:52 msgid "Raghav Goel" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:53 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:55 msgid "icedcoffeeee" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:58 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:60 msgid "A total of 29 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:63 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:69 msgid ":pr:`2390`: Removed deprecations up to `v0.13.0`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:66 msgid "Removed ``get_graph``, ``get_implicit_curve``, ``get_derivative_graph``, ``get_line_graph`` and ``get_parametric_curve`` in favour of their ``plot`` variants" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:67 msgid "Removed ``FullScreenFadeRectangle`` and ``PictureInPictureFrame``" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:68 msgid "Removed ``path_arc`` parameter from :class:`~.SpinInFromNothing`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:69 msgid "Removed ``set_submobjects`` method from ``opengl_mobject.py``" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:72 msgid "New features" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:75 msgid ":pr:`2341`: Update :class:`~.Text` to use new ``ManimPango`` color setting" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:75 msgid ":class:`~.Text` class now uses color setting introduced in ``ManimPango 0.4.0`` for color and gradient." msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:78 msgid ":pr:`2397`: Added ``label_constructor`` parameter for :class:`~.NumberLine`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:78 msgid "Allows changing the class that will be used to construct :class:`~.Axes` and :class:`~.NumberLine` labels by default. Makes it possible to easily use :class:`~.Text` for labels if needed." msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:81 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:83 msgid ":pr:`2383`: Made :meth:`.Surface.set_fill_by_value` support gradients along different axes" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:86 msgid ":pr:`2388`: Added ``about_point`` keyword argument to :class:`~.ApplyMatrix`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:89 msgid ":pr:`2395`: Add documentation for paths functions" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:94 msgid ":pr:`2372`: Improved :class:`~.DashedVMobject`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:93 msgid ":class:`~.DashedVMobject` used to create stretched and uneven dashes on most plotted curves. Now the dash lengths are equalized. An option is reserved to use the old method. New keyword argument: ``dash_offset``. This parameter shifts the starting point." msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:97 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:99 msgid ":pr:`2409`: Fixed performance degradation by trimming empty curves from paths when calling :meth:`.VMobject.align_points`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:102 msgid ":pr:`2392`: Fixed ``ZeroDivisionError`` in :mod:`~.mobject.three_dimensions`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:105 msgid ":pr:`2362`: Fixed phi updater in :meth:`.ThreeDScene.begin_3dillusion_camera_rotation`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:109 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:111 msgid ":pr:`2415`: Removed instructions on using and installing Docker in README" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:114 msgid ":pr:`2414`: Made improvements to the :doc:`/guides/configuration` tutorial" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:117 msgid ":pr:`2423`: Changed recommendation to ``mactex-no-gui`` from ``mactex`` for macOS install" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:120 msgid ":pr:`2407`: Clarified docstrings of :meth:`.Mobject.animate`, :meth:`.Mobject.set` and :class:`~.Variable`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:123 msgid ":pr:`2352`: Added Crowdin badge" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:126 msgid ":pr:`2371`: Added ``dvips`` to list of required LaTeX packages on Linux" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:129 msgid ":pr:`2403`: Improved docstring of :class:`~.ApplyMethod` and removed propagated ``__init__`` docstring" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:132 msgid ":pr:`2391`: Fixed typo in parameter name in documentation of :class:`~.NumberLine`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:135 msgid ":pr:`2368`: Added note in Internationalization" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:139 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:141 msgid ":pr:`2408`: Removed various return annotations that were stifling type inference" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:144 msgid ":pr:`2424`: Removed ``strings.py``" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:147 msgid ":pr:`1972`: Added support for MyPy" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:150 msgid ":pr:`2410`: Fixed Flake8" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:153 msgid ":pr:`2401`: Fixed type annotations in :mod:`.mobject.three_dimensions`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:156 msgid ":pr:`2405`: Removed some unused OpenGL files" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:159 msgid ":pr:`2399`: Fixed type annotations in :mod:`~.mobject.table`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:162 msgid ":pr:`2385`: Made comments in quickstart tutorial more precise" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:165 msgid ":pr:`2377`: Fixed type hint for an argument of :class:`~.MoveAlongPath`" msgstr "" #: ../../source/changelog/0.14.0-changelog.rst:169 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.15.0-changelog.pot000066400000000000000000000417011515024150700263520ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.15.0-changelog.rst:3 msgid "v0.15.0" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:5 msgid "February 26, 2022" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:10 msgid "A total of 34 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:14 msgid "Alex Lembcke" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:15 msgid "AnonymoZ +" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:16 #: ../../source/changelog/0.15.0-changelog.rst:44 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:17 #: ../../source/changelog/0.15.0-changelog.rst:46 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:18 msgid "Eshaan Naga Venkata +" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:19 msgid "Faruk D. +" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:20 #: ../../source/changelog/0.15.0-changelog.rst:48 msgid "GameDungeon" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:21 msgid "Kevin Cen +" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:22 #: ../../source/changelog/0.15.0-changelog.rst:50 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:23 msgid "Leo Xu" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:24 msgid "Lucas Ricci" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:25 #: ../../source/changelog/0.15.0-changelog.rst:52 msgid "Marcin Serwin" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:26 msgid "Michael McNeil Forbes +" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:27 msgid "Mysaa" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:28 #: ../../source/changelog/0.15.0-changelog.rst:53 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:29 msgid "Pierre Couy +" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:30 msgid "Simon Ellmann +" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:31 msgid "Tommy Chu +" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:32 msgid "Viicos" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:33 #: ../../source/changelog/0.15.0-changelog.rst:58 msgid "ad_chaos" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:34 msgid "betafcc +" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:35 msgid "friedkeenan" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:36 #: ../../source/changelog/0.15.0-changelog.rst:60 msgid "icedcoffeeee" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:37 msgid "vmoros +" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:38 msgid "้นค็ฟ”ไธ‡้‡Œ" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:41 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:45 msgid "Christopher Besch" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:47 msgid "Eshaan Naga Venkata" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:49 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:51 msgid "Marcin Kurczewski" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:54 msgid "Raghav Goel" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:55 msgid "RomainJMend" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:56 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:57 msgid "Tommy Chu" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:59 msgid "betafcc" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:63 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:65 msgid "A total of 71 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:68 msgid "Breaking changes" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:71 msgid ":pr:`2476`: Improved structure of the :mod:`.mobject` module" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:71 msgid "Arrow tips now have to be imported from ``manim.mobject.geometry.tips`` instead of ``manim.mobject.geometry``." msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:75 msgid ":pr:`2387`: Refactored :class:`~.BarChart` and made it inherit from :class:`~.Axes`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:74 msgid ":class:`~.BarChart` now inherits from :class:`~.Axes`, allowing it to use :class:`~.Axes`' methods. Also improves :class:`~.BarChart`'s configuration and ease of use." msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:75 msgid "Added :meth:`~.BarChart.get_bar_labels` to annotate the value of each bar of a :class:`~.BarChart`." msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:78 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:81 msgid ":pr:`2568`: Removed Deprecated Methods" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:81 msgid "Removed methods and classes that were deprecated since v0.10.0 and v0.11.0" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:83 msgid ":pr:`2457`: Deprecated :class:`.ShowCreationThenFadeOut`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:87 msgid "New features" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:89 msgid ":pr:`2442`: Added ``media_embed`` config option to control whether media in Jupyter notebooks is embedded" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:96 msgid ":pr:`2504`: Added finer control over :meth:`.Scene.wait` being static (i.e., no updaters) or not" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:93 msgid "Added keyword argument ``frozen_frame`` to :class:`.Wait` and :meth:`.Scene.wait`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:94 msgid "New convenience method: :meth:`.Scene.pause` (alias for ``Scene.wait(frozen_frame=True)``)" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:95 msgid "Changed default behavior for OpenGL updaters: updater functions are now not called by default when they are added" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:96 msgid "Changed default behavior of :meth:`.Scene.should_mobjects_update`: made it respect the set value of ``Wait.frozen_frame``, changed automatic determination of frozen frame state to also consider Scene updaters" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:99 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:101 msgid ":pr:`2478`: Alternative scaling for tree graph layout" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:104 msgid ":pr:`2565`: Allowed passing vertex configuration keyword arguments to :meth:`.Graph.add_edges`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:107 msgid ":pr:`2467`: :class:`~.MathTex`, :class:`~.Tex`, :class:`~.Text` and :class:`~.MarkupText` inherit color from their parent mobjects" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:110 msgid ":pr:`2537`: Added support for PySide coordinate system" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:113 msgid ":pr:`2158`: Added OpenGL compatibility to :meth:`.ThreeDScene.add_fixed_orientation_mobjects` and :meth:`.ThreeDScene.add_fixed_in_frame_mobjects`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:116 msgid ":pr:`2535`: Implemented performance enhancement for :meth:`.VMobject.insert_n_curves_to_point_list`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:119 msgid ":pr:`2516`: Cached view matrix for :class:`~.OpenGLCamera`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:122 msgid ":pr:`2508`: Improve performance for :meth:`.Mobject.become`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:125 msgid ":pr:`2332`: Changed ``color``, ``stroke_color`` and ``fill_color`` attributes to properties" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:131 msgid ":pr:`2396`: Fixed animations introducing or removing objects" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:129 msgid ":class:`.ShowPassingFlash` now removes objects when the animation is finished" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:130 msgid "Added ``introducer`` keyword argument to :class:`.Animation` analogous to ``remover``" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:131 msgid "Updated :class:`.Graph` vertex addition handling" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:134 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:136 msgid ":pr:`2574`: Improved Error in :mod:`.utils.tex_file_writing`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:139 msgid ":pr:`2580`: Fixed :func:`.find_intersection` in :mod:`.space_ops`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:142 msgid ":pr:`2576`: Fixed a bug with animation of removal of edges from a :class:`.Graph`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:145 msgid ":pr:`2556`: Fixed showing highlighted cells when creating :class:`.Table`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:148 msgid ":pr:`2559`: Fix setting line numbers in :class:`.Text` when using ManimPango settings" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:151 msgid ":pr:`2557`: Fixed logger bug in :meth:`.Camera.make_background_from_func`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:154 msgid ":pr:`2548`: Fixed :class:`.Axes` plotting bug with logarithmic x-axis" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:157 msgid ":pr:`1547`: Fixed certain unicode characters in users' paths causing issues on Windows" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:160 msgid ":pr:`2526`: Fixed segfault when using ``--enable_gui``" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:163 msgid ":pr:`2538`: Fixed flickering OpenGL preview when using ``frozen_frame``" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:166 msgid ":pr:`2528`: Fixed custom naming of gifs and added some tests" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:169 msgid ":pr:`2487`: Fixed :meth:`.ThreeDCamera.remove_fixed_orientation_mobjects`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:172 msgid ":pr:`2530`: Use single source of truth for default text values" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:175 msgid ":pr:`2494`: Fixed an issue related to previewing gifs" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:178 msgid ":pr:`2490`: Fixed order of transformation application in :class:`~.SVGMobject`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:181 msgid ":pr:`2357`: Fixed ``screeninfo.get_monitors`` for MacOS" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:184 msgid ":pr:`2444`: Fixed :meth:`.VectorScene.add_axes`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:188 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:190 msgid ":pr:`2560`: Refactored more docstrings in :mod:`.geometry`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:193 msgid ":pr:`2571`: Refactored docstrings in :mod:`.graphing`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:196 msgid ":pr:`2569`: Refactored docstrings in :mod:`.geometry`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:198 msgid ":pr:`2549`: Added a page for internals which links to our GitHub wiki" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:201 msgid ":pr:`2458`: Improved documentation for :class:`.Rotate`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:204 msgid ":pr:`2459`: Added examples to some transform animations" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:207 msgid ":pr:`2517`: Added guide on profiling and improving performance" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:210 msgid ":pr:`2518`: Added imports to examples for ``deprecation`` decorator" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:213 msgid ":pr:`2499`: Improved help text for ``--write_to_movie``" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:216 msgid ":pr:`2465`: Added documentation for :func:`.index_labels`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:219 msgid ":pr:`2495`: Updated minimal LaTeX installation instructions" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:222 msgid ":pr:`2500`: Added note about contributions during refactor period" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:225 msgid ":pr:`2431`: Changed example in :meth:`.Surface.set_fill_by_value`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:228 msgid ":pr:`2485`: Fixed some typos in documentation" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:231 msgid ":pr:`2493`: Fixed typo in documentation for parameters of :class:`.Square`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:234 msgid ":pr:`2482`: Updated Python version requirement in installation guide" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:237 msgid ":pr:`2438`: Removed unnecessary rotation from example" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:240 msgid ":pr:`2468`: Hid more private methods from the docs" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:243 msgid ":pr:`2466`: Fixed a typo in the documentation for plugins" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:246 msgid ":pr:`2448`: Improvements to the ``.pot`` files cleaning system" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:249 msgid ":pr:`2436`: Fixed typo and improved example in building blocks tutorial" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:253 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:255 msgid ":pr:`2554`: Removed ``Remove-Item`` calls for MSYS2 Python" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:258 msgid ":pr:`2531`: Added a GitHub Action for automatic validation of citation metadata" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:261 msgid ":pr:`2536`: Upgraded version of setup-ffmpeg CI action" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:264 msgid ":pr:`2484`: Updated tinytex download URL" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:268 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:270 msgid ":pr:`2573`: Moved :mod:`.value_tracker` back inside :mod:`.mobject`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:273 msgid ":pr:`2566`: Removed unused livestream-related imports and functions from :mod:`.scene_file_writer`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:276 msgid ":pr:`2524`: Reworked :mod:`.space_ops`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:279 msgid ":pr:`2519`: Removed outdated comment" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:282 msgid ":pr:`2503`: Removed unused imports" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:285 msgid ":pr:`2475`: Removed setuptools dependency" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:288 msgid ":pr:`2472`: Removed unnecessary comment in :mod:`.simple_functions`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:291 msgid ":pr:`2429`: Upgraded to future-style type annotations" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:294 msgid ":pr:`2464`: Bump pillow from 8.4.0 to 9.0.0" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:297 msgid ":pr:`2376`: Updated dependencies for Python 3.10" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:305 msgid ":pr:`2437`: Cleaned up :mod:`.simple_functions`" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:301 msgid "Removed ``fdiv`` as in all cases where it was used, it was just doing the same thing as numpy array division." msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:302 msgid "Replaced old implementation of the choose function with scipy's implementation" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:303 msgid "Use ``lru_cache`` (least recently used cache) for caching the choose function. Since it's only used for beziers, only 2 choose k and 3 choose k will be used, hence a size of 10 should be enough." msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:304 msgid "Removed ``clip_in_place`` in favor of ``np.clip``" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:305 msgid "Removed one use of ``clip_in_place`` that wasn't actually doing anything" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:307 msgid ":pr:`2439`: Removed twitter template from scripts" msgstr "" #: ../../source/changelog/0.15.0-changelog.rst:311 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.15.1-changelog.pot000066400000000000000000000065641515024150700263630ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.15.1-changelog.rst:3 msgid "v0.15.1" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:5 msgid "March 08, 2022" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:10 msgid "A total of 9 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:14 #: ../../source/changelog/0.15.1-changelog.rst:24 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:15 msgid "Nicolai Weitkemper" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:16 msgid "Yuchen +" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:17 #: ../../source/changelog/0.15.1-changelog.rst:28 msgid "ad_chaos" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:20 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:23 msgid "Alex Lembcke" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:25 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:26 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:27 msgid "Raghav Goel" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:29 msgid "icedcoffeeee" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:32 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:34 msgid "A total of 9 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:37 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:39 msgid ":pr:`2602`: Support groups in :class:`.TransformMatchingTex`" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:43 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:45 msgid ":pr:`2594`: Fixed render flow issues with introducer animations" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:48 msgid ":pr:`2584`: Fixed bug with invalid color type ``None``" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:51 msgid ":pr:`2587`: Fixed bug with rendering Tex string that contain ``%``" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:54 msgid ":pr:`2593`: Fixed bug with displaying images in Jupyter Notebooks when ``config.media_embed`` is set to ``False``" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:58 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:60 msgid ":pr:`2570`: Refactored docstrings in :mod:`.coordinate_systems`" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:63 msgid ":pr:`2603`: Reduced the number of warnings during documentation build" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:67 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:69 msgid ":pr:`2578`: Fixed incorrect type hint for color property of :class:`.Text`" msgstr "" #: ../../source/changelog/0.15.1-changelog.rst:73 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.15.2-changelog.pot000066400000000000000000000312421515024150700263530ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.15.2-changelog.rst:3 msgid "v0.15.2" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:5 msgid "April 25, 2022" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:10 msgid "A total of 33 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:14 msgid "Bailey Powers +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:15 #: ../../source/changelog/0.15.2-changelog.rst:44 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:16 msgid "Dan Walsh +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:17 msgid "Darigov Research" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:18 #: ../../source/changelog/0.15.2-changelog.rst:46 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:19 msgid "David Millard +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:20 msgid "Hamidreza Hashemi +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:21 #: ../../source/changelog/0.15.2-changelog.rst:49 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:22 #: ../../source/changelog/0.15.2-changelog.rst:50 msgid "Jason Villanueva" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:23 msgid "Jonathan Alpert +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:24 msgid "Joy Bhalla" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:25 msgid "Kian Cross +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:26 msgid "Luca +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:27 msgid "Mohsin Shaikh +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:28 #: ../../source/changelog/0.15.2-changelog.rst:53 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:29 msgid "Prismo +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:30 #: ../../source/changelog/0.15.2-changelog.rst:55 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:31 msgid "WillSoltas +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:32 #: ../../source/changelog/0.15.2-changelog.rst:56 msgid "ad_chaos" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:33 msgid "darkways +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:34 msgid "dawn*squirryl +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:35 #: ../../source/changelog/0.15.2-changelog.rst:59 msgid "icedcoffeeee" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:36 #: ../../source/changelog/0.15.2-changelog.rst:60 msgid "peaceheis" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:37 msgid "sparshg" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:38 msgid "trickypr +" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:41 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:45 msgid "Dan Walsh" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:47 msgid "GameDungeon" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:48 msgid "Hugues Devimeux" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:51 msgid "Jonathan Alpert" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:52 msgid "Luca" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:54 msgid "Prismo" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:57 msgid "darkways" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:58 msgid "hickmott99" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:63 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:65 msgid "A total of 39 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:68 msgid "New features" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:74 msgid ":pr:`1975`: Improved CLI help page styling" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:71 msgid "Updates dependencies on Click and Cloup libraries for CLI help page styling." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:72 msgid "Removed the dependency on click-default-group." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:73 msgid "Added ``no_args_is_help`` parameter for ``manim render`` to allow easy access to help page." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:74 msgid "Added note to ``manim`` help page epilog on how to access other command help pages." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:77 msgid ":pr:`2404`: Add :class:`.SpiralIn` Animation" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:77 msgid "Make :class:`.ManimBanner` to use :class:`.SpiralIn`." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:79 msgid ":pr:`2534`: Implement :class:`~.OpenGLImageMobject`" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:82 msgid ":pr:`2684`: Created a more accessible way to create Angles with line.py angle function - :meth:`.Angle.from_three_points`" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:86 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:88 msgid ":pr:`2062`: Reuse shader wrappers and shader data" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:92 msgid ":pr:`2642`: Migrated ``file_ops.py`` and ``scene_file_writer.py`` from os.path to Pathlib" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:92 msgid "In ``file_ops.py`` and ``scene_file_writer.py``: Uses of str type file names have been mostly (see further information) converted to pathlib's Path objects. Uses of ``os.path`` methods have been converted to equivalent pathlib methods." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:94 msgid ":pr:`2655`: Fix :func:`.assert_is_mobject_method` when using OpenGL" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:97 msgid ":pr:`2665`: Improved handling of attributes when using the ``.animate`` syntax" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:102 msgid ":pr:`2674`: Document and type ``simple_functions.py``" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:101 msgid "Add documentation for ``simple_functions.py``." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:102 msgid "Small additions with some extra clarity for these functions." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:105 msgid ":pr:`2693`: Allow using :meth:`.MovingCamera.auto_zoom` without animation" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:105 msgid "Allows auto zooming camera without having to play an animation by passing an ``animation=False`` argument" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:108 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:110 msgid ":pr:`2546`: Fixed a file logging bug and some maintenance" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:116 msgid ":pr:`2597`: Fix Bug in :class:`.Uncreate` with ``rate_func`` via introducing new parameter ``reversed`` to :class:`.Animation`" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:114 msgid "Refractor the :class:`.Uncreate`. The new implementation uses a flag member ``reversed``. Set it to ``True`` and its superclass handles the reverse." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:115 msgid "Introduce a bool parameter ``reversed`` to :class:`.Animation`. It decides whether the animation needs to be played backwards. Default to be False." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:116 msgid "Add conditional branches in :meth:`.Animation.get_sub_alpha`. If the parameter ``reversed`` is True, it would set ``rate_func(t)`` to ``rate_func(1 - t)``." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:118 msgid ":pr:`2613`: Fixed bug in :meth:`.Circle.point_at_angle` when the angle is not in the interval :math:`[0, 2\\pi]`" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:121 msgid ":pr:`2634`: Fix background lines drawn twice in :class:`.NumberPlane`" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:124 msgid ":pr:`2648`: Handle user-defined centers for Wiggle animation" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:128 msgid ":pr:`2658`: Fix arguments of overridden ``set_style`` for :class:`.BackgroundRectangle`" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:128 msgid "Using :class:`.Write` animation on a :class:`.Text` object with ``.add_background_rectangle()`` applied no longer generates a ``TypeError``." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:130 msgid ":pr:`2668`: (Re)set background color of :class:`.OpenGLRenderer` when initializing scene" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:133 msgid ":pr:`2676`: Fixed propagation of custom attributes in animations for the OpenGL renderer" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:136 msgid ":pr:`2688`: Fixed two minor issues of :class:`.SpiralIn` and :class:`.ManimBanner`" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:140 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:142 msgid ":pr:`2609`: Copyedit troubleshooting.rst" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:145 msgid ":pr:`2610`: Add example PolygonOnAxes" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:148 msgid ":pr:`2617`: Re-added :mod:`.value_tracker` documentation" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:151 msgid ":pr:`2619`: Improve Example for arrange_in_grid" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:154 msgid ":pr:`2620`: Fixed typo in :meth:`.Animation.is_introducer`" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:158 msgid ":pr:`2640`: Copyedited Documentation" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:158 msgid "Reviewed ``tutorials/configurations.rst``. Edited simple mistakes such as Manim not being capitalized and commas." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:160 msgid ":pr:`2649`: Document and type utils/iterables.py" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:163 msgid ":pr:`2651`: Update copyright year in documentation to 2020-2022" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:165 msgid ":pr:`2663`: Added documentation for scene updater functions" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:168 msgid ":pr:`2686`: Add instructions to install extra dependencies with poetry" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:172 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:174 msgid ":pr:`2561`: Run tests on Linux-aarch64" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:177 msgid ":pr:`2656`: Fixed incompatibility with black version" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:181 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:184 msgid ":pr:`2630`: Remove WebGL renderer" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:184 msgid "The WebGL renderer is broken and unmaintained. The support for it in Manim is removed." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:186 msgid ":pr:`2652`: Update ``cloup`` version to 0.13.0 from 0.7.0" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:189 msgid ":pr:`2678`: Require ``backports-cached-property`` only for Python < 3.8" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:193 msgid ":pr:`2685`: Migrate from ``os.path`` to ``pathlib`` in testing scripts" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:193 msgid "This pull request changes a number of instances of ``os.path`` to Pathlib objects and functions. In addition, this PR modifies the SVGMobject constructor to accept both a Pathlib object or a string variable pathname its constructor." msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:195 msgid ":pr:`2691`: Removed :class:`CameraFrame`" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:198 msgid ":pr:`2696`: Made changelog generation run in parallel plus further improvements to ``scripts/dev_changelog.py``" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:201 msgid ":pr:`2697`: Sort PRs by number in changelog sections before writing" msgstr "" #: ../../source/changelog/0.15.2-changelog.rst:205 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.16.0-changelog.pot000066400000000000000000000364571515024150700263670ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.16.0-changelog.rst:3 msgid "v0.16.0" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:5 msgid "July 13, 2022" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:10 msgid "A total of 44 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:14 #: ../../source/changelog/0.16.0-changelog.rst:51 msgid "Alex Lembcke" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:15 msgid "Baroudi Aymen +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:16 #: ../../source/changelog/0.16.0-changelog.rst:52 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:17 msgid "Charalampos Georgiou +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:18 msgid "Cindy Park +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:19 msgid "Ejar +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:20 msgid "Francesco Frassinelli +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:21 msgid "Francisco Manrรญquez Novoa +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:22 msgid "Jacob Evan Shreve +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:23 msgid "Jaime Santos +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:24 #: ../../source/changelog/0.16.0-changelog.rst:58 msgid "Jonathan Alpert" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:25 msgid "Joshua Mankelow +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:26 msgid "Kevin Lubick +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:27 #: ../../source/changelog/0.16.0-changelog.rst:60 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:28 msgid "Lingren Kong +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:29 msgid "Logen +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:30 #: ../../source/changelog/0.16.0-changelog.rst:61 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:31 msgid "Noam Zaks" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:32 msgid "Pedro Lamkowski +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:33 #: ../../source/changelog/0.16.0-changelog.rst:64 msgid "Raghav Goel" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:34 msgid "Simeon Widdis" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:35 #: ../../source/changelog/0.16.0-changelog.rst:66 msgid "Sparsh Goenka" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:36 msgid "TornaxO7 +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:37 msgid "Tristan Schulz +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:38 msgid "WillSoltas" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:39 #: ../../source/changelog/0.16.0-changelog.rst:69 msgid "ad_chaos" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:40 msgid "conor-oneill-2 +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:41 msgid "fcrozatier +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:42 msgid "mooncaker816 +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:43 msgid "niklebedenko +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:44 msgid "nyabkun +" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:45 msgid "quark67" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:48 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:53 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:54 msgid "Francesco Frassinelli" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:55 msgid "Francisco Manrรญquez Novoa" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:56 msgid "Gianluca Gippetto" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:57 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:59 msgid "Kevin Lubick" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:62 msgid "Pedro Lamkowski" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:63 msgid "Philipp Imhof" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:65 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:67 msgid "TornaxO7" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:68 msgid "Tristan Schulz" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:70 msgid "hickmott99" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:73 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:75 msgid "A total of 56 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:78 msgid "Highlights" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:82 msgid ":pr:`2550`: New thematic guide: a deep dive into the internals of the library" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:81 msgid "This new :doc:`thematic guide ` aims to be a comprehensive walkthrough describing all the things that Manim does when you run it to produce a video." msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:84 msgid ":pr:`2732`: Improved overall structure of deployed documentation; added a dedicated :doc:`FAQ section `" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:90 msgid ":pr:`2749`: Added :class:`.ChangeSpeed`, an animation wrapper that allows to smoothly change the speed at which an animation is played" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:88 msgid "The speed of any animation can be changed by wrapping the animation with :class:`.ChangeSpeed` and passing a dictionary as ``speedinfo`` whose keys are the relative animation run time stamps and whose values are the absolute speed factors; e.g., ``{0.5: 2, 0.75: 0.25}`` smoothly speeds up the animation by a factor of 2 once it has been completed to 50%, and then it is smoothly slowed down to 1/4 of the default run speed after 75% of the animation are completed. The ``run_time`` of the animation will be adjusted to match the changed play speed." msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:90 msgid "It is also possible to add time-based updaters that respect the change in speed, use the auxiliary :meth:`.ChangeSpeed.add_updater` method to do so." msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:93 msgid "New features" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:95 msgid ":pr:`2667`: Made FFmpeg executable path configurable" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:98 msgid ":pr:`2739`: Added vectorized plotting functionality via keyword argument ``use_vectorized`` to improve performance" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:102 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:104 msgid ":pr:`2186`: Enabled filling color by value for :class:`.OpenGLSurface`, replaced ``colors`` keyword argument of :meth:`.Surface.set_fill_by_value` with ``colorscale``" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:107 msgid ":pr:`2288`: Added warning when attempting to add same mobject as child twice" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:112 msgid ":pr:`2707`: Fixed missing ``get_nth_curve_length_pieces`` method of :class:`.OpenGLVMobject`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:111 msgid "Removed duplicate definition of ``get_curve_functions_with_lengths`` in ``OpenGLVMobject``" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:112 msgid "Added definition of ``get_nth_curve_length_pieces`` to ``OpenGLVMobject``" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:114 msgid ":pr:`2709`: Improved the look of the brackets of :class:`.Matrix`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:117 msgid ":pr:`2714`: Fixed :meth:`.OpenGLVMobject.pointwise_become_partial` to improve stroke rendering" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:120 msgid ":pr:`2727`: Slight performance improvement for :class:`.ArrowVectorField` and Bรฉzier curve computation" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:123 msgid ":pr:`2728`: Added :meth:`.VectorField.fit_to_coordinate_system` to fit a vector field to a given coordinate system" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:126 msgid ":pr:`2730`: Added note to let users find documentation of default CLI subcommand easier" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:129 msgid ":pr:`2746`: Installed ghostscript in the docker image" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:132 msgid ":pr:`2841`: Added :func:`.split_quadratic_bezier` and :func:`.subdivide_quadratic_bezier`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:135 msgid ":pr:`2842`: CLI: Moved functionality from ``manim new`` to ``manim init`` and added deprecation warning for ``manim new``" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:138 msgid ":pr:`2866`: Reorganize test files to match library module structure" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:142 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:144 msgid ":pr:`2567`: Use tempconfig for every scene render" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:147 msgid ":pr:`2638`: Fixed :meth:`BarChart.change_bar_values` not updating when height is 0" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:150 msgid ":pr:`2661`: Fixed tip resize functionality for :class:`.Axes` to match documentation" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:153 msgid ":pr:`2703`: Default to utf-8 when reading files in :class:`.Code`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:156 msgid ":pr:`2721`: Fixed bad text slicing for lines in :class:`.Paragraph`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:159 msgid ":pr:`2725`: Fixed wrong indentation in :class:`.Code`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:162 msgid ":pr:`2734`: Fixed OpenGL segfaults when running :meth:`.Scene.play` or :meth:`.Scene.wait` in interactive mode" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:165 msgid ":pr:`2753`: Fixed multiplatform builds for docker images in pipeline" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:168 msgid ":pr:`2757`: Added missing ``__init__.py`` file in :mod:`.docbuild` module" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:171 msgid ":pr:`2770`: Fixed bug in :meth:`.VMobject.proportion_from_point` that caused proportions greater than 1 to be returned" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:174 msgid ":pr:`2826`: Fixed leaked mobjects coming from :class:`.TransformMatchingAbstractBase`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:177 msgid ":pr:`2870`: Fixed issue with ``manim init scene SCENE_NAME filename.py`` and removed necessity of ``main.py`` to be present in working directory" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:181 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:183 msgid ":pr:`2704`: Updated URL to Pango Markup formatting page" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:186 msgid ":pr:`2716`: Improved the order of the reference manuals" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:189 msgid ":pr:`2720`: Fixed typo in docstring of :class:`.Angle`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:192 msgid ":pr:`2722`: Fixed typos in docstrings of classes in :mod:`.mobject.table`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:195 msgid ":pr:`2726`: Edited note on :class:`.NumberPlane` length and added another example" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:198 msgid ":pr:`2740`: Fixed documentation of :meth:`.Cylinder.get_direction`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:201 msgid ":pr:`2755`: Fixed docstring of :meth:`.VMobject.get_end_anchors`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:204 msgid ":pr:`2760`: Removed ``cmake`` from the MacOS installation section" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:207 msgid ":pr:`2767`: Added more questions and answers to FAQ section, new :doc:`OpenGL FAQ `" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:210 msgid ":pr:`2771`: Added documentation and testing for ``path_func`` keyword argument of :class:`.Transform`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:213 msgid ":pr:`2828`: Removed suggestion issue template, added FAQ answer regarding proposing new features" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:216 msgid ":pr:`2849`: Added example for ``path_arc`` keyword argument of :class:`.Transform`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:219 msgid ":pr:`2851`: Added an example on constructing a (neural) network using a partite :class:`.Graph`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:222 msgid ":pr:`2855`: Added implicit ``docker.io/`` URL base in reference to docker images" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:225 msgid ":pr:`2861`: Added docstring for :meth:`.CoordinateSystem.plot_parametric_curve`" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:229 msgid "Changes concerning the testing system" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:231 msgid ":pr:`2743`: Replaced ``assert`` statements with with assertion functions from ``np.testing``" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:235 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:237 msgid ":pr:`2700`: CI: updated Python versions" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:240 msgid ":pr:`2701`: CI: added a workflow to publish docker image after releases and commits to main branch" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:244 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:246 msgid ":pr:`2680`: Increased minimum required version of ``numpy`` to 1.19" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:249 msgid ":pr:`2687`: Migrated from ``os.path`` to ``pathlib`` in :class:`.SVGMobject` and other locations" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:252 msgid ":pr:`2715`: Updated deprecated ``pillow`` constants" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:255 msgid ":pr:`2735`: Bump pyjwt from 2.3.0 to 2.4.0" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:258 msgid ":pr:`2748`: Bump pillow from 9.1.0 to 9.1.1" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:261 msgid ":pr:`2751`: Fixed flake C417 and improved a comment" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:264 msgid ":pr:`2825`: Bump notebook from 6.4.11 to 6.4.12" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:267 msgid ":pr:`2864`: Updated lockfile" msgstr "" #: ../../source/changelog/0.16.0-changelog.rst:271 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.2.0-changelog.pot000066400000000000000000000201361515024150700262650ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.2.0-changelog.rst:3 msgid "v0.2.0" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:5 msgid "January 1, 2021" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:7 msgid "The changes since Manim Community release v0.1.1 are listed below." msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:10 msgid "Breaking Changes" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:12 msgid "Remove all CONFIG dictionaries and all calls to ``digest_config`` and allow passing options directly to the constructor of the corresponding classes (:pr:`783`)." msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:15 msgid "Practically, this means that old constructions using ``CONFIG`` like::" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:22 msgid "where corresponding objects were then instantiated as ``my_mobject = SomeMobject()`` should now be created simply using ``my_mobject = SomeMobject(my_awesome_property=42)``." msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:25 msgid "Remove old syntax for animating mobject methods by passing the methods and arguments to ``self.play``, and use a new syntax featuring the ``animate`` property (:pr:`881`)." msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:28 msgid "For example: the old-style ``play`` call ::" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:33 msgid "should be replaced with the new following call using the ``animate`` property::" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:38 msgid "New Features" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:40 msgid "Added creation animation for :class:`~.ManimBanner` (:pr:`814`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:41 msgid "Added some documentation to :meth:`~.Scene.construct` (:pr:`753`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:42 msgid "Added a black and white monochromatic version of Manim's logo (:pr:`826`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:43 msgid "Added support for a plugin system (``manim plugin`` subcommand + documentation) (:pr:`784`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:44 msgid "Implemented ``__add__``, ``__iadd__``, ``__sub__``, and ``__isub__`` for :class:`~.Mobject` (allowing for notation like ``some_vgroup + some_mobject``) (:pr:`790`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:45 msgid "Added type hints to several files in the library (:pr:`835`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:46 msgid "Added some examples to :mod:`~.animation.creation` (:pr:`820`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:47 msgid "Added some examples to :class:`~.DashedLine` and :class:`~.CurvesAsSubmobjects` (:pr:`833`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:48 msgid "Added new implementation for text rendered with Pango, :class:`~.MarkupText`, which can be formatted with an HTML-like syntax (:pr:`855`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:49 msgid "Added Fading in and out examples and deprecation of ``FadeInFromDown`` and ``FadeOutAndShiftDown`` (:pr:`827`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:50 msgid "Added example for :class:`~.MoveAlongPath` to the docs (:pr:`873`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:51 msgid "Added ambient rotate for other angles - theta, phi, gamma (:pr:`660`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:52 msgid "Use custom bindings for Pango (:pr:`878`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:53 msgid "Added :class:`~.Graph`, a basic implementation for (graph theory) graphs (:pr:`861`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:54 msgid "Allow for chaining methods when using the new ``.animate`` syntax in :meth:`~.Scene.play` (:pr:`889`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:57 msgid "Bugfixes" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:59 msgid "Fix doctests in .rst files (:pr:`797`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:60 msgid "Fix failing doctest after adding ``manim plugin`` subcommand (:pr:`831`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:61 msgid "Normalize the direction vector in :meth:`~.mobject_update_utils.always_shift` (:pr:`839`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:62 msgid "Add ``disable_ligatures`` to :class:`~.Text` (via :pr:`804`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:63 msgid "Make scene caching aware of order of Mobjects (:pr:`845`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:64 msgid "Fix :class:`~.CairoText` to work with new config structure (:pr:`858`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:65 msgid "Added missing argument to classes inheriting from :class:`~.Matrix` (:pr:`859`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:66 msgid "Fixed: ``z_index`` of mobjects contained in others as submobjects is now properly respected (:pr:`872`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:67 msgid "Let :meth:`~.ParametricSurface.set_fill_by_checkboard` return the modified surface to allow method chaining (:pr:`883`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:68 msgid "Mobjects added during an updater are added to ``Scene.moving_mobjects`` (:pr:`838`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:69 msgid "Pass background color to JS renderer (:pr:`876`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:70 msgid "Small fixes to docstrings. Tiny cleanups. Remove ``digest_mobject_attrs``. (:pr:`834`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:71 msgid "Added closed shape detection in :class:`~.DashedVMobject` in order to achieve an even dash pattern (:pr:`884`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:72 msgid "Fix Spelling in docstrings and variables across the library (:pr:`890`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:75 msgid "Other changes" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:77 msgid "Change library name to manim (:pr:`811`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:78 msgid "Docker: use local files when building an image (:pr:`803`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:79 msgid "Let ffmpeg render partial movie files directly instead of temp files (:pr:`817`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:80 msgid "``manimce`` to ``manim`` & capitalizing Manim in readme (:pr:`794`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:81 msgid "Added flowchart for different docstring categories (:pr:`828`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:82 msgid "Improve example in module docstring of :mod:`~.animation.creation` + explicitly document buff parameter in :meth:`~.Mobject.arrange` (:pr:`825`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:83 msgid "Disable CI pipeline for Python 3.6 (:pr:`823`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:84 msgid "Update URLs in docs (:pr:`832`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:85 msgid "Move upcoming changelog to GitHub-wiki (:pr:`822`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:86 msgid "Change badges in readme (:pr:`854`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:87 msgid "Exclude generated gRPC files from source control (:pr:`868`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:88 msgid "Added linguist-generated attribute to ``.gitattributes`` (:pr:`877`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:89 msgid "Cleanup: removed inheritance from ``object`` for some classes, refactor some imports (:pr:`795`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:90 msgid "Change several ``str.format()`` to ``f``-strings (:pr:`867`)" msgstr "" #: ../../source/changelog/0.2.0-changelog.rst:91 msgid "Update javascript renderer (:pr:`830`)" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.3.0-changelog.pot000066400000000000000000000155331515024150700262730ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.3.0-changelog.rst:3 msgid "v0.3.0" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:5 msgid "February 1, 2021" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:7 msgid "The changes since Manim Community release v0.2.0 are listed below." msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:11 msgid "New Features" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:13 msgid ":pr:`945`: :meth:`~.Graph.change_layout` method for :class:`~.Graph` mobject" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:14 msgid ":pr:`943`: IPython %%manim magic" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:15 msgid ":pr:`970`: Added ``--version`` command line flag" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:16 msgid ":pr:`948`: Allow passing a code string to :class:`~.Code`" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:17 msgid ":pr:`917`: Allow overriding new-style method animations" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:18 msgid ":pr:`756`: Allow setting frame_height and frame_width via config file" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:19 msgid ":pr:`939`: Added custom font files support" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:20 msgid ":pr:`892`: Added ManimCommunity colors" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:21 msgid ":pr:`922`: Tree layout for Graph mobject" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:22 msgid ":pr:`935`: Added code of conduct" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:23 msgid ":pr:`916`: Multi-column layout for partite graphs" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:24 msgid ":pr:`742`: Units: Pixels, Munits, Percent in :mod:`~.utils.unit`" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:25 msgid ":pr:`893`: Convenience method :meth:`~.Graph.from_networkx` for creating a graph from a networkx graph" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:28 msgid "Bugfixes and Enhancements" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:30 msgid ":pr:`988`: Fix Windows CI pipeline by adding missing LaTeX package" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:31 msgid ":pr:`961`: Added typings and docs for vectorized mobjects and bezier related functions" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:32 msgid ":pr:`977`: JupyterLab docker image and documentation for manim and IPython" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:33 msgid ":pr:`985`: Fix variable name for webgl renderer" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:34 msgid ":pr:`954`: Fix edges lagging behind vertices in animations of graphs" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:35 msgid ":pr:`980`: Allow usage of custom Pygments styles in Code" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:36 msgid ":pr:`952`: Allow passing tween information to the WebGL frontend" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:37 msgid ":pr:`978`: Fix ``possible_paths`` not printing in ``code_mobject``" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:38 msgid ":pr:`976`: Update ``ManimPango``" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:39 msgid ":pr:`967`: Automatically import plugins" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:40 msgid ":pr:`971`: Make ManimCommunity look consistent" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:41 msgid ":pr:`957`: Raise ``NotImplementedError`` when trying to chain overridden method animations" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:42 msgid ":pr:`947`: Several fixes and improvements for :class:`~.PointCloundDot`" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:43 msgid ":pr:`923`: Documentation: move installation instructions for developers to page for developers" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:44 msgid ":pr:`964`: Added unit test for :class:`~.NumberLine`'s unit vector" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:45 msgid ":pr:`960`: Magnitude of :class:`~.NumberLine`'s unit vector should be ``unit_size``, not 1" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:46 msgid ":pr:`958`: Fix code formatting in ``utils/debug.py``" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:47 msgid ":pr:`953`: Update license year" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:48 msgid ":pr:`944`: Interpolate stroke opacity in :class:`~.FadeIn` and update ``stroke_opacity`` and ``fill_opacity`` in :meth:`~.VMobject.set_stroke` and :meth:`~.VMobject.set_fill`" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:49 msgid ":pr:`865`: Rename ``get_submobject_index_labels`` to ``index_labels``" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:50 msgid ":pr:`941`: Added keyword arguments ``x_min``, ``x_max``, ``y_min``, ``y_max`` to :class:`~.ThreeDAxes`" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:51 msgid ":pr:`886`: Let the render progress bar show details about the rendered animation again" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:52 msgid ":pr:`936`: Fix :class:`~.BulletedList` TeX environment problem and add a typing to ``get_module``" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:53 msgid ":pr:`938`: Remove dependency on progressbar" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:54 msgid ":pr:`937`: Change 'brew cask install' to 'brew install --cask' for CI pipeline" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:55 msgid ":pr:`933`: Make matrix work with lists again" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:56 msgid ":pr:`932`: Correctly parse ``log_dir`` option" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:57 msgid ":pr:`920`: Raise error if markup in :class:`~.MarkupText` is invalid" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:58 msgid ":pr:`929`: Raise an error if a :class:`~.Matrix` object is created with < 2-dimensional input" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:59 msgid ":pr:`907`: Make Scene.add_sound work again (when running with ``--disable_caching``)" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:60 msgid ":pr:`906`: Allow new-style method animation to be used in animation groups" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:61 msgid ":pr:`908`: Removed deprecated command line arguments from documentation" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:62 msgid ":pr:`903`: Tiny grammar improvements" msgstr "" #: ../../source/changelog/0.3.0-changelog.rst:63 msgid ":pr:`904`: Added blank line between imports and class example" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.4.0-changelog.pot000066400000000000000000000150111515024150700262630ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.4.0-changelog.rst:3 msgid "v0.4.0" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:5 msgid "March 3, 2021" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:7 msgid "The changes since Manim Community release v0.3.0 are listed below." msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:10 msgid "Breaking Changes" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:12 msgid ":pr:`915`: Manim's SVG engine has been reworked and is able to handle a wider variations of SVG files. In particular: fill and stroke properties are now retained from the original files. Breaking change: ``VMobjectFromSVGPathstring`` is deprecated and has been renamed to ``SVGPathMobject``." msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:16 msgid "New Features" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:18 msgid ":pr:`1026`: Add 3D Mobjects: :class:`~.Cone`, :class:`~.Cylinder`, :class:`~.Line3D`, :class:`~.Arrow3D` and :class:`~.Torus`" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:19 msgid ":pr:`1047`: Add documentation and examples for :class:`~.Matrix`" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:20 msgid ":pr:`1044`: ``register_font`` is available for macOS" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:21 msgid ":pr:`995`: Add generic :func:`~.Mobject.set` method and compatibility layer between properties and ``get_*``/``set_*`` methods" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:24 msgid "Bugfixes and Enhancements" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:26 msgid ":pr:`981`: Fixed hot reload functionality for the WebGL renderer on Windows" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:27 msgid ":pr:`1053`: Repair links to source code in stable version of documentation" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:28 msgid ":pr:`1067`: Add ManimPango to ReadTheDocs requirements" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:29 msgid ":pr:`1058`: Replace ```` syntax by Pango's ```` for coloring parts of :class:`~.MarkupText` and allow using colors for underline, overline and strikethrough in MarkupText" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:30 msgid ":pr:`1063`: Fix documentation related to ``.animate``" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:31 msgid ":pr:`1065`: Remove duplicate word 'vector'" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:32 msgid ":pr:`1060`: Update Linux installation instructions to mention the installation of Pango" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:33 msgid ":pr:`1050`: Ensure that the user-supplied stroke color and width gets applied to :class:`~.Cross`" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:34 msgid ":pr:`1059`: More descriptive error when accessing an unhandled mobject attribute" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:35 msgid ":pr:`1048`: Use absolute path in ``make_and_open_docs.py``" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:36 msgid ":pr:`1000`: Remove ``MovingCameraScene.setup`` and ``MovingCameraScene.camera_frame``" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:37 msgid ":pr:`1051`: Corrections for setting stroke related attributes on :class:`~.VMobject`" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:38 msgid ":pr:`1043`: Make :class:`~.CubicBezier` explicitly accept four points" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:39 msgid ":pr:`1046`: Use any version of ``importlib-metadata``" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:40 msgid ":pr:`1030`: Parse ``.log`` file and try to print LaTeX errors if compilation fails" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:41 msgid ":pr:`1015`: Documentation: Add more explicit instructions related to ``tlmgr``" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:42 msgid ":pr:`1028`: Documentation: Update installation guide on mac with Apple Silicon" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:43 msgid ":pr:`1032`: Remove ``Square.side_length`` property" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:44 msgid ":pr:`1031`: Fix link to wikipedia vector graphics page" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:45 msgid ":pr:`1021`: Documentation: Added example to :class:`~.CubicBezier`" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:46 msgid ":pr:`1017`: Added ``progress_bar`` to ``digest_args`` to fix the ``--progress_bar`` CLI flag" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:47 msgid ":pr:`1018`: Remove redundancy in :class:`~.FunctionGraph` arguments" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:48 msgid ":pr:`1024`: Migrate ``width`` / ``height`` / ``depth`` to properties" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:49 msgid ":pr:`1022`: Fix ``-p`` flag when passing ``-s``" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:50 msgid ":pr:`1008`: CI pipeline: fix release asset upload" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:51 msgid ":pr:`983`: Make sure last frame for animations with updaters is correct" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:52 msgid ":pr:`984`: Add manim version to CLI output, append version name for generated ``.gif`` and ``.png`` files, add version to metadata of rendered videos, change dark blue terminal text to default green" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:53 msgid ":pr:`993`: Fix setting Mobject color to a gradient by passing a list of colors in :meth:`~.VMobject.set_color`" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:54 msgid ":pr:`1003`: Fix animation :class:`~.GrowArrow`" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:55 msgid ":pr:`1010`: Disable STDIN interaction for ffmpeg concat." msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:56 msgid ":pr:`969`: Fix the ``--tex_template`` CLI flag" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:57 msgid ":pr:`989`: Fix the ``manim cfg export`` subcommand" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:58 msgid ":pr:`1005`: Fix the feature where ``-`` is used as the filename" msgstr "" #: ../../source/changelog/0.4.0-changelog.rst:59 msgid ":pr:`998`: Allow using hexadecimal color codes with 3 characters" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.5.0-changelog.pot000066400000000000000000000544621515024150700263010ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.5.0-changelog.rst:3 msgid "v0.5.0" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:5 msgid "April 02, 2021" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:10 msgid "A total of 35 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:14 msgid "Abel Aebker +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:15 #: ../../source/changelog/0.5.0-changelog.rst:47 msgid "Abhijith Muthyala" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:16 msgid "AntonBallmaier +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:17 msgid "Aron" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:18 #: ../../source/changelog/0.5.0-changelog.rst:48 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:19 msgid "Bogdan Stฤƒncescu +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:20 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:21 #: ../../source/changelog/0.5.0-changelog.rst:50 msgid "Devin Neal" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:22 msgid "GameDungeon +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:23 #: ../../source/changelog/0.5.0-changelog.rst:51 msgid "Hugues Devimeux" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:24 #: ../../source/changelog/0.5.0-changelog.rst:52 msgid "Jason Villanueva" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:25 #: ../../source/changelog/0.5.0-changelog.rst:53 msgid "Kapil Sachdeva" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:26 #: ../../source/changelog/0.5.0-changelog.rst:54 msgid "KingWampy" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:27 msgid "Lionel Ray +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:28 #: ../../source/changelog/0.5.0-changelog.rst:57 msgid "Mark Miller" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:29 msgid "Mohammad Al-Fetyani +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:30 #: ../../source/changelog/0.5.0-changelog.rst:59 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:31 msgid "Niklas Dewally +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:32 msgid "Oliver +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:33 msgid "Roopesh +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:34 msgid "Seb Pearce +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:35 msgid "aebkea +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:36 msgid "friedkeenan" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:37 msgid "hydrobeam +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:38 msgid "kolibril13" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:39 msgid "sparshg" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:40 msgid "tfglynn +" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:43 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:46 msgid "Abel Aebker" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:49 msgid "Bogdan Stฤƒncescu" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:55 msgid "Leo Torres" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:56 msgid "Lionel Ray" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:58 msgid "Mohammad Al-Fetyani" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:60 msgid "Oliver" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:61 msgid "Ricky Chon" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:62 msgid "vector67" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:65 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:67 msgid "A total of 64 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:70 msgid "Highlights" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:73 msgid ":pr:`1075`: Add OpenGL Renderer" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:73 msgid "Adds an OpenGLRenderer, OpenGLCamera, OpenGL-enabled Mobjects, and a ``--use_opengl_renderer`` flag. When this flag is passed, you can pass the ``-p`` flag to preview animations, the ``-w`` flag to generate video, and the ``-q`` flag to specify render quality. If you don't pass either the ``-p`` or the ``-w`` flag, nothing will happen. Scenes rendered with the OpenGL renderer must *only* use OpenGL-enabled Mobjects." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:76 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:80 msgid ":pr:`1124`: Deprecated :class:`ShowCreation` in favor of :class:`Create`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:79 msgid "Deprecated :class:`ShowCreation` in favor of :class:`Create` across the library with the exception of the `show_creation` boolean variable `vector_space_scene.py`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:80 msgid "Added a deprecation warning in the original :class:`ShowCreation` class." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:83 msgid ":pr:`1110`: Deprecated SmallDot + OpenGLSmallDot" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:83 msgid "`SmallDot` isn't necessary and a deprecation warning will be raised. This will be removed in a future release." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:86 msgid "New features" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:91 msgid ":pr:`1037`: Added new fade and transform animations (:class:`~.TransformMatchingShapes`, :class:`~.TransformMatchingTex`, :class:`~.FadeTransform`) from 3b1b/manim" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:89 msgid "Added new Fade animation: :class:`~FadeOutToPoint` Added :class:`~FadeTransform` and :class:`~FadeTransformPieces` for transforming mobjects and submobjects with a fade Added :class:`~TransformMatchingShapes` and :class:`~TransformMatchingTex` for transforming mobjects and tex that have matching parts" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:93 msgid ":pr:`1097`: Added 3D Mobject :class:`~.Dot3D`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:96 msgid ":pr:`1074`: Added jupyter media_width option to the config" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:100 msgid ":pr:`1107`: Added :class:`~.Unwrite` animation class to complement :class:`~.Write`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:100 msgid "Added :class:`Unwrite` which inherits from :class:`~.Write`. It automatically reverses the animation of :class:`~.Write` by passing the reversed rate function, but it also takes an additional boolean parameter `reverse` which, if `False`, renders the animation from left to right (assuming text oriented in the usual way), but if `True`, it renders right to left." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:103 msgid ":pr:`1085`: Added :class:`~.Angle` and :class:`~.RightAngle` for intersecting lines" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:103 msgid ":class:`~.Angle` and :class:`~.RightAngle` both take two lines as input. If they intersect, or share a common vertex, an angle is drawn between them. Users can customize the look of the angle and also use a dotted right angle." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:106 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:108 msgid ":pr:`1144`: Improved quality of GIFs" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:114 msgid ":pr:`1157`: Refresh triangulation on call to :meth:`~.OpenGLVMobject.apply_points_function`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:112 msgid "Rotate called apply_points_function, which was previous not subclassed by OpenGLMobject - now it is. Then, the vertex normals can be updated too." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:114 msgid "Additionally, the old_points matrix would change after rotating, making the old points / new points test irrelevant. This is addressed with a .copy call." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:116 msgid ":pr:`1151`: Added parametric function support to :class:`OpenGLSurface`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:119 msgid ":pr:`1139`: In-Code `config[\"preview\"]` Support" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:123 msgid ":pr:`1123`: Added caching, skipping, and user-specified background colors to the OpenGL renderer" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:123 msgid "OpenGL play logic has been improved to support caching and skipping with `-n` argument ( it is now similar to Cairo play logic). A random bug was fixed in OpenGLSurface and OpenGL background color can now be changed via `background_color` argument." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:128 msgid ":pr:`1118`: Allow passing animation arguments with .animate syntax" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:126 msgid "Users will now be able to do things like `obj.animate(run_time=2).method(arg)` if they want to specify animation arguments for an individual `.animate` call, and can still not specify any arguments like `obj.animate.method(arg)`." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:128 msgid "Passing animation arguments is only allowed directly after `.animate` is accessed, if passed elsewhere then a `ValueError` is raised." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:132 msgid ":pr:`718`: Rotating the numbers in y axis" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:131 msgid "In Axes, the y axis will be rotated 90deg but the numbers are also rotated and shouldn't be. Fixes this issue." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:135 msgid ":pr:`1070`: Raise FileNotFoundError when unable to locate the .cfg file specified via ``--config_file``" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:135 msgid "Raising the error will stop script execution and let the user know that there are problems with the `--config_file` location instead of reverting back to the default configuration." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:138 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:140 msgid ":pr:`1224`: Fixed :class:`~.ShowIncreasingSubsets`, :class:`~.ShowSubmobjectsOneByOne`, and :class:`~.AddTextLetterByLetter`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:143 msgid ":pr:`1201`: Prevent crash on :meth:`~.Scene.embed` for empty scenes" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:146 msgid ":pr:`1192`: Fixed issue when an animation is cached, manim can't merge the partial movie files." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:150 msgid ":pr:`1193`: Fixed using :class:`~.Animation` without a child :class:`~.Mobject` in :class:`~.AnimationGroup`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:150 msgid "`AnimationGroup` may now take `Animation` objects which do not have a child `Mobject`, such as `Wait`." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:152 msgid ":pr:`1170`: Fixed minor SVG parsing bugs" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:155 msgid ":pr:`1159`: Added support for multiple transforms in the same SVG element" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:159 msgid ":pr:`1156`: Fixed :class:`~.DrawBorderThenFill` to support OpenGL and improved type hints for some functions" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:159 msgid "Fixed a bug in :class:`~.DrawBorderThenFill` that prevented :class:`~.Write` animations from working with :class:`~.OpenGLVMobjects` and slightly improved type hints for some animation functions to include :class:`~.OpenGLVMobject`." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:162 msgid ":pr:`1134`: Fixed the `-a` flag." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:162 msgid "The ``-a`` / ``--write-all`` flag was broken. When used, it would cause Manim to crash just after beginning to render the second scene." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:165 msgid ":pr:`1115`: Fixed bugs in :class:`~.OpenGLMobject` and added :class:`ApplyMethod` support" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:165 msgid "Fixed undefined variables and converted :class:`Mobject` to :class:`OpenGLMobject`. Also, fixed assert statement in :class:`ApplyMethod`." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:171 msgid ":pr:`1092`: Refactored coordinate_systems.py, fixed bugs, added :class:`~.NumberPlane` test" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:168 msgid "The default behavior of :meth:`~.Mobject.rotate` is to rotate about the center of :class:`~.Mobject`. :class:`~.NumberLine` is symmetric about the point at the number 0 only when ``|x_min|`` == ``|x_max|``. Ideally, the rotation should coincide with the point at number 0 on the line." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:171 msgid "Added a regression test and additionally fixed some bugs introduced in :pr:`718`." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:174 msgid ":pr:`1078`: Removed stray print statements from `__main__.py`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:174 msgid "Uses rich's print traceback instead and fixes an issue in printing the version twice when `manim --version` is called." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:177 msgid ":pr:`1086`: Fixed broken line spacing in :class:`~.Text`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:177 msgid "The `line_spacing` kwarg was missing when creating :class:`Text` Mobjects; this adds it." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:180 msgid ":pr:`1083`: Corrected the shape of :class:`~.Torus`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:180 msgid ":class:`Torus` draws a surface with an elliptical cross-section when `minor_radius` is different from 1. This PR ensures the cross-section is always a circle." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:183 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:185 msgid ":pr:`1217`: Copyedited the document on testing in our documentation" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:188 msgid ":pr:`1206`: Added Docstrings to :class:`~.Mobject`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:191 msgid ":pr:`1218`: Removed BezierSpline from the example gallery" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:194 msgid ":pr:`1219`: Updated Dockerfile (include dependencies for building documentation), moved documentation to main README" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:198 msgid ":pr:`1209`: Added :ref_methods: to the manim directive" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:198 msgid "This allows class methods to be linked in the documentation. Checkout the `example references `_ below the code to see how this is used!" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:200 msgid ":pr:`1204`: Added rotation example to example gallery" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:203 msgid ":pr:`1137`: Added GitHub Wiki pages on adding testing/documentation to Sphinx Docs" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:206 msgid ":pr:`1114`: Added examples for :class:`~.Ellipse`, :class:`~.Polygon`, :class:`~.RegularPolygon`, :class:`~.Triangle` and :class:`~.RoundedRectangle`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:209 msgid ":pr:`1195`: Removed SmallDot from example" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:212 msgid ":pr:`1130`: Added pre-commit to run black and flake8, updated contributing documentation accordingly" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:216 msgid ":pr:`1138`: Moved previous version changelogs to separate files; Added a Script to generate future changelogs" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:216 msgid "This script quickly generates a changelog for whoever is making the release." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:218 msgid ":pr:`1190`: Added note in contributing guide to read the latest version of the documentation" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:221 msgid ":pr:`1188`: Added sounds example to docs" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:224 msgid ":pr:`1165`: Added documentation for installing Manim on Colab" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:227 msgid ":pr:`1128`: Added examples for :class:`~.DashedLine`, :class:`~.TangentLine`, :class:`~.Elbow`, :class:`~.Arrow`, :class:`~.Vector`, :class:`~.DoubleArrow`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:230 msgid ":pr:`1177`: Replace links to the latest version of the documentation to the stable version" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:233 msgid ":pr:`1077`: Added details to :func:`~.Mobject.get_critical_point`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:236 msgid ":pr:`1154`: Fixed some typing hints. (ints to floats)" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:239 msgid ":pr:`1036`: Added :class:`~.SurroundingRectangle` to the example gallery" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:242 msgid ":pr:`1103`: Added documentation and examples for Square, Dot, Circle and Rectangle" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:245 msgid ":pr:`1101`: Added documentation to :class:`~.Mobject`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:249 msgid ":pr:`1088`: Added new svg files to documentation and imports" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:249 msgid "In particular, SVGPathMobject, VMobjectFromPathstring, and the style_utils functions to manim's namespace." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:252 msgid ":pr:`1076`: Improve documentation for GraphScene" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:252 msgid "Updated `coords_to_point` and `point_to_coords` under `manim/scene/graph_scene.py` as the dosctring of each function confusingly described the opposite of what it is supposed to do." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:255 msgid "Changes concerning the testing system" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:257 msgid ":pr:`1160`: Enable CI testing for OpenGL" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:261 msgid ":pr:`1100`: Rewrote test cases to use sys.executable in the command instead of \"python\"" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:261 msgid "Tests would fail due to `capture()` not spawning a subshell in the correct environment, so when python was called, the test would be unable to find necessary packages." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:263 msgid ":pr:`1079`: Removed the hardcoded value, `manim`, in `test_version.py`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:267 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:269 msgid ":pr:`1213`: Updated TinyTex dependencies" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:272 msgid ":pr:`1187`: Add CodeCov to Github Workflow" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:275 msgid ":pr:`1166`: CI: Use poetry's cache dir rather than pip" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:281 msgid ":pr:`1071`: Enable pytest-cov based code coverage" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:279 msgid "Include pytest-cov as a python module as part of developer dependencies" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:280 msgid "In updating poetry to include pytest-cov, manimpango moved from version 0.2.3 to 0.2.4, and libpango1.0-dev needed to be installed in Ubuntu." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:281 msgid "Add to the CI workflow (`ci.yml`) to create and upload test coverage." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:283 msgid ":pr:`1073`: Removed \"one line summary\" from PULL_REQUEST_TEMPLATE.md" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:287 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:289 msgid ":pr:`1167`: Merge :class:`~.OpenGLMobject` and :class:`~.Mobject`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:292 msgid ":pr:`1164`: Fixed single PEP8 style in `cairo_renderer.py`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:295 msgid ":pr:`1140`: Flake8 Compat & Code Cleanup" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:305 msgid ":pr:`1019`: Refactored :meth:`~.Scene.play`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:299 msgid "Removed the _**three**_ decorators of :meth:`~.Scene.play`, in particular: caching logic and file writer logic are now included within :meth:`~.Scene.play` (it wasn't possible before, because `scene.wait` and `scene.play` were two different things)." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:300 msgid "Added `is_static_wait` attributes to Wait. (<=> if wait is a frozen frame)." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:301 msgid "Renamed and moved `scene.add_static_frame` to `renderer.freeze_current_frame`." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:302 msgid "Now when calling play without animation, it raises `ValueError` instead of just a warning." msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:303 msgid "Fixed :pr:`874` by modifying `renderer.update_skipping_status`" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:304 msgid "`renderer` starts the animation with `scene.begin_animations` (`scene.compile_animation_data` used to do this)" msgstr "" #: ../../source/changelog/0.5.0-changelog.rst:305 msgid "The run time and the time progression generation is now done in `scene.play_internal` although it'd make more sense that renderer processes it later." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.6.0-changelog.pot000066400000000000000000000766461515024150700263120ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.6.0-changelog.rst:3 msgid "v0.6.0" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:5 msgid "May 02, 2021" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:10 msgid "A total of 40 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:14 #: ../../source/changelog/0.6.0-changelog.rst:47 msgid "Abel Aebker" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:15 #: ../../source/changelog/0.6.0-changelog.rst:48 msgid "Abhijith Muthyala" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:16 msgid "Adam Ryczkowski +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:17 msgid "Alex Lembcke +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:18 #: ../../source/changelog/0.6.0-changelog.rst:51 msgid "Anton Ballmaier" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:19 #: ../../source/changelog/0.6.0-changelog.rst:52 msgid "Aron" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:20 #: ../../source/changelog/0.6.0-changelog.rst:53 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:21 #: ../../source/changelog/0.6.0-changelog.rst:54 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:22 msgid "Deniz Hasler +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:23 #: ../../source/changelog/0.6.0-changelog.rst:56 msgid "Devin Neal" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:24 msgid "Elisha Hollander +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:25 msgid "Erik Tastepe +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:26 #: ../../source/changelog/0.6.0-changelog.rst:60 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:27 #: ../../source/changelog/0.6.0-changelog.rst:61 msgid "Jason Villanueva" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:28 #: ../../source/changelog/0.6.0-changelog.rst:63 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:29 #: ../../source/changelog/0.6.0-changelog.rst:64 msgid "Mark Miller" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:30 #: ../../source/changelog/0.6.0-changelog.rst:65 msgid "Mohammad Al-Fetyani" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:31 #: ../../source/changelog/0.6.0-changelog.rst:66 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:32 msgid "Newell Jensen +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:33 msgid "Nidhal Baccouri +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:34 msgid "Nikhil Garuda +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:35 msgid "Peilonrayz +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:36 #: ../../source/changelog/0.6.0-changelog.rst:71 msgid "Raghav Goel" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:37 msgid "Ricky Chon +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:38 #: ../../source/changelog/0.6.0-changelog.rst:73 msgid "friedkeenan" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:39 msgid "kamilczerwinski22 +" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:40 #: ../../source/changelog/0.6.0-changelog.rst:74 msgid "sparshg" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:43 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:46 msgid "Aathish Sivasubrahmanian" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:49 msgid "Adam Ryczkowski" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:50 msgid "Alex Lembcke" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:55 msgid "Deniz Hasler" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:57 msgid "Elisha Hollander" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:58 msgid "GameDungeon" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:59 msgid "Hugues Devimeux" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:62 msgid "KingWampy" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:67 msgid "Nidhal Baccouri" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:68 msgid "Nikhil Garuda" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:69 msgid "Oliver" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:70 msgid "Philipp Imhof" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:72 msgid "Ricky Chon" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:77 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:79 msgid "A total of 112 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:82 msgid "Breaking changes" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:85 msgid ":pr:`1347`: Restructure vector_field module and add documentation" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:85 msgid ":class`~.VectorField` is renamed to :class:`~.ArrowVectorField` and a new class :class:`~.VectorField` is added as a superclass for :class:`~.ArrowVectorField` and :class:`~.StreamLines`. :class:`~.AnimatedStreamLines` is removed. It's functionality is moved to :class:`~.StreamLines`. Added a lot of new options when working with vector fields. :class:`~.ShowPassingFlashWithThinningStrokeWidth` was moved to the indication module." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:91 msgid ":pr:`1161`: Upgrades to CoordinateSystem and graphing." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:88 msgid "Breaking changes were introduced to :class:`~.Axes`, :class:`~.ThreeDAxes`, :class:`~.NumberPlane` and :class:`~.NumberLine` All the above now use lists to construct their ranges as opposed to explicitly defining these values. `x_range` has replaced `x_min`, `x_max` and defining the step is much easier with `x_step` --> ``x_range`` : ``[x_min, x_max, x_step]``. There were also many upgrades to these classes which improve their functionality and appearance." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:91 msgid "``NumberLineOld`` was introduced to continue support for :class:`~.GraphScene`, although we are moving away from GraphScene and intend to deprecate it in a future release." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:107 msgid ":pr:`1013`: Refactored the Command Line Interface to use Click instead of Argparse" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:94 msgid "This change breaks the CLI API to organize the structure of Manim Community's commands, options, and arguments." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:96 msgid "To be more in line with POSIX compliant CLI conventions, options for commands are given *BEFORE* their arguments. In Argparse: ``manim basic.py -p -ql`` With Click: ``manim -p -ql basic.py``" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:100 msgid "Although this is primarily a refactor and most of the common options are still there, some options have been added/removed. Use the ``manim`` command's ``--help`` option, or simply run the command without providing options/arguments to view the help page with the full list of subcommands/options/arguments." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:102 msgid "Added a ``--fps``/``--frame_rate`` option which allows for custom fps that don't have to be integer (i.e. 29.97, 23.98, etc.). Users no longer have to specify the FPS from within a config file. Additionally, the ``--webgl_renderer_fps`` option has been removed. Use ``--fps`` or ``--frame_rate`` instead." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:103 msgid "Added a ``--renderer`` option which you can use to select your choice of renderer (e.g. ``--renderer=opengl``). There are currently *THREE* renderers to choose from!" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:104 msgid "Removed the ``--background_color`` option. Reassigned the ``--background_color`` option's shorthand ``-c`` to ``--config_file``." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:105 msgid "Removed the ``--leave_progress_bars`` option. Use ``--progress_bars=leave`` instead." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:106 msgid "Removed the deprecated render quality flags, in particular: ``-l``, ``-m``, ``-h``, ``-k``." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:107 msgid "Removed the ``--sound`` option. It lost support long ago with the removal of SoX." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:110 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:116 msgid ":pr:`1431`: Fix CLI bugs" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:113 msgid "Fixed conflict with ``-f`` which was previously assigned to both ``--show_in_file_browser`` and ``--format`` by removing ``-f`` from ``--format``. A warning is issued that ``-f`` will soon move to ``--format``." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:114 msgid "Added back in flags to render the files as gif/last frame. Deprecated them in favor of ``--format``." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:115 msgid "Fixed the broken ``--output_file``/``-o`` option." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:116 msgid "Fixed an issue where the ``-qh`` quality option was interpreted as ``-q`` ``-h``, prompting the help page." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:118 msgid ":pr:`1354`: Refactored a few functions in space_ops.py, deprecated :func:`~.angle_between`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:122 msgid ":pr:`1370`: Remove TexMobject and TextMobject" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:122 msgid "TexMobject and TextMobject have been deprecated for a while, they are now fully removed. Use Tex or MathTex instead." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:124 msgid ":pr:`1349`: Removed the deprecated ``SmallDot`` mobject" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:127 msgid ":pr:`1259`: Removed deprecated CairoText class" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:130 msgid "New features" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:132 msgid ":pr:`1386`: Implement utility methods for adding/removing vertices and edges of graphs; allow custom mobjects as vertices" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:136 msgid ":pr:`1385`: Added :meth:`~.Axes.get_line_graph` for plotting a line graph" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:136 msgid "Added :meth:`~.Axes.get_line_graph` that returns a line graph from lists of points along x, y and z (optional) axes." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:139 msgid ":pr:`1381`: Hot reloading for the OpenGL renderer" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:139 msgid "Rerun scene when the input file is modified" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:148 msgid ":pr:`1383`: Overhaul of the :mod:`~.animation.indication` module interfaces" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:142 msgid "Added class `Circumscribe` combining functionality of `CircleIndicate`, `AnimationOnSurroundingRectangle`, `ShowPassingFlashAround`, `ShowCreationThenDestructionAround`, `ShowCreationThenFadeAround`, which have all been deprecated." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:143 msgid "Changes to `Flash`: `flash_radius` parameter now defines inner radius of the animation. Added new parameter `time_width`." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:144 msgid "`ShowCreationThenDestruction` has been deprecated in favor of `ShowPassingFlash`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:145 msgid "Changes to `ApplyWave`: New implementation giving more flexibility with new parameters `wave_func`, `time_width` and`ripples`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:146 msgid "Renamed `WiggleOutThenIn` to `Wiggle` (`WiggleOutThenIn` has been deprecated)" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:147 msgid "Added documentation and examples to all the above" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:148 msgid "Other minor enhancements and bug-fixes" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:150 msgid ":pr:`1348`: Added :class:`~.Polyhedron`, and platonic solids :class:`~.Tetrahedron`, :class:`~.Octahedron`, :class:`~.Icosahedron` and :class:`~.Dodecahedron`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:154 msgid ":pr:`1285`: Add :meth:`~.Scene.interactive_embed` for OpenGL rendering" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:154 msgid ":meth:`~.Scene.interactive_embed` allows interaction with Scene via mouse and keyboard as well as dynamic commands via an iPython terminal." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:157 msgid ":pr:`1261`: Render image automatically if no animation is played in a scene" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:157 msgid "If no animations in scene and asked to preview/render a video, preview/render an image instead of raising a confusing error." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:160 msgid ":pr:`1200`: Add text and SVG mobjects to OpenGL" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:160 msgid "Added OpenGL-compatible text and SVG mobjects" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:163 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:166 msgid ":pr:`1398`: Fix and enhance `Mobject.arrange_in_grid`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:166 msgid "`arrange_in_grid` now actually arranges submobjects in a grid. Added new parameters `buff`, `cell_alignment`, `row_alignments`, `col_alignments`, `row_heights`, `col_widths`, `flow_order`." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:168 msgid ":pr:`1407`: Fix bug and rename :meth:`vector_coordinate_label` to :meth:`~.Vector.coordinate_label` and move it to :class:`geometry.py`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:171 msgid ":pr:`1380`: Allow image objects as background images" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:175 msgid ":pr:`1391`: Add `path_arc` support to `.animate` syntax" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:175 msgid "The parameter `path_arc` of :class:`~.Transform` now works with the `.animate` syntax" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:178 msgid ":pr:`1364`: Added :meth:`~.Mobject.match_points`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:178 msgid "Added :func:`~.Mobject.match_points`, which transforms the points, positions and submobjects of a Mobject to match that of the other while keeping style unchanged." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:180 msgid ":pr:`1363`: Change of TeX compiler and output file format" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:184 msgid ":pr:`1359`: Make FILE a required argument" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:184 msgid "Make `FILE` a required argument, `manim/cli/render/commands.py`:L30" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:186 msgid ":pr:`1304`: Improve Tex string splitting at double braces: only split for double brace groups" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:190 msgid ":pr:`1340`: Add OpenGL support to the new transform animations" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:190 msgid "Made `FadeTransform`, `FadeTransformPieces`, `TransformMatchingShapes` and `TransformMatchingTex` compatible with OpenGL rendering." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:193 msgid ":pr:`1343`: Make TexTemplate() simple, but keep Tex()'s default template" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:193 msgid "TexTemplate() now returns a simple tex template." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:195 msgid ":pr:`1321`: Add OpenGL support to :class:`~.AnimationGroup`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:200 msgid ":pr:`1302`: Raise appropriate errors in :meth:`~.VMobject.point_from_proportion`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:199 msgid "Raise an error if the ``alpha`` argument is not between 0 and 1." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:200 msgid "Raise an error if the :class:`~.VMobject` has no points." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:202 msgid ":pr:`1315`: Fix performance issues with :meth:`~.VMobject.get_arc_length`, stemming from :pr:`1274`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:205 msgid ":pr:`1320`: Add `jpeg` extension to the default image extensions" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:209 msgid ":pr:`1234`: Added new method :meth:`~.Mobject.get_midpoint`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:209 msgid "Implemented :meth:`~.Mobject.get_midpoint` to return the point that is the middle of the stroke line of an mobject." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:211 msgid ":pr:`1237`: Notify user if they are using an outdated version of Manim" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:214 msgid ":pr:`1308`: Improved :class:`~.ManimBanner` animations" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:217 msgid ":pr:`1275`: Add SVG element support to :class:`~.SVGMobject`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:220 msgid ":pr:`1238`: Add parameter ``about_point`` for :meth:`~.Mobject.rotate`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:223 msgid ":pr:`1260`: Change Brace from Tex to SVG (#1258)" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:226 msgid ":pr:`1122`: Support for specifying the interpolation algorithms for individual ImageMobjects" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:229 msgid ":pr:`1283`: Set default value of keyword ``random_seed`` in :class:`~.Scene` to ``None`` (was 0 and fixed before)" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:236 msgid ":pr:`1220`: Added sanity checks to :meth:`~.Mobject.add_to_back` for Mobjects" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:233 msgid "Add Mobject `add_to_back` sanity checks: - Raises ValueError when Mobject tries to add itself - Raises TypeError when a non-Mobject is added - Filters out incoming duplicate submobjects if at least one instance of that submobject exists in the list" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:239 msgid ":pr:`1249`: Set corners of :class:`~.Rectangle` in counterclockwise direction" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:239 msgid "This improves the look of transformations between rectangles and other simple mobjects." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:241 msgid ":pr:`1248`: Add Copy function to TexTemplate" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:245 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:247 msgid ":pr:`1368`: Added a check to ensure checking for the latest version was successful" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:251 msgid ":pr:`1413`: Prevent duplication of the same mobject when adding to submobjects via :meth:`~.Mobject.add_to_back`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:251 msgid "Fixes #1412" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:253 msgid ":pr:`1395`: SVG transforms now handle exponent notation (6.02e23)" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:256 msgid ":pr:`1355`: Rewrite `put_start_and_end_on` to work in 3D" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:259 msgid ":pr:`1346`: Fixed errors introduced by stray print in :class:`~.MathTex`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:262 msgid ":pr:`1305`: Automatically remove long tick marks not within the range of the :class:`~NumberLine`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:265 msgid ":pr:`1296`: Fix random pipeline TeX failures" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:270 msgid ":pr:`1274`: Fix :meth:`~.VMobject.point_from_proportion` to account for the length of curves." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:269 msgid "Add :meth:`~.VMobject.get_nth_curve_function_with_length` and associated functions." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:270 msgid "Change :meth:`~.VMobject.point_from_proportion` to use these functions to account for curve length." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:273 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:277 msgid ":pr:`1430`: Un-deprecated GraphScene (will be deprecated later), fixed an old-style call to NumberPlane" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:276 msgid "More work is required in order to fully replace `GraphScene` via `Axes`, thus `GraphScene` is not deprecated yet." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:277 msgid "Fixed one example in which the old `NumberPlane` syntax was used." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:279 msgid ":pr:`1425`: Added a \"How to Cite Manim\" section to the Readme" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:283 msgid ":pr:`1387`: Added Guide to Contribute Examples from GitHub Wiki to Documentation" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:283 msgid "Added a Guide" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:285 msgid ":pr:`1424`: Fixed all current docbuild warnings" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:288 msgid ":pr:`1389`: Adding Admonitions Tutorial to docs" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:291 msgid ":pr:`1341`: Reduce complexity of ThreeDSurfacePlot example" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:294 msgid ":pr:`1362`: Quick reference to modules" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:298 msgid ":pr:`1376`: Add flake8 and isort in docs" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:298 msgid "added 'flake8' and 'isort' usages to docs" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:301 msgid ":pr:`1360`: Grammatical error corrections in documentation" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:301 msgid "changed a few sentences in docs/source" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:303 msgid ":pr:`1351`: Some more typehints" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:306 msgid ":pr:`1358`: Fixed link to installation instructions for developers" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:309 msgid ":pr:`1338`: Added documentation guidelines for type hints" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:312 msgid ":pr:`1342`: Multiple ValueTracker example for docs" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:315 msgid ":pr:`1210`: Added tutorial chapter on coordinates of an mobject" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:318 msgid ":pr:`1335`: Added import statements to examples in documentation" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:321 msgid ":pr:`1245`: Added filled angle Example" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:324 msgid ":pr:`1328`: Docs: Update Brace example" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:327 msgid ":pr:`1326`: Improve documentation of :class:`~.ManimMagic` (in particular: fix documented order of CLI flags)" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:330 msgid ":pr:`1323`: Blacken Docs Strings" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:333 msgid ":pr:`1300`: Added typehints for :class:`~.ValueTracker`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:336 msgid ":pr:`1301`: Added further docstrings and typehints to :class:`~.Mobject`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:339 msgid ":pr:`1298`: Add double backquotes for rst code samples (value_tracker.py)" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:343 msgid ":pr:`1297`: Change docs to use viewcode extension instead of linkcode" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:343 msgid "Switched ``sphinx.ext.linkcode`` to ``sphinx.ext.viewcode`` and removed ``linkcode_resolve`` in ``conf.py``." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:345 msgid ":pr:`1246`: Added docstrings for :class:`~.ValueTracker`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:348 msgid ":pr:`1251`: Switch documentation from guzzle-sphinx-theme to furo" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:351 msgid ":pr:`1232`: Further docstrings and examples for :class:`~.Mobject`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:354 msgid ":pr:`1291`: Grammar improvements in README.md" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:357 msgid ":pr:`1269`: Add documentation about :meth:`~.set_color_by_tex`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:360 msgid ":pr:`1284`: Updated readme by providing the correct link to the example_scenes" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:363 msgid ":pr:`1029`: Added example jupyter notebook into the examples folders" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:367 msgid ":pr:`1279`: Added sphinx requirements to pyproject.toml" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:367 msgid "New contributors who wanted to build the sphinx documentation had an extra step that could be removed by making use of ``poetry install``. This removes the developer's need for ``pip install -r requirements.txt``." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:369 msgid ":pr:`1268`: Added documentation explaining the differences between manim versions" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:372 msgid ":pr:`1247`: Added warning for the usage of `animate`" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:375 msgid ":pr:`1242`: Added an example for the manim colormap" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:378 msgid ":pr:`1239`: Add TinyTex installation instructions" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:381 msgid ":pr:`1231`: Improve changelog generation script" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:385 msgid "Changes concerning the testing system" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:387 msgid ":pr:`1299`: Red pixels (different value) now appear over green pixels (same value) in GraphicalUnitTest" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:391 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:394 msgid ":pr:`1436`: Cache poetry venv with `pyproject.toml` hash in key" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:394 msgid "Cache poetry venv with `pyproject.toml` hash in key" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:397 msgid ":pr:`1435`: CI: Update poetry cache when new version is released" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:397 msgid "Fix `test_version` failure in CI when using cached poetry venv" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:399 msgid ":pr:`1427`: Add URL's to pyproject.toml" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:402 msgid ":pr:`1421`: Updated changelog generator's labels and removed pre-commit bot from changelog" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:405 msgid ":pr:`1339`: CI: Fix macOS installation error from creating file in read-only file system" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:409 msgid ":pr:`1257`: CI: Caching ffmpeg, tinytex dependencies and poetry venv" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:409 msgid "CI: Caching ffmpeg, tinytex dependencies and poetry venv" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:411 msgid ":pr:`1294`: Added mixed-line-ending to .pre-commit-config.yaml" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:414 msgid ":pr:`1278`: Fixed flake8 errors and removed linter/formatter workflows" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:417 msgid ":pr:`1270`: Added isort to pre_commit file" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:422 msgid ":pr:`1263`: CI: Turn off experimental installer for poetry to fix installation errors" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:421 msgid "Turn off experimental installer for poetry to prevent manim installation errors for packages." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:422 msgid "Downgrade py39 to py38 for flake checks as `pip` does not enjoy py39, along with `poetry`." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:425 msgid ":pr:`1255`: CI: Fix macOS pipeline failure" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:425 msgid "Update `ci.yml` to update and upgrade brew if necessary before installing dependencies, and remove the unsupported `dvisvgm.86_64-darwin` package." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:427 msgid ":pr:`1254`: Removed the comment warning that GitHub doesn't allow uploading video in the issue templates." msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:430 msgid ":pr:`1216`: Use actions/checkout for cloning repository; black-checks" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:433 msgid ":pr:`1235`: Fixed version of decorator at <5.0.0" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:437 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:439 msgid ":pr:`1411`: Change `Union[float, int]` to just `float` according to PEP 484" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:442 msgid ":pr:`1241`: Type Annotations: Fixing errors showing up in static type checking tool mypy" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:446 msgid ":pr:`1319`: Fix mean/meant typo" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:446 msgid "Fix typo in docs" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:448 msgid ":pr:`1313`: Singular typo fix on the Quickstart page in documentation" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:452 msgid ":pr:`1292`: Remove unnecessary imports from files" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:452 msgid "Imports reduced in a bunch of files" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:454 msgid ":pr:`1295`: Fix grammar and typos in the CODE OF CONDUCT" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:458 msgid ":pr:`1293`: Minor fixes - reduce lines" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:458 msgid "Remove unnecessary lines" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:460 msgid ":pr:`1281`: Remove all Carriage Return characters in our files" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:463 msgid ":pr:`1178`: Format Imports using Isort" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:466 msgid ":pr:`1233`: Fix deprecation warning for ``--use_opengl_renderer`` and ``--use_webgl_renderer``" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:469 msgid ":pr:`1282`: Fix typing hints in vectorized_mobject.py based on mypy" msgstr "" #: ../../source/changelog/0.6.0-changelog.rst:473 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.7.0-changelog.pot000066400000000000000000000575171515024150700263070ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.7.0-changelog.rst:3 msgid "v0.7.0" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:5 msgid "June 01, 2021" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:10 msgid "A total of 45 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:14 msgid "Andrรฉ +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:15 #: ../../source/changelog/0.7.0-changelog.rst:53 msgid "Anton Ballmaier" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:16 #: ../../source/changelog/0.7.0-changelog.rst:55 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:17 msgid "Clar Fon" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:18 #: ../../source/changelog/0.7.0-changelog.rst:56 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:19 #: ../../source/changelog/0.7.0-changelog.rst:57 msgid "Devin Neal" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:20 #: ../../source/changelog/0.7.0-changelog.rst:59 msgid "Hugues Devimeux" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:21 msgid "Iced-Tea3 +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:22 #: ../../source/changelog/0.7.0-changelog.rst:61 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:23 #: ../../source/changelog/0.7.0-changelog.rst:62 msgid "Jason Villanueva" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:24 msgid "Jerรณnimo Squartini +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:25 #: ../../source/changelog/0.7.0-changelog.rst:64 msgid "KingWampy" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:26 #: ../../source/changelog/0.7.0-changelog.rst:65 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:27 msgid "Max Stoumen +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:28 #: ../../source/changelog/0.7.0-changelog.rst:67 msgid "Mohammad Al-Fetyani" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:29 #: ../../source/changelog/0.7.0-changelog.rst:68 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:30 msgid "NeoPlato" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:31 msgid "Newell Jensen" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:32 #: ../../source/changelog/0.7.0-changelog.rst:69 msgid "Nikhil Garuda" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:33 msgid "Nikhil Sharma +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:34 msgid "PaulCMurdoch +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:35 #: ../../source/changelog/0.7.0-changelog.rst:71 msgid "Philipp Imhof" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:36 #: ../../source/changelog/0.7.0-changelog.rst:72 msgid "Raghav Goel" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:37 msgid "Robert West +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:38 msgid "Ryan McCauley +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:39 msgid "Skaft +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:40 msgid "SwiddisZwei +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:41 msgid "e4coder +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:42 #: ../../source/changelog/0.7.0-changelog.rst:78 msgid "friedkeenan" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:43 msgid "malte-v +" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:44 #: ../../source/changelog/0.7.0-changelog.rst:79 msgid "ralphieraccoon" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:45 #: ../../source/changelog/0.7.0-changelog.rst:80 msgid "sparshg" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:48 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:51 msgid "Aathish Sivasubrahmanian" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:52 msgid "Abhijith Muthyala" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:54 msgid "Aron" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:58 msgid "GameDungeon" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:60 msgid "Iced-Tea3" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:63 msgid "Jerรณnimo Squartini" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:66 msgid "Mark Miller" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:70 msgid "Oliver" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:73 msgid "Ricky Chon" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:74 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:75 msgid "Skaft" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:76 msgid "SwiddisZwei" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:77 msgid "e4coder" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:83 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:85 msgid "A total of 87 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:88 msgid "Breaking changes" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:92 msgid ":pr:`1521`: Improve :class:`~.Animation` docs" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:91 msgid "Improve documentation of the :class:`~.Animation` class." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:92 msgid "Unify the signature of ``get_all_mobjects``. Now it always returns a sequence of :class:`Mobjects <.Mobject>`. This breaks using ``FadeTransform.get_all_mobjects`` as ``Group``." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:95 msgid ":pr:`1470`: Drop support for Python 3.6" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:95 msgid "Manim won't work on Python 3.6 anymore." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:98 msgid "Highlights" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:100 msgid ":pr:`1447`: Added :class:`~.PolarPlane` for polar coordinates." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:109 msgid ":pr:`1490`: Added :class:`~.Polygram`, rework the polygon inheritance tree, and add :class:`~.Star`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:104 msgid "Add :class:`~.Polygram`, a generalized :class:`~.Polygon` that allows for disconnected sets of edges." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:105 msgid "Make :class:`~.Polygon` inherit from :class:`~.Polygram`." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:106 msgid "Add :func:`~.regular_vertices`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:107 msgid "Add :class:`~.RegularPolygram`." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:108 msgid "Make :class:`~.RegularPolygon` inherit from :class:`~.RegularPolygram`." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:109 msgid "Add :class:`~.Star`." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:112 msgid ":pr:`1462`: OpenGL: Added :class:`~.Shader`, :class:`~.Mesh`, and :class:`~.FullScreenQuad`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:112 msgid "Add Shader and Mesh objects" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:117 msgid ":pr:`1418`: Added project management commands" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:115 msgid "``manim init`` - quickly sets up default files for a manim project." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:116 msgid "``manim new project`` - lets the user set project settings. It also creates the project inside a new folder of name " msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:117 msgid "``manim new scene`` - used to quickly insert new scenes into files. If ``file name`` is not provided ``main.py`` is used as default." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:120 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:123 msgid ":pr:`1598`: Update examples to use :class:`~.Axes` and deprecate :class:`~.GraphScene`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:123 msgid ":class:`~.GraphScene` has been deprecated and its functionality has been shifted to :class:`~.Axes`. See the updated example gallery for sample usage." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:126 msgid ":pr:`1454`: Fading module enhancements" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:126 msgid "Moved functionality of all Fading classes to :class:`~.FadeIn` and :class:`~.FadeOut`. All other fading classes have been deprecated." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:128 msgid ":pr:`1375`: Deleted the deprecated ``ShowCreation`` in favor of :class:`~.Create`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:132 msgid "New features" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:134 msgid ":pr:`1566`: Added the ability to add gridlines to a :class:`~.Rectangle`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:137 msgid ":pr:`1548`: Added :class:`~.ArcBrace`, a subclass of :class:`~.Brace`." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:141 msgid ":pr:`1559`: Update VGroup to support item assignment (#1530)" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:141 msgid "Support indexed item-assignment for VGroup" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:143 msgid ":pr:`1518`: Allow fading multiple Mobjects in one Animation" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:146 msgid ":pr:`1422`: Added :func:`~.override_animation` decorator" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:154 msgid ":pr:`1504`: Color module enhancements" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:150 msgid "Replaced ``BLUE_E`` with what was previously ``DARK_BLUE`` and removed ``DARK_BLUE``" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:151 msgid "Added alias ``LIGHTER_GRAY`` for ``GRAY_A``" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:152 msgid "Added ``PURE_RED``, ``PURE_BLUE`` and renamed ``GREEN_SCREEN`` to ``PURE_GREEN``" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:153 msgid "All gray colors are now also available using British spelling (including ``GREY_BROWN``)" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:154 msgid "Replaced color example in the docs. It can now be used as a quick reference for all color names." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:156 msgid ":pr:`1272`: Implement metaclass approach in geometry module to make mobjects compatible with cairo and opengl rendering" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:160 msgid ":pr:`1404`: Added two deprecation decorators" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:160 msgid "Added two function decorators ``deprecated`` and ``deprecated_params`` as a consistent way of deprecating code." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:163 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:165 msgid ":pr:`1572`: OpenGL compatibility via metaclass: :class:`~.TracedPath`, :class:`~.ParametricFunction`, :class:`~.Brace`, :class:`~.VGroup`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:168 msgid ":pr:`1472`: Porting methods from :class:`~.GraphScene` to :class:`~.CoordinateSystem`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:171 msgid ":pr:`1589`: OpenGL compatibility via metaclass: :class:`~.ValueTracker`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:175 msgid ":pr:`1564`: Add extra notes for TeX compilation errors" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:175 msgid "Add hint to use custom ``TexTemplate`` on TeX compilation errors" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:177 msgid ":pr:`1584`: Added a check for ``0`` in :meth:`~.round_corners`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:181 msgid ":pr:`1586`: Add OpenGLMobject support to all ``isinstance`` occurrences" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:181 msgid "This PR increases the support for OpenGL in the remaining animation classes and in other places where appropriate." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:183 msgid ":pr:`1577`: Added new metaclass ConvertToOpenGL (replacing MetaVMobject), restore IntelliSense" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:187 msgid ":pr:`1562`: Improved VectorField's Nudge Accuracy Per Step" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:187 msgid "Implemented the Runge-Kutta algorithm in VectorField's nudge function. This increases the accuracy as an object moves along a vector field. This also increases efficiency as the nudge function requires less loops to achieve accuracy than the previous implementation." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:189 msgid ":pr:`1480`: Add logging info to tex errors" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:194 msgid ":pr:`1567`: Compatibility Fixes with ManimPango v0.3.0" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:193 msgid "ManimPango v0.3.0+ is required for Manim now." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:194 msgid "Show errors from Pango when Markup isn't correct" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:196 msgid ":pr:`1512`: OpenGL compatibility via metaclass: graph" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:199 msgid ":pr:`1511`: OpenGL compatibility via metaclass: svg_mobject, text_mobject, tex_mobject" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:202 msgid ":pr:`1502`: Added ``center`` parameter to :class:`~.Sphere` and ``point`` parameter to :class:`~.Dot3D`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:206 msgid ":pr:`1486`: Update of ``rate_functions``" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:206 msgid "Changed the picture for the non standard rate functions." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:208 msgid ":pr:`1495`: Ported value_tracker to OpenGL" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:212 msgid ":pr:`1382`: Expand documentation, testing, and functionality of ValueTrackers; remove ExponentialValueTracker" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:212 msgid "Added more documentation and inline operators to ValueTracker and ComplexValueTracker. Brought coverage for value_tracker.py to 100%. Removed ExponentialValueTracker." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:214 msgid ":pr:`1475`: Add SVG elliptical arc support" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:218 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:220 msgid ":pr:`1574`: Fixed error when processing SVG with omitted elliptical arc command" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:226 msgid ":pr:`1596`: Fix indexing for non-whitespace tex arg separator" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:224 msgid "Fixes #1568" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:226 msgid "Fix issue when setting the arg_separator of a Tex object as a non-whitespace character(s). The method `break_up_by_substrings(self)` was not accounting for the separator when setting the index." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:228 msgid ":pr:`1588`: Fixed multiple animations being saved in the same file" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:231 msgid ":pr:`1571`: Fix tests after introducing parallelization" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:234 msgid ":pr:`1545`: Fix outdated parameters for :class:`LinearTransformationScene` and add an example + typing." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:239 msgid ":pr:`1513`: Fixed rotation of gradients while rotating a VMobject" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:238 msgid "Fixed the direction of gradient which remained the same while rotating VMobjects" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:239 msgid "Added ``rotate_sheen_direction()`` method in VMobject" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:241 msgid ":pr:`1570`: Output errors to stderr" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:244 msgid ":pr:`1560`: Declare ``*.npz`` ``*.wav`` ``*.png`` as binary in ``.gitattributes``" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:248 msgid ":pr:`1211`: Refactored scene caching and fixed issue when a different hash was produced when copying a mobject in the scene" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:248 msgid "Refactored internal scene-caching mechanism and fixed bug when an inconsistent hash was produced when copying a mobject." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:250 msgid ":pr:`1527`: Improved handling of substring isolation within sqrt, and fixed a bug with transform_mismatch for the matching shape transforms" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:253 msgid ":pr:`1526`: Fix fading" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:256 msgid ":pr:`1523`: Fix multiple FadeIn / Out only working on VMobjects" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:260 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:262 msgid ":pr:`1599`: Added example for :class:`~.Annulus`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:265 msgid ":pr:`1415`: New example for gallery and some docs refinements" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:271 msgid ":pr:`1509`: Copyedited Documentation" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:269 msgid "Added a link to Manim Community GitHub page in ``for_dev.rst``. Fixed :meth:`~.Mobject.get_start` and added ``roll`` link in ``building_blocks-rst`` Added language to code blocks in ``configuration.rst``" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:274 msgid ":pr:`1384`: Added typings to space_ops.py" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:274 msgid "Added Typehints to most of the functions" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:276 msgid ":pr:`1500`: Example for :meth:`~.apply_complex_function`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:279 msgid ":pr:`1551`: Fixed the typo for Admonitions" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:282 msgid ":pr:`1550`: Restructuring of Contribution Section" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:285 msgid ":pr:`1541`: Fixing broken links and other minor doc things" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:288 msgid ":pr:`1516`: Update docs to use ``t_range`` instead of ``t_min`` and ``t_max`` in :class:`~.ParametricFunction`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:291 msgid ":pr:`1508`: Update troubleshooting docs" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:294 msgid ":pr:`1485`: Added :class:`~.Title` example for the docs" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:297 msgid ":pr:`1439`: Cleaning ``Sequence`` typehints" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:300 msgid ":pr:`1440`: Added Scoop installation docs (Windows)" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:303 msgid ":pr:`1452`: Refine typehints at :class:`~.Angle`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:306 msgid ":pr:`1458`: Refine docs of :class:`~.Text` ( add ``disable_ligatures=True`` for t2c)" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:309 msgid ":pr:`1449`: Added :class:`~.PointCloudDot` example" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:312 msgid ":pr:`1473`: Added easy example for :meth:`~.arrange_in_grid`" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:315 msgid ":pr:`1402`: Added typestring parser checker" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:318 msgid ":pr:`1451`: Reduce complexity of AngleExample" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:322 msgid ":pr:`1441`: Add inheritance diagrams to reference page" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:322 msgid "Added inheritance diagrams to the reference page as a quick navigation method." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:324 msgid ":pr:`1457`: Fixing broken doc links" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:327 msgid ":pr:`1445`: Remove $ from tutorial commands" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:331 msgid "Changes concerning the testing system" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:333 msgid ":pr:`1556`: Try pytest-xdist for parallelization in tests" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:337 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:340 msgid ":pr:`1505`: Add docs reference to PR template" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:340 msgid "Added documentation link to the Pull Request Template." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:342 msgid ":pr:`1499`: Updated Discord links in the docs to point towards a standardized redirect" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:345 msgid ":pr:`1461`: Build the docs - Logging" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:348 msgid ":pr:`1481`: pyproject.toml: poetry_core -> poetry-core" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:351 msgid ":pr:`1477`: Update RDT sphinx package to version 3.5.3" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:354 msgid ":pr:`1460`: Create CONTRIBUTING.md" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:358 msgid ":pr:`1453`: manim_directive: fix image links in docs - Windows" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:358 msgid "Use POSIX path on Windows to link images so documentation can build locally." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:361 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:363 msgid ":pr:`1465`: Added typings and description to some functions in :mod:`~.coordinate_systems`." msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:367 msgid ":pr:`1552`: Removed unwanted parameters in geometry" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:367 msgid "Removed ``anchors_span_full_range``, ``close_new_points``, ``anchors_span_full_range``, ``preserve_tip_size_when_scaling``, ``mark_paths_closed`` and ``close_new_points``" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:369 msgid ":pr:`1597`: Removed hilite_me and insert_line_numbers_in_html from global name space" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:372 msgid ":pr:`1535`: Update dependencies and fix tests" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:375 msgid ":pr:`1544`: Adding spell checker as a pre-commit hook" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:378 msgid ":pr:`1542`: Swapping a pango markup link in docs" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:381 msgid ":pr:`1531`: Don't use deprecated methods in deprecation.py" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:384 msgid ":pr:`1492`: Remove stray print statements introduced in #1404" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:387 msgid ":pr:`1471`: Fix Some Warnings from lgtm" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:391 msgid "Changes that needed to be reverted again" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:393 msgid ":pr:`1606`: Bring back ``DARK_BLUE``" msgstr "" #: ../../source/changelog/0.7.0-changelog.rst:397 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.8.0-changelog.pot000066400000000000000000000442411515024150700262760ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.8.0-changelog.rst:3 msgid "v0.8.0" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:5 msgid "July 02, 2021" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:10 msgid "A total of 37 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:14 #: ../../source/changelog/0.8.0-changelog.rst:51 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:15 msgid "Bill Shillito +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:16 msgid "Darigov Research +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:17 #: ../../source/changelog/0.8.0-changelog.rst:53 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:18 #: ../../source/changelog/0.8.0-changelog.rst:54 msgid "Devin Neal" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:19 msgid "Iced-Tea3" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:20 #: ../../source/changelog/0.8.0-changelog.rst:55 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:21 #: ../../source/changelog/0.8.0-changelog.rst:56 msgid "Jason Villanueva" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:22 #: ../../source/changelog/0.8.0-changelog.rst:57 msgid "KingWampy" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:23 #: ../../source/changelog/0.8.0-changelog.rst:58 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:24 msgid "MathInvariance +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:25 msgid "Max Stoumen" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:26 msgid "Mehmet Ali ร–zer +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:27 msgid "Michael Pilosov +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:28 #: ../../source/changelog/0.8.0-changelog.rst:61 msgid "Mohammad Al-Fetyani" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:29 #: ../../source/changelog/0.8.0-changelog.rst:62 msgid "Naveen M K" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:30 #: ../../source/changelog/0.8.0-changelog.rst:63 msgid "Nikhil Garuda" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:31 #: ../../source/changelog/0.8.0-changelog.rst:64 msgid "Oliver" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:32 msgid "PaulCMurdoch" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:33 #: ../../source/changelog/0.8.0-changelog.rst:65 msgid "Philipp Imhof" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:34 msgid "PipedQuintes +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:35 #: ../../source/changelog/0.8.0-changelog.rst:66 msgid "Raghav Goel" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:36 #: ../../source/changelog/0.8.0-changelog.rst:67 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:37 msgid "Ujjayanta +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:38 msgid "Vagrid +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:39 msgid "andrehisatsuga +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:40 #: ../../source/changelog/0.8.0-changelog.rst:70 msgid "friedkeenan" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:41 msgid "peaceheis +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:42 msgid "yit6 +" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:45 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:48 msgid "Abhijith Muthyala" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:49 msgid "Anton Ballmaier" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:50 msgid "Aron" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:52 msgid "Clar Fon" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:59 msgid "Mark Miller" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:60 msgid "MathInvariance" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:68 msgid "Ujjayanta" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:69 msgid "Vagrid" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:73 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:75 msgid "A total of 76 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:78 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:80 msgid ":pr:`1616`: Remove all functions and classes that were deprecated until ``v0.6.0``" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:84 msgid "New features" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:87 msgid ":pr:`1716`: Rewrite stroke and fill shaders" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:87 msgid "Rewrite vectorized mobject shaders to be compatible with transformation matrices." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:90 msgid ":pr:`1695`: Add option to justify text with :class:`~.MarkupText`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:90 msgid "A new parameter ``justify`` is added to :class:`~.MarkupText`. It can be used to justify a paragraph of text." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:94 msgid ":pr:`1660`: Added support for ``.webm`` and transparency of videos in Jupyter notebooks" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:93 msgid "Added support for generating ``webm`` videos via the command line flag ``--format=webm``" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:94 msgid "Added transparency support for Jupyter notebooks" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:96 msgid ":pr:`1553`: Add dearpygui integration" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:100 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:102 msgid ":pr:`1728`: Improved positioning and size of the OpenGL window; added some configuration options" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:105 msgid ":pr:`1733`: Let OpenGLMobject.copy return a deep copy by default" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:108 msgid ":pr:`1735`: Metaclass compatibility for `coordinate_system.py`, `Code` and `ParametricSurface`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:111 msgid ":pr:`1585`: OpenGL compatibility via metaclass for :class:`~.Matrix`, :class:`~.DecimalNumber`, :class:`~.Variable`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:114 msgid ":pr:`1713`: Exit the command line interface gracefully if no scene was chosen" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:119 msgid ":pr:`1652`: Refactored :class:`~.Mobject` and :class:`~.Scene` to no longer inherit from the abstract base class ``Container``" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:118 msgid "Moved tests in ``test_container.py`` for :class:`Container` that test :class:`~.Scene` and :class:`~.Mobject` to their own files." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:119 msgid "Corrected various instances of incorrectly passed keyword arguments, or unused keyword arguments." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:121 msgid ":pr:`1693`: Made the default arrowhead size for :class:`~.Arrow3D` smaller" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:127 msgid ":pr:`1678`: Allow some rate functions to assume values outside of [0, 1]; introduce clamping decorators" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:125 msgid "Fixed animations so that certain rate functions (``running_start``, ``wiggle``, ``ease_in_back``, ``ease_out_back``, ``ease_in_out_back``, ``ease_in_elastic``, ``ease_out_elastic``, and ``ease_out_elastic``) can go outside the range from 0 to 1." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:126 msgid "Fixed lag ratios so that they're spaced out evenly within the time interval and the rate functions are applied to each animation individually, rather than having the rate function determine when the animation starts." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:127 msgid "Fixed faulty code for ``ease_in_out_expo``, ``ease_in_bounce``, ``ease_out_bounce``, and ``ease_in_out_bounce``." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:129 msgid ":pr:`1649`: Made video file names in Jupyter notebook more readable" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:133 msgid ":pr:`1667`: Determine the default number of decimal places for :class:`~.NumberLine` labels automatically from the step size" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:133 msgid "As an example: If the step size is set to 0.5, labels will now show at least one decimal place." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:135 msgid ":pr:`1608`: Color file paths in terminal; remove curly braces surrounding the file path in \"Partial movie file written in...\" messages" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:138 msgid ":pr:`1632`: OpenGL compatibility via metaclass: :class:`~.Group`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:142 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:144 msgid ":pr:`1740`: Fix pillow to <8.3.0" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:147 msgid ":pr:`1729`: Fix bug when using :class:`~.Text` with the OpenGL renderer" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:150 msgid ":pr:`1675`: Fixed ignored fill and stroke colors for :class:`~.SVGMobject`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:153 msgid ":pr:`1664`: Fixed accidental displacement in :class:`~.Axes` caused by ``include_numbers`` / ``numbers_to_include``" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:156 msgid ":pr:`1670`: Fixed missing ``numpy`` import in OpenGL shader example" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:159 msgid ":pr:`1636`: Fixed bugs and added examples to methods and classes in :mod:`manim.mobject.matrix`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:162 msgid ":pr:`1614`: Fix tick issues and improve tick placement for :class:`~.NumberLine`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:165 msgid ":pr:`1593`: Un-flip output of ``get_frame()`` when using the OpenGL renderer" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:168 msgid ":pr:`1619`: Fix output of automatically detected LaTeX errors" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:176 msgid ":pr:`1595`: Fixed a few CLI and rendering bugs" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:172 msgid "Corrected issue where gifs were being logged with an incorrect extension" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:173 msgid "Fixed issue where videos were output when format was set to png" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:174 msgid "Added logging for png output" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:175 msgid "Added precedence handling when the ``write_to_movie`` flag would conflict with ``--format``" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:176 msgid "Fixed issue that caused png image output to be ignored when caching was enabled" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:178 msgid ":pr:`1635`: Added missing numpy import for :mod:`manim.mobject.probability`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:182 msgid ":pr:`1634`: Fixed OpenGL examples for MacOS" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:182 msgid "Renamed deprecated ``gl_FragColor`` to ``fragColor``." msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:185 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:187 msgid ":pr:`1732`: Remove reference to ``--plugins`` flag" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:190 msgid ":pr:`1734`: Fix inheritance graph background color" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:193 msgid ":pr:`1698`: Added an example for :class:`~.PMobject`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:196 msgid ":pr:`1690`: Added an example for :class:`~.CoordinateSystem`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:199 msgid ":pr:`1510`: Add a tutorial for using :class:`~.Text` and :class:`~.Tex`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:202 msgid ":pr:`1685`: Added an example and parameter description for :class:`~.AnnularSector`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:205 msgid ":pr:`1687`: Updated imports in ``geometry.py`` and added example to :class:`~.Arrow`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:208 msgid ":pr:`1681`: Added an example for :class:`~.NumberLine`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:211 msgid ":pr:`1697`: Added an example for :class:`~.PGroup`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:214 msgid ":pr:`1594`: Several improvements to the documentation design and layout" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:217 msgid ":pr:`1696`: Added an example for :class:`~.DashedVMobject`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:220 msgid ":pr:`1637`: Added an example for :class:`~.FunctionGraph`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:223 msgid ":pr:`1626`: Added an example for :class:`~.Prism`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:226 msgid ":pr:`1712`: Added a second example for :class:`~.DoubleArrow`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:229 msgid ":pr:`1710`: Update copyright year in documentation to 2020-2021" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:232 msgid ":pr:`1708`: Fixed link to interactive example notebook" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:235 msgid ":pr:`1657`: Added an example for :class:`~.ParametricSurface`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:238 msgid ":pr:`1642`: Added examples and docstrings for :class:`~.BarChart`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:241 msgid ":pr:`1700`: Added an example for :meth:`~.Mobject.scale`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:244 msgid ":pr:`1689`: Added an example for :class:`~.SurroundingRectangle`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:247 msgid ":pr:`1627`: Added an example for :class:`~.Sphere`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:250 msgid ":pr:`1569`: Added example to demonstrate differences between :class:`~.Transform` and :class:`~.ReplacementTransform`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:253 msgid ":pr:`1647`: Added an example for :class:`~.Sector`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:256 msgid ":pr:`1673`: Updated documentation examples for :class:`~.Text` and :class:`~.MarkupText`: set ``weight=BOLD`` instead of ``style``" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:259 msgid ":pr:`1650`: Added an example for :class:`~.ArcBetweenPoints`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:262 msgid ":pr:`1628`: Added an example for :class:`~.NumberPlane`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:265 msgid ":pr:`1646`: Added an example for :class:`~.Underline`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:268 msgid ":pr:`1659`: Added more details to the Google Colab installation instructions" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:271 msgid ":pr:`1658`: Updated python requirement in the documentation" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:274 msgid ":pr:`1639`: Added an example for :class:`~.SampleSpace`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:277 msgid ":pr:`1640`: Added an example for :class:`~.Point`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:280 msgid ":pr:`1643`: Fixed ``RightArcAngleExample`` for :class:`~.Angle` in documentation" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:283 msgid ":pr:`1617`: Visually improved an example in our tutorial" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:286 msgid ":pr:`1641`: Added an example for :class:`~.ComplexPlane`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:289 msgid ":pr:`1644`: Added an example for :class:`~.BackgroundRectangle`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:292 msgid ":pr:`1633`: Added an example for :class:`~.Integer`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:295 msgid ":pr:`1630`: Added an example for :class:`~.Arc`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:298 msgid ":pr:`1631`: Added an example for :class:`~.BulletedList`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:301 msgid ":pr:`1620`: Fixed reference to command line interface help command" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:305 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:307 msgid ":pr:`1623`: CI: branch rename: master -> main" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:310 msgid ":pr:`1621`: Revert default template and add new templates" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:313 msgid ":pr:`1573`: PR template for the manim hackathon" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:317 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:319 msgid ":pr:`1720`: Renamed incorrect references of ``master`` to ``main``" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:322 msgid ":pr:`1692`: Removed redundant warning in CLI parsing" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:325 msgid ":pr:`1651`: Small code cleanup for :class:`~.Polygram`" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:328 msgid ":pr:`1610`: Changed one image extension to lowercase letters" msgstr "" #: ../../source/changelog/0.8.0-changelog.rst:332 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/changelog/0.9.0-changelog.pot000066400000000000000000000440541515024150700263010ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/changelog/0.9.0-changelog.rst:3 msgid "v0.9.0" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:0 msgid "Date" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:5 msgid "August 02, 2021" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:8 msgid "Contributors" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:10 msgid "A total of 35 people contributed to this release. People with a '+' by their names authored a patch for the first time." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:14 #: ../../source/changelog/0.9.0-changelog.rst:47 msgid "Alex Lembcke" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:15 #: ../../source/changelog/0.9.0-changelog.rst:48 msgid "Benjamin Hackl" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:16 #: ../../source/changelog/0.9.0-changelog.rst:49 msgid "Darylgolden" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:17 #: ../../source/changelog/0.9.0-changelog.rst:50 msgid "Devin Neal" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:18 msgid "Harivinay +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:19 #: ../../source/changelog/0.9.0-changelog.rst:52 msgid "Hugues Devimeux" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:20 msgid "Jared Hughes +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:21 #: ../../source/changelog/0.9.0-changelog.rst:54 msgid "Jason Villanueva" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:22 msgid "Kadatatlu Kishore +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:23 #: ../../source/changelog/0.9.0-changelog.rst:55 msgid "KingWampy" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:24 msgid "LED Me Explain +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:25 #: ../../source/changelog/0.9.0-changelog.rst:56 msgid "Laith Bahodi" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:26 #: ../../source/changelog/0.9.0-changelog.rst:58 msgid "Mohammad Al-Fetyani" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:27 msgid "Noam Zaks" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:28 #: ../../source/changelog/0.9.0-changelog.rst:59 msgid "Oliver" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:29 msgid "PaulCMurdoch" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:30 msgid "Raghav Prabhakar +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:31 msgid "Ryan McCauley" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:32 msgid "Suhail Sherif +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:33 msgid "Taektiek +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:34 msgid "Udeshya Dhungana +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:35 msgid "UraniumCronorum +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:36 msgid "Vinh H. Pham (Vincent) +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:37 msgid "ccn +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:38 msgid "icedcoffeeee +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:39 msgid "sahilmakhijani +" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:40 #: ../../source/changelog/0.9.0-changelog.rst:64 msgid "sparshg" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:43 msgid "The patches included in this release have been reviewed by the following contributors." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:46 msgid "Abhijith Muthyala" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:51 msgid "Harivinay" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:53 msgid "Jan-Hendrik Mรผller" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:57 msgid "Lino" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:60 msgid "Raghav Goel" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:61 msgid "Suhail Sherif" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:62 msgid "icedcoffeeee" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:63 msgid "sahilmakhijani" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:67 msgid "Pull requests merged" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:69 msgid "A total of 55 pull requests were merged for this release." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:72 msgid "Highlights" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:75 msgid ":pr:`1677`: Added a new :class:`~.Table` mobject" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:75 msgid "This brings easy-to-use and customizable tables to Manim. Several examples for this new mobject can be found at :mod:`the module documentation page <.mobject.table>` and its subpages." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:78 msgid "Deprecated classes and functions" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:82 msgid ":pr:`1848`: Deprecated parameters for :class:`~.DashedLine` and :class:`~.DashedVMobject`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:81 msgid "``dash_spacing`` is an unused parameter" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:82 msgid "``positive_space_ratio`` has been replaced with the shorter name ``dashed_ratio``" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:92 msgid ":pr:`1773`: Remove all classes and functions that were deprecated until ``v0.7.0`` and ``v0.8.0``" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:85 msgid "The classes ``FadeInFrom``, ``FadeOutAndShift``, ``FadeOutToPoint``, ``FadeInFromPoint``, ``FadeInFromLarge``, ``VFadeIn``, ``VFadeOut``, ``VFadeInThenOut`` have been removed, use :class:`~.FadeIn` or :class:`~.FadeOut` with appropriate keyword arguments instead." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:88 msgid "The classes ``CircleIndicate``, ``ShowCreationThenDestruction``, ``AnimationOnSurroundingRectangle``, ``ShowPassingFlashAround``, ``ShowCreationThenDestructionAround``, ``ShowCreationThenFadeAround``, ``WiggleOutThenIn``, ``TurnInsideOut`` have been removed. Use :class:`~.Circumscribe`, :class:`~.ShowPassingFlash`, or :class:`~.Wiggle` instead." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:90 msgid "The classes ``OpenGLTexMobject`` and ``OpenGLTextMobject`` have been removed, use :class:`~.MathTex` and :class:`~.Tex` instead. Also, ``VMobjectFromSVGPathstring`` has been removed, use :class:`~.SVGPathMobject` instead." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:92 msgid "Finally, the utility functions ``get_norm`` and ``cross`` have been removed (use the corresponding Numpy methods instead), and the function ``angle_between`` has been replaced with ``angle_between_vectors``." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:96 msgid ":pr:`1731`: Deprecated :class:`~.ParametricSurface` parameters" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:95 msgid "``u_min`` and ``u_max`` have been replaced by ``u_range``." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:96 msgid "``v_min`` and ``v_max`` have been replaced by ``v_range``." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:99 msgid "New features" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:103 msgid ":pr:`1780`: Allow non-numerical values to be added to :class:`~.NumberLine` and :class:`~.Axes`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:102 msgid "Added :meth:`.NumberLine.add_labels` method to :class:`~.NumberLine` which accepts a dictionary of positions/values." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:103 msgid ":meth:`.CoordinateSystem.add_coordinates` now accepts a dictionary too." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:105 msgid ":pr:`1719`: Added a :class:`~.Broadcast` animation" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:109 msgid ":pr:`1765`: Added a static method :meth:`.Circle.from_three_points` for defining a circle from three points" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:109 msgid "Added a new :func:`~.perpendicular_bisector` function in ``space_ops.py``" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:112 msgid ":pr:`1686`: Added :meth:`.ParametricSurface.set_fill_by_value`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:112 msgid "This method enables a color gradient to be applied to a :class:`~.ParametricSurface`, including the ability to define at which points the colors should be centered." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:115 msgid "Enhancements" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:117 msgid ":pr:`1833`: Added OpenGL compatibility for :class:`~.VDict`, :meth:`~.Axes.get_line_graph` and :class:`~.FocusOn`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:121 msgid ":pr:`1760`: Added ``window_size`` flag to manually adjust the size of the OpenGL window" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:121 msgid "Accepts a tuple in the form: ``x,y``." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:124 msgid ":pr:`1823`: Reworked :class:`~.DashedVMobject`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:124 msgid "Rewritten the logic to generate dashes" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:129 msgid ":pr:`1808`: OpenGL renderer updates" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:127 msgid "Adds model matrices to all OpenGLVMobjects" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:128 msgid "Improved performance on vectorized mobject shaders" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:129 msgid "Added updaters that are part of the scene rather than a mobject" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:132 msgid ":pr:`1787`: Made :class:`~.DecimalNumber` apply color to the ellipsis" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:132 msgid "Made color apply to the dots when `show_ellipsis` is set to true in `DecimalNumber`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:134 msgid ":pr:`1775`: Let :class:`~.Create` work on :class:`~.OpenGLSurface`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:137 msgid ":pr:`1757`: Added warning when there is a large number of items to hash." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:140 msgid ":pr:`1774`: Add the ``reverse`` parameter to :class:`~.Write`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:144 msgid "Fixed bugs" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:146 msgid ":pr:`1722`: Fixed ``remover=True`` for :class:`~.AnimationGroup`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:151 msgid ":pr:`1727`: Fixed some hot reload issues and compatibility with IDEs" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:150 msgid "Fixed interactive embed issue where it would fail when running on non-tty terminals" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:151 msgid "Fixed issue where file observer would error after the second run as the first observer was not closed" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:153 msgid ":pr:`1844`: Fixed the oversized :class:`~.Code` window with the OpenGL renderer" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:159 msgid ":pr:`1821`: Fixed issues concerning ``frame_center`` in :class:`~.ThreeDScene`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:157 msgid "Changing ``frame_center`` in a :class:`~.ThreeDScene` now actually changes the camera position." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:158 msgid "An animation with only ``frame_center`` animated will now be rendered properly." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:159 msgid "A black dot is not created at the origin once ``frame_center`` is animated." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:161 msgid ":pr:`1826`: Fixed scaling issue with :meth:`.BarChart.change_bar_values`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:164 msgid ":pr:`1839`: Allow passing arguments to ``.animate`` with the OpenGL renderer" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:167 msgid ":pr:`1791`: :meth:`~.Mobject.set_z_index` now sets all submobjects' ``z_index`` value" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:170 msgid ":pr:`1792`: Fixed bug that caused dry runs to fail when using the PNG format" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:173 msgid ":pr:`1790`: Fixed an import from ``manimlib``" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:176 msgid ":pr:`1782`: Fixed :class:`~.Tex` not working properly with the OpenGL renderer" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:179 msgid ":pr:`1783`: Fixed :meth:`~.OpenGLMobject.shuffle` function and added :meth:`~.invert` to OpenGL" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:182 msgid ":pr:`1786`: Fixed :class:`~.DecimalNumber` not working properly when the number of digits changes" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:185 msgid ":pr:`1763`: Fixed not being able to set some CLI flags in the configuration file" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:189 msgid ":pr:`1776`: :meth:`.CoordinateSystem.get_riemann_rectangles` now uses the graph's range instead of the axes range" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:189 msgid "If no range specified, `get_riemann_rectangles` generates the rectangles only where the area is correctly bounded" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:191 msgid ":pr:`1770`: Rewrote :meth:`.OpenGLMobject.put_start_and_end_on` to work correctly in 3D" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:194 msgid ":pr:`1736`: Fixed :class:`~.LinearTransformationScene` crashing on multiple animations" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:198 msgid "Documentation-related changes" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:200 msgid ":pr:`1852`: Fixed docs for :meth:`.Coordinate_system.add_coordinates` and moved :class: `~.Code` example" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:206 msgid ":pr:`1807`: Updated installation instructions" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:204 msgid "Added a warning about the incompatibility of different versions of Manim in the README" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:205 msgid "Modified the admonition warning in the documentation" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:206 msgid "Removed duplicated information from the README (``pip install manim`` is already covered in the docs)" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:208 msgid ":pr:`1739`: Added a section on creating a custom animation to the \"Manim's building blocks\" tutorial" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:211 msgid ":pr:`1835`: Updated documentation with information about reworked graphical unit test system" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:214 msgid ":pr:`1845`: Improve ``ThreeDSurfacePlot`` example in example gallery" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:217 msgid ":pr:`1842`: Removed instructions on installing Poetry from Developer Installation documentation, reference Poetry's documentation instead" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:220 msgid ":pr:`1829`: Switch the order of Scoop and Chocolatey in the docs for the Windows Installation" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:223 msgid ":pr:`1827`: Added ``robots.txt`` to prevent old versions of documentation from showing in search results" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:226 msgid ":pr:`1819`: Removed mention of ``-h`` CLI flag from documentation" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:229 msgid ":pr:`1813`: Removed unused variables from tutorial" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:232 msgid ":pr:`1815`: Added codespell to the list of used linters in the contribution guidelines" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:235 msgid ":pr:`1778`: Improve sidebar structure of the documentation's reference manual" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:238 msgid ":pr:`1749`: Added documentation and example for :meth:`.VMobject.set_fill`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:241 msgid ":pr:`1743`: Edited the developer installation instructions to include information on cloning the repository" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:244 msgid ":pr:`1706`: Rework example for :class:`~.Variable`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:248 msgid "Changes concerning the testing system" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:250 msgid ":pr:`1836`: Converted all the graphical tests to the new syntax" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:254 msgid ":pr:`1802`: Refactored graphical unit testing system, and implemented multi frames tests" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:254 msgid "This PR introduces a new ``@frames_comparison`` decorator which allows writing simple ``construct``-like functions as tests. Control data for new tests can be easily generated by calling ``pytest --set_test``." msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:257 msgid "Changes to our development infrastructure" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:259 msgid ":pr:`1830`: Be more concise about the documentation URL in the PR template" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:263 msgid "Code quality improvements and similar refactors" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:265 msgid ":pr:`1851`: Renamed ``Tabular`` to :class:`~.Table`" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:268 msgid ":pr:`1817`: Remove pillow version requirement" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:271 msgid ":pr:`1806`: Fixed spelling mistake" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:274 msgid ":pr:`1745`: Updated the BibTeX template in the README to Manim v0.9.0" msgstr "" #: ../../source/changelog/0.9.0-changelog.rst:278 msgid "New releases" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/conduct.pot000066400000000000000000000460021515024150700234130ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/conduct.md:3 msgid "Code of Conduct" msgstr "" #: ../../source/conduct.md:7 msgid "TL;DR Be excellent to each other; we're a community after all. If you run into issues with others in our community, please [contact](https://www.manim.community/discord/) a Manim Community Dev, or Moderator." msgstr "" #: ../../source/conduct.md:9 msgid "Purpose" msgstr "" #: ../../source/conduct.md:11 msgid "The Manim Community includes members of varying skills, languages, personalities, cultural backgrounds, and experiences from around the globe. Through these differences, we continue to grow and collectively improve upon an open-source animation engine. When working in a community, it is important to remember that you are interacting with humans on the other end of your screen. This code of conduct will guide your interactions and keep Manim a positive environment for our developers, users, and fundamentally our growing community." msgstr "" #: ../../source/conduct.md:15 msgid "Our Community" msgstr "" #: ../../source/conduct.md:17 msgid "Members of Manim Community are respectful, open, and considerate. Behaviors that reinforce these values contribute to our positive environment, and include:" msgstr "" #: ../../source/conduct.md:19 msgid "**Being respectful.** Respectful of others, their positions, experiences, viewpoints, skills, commitments, time, and efforts." msgstr "" #: ../../source/conduct.md:21 msgid "**Being open.** Open to collaboration, whether it's on problems, Pull Requests, issues, or otherwise." msgstr "" #: ../../source/conduct.md:23 msgid "**Being considerate.** Considerate of their peers -- other Manim users and developers." msgstr "" #: ../../source/conduct.md:25 msgid "**Focusing on what is best for the community.** We're respectful of the processes set forth in the community, and we work within them." msgstr "" #: ../../source/conduct.md:27 msgid "**Showing empathy towards other community members.** We're attentive in our communications, whether in person or online, and we're tactful when approaching differing views." msgstr "" #: ../../source/conduct.md:29 msgid "**Gracefully accepting constructive criticism.** When we disagree, we are courteous in raising our issues." msgstr "" #: ../../source/conduct.md:31 msgid "**Using welcoming and inclusive language.** We're accepting of all who wish to take part in our activities, fostering an environment where anyone can participate and everyone can make a difference." msgstr "" #: ../../source/conduct.md:35 msgid "Our Standards" msgstr "" #: ../../source/conduct.md:37 msgid "Every member of our community has the right to have their identity respected. Manim Community is dedicated to providing a positive environment for everyone, regardless of age, gender identity and expression, sexual orientation, disability, physical appearance, body size, ethnicity, nationality, race, religion (or lack thereof), education, or socioeconomic status." msgstr "" #: ../../source/conduct.md:41 msgid "Inappropriate Behavior" msgstr "" #: ../../source/conduct.md:43 msgid "Examples of unacceptable behavior by participants include:" msgstr "" #: ../../source/conduct.md:45 msgid "Harassment of any participants in any form" msgstr "" #: ../../source/conduct.md:46 msgid "Deliberate intimidation, stalking, or following" msgstr "" #: ../../source/conduct.md:47 msgid "Logging or taking screenshots of online activity for harassment purposes" msgstr "" #: ../../source/conduct.md:48 msgid "Publishing others' private information, such as a physical or electronic address, without explicit permission" msgstr "" #: ../../source/conduct.md:49 msgid "Violent threats or language directed against another person" msgstr "" #: ../../source/conduct.md:50 msgid "Incitement of violence or harassment towards any individual, including encouraging a person to commit suicide or to engage in self-harm" msgstr "" #: ../../source/conduct.md:51 msgid "Creating additional online accounts in order to harass another person or circumvent a ban" msgstr "" #: ../../source/conduct.md:52 msgid "Sexual language and imagery in online communities or any conference venue, including talks" msgstr "" #: ../../source/conduct.md:53 msgid "Insults, put-downs, or jokes that are based upon stereotypes, that are exclusionary, or that hold others up for ridicule" msgstr "" #: ../../source/conduct.md:54 msgid "Excessive swearing" msgstr "" #: ../../source/conduct.md:55 msgid "Unwelcome sexual attention or advances" msgstr "" #: ../../source/conduct.md:56 msgid "Unwelcome physical contact, including simulated physical contact (eg, textual descriptions like \"hug\" or \"backrub\") without consent or after a request to stop" msgstr "" #: ../../source/conduct.md:57 msgid "Pattern of inappropriate social contact, such as requesting/assuming inappropriate levels of intimacy with others" msgstr "" #: ../../source/conduct.md:58 msgid "Sustained disruption of online community discussions, in-person presentations, or other in-person events" msgstr "" #: ../../source/conduct.md:59 msgid "Continued one-on-one communication after requests to cease" msgstr "" #: ../../source/conduct.md:60 msgid "Other conduct that is inappropriate for a professional audience including people of many different backgrounds Community members asked to stop any inappropriate behavior are expected to comply immediately." msgstr "" #: ../../source/conduct.md:65 msgid "Manim Community Online Spaces" msgstr "" #: ../../source/conduct.md:67 msgid "This Code of Conduct applies to the following online spaces:" msgstr "" #: ../../source/conduct.md:69 msgid "The [ManimCommunity GitHub Organization](https://github.com/ManimCommunity) and all of its repositories" msgstr "" #: ../../source/conduct.md:71 msgid "The Manim [Discord](https://www.manim.community/discord/)" msgstr "" #: ../../source/conduct.md:73 msgid "The Manim [Reddit](https://www.reddit.com/r/manim/)" msgstr "" #: ../../source/conduct.md:75 msgid "The Manim [Twitter](https://twitter.com/manim\\_community/)" msgstr "" #: ../../source/conduct.md:77 msgid "This Code of Conduct applies to every member in official Manim Community online spaces, including:" msgstr "" #: ../../source/conduct.md:79 msgid "Moderators" msgstr "" #: ../../source/conduct.md:81 msgid "Maintainers" msgstr "" #: ../../source/conduct.md:83 msgid "Developers" msgstr "" #: ../../source/conduct.md:85 msgid "Reviewers" msgstr "" #: ../../source/conduct.md:87 msgid "Contributors" msgstr "" #: ../../source/conduct.md:89 msgid "Users" msgstr "" #: ../../source/conduct.md:91 msgid "All community members" msgstr "" #: ../../source/conduct.md:95 msgid "Consequences" msgstr "" #: ../../source/conduct.md:97 msgid "If a member's behavior violates this code of conduct, the Manim Community Code of Conduct team may take any action they deem appropriate, including, but not limited to: warning the offender, temporary bans, deletion of offending messages, and expulsion from the community and its online spaces. The full list of consequences for inappropriate behavior is listed below in the Enforcement Procedures." msgstr "" #: ../../source/conduct.md:101 msgid "Thank you for helping make this a welcoming, friendly community for everyone." msgstr "" #: ../../source/conduct.md:105 msgid "Contact Information" msgstr "" #: ../../source/conduct.md:107 msgid "If you believe someone is violating the code of conduct, or have any other concerns, please contact a Manim Community Dev, or Moderator immediately. They can be reached on Manim's Community [Discord](https://www.manim.community/discord/)." msgstr "" #: ../../source/conduct.md:117 msgid "Enforcement Procedures" msgstr "" #: ../../source/conduct.md:119 msgid "This document summarizes the procedures the Manim Community Code of Conduct team uses to enforce the Code of Conduct." msgstr "" #: ../../source/conduct.md:123 msgid "Summary of processes" msgstr "" #: ../../source/conduct.md:125 msgid "When the team receives a report of a possible Code of Conduct violation, it will:" msgstr "" #: ../../source/conduct.md:127 msgid "Acknowledge the receipt of the report." msgstr "" #: ../../source/conduct.md:128 msgid "Evaluate conflicts of interest." msgstr "" #: ../../source/conduct.md:129 msgid "Call a meeting of code of conduct team members without a conflict of interest." msgstr "" #: ../../source/conduct.md:130 msgid "Evaluate the reported incident." msgstr "" #: ../../source/conduct.md:131 msgid "Propose a behavioral modification plan." msgstr "" #: ../../source/conduct.md:132 msgid "Propose consequences for the reported behavior." msgstr "" #: ../../source/conduct.md:133 msgid "Vote on behavioral modification plan and consequences for the reported person." msgstr "" #: ../../source/conduct.md:134 msgid "Contact Manim Community moderators to approve the behavioral modification plan and consequences." msgstr "" #: ../../source/conduct.md:135 msgid "Follow up with the reported person." msgstr "" #: ../../source/conduct.md:136 msgid "Decide further responses." msgstr "" #: ../../source/conduct.md:137 msgid "Follow up with the reporter." msgstr "" #: ../../source/conduct.md:140 msgid "Acknowledge the report" msgstr "" #: ../../source/conduct.md:142 msgid "Reporters should receive an acknowledgment of the receipt of their report within 48 hours." msgstr "" #: ../../source/conduct.md:146 msgid "Conflict of interest policy" msgstr "" #: ../../source/conduct.md:148 msgid "Examples of conflicts of interest include:" msgstr "" #: ../../source/conduct.md:150 msgid "You have a romantic or platonic relationship with either the reporter or the reported person. It's fine to participate if they are an acquaintance." msgstr "" #: ../../source/conduct.md:151 msgid "The reporter or reported person is someone you work closely with. This could be someone on your team or someone who works on the same project as you." msgstr "" #: ../../source/conduct.md:152 msgid "The reporter or reported person is a maintainer who regularly reviews your contributions" msgstr "" #: ../../source/conduct.md:153 msgid "The reporter or reported person is your metamour." msgstr "" #: ../../source/conduct.md:154 msgid "The reporter or reported person is your family member Committee members do not need to state why they have a conflict of interest, only that one exists. Other team members should not ask why the person has a conflict of interest." msgstr "" #: ../../source/conduct.md:157 msgid "Anyone who has a conflict of interest will remove themselves from the discussion of the incident, and recluse themselves from voting on a response to the report." msgstr "" #: ../../source/conduct.md:161 msgid "Evaluating a report" msgstr "" #: ../../source/conduct.md:163 msgid "Jurisdiction" msgstr "" #: ../../source/conduct.md:165 msgid "*Is this a Code of Conduct violation?* Is this behavior on our list of inappropriate behavior? Is it borderline inappropriate behavior? Does it violate our community norms?" msgstr "" #: ../../source/conduct.md:166 msgid "*Did this occur in a space that is within our Code of Conduct's scope?* If the incident occurred outside the community, but a community member's mental health or physical safety may be negatively impacted if no action is taken, the incident may be in scope. Private conversations in community spaces are also in scope." msgstr "" #: ../../source/conduct.md:167 msgid "Impact" msgstr "" #: ../../source/conduct.md:169 msgid "*Did this incident occur in a private conversation or a public space?* Incidents that all community members can see will have a more negative impact." msgstr "" #: ../../source/conduct.md:170 msgid "*Does this behavior negatively impact a marginalized group in our community?* Is the reporter a person from a marginalized group in our community? How is the reporter being negatively impacted by the reported person's behavior? Are members of the marginalized group likely to disengage with the community if no action was taken on this report?" msgstr "" #: ../../source/conduct.md:171 msgid "*Does this incident involve a community leader?* Community members often look up to community leaders to set the standard of acceptable behavior" msgstr "" #: ../../source/conduct.md:172 msgid "Risk" msgstr "" #: ../../source/conduct.md:174 msgid "*Does this incident include sexual harassment?*" msgstr "" #: ../../source/conduct.md:175 msgid "*Does this pose a safety risk?* Does the behavior put a person's physical safety at risk? Will this incident severely negatively impact someone's mental health?" msgstr "" #: ../../source/conduct.md:176 msgid "*Is there a risk of this behavior being repeated?* Does the reported person understand why their behavior was inappropriate? Is there an established pattern of behavior from past reports?" msgstr "" #: ../../source/conduct.md:179 msgid "Reports which involve higher risk or higher impact may face more severe consequences than reports which involve lower risk or lower impact." msgstr "" #: ../../source/conduct.md:183 msgid "Propose consequences" msgstr "" #: ../../source/conduct.md:185 msgid "What follows are examples of possible consequences of an incident report. This list of consequences is not exhaustive, and the Manim Community Code of Conduct team reserves the right to take any action it deems necessary." msgstr "" #: ../../source/conduct.md:187 msgid "Possible private responses to an incident include:" msgstr "" #: ../../source/conduct.md:189 msgid "Nothing, if the behavior was determined to not be a Code of Conduct violation" msgstr "" #: ../../source/conduct.md:190 msgid "A warning" msgstr "" #: ../../source/conduct.md:191 msgid "A final warning" msgstr "" #: ../../source/conduct.md:192 msgid "Temporarily removing the reported person from the community's online space(s)" msgstr "" #: ../../source/conduct.md:193 msgid "Permanently removing the reported person from the community's online space(s)" msgstr "" #: ../../source/conduct.md:194 msgid "Publishing an account of the incident" msgstr "" #: ../../source/conduct.md:197 msgid "Team vote" msgstr "" #: ../../source/conduct.md:199 msgid "Some team members may have a conflict of interest and may be excluded from discussions of a particular incident report. Excluding those members, decisions on the behavioral modification plans and consequences will be determined by a two-thirds majority vote of the Manim Community Code of Conduct team." msgstr "" #: ../../source/conduct.md:203 msgid "Moderators approval" msgstr "" #: ../../source/conduct.md:205 msgid "Once the team has approved the behavioral modification plans and consequences, they will communicate the recommended response to the Manim Community moderators. The team should not state who reported this incident. They should attempt to anonymize any identifying information from the report." msgstr "" #: ../../source/conduct.md:207 msgid "Moderators are required to respond with whether they accept the recommended response to the report. If they disagree with the recommended response, they should provide a detailed response or additional context as to why they disagree. Moderators are encouraged to respond within a week." msgstr "" #: ../../source/conduct.md:209 msgid "In cases where the moderators disagree on the suggested resolution for a report, the Manim Community Code of Conduct team may choose to notify the Manim Community Moderators." msgstr "" #: ../../source/conduct.md:213 msgid "Follow up with the reported person" msgstr "" #: ../../source/conduct.md:215 msgid "The Manim Community Code of Conduct team will work with Manim Community moderators to draft a response to the reported person. The response should contain:" msgstr "" #: ../../source/conduct.md:217 msgid "A description of the person's behavior in neutral language" msgstr "" #: ../../source/conduct.md:218 msgid "The negative impact of that behavior" msgstr "" #: ../../source/conduct.md:219 msgid "A concrete behavioral modification plan" msgstr "" #: ../../source/conduct.md:220 msgid "Any consequences of their behavior The team should not state who reported this incident. They should attempt to anonymize any identifying information from the report. The reported person should be discouraged from contacting the reporter to discuss the report. If they wish to apologize to the reporter, the team can accept the apology on behalf of the reporter." msgstr "" #: ../../source/conduct.md:225 msgid "Decide further responses" msgstr "" #: ../../source/conduct.md:227 msgid "If the reported person provides additional context, the Manim Community Code of Conduct team may need to re-evaluate the behavioral modification plan and consequences." msgstr "" #: ../../source/conduct.md:229 msgid "Follow up with the reporter" msgstr "" #: ../../source/conduct.md:231 msgid "A person who makes a report should receive a follow-up response stating what action was taken in response to the report. If the team decided no response was needed, they should provide an explanation why it was not a Code of Conduct violation. Reports that are not made in good faith (such as \"reverse sexism\" or \"reverse racism\") may receive no response." msgstr "" #: ../../source/conduct.md:233 msgid "The follow-up should be sent no later than one week after the receipt of the report. If deliberation or follow-up with the reported person takes longer than one week, the team should send a status update to the reporter." msgstr "" #: ../../source/conduct.md:237 msgid "Changes to Code of Conduct" msgstr "" #: ../../source/conduct.md:239 msgid "When discussing a change to the Manim Community code of conduct or enforcement procedures, the Manim Community Code of Conduct team will follow this decision-making process:" msgstr "" #: ../../source/conduct.md:241 msgid "**Brainstorm options.** Team members should discuss any relevant context and brainstorm a set of possible options. It is important to provide constructive feedback without getting side-tracked from the main question." msgstr "" #: ../../source/conduct.md:242 msgid "**Vote.** Proposed changes to the code of conduct will be decided by a two-thirds majority of all voting members of the Code of Conduct team. Team members are listed in the charter. Currently active voting members are listed in the following section." msgstr "" #: ../../source/conduct.md:243 msgid "**Board Vote.** Once a working draft is in place for the Code of Conduct and procedures, the Code of Conduct team shall provide the Manim Community Moderators with a draft of the changes. The Manim Community Moderators will vote on the changes at a board meeting." msgstr "" #: ../../source/conduct.md:246 msgid "Current list of voting members" msgstr "" #: ../../source/conduct.md:248 msgid "All available Community Developers (i.e. those with \"write\" permissions, or above, on the Manim Community GitHub organization)." msgstr "" #: ../../source/conduct.md:252 msgid "License" msgstr "" #: ../../source/conduct.md:254 msgid "This Code of Conduct is licensed under the [Creative Commons Attribution-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-sa/3.0/)." msgstr "" #: ../../source/conduct.md:258 msgid "Attributions" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing.pot000066400000000000000000000046411515024150700244660ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/contributing.rst:3 msgid "Contributing" msgstr "" #: ../../source/contributing.rst:5 msgid "Manim is currently undergoing a major refactor. In general, contributions implementing new features will not be accepted in this period. Other contributions unrelated to cleaning up the codebase may also take a longer period of time to be reviewed. This guide may quickly become outdated quickly; we highly recommend joining our `Discord server `__ to discuss any potential contributions and keep up to date with the latest developments." msgstr "" #: ../../source/contributing.rst:12 msgid "Thank you for your interest in contributing to Manim! However you have decided to contribute or interact with the community, please always be civil and respect other members of the community. If you haven't read our :doc:`code of conduct`, do so here. Manim is Free and Open Source Software (FOSS) for mathematical animations. As such, **we welcome everyone** who is interested in mathematics, pedagogy, computer animations, open-source, software development, and beyond. Manim accepts many kinds of contributions, some are detailed below:" msgstr "" #: ../../source/contributing.rst:21 msgid "Code maintenance and development" msgstr "" #: ../../source/contributing.rst:22 msgid "DevOps" msgstr "" #: ../../source/contributing.rst:23 msgid "Documentation" msgstr "" #: ../../source/contributing.rst:24 msgid "Developing educational content & narrative documentation" msgstr "" #: ../../source/contributing.rst:25 msgid "Plugins to extend Manim functionality" msgstr "" #: ../../source/contributing.rst:26 msgid "Testing (graphical, unit & video)" msgstr "" #: ../../source/contributing.rst:27 msgid "Website design and development" msgstr "" #: ../../source/contributing.rst:28 msgid "Translating documentation and docstrings" msgstr "" #: ../../source/contributing.rst:30 msgid "To get an overview of what our community is currently working on, check out `our development project board `__." msgstr "" #: ../../source/contributing.rst:34 msgid "Please ensure that you are reading the latest version of this guide by ensuring that \"latest\" is selected in the version switcher." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing/000077500000000000000000000000001515024150700237355ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing/admonitions.pot000066400000000000000000000040401515024150700270030ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/contributing/admonitions.rst:3 msgid "Adding Admonitions" msgstr "" #: ../../source/contributing/admonitions.rst:6 msgid "Adding Blocks for Tip, Note, Important etc. (Admonitions)" msgstr "" #: ../../source/contributing/admonitions.rst:8 msgid "The following directives are called Admonitions. You can use them to point out additional or important information. Here are some examples:" msgstr "" #: ../../source/contributing/admonitions.rst:13 msgid "See also" msgstr "" #: ../../source/contributing/admonitions.rst:21 msgid "Some ideas at :mod:`~.tex_mobject`, :class:`~.Mobject`, :meth:`~.Mobject.add_updater`, :attr:`~.Mobject.depth`, :func:`~.make_config_parser`" msgstr "" #: ../../source/contributing/admonitions.rst:28 msgid "Note" msgstr "" #: ../../source/contributing/admonitions.rst:36 msgid "A note" msgstr "" #: ../../source/contributing/admonitions.rst:39 msgid "Tip" msgstr "" #: ../../source/contributing/admonitions.rst:47 msgid "A tip" msgstr "" #: ../../source/contributing/admonitions.rst:49 msgid "You may also use the admonition **hint**, but this is very similar and **tip** is more commonly used in the documentation." msgstr "" #: ../../source/contributing/admonitions.rst:53 msgid "Important" msgstr "" #: ../../source/contributing/admonitions.rst:61 msgid "Some important information which should be considered." msgstr "" #: ../../source/contributing/admonitions.rst:64 msgid "Warning" msgstr "" #: ../../source/contributing/admonitions.rst:72 msgid "Some text pointing out something that people should be warned about." msgstr "" #: ../../source/contributing/admonitions.rst:74 msgid "You may also use the admonitions **caution** or even **danger** if the severity of the warning must be stressed." msgstr "" #: ../../source/contributing/admonitions.rst:78 msgid "Attention" msgstr "" #: ../../source/contributing/admonitions.rst:86 msgid "A attention" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing/development.pot000066400000000000000000000340421515024150700270060ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/contributing/development.rst:3 msgid "Manim Development Process" msgstr "" #: ../../source/contributing/development.rst:6 msgid "For first-time contributors" msgstr "" #: ../../source/contributing/development.rst:7 msgid "Install git:" msgstr "" #: ../../source/contributing/development.rst:9 msgid "For instructions see https://git-scm.com/." msgstr "" #: ../../source/contributing/development.rst:12 msgid "Fork the project. Go to https://github.com/ManimCommunity/manim and click the \"fork\" button to create a copy of the project for you to work on. You will need a GitHub account. This will allow you to make a \"Pull Request\" (PR) to the ManimCommunity repo later on." msgstr "" #: ../../source/contributing/development.rst:17 msgid "Clone your fork to your local computer:" msgstr "" #: ../../source/contributing/development.rst:23 msgid "GitHub will provide both a SSH (``git@github.com:/manim.git``) and HTTPS (``https://github.com//manim.git``) URL for cloning. You can use SSH if you have SSH keys setup." msgstr "" #: ../../source/contributing/development.rst:29 msgid "Do not clone the ManimCommunity repository. You must clone your own fork." msgstr "" #: ../../source/contributing/development.rst:32 msgid "Change the directory to enter the project folder:" msgstr "" #: ../../source/contributing/development.rst:38 msgid "Add the upstream repository, ManimCommunity:" msgstr "" #: ../../source/contributing/development.rst:44 msgid "Now, ``git remote -v`` should show two remote repositories named:" msgstr "" #: ../../source/contributing/development.rst:46 msgid "``origin``, your forked repository" msgstr "" #: ../../source/contributing/development.rst:47 msgid "``upstream`` the ManimCommunity repository" msgstr "" #: ../../source/contributing/development.rst:49 msgid "Install Manim:" msgstr "" #: ../../source/contributing/development.rst:51 msgid "Follow the steps in our :doc:`installation instructions <../installation>` to install **Manim's dependencies**, primarily ``ffmpeg`` and ``LaTeX``." msgstr "" #: ../../source/contributing/development.rst:55 msgid "We recommend using `Poetry `__ to manage your developer installation of Manim. Poetry is a tool for dependency management and packaging in Python. It allows you to declare the libraries your project depends on, and it will manage (install / update) them for you. In addition, Poetry provides a simple interface for managing virtual environments." msgstr "" #: ../../source/contributing/development.rst:62 msgid "If you choose to use Poetry as well, follow `Poetry's installation guidelines `__ to install it on your system, then run ``poetry install`` from your cloned repository. Poetry will then install Manim, as well as create and enter a virtual environment. You can always re-enter that environment by running ``poetry shell``." msgstr "" #: ../../source/contributing/development.rst:69 msgid "In case you want to install extra dependencies that are defined in the ``[tool.poetry.extras]`` section of ``pyproject.toml``, this can be done by passing the ``-E`` flag, for example ``poetry install -E jupyterlab -E gui``." msgstr "" #: ../../source/contributing/development.rst:73 msgid "In case you decided against Poetry, you can install Manim via pip by running ``python3 -m pip install .``. Note that due to our development infrastructure being based on Poetry, we currently do not support editable installs via ``pip``, so you will have to re-run this command every time you make changes to the source code." msgstr "" #: ../../source/contributing/development.rst:82 msgid "The following steps assume that you chose to install and work with Poetry." msgstr "" #: ../../source/contributing/development.rst:85 msgid "Install Pre-Commit:" msgstr "" #: ../../source/contributing/development.rst:91 msgid "This will ensure during development that each of your commits is properly formatted against our linter and formatters, ``black``, ``flake8``, ``isort`` and ``codespell``." msgstr "" #: ../../source/contributing/development.rst:95 msgid "You are now ready to work on manim!" msgstr "" #: ../../source/contributing/development.rst:98 msgid "Develop your contribution" msgstr "" #: ../../source/contributing/development.rst:100 msgid "Checkout your local repository's main branch and pull the latest changes from ManimCommunity, ``upstream``, into your local repository:" msgstr "" #: ../../source/contributing/development.rst:108 msgid "Create a branch for the changes you want to work on rather than working off of your local main branch:" msgstr "" #: ../../source/contributing/development.rst:115 msgid "This ensures you can easily update your local repository's main with the first step and switch branches to work on multiple features." msgstr "" #: ../../source/contributing/development.rst:118 msgid "Write some awesome code!" msgstr "" #: ../../source/contributing/development.rst:120 msgid "You're ready to make changes in your local repository's branch. You can add local files you've changed within the current directory with ``git add .``, or add specific files with" msgstr "" #: ../../source/contributing/development.rst:128 msgid "and commit these changes to your local history with ``git commit``. If you have installed pre-commit, your commit will succeed only if none of the hooks fail." msgstr "" #: ../../source/contributing/development.rst:134 msgid "When crafting commit messages, it is highly recommended that you adhere to `these guidelines `_." msgstr "" #: ../../source/contributing/development.rst:137 msgid "Add new or update existing tests." msgstr "" #: ../../source/contributing/development.rst:139 msgid "Depending on your changes, you may need to update or add new tests. For new features, it is required that you include tests with your PR. Details of our testing system are explained in the :doc:`testing guide `." msgstr "" #: ../../source/contributing/development.rst:144 msgid "Update docstrings and documentation:" msgstr "" #: ../../source/contributing/development.rst:146 msgid "Update the docstrings (the text in triple quotation marks) of any functions or classes you change and include them with any new functions you add. See the :doc:`documentation guide ` for more information about how we prefer our code to be documented. The content of the docstrings will be rendered in the :doc:`reference manual <../reference>`." msgstr "" #: ../../source/contributing/development.rst:154 msgid "Use the :mod:`manim directive for Sphinx ` to add examples to the documentation!" msgstr "" #: ../../source/contributing/development.rst:157 msgid "As far as development on your local machine goes, these are the main steps you should follow." msgstr "" #: ../../source/contributing/development.rst:161 msgid "Polishing Changes and Submitting a Pull Request" msgstr "" #: ../../source/contributing/development.rst:163 msgid "As soon as you are ready to share your local changes with the community so that they can be discussed, go through the following steps to open a pull request. A pull request signifies to the ManimCommunity organization, \"Here are some changes I wrote; I think it's worthwhile for you to maintain them.\"" msgstr "" #: ../../source/contributing/development.rst:171 msgid "You do not need to have everything (code/documentation/tests) complete to open a pull request (PR). If the PR is still under development, please mark it as a draft. Community developers will still be able to review the changes, discuss yet-to-be-implemented changes, and offer advice; however, the more complete your PR, the quicker it will be merged." msgstr "" #: ../../source/contributing/development.rst:177 msgid "Update your fork on GitHub to reflect your local changes:" msgstr "" #: ../../source/contributing/development.rst:183 msgid "Doing so creates a new branch on your remote fork, ``origin``, with the contents of your local repository on GitHub. In subsequent pushes, this local branch will track the branch ``origin`` and ``git push`` is enough." msgstr "" #: ../../source/contributing/development.rst:188 msgid "Make a pull request (PR) on GitHub." msgstr "" #: ../../source/contributing/development.rst:190 msgid "In order to make the ManimCommunity development team aware of your changes, you can make a PR to the ManimCommunity repository from your fork." msgstr "" #: ../../source/contributing/development.rst:195 msgid "Make sure to select ``ManimCommunity/manim`` instead of ``3b1b/manim`` as the base repository!" msgstr "" #: ../../source/contributing/development.rst:198 msgid "Choose the branch from your fork as the head repository - see the screenshot below." msgstr "" #: ../../source/contributing/development.rst:204 msgid "Please make sure you follow the template (this is the default text you are shown when first opening the 'New Pull Request' page)." msgstr "" #: ../../source/contributing/development.rst:208 msgid "Your changes are eligible to be merged if:" msgstr "" #: ../../source/contributing/development.rst:210 msgid "there are no merge conflicts" msgstr "" #: ../../source/contributing/development.rst:211 msgid "the tests in our pipeline pass" msgstr "" #: ../../source/contributing/development.rst:212 msgid "at least one (two for more complex changes) Community Developer approves the changes" msgstr "" #: ../../source/contributing/development.rst:214 msgid "You can check for merge conflicts between the current upstream/main and your branch by executing ``git pull upstream main`` locally. If this generates any merge conflicts, you need to resolve them and push an updated version of the branch to your fork of the repository." msgstr "" #: ../../source/contributing/development.rst:219 msgid "Our pipeline consists of a series of different tests that ensure that manim still works as intended and that the code you added sticks to our coding conventions." msgstr "" #: ../../source/contributing/development.rst:223 msgid "**Code style**: We use the code style imposed by `Black `_, `isort `_ and `flake8 `_. The GitHub pipeline makes sure that the (Python) files changed in your pull request also adhere to this code style. If this step of the pipeline fails, fix your code formatting automatically by running ``black `` and ``isort ``. To fix code style problems, run ``flake8 `` for a style report, and then fix the problems manually that were detected by ``flake8``." msgstr "" #: ../../source/contributing/development.rst:232 msgid "**Tests**: The pipeline runs manim's test suite on different operating systems (the latest versions of Ubuntu, MacOS, and Windows) for different versions of Python. The test suite consists of two different kinds of tests: integration tests and doctests. You can run them locally by executing ``poetry run pytest`` and ``poetry run pytest --doctest-modules manim``, respectively, from the root directory of your cloned fork." msgstr "" #: ../../source/contributing/development.rst:239 msgid "**Documentation**: We also build a version of the documentation corresponding to your pull request. Make sure not to introduce any Sphinx errors, and have a look at the built HTML files to see whether the formatting of the documentation you added looks as you intended. You can build the documentation locally by running ``make html`` from the ``docs`` directory. Since the inheritance diagrams require you to have `Graphviz `_ installed locally." msgstr "" #: ../../source/contributing/development.rst:246 msgid "Finally, if the pipeline passes and you are satisfied with your changes: wait for feedback and iterate over any requested changes. You will likely be asked to edit or modify your PR in one way or another during this process. This is not an indictment of your work, but rather a strong signal that the community wants to merge your changes! Once approved, your changes may be merged!" msgstr "" #: ../../source/contributing/development.rst:253 msgid "Further useful guidelines" msgstr "" #: ../../source/contributing/development.rst:255 msgid "When submitting a PR, please mention explicitly if it includes breaking changes." msgstr "" #: ../../source/contributing/development.rst:257 msgid "When submitting a PR, make sure that your proposed changes are as general as possible, and ready to be taken advantage of by all of manim's users. In particular, leave out any machine-specific configurations, or any personal information it may contain." msgstr "" #: ../../source/contributing/development.rst:262 msgid "If you are a maintainer, please label issues and PRs appropriately and frequently." msgstr "" #: ../../source/contributing/development.rst:265 msgid "When opening a new issue, if there are old issues that are related, add a link to them in your new issue (even if the old ones are closed)." msgstr "" #: ../../source/contributing/development.rst:268 msgid "When submitting a code review, it is highly recommended that you adhere to `these general guidelines `_." msgstr "" #: ../../source/contributing/development.rst:271 msgid "If you find stale or inactive issues that seem to be irrelevant, please post a comment saying 'This issue should be closed', and a community developer will take a look." msgstr "" #: ../../source/contributing/development.rst:275 msgid "Please do as much as possible to keep issues, PRs, and development in general as tidy as possible." msgstr "" #: ../../source/contributing/development.rst:279 msgid "You can find examples for the ``docs`` in several places: the :doc:`Example Gallery <../examples>`, :doc:`Tutorials <../tutorials/index>`, and :doc:`Reference Classes <../reference>`." msgstr "" #: ../../source/contributing/development.rst:283 msgid "In case you are contributing, please have a look at this flowchart:" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing/docstrings.pot000066400000000000000000000103221515024150700266360ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/contributing/docstrings.rst:3 msgid "Adding Docstrings" msgstr "" #: ../../source/contributing/docstrings.rst:5 msgid "A docstring is a string literal that is used right after the definition of a module, function, class, or method. They are used to document our code. This page will give you a set of guidelines to write efficient and correct docstrings." msgstr "" #: ../../source/contributing/docstrings.rst:11 msgid "Formatting the Docstrings" msgstr "" #: ../../source/contributing/docstrings.rst:13 msgid "Please begin the description of the class/function in the same line as the 3 quotes:" msgstr "" #: ../../source/contributing/docstrings.rst:31 msgid "NumPy Format" msgstr "" #: ../../source/contributing/docstrings.rst:32 msgid "The Manim Community uses numpy format for the documentation." msgstr "" #: ../../source/contributing/docstrings.rst:34 msgid "Use the numpy format for sections and formatting - see https://numpydoc.readthedocs.io/en/latest/format.html." msgstr "" #: ../../source/contributing/docstrings.rst:37 msgid "This includes:" msgstr "" #: ../../source/contributing/docstrings.rst:39 msgid "The usage of ``Attributes`` to specify ALL ATTRIBUTES that a class can have and a brief (or long, if needed) description." msgstr "" #: ../../source/contributing/docstrings.rst:43 msgid "Also, ``__init__`` parameters should be specified as ``Parameters`` **on the class docstring**, *rather than under* ``__init__``. Note that this can be omitted if the parameters and the attributes are the same (i.e., dataclass) - priority should be given to the ``Attributes`` section, in this case, which must **always be present**, unless the class specifies no attributes at all. (See more on Parameters in number 2 of this list.)" msgstr "" #: ../../source/contributing/docstrings.rst:51 #: ../../source/contributing/docstrings.rst:151 msgid "Example:" msgstr "" #: ../../source/contributing/docstrings.rst:83 msgid "The usage of ``Parameters`` on functions to specify how every parameter works and what it does. This should be excluded if the function has no parameters. Note that you **should not** specify the default value of the parameter on the type. On the documentation render, this is already specified on the function's signature. If you need to indicate a further consequence of value omission or simply want to specify it on the docs, make sure to **specify it in the parameter's DESCRIPTION**." msgstr "" #: ../../source/contributing/docstrings.rst:92 #: ../../source/contributing/docstrings.rst:128 msgid "See an example on list item 4." msgstr "" #: ../../source/contributing/docstrings.rst:96 msgid "When documenting varargs (args and kwargs), make sure to document them by listing the possible types of each value specified, like this:" msgstr "" #: ../../source/contributing/docstrings.rst:109 msgid "Note that, if the kwargs expect specific values, those can be specified in a section such as ``Other Parameters``:" msgstr "" #: ../../source/contributing/docstrings.rst:120 msgid "The usage of ``Returns`` to indicate what is the type of this function's return value and what exactly it returns (i.e., a brief - or long, if needed - description of what this function returns). Can be omitted if the function does not explicitly return (i.e., always returns ``None`` because ``return`` is never specified, and it is very clear why this function does not return at all). In all other cases, it should be specified." msgstr "" #: ../../source/contributing/docstrings.rst:130 msgid "The usage of ``Examples`` in order to specify an example of usage of a function **is highly encouraged** and, in general, should be specified for *every function* unless its usage is **extremely obvious**, which can be debatable. Even if it is, it's always a good idea to add an example in order to give a better orientation to the documentation user. Use the following format for Python code:" msgstr "" #: ../../source/contributing/docstrings.rst:144 msgid "Also, if this is a video- or animation-related change, please try to add an example GIF or video if possible for demonstration purposes." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing/examples.pot000066400000000000000000000111541515024150700263010ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/contributing/examples.rst:3 msgid "Adding Examples" msgstr "" #: ../../source/contributing/examples.rst:5 msgid "This is a page for adding examples to the documentation. Here are some guidelines you should follow before you publish your examples." msgstr "" #: ../../source/contributing/examples.rst:9 msgid "Guidelines for examples" msgstr "" #: ../../source/contributing/examples.rst:11 msgid "Everybody is welcome to contribute examples to the documentation. Since straightforward examples are a great resource for quickly learning manim, here are some guidelines." msgstr "" #: ../../source/contributing/examples.rst:15 msgid "What makes a great example" msgstr "" #: ../../source/contributing/examples.rst:19 msgid "As soon as a new version of manim is released, the documentation will be a snapshot of that version. Examples contributed after the release will only be shown in the latest documentation." msgstr "" #: ../../source/contributing/examples.rst:22 msgid "Examples should be ready to copy and paste for use." msgstr "" #: ../../source/contributing/examples.rst:24 msgid "Examples should be brief yet still easy to understand." msgstr "" #: ../../source/contributing/examples.rst:26 msgid "Examples don't require the ``from manim import *`` statement, this will be added automatically when the docs are built." msgstr "" #: ../../source/contributing/examples.rst:28 msgid "There should be a balance of animated and non-animated examples." msgstr "" #: ../../source/contributing/examples.rst:30 msgid "As manim makes animations, we can include lots of animated examples; however, our RTD has a maximum 20 minutes to build. Animated examples should only be used when necessary, as last frame examples render faster." msgstr "" #: ../../source/contributing/examples.rst:32 msgid "Lots of examples (e.g. size of a plot-axis, setting opacities, making texts, etc.) will also work as images. It is a lot more convenient to see the end product immediately instead of waiting for an animation to reveal it." msgstr "" #: ../../source/contributing/examples.rst:34 msgid "Please ensure the examples run on the current main branch when you contribute an example." msgstr "" #: ../../source/contributing/examples.rst:36 msgid "If the functions used are confusing for people, make sure to add comments in the example to explain what they do." msgstr "" #: ../../source/contributing/examples.rst:39 msgid "How examples are structured" msgstr "" #: ../../source/contributing/examples.rst:41 msgid "Examples can be organized into chapters and subchapters." msgstr "" #: ../../source/contributing/examples.rst:43 msgid "When you create examples, the beginning example chapter should focus on only one functionality. When the functionality is simple, multiple ideas can be illustrated under a single example." msgstr "" #: ../../source/contributing/examples.rst:45 msgid "As soon as simple functionalities are explained, the chapter may include more complex examples which build on the simpler ideas." msgstr "" #: ../../source/contributing/examples.rst:48 msgid "Writing examples" msgstr "" #: ../../source/contributing/examples.rst:50 msgid "When you want to add/edit examples, they can be found in the ``docs/source/`` directory, or directly in the manim source code (e.g. ``manim/mobject/mobject.py``). The examples are written in ``rst`` format and use the manim directive (see :mod:`manim.utils.docbuild.manim_directive` ), ``.. manim::``. Every example is in its own block, and looks like this:" msgstr "" #: ../../source/contributing/examples.rst:67 msgid "In the building process of the docs, all ``rst`` files are scanned, and the manim directive (``.. manim::``) blocks are identified as scenes that will be run by the current version of manim. Here is the syntax:" msgstr "" #: ../../source/contributing/examples.rst:72 msgid "``.. manim:: [SCENE_NAME]`` has no indentation and ``SCENE_NAME`` refers to the name of the class below." msgstr "" #: ../../source/contributing/examples.rst:74 msgid "The flags are followed in the next line (no blank line here!), with the indentation level of one tab." msgstr "" #: ../../source/contributing/examples.rst:76 msgid "All possible flags can be found at :mod:`manim.utils.docbuild.manim_directive`." msgstr "" #: ../../source/contributing/examples.rst:78 msgid "In the example above, the ``Formula1`` following ``.. manim::`` is the scene that the directive expects to render; thus, in the python code, the class has the same name: ``class Formula1(Scene)``." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing/internationalization.pot000066400000000000000000000132511515024150700307300ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/contributing/internationalization.rst:3 msgid "Internationalization" msgstr "" #: ../../source/contributing/internationalization.rst:5 msgid "Thank you for your interest in localizing Manim! Please read the instructions below to get started. You are also encouraged, though not required, to join our `Discord server `__." msgstr "" #: ../../source/contributing/internationalization.rst:11 msgid "Signing up" msgstr "" #: ../../source/contributing/internationalization.rst:13 msgid "You will first need to create an account for our project. Go to our `project homepage `__ and click the sign up button at the top right hand corner. Follow the instructions to create an account. After creating an account, you should return back to our homepage. Click the Manim project to contribute translations for the main library." msgstr "" #: ../../source/contributing/internationalization.rst:21 msgid "Contributing" msgstr "" #: ../../source/contributing/internationalization.rst:24 msgid "Keep in mind that Manim is still a work in progress. Tutorials and documentation are always subject to change. When a developer implements a new feature, they are not forced to respect any translations. This means that parts of the translation might become outdated over time." msgstr "" #: ../../source/contributing/internationalization.rst:29 msgid "That being said, improving the documentation and making it more accessible is still highly encouraged. And even if your work gets outdated and requires change, you or someone else can simply adjust the translation. Your efforts are not in vail!" msgstr "" #: ../../source/contributing/internationalization.rst:35 msgid "Voting" msgstr "" #: ../../source/contributing/internationalization.rst:37 msgid "To ensure that our translations are of good quality, we use crowdsourcing and voting to approve good translations and reject bad ones. The current threshold for a translation being accepted is 3 votes; this may change as we gauge the level of activity in the community and the quality of translations." msgstr "" #: ../../source/contributing/internationalization.rst:43 msgid "To vote on translations, first click on a language you would like to help with, then click the \"translate all\" button. You should then enter the translation editor. Next to the search bar, you will see a funnel-like icon - click it and select the \"Need to Be Voted\" option to see translations that need to be voted on. You can then select a string on the left sidebar, view the translations at the bottom and vote with the + and - icons for good and poor translations respectively." msgstr "" #: ../../source/contributing/internationalization.rst:52 msgid "Translations" msgstr "" #: ../../source/contributing/internationalization.rst:54 msgid "You can also help with contributing translations directly. Follow the steps above to enter the translation editor (instead of clicking \"Translate all\", you may also choose to translate strings from a specific file by clicking them). Crowdin's on-screen tutorial should guide you through the process." msgstr "" #: ../../source/contributing/internationalization.rst:61 msgid "Translation guidelines" msgstr "" #: ../../source/contributing/internationalization.rst:63 msgid "In general, follow the conventions for technical writing in your target language. You may want to refer to similar, high quality sources (eg. Python's documentation in your language) for guidance. Note that code blocks, code literals, names and pseudonyms should be left unchanged." msgstr "" #: ../../source/contributing/internationalization.rst:69 msgid "Proofreading" msgstr "" #: ../../source/contributing/internationalization.rst:71 msgid "For certain languages with a significant number of speakers within the Manim Community, an additional step of proofreading is used after crowdsourcing to further ensure the quality of our translations. Proofreaders are trusted community members who will look over and give the final approval on translations. If you would like to be a proofreader, please email translations@manim.community with the answers to the following questions:" msgstr "" #: ../../source/contributing/internationalization.rst:79 msgid "What is your Crowdin username?" msgstr "" #: ../../source/contributing/internationalization.rst:80 msgid "What is your Discord username (optional)?" msgstr "" #: ../../source/contributing/internationalization.rst:81 msgid "What is your GitHub username (optional)?" msgstr "" #: ../../source/contributing/internationalization.rst:82 msgid "List the languages you speak, and your level of fluency with them." msgstr "" #: ../../source/contributing/internationalization.rst:83 msgid "What language(s) are you applying to be a proofreader for?" msgstr "" #: ../../source/contributing/internationalization.rst:84 msgid "Do you have any previous experience with translations?" msgstr "" #: ../../source/contributing/internationalization.rst:85 msgid "If yes, give us more details." msgstr "" #: ../../source/contributing/internationalization.rst:86 msgid "How will you ensure the quality of translations, should you become a proofreader?" msgstr "" #: ../../source/contributing/internationalization.rst:89 msgid "Please note that you don't need to have prior translation experience to be a proofreader, just a commitment to maintaining a good quality of translations." msgstr "" #: ../../source/contributing/internationalization.rst:94 msgid "Errors" msgstr "" #: ../../source/contributing/internationalization.rst:97 msgid "Source errors" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing/performance.pot000066400000000000000000000046061515024150700267700ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/contributing/performance.rst:3 msgid "Improving performance" msgstr "" #: ../../source/contributing/performance.rst:5 msgid "One of Manim's main flaws as an animation library is its slow performance. As of time of writing (January 2022), the library is still very unoptimized. As such, we highly encourage contributors to help out in optimizing the code." msgstr "" #: ../../source/contributing/performance.rst:10 msgid "Profiling" msgstr "" #: ../../source/contributing/performance.rst:12 msgid "Before the library can be optimized, we first need to identify the bottlenecks in performance via profiling. There are numerous Python profilers available for this purpose; some examples include cProfile and Scalene." msgstr "" #: ../../source/contributing/performance.rst:17 msgid "Running an animation as a script" msgstr "" #: ../../source/contributing/performance.rst:19 msgid "Most instructions for profilers assume you can run the python file directly as a script from the command line. While Manim animations are usually run from the command-line, we can run them as scripts by adding something like the following to the bottom of the file:" msgstr "" #: ../../source/contributing/performance.rst:30 msgid "Where ``SceneName`` is the name of the scene you want to run. You can then run the file directly, and can thus follow the instructions for most profilers." msgstr "" #: ../../source/contributing/performance.rst:34 msgid "An example: profiling with cProfile and SnakeViz" msgstr "" #: ../../source/contributing/performance.rst:36 msgid "Install SnakeViz:" msgstr "" #: ../../source/contributing/performance.rst:42 msgid "cProfile is included with in Python's standard library and does not need to be installed." msgstr "" #: ../../source/contributing/performance.rst:44 msgid "Suppose we want to profile ``SquareToCircle``. Then we add and save the following code to ``square_to_circle.py``:" msgstr "" #: ../../source/contributing/performance.rst:64 msgid "Now run the following in the terminal:" msgstr "" #: ../../source/contributing/performance.rst:70 msgid "This will create a file called ``square_to_circle.txt``." msgstr "" #: ../../source/contributing/performance.rst:72 msgid "Now, we can run SnakeViz on the profile file:" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing/references.pot000066400000000000000000000166761515024150700266220ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/contributing/references.rst:3 msgid "Adding References" msgstr "" #: ../../source/contributing/references.rst:6 msgid "Reference to types in documentation" msgstr "" #: ../../source/contributing/references.rst:8 msgid "Always specify types with the correct **role** (see https://www.sphinx-doc.org/en/1.7/domains.html#python-roles) for the sake of proper rendering. E.g.: Use ``:class:`int``` to refer to an int type, and in general ``:class:``โ€‹`` to refer to a certain class (see ``Path specification`` below). See after for more specific instructions." msgstr "" #: ../../source/contributing/references.rst:16 msgid "Path specifications" msgstr "" #: ../../source/contributing/references.rst:18 msgid "If it's on stdlib: Use ```` directly. If it's a class, just the name is enough. If it's a method (``:meth:``) or attribute (``:attr:``), dotted names may be used (e.g. ``:meth:`str.to_lower`โ€‹``)." msgstr "" #: ../../source/contributing/references.rst:23 msgid "Example: ``:class:`int`โ€‹``, ``:class:`str`โ€‹``, ``:class:`float`โ€‹``, ``:class:`bool`โ€‹``" msgstr "" #: ../../source/contributing/references.rst:26 msgid "If it's on the same file as the docstring or, for methods and attributes, under the same class, then the name may also be specified directly." msgstr "" #: ../../source/contributing/references.rst:30 msgid "Example: ``:class:`MyClass`โ€‹`` referring to a class in the same file; ``:meth:`push`โ€‹`` referring to a method in the same class; ``:meth:`MyClass.push`โ€‹`` referring to a method in a different class in the same file; ``:attr:`color`โ€‹`` referring to an attribute in the same class; ``:attr:`MyClass.color`โ€‹`` referring to an attribute in a different class in the same file." msgstr "" #: ../../source/contributing/references.rst:37 msgid "If it's on a different file, then you may either use the full dotted name (e.g. ``~manim.animations.Animation``) or simply use the shortened way (``~.Animation``). Note that, if there is ambiguity, then the full dotted name must be used where the actual class can't be deduced. Also, note the ``~`` before the path - this is so that it displays just ``Animation`` instead of the full location in the rendering. It can be removed for disambiguation purposes only." msgstr "" #: ../../source/contributing/references.rst:45 msgid "Example: ``:class:`~.Animation`โ€‹``, ``:meth:`~.VMobject.set_color`โ€‹``, ``:attr:`~.VMobject.color`โ€‹``" msgstr "" #: ../../source/contributing/references.rst:48 msgid "If it's a class from a different module, specify the full dotted syntax." msgstr "" #: ../../source/contributing/references.rst:51 msgid "Example: ``:class:`numpy.ndarray`โ€‹`` for a numpy ndarray." msgstr "" #: ../../source/contributing/references.rst:54 msgid "Reference type specifications" msgstr "" #: ../../source/contributing/references.rst:56 msgid "**The following instructions refer to types of attributes, parameters, and return values.** When specifying a type mid-text, it does not necessarily have to be typeset. However, if it's a class name, a method, or an enum's attribute/variant, then it is recommended to be typeset at least on the first occurrence of the name so that the users can quickly jump to the related documentation." msgstr "" #: ../../source/contributing/references.rst:63 msgid "Class names should be wrapped in ``:class:`path_goes_here`โ€‹``. See examples in the subsection above." msgstr "" #: ../../source/contributing/references.rst:65 msgid "Method names should be wrapped in ``:meth:`path_goes_here`โ€‹``. See examples in the subsection above." msgstr "" #: ../../source/contributing/references.rst:67 msgid "Attribute names should be wrapped in ``:attr:`path_goes_here`โ€‹``. See examples in the subsection above." msgstr "" #: ../../source/contributing/references.rst:69 msgid "If ``None`` can also be specified, use ``Optional[type]``, where ``type`` must follow the guidelines in the current section." msgstr "" #: ../../source/contributing/references.rst:72 msgid "Example: ``Optional[:class:`str`]`` means you can either specify a ``str`` or ``None``." msgstr "" #: ../../source/contributing/references.rst:75 msgid "If more than one type is possible, use ``Union[type_1, type_2, (...), type_n]``, where all the ``type_n`` must follow the guidelines in the current section. Note that, if one of these types is ``None``, then the Union should be wrapped with ``Optional`` instead." msgstr "" #: ../../source/contributing/references.rst:81 msgid "Example: ``Union[:class:`str`, :class:`int`]`` for either ``str`` or ``int``. ``Optional[Union[:class:`int`, :class:`bool`]]`` for either ``int``, ``bool`` or ``None``." msgstr "" #: ../../source/contributing/references.rst:85 msgid "**Dictionaries:** Use ``Dict[key_type, value_type]``, where ``key_type`` and ``value_type`` must follow the guidelines in the current section." msgstr "" #: ../../source/contributing/references.rst:89 msgid "Example: ``Dict[:class:`str`, :class:`~.Mobject`]`` is a dictionary that maps strings to Mobjects. ``Dict[:class:`str`, Union[:class:`int`, :class:`MyClass`]]`` is a dictionary that maps a string to either an int or an instance of ``MyClass``." msgstr "" #: ../../source/contributing/references.rst:95 msgid "**If the parameter is a list:** Note that it is very rare to require the parameter to be exactly a ``list`` type. One could usually specify a ``tuple`` instead, for example. So, in order to cover all cases, consider:" msgstr "" #: ../../source/contributing/references.rst:100 msgid "If the parameter only needs to be an ``Iterable``, i.e., if the function only requires being able to iterate over this parameter's value (e.g. can be a ``list``, ``tuple``, ``str``, but also ``zip()``, ``iter()`` and so on), then specify ``Iterable[type_here]``, where ``type_here`` is the type of the iterable's yielded elements and should follow the format in the present section (``Type specifications``)." msgstr "" #: ../../source/contributing/references.rst:108 msgid "Example: ``Iterable[:class:`str`]`` for any iterable of strings; ``Iterable[:class:`~.Mobject`]`` for an iterable of Mobjects; etc." msgstr "" #: ../../source/contributing/references.rst:111 msgid "If you require being able to index the parameter (i.e. ``x[n]``) or retrieve its length (i.e. ``len(x)``), or even just pass it to a function that requires any of those, then specify ``Sequence``, which allows any list-like object to be specified (e.g. ``list``, ``tuple``...)" msgstr "" #: ../../source/contributing/references.rst:117 msgid "Example: ``Sequence[:class:`str`]`` for a sequence of strings; ``Sequence[Union[:class:`str`, :class:`int`]]`` for a sequence of integers or strings." msgstr "" #: ../../source/contributing/references.rst:121 msgid "If you EXPLICITLY REQUIRE it to be a ``list`` for some reason, then use ``List[type]``, where ``type`` is the type that any element in the list will have. It must follow the guidelines in the current section." msgstr "" #: ../../source/contributing/references.rst:126 msgid "**If the return type is a list or tuple:** Specify ``List[type]`` for a list, ``Tuple[type_a, type_b, (...), type_n]`` for a tuple (if the elements are all different) or ``Tuple[type, ...]`` (if all elements have the same type). Each ``type_n`` on those representations corresponds to elements in the returned list/tuple and must follow the guidelines in the current section." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing/testing.pot000066400000000000000000000225561515024150700261500ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/contributing/testing.rst:3 msgid "Adding Tests" msgstr "" #: ../../source/contributing/testing.rst:4 msgid "If you are adding new features to manim, you should add appropriate tests for them. Tests prevent manim from breaking at each change by checking that no other feature has been broken and/or been unintentionally modified." msgstr "" #: ../../source/contributing/testing.rst:9 msgid "How Manim tests" msgstr "" #: ../../source/contributing/testing.rst:11 msgid "Manim uses pytest as its testing framework. To start the testing process, go to the root directory of the project and run pytest in your terminal. Any errors that occur during testing will be displayed in the terminal." msgstr "" #: ../../source/contributing/testing.rst:15 msgid "Some useful pytest flags:" msgstr "" #: ../../source/contributing/testing.rst:17 msgid "``-x`` will make pytest stop at the first failure it encounters" msgstr "" #: ../../source/contributing/testing.rst:19 msgid "``-s`` will make pytest display all the print messages (including those during scene generation, like DEBUG messages)" msgstr "" #: ../../source/contributing/testing.rst:21 msgid "``--skip_slow`` will skip the (arbitrarily) slow tests" msgstr "" #: ../../source/contributing/testing.rst:23 msgid "``--show_diff`` will show a visual comparison in case a unit test is failing." msgstr "" #: ../../source/contributing/testing.rst:27 msgid "How it Works" msgstr "" #: ../../source/contributing/testing.rst:29 msgid "At the moment there are three types of tests:" msgstr "" #: ../../source/contributing/testing.rst:31 msgid "Unit Tests:" msgstr "" #: ../../source/contributing/testing.rst:33 msgid "Tests for most of the basic functionalities of manim. For example, there a test for ``Mobject``, that checks if it can be added to a Scene, etc." msgstr "" #: ../../source/contributing/testing.rst:36 msgid "Graphical unit tests: Because ``manim`` is a graphics library, we test frames. To do so, we create test scenes that render a specific feature. When pytest runs, it compares the result of the test to the control data, either at 6 fps or just the last frame. If it matches, the tests pass. If the test and control data differ, the tests fail. You can use ``--show_diff`` flag with ``pytest`` to visually see the differences." msgstr "" #: ../../source/contributing/testing.rst:42 msgid "Videos format tests:" msgstr "" #: ../../source/contributing/testing.rst:44 msgid "As Manim is a video library, we have to test videos as well. Unfortunately, we cannot directly test video content as rendered videos can differ slightly depending on the system (for reasons related to ffmpeg). Therefore, we only compare video configuration values, exported in .json." msgstr "" #: ../../source/contributing/testing.rst:51 msgid "Architecture" msgstr "" #: ../../source/contributing/testing.rst:53 msgid "The ``manim/tests`` directory looks like this:" msgstr "" #: ../../source/contributing/testing.rst:122 msgid "The Main Directories" msgstr "" #: ../../source/contributing/testing.rst:124 msgid "``control_data/``:" msgstr "" #: ../../source/contributing/testing.rst:126 msgid "The directory containing control data. ``control_data/graphical_units_data/`` contains the expected and correct frame data for graphical tests, and ``control_data/videos_data/`` contains the .json files used to check videos." msgstr "" #: ../../source/contributing/testing.rst:129 msgid "``test_graphical_units/``:" msgstr "" #: ../../source/contributing/testing.rst:131 msgid "Contains graphical tests." msgstr "" #: ../../source/contributing/testing.rst:133 msgid "``test_scene_rendering/``:" msgstr "" #: ../../source/contributing/testing.rst:135 msgid "For tests that need to render a scene in some way, such as tests for CLI flags (end-to-end tests)." msgstr "" #: ../../source/contributing/testing.rst:138 msgid "``utils/``:" msgstr "" #: ../../source/contributing/testing.rst:140 msgid "Useful internal functions used by pytest." msgstr "" #: ../../source/contributing/testing.rst:142 msgid "fixtures are not contained here, they are in ``conftest.py``." msgstr "" #: ../../source/contributing/testing.rst:144 msgid "``helpers/``:" msgstr "" #: ../../source/contributing/testing.rst:146 msgid "Helper functions for developers to setup graphical/video tests." msgstr "" #: ../../source/contributing/testing.rst:149 msgid "Adding a New Test" msgstr "" #: ../../source/contributing/testing.rst:152 msgid "Unit Tests" msgstr "" #: ../../source/contributing/testing.rst:154 msgid "Pytest determines which functions are tests by searching for files whose names begin with \"test\\_\", and then within those files for functions beginning with \"test\" and classes beginning with \"Test\". These kinds of tests must be in ``tests/`` (e.g. ``tests/test_container.py``)." msgstr "" #: ../../source/contributing/testing.rst:160 msgid "Graphical Unit Test" msgstr "" #: ../../source/contributing/testing.rst:162 msgid "The test must be written in the correct file (i.e. the file that corresponds to the appropriate category the feature belongs to) and follow the structure of unit tests." msgstr "" #: ../../source/contributing/testing.rst:165 msgid "For example, to test the ``Circle`` VMobject which resides in ``manim/mobject/geometry.py``, add the CircleTest to ``test/test_geometry.py``." msgstr "" #: ../../source/contributing/testing.rst:169 msgid "The name of the module is indicated by the variable __module_test__, that **must** be declared in any graphical test file. The module name is used to store the graphical control data." msgstr "" #: ../../source/contributing/testing.rst:172 msgid "You will need to use the ``frames_comparison`` decorator to create a test. The test function **must** accept a parameter named ``scene`` that will be used like ``self`` in a standard ``construct`` method." msgstr "" #: ../../source/contributing/testing.rst:175 msgid "Here's an example in ``test_geometry.py``:" msgstr "" #: ../../source/contributing/testing.rst:190 msgid "The decorator can be used with or without parentheses. **By default, the test only tests the last frame. To enable multi-frame testing, you have to set ``last_frame=False`` in the parameters.**" msgstr "" #: ../../source/contributing/testing.rst:199 msgid "You can also specify, when needed, which base scene you need (ThreeDScene, for example) :" msgstr "" #: ../../source/contributing/testing.rst:208 msgid "Feel free to check the documentation of ``@frames_comparison`` for more." msgstr "" #: ../../source/contributing/testing.rst:210 msgid "Note that tests name must follow the syntax ``test_``, otherwise pytest will not recognize it as a test." msgstr "" #: ../../source/contributing/testing.rst:213 msgid "If you run pytest now, you will get a ``FileNotFound`` error. This is because you have not created control data for your test." msgstr "" #: ../../source/contributing/testing.rst:216 msgid "To create the control data for your test, you have to use the flag ``--set_test`` along with pytest. For the example above, it would be" msgstr "" #: ../../source/contributing/testing.rst:223 msgid "(``-s`` is here to see manim logs, so you can see what's going on)." msgstr "" #: ../../source/contributing/testing.rst:225 msgid "Please make sure to add the control data to git as soon as it is produced with ``git add ``." msgstr "" #: ../../source/contributing/testing.rst:229 msgid "Videos tests" msgstr "" #: ../../source/contributing/testing.rst:231 msgid "To test videos generated, we use the decorator ``tests.utils.videos_tester.video_comparison``:" msgstr "" #: ../../source/contributing/testing.rst:254 msgid "``assert exit*\\ code == 0, err`` is used in case of the command fails to run. The decorator takes two arguments: json name and the path to where the video should be generated, starting from the ``media/`` dir." msgstr "" #: ../../source/contributing/testing.rst:258 msgid "Note the fixtures here:" msgstr "" #: ../../source/contributing/testing.rst:260 msgid "tmp_path is a pytest fixture to get a tmp_path. Manim will output here, according to the flag ``--media_dir``." msgstr "" #: ../../source/contributing/testing.rst:262 msgid "``manim_cfg_file`` fixture that return a path pointing to ``test_scene_rendering/standard_config.cfg``. It's just to shorten the code, in the case multiple tests need to use this cfg file." msgstr "" #: ../../source/contributing/testing.rst:264 msgid "``simple_scenes_path`` same as above, except for ``test_scene_rendering/simple_scene.py``" msgstr "" #: ../../source/contributing/testing.rst:266 msgid "You have to generate a ``.json`` file first to be able to test your video. To do that, use ``helpers.save_control_data_from_video``." msgstr "" #: ../../source/contributing/testing.rst:269 msgid "For instance, a test that will check if the l flag works properly will first require rendering a video using the -l flag from a scene. Then we will test (in this case, SquareToCircle), that lives in ``test_scene_rendering/simple_scene.py``. Change directories to ``tests/``, create a file (e.g. ``create\\_data.py``) that you will remove as soon as you're done. Then run:" msgstr "" #: ../../source/contributing/testing.rst:280 msgid "Running this will save ``control_data/videos_data/SquareToCircleWithlFlag.json``, which will look like this:" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/contributing/typings.pot000066400000000000000000000064261515024150700261660ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/contributing/typings.rst:3 msgid "Adding Typings" msgstr "" #: ../../source/contributing/typings.rst:6 msgid "Adding type hints to functions and parameters" msgstr "" #: ../../source/contributing/typings.rst:9 msgid "This section is still a work in progress." msgstr "" #: ../../source/contributing/typings.rst:11 msgid "If you've never used type hints before, this is a good place to get started: https://realpython.com/python-type-checking/#hello-types." msgstr "" #: ../../source/contributing/typings.rst:14 msgid "When adding type hints to manim, there are some guidelines that should be followed:" msgstr "" #: ../../source/contributing/typings.rst:16 msgid "Coordinates have the typehint ``Sequence[float]``, e.g." msgstr "" #: ../../source/contributing/typings.rst:23 msgid "``**kwargs`` has no typehint" msgstr "" #: ../../source/contributing/typings.rst:25 msgid "Mobjects have the typehint \"Mobject\", e.g." msgstr "" #: ../../source/contributing/typings.rst:33 msgid "Colors have the typehint ``Color``, e.g." msgstr "" #: ../../source/contributing/typings.rst:40 msgid "As ``float`` and ``Union[int, float]`` are the same, use only ``float``" msgstr "" #: ../../source/contributing/typings.rst:42 msgid "For numpy arrays use the typehint ``np.ndarray``" msgstr "" #: ../../source/contributing/typings.rst:44 msgid "Functions that does not return a value should get the type hint ``None``. (This annotations help catch the kinds of subtle bugs where you are trying to use a meaningless return value. )" msgstr "" #: ../../source/contributing/typings.rst:51 msgid "Parameters that are None by default should get the type hint ``Optional``" msgstr "" #: ../../source/contributing/typings.rst:65 msgid "The ``__init__()`` method always should have None as its return type." msgstr "" #: ../../source/contributing/typings.rst:67 msgid "Functions and lambda functions should get the typehint ``Callable``" msgstr "" #: ../../source/contributing/typings.rst:74 msgid "Assuming that typical path objects are either Paths or strs, one can use the typehint ``typing.Union[str, pathlib.Path]``" msgstr "" #: ../../source/contributing/typings.rst:77 msgid "As a helper for tool for typesets, you can use `typestring-parser `_ which can be accessed by first installing it via ``pip`` - ``pip install typestring-parser`` and then using ``from typestring_parser import parse``." msgstr "" #: ../../source/contributing/typings.rst:96 msgid "Missing Sections for typehints are:" msgstr "" #: ../../source/contributing/typings.rst:97 msgid "Tools for typehinting" msgstr "" #: ../../source/contributing/typings.rst:98 msgid "Link to MyPy" msgstr "" #: ../../source/contributing/typings.rst:99 msgid "Mypy and numpy import errors: https://realpython.com/python-type-checking/#running-mypy" msgstr "" #: ../../source/contributing/typings.rst:100 msgid "Where to find the alias" msgstr "" #: ../../source/contributing/typings.rst:101 msgid "When to use Object and when to use \"Object\"." msgstr "" #: ../../source/contributing/typings.rst:102 msgid "The use of a TypeVar on the type hints for copy()." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/examples.pot000066400000000000000000000033131515024150700235700ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/examples.rst:3 msgid "Example Gallery" msgstr "" #: ../../source/examples.rst:5 msgid "This gallery contains a collection of best practice code snippets together with their corresponding video/image output, illustrating different functionalities all across the library. These are all under the MIT license, so feel free to copy & paste them to your projects. Enjoy this taste of Manim!" msgstr "" #: ../../source/examples.rst:13 msgid "This gallery is not the only place in our documentation where you can see explicit code and video examples: there are many more in our :doc:`reference manual ` -- see, for example, our documentation for the modules :mod:`~.tex_mobject`, :mod:`~.geometry`, :mod:`~.moving_camera_scene`, and many more." msgstr "" #: ../../source/examples.rst:19 msgid "Check out our `interactive Jupyter environment `_ which allows running the examples online, without requiring a local installation." msgstr "" #: ../../source/examples.rst:23 msgid "Also, visit our `Twitter `_ for more *manimations*!" msgstr "" #: ../../source/examples.rst:29 msgid "Basic Concepts" msgstr "" #: ../../source/examples.rst:134 msgid "Animations" msgstr "" #: ../../source/examples.rst:216 msgid "You can use multiple ValueTrackers simultaneously." msgstr "" #: ../../source/examples.rst:310 msgid "Plotting with Manim" msgstr "" #: ../../source/examples.rst:496 msgid "Special Camera Settings" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/faq/000077500000000000000000000000001515024150700217755ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/faq/general.pot000066400000000000000000000222521515024150700241410ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/faq/general.md:1 msgid "FAQ: General Usage" msgstr "" #: ../../source/faq/general.md:3 msgid "Why does Manim say that \"there are no scenes inside that module\"?" msgstr "" #: ../../source/faq/general.md:5 msgid "There are two main reasons why this error appears: if you have edited the file containing your `Scene` class and forgot to save it, or if you have accidentally passed the name of a wrong file to `manim`, this is a likely outcome. Check that you have spelled everything correctly." msgstr "" #: ../../source/faq/general.md:10 msgid "Otherwise you are likely mixing up Manim versions. See {ref}`this FAQ answer ` for an explanation regarding why there are different versions. Under the assumption that you are trying to use the `manim` executable from the terminal to run a scene that has been written for the community version (i.e., there is `from manim import *`, or more specifically `from manim import Scene`)" msgstr "" #: ../../source/faq/general.md:18 msgid "No matter what code I put in my file, Manim only renders a black frame! Why?" msgstr "" #: ../../source/faq/general.md:20 msgid "If you are using the usual pattern to write a `Scene`, i.e.," msgstr "" #: ../../source/faq/general.md:27 msgid "then double check whether you have spelled `construct` correctly. If the method containing your code is not called `construct` (or if you are not calling a different, custom method from `construct`), Manim will not call your method and simply output a black frame." msgstr "" #: ../../source/faq/general.md:34 msgid "What are the default measurements for Manim's scene?" msgstr "" #: ../../source/faq/general.md:36 msgid "The scene measures 8 units in height and has a default ratio of 16:9, which means that it measures {math}`8 \\cdot 16 / 9 = 14 + 2/9` units in width. The origin is in the center of the scene, which means that, for example, the upper left corner of the scene has coordinates `[-7-1/9, 4, 0]`." msgstr "" #: ../../source/faq/general.md:43 msgid "How do I find out which keyword arguments I can pass when creating a `Mobject`?" msgstr "" #: ../../source/faq/general.md:45 msgid "Let us consider some specific example, like the {class}`.Circle` class. When looking at its documentation page, only two specific keyword arguments are listed (`radius`, and `color`). Besides these concrete arguments, there is also a catchall `**kwargs` argument which captures all other arguments that are passed to `Circle`, and passes them on to the base class of {class}`.Circle`, {class}`.Arc`." msgstr "" #: ../../source/faq/general.md:51 msgid "The same holds for {class}`.Arc`: some arguments are explicitly documented, and there is again a catchall `**kwargs` argument that passes unprocessed arguments to the next base class -- and so on." msgstr "" #: ../../source/faq/general.md:55 msgid "The most important keyword arguments relevant to styling your mobjects are the ones that are documented for the base classes {class}`.VMobject` and {class}`.Mobject`." msgstr "" #: ../../source/faq/general.md:61 msgid "Can Manim render a video with transparent background?" msgstr "" #: ../../source/faq/general.md:63 msgid "Yes: simply pass the CLI flag `-t` (or its long form `--transparent`). Note that the default video file format does not support transparency, which is why Manim will output a `.mov` instead of a `.mp4` when rendering with a transparent background. Other movie file formats that support transparency can be obtained by passing `--format=webm` or `--format=gif`." msgstr "" #: ../../source/faq/general.md:72 msgid "I have watched a video where a creator ran command X, but it does not work for me. Why?" msgstr "" #: ../../source/faq/general.md:74 msgid "The video you have been watching is likely outdated. If you want to follow along, you either need to use the same version used in the video, or modify the code (in many cases it is just a method having been renamed etc.) accordingly. Check the video description, in some cases creators point out whether changes need to be applied to the code shown in the video." msgstr "" #: ../../source/faq/general.md:82 msgid "When using `Tex` or `MathTex`, some letters are missing. How can I fix this?" msgstr "" #: ../../source/faq/general.md:84 msgid "It is possible that you have to (re)build some fonts used by LaTeX. For some distributions, you can do this manually by running" msgstr "" #: ../../source/faq/general.md:89 msgid "We recommend consulting the documentation of your LaTeX distribution for more information." msgstr "" #: ../../source/faq/general.md:94 msgid "I want to translate some code from `manimgl` to `manim`, what do I do with `CONFIG` dictionaries?" msgstr "" #: ../../source/faq/general.md:96 msgid "The community maintained version has dropped the use of `CONFIG` dictionaries very early, with {doc}`version v0.2.0 ` released in January 2021." msgstr "" #: ../../source/faq/general.md:100 msgid "Before that, Manim's classes basically processed `CONFIG` dictionaries by mimicking inheritance (to properly process `CONFIG` dictionaries set by parent classes) and then assigning all of the key-value-pairs in the dictionary as attributes of the corresponding object." msgstr "" #: ../../source/faq/general.md:105 msgid "In situations where there is not much inheritance going on, or for any custom setting, you should set these attributes yourself. For example, for an old-style `Scene` with custom attributes like" msgstr "" #: ../../source/faq/general.md:114 msgid "should be written as" msgstr "" #: ../../source/faq/general.md:122 msgid "In situations where values should be properly inherited, the arguments should be added to the initialization function of the class. An old-style mobject `Thing` could look like" msgstr "" #: ../../source/faq/general.md:135 msgid "where `stroke_color` and `fill_opacity` are arguments that concern the parent class of `Thing`, and `my_awesome_argument` is a custom argument that only concerns `Thing`. A version without `CONFIG` could look like this:" msgstr "" #: ../../source/faq/general.md:150 msgid "My installation does not support converting PDF to SVG, help?" msgstr "" #: ../../source/faq/general.md:152 msgid "This is an issue with `dvisvgm`, the tool shipped with LaTeX that transforms LaTeX output to a `.svg` file that Manim can parse." msgstr "" #: ../../source/faq/general.md:156 msgid "First, make sure your ``dvisvgm`` version is at least 2.4 by checking the output of" msgstr "" #: ../../source/faq/general.md:163 msgid "If you do not know how to update `dvisvgm`, please refer to your LaTeX distributions documentation (or the documentation of your operating system, if `dvisvgm` was installed as a system package)." msgstr "" #: ../../source/faq/general.md:167 msgid "Second, check whether your ``dvisvgm`` supports PostScript specials. This is needed to convert from PDF to SVG. Run:" msgstr "" #: ../../source/faq/general.md:174 msgid "If the output to this command does **not** contain `ps dvips PostScript specials`, this is a bad sign. In this case, run" msgstr "" #: ../../source/faq/general.md:181 msgid "If the output does **not** contain `--libgs=filename`, this means your `dvisvgm` does not currently support PostScript. You must get another binary." msgstr "" #: ../../source/faq/general.md:184 msgid "If, however, `--libgs=filename` appears in the help, that means that your `dvisvgm` needs the Ghostscript library to support PostScript. Search for `libgs.so` (on Linux, probably in `/usr/local/lib` or `/usr/lib`) or `gsdll32.dll` (on 32-bit Windows, probably in `C:\\windows\\system32`) or `gsdll64.dll` (on 64-bit Windows, also probably in `C:\\windows\\system32`) or `libgsl.dylib` (on MacOS, probably in `/usr/local/lib` or `/opt/local/lib`). Please look carefully, as the file might be located elsewhere, e.g. in the directory where Ghostscript is installed." msgstr "" #: ../../source/faq/general.md:193 msgid "When you have found the library, try (on MacOS or Linux)" msgstr "" #: ../../source/faq/general.md:200 msgid "or (on Windows)" msgstr "" #: ../../source/faq/general.md:207 msgid "You should now see `ps dvips PostScript specials` in the output. Refer to your operating system's documentation to find out how you can set or export the environment variable ``LIBGS`` automatically whenever you open a shell." msgstr "" #: ../../source/faq/general.md:211 msgid "As a last check, you can run" msgstr "" #: ../../source/faq/general.md:217 msgid "(while still having `LIBGS` set to the correct path, of course.) If `dvisvgm` can find your Ghostscript installation, it will be shown in the output together with the version number." msgstr "" #: ../../source/faq/general.md:221 msgid "If you do not have the necessary library on your system, please refer to your operating system's documentation to find out where you can get it and how you have to install it." msgstr "" #: ../../source/faq/general.md:225 msgid "If you are unable to solve your problem, check out the [dvisvgm FAQ](https://dvisvgm.de/FAQ/)." msgstr "" #: ../../source/faq/general.md:230 msgid "Where can I find more resources for learning Manim?" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/faq/help.pot000066400000000000000000000157521515024150700234630ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/faq/help.md:1 msgid "FAQ: Getting Help" msgstr "" #: ../../source/faq/help.md:3 msgid "How do I animate X? Why do I get error Y? Can someone help me?" msgstr "" #: ../../source/faq/help.md:5 msgid "Before asking the community, please make sure that the issue you are having is not already discussed in ourย {doc}`FAQ section ` sufficiently well so that you can resolve the problem yourself. You can also try to use your favorite search engine, if you are lucky you might find a blog post, a question on [StackOverflow](https://stackoverflow.com/questions/tagged/manim), or a post in the [r/manim subreddit](https://reddit.com/r/manim)." msgstr "" #: ../../source/faq/help.md:12 msgid "If this is not the case, please take a moment to properly prepare your question: the better you manage to explain what exactly it is you are struggling with, the more efficient people will be able to help you. Regardless of the platform you choose in the next step, StackOverflow has a good guide on [asking good questions](https://stackoverflow.com/help/how-to-ask)." msgstr "" #: ../../source/faq/help.md:18 msgid "As soon as you have a good idea of what exactly you want to ask, pick one of the following communication channels:" msgstr "" #: ../../source/faq/help.md:21 msgid "The community is most active [in our Discord server](https://manim.community/discord/). Click the link to join, then pick one of the `#manim-help` channels in the sidebar, and post your question there. If you are comfortable with using Discord, try to search for your problem using the search function of our server; perhaps people have been talking about it before!" msgstr "" #: ../../source/faq/help.md:26 msgid "We are also monitoring questions on [StackOverflow](https://stackoverflow.com/questions/tagged/manim) that are tagged with `manim`." msgstr "" #: ../../source/faq/help.md:29 msgid "Many people are also active in our [r/manim subreddit](https://reddit.com/r/manim), feel free to post there if you are an avid Redditor -- but be aware that Discord or StackOverflow might be better choices." msgstr "" #: ../../source/faq/help.md:32 msgid "And finally, you can also start a new [discussion on GitHub](https://github.com/ManimCommunity/manim/discussions) if you dislike all other options." msgstr "" #: ../../source/faq/help.md:35 msgid "In all of these channels, please make sure to abide by Manim's {doc}`Code of Conduct ` -- in short, be *excellent* to one another: be friendly and patient, considerate, and respectful." msgstr "" #: ../../source/faq/help.md:41 msgid "What should I do if nobody answers my question?" msgstr "" #: ../../source/faq/help.md:43 msgid "Try and see whether your question can be improved: did you include all relevant information (in case of errors: the full stack trace, the code that you were rendering, and the command you used to run Manim?). In case you used a very long example, is it possible to construct a more minimal version that has the same (faulty) behavior?" msgstr "" #: ../../source/faq/help.md:49 msgid "If you posted in one of our help channels on Discord and your question got buried, you are allowed to ping the `@Manim Helper` role to bring it to the attention of the volunteers who are willing to take a look. Please refrain from pinging the role immediately when asking your question for the first time, this is considered impolite." msgstr "" #: ../../source/faq/help.md:54 msgid "You can also try to post your question to a different channel if you feel that you are not having any success with your initial choice -- but please do not spam your question in all of our communication channels (and in particular for Discord: please don't use multiple help channels at once)." msgstr "" #: ../../source/faq/help.md:59 msgid "In the end, it is as for most open-source projects: our community members are volunteers. If you do not receive a quick answer to your question, it may be because nobody knows the answer, or because your question is not clear enough, or it could be that everyone who can help you with your problem is busy doing other things." msgstr "" #: ../../source/faq/help.md:67 msgid "The library does not behave as documented, or something broke in a new release. What should I do?" msgstr "" #: ../../source/faq/help.md:69 msgid "Sounds like you have found a bug. One of the best ways of contributing to the development of Manim is by reporting it!" msgstr "" #: ../../source/faq/help.md:72 msgid "Check our list of known issues and feature requests [in our GitHub repository](https://github.com/ManimCommunity/manim/issues). If the problem you have found is not listed there yet (use the search function; also check whether there is a corresponding closed issue, it is possible that your problem has already been resolved and will be fixed with the next release), please consider the following steps to submit a new issue." msgstr "" #: ../../source/faq/help.md:80 msgid "If you are unsure whether or not you should file a new issue for some odd behavior that you found, feel free to ask the community developers, preferably in one of our `#manim-dev` channels in [our Discord](https://manim.community/discord/)." msgstr "" #: ../../source/faq/help.md:85 msgid "Make sure you are running the latest released version of Manim, your problem might otherwise already be fixed in a more recent version. Check the {doc}`/changelog` for a full list of changes between Manim releases." msgstr "" #: ../../source/faq/help.md:89 msgid "Choose the correct category for your report when [creating a new issue](https://github.com/ManimCommunity/manim/issues/new/choose). We have dedicated issue templates for *bug reports*, *feature requests*, and *installation issues*. If your report falls into one of these categories, read the issue template carefully! Instructions are given in the `` sections of the text field. If you want to suggest a new feature without concrete implementation details, see {ref}`the instructions given in this answer `." msgstr "" #: ../../source/faq/help.md:98 msgid "For bug reports: prepare a minimal example that can be used to illustrate the issue. Examples with hundreds of lines are very inefficient and tedious to debug. Your problem needs to be reproducible for others, so please make sure to prepare a suitable example." msgstr "" #: ../../source/faq/help.md:103 msgid "This is mentioned in the bug report template as well, but it is very important: if you report that some code raises an error, make sure to include the full terminal output, from the command you used to run the library up to and including the last line with the error message. Read carefully: if the message mentions that there is another relevant log file, include this other file as well!" msgstr "" #: ../../source/faq/help.md:112 msgid "I have an idea for a really cool feature that should be implemented, where should I share my idea?" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/faq/index.pot000066400000000000000000000004001515024150700236220ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/faq/index.rst:4 #: ../../source/faq/index.rst:4 msgid "Table of Contents" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/faq/installation.pot000066400000000000000000000243271515024150700252320ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/faq/installation.md:1 msgid "FAQ: Installation" msgstr "" #: ../../source/faq/installation.md:4 msgid "Why are there different versions of Manim?" msgstr "" #: ../../source/faq/installation.md:6 msgid "Manim was originally created by Grant Sanderson as a personal project and for use in his YouTube channel, [3Blue1Brown](https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw). As his channel gained popularity, many grew to like the style of his animations and wanted to use manim for their own projects. However, as manim was only intended for personal use, it was very difficult for other users to install and use it." msgstr "" #: ../../source/faq/installation.md:13 msgid "In late 2019, Grant started working on faster OpenGL rendering in a new branch, known as the `shaders` branch. In mid-2020, a group of developers forked it into what is now the community edition; this is the version documented on this website. In early 2021, Grant merged the shaders branch back into master, making it the default branch in his repository -- and this is what `manimgl` is. The old version, before merging the `shaders` branch is sometimes referred to as `ManimCairo` and is, at this point, only useful for one singular purpose: rendering Grant's old videos locally on your machine. It is still available in his GitHub repository in form of the `cairo-backend` branch." msgstr "" #: ../../source/faq/installation.md:22 msgid "To summarize:" msgstr "" #: ../../source/faq/installation.md:23 msgid "[**Manim**, or **ManimCE**](https://manim.community) refers to the community maintained version of the library. This is the version documented on this website; the package name on PyPI is [`manim`](https://pypi.org/project/manim/)." msgstr "" #: ../../source/faq/installation.md:26 msgid "[ManimGL](https://github.com/3b1b/manim) is the latest released version of the version of the library developed by Grant \"3b1b\" Sanderson. It has more experimental features and breaking changes between versions are not documented. Check out its documentation [here](https://3b1b.github.io/manim/index.html); on PyPI the package name is [`manimgl`](https://pypi.org/project/manimgl/)." msgstr "" #: ../../source/faq/installation.md:31 msgid "[ManimCairo](https://github.com/3b1b/manim/tree/cairo-backend) is the name that is sometimes used for the old, pre-OpenGL version of `manimgl`. The latest version of it is available [on PyPI as `manimlib`](https://pypi.org/project/manimgl/), but note that if you intend to use it to compile some old project of Grant, you will likely have to install the exact version from the time the project was created from source." msgstr "" #: ../../source/faq/installation.md:40 msgid "Which version should I use?" msgstr "" #: ../../source/faq/installation.md:42 msgid "We recommend the community maintained version especially for beginners. It has been developed to be more stable, better tested and documented (!), and quicker to respond to community contributions. It is also perfectly reasonable to start learning with the community maintained version and then switch to a different version later on." msgstr "" #: ../../source/faq/installation.md:47 msgid "If you do not care so much about documentation or stability, and would like to use the exact same version that Grant is using, then use ManimGL." msgstr "" #: ../../source/faq/installation.md:50 msgid "And as mentioned above, ManimCairo should only be used for (re)rendering old 3Blue1Brown projects (basically 2019 and before)." msgstr "" #: ../../source/faq/installation.md:55 msgid "What are the differences between Manim, ManimGL, ManimCairo? Can I tell for which version a scene was written for?" msgstr "" #: ../../source/faq/installation.md:57 msgid "You can! The thing that usually gives it away is the `import` statement at the top of the file; depending on how the code imports Manim you can tell for which version of the code it was written for:" msgstr "" #: ../../source/faq/installation.md:61 msgid "If the code imports from `manim` (i.e., `from manim import *`, `import manim as mn`, etc.), then the code you are reading is supposed to be run with the community maintained version." msgstr "" #: ../../source/faq/installation.md:63 msgid "If the import reads `import manimlib` (or `from manimlib import *`), you are likely reading a file to be rendered with ManimGL." msgstr "" #: ../../source/faq/installation.md:65 msgid "And if the import reads `from manimlib.imports import *`, or perhaps even `from big_ol_pile_of_manim_imports import *` you are reading a snippet that is supposed to be rendered with an early, or very early version of ManimCairo, respectively." msgstr "" #: ../../source/faq/installation.md:71 msgid "How do I know which version of Manim I have installed?" msgstr "" #: ../../source/faq/installation.md:73 msgid "Assuming you can run `manim` in your terminal and there is some output, check the first line of the text being produced. If you are using the community maintained version, the first line of any output will be `Manim Community `. If it does not say that, you are likely using ManimGL." msgstr "" #: ../../source/faq/installation.md:78 msgid "You can also check the list of packages you have installed: if typing `python` in your terminal spawns the interpreter that corresponds to the Python installation you use (might also be `py`, or `python3`, depending on your operating system), running `python -m pip list` will print a list of all installed packages. Check whether `manim` or `manimgl` appear in that list." msgstr "" #: ../../source/faq/installation.md:84 msgid "Similarly, you can use `python -m pip install ` and `python -m pip uninstall ` to install and uninstall packages from that list, respectively." msgstr "" #: ../../source/faq/installation.md:90 msgid "I am following the video guide X to install Manim, but some step fails. What do I do?" msgstr "" #: ../../source/faq/installation.md:92 msgid "It is only natural that there are many video guides on installing Manim out there, given that Manim is a library used for creating videos. Unfortunately however, (YouTube) videos can't be updated easily (without uploading a new one, that is) when some step in the installation process changes, and so there are many **severely outdated** resources out there." msgstr "" #: ../../source/faq/installation.md:98 msgid "This is why we strongly recommend following our {doc}`written installation guide ` to guide you through the process. In case you prefer using a video guide regardless, please check whether the creator whose guide you have been watching has made a more recent version available, and otherwise please contact them directly. Asking for help in the community will likely lead to being suggested to follow our written guide." msgstr "" #: ../../source/faq/installation.md:107 msgid "Why does ManimPango fail to install when running `pip install manim`?" msgstr "" #: ../../source/faq/installation.md:109 msgid "This most likely means that pip was not able to use our pre-built wheels of the `manimpango` dependency. Let us know (via [Discord](https://www.manim.community/discord/) or by opening a [new issue on GitHub](https://github.com/ManimCommunity/ManimPango/issues/new)) which architecture you would like to see supported, and we'll see what we can do about it." msgstr "" #: ../../source/faq/installation.md:116 msgid "To fix errors when installing `manimpango`, you need to make sure you have all the necessary build requirements. Check out the detailed instructions given in [the BUILDING section](https://github.com/ManimCommunity/ManimPango#BUILDING) of [ManimPango's README](https://github.com/ManimCommunity/ManimPango)." msgstr "" #: ../../source/faq/installation.md:123 msgid "I am using Windows and get the error `X is not recognized as an internal or external command, operable program or batch file`" msgstr "" #: ../../source/faq/installation.md:125 msgid "Regardless of whether `X` says `python` or `manim`, this means that the executable you are trying to run is not located in one of the directories your system is looking for them (specified by the `PATH` variable). Take a look at the instructions {doc}`in the installation guide for Windows `, or [this StackExchange answer](https://superuser.com/questions/143119/how-do-i-add-python-to-the-windows-path/143121#143121) to get help with editing the `PATH` variable manually." msgstr "" #: ../../source/faq/installation.md:132 msgid "If `python` is recognized but not `manim` or `pip`, you can try running commands by prepending `python -m`. That is, `manim` becomes `python -m manim`, and `pip` becomes `python -m pip`." msgstr "" #: ../../source/faq/installation.md:138 msgid "I have tried using Chocolatey (`choco install manimce`) to install Manim, but it failed!" msgstr "" #: ../../source/faq/installation.md:140 msgid "Make sure that you were running the command with administrator permissions, otherwise there can be problems. If this is not the issue, read Chocolatey's output carefully, it should mention a `.log` file containing information why the process failed." msgstr "" #: ../../source/faq/installation.md:145 msgid "You are welcome to take this file (and any other input you feel might be relevant) and submit it to Manim's community to ask for help with your problem. See the {doc}`FAQ on getting help ` for instructions." msgstr "" #: ../../source/faq/installation.md:151 msgid "On Windows, when typing `python` or `python3` the Windows store is opened, can I fix this?" msgstr "" #: ../../source/faq/installation.md:153 msgid "Yes: you can remove these aliases with these steps:" msgstr "" #: ../../source/faq/installation.md:155 msgid "Go to the Windows Setting." msgstr "" #: ../../source/faq/installation.md:156 msgid "Under *Apps and Features* you will find application execution aliases." msgstr "" #: ../../source/faq/installation.md:157 msgid "Within this menu, disable the alias(es) that are causing the issue (`python` and/or `python3`)." msgstr "" #: ../../source/faq/installation.md:162 msgid "I am using Anaconda and get an `ImportError` mentioning that some Symbol is not found." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/faq/internals.pot000066400000000000000000000007321515024150700245220ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/faq/internals.md:1 msgid "Where can I learn more about Manim's internal structure?" msgstr "" #: ../../source/faq/internals.md:3 msgid "Efforts to document the internal structure of Manim is ongoing on our [wiki](https://github.com/ManimCommunity/manim/wiki/Developer-documentation-(WIP))." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/faq/opengl.pot000066400000000000000000000023011515024150700240010ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/faq/opengl.md:1 msgid "FAQ: OpenGL rendering" msgstr "" #: ../../source/faq/opengl.md:3 msgid "Are there any resources on how the OpenGL renderer in the community maintained version can be used?" msgstr "" #: ../../source/faq/opengl.md:5 msgid "Yes. Unfortunately, at this point, the official online documentation does not contain the relevant base classes like `OpenGLMobject` and `OpenGLVMobject` or specific OpenGL classes like `OpenGLSurface`, but documentation for some of them is available in form of docstrings [in the source code](https://github.com/ManimCommunity/manim/tree/main/manim/mobject/opengl)." msgstr "" #: ../../source/faq/opengl.md:11 msgid "Furthermore, [this user guide by *aquabeam*](https://www.aquabeam.me/manim/opengl_guide/) can be helpful to get started using the OpenGL renderer." msgstr "" #: ../../source/faq/opengl.md:16 msgid "I am trying to run an interactive scene with `--renderer=opengl` and `Scene.interactive_embed`, but an error (`sqlite3.ProgrammingError`) is raised. How can I fix this?" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/guides/000077500000000000000000000000001515024150700225065ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/guides/configuration.pot000066400000000000000000000344121515024150700261050ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/guides/configuration.rst:2 msgid "Configuration" msgstr "" #: ../../source/guides/configuration.rst:4 msgid "Manim provides an extensive configuration system that allows it to adapt to many different use cases. There are many configuration options that can be configured at different times during the scene rendering process. Each option can be configured programmatically via `the ManimConfig class`_, at the time of command invocation via `command-line arguments`_, or at the time the library is first imported via `the config files`_." msgstr "" #: ../../source/guides/configuration.rst:11 msgid "The most common, simplest, and recommended way to configure Manim is via the command-line interface (CLI), which is described directly below." msgstr "" #: ../../source/guides/configuration.rst:15 msgid "Command-line arguments" msgstr "" #: ../../source/guides/configuration.rst:17 msgid "By far the most commonly used command in the CLI is the ``render`` command, which is used to render scene(s) to an output file. It is used with the following arguments:" msgstr "" #: ../../source/guides/configuration.rst:24 msgid "However, since Manim defaults to the :code:`render` command whenever no command is specified, the following form is far more common and can be used instead:" msgstr "" #: ../../source/guides/configuration.rst:31 msgid "An example of using the above form is:" msgstr "" #: ../../source/guides/configuration.rst:37 msgid "This asks Manim to search for a Scene class called :code:`SceneOne` inside the file ``file.py`` and render it with medium quality (specified by the ``-qm`` flag)." msgstr "" #: ../../source/guides/configuration.rst:40 msgid "Another frequently used flag is ``-p`` (\"preview\"), which makes manim open the rendered video after it's done rendering." msgstr "" #: ../../source/guides/configuration.rst:43 msgid "The ``-p`` flag does not change any properties of the global ``config`` dict. The ``-p`` flag is only a command-line convenience." msgstr "" #: ../../source/guides/configuration.rst:47 msgid "Advanced examples" msgstr "" #: ../../source/guides/configuration.rst:49 msgid "To render a scene in high quality, but only output the last frame of the scene instead of the whole video, you can execute" msgstr "" #: ../../source/guides/configuration.rst:56 msgid "The following example specifies the output file name (with the :code:`-o` flag), renders only the first ten animations (:code:`-n` flag) with a white background (:code:`-c` flag), and saves the animation as a ``.gif`` instead of as a ``.mp4`` file (``--format=gif`` flag). It uses the default quality and does not try to open the file after it is rendered." msgstr "" #: ../../source/guides/configuration.rst:67 msgid "A list of all CLI flags" msgstr "" #: ../../source/guides/configuration.rst:75 msgid "The ManimConfig class" msgstr "" #: ../../source/guides/configuration.rst:77 msgid "The most direct way of configuring Manim is through the global ``config`` object, which is an instance of :class:`.ManimConfig`. Each property of this class is a config option that can be accessed either with standard attribute syntax or with dict-like syntax:" msgstr "" #: ../../source/guides/configuration.rst:88 msgid "The former is preferred; the latter is provided for backwards compatibility." msgstr "" #: ../../source/guides/configuration.rst:91 msgid "Most classes, including :class:`.Camera`, :class:`.Mobject`, and :class:`.Animation`, read some of their default configuration from the global ``config``." msgstr "" #: ../../source/guides/configuration.rst:103 msgid ":class:`.ManimConfig` is designed to keep internal consistency. For example, setting ``frame_y_radius`` will affect ``frame_height``:" msgstr "" #: ../../source/guides/configuration.rst:114 msgid "The global ``config`` object is meant to be the single source of truth for all config options. All of the other ways of setting config options ultimately change the values of the global ``config`` object." msgstr "" #: ../../source/guides/configuration.rst:118 msgid "The following example illustrates the video resolution chosen for examples rendered in our documentation with a reference frame." msgstr "" #: ../../source/guides/configuration.rst:140 msgid "The config files" msgstr "" #: ../../source/guides/configuration.rst:142 msgid "As the last example shows, executing Manim from the command line may involve using many flags simultaneously. This may become a nuisance if you must execute the same script many times in a short time period, for example, when making small incremental tweaks to your scene script. For this reason, Manim can also be configured using a configuration file. A configuration file is a file ending with the suffix ``.cfg``." msgstr "" #: ../../source/guides/configuration.rst:149 msgid "To use a local configuration file when rendering your scene, you must create a file with the name ``manim.cfg`` in the same directory as your scene code." msgstr "" #: ../../source/guides/configuration.rst:152 msgid "The config file **must** be named ``manim.cfg``. Currently, Manim does not support config files with any other name." msgstr "" #: ../../source/guides/configuration.rst:155 msgid "The config file must start with the section header ``[CLI]``. The configuration options under this header have the same name as the CLI flags and serve the same purpose. Take, for example, the following config file." msgstr "" #: ../../source/guides/configuration.rst:167 msgid "Config files are parsed with the standard python library ``configparser``. In particular, they will ignore any line that starts with a pound symbol ``#``." msgstr "" #: ../../source/guides/configuration.rst:170 msgid "Now, executing the following command" msgstr "" #: ../../source/guides/configuration.rst:176 msgid "is equivalent to executing the following command, provided that ``manim.cfg`` is in the same directory as ," msgstr "" #: ../../source/guides/configuration.rst:183 msgid "The names of the configuration options admissible in config files are exactly the same as the **long names** of the corresponding command- line flags. For example, the ``-c`` and ``--background_color`` flags are interchangeable, but the config file only accepts :code:`background_color` as an admissible option." msgstr "" #: ../../source/guides/configuration.rst:189 msgid "Since config files are meant to replace CLI flags, all CLI flags can be set via a config file. Moreover, any config option can be set via a config file, whether or not it has an associated CLI flag. See the bottom of this document for a list of all CLI flags and config options." msgstr "" #: ../../source/guides/configuration.rst:194 msgid "Manim will look for a ``manim.cfg`` config file in the same directory as the file being rendered, and **not** in the directory of execution. For example," msgstr "" #: ../../source/guides/configuration.rst:201 msgid "will use the config file found in ``path/to/file.py``, if any. It will **not** use the config file found in the current working directory, even if it exists. In this way, the user may keep different config files for different scenes or projects, and execute them with the right configuration from anywhere in the system." msgstr "" #: ../../source/guides/configuration.rst:207 msgid "The file described here is called the **folder-wide** config file because it affects all scene scripts found in the same folder." msgstr "" #: ../../source/guides/configuration.rst:212 msgid "The user config file" msgstr "" #: ../../source/guides/configuration.rst:214 msgid "As explained in the previous section, a :code:`manim.cfg` config file only affects the scene scripts in its same folder. However, the user may also create a special config file that will apply to all scenes rendered by that user. This is referred to as the **user-wide** config file, and it will apply regardless of where Manim is executed from, and regardless of where the scene script is stored." msgstr "" #: ../../source/guides/configuration.rst:221 msgid "The user-wide config file lives in a special folder, depending on the operating system." msgstr "" #: ../../source/guides/configuration.rst:224 msgid "Windows: :code:`UserDirectory`/AppData/Roaming/Manim/manim.cfg" msgstr "" #: ../../source/guides/configuration.rst:225 msgid "MacOS: :code:`UserDirectory`/.config/manim/manim.cfg" msgstr "" #: ../../source/guides/configuration.rst:226 msgid "Linux: :code:`UserDirectory`/.config/manim/manim.cfg" msgstr "" #: ../../source/guides/configuration.rst:228 msgid "Here, :code:`UserDirectory` is the user's home folder." msgstr "" #: ../../source/guides/configuration.rst:231 msgid "A user may have many **folder-wide** config files, one per folder, but only one **user-wide** config file. Different users in the same computer may each have their own user-wide config file." msgstr "" #: ../../source/guides/configuration.rst:235 msgid "Do not store scene scripts in the same folder as the user-wide config file. In this case, the behavior is undefined." msgstr "" #: ../../source/guides/configuration.rst:238 msgid "Whenever you use Manim from anywhere in the system, Manim will look for a user-wide config file and read its configuration." msgstr "" #: ../../source/guides/configuration.rst:243 msgid "Cascading config files" msgstr "" #: ../../source/guides/configuration.rst:245 msgid "What happens if you execute Manim and it finds both a folder-wide config file and a user-wide config file? Manim will read both files, but if they are incompatible, **the folder-wide file takes precedence**." msgstr "" #: ../../source/guides/configuration.rst:249 msgid "For example, take the following user-wide config file" msgstr "" #: ../../source/guides/configuration.rst:259 msgid "and the following folder-wide file" msgstr "" #: ../../source/guides/configuration.rst:267 msgid "Then, executing :code:`manim SceneName` will be equivalent to not using any config files and executing" msgstr "" #: ../../source/guides/configuration.rst:274 msgid "Any command-line flags have precedence over any config file. For example, using the previous two config files and executing :code:`manim -c RED SceneName` is equivalent to not using any config files and executing" msgstr "" #: ../../source/guides/configuration.rst:283 msgid "There is also a **library-wide** config file that determines Manim's default behavior and applies to every user of the library. It has the least precedence, so any config options in the user-wide and any folder-wide files will override the library-wide file. This is referred to as the *cascading* config file system." msgstr "" #: ../../source/guides/configuration.rst:289 msgid "**The user should not try to modify the library-wide file**. Contributors should receive explicit confirmation from the core developer team before modifying it." msgstr "" #: ../../source/guides/configuration.rst:295 msgid "Order of operations" msgstr "" #: ../../source/guides/configuration.rst:304 msgid "With so many different ways of configuring Manim, it can be difficult to know when each config option is being set. In fact, this will depend on how Manim is being used." msgstr "" #: ../../source/guides/configuration.rst:308 msgid "If Manim is imported from a module, then the configuration system will follow these steps:" msgstr "" #: ../../source/guides/configuration.rst:311 msgid "The library-wide config file is loaded." msgstr "" #: ../../source/guides/configuration.rst:312 msgid "The user-wide and folder-wide files are loaded if they exist." msgstr "" #: ../../source/guides/configuration.rst:313 msgid "All files found in the previous two steps are parsed in a single :class:`ConfigParser` object, called ``parser``. This is where *cascading* happens." msgstr "" #: ../../source/guides/configuration.rst:316 msgid ":class:`logging.Logger` is instantiated to create Manim's global ``logger`` object. It is configured using the \"logger\" section of the parser, i.e. ``parser['logger']``." msgstr "" #: ../../source/guides/configuration.rst:319 msgid ":class:`ManimConfig` is instantiated to create the global ``config`` object." msgstr "" #: ../../source/guides/configuration.rst:320 msgid "The ``parser`` from step 3 is fed into the ``config`` from step 5 via :meth:`ManimConfig.digest_parser`." msgstr "" #: ../../source/guides/configuration.rst:322 msgid "Both ``logger`` and ``config`` are exposed to the user." msgstr "" #: ../../source/guides/configuration.rst:324 msgid "If Manim is being invoked from the command line, all of the previous steps happen, and are complemented by:" msgstr "" #: ../../source/guides/configuration.rst:327 msgid "The CLI flags are parsed and fed into ``config`` via :meth:`~ManimConfig.digest_args`." msgstr "" #: ../../source/guides/configuration.rst:329 msgid "If the ``--config_file`` flag was used, a new :class:`ConfigParser` object is created with the contents of the library-wide file, the user-wide file if it exists, and the file passed via ``--config_file``. In this case, the folder-wide file, if it exists, is ignored." msgstr "" #: ../../source/guides/configuration.rst:333 msgid "The new parser is fed into ``config``." msgstr "" #: ../../source/guides/configuration.rst:334 msgid "The rest of the CLI flags are processed." msgstr "" #: ../../source/guides/configuration.rst:336 msgid "To summarize, the order of precedence for configuration options, from lowest to highest precedence is:" msgstr "" #: ../../source/guides/configuration.rst:339 msgid "Library-wide config file," msgstr "" #: ../../source/guides/configuration.rst:340 msgid "user-wide config file, if it exists," msgstr "" #: ../../source/guides/configuration.rst:341 msgid "folder-wide config file, if it exists OR custom config file, if passed via ``--config_file``," msgstr "" #: ../../source/guides/configuration.rst:343 msgid "other CLI flags, and" msgstr "" #: ../../source/guides/configuration.rst:344 msgid "any programmatic changes made after the config system is set." msgstr "" #: ../../source/guides/configuration.rst:348 msgid "A list of all config options" msgstr "" #: ../../source/guides/configuration.rst:369 msgid "Accessing CLI command options" msgstr "" #: ../../source/guides/configuration.rst:371 msgid "Entering ``manim``, or ``manim --help``, will open the main help page." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/guides/deep_dive.pot000066400000000000000000001561741515024150700251740ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/guides/deep_dive.rst:2 msgid "A deep dive into Manim's internals" msgstr "" #: ../../source/guides/deep_dive.rst:4 msgid "**Author:** `Benjamin Hackl `__" msgstr "" #: ../../source/guides/deep_dive.rst:6 msgid "Disclaimer" msgstr "" #: ../../source/guides/deep_dive.rst:8 msgid "This guide reflects the state of the library as of version ``v0.16.0`` and primarily treats the Cairo renderer. The situation in the latest version of Manim might be different; in case of substantial deviations we will add a note below." msgstr "" #: ../../source/guides/deep_dive.rst:14 msgid "Introduction" msgstr "" #: ../../source/guides/deep_dive.rst:16 msgid "Manim can be a wonderful library, if it behaves the way you would like it to, and/or the way you expect it to. Unfortunately, this is not always the case (as you probably know if you have played with some manimations yourself already). To understand where things *go wrong*, digging through the library's source code is sometimes the only option -- but in order to do that, you need to know where to start digging." msgstr "" #: ../../source/guides/deep_dive.rst:23 msgid "This article is intended as some sort of life line through the render process. We aim to give an appropriate amount of detail describing what happens when Manim reads your scene code and produces the corresponding animation. Throughout this article, we will focus on the following toy example::" msgstr "" #: ../../source/guides/deep_dive.rst:43 msgid "Before we go into details or even look at the rendered output of this scene, let us first describe verbally what happens in this *manimation*. In the first three lines of the ``construct`` method, a :class:`.Square` and a :class:`.Circle` are initialized, then the square is added to the scene. The first frame of the rendered output should thus show an orange square." msgstr "" #: ../../source/guides/deep_dive.rst:49 msgid "Then the actual animations happen: the square first transforms into a circle, then a :class:`.Dot` is created (Where do you guess the dot is located when it is first added to the scene? Answering this already requires detailed knowledge about the render process.). The dot has an updater attached to it, and as the circle moves right, the dot moves with it. In the end, all mobjects are faded out." msgstr "" #: ../../source/guides/deep_dive.rst:56 msgid "Actually rendering the code yields the following video:" msgstr "" #: ../../source/guides/deep_dive.rst:75 msgid "For this example, the output (fortunately) coincides with our expectations." msgstr "" #: ../../source/guides/deep_dive.rst:78 msgid "Overview" msgstr "" #: ../../source/guides/deep_dive.rst:80 msgid "Because there is a lot of information in this article, here is a brief overview discussing the contents of the following chapters on a very high level." msgstr "" #: ../../source/guides/deep_dive.rst:83 msgid "`Preliminaries`_: In this chapter we unravel all the steps that take place to prepare a scene for rendering; right until the point where the user-overridden ``construct`` method is ran. This includes a brief discussion on using Manim's CLI versus other means of rendering (e.g., via Jupyter notebooks, or in your Python script by calling the :meth:`.Scene.render` method yourself)." msgstr "" #: ../../source/guides/deep_dive.rst:88 msgid "`Mobject Initialization`_: For the second chapter we dive into creating and handling Mobjects, the basic elements that should be displayed in our scene. We discuss the :class:`.Mobject` base class, how there are essentially three different types of Mobjects, and then discuss the most important of them, vectorized Mobjects. In particular, we describe the internal point data structure that governs how the mechanism responsible for drawing the vectorized Mobject to the screen sets the corresponding Bรฉzier curves. We conclude the chapter with a tour into :meth:`.Scene.add`, the bookkeeping mechanism controlling which mobjects should be rendered." msgstr "" #: ../../source/guides/deep_dive.rst:97 msgid "`Animations and the Render Loop`_: And finally, in the last chapter we walk through the instantiation of :class:`.Animation` objects (the blueprints that hold information on how Mobjects should be modified when the render loop runs), followed by a investigation of the infamous :meth:`.Scene.play` call. We will see that there are three relevant parts in a :meth:`.Scene.play` call; a part in which the passed animations and keyword arguments are processed and prepared, followed by the actual \"render loop\" in which the library steps through a time line and renders frame by frame. The final part does some post-processing to save a short video segment (\"partial movie file\") and cleanup for the next call to :meth:`.Scene.play`. In the end, after all of :meth:`.Scene.construct` has been run, the library combines the partial movie files to one video." msgstr "" #: ../../source/guides/deep_dive.rst:110 msgid "And with that, let us get *in medias res*." msgstr "" #: ../../source/guides/deep_dive.rst:113 msgid "Preliminaries" msgstr "" #: ../../source/guides/deep_dive.rst:116 msgid "Importing the library" msgstr "" #: ../../source/guides/deep_dive.rst:118 msgid "Independent of how exactly you are telling your system to render the scene, i.e., whether you run ``manim -qm -p file_name.py ToyExample``, or whether you are rendering the scene directly from the Python script via a snippet like" msgstr "" #: ../../source/guides/deep_dive.rst:129 msgid "or whether you are rendering the code in a Jupyter notebook, you are still telling your python interpreter to import the library. The usual pattern used to do this is" msgstr "" #: ../../source/guides/deep_dive.rst:136 msgid "which (while being a debatable strategy in general) imports a lot of classes and functions shipped with the library and makes them available in your global name space. I explicitly avoided stating that it imports **all** classes and functions of the library, because it does not do that: Manim makes use of the practice described in `Section 6.4.1 of the Python tutorial `__, and all module members that should be exposed to the user upon running the ``*``-import are explicitly declared in the ``__all__`` variable of the module." msgstr "" #: ../../source/guides/deep_dive.rst:144 msgid "Manim also uses this strategy internally: taking a peek at the file that is run when the import is called, ``__init__.py`` (see `here `__), you will notice that most of the code in that module is concerned with importing members from various different submodules, again using ``*``-imports." msgstr "" #: ../../source/guides/deep_dive.rst:152 msgid "If you would ever contribute a new submodule to Manim, the main ``__init__.py`` is where it would have to be listed in order to make its members accessible to users after importing the library." msgstr "" #: ../../source/guides/deep_dive.rst:156 msgid "In that file, there is one particular import at the beginning of the file however, namely::" msgstr "" #: ../../source/guides/deep_dive.rst:161 msgid "This initializes Manim's global configuration system, which is used in various places throughout the library. After the library runs this line, the current configuration options are set. The code in there takes care of reading the options in your ``.cfg`` files (all users have at least the global one that is shipped with the library) as well as correctly handling command line arguments (if you used the CLI to render)." msgstr "" #: ../../source/guides/deep_dive.rst:167 msgid "You can read more about the config system in the :doc:`corresponding thematic guide `, and if you are interested in learning more about the internals of the configuration system and how it is initialized, follow the code flow starting in `the config module's init file `__." msgstr "" #: ../../source/guides/deep_dive.rst:173 msgid "Now that the library is imported, we can turn our attention to the next step: reading your scene code (which is not particularly exciting, Python just creates a new class ``ToyExample`` based on our code; Manim is virtually not involved in that step, with the exception that ``ToyExample`` inherits from ``Scene``)." msgstr "" #: ../../source/guides/deep_dive.rst:178 msgid "However, with the ``ToyExample`` class created and ready to go, there is a new excellent question to answer: how is the code in our ``construct`` method actually executed?" msgstr "" #: ../../source/guides/deep_dive.rst:183 msgid "Scene instantiation and rendering" msgstr "" #: ../../source/guides/deep_dive.rst:185 msgid "The answer to this question depends on how exactly you are running the code. To make things a bit clearer, let us first consider the case that you have created a file ``toy_example.py`` which looks like this::" msgstr "" #: ../../source/guides/deep_dive.rst:208 msgid "With such a file, the desired scene is rendered by simply running this Python script via ``python toy_example.py``. Then, as described above, the library is imported and Python has read and defined the ``ToyExample`` class (but, read carefully: *no instance of this class has been created yet*)." msgstr "" #: ../../source/guides/deep_dive.rst:213 msgid "At this point, the interpreter is about to enter the ``tempconfig`` context manager. Even if you have not seen Manim's ``tempconfig`` before, it's name already suggests what it does: it creates a copy of the current state of the configuration, applies the changes to the key-value pairs in the passed dictionary, and upon leaving the context the original version of the configuration is restored. TL;DR: it provides a fancy way of temporarily setting configuration options." msgstr "" #: ../../source/guides/deep_dive.rst:221 msgid "Inside the context manager, two things happen: an actual ``ToyExample``-scene object is instantiated, and the ``render`` method is called. Every way of using Manim ultimately does something along of these lines, the library always instantiates the scene object and then calls its ``render`` method. To illustrate that this really is the case, let us briefly look at the two most common ways of rendering scenes:" msgstr "" #: ../../source/guides/deep_dive.rst:228 msgid "**Command Line Interface.** When using the CLI and running the command ``manim -qm -p toy_example.py ToyExample`` in your terminal, the actual entry point is Manim's ``__main__.py`` file (located `here `__. Manim uses `Click `__ to implement the command line interface, and the corresponding code is located in Manim's ``cli`` module (https://github.com/ManimCommunity/manim/tree/main/manim/cli). The corresponding code creating the scene class and calling its render method is located `here `__." msgstr "" #: ../../source/guides/deep_dive.rst:238 msgid "**Jupyter notebooks.** In Jupyter notebooks, the communication with the library is handled by the ``%%manim`` magic command, which is implemented in the ``manim.utils.ipython_magic`` module. There is :meth:`some documentation <.ManimMagic.manim>` available for the magic command, and the code creating the scene class and calling its render method is located `here `__." msgstr "" #: ../../source/guides/deep_dive.rst:246 msgid "Now that we know that either way, a :class:`.Scene` object is created, let us investigate what Manim does when that happens. When instantiating our scene object" msgstr "" #: ../../source/guides/deep_dive.rst:253 msgid "the ``Scene.__init__`` method is called, given that we did not implement our own initialization method. Inspecting the corresponding code (see `here `__) reveals that ``Scene.__init__`` first sets several attributes of the scene objects that do not depend on any configuration options set in ``config``. Then the scene inspects the value of ``config.renderer``, and based on its value, either instantiates a ``CairoRenderer`` or an ``OpenGLRenderer`` object and assigns it to its ``renderer`` attribute." msgstr "" #: ../../source/guides/deep_dive.rst:261 msgid "The scene then asks its renderer to initialize the scene by calling" msgstr "" #: ../../source/guides/deep_dive.rst:267 msgid "Inspecting both the default Cairo renderer and the OpenGL renderer shows that the ``init_scene`` method effectively makes the renderer instantiate a :class:`.SceneFileWriter` object, which basically is Manim's interface to ``ffmpeg`` and actually writes the movie file. The Cairo renderer (see the implementation `here `__) does not require any further initialization. The OpenGL renderer does some additional setup to enable the realtime rendering preview window, which we do not go into detail further here." msgstr "" #: ../../source/guides/deep_dive.rst:276 msgid "Currently, there is a lot of interplay between a scene and its renderer. This is a flaw in Manim's current architecture, and we are working on reducing this interdependency to achieve a less convoluted code flow." msgstr "" #: ../../source/guides/deep_dive.rst:280 msgid "After the renderer has been instantiated and initialized its file writer, the scene populates further initial attributes (notable mention: the ``mobjects`` attribute which keeps track of the mobjects that have been added to the scene). It is then done with its instantiation and ready to be rendered." msgstr "" #: ../../source/guides/deep_dive.rst:285 msgid "The rest of this article is concerned with the last line in our toy example script::" msgstr "" #: ../../source/guides/deep_dive.rst:289 msgid "This is where the actual magic happens." msgstr "" #: ../../source/guides/deep_dive.rst:291 msgid "Inspecting the `implementation of the render method `__ reveals that there are several hooks that can be used for pre- or postprocessing a scene. Unsurprisingly, :meth:`.Scene.render` describes the full *render cycle* of a scene. During this life cycle, there are three custom methods whose base implementation is empty and that can be overwritten to suit your purposes. In the order they are called, these customizable methods are:" msgstr "" #: ../../source/guides/deep_dive.rst:298 msgid ":meth:`.Scene.setup`, which is intended for preparing and, well, *setting up* the scene for your animation (e.g., adding initial mobjects, assigning custom attributes to your scene class, etc.)," msgstr "" #: ../../source/guides/deep_dive.rst:301 msgid ":meth:`.Scene.construct`, which is the *script* for your screen play and contains programmatic descriptions of your animations, and" msgstr "" #: ../../source/guides/deep_dive.rst:303 msgid ":meth:`.Scene.tear_down`, which is intended for any operations you might want to run on the scene after the last frame has already been rendered (for example, this could run some code that generates a custom thumbnail for the video based on the state of the objects in the scene -- this hook is more relevant for situations where Manim is used within other Python scripts)." msgstr "" #: ../../source/guides/deep_dive.rst:310 msgid "After these three methods are run, the animations have been fully rendered, and Manim calls :meth:`.CairoRenderer.scene_finished` to gracefully complete the rendering process. This checks whether any animations have been played -- and if so, it tells the :class:`.SceneFileWriter` to close the pipe to ``ffmpeg``. If not, Manim assumes that a static image should be output which it then renders using the same strategy by calling the render loop (see below) once." msgstr "" #: ../../source/guides/deep_dive.rst:318 msgid "**Back in our toy example,** the call to :meth:`.Scene.render` first triggers :meth:`.Scene.setup` (which only consists of ``pass``), followed by a call of :meth:`.Scene.construct`. At this point, our *animation script* is run, starting with the initialization of ``orange_square``." msgstr "" #: ../../source/guides/deep_dive.rst:325 msgid "Mobject Initialization" msgstr "" #: ../../source/guides/deep_dive.rst:327 msgid "Mobjects are, in a nutshell, the Python objects that represent all the *things* we want to display in our scene. Before we follow our debugger into the depths of mobject initialization code, it makes sense to discuss Manim's different types of Mobjects and their basic data structure." msgstr "" #: ../../source/guides/deep_dive.rst:334 msgid "What even is a Mobject?" msgstr "" #: ../../source/guides/deep_dive.rst:336 msgid ":class:`.Mobject` stands for *mathematical object* or *Manim object* (depends on who you ask ๐Ÿ˜„). The Python class :class:`.Mobject` is the base class for all objects that should be displayed on screen. Looking at the `initialization method `__ of :class:`.Mobject`, you will find that not too much happens in there:" msgstr "" #: ../../source/guides/deep_dive.rst:343 msgid "some initial attribute values are assigned, like ``name`` (which makes the render logs mention the name of the mobject instead of its type), ``submobjects`` (initially an empty list), ``color``, and some others." msgstr "" #: ../../source/guides/deep_dive.rst:346 msgid "Then, two methods related to *points* are called: ``reset_points`` followed by ``generate_points``," msgstr "" #: ../../source/guides/deep_dive.rst:348 msgid "and finally, ``init_colors`` is called." msgstr "" #: ../../source/guides/deep_dive.rst:350 msgid "Digging deeper, you will find that :meth:`.Mobject.reset_points` simply sets the ``points`` attribute of the mobject to an empty NumPy vector, while the other two methods, :meth:`.Mobject.generate_points` and :meth:`.Mobject.init_colors` are just implemented as ``pass``." msgstr "" #: ../../source/guides/deep_dive.rst:355 msgid "This makes sense: :class:`.Mobject` is not supposed to be used as an *actual* object that is displayed on screen; in fact the camera (which we will discuss later in more detail; it is the class that is, for the Cairo renderer, responsible for \"taking a picture\" of the current scene) does not process \"pure\" :class:`Mobjects <.Mobject>` in any way, they *cannot* even appear in the rendered output." msgstr "" #: ../../source/guides/deep_dive.rst:362 msgid "This is where different types of mobjects come into play. Roughly speaking, the Cairo renderer setup knows three different types of mobjects that can be rendered:" msgstr "" #: ../../source/guides/deep_dive.rst:366 msgid ":class:`.ImageMobject`, which represent images that you can display in your scene," msgstr "" #: ../../source/guides/deep_dive.rst:368 msgid ":class:`.PMobject`, which are very special mobjects used to represent point clouds; we will not discuss them further in this guide," msgstr "" #: ../../source/guides/deep_dive.rst:370 msgid ":class:`.VMobject`, which are *vectorized mobjects*, that is, mobjects that consist of points that are connected via curves. These are pretty much everywhere, and we will discuss them in detail in the next section." msgstr "" #: ../../source/guides/deep_dive.rst:375 msgid "... and what are VMobjects?" msgstr "" #: ../../source/guides/deep_dive.rst:377 msgid "As just mentioned, :class:`VMobjects <.VMobject>` represent vectorized mobjects. To render a :class:`.VMobject`, the camera looks at the ``points`` attribute of a :class:`.VMobject` and divides it into sets of four points each. Each of these sets is then used to construct a cubic Bรฉzier curve with the first and last entry describing the end points of the curve (\"anchors\"), and the second and third entry describing the control points in between (\"handles\")." msgstr "" #: ../../source/guides/deep_dive.rst:386 msgid "To learn more about Bรฉzier curves, take a look at the excellent online textbook `A Primer on Bรฉzier curves `__ by `Pomax `__ -- there is an playground representing cubic Bรฉzier curves `in ยง1 `__, the red and yellow points are \"anchors\", and the green and blue points are \"handles\"." msgstr "" #: ../../source/guides/deep_dive.rst:393 msgid "In contrast to :class:`.Mobject`, :class:`.VMobject` can be displayed on screen (even though, technically, it is still considered a base class). To illustrate how points are processed, consider the following short example of a :class:`.VMobject` with 8 points (and thus made out of 8/4 = 2 cubic Bรฉzier curves). The resulting :class:`.VMobject` is drawn in green. The handles are drawn as red dots with a line to their closest anchor." msgstr "" #: ../../source/guides/deep_dive.rst:433 msgid "Manually setting the points of your :class:`.VMobject` is usually discouraged; there are specialized methods that can take care of that for you -- but it might be relevant when implementing your own, custom :class:`.VMobject`." msgstr "" #: ../../source/guides/deep_dive.rst:441 msgid "Squares and Circles: back to our Toy Example" msgstr "" #: ../../source/guides/deep_dive.rst:443 msgid "With a basic understanding of different types of mobjects, and an idea of how vectorized mobjects are built we can now come back to our toy example and the execution of the :meth:`.Scene.construct` method. In the first two lines of our animation script, the ``orange_square`` and the ``blue_circle`` are initialized." msgstr "" #: ../../source/guides/deep_dive.rst:450 msgid "When creating the orange square by running" msgstr "" #: ../../source/guides/deep_dive.rst:456 msgid "the initialization method of :class:`.Square`, ``Square.__init__``, is called. `Looking at the implementation `__, we can see that the ``side_length`` attribute of the square is set, and then" msgstr "" #: ../../source/guides/deep_dive.rst:466 msgid "is called. This ``super`` call is the Python way of calling the initialization function of the parent class. As :class:`.Square` inherits from :class:`.Rectangle`, the next method called is ``Rectangle.__init__``. There, only the first three lines are really relevant for us::" msgstr "" #: ../../source/guides/deep_dive.rst:476 msgid "First, the initialization function of the parent class of :class:`.Rectangle` -- :class:`.Polygon` -- is called. The four positional arguments passed are the four corners of the polygon: ``UR`` is up right (and equal to ``UP + RIGHT``), ``UL`` is up left (and equal to ``UP + LEFT``), and so forth. Before we follow our debugger deeper, let us observe what happens with the constructed polygon: the remaining two lines stretch the polygon to fit the specified width and height such that a rectangle with the desired measurements is created." msgstr "" #: ../../source/guides/deep_dive.rst:486 msgid "The initialization function of :class:`.Polygon` is particularly simple, it only calls the initialization function of its parent class, :class:`.Polygram`. There, we have almost reached the end of the chain: :class:`.Polygram` inherits from :class:`.VMobject`, whose initialization function mainly sets the values of some attributes (quite similar to ``Mobject.__init__``, but more specific to the Bรฉzier curves that make up the mobject)." msgstr "" #: ../../source/guides/deep_dive.rst:494 msgid "After calling the initialization function of :class:`.VMobject`, the constructor of :class:`.Polygram` also does something somewhat odd: it sets the points (which, you might remember above, should actually be set in a corresponding ``generate_points`` method of :class:`.Polygram`)." msgstr "" #: ../../source/guides/deep_dive.rst:501 msgid "In several instances, the implementation of mobjects does not really stick to all aspects of Manim's interface. This is unfortunate, and increasing consistency is something that we actively work on. Help is welcome!" msgstr "" #: ../../source/guides/deep_dive.rst:506 msgid "Without going too much into detail, :class:`.Polygram` sets its ``points`` attribute via :meth:`.VMobject.start_new_path`, :meth:`.VMobject.add_points_as_corners`, which take care of setting the quadruples of anchors and handles appropriately. After the points are set, Python continues to process the call stack until it reaches the method that was first called; the initialization method of :class:`.Square`. After this, the square is initialized and assigned to the ``orange_square`` variable." msgstr "" #: ../../source/guides/deep_dive.rst:516 msgid "The initialization of ``blue_circle`` is similar to the one of ``orange_square``, with the main difference being that the inheritance chain of :class:`.Circle` is different. Let us briefly follow the trace of the debugger:" msgstr "" #: ../../source/guides/deep_dive.rst:521 msgid "The implementation of :meth:`.Circle.__init__` immediately calls the initialization method of :class:`.Arc`, as a circle in Manim is simply an arc with an angle of :math:`\\tau = 2\\pi`. When initializing the arc, some basic attributes are set (like ``Arc.radius``, ``Arc.arc_center``, ``Arc.start_angle``, and ``Arc.angle``), and then the initialization method of its parent class, :class:`.TipableVMobject`, is called (which is a rather abstract base class for mobjects which a arrow tip can be attached to). Note that in contrast to :class:`.Polygram`, this class does **not** preemptively generate the points of the circle." msgstr "" #: ../../source/guides/deep_dive.rst:532 msgid "After that, things are less exciting: :class:`.TipableVMobject` again sets some attributes relevant for adding arrow tips, and afterwards passes to the initialization method of :class:`.VMobject`. From there, :class:`.Mobject` is initialized and :meth:`.Mobject.generate_points` is called, which actually runs the method implemented in :meth:`.Arc.generate_points`." msgstr "" #: ../../source/guides/deep_dive.rst:539 msgid "After both our ``orange_square`` and the ``blue_circle`` are initialized, the square is actually added to the scene. The :meth:`.Scene.add` method is actually doing a few interesting things, so it is worth to dig a bit deeper in the next section." msgstr "" #: ../../source/guides/deep_dive.rst:546 msgid "Adding Mobjects to the Scene" msgstr "" #: ../../source/guides/deep_dive.rst:548 msgid "The code in our ``construct`` method that is run next is" msgstr "" #: ../../source/guides/deep_dive.rst:554 msgid "From a high-level point of view, :meth:`.Scene.add` adds the ``orange_square`` to the list of mobjects that should be rendered, which is stored in the ``mobjects`` attribute of the scene. However, it does so in a very careful way to avoid the situation that a mobject is being added to the scene more than once. At a first glance, this sounds like a simple task -- the problem is that ``Scene.mobjects`` is not a \"flat\" list of mobjects, but a list of mobjects which might contain mobjects themselves, and so on." msgstr "" #: ../../source/guides/deep_dive.rst:563 msgid "Stepping through the code in :meth:`.Scene.add`, we see that first it is checked whether we are currently using the OpenGL renderer (which we are not) -- adding mobjects to the scene works slightly different (and actually easier!) for the OpenGL renderer. Then, the code branch for the Cairo renderer is entered and the list of so-called foreground mobjects (which are rendered on top of all other mobjects) is added to the list of passed mobjects. This is to ensure that the foreground mobjects will stay above of the other mobjects, even after adding the new ones. In our case, the list of foreground mobjects is actually empty, and nothing changes." msgstr "" #: ../../source/guides/deep_dive.rst:574 msgid "Next, :meth:`.Scene.restructure_mobjects` is called with the list of mobjects to be added as the ``to_remove`` argument, which might sound odd at first. Practically, this ensures that mobjects are not added twice, as mentioned above: if they were present in the scene ``Scene.mobjects`` list before (even if they were contained as a child of some other mobject), they are first removed from the list. The way :meth:`.Scene.restrucutre_mobjects` works is rather aggressive: It always operates on a given list of mobjects; in the ``add`` method two different lists occur: the default one, ``Scene.mobjects`` (no extra keyword argument is passed), and ``Scene.moving_mobjects`` (which we will discuss later in more detail). It iterates through all of the members of the list, and checks whether any of the mobjects passed in ``to_remove`` are contained as children (in any nesting level). If so, **their parent mobject is deconstructed** and their siblings are inserted directly one level higher. Consider the following example::" msgstr "" #: ../../source/guides/deep_dive.rst:604 msgid "Note that the group is disbanded and the circle moves into the root layer of mobjects in ``test_scene.mobjects``." msgstr "" #: ../../source/guides/deep_dive.rst:607 msgid "After the mobject list is \"restructured\", the mobject to be added are simply appended to ``Scene.mobjects``. In our toy example, the ``Scene.mobjects`` list is actually empty, so the ``restructure_mobjects`` method does not actually do anything. The ``orange_square`` is simply added to ``Scene.mobjects``, and as the aforementioned ``Scene.moving_mobjects`` list is, at this point, also still empty, nothing happens and :meth:`.Scene.add` returns." msgstr "" #: ../../source/guides/deep_dive.rst:615 msgid "We will hear more about the ``moving_mobject`` list when we discuss the render loop. Before we do that, let us look at the next line of code in our toy example, which includes the initialization of an animation class, ::" msgstr "" #: ../../source/guides/deep_dive.rst:623 msgid "Hence it is time to talk about :class:`.Animation`." msgstr "" #: ../../source/guides/deep_dive.rst:627 msgid "Animations and the Render Loop" msgstr "" #: ../../source/guides/deep_dive.rst:630 msgid "Initializing animations" msgstr "" #: ../../source/guides/deep_dive.rst:632 msgid "Before we follow the trace of the debugger, let us briefly discuss the general structure of the (abstract) base class :class:`.Animation`. An animation object holds all the information necessary for the renderer to generate the corresponding frames. Animations (in the sense of animation objects) in Manim are *always* tied to a specific mobject; even in the case of :class:`.AnimationGroup` (which you should actually think of as an animation on a group of mobjects rather than a group of animations). Moreover, except for in a particular special case, the run time of animations is also fixed and known beforehand." msgstr "" #: ../../source/guides/deep_dive.rst:642 msgid "The initialization of animations actually is not very exciting, :meth:`.Animation.__init__` merely sets some attributes derived from the passed keyword arguments and additionally ensures that the ``Animation.starting_mobject`` and ``Animation.mobject`` attributes are populated. Once the animation is played, the ``starting_mobject`` attribute holds an unmodified copy of the mobject the animation is attached to; during the initialization it is set to a placeholder mobject. The ``mobject`` attribute is set to the mobject the animation is attached to." msgstr "" #: ../../source/guides/deep_dive.rst:652 msgid "Animations have a few special methods which are called during the render loop:" msgstr "" #: ../../source/guides/deep_dive.rst:655 msgid ":meth:`.Animation.begin`, which is called (as hinted by its name) at the beginning of every animation, so before the first frame is rendered. In it, all the required setup for the animation happens." msgstr "" #: ../../source/guides/deep_dive.rst:658 msgid ":meth:`.Animation.finish` is the counterpart to the ``begin`` method which is called at the end of the life cycle of the animation (after the last frame has been rendered)." msgstr "" #: ../../source/guides/deep_dive.rst:661 msgid ":meth:`.Animation.interpolate` is the method that updates the mobject attached to the animation to the corresponding animation completion percentage. For example, if in the render loop, ``some_animation.interpolate(0.5)`` is called, the attached mobject will be updated to the state where 50% of the animation are completed." msgstr "" #: ../../source/guides/deep_dive.rst:667 msgid "We will discuss details about these and some further animation methods once we walk through the actual render loop. For now, we continue with our toy example and the code that is run when initializing the :class:`.ReplacementTransform` animation." msgstr "" #: ../../source/guides/deep_dive.rst:672 msgid "The initialization method of :class:`.ReplacementTransform` only consists of a call to the constructor of its parent class, :class:`.Transform`, with the additional keyword argument ``replace_mobject_with_target_in_scene`` set to ``True``. :class:`.Transform` then sets attributes that control how the points of the starting mobject are deformed into the points of the target mobject, and then passes on to the initialization method of :class:`.Animation`. Other basic properties of the animation (like its ``run_time``, the ``rate_func``, etc.) are processed there -- and then the animation object is fully initialized and ready to be played." msgstr "" #: ../../source/guides/deep_dive.rst:685 msgid "The ``play`` call: preparing to enter Manim's render loop" msgstr "" #: ../../source/guides/deep_dive.rst:687 msgid "We are finally there, the render loop is in our reach. Let us walk through the code that is run when :meth:`.Scene.play` is called." msgstr "" #: ../../source/guides/deep_dive.rst:692 msgid "Recall that this article is specifically about the Cairo renderer. Up to here, things were more or less the same for the OpenGL renderer as well; while some base mobjects might be different, the control flow and lifecycle of mobjects is still more or less the same. There are more substantial differences when it comes to the rendering loop." msgstr "" #: ../../source/guides/deep_dive.rst:698 msgid "As you will see when inspecting the method, :meth:`.Scene.play` almost immediately passes over to the ``play`` method of the renderer, in our case :class:`.CairoRenderer.play`. The one thing :meth:`.Scene.play` takes care of is the management of subcaptions that you might have passed to it (see the the documentation of :meth:`.Scene.play` and :meth:`.Scene.add_subcaption` for more information)." msgstr "" #: ../../source/guides/deep_dive.rst:707 msgid "As has been said before, the communication between scene and renderer is not in a very clean state at this point, so the following paragraphs might be confusing if you don't run a debugger and step through the code yourself a bit." msgstr "" #: ../../source/guides/deep_dive.rst:712 msgid "Inside :meth:`.CairoRenderer.play`, the renderer first checks whether it may skip rendering of the current play call. This might happen, for example, when ``-s`` is passed to the CLI (i.e., only the last frame should be rendered), or when the ``-n`` flag is passed and the current play call is outside of the specified render bounds. The \"skipping status\" is updated in form of the call to :meth:`.CairoRenderer.update_skipping_status`." msgstr "" #: ../../source/guides/deep_dive.rst:719 msgid "Next, the renderer asks the scene to process the animations in the play call so that renderer obtains all of the information it needs. To be more concrete, :meth:`.Scene.compile_animation_data` is called, which then takes care of several things:" msgstr "" #: ../../source/guides/deep_dive.rst:724 msgid "The method processes all animations and the keyword arguments passed to the initial :meth:`.Scene.play` call. In particular, this means that it makes sure all arguments passed to the play call are actually animations (or ``.animate`` syntax calls, which are also assembled to be actual :class:`.Animation`-objects at that point). It also propagates any animation-related keyword arguments (like ``run_time``, or ``rate_func``) passed to :class:`.Scene.play` to each individual animation. The processed animations are then stored in the ``animations`` attribute of the scene (which the renderer later reads...)." msgstr "" #: ../../source/guides/deep_dive.rst:733 msgid "It adds all mobjects to which the animations that are played are bound to to the scene (provided the animation is not an mobject-introducing animation -- for these, the addition to the scene happens later)." msgstr "" #: ../../source/guides/deep_dive.rst:736 msgid "In case the played animation is a :class:`.Wait` animation (this is the case in a :meth:`.Scene.wait` call), the method checks whether a static image should be rendered, or whether the render loop should be processed as usual (see :meth:`.Scene.should_update_mobjects` for the exact conditions, basically it checks whether there are any time-dependent updater functions and so on)." msgstr "" #: ../../source/guides/deep_dive.rst:742 msgid "Finally, the method determines the total run time of the play call (which at this point is computed as the maximum of the run times of the passed animations). This is stored in the ``duration`` attribute of the scene." msgstr "" #: ../../source/guides/deep_dive.rst:747 msgid "After the animation data has been compiled by the scene, the renderer continues to prepare for entering the render loop. It now checks the skipping status which has been determined before. If the renderer can skip this play call, it does so: it sets the current play call hash (which we will get back to in a moment) to ``None`` and increases the time of the renderer by the determined animation run time." msgstr "" #: ../../source/guides/deep_dive.rst:754 msgid "Otherwise, the renderer checks whether or not Manim's caching system should be used. The idea of the caching system is simple: for every play call, a hash value is computed, which is then stored and upon re-rendering the scene, the hash is generated again and checked against the stored value. If it is the same, the cached output is reused, otherwise it is fully rerendered again. We will not go into details of the caching system here; if you would like to learn more, the :func:`.get_hash_from_play_call` function in the :mod:`.utils.hashing` module is essentially the entry point to the caching mechanism." msgstr "" #: ../../source/guides/deep_dive.rst:764 msgid "In the event that the animation has to be rendered, the renderer asks its :class:`.SceneFileWriter` to start a writing process. The process is started by a call to ``ffmpeg`` and opens a pipe to which rendered raw frames can be written. As long as the pipe is open, the process can be accessed via the ``writing_process`` attribute of the file writer. With the writing process in place, the renderer then asks the scene to \"begin\" the animations." msgstr "" #: ../../source/guides/deep_dive.rst:772 msgid "First, it literally *begins* all of the animations by calling their setup methods (:meth:`.Animation._setup_scene`, :meth:`.Animation.begin`). In doing so, the mobjects that are newly introduced by an animation (like via :class:`.Create` etc.) are added to the scene. Furthermore, the animation suspends updater functions being called on its mobject, and it sets its mobject to the state that corresponds to the first frame of the animation." msgstr "" #: ../../source/guides/deep_dive.rst:780 msgid "After this has happened for all animations in the current ``play`` call, the Cairo renderer determines which of the scene's mobjects can be painted statically to the background, and which ones have to be redrawn every frame. It does so by calling :meth:`.Scene.get_moving_and_static_mobjects`, and the resulting partition of mobjects is stored in the corresponding ``moving_mobjects`` and ``static_mobjects`` attributes." msgstr "" #: ../../source/guides/deep_dive.rst:790 msgid "The mechanism that determines static and moving mobjects is specific for the Cairo renderer, the OpenGL renderer works differently. Basically, moving mobjects are determined by checking whether they, any of their children, or any of the mobjects \"below\" them (in the sense of the order in which mobjects are processed in the scene) either have an update function attached, or whether they appear in one of the current animations. See the implementation of :meth:`.Scene.get_moving_mobjects` for more details." msgstr "" #: ../../source/guides/deep_dive.rst:799 msgid "Up to this very point, we did not actually render any (partial) image or movie files from the scene yet. This is, however, about to change. Before we enter the render loop, let us briefly revisit our toy example and discuss how the generic :meth:`.Scene.play` call setup looks like there." msgstr "" #: ../../source/guides/deep_dive.rst:805 msgid "For the call that plays the :class:`.ReplacementTransform`, there is no subcaption to be taken care of. The renderer then asks the scene to compile the animation data: the passed argument already is an animation (no additional preparations needed), there is no need for processing any keyword arguments (as we did not specify any additional ones to ``play``). The mobject bound to the animation, ``orange_square``, is already part of the scene (so again, no action taken). Finally, the run time is extracted (3 seconds long) and stored in ``Scene.duration``. The renderer then checks whether it should skip (it should not), then whether the animation is already cached (it is not). The corresponding animation hash value is determined and passed to the file writer, which then also calls ``ffmpeg`` to start the writing process which waits for rendered frames from the library." msgstr "" #: ../../source/guides/deep_dive.rst:821 msgid "The scene then ``begin``\\ s the animation: for the :class:`.ReplacementTransform` this means that the animation populates all of its relevant animation attributes (i.e., compatible copies of the starting and the target mobject so that it can safely interpolate between the two)." msgstr "" #: ../../source/guides/deep_dive.rst:827 msgid "The mechanism determining static and moving mobjects considers all of the scenes mobjects (at this point only the ``orange_square``), and determines that the ``orange_square`` is bound to an animation that is currently played. As a result, the square is classified as a \"moving mobject\"." msgstr "" #: ../../source/guides/deep_dive.rst:833 msgid "Time to render some frames." msgstr "" #: ../../source/guides/deep_dive.rst:837 msgid "The render loop (for real this time)" msgstr "" #: ../../source/guides/deep_dive.rst:839 msgid "As mentioned above, due to the mechanism that determines static and moving mobjects in the scene, the renderer knows which mobjects it can paint statically to the background of the scene. Practically, this means that it partially renders a scene (to produce a background image), and then when iterating through the time progression of the animation only the \"moving mobjects\" are re-painted on top of the static background." msgstr "" #: ../../source/guides/deep_dive.rst:846 msgid "The renderer calls :meth:`.CairoRenderer.save_static_frame_data`, which first checks whether there are currently any static mobjects, and if there are, it updates the frame (only with the static mobjects; more about how exactly this works in a moment) and then saves a NumPy array representing the rendered frame in the ``static_image`` attribute. In our toy example, there are no static mobjects, and so the ``static_image`` attribute is simply set to ``None``." msgstr "" #: ../../source/guides/deep_dive.rst:854 msgid "Next, the renderer asks the scene whether the current animation is a \"frozen frame\" animation, which would mean that the renderer actually does not have to repaint the moving mobjects in every frame of the time progression. It can then just take the latest static frame, and display it throughout the animation." msgstr "" #: ../../source/guides/deep_dive.rst:862 msgid "An animation is considered a \"frozen frame\" animation if only a static :class:`.Wait` animation is played. See the description of :meth:`.Scene.compile_animation_data` above, or the implementation of :meth:`.Scene.should_update_mobjects` for more details." msgstr "" #: ../../source/guides/deep_dive.rst:868 msgid "If this is not the case (just as in our toy example), the renderer then calls the :meth:`.Scene.play_internal` method, which is the integral part of the render loop (in which the library steps through the time progression of the animation and renders the corresponding frames)." msgstr "" #: ../../source/guides/deep_dive.rst:874 msgid "Within :meth:`.Scene.play_internal`, the following steps are performed:" msgstr "" #: ../../source/guides/deep_dive.rst:876 msgid "The scene determines the run time of the animations by calling :meth:`.Scene.get_run_time`. This method basically takes the maximum ``run_time`` attribute of all of the animations passed to the :meth:`.Scene.play` call." msgstr "" #: ../../source/guides/deep_dive.rst:880 msgid "Then the *time progression* is constructed via the (internal) :meth:`.Scene._get_animation_time_progression` method, which wraps the actual :meth:`.Scene.get_time_progression` method. The time progression is a ``tqdm`` `progress bar object `__ for an iterator over ``np.arange(0, run_time, 1 / config.frame_rate)``. In other words, the time progression holds the time stamps (relative to the current animations, so starting at 0 and ending at the total animation run time, with the step size determined by the render frame rate) of the timeline where a new animation frame should be rendered." msgstr "" #: ../../source/guides/deep_dive.rst:889 msgid "Then the scene iterates over the time progression: for each time stamp ``t``, :meth:`.Scene.update_to_time` is called, which ..." msgstr "" #: ../../source/guides/deep_dive.rst:892 msgid "... first computes the time passed since the last update (which might be 0, especially for the initial call) and references it as ``dt``," msgstr "" #: ../../source/guides/deep_dive.rst:894 msgid "then (in the order in which the animations are passed to :meth:`.Scene.play`) calls :meth:`.Animation.update_mobjects` to trigger all updater functions that are attached to the respective animation except for the \"main mobject\" of the animation (that is, for example, for :class:`.Transform` the unmodified copies of start and target mobject -- see :meth:`.Animation.get_all_mobjects_to_update` for more details)," msgstr "" #: ../../source/guides/deep_dive.rst:900 msgid "then the relative time progression with respect to the current animation is computed (``alpha = t / animation.run_time``), which is then used to update the state of the animation with a call to :meth:`.Animation.interpolate`." msgstr "" #: ../../source/guides/deep_dive.rst:903 msgid "After all of the passed animations have been processed, the updater functions of all mobjects in the scene, all meshes, and finally those attached to the scene itself are run." msgstr "" #: ../../source/guides/deep_dive.rst:907 msgid "At this point, the internal (Python) state of all mobjects has been updated to match the currently processed timestamp. If rendering should not be skipped, then it is now time to *take a picture*!" msgstr "" #: ../../source/guides/deep_dive.rst:913 msgid "The update of the internal state (iteration over the time progression) happens *always* once :meth:`.Scene.play_internal` is entered. This ensures that even if frames do not need to be rendered (because, e.g., the ``-n`` CLI flag has been passed, something has been cached, or because we might be in a *Section* with skipped rendering), updater functions still run correctly, and the state of the first frame that *is* rendered is kept consistent." msgstr "" #: ../../source/guides/deep_dive.rst:920 msgid "To render an image, the scene calls the corresponding method of its renderer, :meth:`.CairoRenderer.render` and passes just the list of *moving mobjects* (remember, the *static mobjects* are assumed to have already been painted statically to the background of the scene). All of the hard work then happens when the renderer updates its current frame via a call to :meth:`.CairoRenderer.update_frame`:" msgstr "" #: ../../source/guides/deep_dive.rst:926 msgid "First, the renderer prepares its :class:`.Camera` by checking whether the renderer has a ``static_image`` different from ``None`` stored already. If so, it sets the image as the *background image* of the camera via :meth:`.Camera.set_frame_to_background`, and otherwise it just resets the camera via :meth:`.Camera.reset`. The camera is then asked to capture the scene with a call to :meth:`.Camera.camture_mobjects`." msgstr "" #: ../../source/guides/deep_dive.rst:932 msgid "Things get a bit technical here, and at some point it is more efficient to delve into the implementation -- but here is a summary of what happens once the camera is asked to capture the scene:" msgstr "" #: ../../source/guides/deep_dive.rst:936 msgid "First, a flat list of mobjects is created (so submobjects get extracted from their parents). This list is then processed in groups of the same type of mobjects (e.g., a batch of vectorized mobjects, followed by a batch of image mobjects, followed by more vectorized mobjects, etc. -- in many cases there will just be one batch of vectorized mobjects)." msgstr "" #: ../../source/guides/deep_dive.rst:941 msgid "Depending on the type of the currently processed batch, the camera uses dedicated *display functions* to convert the :class:`.Mobject` Python object to a NumPy array stored in the camera's ``pixel_array`` attribute. The most important example in that context is the display function for vectorized mobjects, :meth:`.Camera.display_multiple_vectorized_mobjects`, or the more particular (in case you did not add a background image to your :class:`.VMobject`), :meth:`.Camera.display_multiple_non_background_colored_vmobjects`. This method first gets the current Cairo context, and then, for every (vectorized) mobject in the batch, calls :meth:`.Camera.display_vectorized`. There, the actual background stroke, fill, and then stroke of the mobject is drawn onto the context. See :meth:`.Camera.apply_stroke` and :meth:`.Camera.set_cairo_context_color` for more details -- but it does not get much deeper than that, in the latter method the actual Bรฉzier curves determined by the points of the mobject are drawn; this is where the low-level interaction with Cairo happens." msgstr "" #: ../../source/guides/deep_dive.rst:957 msgid "After all batches have been processed, the camera has an image representation of the Scene at the current time stamp in form of a NumPy array stored in its ``pixel_array`` attribute. The renderer then takes this array and passes it to its :class:`.SceneFileWriter`. This concludes one iteration of the render loop, and once the time progression has been processed completely, a final bit of cleanup is performed before the :meth:`.Scene.play_internal` call is completed." msgstr "" #: ../../source/guides/deep_dive.rst:964 msgid "A TL;DR for the render loop, in the context of our toy example, reads as follows:" msgstr "" #: ../../source/guides/deep_dive.rst:966 msgid "The scene finds that a 3 second long animation (the :class:`.ReplacementTransform` changing the orange square to the blue circle) should be played. Given the requested medium render quality, the frame rate is 30 frames per second, and so the time progression with steps ``[0, 1/30, 2/30, ..., 89/30]`` is created." msgstr "" #: ../../source/guides/deep_dive.rst:970 msgid "In the internal render loop, each of these time stamps is processed: there are no updater functions, so effectively the scene updates the state of the transformation animation to the desired time stamp (for example, at time stamp ``t = 45/30``, the animation is completed to a rate of ``alpha = 0.5``)." msgstr "" #: ../../source/guides/deep_dive.rst:975 msgid "Then the scene asks the renderer to do its job. The renderer asks its camera to capture the scene, the only mobject that needs to be processed at this point is the main mobject attached to the transformation; the camera converts the current state of the mobject to entries in a NumPy array. The renderer passes this array to the file writer." msgstr "" #: ../../source/guides/deep_dive.rst:980 msgid "At the end of the loop, 90 frames have been passed to the file writer." msgstr "" #: ../../source/guides/deep_dive.rst:983 msgid "Completing the render loop" msgstr "" #: ../../source/guides/deep_dive.rst:985 msgid "The last few steps in the :meth:`.Scene.play_internal` call are not too exciting: for every animation, the corresponding :meth:`.Animation.finish` and :meth:`.Animation.clean_up_from_scene` methods are called." msgstr "" #: ../../source/guides/deep_dive.rst:991 msgid "Note that as part of :meth:`.Animation.finish`, the :meth:`.Animation.interpolate` method is called with an argument of 1.0 -- you might have noticed already that the last frame of an animation can sometimes be a bit off or incomplete. This is by current design! The last frame rendered in the render loop (and displayed for a duration of ``1 / frame_rate`` seconds in the rendered video) corresponds to the state of the animation ``1 / frame_rate`` seconds before it ends. To display the final frame as well in the video, we would need to append another ``1 / frame_rate`` seconds to the video -- which would then mean that a 1 second rendered Manim video would be slightly longer than 1 second. We decided against this at some point." msgstr "" #: ../../source/guides/deep_dive.rst:1001 msgid "In the end, the time progression is closed (which completes the displayed progress bar) in the terminal. With the closing of the time progression, the :meth:`.Scene.play_internal` call is completed, and we return to the renderer, which now orders the :class:`.SceneFileWriter` to close the movie pipe that has been opened for this animation: a partial movie file is written." msgstr "" #: ../../source/guides/deep_dive.rst:1007 msgid "This pretty much concludes the walkthrough of a :class:`.Scene.play` call, and actually there is not too much more to say for our toy example either: at this point, a partial movie file that represents playing the :class:`.ReplacementTransform` has been written. The initialization of the :class:`.Dot` happens analogous to the initialization of ``blue_circle``, which has been discussed above. The :meth:`.Mobject.add_updater` call literally just attaches a function to the ``updaters`` attribute of the ``small_dot``. And the remaining :meth:`.Scene.play` and :meth:`.Scene.wait` calls follow the exact same procedure as discussed in the render loop section above; each such call produces a corresponding partial movie file." msgstr "" #: ../../source/guides/deep_dive.rst:1018 msgid "Once the :meth:`.Scene.construct` method has been fully processed (and thus all of the corresponding partial movie files have been written), the scene calls its cleanup method :meth:`.Scene.tear_down`, and then asks its renderer to finish the scene. The renderer, in turn, asks its scene file writer to wrap things up by calling :meth:`.SceneFileWriter.finish`, which triggers the combination of the partial movie files into the final product." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/guides/index.pot000066400000000000000000000004061515024150700243410ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/guides/index.rst:4 #: ../../source/guides/index.rst:4 msgid "Table of Contents" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/guides/using_text.pot000066400000000000000000000273151515024150700254330ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/guides/using_text.rst:3 msgid "Rendering Text and Formulas" msgstr "" #: ../../source/guides/using_text.rst:5 msgid "There are two different ways by which you can render **Text** in videos:" msgstr "" #: ../../source/guides/using_text.rst:7 msgid "Using Pango (:mod:`~.text_mobject`)" msgstr "" #: ../../source/guides/using_text.rst:8 msgid "Using LaTeX (:mod:`~.tex_mobject`)" msgstr "" #: ../../source/guides/using_text.rst:10 msgid "If you want to render simple text, you should use either :class:`~.Text` or :class:`~.MarkupText`, or one of its derivatives like :class:`~.Paragraph`. See :ref:`using-text-objects` for more information." msgstr "" #: ../../source/guides/using_text.rst:14 msgid "LaTeX should be used when you need mathematical typesetting. See :ref:`rendering-with-latex` for more information." msgstr "" #: ../../source/guides/using_text.rst:20 msgid "Text Without LaTeX" msgstr "" #: ../../source/guides/using_text.rst:22 msgid "The simplest way to add text to your animations is to use the :class:`~.Text` class. It uses the `Pango library`_ to render text. With Pango, you can also render non-English alphabets like ไฝ ๅฅฝ or ใ“ใ‚“ใซใกใฏ or ์•ˆ๋…•ํ•˜์„ธ์š” or ู…ุฑุญุจุง ุจุงู„ุนุงู„ู…." msgstr "" #: ../../source/guides/using_text.rst:27 msgid "Here is a simple *Hello World* animation." msgstr "" #: ../../source/guides/using_text.rst:38 msgid "You can also use :class:`~.MarkupText` which allows the use of PangoMarkup (see the documentation of :class:`~.MarkupText` for details) to render text. For example:" msgstr "" #: ../../source/guides/using_text.rst:56 msgid "Working with :class:`~.Text`" msgstr "" #: ../../source/guides/using_text.rst:58 msgid "This section explains the properties of :class:`~.Text` and how can it be used in your animations." msgstr "" #: ../../source/guides/using_text.rst:62 msgid "Using Fonts" msgstr "" #: ../../source/guides/using_text.rst:64 msgid "You can set a different font using :attr:`~.Text.font`." msgstr "" #: ../../source/guides/using_text.rst:68 msgid "The font used must be installed in your system, and Pango should know about it. You can get a list of fonts using :func:`manimpango.list_fonts`." msgstr "" #: ../../source/guides/using_text.rst:85 msgid "Setting Slant and Weight" msgstr "" #: ../../source/guides/using_text.rst:86 msgid "Slant is the style of the Text, and it can be ``NORMAL`` (the default), ``ITALIC`` or ``OBLIQUE``. Usually, for many fonts both ``ITALIC`` and ``OBLIQUE`` look similar, but ``ITALIC`` uses **Roman Style**, whereas ``OBLIQUE`` uses **Italic Style**." msgstr "" #: ../../source/guides/using_text.rst:91 msgid "Weight specifies the boldness of a font. You can see a list of weights in :class:`manimpango.Weight`." msgstr "" #: ../../source/guides/using_text.rst:126 msgid "Using Colors" msgstr "" #: ../../source/guides/using_text.rst:128 msgid "You can set the color of the text using :attr:`~.Text.color`:" msgstr "" #: ../../source/guides/using_text.rst:138 msgid "You can use utilities like :attr:`~.Text.t2c` for coloring specific characters. This may be problematic if your text contains ligatures as explained in :ref:`iterating-text`." msgstr "" #: ../../source/guides/using_text.rst:142 msgid ":attr:`~Text.t2c` accepts two types of dictionaries," msgstr "" #: ../../source/guides/using_text.rst:144 msgid "The keys can contain indices like ``[2:-1]`` or ``[4:8]``, this works similar to how `slicing `_ works in Python. The values should be the color of the Text from :class:`~.Color`." msgstr "" #: ../../source/guides/using_text.rst:149 msgid "The keys contain words or characters which should be colored separately and the values should be the color from :class:`~.Color`:" msgstr "" #: ../../source/guides/using_text.rst:161 msgid "If you want to avoid problems when using colors (due to ligatures), consider using :class:`MarkupText`." msgstr "" #: ../../source/guides/using_text.rst:166 msgid "Using Gradients" msgstr "" #: ../../source/guides/using_text.rst:168 msgid "You can add a gradient using :attr:`~.Text.gradient`. The value must be an iterable of any length:" msgstr "" #: ../../source/guides/using_text.rst:179 msgid "You can also use :attr:`~.Text.t2g` for gradients with specific characters of the text. It shares a similar syntax to :ref:`the interface for colors `:" msgstr "" #: ../../source/guides/using_text.rst:203 msgid "Setting Line Spacing" msgstr "" #: ../../source/guides/using_text.rst:205 msgid "You can set the line spacing using :attr:`~.Text.line_spacing`:" msgstr "" #: ../../source/guides/using_text.rst:220 msgid "Disabling Ligatures" msgstr "" #: ../../source/guides/using_text.rst:222 msgid "By disabling ligatures you would get a one-to-one mapping between characters and submobjects. This fixes the issues with coloring text." msgstr "" #: ../../source/guides/using_text.rst:228 msgid "Be aware that using this method with text that heavily depends on ligatures (Arabic text) may yield unexpected results." msgstr "" #: ../../source/guides/using_text.rst:231 msgid "You can disable ligatures by passing ``disable_ligatures`` to :class:`Text`. For example:" msgstr "" #: ../../source/guides/using_text.rst:246 msgid "Iterating :class:`~.Text`" msgstr "" #: ../../source/guides/using_text.rst:248 msgid "Text objects behave like :class:`VGroups <.VGroup>`. Therefore, you can slice and index the text." msgstr "" #: ../../source/guides/using_text.rst:251 msgid "For example, you can set each letter to different color by iterating it." msgstr "" #: ../../source/guides/using_text.rst:265 msgid "Please note that `Ligature`_ can cause problems here. If you need a one-to-one mapping of characters to submobjects you should pass the ``disable_ligatures`` parameter to :class:`~.Text`. See :ref:`disable-ligatures`." msgstr "" #: ../../source/guides/using_text.rst:273 msgid "Working with :class:`~.MarkupText`" msgstr "" #: ../../source/guides/using_text.rst:275 msgid "MarkupText is similar to :class:`~.Text`, the only difference between them is that this accepts and processes PangoMarkup (which is similar to html), instead of just rendering plain text." msgstr "" #: ../../source/guides/using_text.rst:279 msgid "Consult the documentation of :class:`~.MarkupText` for more details and further references about PangoMarkup." msgstr "" #: ../../source/guides/using_text.rst:297 msgid "Text With LaTeX" msgstr "" #: ../../source/guides/using_text.rst:299 msgid "Just as you can use :class:`~.Text` to add text to your videos, you can use :class:`~.Tex` to insert LaTeX." msgstr "" #: ../../source/guides/using_text.rst:302 msgid "For example," msgstr "" #: ../../source/guides/using_text.rst:314 msgid "Note that we are using a raw string (``r'...'``) instead of a regular string (``'...'``). This is because TeX code uses a lot of special characters - like ``\\`` for example - that have special meaning within a regular python string. An alternative would have been to write ``\\\\`` to escape the backslash: ``Tex('\\\\LaTeX')``." msgstr "" #: ../../source/guides/using_text.rst:320 msgid "Working with :class:`~.MathTex`" msgstr "" #: ../../source/guides/using_text.rst:322 msgid "Everything passed to :class:`~.MathTex` is in math mode by default. To be more precise, :class:`~.MathTex` is processed within an ``align*`` environment. You can achieve a similar effect with :class:`~.Tex` by enclosing your formula with ``$`` symbols: ``$\\xrightarrow{x^6y^8}$``:" msgstr "" #: ../../source/guides/using_text.rst:339 msgid "LaTeX commands and keyword arguments" msgstr "" #: ../../source/guides/using_text.rst:341 msgid "We can use any standard LaTeX commands in the AMS maths packages. Such as the ``mathtt`` math-text type or the ``looparrowright`` arrow." msgstr "" #: ../../source/guides/using_text.rst:352 msgid "On the Manim side, the :class:`~.Tex` class also accepts attributes to change the appearance of the output. This is very similar to the :class:`~.Text` class. For example, the ``color`` keyword changes the color of the TeX mobject." msgstr "" #: ../../source/guides/using_text.rst:366 msgid "Extra LaTeX Packages" msgstr "" #: ../../source/guides/using_text.rst:368 msgid "Some commands require special packages to be loaded into the TeX template. For example, to use the ``mathscr`` script, we need to add the ``mathrsfs`` package. Since this package isn't loaded into Manim's tex template by default, we have to add it manually." msgstr "" #: ../../source/guides/using_text.rst:388 msgid "Substrings and parts" msgstr "" #: ../../source/guides/using_text.rst:390 msgid "The TeX mobject can accept multiple strings as arguments. Afterwards you can refer to the individual parts either by their index (like ``tex[1]``), or by selecting parts of the tex code. In this example, we set the color of the ``\\bigstar`` using :func:`~.set_color_by_tex`:" msgstr "" #: ../../source/guides/using_text.rst:404 msgid "Note that :func:`~.set_color_by_tex` colors the entire substring containing the Tex, not just the specific symbol or Tex expression. Consider the following example:" msgstr "" #: ../../source/guides/using_text.rst:418 msgid "As you can see, this colors the entire equation yellow, contrary to what may be expected. To color only ``x`` yellow, we have to do the following:" msgstr "" #: ../../source/guides/using_text.rst:433 msgid "By setting ``substrings_to_isolate`` to ``x``, we split up the :class:`~.MathTex` into substrings automatically and isolate the ``x`` components into individual substrings. Only then can :meth:`~.set_color_by_tex` be used to achieve the desired result." msgstr "" #: ../../source/guides/using_text.rst:438 msgid "Note that Manim also supports a custom syntax that allows splitting a TeX string into substrings easily: simply enclose parts of your formula that you want to isolate with double braces. In the string ``MathTex(r\"{{ a^2 }} + {{ b^2 }} = {{ c^2ย }}\")``, the rendered mobject will consist of the substrings ``a^2``, ``+``, ``b^2``, ``=``, and ``c^2``. This makes transformations between similar text fragments easy to write using :class:`~.TransformMatchingTex`." msgstr "" #: ../../source/guides/using_text.rst:447 msgid "Using ``index_labels`` to work with complicated strings" msgstr "" #: ../../source/guides/using_text.rst:449 msgid "You might sometimes be working with a very complicated :class:`~.MathTex` mobject that makes it difficult to work with its individual components. This is where the debugging function :func:`.index_labels` is very useful." msgstr "" #: ../../source/guides/using_text.rst:453 msgid "The method shows the index of a mobject's submobjects, allowing you to easily find the components of the mobject you would like to change." msgstr "" #: ../../source/guides/using_text.rst:472 msgid "LaTeX Maths Fonts - The Template Library" msgstr "" #: ../../source/guides/using_text.rst:474 msgid "Changing fonts in LaTeX when typesetting mathematical formulae is trickier than regular text. It requires changing the template that is used to compile the TeX. Manim comes with a collection of :class:`~.TexFontTemplates` ready for you to use. These templates will all work in math mode:" msgstr "" #: ../../source/guides/using_text.rst:491 msgid "Manim also has a :class:`~.TexTemplateLibrary` containing the TeX templates used by 3Blue1Brown. One example is the ctex template, used for typesetting Chinese script. For this to work, the ctex LaTeX package must be installed on your system. Furthermore, if you are only typesetting Text, you probably do not need :class:`~.Tex` at all, and should use :class:`~.Text` instead." msgstr "" #: ../../source/guides/using_text.rst:508 msgid "Aligning formulae" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/index.pot000066400000000000000000000130501515024150700230600ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/index.rst:7 msgid "Manim Community Edition" msgstr "" #: ../../source/index.rst:9 msgid "Animating technical concepts is traditionally pretty tedious since it can be difficult to make the animations precise enough to convey them accurately. Manim relies on Python's simplicity to generate animations programmatically, making it convenient to specify exactly how each one should run. Take a look at the :doc:`Example Gallery <../examples>` for some inspiration on how to create beautiful images and videos with Manim." msgstr "" #: ../../source/index.rst:17 msgid "First Steps" msgstr "" #: ../../source/index.rst:19 msgid "Are you new to Manim and are looking for where to get started? Then you are in the right place!" msgstr "" #: ../../source/index.rst:24 msgid "Please be aware that there are different, incompatible versions of Manim available. Check our :ref:`installation FAQ ` to learn more!" msgstr "" #: ../../source/index.rst:28 msgid "The :doc:`Installation ` section has the latest and up-to-date installation instructions for Windows, MacOS, and Linux. You can also find information on Manim's docker images and (online) notebook environments there." msgstr "" #: ../../source/index.rst:32 msgid "Want to try the library before installing it? Take a look at our interactive online playground at https://try.manim.community in form of a Jupyter notebook." msgstr "" #: ../../source/index.rst:35 msgid "In our :doc:`Tutorials ` section you will find a collection of resources that will teach you how to use Manim. In particular, the :doc:`tutorials/quickstart` tutorial teaches you Manim's basics, and in :doc:`tutorials/building_blocks` the classes used to compose your animations are described in more detail." msgstr "" #: ../../source/index.rst:43 msgid "Finding Help" msgstr "" #: ../../source/index.rst:45 msgid "Are you struggling with installing or using Manim? Don't worry, we've all been there. Here are some good resources to help you out:" msgstr "" #: ../../source/index.rst:48 msgid "Perhaps your problem is one that occurs frequently, then chances are it is addressed in our :doc:`collection of FAQs `." msgstr "" #: ../../source/index.rst:50 msgid "If you are looking for information on some specific class, look for it in the :doc:`reference manual ` and/or use the search feature of the documentation." msgstr "" #: ../../source/index.rst:53 msgid "Still no luck? Then you are welcome to ask the community for help, together we usually manage to find a solution for your problem! Consult the :doc:`FAQ page on getting help ` for instructions." msgstr "" #: ../../source/index.rst:59 msgid "Navigating the Documentation" msgstr "" #: ../../source/index.rst:61 msgid "Here are some short summaries for all of the sections in this documentation:" msgstr "" #: ../../source/index.rst:63 msgid "The :doc:`Example Gallery ` is a collection of examples (rendered videos and images together with the code they were generated from) that show a few different, simple things that you can do with Manim." msgstr "" #: ../../source/index.rst:66 msgid "The :doc:`Installation ` section has information on installing Manim." msgstr "" #: ../../source/index.rst:67 msgid "In :doc:`Tutorials & Guides ` you can find learning resources: proper tutorials that guide you through the process of creating a video are in the :doc:`Tutorial ` section; guides on specific topics are in the :doc:`Guides ` section, and the answers to frequently asked questions can be found in the :doc:`FAQ ` section." msgstr "" #: ../../source/index.rst:72 msgid "The :doc:`Reference Manual ` contains a comprehensive list of all of Manim's (documented) modules, classes, and functions. If you are somewhat familiar with Manim's module structure feel free to browse the manual directly. If you are searching for something specific, feel free to use the documentation's search feature in the sidebar. Many classes and methods come with their own illustrated examples too!" msgstr "" #: ../../source/index.rst:77 msgid "The :doc:`Plugins ` page documents how to install, write, and distribute plugins (that is, separate Python packages that extend the feature set of the core library)." msgstr "" #: ../../source/index.rst:79 msgid "Changes between versions are documented in our :doc:`Changelog `." msgstr "" #: ../../source/index.rst:80 msgid "If you are looking into contributing to the development of Manim, you can find information on how to get involved in our :doc:`Contributing ` section." msgstr "" #: ../../source/index.rst:82 msgid "And finally, the :doc:`Code of Conduct ` page has a formal description of the rules you should abide by when interacting within our community." msgstr "" #: ../../source/index.rst:86 msgid "Sharing Your Work" msgstr "" #: ../../source/index.rst:88 msgid "We'd love to hear from you and see your manimations `on Twitter `_, `Reddit `_, or `Discord `_. If you're using Manim in a scientific context, instructions on how to cite a particular release can be found `in our README `_." msgstr "" #: ../../source/index.rst:95 msgid "Index" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/installation.pot000066400000000000000000000106561515024150700244630ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/installation.rst:2 msgid "Installation" msgstr "" #: ../../source/installation.rst:4 msgid "Depending on your use case, different installation options are recommended: if you just want to play around with Manim for a bit, interactive in-browser notebooks are a really simple way of exploring the library as they require no local installation. Head over to https://try.manim.community to give our interactive tutorial a try." msgstr "" #: ../../source/installation.rst:10 msgid "Otherwise, if you intend to use Manim to work on an animation project, we recommend installing the library locally (either to your system's Python, or via Docker)." msgstr "" #: ../../source/installation.rst:16 msgid "Note that there are several different versions of Manim. The instructions on this website are **only** for the *community edition*. Find out more about the :ref:`differences between Manim versions ` if you are unsure which version you should install." msgstr "" #: ../../source/installation.rst:22 msgid ":ref:`Installing Manim to your system's Python `" msgstr "" #: ../../source/installation.rst:23 msgid ":ref:`Using Manim via Docker `" msgstr "" #: ../../source/installation.rst:24 msgid ":ref:`Interactive Jupyter notebooks via Binder / Google Colab `" msgstr "" #: ../../source/installation.rst:31 msgid "Installing Manim locally" msgstr "" #: ../../source/installation.rst:33 msgid "Manim is a Python library, and it can be `installed via pip `__. However, in order for Manim to work properly, some additional system dependencies need to be installed first. The following pages have operating system specific instructions for you to follow." msgstr "" #: ../../source/installation.rst:39 msgid "Manim requires Python version ``3.7`` or above to run." msgstr "" #: ../../source/installation.rst:43 msgid "Depending on your particular setup, the installation process might be slightly different. Make sure that you have tried to follow the steps on the following pages carefully, but in case you hit a wall we are happy to help: either `join our Discord `__, or start a new Discussion `directly on GitHub `__." msgstr "" #: ../../source/installation.rst:58 msgid "Once Manim is installed locally, you can proceed to our :doc:`quickstart guide ` which walks you through rendering a first simple scene." msgstr "" #: ../../source/installation.rst:62 msgid "As mentioned above, do not worry if there are errors or other problems: consult our :doc:`FAQ section ` for help (including instructions for how to ask Manim's community for help)." msgstr "" #: ../../source/installation.rst:71 msgid "Using Manim via Docker" msgstr "" #: ../../source/installation.rst:73 msgid "`Docker `__ is a virtualization tool that allows the distribution of encapsulated software environments (containers)." msgstr "" #: ../../source/installation.rst:76 msgid "The following pages contain more information about the docker image maintained by the community, ``manimcommunity/manim``:" msgstr "" #: ../../source/installation.rst:87 msgid "Interactive Jupyter notebooks for your browser" msgstr "" #: ../../source/installation.rst:89 msgid "Manim ships with a built-in ``%%manim`` IPython magic command designed for the use within `Jupyter notebooks `__. Our interactive tutorial over at https://try.manim.community illustrates how Manim can be used from within a Jupyter notebook." msgstr "" #: ../../source/installation.rst:94 msgid "The following pages explain how you can setup interactive environments like that yourself:" msgstr "" #: ../../source/installation.rst:104 msgid "Editors" msgstr "" #: ../../source/installation.rst:106 msgid "If you're using Visual Studio Code you can install an extension called *Manim Sideview* which provides automated rendering and an integrated preview of the animation inside the editor. The extension can be installed through the `marketplace of VS Code `__." msgstr "" #: ../../source/installation.rst:113 msgid "Installation for developers" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/installation/000077500000000000000000000000001515024150700237275ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/installation/docker.pot000066400000000000000000000055671515024150700257370ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/installation/docker.rst:2 msgid "Docker" msgstr "" #: ../../source/installation/docker.rst:4 msgid "The community maintains a docker image, which can be found `on DockerHub `__. For our image ``manimcommunity/manim``, there are the following tags:" msgstr "" #: ../../source/installation/docker.rst:8 msgid "``latest``: the most recent version corresponding to `the main branch `__," msgstr "" #: ../../source/installation/docker.rst:10 msgid "``stable``: the latest released version (according to `the releases page `__)," msgstr "" #: ../../source/installation/docker.rst:12 msgid "``vX.Y.Z``: any particular released version (according to `the releases page `__)." msgstr "" #: ../../source/installation/docker.rst:17 msgid "When using Manim's CLI within a Docker container, some flags like ``-p`` (preview file) and ``-f`` (show output file in the file browser) are not supported." msgstr "" #: ../../source/installation/docker.rst:23 msgid "Basic usage of the Docker container" msgstr "" #: ../../source/installation/docker.rst:25 msgid "Assuming that you can access the docker installation on your system from a terminal (bash / PowerShell) via ``docker``, you can render a scene ``CircleToSquare`` in a file `test_scenes.py` with the following command." msgstr "" #: ../../source/installation/docker.rst:36 msgid "For Linux users there might be permission problems when letting the user in the container write to the mounted volume. Add ``--user=\"$(id -u):$(id -g)\"`` to the ``docker`` CLI arguments to prevent the creation of output files not belonging to your user." msgstr "" #: ../../source/installation/docker.rst:42 msgid "Instead of using the \"throwaway container\" approach outlined above, you can also create a named container that you can modify to your liking. First, run" msgstr "" #: ../../source/installation/docker.rst:51 msgid "to obtain an interactive shell inside your container allowing you to, e.g., install further dependencies (like texlive packages using ``tlmgr``). Exit the container as soon as you are satisfied. Then, before using it, start the container by running" msgstr "" #: ../../source/installation/docker.rst:60 msgid "which starts the container in the background. Then, to render a scene ``CircleToSquare`` in a file ``test_scenes.py``, run" msgstr "" #: ../../source/installation/docker.rst:69 msgid "Running JupyterLab via Docker" msgstr "" #: ../../source/installation/docker.rst:71 msgid "Another alternative to using the Docker image is to spin up a local JupyterLab instance. To do that, simply run" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/installation/jupyter.pot000066400000000000000000000075511515024150700261650ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/installation/jupyter.rst:2 msgid "Jupyter Notebooks" msgstr "" #: ../../source/installation/jupyter.rst:6 msgid "Binder" msgstr "" #: ../../source/installation/jupyter.rst:8 msgid "`Binder `__ is an online platform that hosts shareable and customizable computing environments in the form of Jupyter notebooks. Manim ships with a built-in ``%%manim`` Jupyter magic command which makes it easy to use in these notebooks." msgstr "" #: ../../source/installation/jupyter.rst:13 msgid "To see an example for such an environment, visit our interactive tutorial over at https://try.manim.community/." msgstr "" #: ../../source/installation/jupyter.rst:16 msgid "It is relatively straightforward to prepare your own notebooks in a way that allows them to be shared interactively via Binder as well:" msgstr "" #: ../../source/installation/jupyter.rst:19 msgid "First, prepare a directory containing one or multiple notebooks which you would like to share in an interactive environment. You can create these notebooks by using Jupyter notebooks with a local installation of Manim, or also by working in our pre-existing `interactive tutorial environment `__." msgstr "" #: ../../source/installation/jupyter.rst:24 msgid "In the same directory containing your notebooks, add a file named ``Dockerfile`` with the following content:" msgstr "" #: ../../source/installation/jupyter.rst:33 msgid "Don't forget to change the version tag ``v0.9.0`` to the version you were working with locally when creating your notebooks." msgstr "" #: ../../source/installation/jupyter.rst:35 msgid "Make the directory with your worksheets and the ``Dockerfile`` available to the public (and in particular: to Binder!). There are `several different options to do so `__, within the community we usually work with GitHub repositories or gists." msgstr "" #: ../../source/installation/jupyter.rst:41 msgid "Once your material is publicly available, visit https://mybinder.org and follow the instructions there to generate an interactive environment for your worksheets." msgstr "" #: ../../source/installation/jupyter.rst:47 msgid "The repository containing our `interactive tutorial `__ can be found at https://github.com/ManimCommunity/jupyter_examples." msgstr "" #: ../../source/installation/jupyter.rst:53 msgid "Google Colaboratory" msgstr "" #: ../../source/installation/jupyter.rst:55 msgid "It is also possible to install Manim in a `Google Colaboratory `__ environment. In contrast to Binder, where you can customize and prepare the environment beforehand (such that Manim is already installed and ready to be used), you will have to take care of that every time you start a new notebook in Google Colab. Fortunately, this is not particularly difficult." msgstr "" #: ../../source/installation/jupyter.rst:63 msgid "After creating a new notebook, paste the following code block in a cell, then execute it." msgstr "" #: ../../source/installation/jupyter.rst:76 msgid "You should start to see Colab installing all the dependencies specified in these commands. After the execution has completed, you will be prompted to restart the runtime. Click the \"restart runtime\" button at the bottom of the cell output. You are now ready to use Manim in Colab!" msgstr "" #: ../../source/installation/jupyter.rst:81 msgid "To check that everything works as expected, first import Manim by running" msgstr "" #: ../../source/installation/jupyter.rst:87 msgid "in a new code cell. Then create another cell containing the following code::" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/installation/linux.pot000066400000000000000000000105261515024150700256160ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/installation/linux.rst:2 msgid "Linux" msgstr "" #: ../../source/installation/linux.rst:4 msgid "The installation instructions depend on your particular operating system and package manager. If you happen to know exactly what you are doing, you can also simply ensure that your system has:" msgstr "" #: ../../source/installation/linux.rst:8 msgid "a reasonably recent version of Python 3 (3.7โ€“3.10)," msgstr "" #: ../../source/installation/linux.rst:9 msgid "with working Cairo bindings in the form of `pycairo `__," msgstr "" #: ../../source/installation/linux.rst:11 msgid "FFmpeg accessible from the command line as ``ffmpeg``," msgstr "" #: ../../source/installation/linux.rst:12 msgid "and `Pango `__ headers." msgstr "" #: ../../source/installation/linux.rst:14 msgid "Then, installing Manim is just a matter of running:" msgstr "" #: ../../source/installation/linux.rst:22 msgid "In light of the current efforts of migrating to rendering via OpenGL, this list might be incomplete. Please `let us know ` if you ran into missing dependencies while installing." msgstr "" #: ../../source/installation/linux.rst:27 msgid "In any case, we have also compiled instructions for several common combinations of operating systems and package managers below." msgstr "" #: ../../source/installation/linux.rst:31 msgid "Required Dependencies" msgstr "" #: ../../source/installation/linux.rst:34 msgid "apt โ€“ Ubuntu / Mint / Debian" msgstr "" #: ../../source/installation/linux.rst:36 msgid "To first update your sources, and then install Cairo, Pango, and FFmpeg simply run:" msgstr "" #: ../../source/installation/linux.rst:44 msgid "If you don't have python3-pip installed, install it via:" msgstr "" #: ../../source/installation/linux.rst:50 msgid "Then, to install Manim, run:" msgstr "" #: ../../source/installation/linux.rst:56 #: ../../source/installation/linux.rst:90 #: ../../source/installation/linux.rst:123 msgid "Continue by reading the :ref:`optional dependencies ` section." msgstr "" #: ../../source/installation/linux.rst:60 msgid "dnf โ€“ย Fedora / CentOS / RHEL" msgstr "" #: ../../source/installation/linux.rst:62 msgid "To install Cairo and Pango:" msgstr "" #: ../../source/installation/linux.rst:68 msgid "In order to successfully build the ``pycairo`` wheel, you will also need the Python development headers:" msgstr "" #: ../../source/installation/linux.rst:75 msgid "FFmpeg is only available via the RPMfusion repository which you have to configure first โ€“ please consult https://rpmfusion.org/Configuration/ for instructions. Then, install FFmpeg:" msgstr "" #: ../../source/installation/linux.rst:83 msgid "At this point you have all required dependencies and can install Manim by running:" msgstr "" #: ../../source/installation/linux.rst:94 msgid "pacman โ€“ย Arch / Manjaro" msgstr "" #: ../../source/installation/linux.rst:98 msgid "Thanks to *groctel*, there is a `dedicated Manim package on the AUR! `" msgstr "" #: ../../source/installation/linux.rst:101 msgid "If you don't want to use the packaged version from AUR, here is what you need to do manually: Update your package sources, then install Cairo, Pango, and FFmpeg:" msgstr "" #: ../../source/installation/linux.rst:110 msgid "If you don't have ``python-pip`` installed, get it by running:" msgstr "" #: ../../source/installation/linux.rst:116 msgid "then simply install Manim via:" msgstr "" #: ../../source/installation/linux.rst:130 msgid "Optional Dependencies" msgstr "" #: ../../source/installation/linux.rst:132 msgid "In order to make use of Manim's interface to LaTeX for, e.g., rendering equations, LaTeX has to be installed as well. Note that this is an optional dependency: if you don't intend to use LaTeX, you don't have to install it." msgstr "" #: ../../source/installation/linux.rst:136 msgid "You can use whichever LaTeX distribution you like or whichever is easiest to install with your package manager. Usually, `TeX Live `__ is a good candidate if you don't care too much about disk space." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/installation/macos.pot000066400000000000000000000074611515024150700255650ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/installation/macos.rst:2 msgid "MacOS" msgstr "" #: ../../source/installation/macos.rst:4 msgid "For the sake of simplicity, the following instructions assume that you have the popular `package manager Homebrew `__ installed. While you can certainly also install all dependencies without it, using Homebrew makes the process much easier." msgstr "" #: ../../source/installation/macos.rst:9 msgid "If you want to use Homebrew but do not have it installed yet, please follow `Homebrew's installation instructions `__." msgstr "" #: ../../source/installation/macos.rst:14 msgid "For a while after Apple released its new ARM-based processors (the *\"M1 chip\"*), the recommended way of installing Manim relied on *Rosetta*, Apple's compatibility layer between Intel and ARM architectures. This is no longer necessary, Manim can (and is recommended to) be installed natively." msgstr "" #: ../../source/installation/macos.rst:21 msgid "Required Dependencies" msgstr "" #: ../../source/installation/macos.rst:23 msgid "To install all required dependencies for installing Manim (namely: ffmpeg, Python, and some required Python packages), run:" msgstr "" #: ../../source/installation/macos.rst:30 msgid "On *Apple Silicon* based machines (i.e., devices with the M1 chip or similar; if you are unsure which processor you have check by opening the Apple menu, select *About This Mac* and check the entry next to *Chip*), some additional dependencies are required, namely:" msgstr "" #: ../../source/installation/macos.rst:39 msgid "After all required dependencies are installed, simply run:" msgstr "" #: ../../source/installation/macos.rst:45 msgid "to install Manim." msgstr "" #: ../../source/installation/macos.rst:49 msgid "A frequent source for installation problems is if ``pip3`` does not point to the correct Python installation on your system. To check this, run ``pip3 -V``: for MacOS Intel, the path should start with ``/usr/local``, and for Apple Silicon with ``/opt/homebrew``. If this is not the case, you either forgot to modify your shell profile (``.zprofile``) during the installation of Homebrew, or did not reload your shell (e.g., by opening a new terminal) after doing so. It is also possible that some other software (like Pycharm) changed the ``PATH`` variable โ€“ to fix this, make sure that the Homebrew-related lines in your ``.zprofile`` are at the very end of the file." msgstr "" #: ../../source/installation/macos.rst:63 msgid "Optional Dependencies" msgstr "" #: ../../source/installation/macos.rst:65 msgid "In order to make use of Manim's interface to LaTeX for, e.g., rendering equations, LaTeX has to be installed as well. Note that this is an optional dependency: if you don't intend to use LaTeX, you don't have to install it." msgstr "" #: ../../source/installation/macos.rst:69 msgid "For MacOS, the recommended LaTeX distribution is `MacTeX `__. You can install it by following the instructions from the link, or alternatively also via Homebrew by running:" msgstr "" #: ../../source/installation/macos.rst:80 msgid "MacTeX is a *full* LaTeX distribution and will require more than 4GB of disk space. If this is an issue for you, consider installing a smaller distribution like `BasicTeX `__." msgstr "" #: ../../source/installation/macos.rst:85 msgid "Should you choose to work with some partial TeX distribution, the full list of LaTeX packages which Manim interacts with in some way (a subset might be sufficient for your particular application) is::" msgstr "" #: ../../source/installation/macos.rst:96 msgid "Working with Manim" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/installation/troubleshooting.pot000066400000000000000000000000011515024150700276710ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/installation/versions.pot000066400000000000000000000000011515024150700263120ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/installation/windows.pot000066400000000000000000000145221515024150700261510ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/installation/windows.rst:2 msgid "Windows" msgstr "" #: ../../source/installation/windows.rst:4 msgid "The easiest way of installing Manim and its dependencies is by using a package manager like `Chocolatey `__ or `Scoop `__. If you are not afraid of editing your System's ``PATH``, a manual installation is also possible. In fact, if you already have an existing Python installation (3.7-3.10), it might be the easiest way to get everything up and running." msgstr "" #: ../../source/installation/windows.rst:12 msgid "If you choose to use one of the package managers, please follow their installation instructions (`for Chocolatey `__, `for Scoop `__) to make one of them available on your system." msgstr "" #: ../../source/installation/windows.rst:20 msgid "Required Dependencies" msgstr "" #: ../../source/installation/windows.rst:22 msgid "Manim requires a recent version of Python (3.7โ€“3.10) and ``ffmpeg`` in order to work." msgstr "" #: ../../source/installation/windows.rst:26 msgid "Chocolatey" msgstr "" #: ../../source/installation/windows.rst:28 msgid "Manim can be installed via Chocolatey simply by running:" msgstr "" #: ../../source/installation/windows.rst:34 msgid "That's it, no further steps required. You can continue with installing the :ref:`optional dependencies ` below." msgstr "" #: ../../source/installation/windows.rst:38 msgid "Scoop" msgstr "" #: ../../source/installation/windows.rst:40 msgid "While there is no recipe for installing Manim with Scoop directly, you can install all requirements by running:" msgstr "" #: ../../source/installation/windows.rst:47 msgid "and then Manim can be installed by running:" msgstr "" #: ../../source/installation/windows.rst:53 msgid "Manim should now be installed on your system. Continue reading the :ref:`optional dependencies ` section below." msgstr "" #: ../../source/installation/windows.rst:58 msgid "Manual Installation" msgstr "" #: ../../source/installation/windows.rst:60 msgid "As mentioned above, Manim needs a reasonably recent version of Python 3 (3.7โ€“3.10) and FFmpeg." msgstr "" #: ../../source/installation/windows.rst:63 msgid "**Python:** Head over to https://www.python.org, download an installer for Python (3.7โ€“3.10), and follow its instructions to get Python installed on your system." msgstr "" #: ../../source/installation/windows.rst:69 msgid "We have received reports of problems caused by using the version of Python that can be installed from the Windows Store. At this point, we recommend staying away from the Windows Store version. Instead, install Python directly from the `official website `__." msgstr "" #: ../../source/installation/windows.rst:75 msgid "**FFmpeg:** In order to install FFmpeg, you can get a pre-compiled and ready-to-use version from one of the resources linked at https://ffmpeg.org/download.html#build-windows, such as `the version available here `__ (recommended), or if you know exactly what you are doing you can alternatively get the source code from https://ffmpeg.org/download.html and compile it yourself." msgstr "" #: ../../source/installation/windows.rst:85 msgid "After downloading the pre-compiled archive, `unzip it `__ and, if you like, move the extracted directory to some more permanent place (e.g., ``C:\\Program Files\\``). Next, edit the ``PATH`` environment variable: first, visit ``Control Panel`` > ``System`` > ``System settings`` > ``Environment Variables``, then add the full path to the ``bin`` directory inside of the (moved) ffmpeg directory to the ``PATH`` variable. Finally, save your changes and exit." msgstr "" #: ../../source/installation/windows.rst:94 msgid "If you now open a new command line prompt (or PowerShell) and run ``ffmpeg``, the command should be recognized." msgstr "" #: ../../source/installation/windows.rst:97 msgid "At this point, you have all the required dependencies and can now install Manim via" msgstr "" #: ../../source/installation/windows.rst:108 msgid "Optional Dependencies" msgstr "" #: ../../source/installation/windows.rst:110 msgid "In order to make use of Manim's interface to LaTeX to, for example, render equations, LaTeX has to be installed as well. Note that this is an optional dependency: if you don't intend to use LaTeX, you don't have to install it." msgstr "" #: ../../source/installation/windows.rst:114 msgid "For Windows, the recommended LaTeX distribution is `MiKTeX `__. You can install it by using the installer from the linked MiKTeX site, or by using the package manager of your choice (Chocolatey: ``choco install miktex.install``, Scoop: ``scoop install latex``)." msgstr "" #: ../../source/installation/windows.rst:120 msgid "If you are concerned about disk space, there are some alternative, smaller distributions of LaTeX." msgstr "" #: ../../source/installation/windows.rst:123 msgid "**Using Chocolatey:** If you used Chocolatey to install manim or are already a chocolatey user, then you can simply run ``choco install manim-latex``. It is a dedicated package for Manim based on TinyTeX which contains all the required packages that Manim interacts with." msgstr "" #: ../../source/installation/windows.rst:128 msgid "**Manual Installation:** You can also use `TinyTeX `__ (Chocolatey: ``choco install tinytex``, Scoop: first ``scoop bucket add r-bucket https://github.com/cderv/r-bucket.git``, then ``scoop install tinytex``) alternative installation instructions can be found at their website. Keep in mind that you will have to manage the LaTeX packages installed on your system yourself via ``tlmgr``. Therefore we only recommend this option if you know what you are doing." msgstr "" #: ../../source/installation/windows.rst:135 msgid "The full list of LaTeX packages which Manim interacts with in some way (a subset might be sufficient for your particular application) are::" msgstr "" #: ../../source/installation/windows.rst:146 msgid "Working with Manim" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/internals.pot000066400000000000000000000000011515024150700237400ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/plugins.pot000066400000000000000000000074371515024150700234460ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/plugins.rst:5 msgid "Plugins" msgstr "" #: ../../source/plugins.rst:7 msgid "Plugins are features that extend Manim's core functionality. Since Manim is extensible and not everything belongs in its core, we'll go over how to install, use, and create your own plugins." msgstr "" #: ../../source/plugins.rst:13 msgid "The standard naming convention for plugins is to prefix the plugin with ``manim-``. This makes them easy for users to find on package repositories such as PyPI." msgstr "" #: ../../source/plugins.rst:19 msgid "The plugin feature is new and under active development. Expect updates for the best practices on installing, using, and creating plugins; as well as new subcommands/flags for ``manim plugins``" msgstr "" #: ../../source/plugins.rst:25 msgid "See https://plugins.manim.community/ for the list of plugins available." msgstr "" #: ../../source/plugins.rst:28 msgid "Installing Plugins" msgstr "" #: ../../source/plugins.rst:29 msgid "Plugins can be easily installed via the ``pip`` command:" msgstr "" #: ../../source/plugins.rst:36 msgid "After installing a plugin, you may use the ``manim plugins`` command to list your available plugins, see the following help output:" msgstr "" #: ../../source/plugins.rst:52 msgid "You can list plugins as such:" msgstr "" #: ../../source/plugins.rst:61 msgid "Using Plugins in Projects" msgstr "" #: ../../source/plugins.rst:62 msgid "For enabling a plugin ``manim.cfg`` or command line parameters should be used." msgstr "" #: ../../source/plugins.rst:66 msgid "The plugins should be module name of the plugin and not PyPi name." msgstr "" #: ../../source/plugins.rst:68 msgid "Enabling plugins through ``manim.cfg``" msgstr "" #: ../../source/plugins.rst:75 msgid "For specifying multiple plugins, comma-separated values must be used." msgstr "" #: ../../source/plugins.rst:83 msgid "Creating Plugins" msgstr "" #: ../../source/plugins.rst:84 msgid "Plugins are intended to extend Manim's core functionality. If you aren't sure whether a feature should be included in Manim's core, feel free to ask over on the `Discord server `_. Visit `manim-plugintemplate `_ on PyPI.org which serves as an in-depth tutorial for creating plugins." msgstr "" #: ../../source/plugins.rst:94 msgid "The only requirement of manim plugins is that they specify an entry point with the group, ``\"manim.plugins\"``. This allows Manim to discover plugins available in the user's environment. Everything regarding the plugin's directory structure, build system, and naming are completely up to your discretion as an author. The aforementioned template plugin is only a model using Poetry since this is the build system Manim uses. The plugin's `entry point `_ can be specified in poetry as:" msgstr "" #: ../../source/plugins.rst:108 msgid "Here ``name`` is the name of the module of the plugin." msgstr "" #: ../../source/plugins.rst:110 msgid "Here ``object_reference`` can point to either a function in a module or a module itself. For example," msgstr "" #: ../../source/plugins.rst:118 msgid "Here a module is used as ``object_reference``, and when this plugin is enabled, Manim will look for ``__all__`` keyword defined in ``manim_plugintemplate`` and everything as a global variable one by one." msgstr "" #: ../../source/plugins.rst:122 msgid "If ``object_reference`` is a function, Manim calls the function and expects the function to return a list of modules or functions that need to be defined globally." msgstr "" #: ../../source/plugins.rst:125 msgid "For example," msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference.pot000066400000000000000000000016751515024150700237210ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference.rst:2 msgid "Reference Manual" msgstr "" #: ../../source/reference.rst:4 msgid "This reference manual details modules, functions, and variables included in Manim, describing what they are and what they do. For learning how to use Manim, see :doc:`tutorials/index`. For a list of changes since the last release, see the :doc:`changelog`." msgstr "" #: ../../source/reference.rst:9 msgid "The pages linked to here are currently a work in progress." msgstr "" #: ../../source/reference.rst:12 msgid "Inheritance Graphs" msgstr "" #: ../../source/reference.rst:15 msgid "Animations" msgstr "" #: ../../source/reference.rst:38 msgid "Cameras" msgstr "" #: ../../source/reference.rst:50 msgid "Mobjects" msgstr "" #: ../../source/reference.rst:88 msgid "Scenes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/000077500000000000000000000000001515024150700231645ustar00rootroot00000000000000manim._config.logger_utils.JSONFormatter.pot000066400000000000000000000047151515024150700334760ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim._config.logger_utils.JSONFormatter.rst:2 msgid "JSONFormatter" msgstr "" #: ../../source/reference/manim._config.logger_utils.JSONFormatter.rst:4 msgid "Qualified name: ``manim.\\_config.logger\\_utils.JSONFormatter``" msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.JSONFormatter:1 msgid "Bases: :py:class:`logging.Formatter`" msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.JSONFormatter:1 msgid "A formatter that outputs logs in a custom JSON format." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.JSONFormatter:3 msgid "This class is used internally for testing purposes." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.JSONFormatter:6 msgid "Initialize the formatter with specified format strings." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.JSONFormatter:8 msgid "Initialize the formatter either with the specified format string, or a default as described above. Allow for specialized date formatting with the optional datefmt argument. If datefmt is omitted, you get an ISO8601-like (or RFC 3339-like) format." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.JSONFormatter:13 msgid "Use a style parameter of '%', '{' or '$' to specify that you want to use one of %-formatting, :meth:`str.format` (``{}``) formatting or :class:`string.Template` formatting in your format string." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.JSONFormatter:17 msgid "Added the ``style`` parameter." msgstr "" #: ../../source/reference/manim._config.logger_utils.JSONFormatter.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim._config.logger_utils.JSONFormatter.rst:20::1 #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.JSONFormatter.format:1 msgid "Format the record in a custom JSON format." msgstr "" #: ../../source/reference/manim._config.logger_utils.JSONFormatter.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.JSONFormatter.format:0 msgid "Parameters" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim._config.logger_utils.pot000066400000000000000000000075451515024150700311250ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim._config.logger_utils.rst:2 msgid "logger\\_utils" msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils:1 msgid "Utilities to create and set the logger." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils:3 msgid "Manim's logger can be accessed as ``manim.logger``, or as ``logging.getLogger(\"manim\")``, once the library has been imported. Manim also exports a second object, ``console``, which should be used to print on screen messages that need not be logged." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils:8 msgid "Both ``logger`` and ``console`` use the ``rich`` library to produce rich text format." msgstr "" #: ../../source/reference/manim._config.logger_utils.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim._config.logger_utils.rst:26::1 msgid "A formatter that outputs logs in a custom JSON format." msgstr "" #: ../../source/reference/manim._config.logger_utils.rst:29 msgid "Functions" msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.make_logger:1 msgid "Make the manim logger and console." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.make_logger:0 #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.parse_theme:0 #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.set_file_logger:0 msgid "Parameters" msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.make_logger:3 #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.parse_theme:3 msgid "A parser containing any .cfg files in use." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.make_logger:5 msgid "The verbosity level of the logger." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.make_logger:0 #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.parse_theme:0 msgid "Returns" msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.make_logger:8 msgid "The manim logger and consoles. The first console outputs to stdout, the second to stderr. All use the theme returned by :func:`parse_theme`." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.make_logger:0 #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.parse_theme:0 #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.set_file_logger:0 msgid "Return type" msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.make_logger:16 msgid "Notes" msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.make_logger:17 msgid "The ``parser`` is assumed to contain only the options related to configuring the logger at the top level." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.parse_theme:1 msgid "Configure the rich style of logger and console output." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.parse_theme:6 msgid "The rich theme to be used by the manim logger." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.set_file_logger:1 msgid "Add a file handler to manim logger." msgstr "" #: ../../../manim/_config/logger_utils.py:docstring of manim._config.logger_utils.set_file_logger:3 msgid "The path to the file is built using ``config.log_dir``." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim._config.pot000066400000000000000000000024671515024150700264250ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim._config.rst:2 msgid "\\_config" msgstr "" #: ../../../manim/_config/__init__.py:docstring of manim._config:1 msgid "Set the global config and logger." msgstr "" #: ../../source/reference/manim._config.rst:20 msgid "Functions" msgstr "" #: ../../../manim/_config/__init__.py:docstring of manim._config.tempconfig:1 msgid "Context manager that temporarily modifies the global ``config`` object." msgstr "" #: ../../../manim/_config/__init__.py:docstring of manim._config.tempconfig:3 msgid "Inside the ``with`` statement, the modified config will be used. After context manager exits, the config will be restored to its original state." msgstr "" #: ../../../manim/_config/__init__.py:docstring of manim._config.tempconfig:0 msgid "Parameters" msgstr "" #: ../../../manim/_config/__init__.py:docstring of manim._config.tempconfig:6 msgid "Object whose keys will be used to temporarily update the global ``config``." msgstr "" #: ../../../manim/_config/__init__.py:docstring of manim._config.tempconfig:0 msgid "Return type" msgstr "" #: ../../../manim/_config/__init__.py:docstring of manim._config.tempconfig:11 msgid "Examples" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim._config.utils.ManimConfig.pot000066400000000000000000001102351515024150700317430ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim._config.utils.ManimConfig.rst:2 msgid "ManimConfig" msgstr "" #: ../../source/reference/manim._config.utils.ManimConfig.rst:4 msgid "Qualified name: ``manim.\\_config.utils.ManimConfig``" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:1 msgid "Bases: :py:class:`collections.abc.MutableMapping`" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:1 msgid "Dict-like class storing all config options." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:3 msgid "The global ``config`` object is an instance of this class, and acts as a single source of truth for all of the library's customizable behavior." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:6 msgid "The global ``config`` object is capable of digesting different types of sources and converting them into a uniform interface. These sources are (in ascending order of precedence): configuration files, command line arguments, and programmatic changes. Regardless of how the user chooses to set a config option, she can access its current value using :class:`ManimConfig`'s attributes and properties." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:14 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.copy:9 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_args:15 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_file:16 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:18 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:19 msgid "Notes" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:15 msgid "Each config option is implemented as a property of this class." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:17 msgid "Each config option can be set via a config file, using the full name of the property. If a config option has an associated CLI flag, then the flag is equal to the full name of the property. Those that admit an alternative flag or no flag at all are documented in the individual property's docstring." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:24 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:25 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:25 msgid "Examples" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:25 msgid "We use a copy of the global configuration object in the following examples for the sake of demonstration; you can skip these lines and just import ``config`` directly if you actually want to modify the configuration:" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:35 msgid "Each config option allows for dict syntax and attribute syntax. For example, the following two lines are equivalent," msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:44 msgid "The former is preferred; the latter is provided mostly for backwards compatibility." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:47 msgid "The config options are designed to keep internal consistency. For example, setting ``frame_y_radius`` will affect ``frame_height``:" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:58 msgid "There are many ways of interacting with config options. Take for example the config option ``background_color``. There are three ways to change it: via a config file, via CLI flags, or programmatically." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:62 msgid "To set the background color via a config file, save the following ``manim.cfg`` file with the following contents." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:70 msgid "In order to have this ``.cfg`` file apply to a manim scene, it needs to be placed in the same directory as the script," msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:79 msgid "Now, when the user executes" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:85 msgid "the background of the scene will be set to ``WHITE``. This applies regardless of where the manim command is invoked from." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:88 msgid "Command line arguments override ``.cfg`` files. In the previous example, executing" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:95 msgid "will set the background color to BLUE, regardless of the contents of ``manim.cfg``." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:98 msgid "Finally, any programmatic changes made within the scene script itself will override the command line arguments. For example, if ``scene.py`` contains the following" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:111 msgid "the background color will be set to RED, regardless of the contents of ``manim.cfg`` or the CLI arguments used when invoking manim." msgstr "" #: ../../source/reference/manim._config.utils.ManimConfig.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim._config.utils.ManimConfig.rst:26::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.copy:1 msgid "Deepcopy the contents of this ManimConfig." msgstr "" #: ../../source/reference/manim._config.utils.ManimConfig.rst:26::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_args:1 msgid "Process the config options present in CLI arguments." msgstr "" #: ../../source/reference/manim._config.utils.ManimConfig.rst:26::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_file:1 msgid "Process the config options present in a ``.cfg`` file." msgstr "" #: ../../source/reference/manim._config.utils.ManimConfig.rst:26::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:1 msgid "Process the config options present in a :class:`ConfigParser` object." msgstr "" #: ../../source/reference/manim._config.utils.ManimConfig.rst:26::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:1 msgid "Resolve a config option that stores a directory." msgstr "" #: ../../source/reference/manim._config.utils.ManimConfig.rst:26::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.update:1 msgid "Digest the options found in another :class:`ManimConfig` or in a dict." msgstr "" #: ../../source/reference/manim._config.utils.ManimConfig.rst:28 msgid "Attributes" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1 msgid "Aspect ratio (width / height) in pixels (--resolution, -r)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.assets_dir:1 msgid "Directory to locate video assets (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.background_color:1 msgid "Background color of the scene (-c)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.background_opacity:1 msgid "A number between 0.0 (fully transparent) and 1.0 (fully opaque)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.bottom:1 msgid "Coordinate at the center bottom of the frame." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.custom_folders:1 msgid "Whether to use custom folder output." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.disable_caching:1 msgid "Whether to use scene caching." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.disable_caching_warning:1 msgid "Whether a warning is raised if there are too much submobjects to hash." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.dry_run:1 msgid "Whether dry run is enabled." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.enable_gui:1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.gui_location:1 msgid "Enable GUI interaction." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.enable_wireframe:1 msgid "Enable wireframe debugging mode in opengl." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.ffmpeg_executable:1 msgid "Manually specify the path to the ffmpeg executable" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.ffmpeg_loglevel:1 msgid "Verbosity level of ffmpeg (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.flush_cache:1 msgid "Whether to delete all the cached partial movie files." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.force_window:1 msgid "Set to force window when using the opengl renderer" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.format:1 msgid "File format; \"png\", \"gif\", \"mp4\", \"webm\" or \"mov\"." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.frame_height:1 msgid "Frame height in logical units (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.frame_rate:1 msgid "Frame rate in frames per second." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.frame_size:1 msgid "Tuple with (pixel width, pixel height) (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.frame_width:1 msgid "Frame width in logical units (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.frame_x_radius:1 msgid "Half the frame width (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.frame_y_radius:1 msgid "Half the frame height (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.from_animation_number:1 msgid "Start rendering animations at this number (-n)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.fullscreen:1 msgid "Expand the window to its maximum possible size." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Directory to place images (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.input_file:1 msgid "Input file name." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.left_side:1 msgid "Coordinate at the middle left of the frame." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Directory to place logs." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.log_to_file:1 msgid "Whether to save logs to a file." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Maximum number of files cached." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Main output directory." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.media_embed:1 msgid "Embed videos in Jupyter notebook" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.media_width:1 msgid "Media width in Jupyter notebook" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.movie_file_extension:1 msgid "Either .mp4, .webm or .mov." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.notify_outdated_version:1 msgid "Whether to notify if there is a version update available." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.output_file:1 msgid "Output file name (-o)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Directory to place partial movie files (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.pixel_height:1 msgid "Frame height in pixels (--resolution, -r)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.pixel_width:1 msgid "Frame width in pixels (--resolution, -r)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.plugins:1 msgid "List of plugins to enable." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.preview:1 msgid "Whether to play the rendered movie (-p)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.progress_bar:1 msgid "Whether to show progress bars while rendering animations." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.quality:1 msgid "Video quality (-q)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.renderer:1 msgid "\"cairo\", \"opengl" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.right_side:1 msgid "Coordinate at the middle right of the frame." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.save_as_gif:1 msgid "Whether to save the rendered scene in .gif format (-i)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.save_last_frame:1 msgid "Whether to save the last frame of the scene as an image file (-s)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.save_pngs:1 msgid "Whether to save all frames in the scene as images files (-g)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.save_sections:1 msgid "Whether to save single videos for each section in addition to the movie file." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.scene_names:1 msgid "Scenes to play from file." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Directory to place section videos (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.show_in_file_browser:1 msgid "Whether to show the output file in the file browser (-f)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Directory to place tex (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Template used when rendering Tex." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "File to read Tex template from (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Directory to place text (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.top:1 msgid "Coordinate at the center top of the frame." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.transparent:1 msgid "Whether the background opacity is 0.0 (-t)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Stop rendering animations at this nmber." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.use_opengl_renderer:1 msgid "Whether or not to use the OpenGL renderer." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.use_projection_fill_shaders:1 msgid "Use shaders for OpenGLVMobject fill which are compatible with transformation matrices." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.use_projection_stroke_shaders:1 msgid "Use shaders for OpenGLVMobject stroke which are compatible with transformation matrices." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.verbosity:1 msgid "Logger verbosity; \"DEBUG\", \"INFO\", \"WARNING\", \"ERROR\", or \"CRITICAL\" (-v)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Directory to place videos (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.window_monitor:1 msgid "The monitor on which the scene will be rendered" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "Set the position of preview window." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "The size of the opengl window." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.write_all:1 msgid "Whether to render all scenes in the input file (-a)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.write_to_movie:1 msgid "Whether to render the scene to a movie file (-w)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.aspect_ratio:1::1 msgid "PNG zero padding." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.copy:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_args:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_file:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.update:0 msgid "Return type" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.copy:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_args:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_file:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:0 msgid "Returns" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.copy:3 msgid "A copy of this object containing no shared references." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.copy:10 msgid "This is the main mechanism behind :func:`tempconfig`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_args:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_file:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.update:0 msgid "Parameters" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_args:3 msgid "An object returned by :func:`.main_utils.parse_args()`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_args:6 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:12 msgid "**self** -- This object, after processing the contents of ``parser``." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_args:16 msgid "If ``args.config_file`` is a non-empty string, ``ManimConfig`` tries to digest the contents of said file with :meth:`~ManimConfig.digest_file` before digesting any other CLI arguments." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_file:3 msgid "This method processes a single ``.cfg`` file, whereas :meth:`~ManimConfig.digest_parser` can process arbitrary parsers, built perhaps from multiple ``.cfg`` files." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_file:7 msgid "Path to the ``.cfg`` file." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_file:10 msgid "**self** -- This object, after processing the contents of ``filename``." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_file:17 msgid "If there are multiple ``.cfg`` files to process, it is always more efficient to parse them into a single :class:`ConfigParser` object first and digesting them with one call to :meth:`~ManimConfig.digest_parser`, instead of calling this method multiple times." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:3 msgid "This method processes arbitrary parsers, not only those read from a single file, whereas :meth:`~ManimConfig.digest_file` can only process one file at a time." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:7 msgid "An object reflecting the contents of one or many ``.cfg`` files. In particular, it may reflect the contents of multiple files that have been parsed in a cascading fashion." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:19 msgid "If there are multiple ``.cfg`` files to process, it is always more efficient to parse them into a single :class:`ConfigParser` object first, and then call this function once (instead of calling :meth:`~.ManimConfig.digest_file` multiple times)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:26 msgid "To digest the config options set in two files, first create a ConfigParser and parse both files and then digest the parser:" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.digest_parser:35 msgid "In fact, the global ``config`` object is initialized like so:" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:3 msgid "Config options that store directories may depend on one another. This method is used to provide the actual directory to the end user." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:6 msgid "The config option to be resolved. Must be an option ending in ``'_dir'``, for example ``'media_dir'`` or ``'video_dir'``." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:9 msgid "Any strings to be used when resolving the directory." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:12 msgid "Path to the requested directory. If the path resolves to the empty string, return ``None`` instead." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.update:0 msgid "Raises" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:16 msgid "When ``key`` is not a config option that stores a directory and thus :meth:`~ManimConfig.get_dir` is not appropriate; or when ``key`` is appropriate but there is not enough information to resolve the directory." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:20 msgid "Standard :meth:`str.format` syntax is used to resolve the paths so the paths may contain arbitrary placeholders using f-string notation. However, these will require ``kwargs`` to contain the required values." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:26 msgid "The value of ``config.tex_dir`` is ``'{media_dir}/Tex'`` by default, i.e. it is a subfolder of wherever ``config.media_dir`` is located. In order to get the *actual* directory, use :meth:`~ManimConfig.get_dir`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:41 msgid "Resolving directories is done in a lazy way, at the last possible moment, to reflect any changes in other config options:" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:50 msgid "Some directories depend on information that is not available to :class:`ManimConfig`. For example, the default value of `video_dir` includes the name of the input file and the video quality (e.g. 480p15). This informamtion has to be supplied via ``kwargs``:" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:65 msgid "Note the quality does not need to be passed as keyword argument since :class:`ManimConfig` does store information about quality." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:68 msgid "Directories may be recursively defined. For example, the config option ``partial_movie_dir`` depends on ``video_dir``, which in turn depends on ``media_dir``:" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.get_dir:84 msgid "Standard f-string syntax is used. Arbitrary names can be used when defining directories, as long as the corresponding values are passed to :meth:`ManimConfig.get_dir` via ``kwargs``." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.images_dir:1 msgid "Directory to place images (no flag). See :meth:`ManimConfig.get_dir`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.log_dir:1 msgid "Directory to place logs. See :meth:`ManimConfig.get_dir`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.max_files_cached:1 msgid "Maximum number of files cached. Use -1 for infinity (no flag)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.media_dir:1 msgid "Main output directory. See :meth:`ManimConfig.get_dir`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.partial_movie_dir:1 msgid "Directory to place partial movie files (no flag). See :meth:`ManimConfig.get_dir`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.renderer:0 msgid "type" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.renderer:3 msgid "Renderer" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.sections_dir:1 msgid "Directory to place section videos (no flag). See :meth:`ManimConfig.get_dir`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.tex_dir:1 msgid "Directory to place tex (no flag). See :meth:`ManimConfig.get_dir`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.tex_template:1 msgid "Template used when rendering Tex. See :class:`.TexTemplate`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.tex_template_file:1 msgid "File to read Tex template from (no flag). See :class:`.TexTemplateFromFile`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.text_dir:1 msgid "Directory to place text (no flag). See :meth:`ManimConfig.get_dir`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.update:3 msgid "Similar to :meth:`dict.update`, replaces the values of this object with those of ``obj``." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.update:6 msgid "The object to copy values from." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.update:11 msgid "If ``obj`` is a dict but contains keys that do not belong to any config options." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.upto_animation_number:1 msgid "Stop rendering animations at this nmber. Use -1 to avoid skipping (-n)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.video_dir:1 msgid "Directory to place videos (no flag). See :meth:`ManimConfig.get_dir`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.window_position:1 msgid "Set the position of preview window. You can use directions, e.g. UL/DR/ORIGIN/LEFT...or the position(pixel) of the upper left corner of the window, e.g. '960,540'" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimConfig.window_size:1 msgid "The size of the opengl window. 'default' to automatically scale the window based on the display monitor." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim._config.utils.ManimFrame.pot000066400000000000000000000014661515024150700315750ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim._config.utils.ManimFrame.rst:2 msgid "ManimFrame" msgstr "" #: ../../source/reference/manim._config.utils.ManimFrame.rst:4 msgid "Qualified name: ``manim.\\_config.utils.ManimFrame``" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimFrame:1 msgid "Bases: :py:class:`collections.abc.Mapping`" msgstr "" #: ../../source/reference/manim._config.utils.ManimFrame.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim._config.utils.ManimFrame.rst:21 msgid "Attributes" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.ManimFrame:0 msgid "Parameters" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim._config.utils.pot000066400000000000000000000113621515024150700275560ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim._config.utils.rst:2 msgid "utils" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils:1 msgid "Utilities to create and set the config." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils:3 msgid "The main class exported by this module is :class:`ManimConfig`. This class contains all configuration options, including frame geometry (e.g. frame height/width, frame rate), output (e.g. directories, logging), styling (e.g. background color, transparency), and general behavior (e.g. writing a movie vs writing a single frame)." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils:9 msgid "See :doc:`/guides/configuration` for an introduction to Manim's configuration system." msgstr "" #: ../../source/reference/manim._config.utils.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim._config.utils.rst:28::1 msgid "Dict-like class storing all config options." msgstr "" #: ../../source/reference/manim._config.utils.rst:31 msgid "Functions" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.config_file_paths:1 msgid "The paths where ``.cfg`` files will be searched for." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.config_file_paths:3 msgid "When manim is first imported, it processes any ``.cfg`` files it finds. This function returns the locations in which these files are searched for. In ascending order of precedence, these are: the library-wide config file, the user-wide config file, and the folder-wide config file." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.config_file_paths:8 msgid "The library-wide config file determines manim's default behavior. The user-wide config file is stored in the user's home folder, and determines the behavior of manim whenever the user invokes it from anywhere in the system. The folder-wide config file only affects scenes that are in the same folder. The latter two files are optional." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.config_file_paths:14 msgid "These files, if they exist, are meant to loaded into a single :class:`configparser.ConfigParser` object, and then processed by :class:`ManimConfig`." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.config_file_paths:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.make_config_parser:0 msgid "Returns" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.config_file_paths:18 msgid "List of paths which may contain ``.cfg`` files, in ascending order of precedence." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.config_file_paths:0 #: ../../../manim/_config/utils.py:docstring of manim._config.utils.make_config_parser:0 msgid "Return type" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.config_file_paths:20 msgid "List[:class:`Path`]" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.config_file_paths:25 msgid "Notes" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.config_file_paths:26 msgid "The location of the user-wide config file is OS-specific." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.make_config_parser:1 msgid "Make a :class:`ConfigParser` object and load any ``.cfg`` files." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.make_config_parser:3 msgid "The user-wide file, if it exists, overrides the library-wide file. The folder-wide file, if it exists, overrides the other two." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.make_config_parser:6 msgid "The folder-wide file can be ignored by passing ``custom_file``. However, the user-wide and library-wide config files cannot be ignored." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.make_config_parser:0 msgid "Parameters" msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.make_config_parser:9 msgid "Path to a custom config file. If used, the folder-wide file in the relevant directory will be ignored, if it exists. If None, the folder-wide file will be used, if it exists." msgstr "" #: ../../../manim/_config/utils.py:docstring of manim._config.utils.make_config_parser:14 msgid "A parser containing the config options found in the .cfg files that were found. It is guaranteed to contain at least the config options found in the library-wide file." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.animation.Animation.pot000066400000000000000000000436451515024150700326770ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.animation.Animation.rst:2 msgid "Animation" msgstr "" #: ../../source/reference/manim.animation.animation.Animation.rst:4 msgid "Qualified name: ``manim.animation.animation.Animation``" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:1 msgid "An animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:3 msgid "Animations have a fixed time span." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.clean_up_from_scene:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_sub_alpha:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.interpolate:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.interpolate_mobject:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_name:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_rate_func:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_run_time:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.update_mobjects:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:5 msgid "The mobject to be animated. This is not required for all types of animations." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:6 msgid "Defines the delay after which the animation is applied to submobjects. This lag is relative to the duration of the animation. This does not influence the total runtime of the animation. Instead the runtime of individual animations is adjusted so that the complete animation has the defined run time." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:6 msgid "Defines the delay after which the animation is applied to submobjects. This lag is relative to the duration of the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:9 msgid "This does not influence the total runtime of the animation. Instead the runtime of individual animations is adjusted so that the complete animation has the defined run time." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:12 msgid "The duration of the animation in seconds." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:13 msgid "The function defining the animation progress based on the relative runtime (see :mod:`~.rate_functions`) . For example ``rate_func(0.5)`` is the proportion of the animation that is done after half of the animations run time." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:13 msgid "The function defining the animation progress based on the relative runtime (see :mod:`~.rate_functions`) ." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:15 msgid "For example ``rate_func(0.5)`` is the proportion of the animation that is done after half of the animations run time." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:21 msgid "reverse_rate_function" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:19 msgid "Reverses the rate function of the animation. Setting ``reverse_rate_function`` does not have any effect on ``remover`` or ``introducer``. These need to be set explicitly if an introducer-animation should be turned into a remover one and vice versa." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:24 msgid "name" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:24 msgid "The name of the animation. This gets displayed while rendering the animation. Defaults to ()." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:26 msgid "remover" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:27 msgid "Whether the given mobject should be removed from the scene after this animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:30 msgid "suspend_mobject_updating" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:29 msgid "Whether updaters of the mobject should be suspended during the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:34 msgid "In the current implementation of this class, the specified rate function is applied within :meth:`.Animation.interpolate_mobject` call as part of the call to :meth:`.Animation.interpolate_submobject`. For subclasses of :class:`.Animation` that are implemented by overriding :meth:`interpolate_mobject`, the rate function has to be applied manually (e.g., by passing ``self.rate_func(alpha)`` instead of just ``alpha``)." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation:43 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.animation.Animation.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1 msgid "Begin the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.clean_up_from_scene:1 msgid "Clean up the :class:`~.Scene` after finishing the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.copy:1 msgid "Create a copy of the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.finish:1 msgid "Finish the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_all_mobjects:1 msgid "Get all mobjects involved in the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_all_mobjects_to_update:1 msgid "Get all mobjects to be updated during the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_rate_func:1 msgid "Get the rate function of the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_run_time:1 msgid "Get the run time of the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_sub_alpha:1 msgid "Get the animation progress of any submobjects subanimation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.interpolate:1 msgid "Set the animation progress." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.interpolate_mobject:1 msgid "Interpolates the mobject of the :class:`Animation` based on alpha value." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.is_introducer:1 msgid "Test if the animation is an introducer." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.is_remover:1 msgid "Test if the animation is a remover." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_name:1 msgid "Set the name of the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_rate_func:1 msgid "Set the rate function of the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_run_time:1 msgid "Set the run time of the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:1::1 msgid "Updates things like starting_mobject, and (for Transforms) target_mobject." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:3 msgid "This method is called right as an animation is being played. As much initialization as possible, especially any mobject copying, should live in this method." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.begin:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.clean_up_from_scene:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.copy:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.finish:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_all_mobjects:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_all_mobjects_to_update:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_rate_func:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_run_time:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_sub_alpha:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.interpolate:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.interpolate_mobject:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.is_introducer:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.is_remover:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_name:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_rate_func:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_run_time:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.update_mobjects:0 msgid "Return type" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.clean_up_from_scene:3 msgid "This includes to :meth:`~.Scene.remove` the Animation's :class:`~.Mobject` if the animation is a remover." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.clean_up_from_scene:6 msgid "The scene the animation should be cleaned up from." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.copy:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_all_mobjects:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_all_mobjects_to_update:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_rate_func:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_run_time:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_sub_alpha:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.is_introducer:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.is_remover:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_name:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_rate_func:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_run_time:0 msgid "Returns" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.copy:3 msgid "A copy of ``self``" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.finish:3 msgid "This method gets called when the animation is over." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_all_mobjects:3 msgid "Ordering must match the ordering of arguments to interpolate_submobject" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_all_mobjects:5 msgid "The sequence of mobjects." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_all_mobjects_to_update:3 msgid "The list of mobjects to be updated during the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_rate_func:3 msgid "The rate function of the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_run_time:3 msgid "The time the animation takes in seconds." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_sub_alpha:3 msgid "The overall animation progress" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_sub_alpha:4 msgid "The index of the subanimation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_sub_alpha:5 msgid "The total count of subanimations." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.get_sub_alpha:7 msgid "The progress of the subanimation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.interpolate:3 msgid "This method gets called for every frame during an animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.interpolate:5 msgid "The relative time to set the animation to, 0 meaning the start, 1 meaning the end." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.interpolate_mobject:3 msgid "A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.is_introducer:3 msgid "``True`` if the animation is an introducer, ``False`` otherwise." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.is_remover:3 msgid "``True`` if the animation is a remover, ``False`` otherwise." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_name:3 msgid "The new name of the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_name:5 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_rate_func:5 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_run_time:7 msgid "``self``" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_rate_func:3 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_run_time:3 msgid "The new time the animation should take in seconds." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Animation.set_run_time:4 msgid "The run_time of an animation should not be changed while it is already running." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.animation.Wait.pot000066400000000000000000000123721515024150700316550ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.animation.Wait.rst:2 msgid "Wait" msgstr "" #: ../../source/reference/manim.animation.animation.Wait.rst:4 msgid "Qualified name: ``manim.animation.animation.Wait``" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait:1 msgid "A \"no operation\" animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.clean_up_from_scene:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.interpolate:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.update_mobjects:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait:3 msgid "The amount of time that should pass." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait:4 msgid "A function without positional arguments that evaluates to a boolean. The function is evaluated after every new frame has been rendered. Playing the animation only stops after the return value is truthy. Overrides the specified ``run_time``." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait:8 msgid "Controls whether or not the wait animation is static, i.e., corresponds to a frozen frame. If ``False`` is passed, the render loop still progresses through the animation as usual and (among other things) continues to call updater functions. If ``None`` (the default value), the :meth:`.Scene.play` call tries to determine whether the Wait call can be static or not itself via :meth:`.Scene.should_mobjects_update`." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait:14 msgid "Keyword arguments to be passed to the parent class, :class:`.Animation`." msgstr "" #: ../../source/reference/manim.animation.animation.Wait.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.begin:1 msgid "Begin the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.clean_up_from_scene:1 msgid "Clean up the :class:`~.Scene` after finishing the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.finish:1 msgid "Finish the animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.begin:1::1 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.interpolate:1 msgid "Set the animation progress." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.begin:1::1 msgid "Updates things like starting_mobject, and (for Transforms) target_mobject." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.begin:3 msgid "This method is called right as an animation is being played. As much initialization as possible, especially any mobject copying, should live in this method." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.begin:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.clean_up_from_scene:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.finish:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.interpolate:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.update_mobjects:0 msgid "Return type" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.clean_up_from_scene:3 msgid "This includes to :meth:`~.Scene.remove` the Animation's :class:`~.Mobject` if the animation is a remover." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.clean_up_from_scene:6 msgid "The scene the animation should be cleaned up from." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.finish:3 msgid "This method gets called when the animation is over." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.interpolate:3 msgid "This method gets called for every frame during an animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.Wait.interpolate:5 msgid "The relative time to set the animation to, 0 meaning the start, 1 meaning the end." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.animation.pot000066400000000000000000000047021515024150700307500ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.animation.rst:2 msgid "animation" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation:1 msgid "Animate mobjects." msgstr "" #: ../../source/reference/manim.animation.animation.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.animation.animation.rst:28::1 msgid "An animation." msgstr "" #: ../../source/reference/manim.animation.animation.rst:28::1 msgid "A \"no operation\" animation." msgstr "" #: ../../source/reference/manim.animation.animation.rst:31 msgid "Functions" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.override_animation:1 msgid "Decorator used to mark methods as overrides for specific :class:`~.Animation` types." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.override_animation:3 msgid "Should only be used to decorate methods of classes derived from :class:`~.Mobject`. ``Animation`` overrides get inherited to subclasses of the ``Mobject`` who defined them. They don't override subclasses of the ``Animation`` they override." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.override_animation:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.prepare_animation:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.override_animation:9 msgid "The animation to be overridden." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.override_animation:0 msgid "Returns" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.override_animation:11 msgid "The actual decorator. This marks the method as overriding an animation." msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.override_animation:0 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.prepare_animation:0 msgid "Return type" msgstr "" #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.override_animation:15 #: ../../../manim/animation/animation.py:docstring of manim.animation.animation.prepare_animation:5 msgid "Examples" msgstr "" manim.animation.changing.AnimatedBoundary.pot000066400000000000000000000033111515024150700337100ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.changing.AnimatedBoundary.rst:2 msgid "AnimatedBoundary" msgstr "" #: ../../source/reference/manim.animation.changing.AnimatedBoundary.rst:4 msgid "Qualified name: ``manim.animation.changing.AnimatedBoundary``" msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.AnimatedBoundary:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.AnimatedBoundary:1 msgid "Boundary of a :class:`.VMobject` with animated color change." msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.AnimatedBoundary:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.changing.AnimatedBoundary.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.changing.AnimatedBoundary.rst:23 msgid "Attributes" msgstr "" #: ../../source/reference/manim.animation.changing.AnimatedBoundary.rst:34::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.animation.changing.AnimatedBoundary.rst:34::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.animation.changing.AnimatedBoundary.rst:34::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.animation.changing.AnimatedBoundary.rst:34::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.changing.TracedPath.pot000066400000000000000000000045231515024150700325660ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.changing.TracedPath.rst:2 msgid "TracedPath" msgstr "" #: ../../source/reference/manim.animation.changing.TracedPath.rst:4 msgid "Qualified name: ``manim.animation.changing.TracedPath``" msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.TracedPath:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.TracedPath:1 msgid "Traces the path of a point returned by a function call." msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.TracedPath:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.TracedPath:3 msgid "The function to be traced." msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.TracedPath:4 msgid "The width of the trace." msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.TracedPath:5 msgid "The color of the trace." msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.TracedPath:6 msgid "The time taken for the path to dissipate. Default set to ``None`` which disables dissipation." msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing.TracedPath:10 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.changing.TracedPath.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.changing.TracedPath.rst:22 msgid "Attributes" msgstr "" #: ../../source/reference/manim.animation.changing.TracedPath.rst:33::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.animation.changing.TracedPath.rst:33::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.animation.changing.TracedPath.rst:33::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.animation.changing.TracedPath.rst:33::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.changing.pot000066400000000000000000000011711515024150700305440ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.changing.rst:2 msgid "changing" msgstr "" #: ../../../manim/animation/changing.py:docstring of manim.animation.changing:1 msgid "Animation of a mobject boundary and tracing of points." msgstr "" #: ../../source/reference/manim.animation.changing.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.animation.changing.rst:22::1 msgid "Boundary of a :class:`.VMobject` with animated color change." msgstr "" manim.animation.composition.AnimationGroup.pot000066400000000000000000000132011515024150700342020ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.composition.AnimationGroup.rst:2 msgid "AnimationGroup" msgstr "" #: ../../source/reference/manim.animation.composition.AnimationGroup.rst:4 msgid "Qualified name: ``manim.animation.composition.AnimationGroup``" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../source/reference/manim.animation.composition.AnimationGroup.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.begin:1::1 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.begin:1 msgid "Begin the animation." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.begin:1::1 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.build_animations_with_timings:1 msgid "Creates a list of triplets of the form (anim, start_time, end_time)" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.begin:1::1 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.clean_up_from_scene:1 msgid "Clean up the :class:`~.Scene` after finishing the animation." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.begin:1::1 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.finish:1 msgid "Finish the animation." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.begin:1::1 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.get_all_mobjects:1 msgid "Get all mobjects involved in the animation." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.begin:1::1 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.interpolate:1 msgid "Set the animation progress." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.begin:1::1 msgid "Updates things like starting_mobject, and (for Transforms) target_mobject." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.begin:3 msgid "This method is called right as an animation is being played. As much initialization as possible, especially any mobject copying, should live in this method." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.begin:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.build_animations_with_timings:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.clean_up_from_scene:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.finish:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.get_all_mobjects:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.interpolate:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.update_mobjects:0 msgid "Return type" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.clean_up_from_scene:3 msgid "This includes to :meth:`~.Scene.remove` the Animation's :class:`~.Mobject` if the animation is a remover." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.clean_up_from_scene:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.interpolate:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.update_mobjects:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.clean_up_from_scene:6 msgid "The scene the animation should be cleaned up from." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.finish:3 msgid "This method gets called when the animation is over." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.get_all_mobjects:3 msgid "Ordering must match the ordering of arguments to interpolate_submobject" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.get_all_mobjects:0 msgid "Returns" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.get_all_mobjects:5 msgid "The sequence of mobjects." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.interpolate:3 msgid "This method gets called for every frame during an animation." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.AnimationGroup.interpolate:5 msgid "The relative time to set the animation to, 0 meaning the start, 1 meaning the end." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.composition.LaggedStart.pot000066400000000000000000000011141515024150700335260ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.composition.LaggedStart.rst:2 msgid "LaggedStart" msgstr "" #: ../../source/reference/manim.animation.composition.LaggedStart.rst:4 msgid "Qualified name: ``manim.animation.composition.LaggedStart``" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.LaggedStart:1 msgid "Bases: :py:class:`manim.animation.composition.AnimationGroup`" msgstr "" manim.animation.composition.LaggedStartMap.pot000066400000000000000000000011301515024150700341030ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.composition.LaggedStartMap.rst:2 msgid "LaggedStartMap" msgstr "" #: ../../source/reference/manim.animation.composition.LaggedStartMap.rst:4 msgid "Qualified name: ``manim.animation.composition.LaggedStartMap``" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.LaggedStartMap:1 msgid "Bases: :py:class:`manim.animation.composition.LaggedStart`" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.composition.Succession.pot000066400000000000000000000062761515024150700334610ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.composition.Succession.rst:2 msgid "Succession" msgstr "" #: ../../source/reference/manim.animation.composition.Succession.rst:4 msgid "Qualified name: ``manim.animation.composition.Succession``" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession:1 msgid "Bases: :py:class:`manim.animation.composition.AnimationGroup`" msgstr "" #: ../../source/reference/manim.animation.composition.Succession.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.begin:1::1 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.begin:1 msgid "Begin the animation." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.begin:1::1 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.finish:1 msgid "Finish the animation." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.begin:1::1 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.interpolate:1 msgid "Set the animation progress." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.begin:1::1 msgid "Updates things like starting_mobject, and (for Transforms) target_mobject." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.begin:3 msgid "This method is called right as an animation is being played. As much initialization as possible, especially any mobject copying, should live in this method." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.begin:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.finish:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.interpolate:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.update_mobjects:0 msgid "Return type" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.finish:3 msgid "This method gets called when the animation is over." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.interpolate:3 msgid "This method gets called for every frame during an animation." msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.interpolate:0 #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.update_mobjects:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition.Succession.interpolate:5 msgid "The relative time to set the animation to, 0 meaning the start, 1 meaning the end." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.composition.pot000066400000000000000000000007511515024150700313340ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.composition.rst:2 msgid "composition" msgstr "" #: ../../../manim/animation/composition.py:docstring of manim.animation.composition:1 msgid "Tools for displaying multiple animations at once." msgstr "" #: ../../source/reference/manim.animation.composition.rst:15 msgid "Classes" msgstr "" manim.animation.creation.AddTextLetterByLetter.pot000066400000000000000000000024211515024150700347010ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.AddTextLetterByLetter.rst:2 msgid "AddTextLetterByLetter" msgstr "" #: ../../source/reference/manim.animation.creation.AddTextLetterByLetter.rst:4 msgid "Qualified name: ``manim.animation.creation.AddTextLetterByLetter``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.AddTextLetterByLetter:1 msgid "Bases: :py:class:`manim.animation.creation.ShowIncreasingSubsets`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.AddTextLetterByLetter:1 msgid "Show a :class:`~.Text` letter by letter on the scene." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.AddTextLetterByLetter:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.AddTextLetterByLetter:3 msgid "Frequency of appearance of the letters." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.AddTextLetterByLetter:5 msgid "This is currently only possible for class:`~.Text` and not for class:`~.MathTex`" msgstr "" manim.animation.creation.AddTextWordByWord.pot000066400000000000000000000014261515024150700340350ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.AddTextWordByWord.rst:2 msgid "AddTextWordByWord" msgstr "" #: ../../source/reference/manim.animation.creation.AddTextWordByWord.rst:4 msgid "Qualified name: ``manim.animation.creation.AddTextWordByWord``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.AddTextWordByWord:1 msgid "Bases: :py:class:`manim.animation.composition.Succession`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.AddTextWordByWord:1 msgid "Show a :class:`~.Text` word by word on the scene. Note: currently broken." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.creation.Create.pot000066400000000000000000000024471515024150700320030ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.Create.rst:2 msgid "Create" msgstr "" #: ../../source/reference/manim.animation.creation.Create.rst:4 msgid "Qualified name: ``manim.animation.creation.Create``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Create:1 msgid "Bases: :py:class:`manim.animation.creation.ShowPartial`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Create:1 msgid "Incrementally show a VMobject." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Create:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Create:3 msgid "The VMobject to animate." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Create:0 msgid "Raises" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Create:6 msgid "If ``mobject`` is not an instance of :class:`~.VMobject`." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Create:9 msgid "Examples" msgstr "" manim.animation.creation.DrawBorderThenFill.pot000066400000000000000000000046151515024150700342010ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.DrawBorderThenFill.rst:2 msgid "DrawBorderThenFill" msgstr "" #: ../../source/reference/manim.animation.creation.DrawBorderThenFill.rst:4 msgid "Qualified name: ``manim.animation.creation.DrawBorderThenFill``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill:1 msgid "Draw the border first and then show the fill." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.creation.DrawBorderThenFill.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill.begin:1::1 #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill.begin:1 msgid "Begin the animation." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill.begin:1::1 #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill.get_all_mobjects:1 msgid "Get all mobjects involved in the animation." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill.begin:3 msgid "This method is called right as an animation is being played. As much initialization as possible, especially any mobject copying, should live in this method." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill.begin:0 #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill.get_all_mobjects:0 msgid "Return type" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill.get_all_mobjects:3 msgid "Ordering must match the ordering of arguments to interpolate_submobject" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.DrawBorderThenFill.get_all_mobjects:0 msgid "Returns" msgstr "" manim.animation.creation.ShowIncreasingSubsets.pot000066400000000000000000000035531515024150700350140ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.ShowIncreasingSubsets.rst:2 msgid "ShowIncreasingSubsets" msgstr "" #: ../../source/reference/manim.animation.creation.ShowIncreasingSubsets.rst:4 msgid "Qualified name: ``manim.animation.creation.ShowIncreasingSubsets``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowIncreasingSubsets:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowIncreasingSubsets:1 msgid "Show one submobject at a time, leaving all previous ones displayed on screen." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowIncreasingSubsets:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.creation.ShowIncreasingSubsets.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowIncreasingSubsets.interpolate_mobject:1::1 #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowIncreasingSubsets.interpolate_mobject:1 msgid "Interpolates the mobject of the :class:`Animation` based on alpha value." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowIncreasingSubsets.interpolate_mobject:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowIncreasingSubsets.interpolate_mobject:3 msgid "A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.creation.ShowPartial.pot000066400000000000000000000021451515024150700330300ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.ShowPartial.rst:2 msgid "ShowPartial" msgstr "" #: ../../source/reference/manim.animation.creation.ShowPartial.rst:4 msgid "Qualified name: ``manim.animation.creation.ShowPartial``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowPartial:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowPartial:1 msgid "Abstract class for Animations that show the VMobject partially." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowPartial:0 msgid "Raises" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowPartial:3 msgid "If ``mobject`` is not an instance of :class:`~.VMobject`." msgstr "" #: ../../source/reference/manim.animation.creation.ShowPartial.rst:14 msgid "Methods" msgstr "" manim.animation.creation.ShowSubmobjectsOneByOne.pot000066400000000000000000000016701515024150700352360ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.ShowSubmobjectsOneByOne.rst:2 msgid "ShowSubmobjectsOneByOne" msgstr "" #: ../../source/reference/manim.animation.creation.ShowSubmobjectsOneByOne.rst:4 msgid "Qualified name: ``manim.animation.creation.ShowSubmobjectsOneByOne``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowSubmobjectsOneByOne:1 msgid "Bases: :py:class:`manim.animation.creation.ShowIncreasingSubsets`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.ShowSubmobjectsOneByOne:1 msgid "Show one submobject at a time, removing all previously displayed ones from screen." msgstr "" #: ../../source/reference/manim.animation.creation.ShowSubmobjectsOneByOne.rst:14 msgid "Methods" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.creation.SpiralIn.pot000066400000000000000000000043751515024150700323230ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.SpiralIn.rst:2 msgid "SpiralIn" msgstr "" #: ../../source/reference/manim.animation.creation.SpiralIn.rst:4 msgid "Qualified name: ``manim.animation.creation.SpiralIn``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn:1 msgid "Create the Mobject with sub-Mobjects flying in on spiral trajectories." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn:0 #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn.interpolate_mobject:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn:3 msgid "The Mobject on which to be operated." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn:4 msgid "The factor used for scaling the effect." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn:5 msgid "Fractional duration of initial fade-in of sub-Mobjects as they fly inward." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn:8 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.creation.SpiralIn.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn.interpolate_mobject:1::1 #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn.interpolate_mobject:1 msgid "Interpolates the mobject of the :class:`Animation` based on alpha value." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.SpiralIn.interpolate_mobject:3 msgid "A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.creation.Uncreate.pot000066400000000000000000000014511515024150700323400ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.Uncreate.rst:2 msgid "Uncreate" msgstr "" #: ../../source/reference/manim.animation.creation.Uncreate.rst:4 msgid "Qualified name: ``manim.animation.creation.Uncreate``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Uncreate:1 msgid "Bases: :py:class:`manim.animation.creation.Create`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Uncreate:1 msgid "Like :class:`Create` but in reverse." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Uncreate:4 msgid "Examples" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.creation.Unwrite.pot000066400000000000000000000021571515024150700322330ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.Unwrite.rst:2 msgid "Unwrite" msgstr "" #: ../../source/reference/manim.animation.creation.Unwrite.rst:4 msgid "Qualified name: ``manim.animation.creation.Unwrite``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Unwrite:1 msgid "Bases: :py:class:`manim.animation.creation.Write`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Unwrite:1 msgid "Simulate erasing by hand a :class:`~.Text` or a :class:`~.VMobject`." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Unwrite:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Unwrite:3 msgid "Set True to have the animation start erasing from the last submobject first." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Unwrite:7 msgid "Examples" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.creation.Write.pot000066400000000000000000000035531515024150700316710ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.Write.rst:2 msgid "Write" msgstr "" #: ../../source/reference/manim.animation.creation.Write.rst:4 msgid "Qualified name: ``manim.animation.creation.Write``" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Write:1 msgid "Bases: :py:class:`manim.animation.creation.DrawBorderThenFill`" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Write:1 msgid "Simulate hand-writing a :class:`~.Text` or hand-drawing a :class:`~.VMobject`." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Write:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.creation.Write.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Write.begin:1::1 #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Write.begin:1 msgid "Begin the animation." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Write.begin:1::1 #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Write.finish:1 msgid "Finish the animation." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Write.begin:3 msgid "This method is called right as an animation is being played. As much initialization as possible, especially any mobject copying, should live in this method." msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Write.begin:0 #: ../../../manim/animation/creation.py:docstring of manim.animation.creation.Write.finish:0 msgid "Return type" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.creation.pot000066400000000000000000000037131515024150700305760ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.creation.rst:2 msgid "creation" msgstr "" #: ../../../manim/animation/creation.py:docstring of manim.animation.creation:1 msgid "Animate the display or removal of a mobject from a scene." msgstr "" #: ../../source/reference/manim.animation.creation.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.animation.creation.rst:40::1 msgid "Show a :class:`~.Text` letter by letter on the scene." msgstr "" #: ../../source/reference/manim.animation.creation.rst:40::1 msgid "Show a :class:`~.Text` word by word on the scene." msgstr "" #: ../../source/reference/manim.animation.creation.rst:40::1 msgid "Incrementally show a VMobject." msgstr "" #: ../../source/reference/manim.animation.creation.rst:40::1 msgid "Draw the border first and then show the fill." msgstr "" #: ../../source/reference/manim.animation.creation.rst:40::1 msgid "Show one submobject at a time, leaving all previous ones displayed on screen." msgstr "" #: ../../source/reference/manim.animation.creation.rst:40::1 msgid "Abstract class for Animations that show the VMobject partially." msgstr "" #: ../../source/reference/manim.animation.creation.rst:40::1 msgid "Show one submobject at a time, removing all previously displayed ones from screen." msgstr "" #: ../../source/reference/manim.animation.creation.rst:40::1 msgid "Create the Mobject with sub-Mobjects flying in on spiral trajectories." msgstr "" #: ../../source/reference/manim.animation.creation.rst:40::1 msgid "Like :class:`Create` but in reverse." msgstr "" #: ../../source/reference/manim.animation.creation.rst:40::1 msgid "Simulate erasing by hand a :class:`~.Text` or a :class:`~.VMobject`." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.fading.FadeIn.pot000066400000000000000000000034321515024150700313450ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.fading.FadeIn.rst:2 msgid "FadeIn" msgstr "" #: ../../source/reference/manim.animation.fading.FadeIn.rst:4 msgid "Qualified name: ``manim.animation.fading.FadeIn``" msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeIn:1 msgid "Bases: :py:class:`manim.animation.fading._Fade`" msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeIn:1 msgid "Fade in :class:`~.Mobject` s." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeIn:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeIn:3 msgid "The mobjects to be faded in." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeIn:4 msgid "The vector by which the mobject shifts while being faded in." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeIn:5 msgid "The position from which the mobject starts while being faded in. In case another mobject is given as target position, its center is used." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeIn:7 msgid "The factor by which the mobject is scaled initially before being rescaling to its original size while being faded in." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeIn:11 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.fading.FadeIn.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.fading.FadeIn.rst:23 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.fading.FadeOut.pot000066400000000000000000000047671515024150700315620ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.fading.FadeOut.rst:2 msgid "FadeOut" msgstr "" #: ../../source/reference/manim.animation.fading.FadeOut.rst:4 msgid "Qualified name: ``manim.animation.fading.FadeOut``" msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut:1 msgid "Bases: :py:class:`manim.animation.fading._Fade`" msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut:1 msgid "Fade out :class:`~.Mobject` s." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut:0 #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut.clean_up_from_scene:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut:3 msgid "The mobjects to be faded out." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut:4 msgid "The vector by which the mobject shifts while being faded out." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut:5 msgid "The position to which the mobject moves while being faded out. In case another mobject is given as target position, its center is used." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut:7 msgid "The factor by which the mobject is scaled while being faded out." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut:10 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.fading.FadeOut.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.fading.FadeOut.rst:21::1 #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut.clean_up_from_scene:1 msgid "Clean up the :class:`~.Scene` after finishing the animation." msgstr "" #: ../../source/reference/manim.animation.fading.FadeOut.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut.clean_up_from_scene:3 msgid "This includes to :meth:`~.Scene.remove` the Animation's :class:`~.Mobject` if the animation is a remover." msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading.FadeOut.clean_up_from_scene:6 msgid "The scene the animation should be cleaned up from." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.fading.pot000066400000000000000000000010621515024150700302150ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.fading.rst:2 msgid "fading" msgstr "" #: ../../../manim/animation/fading.py:docstring of manim.animation.fading:1 msgid "Fading in and out of view." msgstr "" #: ../../source/reference/manim.animation.fading.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.animation.fading.rst:22::1 msgid "Fade in :class:`~.Mobject` s." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.growing.GrowArrow.pot000066400000000000000000000027321515024150700323760ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.growing.GrowArrow.rst:2 msgid "GrowArrow" msgstr "" #: ../../source/reference/manim.animation.growing.GrowArrow.rst:4 msgid "Qualified name: ``manim.animation.growing.GrowArrow``" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowArrow:1 msgid "Bases: :py:class:`manim.animation.growing.GrowFromPoint`" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowArrow:1 msgid "Introduce an :class:`~.Arrow` by growing it from its start toward its tip." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowArrow:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowArrow:3 msgid "The arrow to be introduced." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowArrow:4 msgid "Initial color of the arrow before growing to its full size. Leave empty to match arrow's color." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowArrow:7 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.growing.GrowArrow.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.growing.GrowArrow.rst:22 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.growing.GrowFromCenter.pot000066400000000000000000000030211515024150700333400ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.growing.GrowFromCenter.rst:2 msgid "GrowFromCenter" msgstr "" #: ../../source/reference/manim.animation.growing.GrowFromCenter.rst:4 msgid "Qualified name: ``manim.animation.growing.GrowFromCenter``" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromCenter:1 msgid "Bases: :py:class:`manim.animation.growing.GrowFromPoint`" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromCenter:1 msgid "Introduce an :class:`~.Mobject` by growing it from its center." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromCenter:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromCenter:3 msgid "The mobjects to be introduced." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromCenter:4 msgid "Initial color of the mobject before growing to its full size. Leave empty to match mobject's color." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromCenter:7 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.growing.GrowFromCenter.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.growing.GrowFromCenter.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.growing.GrowFromEdge.pot000066400000000000000000000032561515024150700327760ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.growing.GrowFromEdge.rst:2 msgid "GrowFromEdge" msgstr "" #: ../../source/reference/manim.animation.growing.GrowFromEdge.rst:4 msgid "Qualified name: ``manim.animation.growing.GrowFromEdge``" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromEdge:1 msgid "Bases: :py:class:`manim.animation.growing.GrowFromPoint`" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromEdge:1 msgid "Introduce an :class:`~.Mobject` by growing it from one of its bounding box edges." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromEdge:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromEdge:3 msgid "The mobjects to be introduced." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromEdge:4 msgid "The direction to seek bounding box edge of mobject." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromEdge:5 msgid "Initial color of the mobject before growing to its full size. Leave empty to match mobject's color." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromEdge:8 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.growing.GrowFromEdge.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.growing.GrowFromEdge.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.growing.GrowFromPoint.pot000066400000000000000000000032271515024150700332210ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.growing.GrowFromPoint.rst:2 msgid "GrowFromPoint" msgstr "" #: ../../source/reference/manim.animation.growing.GrowFromPoint.rst:4 msgid "Qualified name: ``manim.animation.growing.GrowFromPoint``" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromPoint:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromPoint:1 msgid "Introduce an :class:`~.Mobject` by growing it from a point." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromPoint:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromPoint:3 msgid "The mobjects to be introduced." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromPoint:4 msgid "The point from which the mobject grows." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromPoint:5 msgid "Initial color of the mobject before growing to its full size. Leave empty to match mobject's color." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.GrowFromPoint:8 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.growing.GrowFromPoint.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.growing.GrowFromPoint.rst:23 msgid "Attributes" msgstr "" manim.animation.growing.SpinInFromNothing.pot000066400000000000000000000035051515024150700337400ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.growing.SpinInFromNothing.rst:2 msgid "SpinInFromNothing" msgstr "" #: ../../source/reference/manim.animation.growing.SpinInFromNothing.rst:4 msgid "Qualified name: ``manim.animation.growing.SpinInFromNothing``" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.SpinInFromNothing:1 msgid "Bases: :py:class:`manim.animation.growing.GrowFromCenter`" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.SpinInFromNothing:1 msgid "Introduce an :class:`~.Mobject` spinning and growing it from its center." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.SpinInFromNothing:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.SpinInFromNothing:3 msgid "The mobjects to be introduced." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.SpinInFromNothing:4 msgid "The amount of spinning before mobject reaches its full size. E.g. 2*PI means that the object will do one full spin before being fully introduced." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.SpinInFromNothing:6 msgid "Initial color of the mobject before growing to its full size. Leave empty to match mobject's color." msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing.SpinInFromNothing:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.growing.SpinInFromNothing.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.growing.SpinInFromNothing.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.growing.pot000066400000000000000000000021641515024150700304450ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.growing.rst:2 msgid "growing" msgstr "" #: ../../../manim/animation/growing.py:docstring of manim.animation.growing:1 msgid "Animations that introduce mobjects to scene by growing them from points." msgstr "" #: ../../source/reference/manim.animation.growing.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.animation.growing.rst:28::1 msgid "Introduce an :class:`~.Arrow` by growing it from its start toward its tip." msgstr "" #: ../../source/reference/manim.animation.growing.rst:28::1 msgid "Introduce an :class:`~.Mobject` by growing it from its center." msgstr "" #: ../../source/reference/manim.animation.growing.rst:28::1 msgid "Introduce an :class:`~.Mobject` by growing it from one of its bounding box edges." msgstr "" #: ../../source/reference/manim.animation.growing.rst:28::1 msgid "Introduce an :class:`~.Mobject` by growing it from a point." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.indication.ApplyWave.pot000066400000000000000000000040441515024150700330200ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.indication.ApplyWave.rst:2 msgid "ApplyWave" msgstr "" #: ../../source/reference/manim.animation.indication.ApplyWave.rst:4 msgid "Qualified name: ``manim.animation.indication.ApplyWave``" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:1 msgid "Bases: :py:class:`manim.animation.movement.Homotopy`" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:1 msgid "Send a wave through the Mobject distorting it temporarily." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:3 msgid "The mobject to be distorted." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:4 msgid "The direction in which the wave nudges points of the shape" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:5 msgid "The distance points of the shape get shifted" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:6 msgid "The function defining the shape of one wave flank." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:7 msgid "The length of the wave relative to the width of the mobject." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:8 msgid "The number of ripples of the wave" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:9 msgid "The duration of the animation." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ApplyWave:12 msgid "Examples" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.indication.Circumscribe.pot000066400000000000000000000051531515024150700335240ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.indication.Circumscribe.rst:2 msgid "Circumscribe" msgstr "" #: ../../source/reference/manim.animation.indication.Circumscribe.rst:4 msgid "Qualified name: ``manim.animation.indication.Circumscribe``" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:1 msgid "Bases: :py:class:`manim.animation.composition.Succession`" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:1 msgid "Draw a temporary line surrounding the mobject." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:3 msgid "The mobject to be circumscribed." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:4 msgid "The shape with which to surrond the given mobject. Should be either :class:`~.Rectangle` or :class:`~.Circle`" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:6 msgid "Whether to make the surrounding shape to fade in. It will be drawn otherwise." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:7 msgid "Whether to make the surrounding shape to fade out. It will be undrawn otherwise." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:8 msgid "The time_width of the drawing and undrawing. Gets ignored if either `fade_in` or `fade_out` is `True`." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:9 msgid "The distance between the surrounding shape and the given mobject." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:10 msgid "The color of the surrounding shape." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:11 msgid "The duration of the entire animation." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:12 msgid "Additional arguments to be passed to the :class:`~.Succession` constructor" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Circumscribe:16 msgid "Examples" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.indication.Flash.pot000066400000000000000000000046551515024150700321550ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.indication.Flash.rst:2 msgid "Flash" msgstr "" #: ../../source/reference/manim.animation.indication.Flash.rst:4 msgid "Qualified name: ``manim.animation.indication.Flash``" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:1 msgid "Bases: :py:class:`manim.animation.composition.AnimationGroup`" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:1 msgid "Send out lines in all directions." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:3 msgid "The center of the flash lines. If it is a :class:`.~Mobject` its center will be used." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:4 msgid "The length of the flash lines." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:5 msgid "The number of flash lines." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:6 msgid "The distance from `point` at which the flash lines start." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:7 msgid "The stroke width of the flash lines." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:8 msgid "The color of the flash lines." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:9 msgid "The time width used for the flash lines. See :class:`.~ShowPassingFlash` for more details." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:10 msgid "The duration of the animation." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:11 msgid "Additional arguments to be passed to the :class:`~.Succession` constructor" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Flash:15 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.indication.Flash.rst:14 msgid "Methods" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.indication.FocusOn.pot000066400000000000000000000036431515024150700324700ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.indication.FocusOn.rst:2 msgid "FocusOn" msgstr "" #: ../../source/reference/manim.animation.indication.FocusOn.rst:4 msgid "Qualified name: ``manim.animation.indication.FocusOn``" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.FocusOn:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.FocusOn:1 msgid "Shrink a spotlight to a position." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.FocusOn:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.FocusOn:3 msgid "The point at which to shrink the spotlight. If it is a :class:`.~Mobject` its center will be used." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.FocusOn:4 msgid "The opacity of the spotlight." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.FocusOn:5 msgid "The color of the spotlight." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.FocusOn:6 msgid "The duration of the animation." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.FocusOn:7 msgid "Additional arguments to be passed to the :class:`~.Succession` constructor" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.FocusOn:11 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.indication.FocusOn.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.indication.FocusOn.rst:22 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.indication.Indicate.pot000066400000000000000000000037211515024150700326310ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.indication.Indicate.rst:2 msgid "Indicate" msgstr "" #: ../../source/reference/manim.animation.indication.Indicate.rst:4 msgid "Qualified name: ``manim.animation.indication.Indicate``" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Indicate:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Indicate:1 msgid "Indicate a Mobject by temporarily resizing and recoloring it." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Indicate:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Indicate:3 msgid "The mobject to indicate." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Indicate:4 msgid "The factor by which the mobject will be temporally scaled" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Indicate:5 msgid "The color the mobject temporally takes." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Indicate:6 msgid "The function definig the animation progress at every point in time." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Indicate:7 msgid "Additional arguments to be passed to the :class:`~.Succession` constructor" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Indicate:11 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.indication.Indicate.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.indication.Indicate.rst:22 msgid "Attributes" msgstr "" manim.animation.indication.ShowCreationThenFadeOut.pot000066400000000000000000000016521515024150700355270ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.indication.ShowCreationThenFadeOut.rst:2 msgid "ShowCreationThenFadeOut" msgstr "" #: ../../source/reference/manim.animation.indication.ShowCreationThenFadeOut.rst:4 msgid "Qualified name: ``manim.animation.indication.ShowCreationThenFadeOut``" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowCreationThenFadeOut:1 msgid "Bases: :py:class:`manim.animation.composition.Succession`" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowCreationThenFadeOut:1 msgid "Deprecated The class ShowCreationThenFadeOut has been deprecated since v0.15.0 and is expected to be removed after v0.16.0. Use Create then FadeOut to achieve this effect." msgstr "" manim.animation.indication.ShowPassingFlash.pot000066400000000000000000000045021515024150700342530ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.indication.ShowPassingFlash.rst:2 msgid "ShowPassingFlash" msgstr "" #: ../../source/reference/manim.animation.indication.ShowPassingFlash.rst:4 msgid "Qualified name: ``manim.animation.indication.ShowPassingFlash``" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash:1 msgid "Bases: :py:class:`manim.animation.creation.ShowPartial`" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash:1 msgid "Show only a sliver of the VMobject each frame." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash:0 #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash.clean_up_from_scene:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash:3 msgid "The mobject whose stroke is animated." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash:4 msgid "The length of the sliver relative to the length of the stroke." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash:7 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.indication.ShowPassingFlash.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash.clean_up_from_scene:1::1 #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash.clean_up_from_scene:1 msgid "Clean up the :class:`~.Scene` after finishing the animation." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash.clean_up_from_scene:3 msgid "This includes to :meth:`~.Scene.remove` the Animation's :class:`~.Mobject` if the animation is a remover." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlash.clean_up_from_scene:6 msgid "The scene the animation should be cleaned up from." msgstr "" manim.animation.indication.ShowPassingFlashWithThinningStrokeWidth.pot000066400000000000000000000013231515024150700407740ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.indication.ShowPassingFlashWithThinningStrokeWidth.rst:2 msgid "ShowPassingFlashWithThinningStrokeWidth" msgstr "" #: ../../source/reference/manim.animation.indication.ShowPassingFlashWithThinningStrokeWidth.rst:4 msgid "Qualified name: ``manim.animation.indication.ShowPassingFlashWithThinningStrokeWidth``" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.ShowPassingFlashWithThinningStrokeWidth:1 msgid "Bases: :py:class:`manim.animation.composition.AnimationGroup`" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.indication.Wiggle.pot000066400000000000000000000037631515024150700323350ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.indication.Wiggle.rst:2 msgid "Wiggle" msgstr "" #: ../../source/reference/manim.animation.indication.Wiggle.rst:4 msgid "Qualified name: ``manim.animation.indication.Wiggle``" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:1 msgid "Wiggle a Mobject." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:3 msgid "The mobject to wiggle." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:5 msgid "The factor by which the mobject will be temporarily scaled." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:6 msgid "The wiggle angle." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:7 msgid "The number of wiggles." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:8 msgid "The point about which the mobject gets scaled." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:9 msgid "The point around which the mobject gets rotated." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:10 msgid "The duration of the animation" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication.Wiggle:13 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.indication.Wiggle.rst:14 msgid "Methods" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.indication.pot000066400000000000000000000030261515024150700311100ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.indication.rst:2 msgid "indication" msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication:1 msgid "Animations drawing attention to particular mobjects." msgstr "" #: ../../../manim/animation/indication.py:docstring of manim.animation.indication:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.indication.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.animation.indication.rst:36::1 msgid "Send a wave through the Mobject distorting it temporarily." msgstr "" #: ../../source/reference/manim.animation.indication.rst:36::1 msgid "Draw a temporary line surrounding the mobject." msgstr "" #: ../../source/reference/manim.animation.indication.rst:36::1 msgid "Send out lines in all directions." msgstr "" #: ../../source/reference/manim.animation.indication.rst:36::1 msgid "Shrink a spotlight to a position." msgstr "" #: ../../source/reference/manim.animation.indication.rst:36::1 msgid "Indicate a Mobject by temporarily resizing and recoloring it." msgstr "" #: ../../source/reference/manim.animation.indication.rst:36::1 msgid "Deprecated" msgstr "" #: ../../source/reference/manim.animation.indication.rst:36::1 msgid "Show only a sliver of the VMobject each frame." msgstr "" manim.animation.movement.ComplexHomotopy.pot000066400000000000000000000013451515024150700337110ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.movement.ComplexHomotopy.rst:2 msgid "ComplexHomotopy" msgstr "" #: ../../source/reference/manim.animation.movement.ComplexHomotopy.rst:4 msgid "Qualified name: ``manim.animation.movement.ComplexHomotopy``" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.ComplexHomotopy:1 msgid "Bases: :py:class:`manim.animation.movement.Homotopy`" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.ComplexHomotopy:1 msgid "Complex Homotopy a function Cx[0, 1] to C" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.movement.Homotopy.pot000066400000000000000000000043271515024150700324430ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.movement.Homotopy.rst:2 msgid "Homotopy" msgstr "" #: ../../source/reference/manim.animation.movement.Homotopy.rst:4 msgid "Qualified name: ``manim.animation.movement.Homotopy``" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.Homotopy:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.Homotopy:1 msgid "A Homotopy." msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.Homotopy:3 msgid "This is an animation transforming the points of a mobject according to the specified transformation function. With the parameter :math:`t` moving from 0 to 1 throughout the animation and :math:`(x, y, z)` describing the coordinates of the point of a mobject, the function passed to the ``homotopy`` keyword argument should transform the tuple :math:`(x, y, z, t)` to :math:`(x', y', z')`, the coordinates the original point is transformed to at time :math:`t`." msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.Homotopy:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.Homotopy:11 msgid "A function mapping :math:`(x, y, z, t)` to :math:`(x', y', z')`." msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.Homotopy:12 msgid "The mobject transformed under the given homotopy." msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.Homotopy:13 msgid "The run time of the animation." msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.Homotopy:14 msgid "Keyword arguments propagated to :meth:`.Mobject.apply_function`." msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.Homotopy:15 msgid "Further keyword arguments passed to the parent class." msgstr "" #: ../../source/reference/manim.animation.movement.Homotopy.rst:14 msgid "Methods" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.movement.MoveAlongPath.pot000066400000000000000000000032201515024150700333200ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.movement.MoveAlongPath.rst:2 msgid "MoveAlongPath" msgstr "" #: ../../source/reference/manim.animation.movement.MoveAlongPath.rst:4 msgid "Qualified name: ``manim.animation.movement.MoveAlongPath``" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.MoveAlongPath:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.MoveAlongPath:1 msgid "Make one mobject move along the path of another mobject. .. rubric:: Example" msgstr "" #: ../../source/reference/manim.animation.movement.MoveAlongPath.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.MoveAlongPath.interpolate_mobject:1::1 #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.MoveAlongPath.interpolate_mobject:1 msgid "Interpolates the mobject of the :class:`Animation` based on alpha value." msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.MoveAlongPath.interpolate_mobject:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.MoveAlongPath.interpolate_mobject:3 msgid "A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.movement.PhaseFlow.pot000066400000000000000000000026521515024150700325140ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.movement.PhaseFlow.rst:2 msgid "PhaseFlow" msgstr "" #: ../../source/reference/manim.animation.movement.PhaseFlow.rst:4 msgid "Qualified name: ``manim.animation.movement.PhaseFlow``" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.PhaseFlow:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../source/reference/manim.animation.movement.PhaseFlow.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.PhaseFlow.interpolate_mobject:1::1 #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.PhaseFlow.interpolate_mobject:1 msgid "Interpolates the mobject of the :class:`Animation` based on alpha value." msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.PhaseFlow.interpolate_mobject:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.PhaseFlow.interpolate_mobject:3 msgid "A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively." msgstr "" manim.animation.movement.SmoothedVectorizedHomotopy.pot000066400000000000000000000013571515024150700361260ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.movement.SmoothedVectorizedHomotopy.rst:2 msgid "SmoothedVectorizedHomotopy" msgstr "" #: ../../source/reference/manim.animation.movement.SmoothedVectorizedHomotopy.rst:4 msgid "Qualified name: ``manim.animation.movement.SmoothedVectorizedHomotopy``" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement.SmoothedVectorizedHomotopy:1 msgid "Bases: :py:class:`manim.animation.movement.Homotopy`" msgstr "" #: ../../source/reference/manim.animation.movement.SmoothedVectorizedHomotopy.rst:14 msgid "Methods" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.movement.pot000066400000000000000000000015161515024150700306230ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.movement.rst:2 msgid "movement" msgstr "" #: ../../../manim/animation/movement.py:docstring of manim.animation.movement:1 msgid "Animations related to movement." msgstr "" #: ../../source/reference/manim.animation.movement.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.animation.movement.rst:28::1 msgid "Complex Homotopy a function Cx[0, 1] to C" msgstr "" #: ../../source/reference/manim.animation.movement.rst:28::1 msgid "A Homotopy." msgstr "" #: ../../source/reference/manim.animation.movement.rst:28::1 msgid "Make one mobject move along the path of another mobject." msgstr "" manim.animation.numbers.ChangeDecimalToValue.pot000066400000000000000000000011421515024150700343230ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.numbers.ChangeDecimalToValue.rst:2 msgid "ChangeDecimalToValue" msgstr "" #: ../../source/reference/manim.animation.numbers.ChangeDecimalToValue.rst:4 msgid "Qualified name: ``manim.animation.numbers.ChangeDecimalToValue``" msgstr "" #: ../../../manim/animation/numbers.py:docstring of manim.animation.numbers.ChangeDecimalToValue:1 msgid "Bases: :py:class:`manim.animation.numbers.ChangingDecimal`" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.numbers.ChangingDecimal.pot000066400000000000000000000027301515024150700334370ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.numbers.ChangingDecimal.rst:2 msgid "ChangingDecimal" msgstr "" #: ../../source/reference/manim.animation.numbers.ChangingDecimal.rst:4 msgid "Qualified name: ``manim.animation.numbers.ChangingDecimal``" msgstr "" #: ../../../manim/animation/numbers.py:docstring of manim.animation.numbers.ChangingDecimal:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../source/reference/manim.animation.numbers.ChangingDecimal.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/numbers.py:docstring of manim.animation.numbers.ChangingDecimal.interpolate_mobject:1::1 #: ../../../manim/animation/numbers.py:docstring of manim.animation.numbers.ChangingDecimal.interpolate_mobject:1 msgid "Interpolates the mobject of the :class:`Animation` based on alpha value." msgstr "" #: ../../../manim/animation/numbers.py:docstring of manim.animation.numbers.ChangingDecimal.interpolate_mobject:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/numbers.py:docstring of manim.animation.numbers.ChangingDecimal.interpolate_mobject:3 msgid "A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.numbers.pot000066400000000000000000000007041515024150700304420ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.numbers.rst:2 msgid "numbers" msgstr "" #: ../../../manim/animation/numbers.py:docstring of manim.animation.numbers:1 msgid "Animations for changing numbers." msgstr "" #: ../../source/reference/manim.animation.numbers.rst:15 msgid "Classes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.rotation.Rotate.pot000066400000000000000000000035131515024150700320640ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.rotation.Rotate.rst:2 msgid "Rotate" msgstr "" #: ../../source/reference/manim.animation.rotation.Rotate.rst:4 msgid "Qualified name: ``manim.animation.rotation.Rotate``" msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotate:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotate:1 msgid "Animation that rotates a Mobject." msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotate:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotate:3 msgid "The mobject to be rotated." msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotate:4 msgid "The rotation angle." msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotate:5 msgid "The rotation axis as a numpy vector." msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotate:6 msgid "The rotation center." msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotate:7 msgid "If ``about_point``is ``None``, this argument specifies the direction of the bounding box point to be taken as the rotation center." msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotate:12 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.rotation.Rotate.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.rotation.Rotate.rst:22 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.rotation.Rotating.pot000066400000000000000000000026401515024150700324150ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.rotation.Rotating.rst:2 msgid "Rotating" msgstr "" #: ../../source/reference/manim.animation.rotation.Rotating.rst:4 msgid "Qualified name: ``manim.animation.rotation.Rotating``" msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotating:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../source/reference/manim.animation.rotation.Rotating.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotating.interpolate_mobject:1::1 #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotating.interpolate_mobject:1 msgid "Interpolates the mobject of the :class:`Animation` based on alpha value." msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotating.interpolate_mobject:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation.Rotating.interpolate_mobject:3 msgid "A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.rotation.pot000066400000000000000000000011071515024150700306240ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.rotation.rst:2 msgid "rotation" msgstr "" #: ../../../manim/animation/rotation.py:docstring of manim.animation.rotation:1 msgid "Animations related to rotation." msgstr "" #: ../../source/reference/manim.animation.rotation.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.animation.rotation.rst:22::1 msgid "Animation that rotates a Mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.specialized.Broadcast.pot000066400000000000000000000054101515024150700331630ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.specialized.Broadcast.rst:2 msgid "Broadcast" msgstr "" #: ../../source/reference/manim.animation.specialized.Broadcast.rst:4 msgid "Qualified name: ``manim.animation.specialized.Broadcast``" msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:1 msgid "Bases: :py:class:`manim.animation.composition.LaggedStart`" msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:1 msgid "Broadcast a mobject starting from an ``initial_width``, up to the actual size of the mobject." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:3 msgid "The mobject to be broadcast." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:4 msgid "The center of the broadcast, by default ORIGIN." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:5 msgid "The number of mobjects that emerge from the focal point, by default 5." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:6 msgid "The starting stroke opacity of the mobjects emitted from the broadcast, by default 1." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:7 msgid "The final stroke opacity of the mobjects emitted from the broadcast, by default 0." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:8 msgid "The initial width of the mobjects, by default 0.0." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:9 msgid "Whether the mobjects should be removed from the scene after the animation, by default True." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:10 msgid "The time between each iteration of the mobject, by default 0.2." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:11 msgid "The total duration of the animation, by default 3." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:12 msgid "Additional arguments to be passed to :class:`~.LaggedStart`." msgstr "" #: ../../../manim/animation/specialized.py:docstring of manim.animation.specialized.Broadcast:15 msgid "Examples" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.specialized.pot000066400000000000000000000005161515024150700312640ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.specialized.rst:2 msgid "specialized" msgstr "" #: ../../source/reference/manim.animation.specialized.rst:15 msgid "Classes" msgstr "" manim.animation.speedmodifier.ChangeSpeed.pot000066400000000000000000000165411515024150700337020ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:2 msgid "ChangeSpeed" msgstr "" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:4 msgid "Qualified name: ``manim.animation.speedmodifier.ChangeSpeed``" msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed:1 msgid "Modifies the speed of passed animation. :class:`AnimationGroup` with different ``lag_ratio`` can also be used which combines multiple animations into one. The ``run_time`` of the passed animation is changed to modify the speed." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed:0 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.add_updater:0 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.clean_up_from_scene:0 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.interpolate:0 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.update_mobjects:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed:6 msgid "Animation of which the speed is to be modified." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed:7 msgid "Contains nodes (percentage of ``run_time``) and its corresponding speed factor." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed:8 msgid "Overrides ``rate_func`` of passed animation, applied before changing speed." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed:11 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:27::1 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.add_updater:1 msgid "This static method can be used to apply speed change to updaters." msgstr "" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:27::1 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.begin:1 msgid "Begin the animation." msgstr "" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:27::1 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.clean_up_from_scene:1 msgid "Clean up the :class:`~.Scene` after finishing the animation." msgstr "" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:27::1 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.finish:1 msgid "Finish the animation." msgstr "" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:27::1 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.get_scaled_total_time:1 msgid "The time taken by the animation under the assumption that the ``run_time`` is 1." msgstr "" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:27::1 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.interpolate:1 msgid "Set the animation progress." msgstr "" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:27::1 msgid "Updates things like starting_mobject, and (for Transforms) target_mobject." msgstr "" #: ../../source/reference/manim.animation.speedmodifier.ChangeSpeed.rst:29 msgid "Attributes" msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.add_updater:3 msgid "This updater will follow speed and rate function of any :class:`.ChangeSpeed` animation that is playing with ``affects_speed_updaters=True``. By default, updater functions added via the usual :meth:`.Mobject.add_updater` method do not respect the change of animation speed." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.add_updater:8 msgid "The mobject to which the updater should be attached." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.add_updater:9 msgid "The function that is called whenever a new frame is rendered." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.add_updater:10 msgid "The position in the list of the mobject's updaters at which the function should be inserted." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.add_updater:12 msgid "If ``True``, calls the update function when attaching it to the mobject." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.begin:3 msgid "This method is called right as an animation is being played. As much initialization as possible, especially any mobject copying, should live in this method." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.begin:0 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.clean_up_from_scene:0 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.finish:0 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.get_scaled_total_time:0 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.interpolate:0 #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.update_mobjects:0 msgid "Return type" msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.clean_up_from_scene:3 msgid "This includes to :meth:`~.Scene.remove` the Animation's :class:`~.Mobject` if the animation is a remover." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.clean_up_from_scene:6 msgid "The scene the animation should be cleaned up from." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.finish:3 msgid "This method gets called when the animation is over." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.interpolate:3 msgid "This method gets called for every frame during an animation." msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier.ChangeSpeed.interpolate:5 msgid "The relative time to set the animation to, 0 meaning the start, 1 meaning the end." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.speedmodifier.pot000066400000000000000000000010031515024150700315770ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.speedmodifier.rst:2 msgid "speedmodifier" msgstr "" #: ../../../manim/animation/speedmodifier.py:docstring of manim.animation.speedmodifier:1 msgid "Utilities for modifying the speed at which animations are played." msgstr "" #: ../../source/reference/manim.animation.speedmodifier.rst:15 msgid "Classes" msgstr "" manim.animation.transform.ApplyComplexFunction.pot000066400000000000000000000015031515024150700350430ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.ApplyComplexFunction.rst:2 msgid "ApplyComplexFunction" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyComplexFunction.rst:4 msgid "Qualified name: ``manim.animation.transform.ApplyComplexFunction``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyComplexFunction:1 msgid "Bases: :py:class:`manim.animation.transform.ApplyMethod`" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyComplexFunction.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyComplexFunction.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.ApplyFunction.pot000066400000000000000000000014201515024150700335700ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.ApplyFunction.rst:2 msgid "ApplyFunction" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyFunction.rst:4 msgid "Qualified name: ``manim.animation.transform.ApplyFunction``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyFunction:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyFunction.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyFunction.rst:22 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.ApplyMatrix.pot000066400000000000000000000034411515024150700332540ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.ApplyMatrix.rst:2 msgid "ApplyMatrix" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyMatrix.rst:4 msgid "Qualified name: ``manim.animation.transform.ApplyMatrix``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMatrix:1 msgid "Bases: :py:class:`manim.animation.transform.ApplyPointwiseFunction`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMatrix:1 msgid "Applies a matrix transform to an mobject." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMatrix:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMatrix:3 msgid "The transformation matrix." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMatrix:4 msgid "The :class:`~.Mobject`." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMatrix:5 msgid "The origin point for the transform. Defaults to ``ORIGIN``." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMatrix:6 msgid "Further keyword arguments that are passed to :class:`ApplyPointwiseFunction`." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMatrix:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyMatrix.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyMatrix.rst:22 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.ApplyMethod.pot000066400000000000000000000035241515024150700332320ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.ApplyMethod.rst:2 msgid "ApplyMethod" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyMethod.rst:4 msgid "Qualified name: ``manim.animation.transform.ApplyMethod``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMethod:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMethod:1 msgid "Animates a mobject by applying a method." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMethod:3 msgid "Note that only the method needs to be passed to this animation, it is not required to pass the corresponding mobject. Furthermore, this animation class only works if the method returns the modified mobject." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMethod:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMethod:8 msgid "The method that will be applied in the animation." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMethod:9 msgid "Any positional arguments to be passed when applying the method." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyMethod:10 msgid "Any keyword arguments passed to :class:`~.Transform`." msgstr "" #: ../../source/reference/manim.animation.transform.ApplyMethod.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyMethod.rst:23 msgid "Attributes" msgstr "" manim.animation.transform.ApplyPointwiseFunction.pot000066400000000000000000000022141515024150700354150ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.ApplyPointwiseFunction.rst:2 msgid "ApplyPointwiseFunction" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyPointwiseFunction.rst:4 msgid "Qualified name: ``manim.animation.transform.ApplyPointwiseFunction``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyPointwiseFunction:1 msgid "Bases: :py:class:`manim.animation.transform.ApplyMethod`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyPointwiseFunction:1 msgid "Animation that applies a pointwise function to a mobject." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyPointwiseFunction:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyPointwiseFunction.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyPointwiseFunction.rst:21 msgid "Attributes" msgstr "" manim.animation.transform.ApplyPointwiseFunctionToCenter.pot000066400000000000000000000027041515024150700370650ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.ApplyPointwiseFunctionToCenter.rst:2 msgid "ApplyPointwiseFunctionToCenter" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyPointwiseFunctionToCenter.rst:4 msgid "Qualified name: ``manim.animation.transform.ApplyPointwiseFunctionToCenter``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyPointwiseFunctionToCenter:1 msgid "Bases: :py:class:`manim.animation.transform.ApplyPointwiseFunction`" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyPointwiseFunctionToCenter.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.ApplyPointwiseFunctionToCenter.rst:20::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyPointwiseFunctionToCenter.begin:1 msgid "Begin the animation." msgstr "" #: ../../source/reference/manim.animation.transform.ApplyPointwiseFunctionToCenter.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ApplyPointwiseFunctionToCenter.begin:3 msgid "This method is called right as an animation is being played. As much initialization as possible, especially any mobject copying, should live in this method." msgstr "" manim.animation.transform.ClockwiseTransform.pot000066400000000000000000000021571515024150700345450ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.ClockwiseTransform.rst:2 msgid "ClockwiseTransform" msgstr "" #: ../../source/reference/manim.animation.transform.ClockwiseTransform.rst:4 msgid "Qualified name: ``manim.animation.transform.ClockwiseTransform``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ClockwiseTransform:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ClockwiseTransform:1 msgid "Transforms the points of a mobject along a clockwise oriented arc." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ClockwiseTransform:6 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.ClockwiseTransform.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.ClockwiseTransform.rst:21 msgid "Attributes" msgstr "" manim.animation.transform.CounterclockwiseTransform.pot000066400000000000000000000022651515024150700361450ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.CounterclockwiseTransform.rst:2 msgid "CounterclockwiseTransform" msgstr "" #: ../../source/reference/manim.animation.transform.CounterclockwiseTransform.rst:4 msgid "Qualified name: ``manim.animation.transform.CounterclockwiseTransform``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.CounterclockwiseTransform:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.CounterclockwiseTransform:1 msgid "Transforms the points of a mobject along a counterclockwise oriented arc." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.CounterclockwiseTransform:6 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.CounterclockwiseTransform.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.CounterclockwiseTransform.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.CyclicReplace.pot000066400000000000000000000014201515024150700334770ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.CyclicReplace.rst:2 msgid "CyclicReplace" msgstr "" #: ../../source/reference/manim.animation.transform.CyclicReplace.rst:4 msgid "Qualified name: ``manim.animation.transform.CyclicReplace``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.CyclicReplace:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../source/reference/manim.animation.transform.CyclicReplace.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.CyclicReplace.rst:22 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.FadeToColor.pot000066400000000000000000000020321515024150700331360ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.FadeToColor.rst:2 msgid "FadeToColor" msgstr "" #: ../../source/reference/manim.animation.transform.FadeToColor.rst:4 msgid "Qualified name: ``manim.animation.transform.FadeToColor``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeToColor:1 msgid "Bases: :py:class:`manim.animation.transform.ApplyMethod`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeToColor:1 msgid "Animation that changes color of a mobject." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeToColor:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.FadeToColor.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.FadeToColor.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.FadeTransform.pot000066400000000000000000000112601515024150700335330ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.FadeTransform.rst:2 msgid "FadeTransform" msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransform.rst:4 msgid "Qualified name: ``manim.animation.transform.FadeTransform``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform:1 msgid "Fades one mobject into another." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform:0 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.clean_up_from_scene:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform:3 msgid "The starting :class:`~.Mobject`." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform:4 msgid "The target :class:`~.Mobject`." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform:5 msgid "Controls whether the target :class:`~.Mobject` is stretched during the animation. Default: ``True``." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform:7 msgid "If the target mobject is not stretched automatically, this allows to adjust the initial scale of the target :class:`~.Mobject` while it is shifted in. Setting this to 0, 1, and 2, respectively, matches the length of the target with the length of the starting :class:`~.Mobject` in x, y, and z direction, respectively." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform:12 msgid "Further keyword arguments are passed to the parent class." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform:15 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransform.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransform.rst:24::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.begin:1 msgid "Initial setup for the animation." msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransform.rst:24::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.clean_up_from_scene:1 msgid "Clean up the :class:`~.Scene` after finishing the animation." msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransform.rst:24::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.get_all_mobjects:1 msgid "Get all mobjects involved in the animation." msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransform.rst:24::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.ghost_to:1 msgid "Replaces the source by the target and sets the opacity to 0." msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransform.rst:26 msgid "Attributes" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.begin:3 msgid "The mobject to which this animation is bound is a group consisting of both the starting and the ending mobject. At the start, the ending mobject replaces the starting mobject (and is completely faded). In the end, it is set to be the other way around." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.clean_up_from_scene:3 msgid "This includes to :meth:`~.Scene.remove` the Animation's :class:`~.Mobject` if the animation is a remover." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.clean_up_from_scene:6 msgid "The scene the animation should be cleaned up from." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.get_all_mobjects:3 msgid "Ordering must match the ordering of arguments to interpolate_submobject" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.get_all_mobjects:0 msgid "Returns" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransform.get_all_mobjects:5 msgid "The sequence of mobjects." msgstr "" manim.animation.transform.FadeTransformPieces.pot000066400000000000000000000032601515024150700346060ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.FadeTransformPieces.rst:2 msgid "FadeTransformPieces" msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransformPieces.rst:4 msgid "Qualified name: ``manim.animation.transform.FadeTransformPieces``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransformPieces:1 msgid "Bases: :py:class:`manim.animation.transform.FadeTransform`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransformPieces:1 msgid "Fades submobjects of one mobject into submobjects of another one." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransformPieces:6 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransformPieces.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransformPieces.rst:21::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransformPieces.begin:1 msgid "Initial setup for the animation." msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransformPieces.rst:21::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.FadeTransformPieces.ghost_to:1 msgid "Replaces the source submobjects by the target submobjects and sets the opacity to 0." msgstr "" #: ../../source/reference/manim.animation.transform.FadeTransformPieces.rst:23 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.MoveToTarget.pot000066400000000000000000000027421515024150700333650ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.MoveToTarget.rst:2 msgid "MoveToTarget" msgstr "" #: ../../source/reference/manim.animation.transform.MoveToTarget.rst:4 msgid "Qualified name: ``manim.animation.transform.MoveToTarget``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.MoveToTarget:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.MoveToTarget:1 msgid "Transforms a mobject to the mobject stored in its ``target`` attribute." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.MoveToTarget:3 msgid "After calling the :meth:`~.Mobject.generate_target` method, the :attr:`target` attribute of the mobject is populated with a copy of it. After modifying the attribute, playing the :class:`.MoveToTarget` animation transforms the original mobject into the modified one stored in the :attr:`target` attribute." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.MoveToTarget:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.MoveToTarget.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.MoveToTarget.rst:22 msgid "Attributes" msgstr "" manim.animation.transform.ReplacementTransform.pot000066400000000000000000000033471515024150700350630ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.ReplacementTransform.rst:2 msgid "ReplacementTransform" msgstr "" #: ../../source/reference/manim.animation.transform.ReplacementTransform.rst:4 msgid "Qualified name: ``manim.animation.transform.ReplacementTransform``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ReplacementTransform:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ReplacementTransform:1 msgid "Replaces and morphs a mobject into a target mobject." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ReplacementTransform:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ReplacementTransform:3 msgid "The starting :class:`~.Mobject`." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ReplacementTransform:4 msgid "The target :class:`~.Mobject`." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ReplacementTransform:5 msgid "Further keyword arguments that are passed to :class:`Transform`." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ReplacementTransform:8 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.ReplacementTransform.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.ReplacementTransform.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.Restore.pot000066400000000000000000000022631515024150700324260ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.Restore.rst:2 msgid "Restore" msgstr "" #: ../../source/reference/manim.animation.transform.Restore.rst:4 msgid "Qualified name: ``manim.animation.transform.Restore``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Restore:1 msgid "Bases: :py:class:`manim.animation.transform.ApplyMethod`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Restore:1 msgid "Transforms a mobject to its last saved state." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Restore:3 msgid "To save the state of a mobject, use the :meth:`~.Mobject.save_state` method." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Restore:6 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.Restore.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.Restore.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.ScaleInPlace.pot000066400000000000000000000020551515024150700332650ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.ScaleInPlace.rst:2 msgid "ScaleInPlace" msgstr "" #: ../../source/reference/manim.animation.transform.ScaleInPlace.rst:4 msgid "Qualified name: ``manim.animation.transform.ScaleInPlace``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ScaleInPlace:1 msgid "Bases: :py:class:`manim.animation.transform.ApplyMethod`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ScaleInPlace:1 msgid "Animation that scales a mobject by a certain factor." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ScaleInPlace:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.ScaleInPlace.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.ScaleInPlace.rst:21 msgid "Attributes" msgstr "" manim.animation.transform.ShrinkToCenter.pot000066400000000000000000000020741515024150700336260ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.ShrinkToCenter.rst:2 msgid "ShrinkToCenter" msgstr "" #: ../../source/reference/manim.animation.transform.ShrinkToCenter.rst:4 msgid "Qualified name: ``manim.animation.transform.ShrinkToCenter``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ShrinkToCenter:1 msgid "Bases: :py:class:`manim.animation.transform.ScaleInPlace`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ShrinkToCenter:1 msgid "Animation that makes a mobject shrink to center." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.ShrinkToCenter:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.ShrinkToCenter.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.ShrinkToCenter.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.Swap.pot000066400000000000000000000013251515024150700317130ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.Swap.rst:2 msgid "Swap" msgstr "" #: ../../source/reference/manim.animation.transform.Swap.rst:4 msgid "Qualified name: ``manim.animation.transform.Swap``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Swap:1 msgid "Bases: :py:class:`manim.animation.transform.CyclicReplace`" msgstr "" #: ../../source/reference/manim.animation.transform.Swap.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.Swap.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.Transform.pot000066400000000000000000000146041515024150700327600ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.Transform.rst:2 msgid "Transform" msgstr "" #: ../../source/reference/manim.animation.transform.Transform.rst:4 msgid "Qualified name: ``manim.animation.transform.Transform``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:1 msgid "A Transform transforms a Mobject into a target Mobject." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:0 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.clean_up_from_scene:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:3 msgid "The :class:`.Mobject` to be transformed. It will be mutated to become the ``target_mobject``." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:4 msgid "The target of the transformation." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:5 msgid "A function defining the path that the points of the ``mobject`` are being moved along until they match the points of the ``target_mobject``, see :mod:`.utils.paths`." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:7 msgid "The arc angle (in radians) that the points of ``mobject`` will follow to reach the points of the target if using a circular path arc, see ``path_arc_centers``. See also :func:`manim.utils.paths.path_along_arc`." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:10 msgid "The axis to rotate along if using a circular path arc, see ``path_arc_centers``." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:11 msgid "The center of the circular arcs along which the points of ``mobject`` are moved by the transformation. If this is set and ``path_func`` is not set, then a ``path_along_circles`` path will be generated using the ``path_arc`` parameters and stored in ``path_func``. If ``path_func`` is set, this and the other ``path_arc`` fields are set as attributes, but a ``path_func`` is not generated from it." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:11 msgid "The center of the circular arcs along which the points of ``mobject`` are moved by the transformation." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:14 msgid "If this is set and ``path_func`` is not set, then a ``path_along_circles`` path will be generated using the ``path_arc`` parameters and stored in ``path_func``. If ``path_func`` is set, this and the other ``path_arc`` fields are set as attributes, but a ``path_func`` is not generated from it." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:17 msgid "Controls which mobject is replaced when the transformation is complete. If set to True, ``mobject`` will be removed from the scene and ``target_mobject`` will replace it. Otherwise, ``target_mobject`` is never added and ``mobject`` just takes its shape." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:17 msgid "Controls which mobject is replaced when the transformation is complete." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:19 msgid "If set to True, ``mobject`` will be removed from the scene and ``target_mobject`` will replace it. Otherwise, ``target_mobject`` is never added and ``mobject`` just takes its shape." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform:23 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform.Transform.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.Transform.rst:25::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.begin:1 msgid "Begin the animation." msgstr "" #: ../../source/reference/manim.animation.transform.Transform.rst:25::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.clean_up_from_scene:1 msgid "Clean up the :class:`~.Scene` after finishing the animation." msgstr "" #: ../../source/reference/manim.animation.transform.Transform.rst:25::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.get_all_mobjects:1 msgid "Get all mobjects involved in the animation." msgstr "" #: ../../source/reference/manim.animation.transform.Transform.rst:27 msgid "Attributes" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.begin:3 msgid "This method is called right as an animation is being played. As much initialization as possible, especially any mobject copying, should live in this method." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.begin:0 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.clean_up_from_scene:0 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.get_all_mobjects:0 msgid "Return type" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.clean_up_from_scene:3 msgid "This includes to :meth:`~.Scene.remove` the Animation's :class:`~.Mobject` if the animation is a remover." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.clean_up_from_scene:6 msgid "The scene the animation should be cleaned up from." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.get_all_mobjects:3 msgid "Ordering must match the ordering of arguments to interpolate_submobject" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.Transform.get_all_mobjects:0 msgid "Returns" msgstr "" manim.animation.transform.TransformAnimations.pot000066400000000000000000000031441515024150700347210ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.TransformAnimations.rst:2 msgid "TransformAnimations" msgstr "" #: ../../source/reference/manim.animation.transform.TransformAnimations.rst:4 msgid "Qualified name: ``manim.animation.transform.TransformAnimations``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformAnimations:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../source/reference/manim.animation.transform.TransformAnimations.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.TransformAnimations.rst:20::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformAnimations.interpolate:1 msgid "Set the animation progress." msgstr "" #: ../../source/reference/manim.animation.transform.TransformAnimations.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformAnimations.interpolate:3 msgid "This method gets called for every frame during an animation." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformAnimations.interpolate:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformAnimations.interpolate:5 msgid "The relative time to set the animation to, 0 meaning the start, 1 meaning the end." msgstr "" manim.animation.transform.TransformFromCopy.pot000066400000000000000000000033411515024150700343540ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.TransformFromCopy.rst:2 msgid "TransformFromCopy" msgstr "" #: ../../source/reference/manim.animation.transform.TransformFromCopy.rst:4 msgid "Qualified name: ``manim.animation.transform.TransformFromCopy``" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformFromCopy:1 msgid "Bases: :py:class:`manim.animation.transform.Transform`" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformFromCopy:1 msgid "Performs a reversed Transform" msgstr "" #: ../../source/reference/manim.animation.transform.TransformFromCopy.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.animation.transform.TransformFromCopy.rst:20::1 #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformFromCopy.interpolate:1 msgid "Set the animation progress." msgstr "" #: ../../source/reference/manim.animation.transform.TransformFromCopy.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformFromCopy.interpolate:3 msgid "This method gets called for every frame during an animation." msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformFromCopy.interpolate:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform.TransformFromCopy.interpolate:5 msgid "The relative time to set the animation to, 0 meaning the start, 1 meaning the end." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.transform.pot000066400000000000000000000047631515024150700310130ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform.rst:2 msgid "transform" msgstr "" #: ../../../manim/animation/transform.py:docstring of manim.animation.transform:1 msgid "Animations transforming one mobject into another." msgstr "" #: ../../source/reference/manim.animation.transform.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Applies a matrix transform to an mobject." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Animates a mobject by applying a method." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Animation that applies a pointwise function to a mobject." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Transforms the points of a mobject along a clockwise oriented arc." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Transforms the points of a mobject along a counterclockwise oriented arc." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Animation that changes color of a mobject." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Fades one mobject into another." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Fades submobjects of one mobject into submobjects of another one." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Transforms a mobject to the mobject stored in its ``target`` attribute." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Replaces and morphs a mobject into a target mobject." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Transforms a mobject to its last saved state." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Animation that scales a mobject by a certain factor." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "Animation that makes a mobject shrink to center." msgstr "" #: ../../source/reference/manim.animation.transform.rst:60::1 msgid "A Transform transforms a Mobject into a target Mobject." msgstr "" manim.animation.transform_matching_parts.TransformMatchingAbstractBase.pot000066400000000000000000000122551515024150700417160ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform_matching_parts.TransformMatchingAbstractBase.rst:2 msgid "TransformMatchingAbstractBase" msgstr "" #: ../../source/reference/manim.animation.transform_matching_parts.TransformMatchingAbstractBase.rst:4 msgid "Qualified name: ``manim.animation.transform\\_matching\\_parts.TransformMatchingAbstractBase``" msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:1 msgid "Bases: :py:class:`manim.animation.composition.AnimationGroup`" msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:1 msgid "Abstract base class for transformations that keep track of matching parts." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:3 msgid "Subclasses have to implement the two static methods :meth:`~.TransformMatchingAbstractBase.get_mobject_parts` and :meth:`~.TransformMatchingAbstractBase.get_mobject_key`." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:7 msgid "Basically, this transformation first maps all submobjects returned by the ``get_mobject_parts`` method to certain keys by applying the ``get_mobject_key`` method. Then, submobjects with matching keys are transformed into each other." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:0 #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase.clean_up_from_scene:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:12 msgid "The starting :class:`~.Mobject`." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:13 msgid "The target :class:`~.Mobject`." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:14 msgid "Controls whether submobjects without a matching key are transformed into each other by using :class:`~.Transform`. Default: ``False``." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:16 msgid "Controls whether submobjects without a matching key are transformed into each other by using :class:`~.FadeTransform`. Default: ``False``." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:18 msgid "Optional. A dictionary mapping keys belonging to some of the starting mobject's submobjects (i.e., the return values of the ``get_mobject_key`` method) to some keys belonging to the target mobject's submobjects that should be transformed although the keys don't match." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:22 msgid "All further keyword arguments are passed to the submobject transformations." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase:26 msgid "If neither ``transform_mismatches`` nor ``fade_transform_mismatches`` are set to ``True``, submobjects without matching keys in the starting mobject are faded out in the direction of the unmatched submobjects in the target mobject, and unmatched submobjects in the target mobject are faded in from the direction of the unmatched submobjects in the start mobject." msgstr "" #: ../../source/reference/manim.animation.transform_matching_parts.TransformMatchingAbstractBase.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase.clean_up_from_scene:1::1 #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase.clean_up_from_scene:1 msgid "Clean up the :class:`~.Scene` after finishing the animation." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase.clean_up_from_scene:3 msgid "This includes to :meth:`~.Scene.remove` the Animation's :class:`~.Mobject` if the animation is a remover." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingAbstractBase.clean_up_from_scene:6 msgid "The scene the animation should be cleaned up from." msgstr "" manim.animation.transform_matching_parts.TransformMatchingShapes.pot000066400000000000000000000031651515024150700406030ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform_matching_parts.TransformMatchingShapes.rst:2 msgid "TransformMatchingShapes" msgstr "" #: ../../source/reference/manim.animation.transform_matching_parts.TransformMatchingShapes.rst:4 msgid "Qualified name: ``manim.animation.transform\\_matching\\_parts.TransformMatchingShapes``" msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingShapes:1 msgid "Bases: :py:class:`manim.animation.transform_matching_parts.TransformMatchingAbstractBase`" msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingShapes:1 msgid "An animation trying to transform groups by matching the shape of their submobjects." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingShapes:4 msgid "Two submobjects match if the hash of their point coordinates after normalization (i.e., after translation to the origin, fixing the submobject height at 1 unit, and rounding the coordinates to three decimal places) matches." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingShapes:12 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform_matching_parts.TransformMatchingShapes.rst:14 msgid "Methods" msgstr "" manim.animation.transform_matching_parts.TransformMatchingTex.pot000066400000000000000000000026311515024150700401150ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform_matching_parts.TransformMatchingTex.rst:2 msgid "TransformMatchingTex" msgstr "" #: ../../source/reference/manim.animation.transform_matching_parts.TransformMatchingTex.rst:4 msgid "Qualified name: ``manim.animation.transform\\_matching\\_parts.TransformMatchingTex``" msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingTex:1 msgid "Bases: :py:class:`manim.animation.transform_matching_parts.TransformMatchingAbstractBase`" msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingTex:1 msgid "A transformation trying to transform rendered LaTeX strings." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingTex:3 msgid "Two submobjects match if their ``tex_string`` matches." msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts.TransformMatchingTex:8 msgid "Examples" msgstr "" #: ../../source/reference/manim.animation.transform_matching_parts.TransformMatchingTex.rst:14 msgid "Methods" msgstr "" manim.animation.transform_matching_parts.pot000066400000000000000000000017071515024150700340120ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.transform_matching_parts.rst:2 msgid "transform\\_matching\\_parts" msgstr "" #: ../../../manim/animation/transform_matching_parts.py:docstring of manim.animation.transform_matching_parts:1 msgid "Animations that try to transform Mobjects while keeping track of identical parts." msgstr "" #: ../../source/reference/manim.animation.transform_matching_parts.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.animation.transform_matching_parts.rst:24::1 msgid "Abstract base class for transformations that keep track of matching parts." msgstr "" #: ../../source/reference/manim.animation.transform_matching_parts.rst:24::1 msgid "An animation trying to transform groups by matching the shape of their submobjects." msgstr "" manim.animation.update.MaintainPositionRelativeTo.pot000066400000000000000000000000011515024150700354430ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference manim.animation.update.UpdateFromAlphaFunc.pot000066400000000000000000000000011515024150700340070ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.update.UpdateFromFunc.pot000066400000000000000000000000011515024150700331200ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.update.pot000066400000000000000000000000011515024150700302370ustar00rootroot00000000000000 manim.animation.updaters.mobject_update_utils.pot000066400000000000000000000021641515024150700347450ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.updaters.mobject_update_utils.rst:2 msgid "mobject\\_update\\_utils" msgstr "" #: ../../../manim/animation/updaters/mobject_update_utils.py:docstring of manim.animation.updaters.mobject_update_utils:1 msgid "Utility functions for continuous animation of mobjects." msgstr "" #: ../../source/reference/manim.animation.updaters.mobject_update_utils.rst:20 msgid "Functions" msgstr "" #: ../../../manim/animation/updaters/mobject_update_utils.py:docstring of manim.animation.updaters.mobject_update_utils.f_always:1 msgid "More functional version of always, where instead of taking in args, it takes in functions which output the relevant arguments." msgstr "" #: ../../../manim/animation/updaters/mobject_update_utils.py:docstring of manim.animation.updaters.mobject_update_utils.turn_animation_into_updater:1 msgid "Add an updater to the animation's mobject which applies the interpolation and update functions of the animation" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.updaters.pot000066400000000000000000000013021515024150700306110ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.updaters.rst:2 msgid "updaters" msgstr "" #: ../../../manim/animation/updaters/__init__.py:docstring of manim.animation.updaters:1 msgid "Animations and utility mobjects related to update functions." msgstr "" #: ../../../manim/animation/updaters/__init__.py:docstring of manim.animation.updaters:4 msgid "Modules" msgstr "" #: ../../../manim/animation/updaters/__init__.py:docstring of manim.animation.updaters:11::1 msgid "Utility functions for continuous animation of mobjects." msgstr "" manim.animation.updaters.update.MaintainPositionRelativeTo.pot000066400000000000000000000032661515024150700373110ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.updaters.update.MaintainPositionRelativeTo.rst:2 msgid "MaintainPositionRelativeTo" msgstr "" #: ../../source/reference/manim.animation.updaters.update.MaintainPositionRelativeTo.rst:4 msgid "Qualified name: ``manim.animation.updaters.update.MaintainPositionRelativeTo``" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.MaintainPositionRelativeTo:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../source/reference/manim.animation.updaters.update.MaintainPositionRelativeTo.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.MaintainPositionRelativeTo.interpolate_mobject:1::1 #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.MaintainPositionRelativeTo.interpolate_mobject:1 msgid "Interpolates the mobject of the :class:`Animation` based on alpha value." msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.MaintainPositionRelativeTo.interpolate_mobject:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.MaintainPositionRelativeTo.interpolate_mobject:3 msgid "A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively." msgstr "" manim.animation.updaters.update.UpdateFromAlphaFunc.pot000066400000000000000000000031731515024150700356520ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.updaters.update.UpdateFromAlphaFunc.rst:2 msgid "UpdateFromAlphaFunc" msgstr "" #: ../../source/reference/manim.animation.updaters.update.UpdateFromAlphaFunc.rst:4 msgid "Qualified name: ``manim.animation.updaters.update.UpdateFromAlphaFunc``" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromAlphaFunc:1 msgid "Bases: :py:class:`manim.animation.updaters.update.UpdateFromFunc`" msgstr "" #: ../../source/reference/manim.animation.updaters.update.UpdateFromAlphaFunc.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromAlphaFunc.interpolate_mobject:1::1 #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromAlphaFunc.interpolate_mobject:1 msgid "Interpolates the mobject of the :class:`Animation` based on alpha value." msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromAlphaFunc.interpolate_mobject:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromAlphaFunc.interpolate_mobject:3 msgid "A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively." msgstr "" manim.animation.updaters.update.UpdateFromFunc.pot000066400000000000000000000035251515024150700347050ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.updaters.update.UpdateFromFunc.rst:2 msgid "UpdateFromFunc" msgstr "" #: ../../source/reference/manim.animation.updaters.update.UpdateFromFunc.rst:4 msgid "Qualified name: ``manim.animation.updaters.update.UpdateFromFunc``" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromFunc:1 msgid "Bases: :py:class:`manim.animation.animation.Animation`" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromFunc:1 msgid "update_function of the form func(mobject), presumably to be used when the state of one mobject is dependent on another simultaneously animated mobject" msgstr "" #: ../../source/reference/manim.animation.updaters.update.UpdateFromFunc.rst:14 msgid "Methods" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromFunc.interpolate_mobject:1::1 #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromFunc.interpolate_mobject:1 msgid "Interpolates the mobject of the :class:`Animation` based on alpha value." msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromFunc.interpolate_mobject:0 msgid "Parameters" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update.UpdateFromFunc.interpolate_mobject:3 msgid "A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.animation.updaters.update.pot000066400000000000000000000007431515024150700321020ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.animation.updaters.update.rst:2 msgid "update" msgstr "" #: ../../../manim/animation/updaters/update.py:docstring of manim.animation.updaters.update:1 msgid "Animations that update mobjects." msgstr "" #: ../../source/reference/manim.animation.updaters.update.rst:15 msgid "Classes" msgstr "" manim.camera.camera.BackgroundColoredVMobjectDisplayer.pot000066400000000000000000000134051515024150700363100ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.camera.BackgroundColoredVMobjectDisplayer.rst:2 msgid "BackgroundColoredVMobjectDisplayer" msgstr "" #: ../../source/reference/manim.camera.camera.BackgroundColoredVMobjectDisplayer.rst:4 msgid "Qualified name: ``manim.camera.camera.BackgroundColoredVMobjectDisplayer``" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.display:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.get_background_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array_to_match:0 msgid "Parameters" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer:1 msgid "Camera object to use." msgstr "" #: ../../source/reference/manim.camera.camera.BackgroundColoredVMobjectDisplayer.rst:14 msgid "Methods" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.display:1::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.display:1 msgid "Displays the colored VMobjects." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.display:1::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.get_background_array:1 msgid "Gets the background array that has the passed file_name." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.display:1::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array:1 msgid "Resizes the pixel array representing the background." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.display:1::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array_to_match:1 msgid "Resizes the background array to match the passed pixel array." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.display:3 msgid "The VMobjects" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.display:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.get_background_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array_to_match:0 msgid "Returns" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.display:6 msgid "The pixel array with the `cvmobjects` displayed." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.display:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.get_background_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array_to_match:0 msgid "Return type" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.get_background_array:3 msgid "The background image or its file name." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.get_background_array:5 msgid "The pixel array of the image." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array:3 msgid "The pixel" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array:5 msgid "The new width of the background" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array:7 msgid "The new height of the background" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array:9 msgid "The PIL image mode, by default \"RGBA\"" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array:12 msgid "The numpy pixel array of the resized background." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array_to_match:3 msgid "The prospective pixel array." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.BackgroundColoredVMobjectDisplayer.resize_background_array_to_match:5 msgid "The pixel array whose width and height should be matched." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.camera.camera.Camera.pot000066400000000000000000001066151515024150700306670ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.camera.Camera.rst:2 msgid "Camera" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:4 msgid "Qualified name: ``manim.camera.camera.Camera``" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:1 msgid "Base camera class." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:3 msgid "This is the object which takes care of what exactly is displayed on screen at any given moment." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:6 msgid "Some important configuration values and local variables to note are:" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:10 msgid "background_image : :class:`str`, optional" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:9 msgid "str, optional" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:9 msgid "The path to an image that should be the background image. If not set, the background is filled with `self.background_color`" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:14 msgid "pixel_height : :class:`int`, optional" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:13 msgid "int, optional" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:13 msgid "The height of the scene in pixels." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:16 msgid "Initialises the Camera." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.adjust_out_of_range_points:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.adjusted_thickness:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_fill:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_stroke:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.cache_cairo_context:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobject:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobjects:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.convert_pixel_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_image_mobject:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_background_colored_vmobjects:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_image_mobjects:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_non_background_colored_vmobjects:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_point_cloud_mobjects:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_vectorized_mobjects:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_vectorized:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cached_cairo_context:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cairo_context:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_fill_rgbas:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_image:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_mobjects_to_display:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_stroke_rgbas:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_thickening_nudges:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.is_in_frame:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.make_background_from_func:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.on_screen_pixels:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.overlay_PIL_image:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.overlay_rgba_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.reset_pixel_shape:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.resize_frame_shape:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_background:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_background_from_func:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_color:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_path:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_pixel_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.thickened_coordinates:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:0 msgid "Parameters" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:18 msgid "What self.background should be, by default None as will be set later." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera:20 msgid "Any local variables to be set." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.adjust_out_of_range_points:1 msgid "If any of the points in the passed array are out of the viable range, they are adjusted suitably." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::0 #: ../../source/reference/manim.camera.camera.Camera.rst:63::0 msgid "param thickness" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_fill:1 msgid "Fills the cairo context" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_stroke:1 msgid "Applies a stroke to the VMobject in the cairo context." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.cache_cairo_context:1 msgid "Caches the passed Pixel array into a Cairo Context" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobject:1 msgid "Capture mobjects by storing it in :attr:`pixel_array`." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobjects:1 msgid "Capture mobjects by printing them on :attr:`pixel_array`." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.convert_pixel_array:1 msgid "Converts a pixel array from values that have floats in then to proper RGB values." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_image_mobject:1 msgid "Displays an ImageMobject by changing the pixel_array suitably." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_background_colored_vmobjects:1 msgid "Displays multiple vmobjects that have the same color as the background." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_image_mobjects:1 msgid "Displays multiple image mobjects by modifying the passed pixel_array." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_non_background_colored_vmobjects:1 msgid "Displays multiple VMobjects in the cairo context, as long as they don't have background colors." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_point_cloud_mobjects:1 msgid "Displays multiple PMobjects by modifying the passed pixel array." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_vectorized_mobjects:1 msgid "Displays multiple VMobjects in the pixel_array" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 msgid "Displays a PMobject by modifying the Pixel array suitably." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_vectorized:1 msgid "Displays a VMobject in the cairo context" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_background_colored_vmobject_displayer:1 msgid "Returns the background_colored_vmobject_displayer if it exists or makes one and returns it if not." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cached_cairo_context:1 msgid "Returns the cached cairo context of the passed pixel array if it exists, and None if it doesn't." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cairo_context:1 msgid "Returns the cairo context for a pixel array after caching it to self.pixel_array_to_cairo_context If that array has already been cached, it returns the cached version instead." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_coords_of_all_pixels:1 msgid "Returns the cartesian coordinates of each pixel." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_fill_rgbas:1 msgid "Returns the RGBA array of the fill of the passed VMobject" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_image:1 msgid "Returns an image from the passed pixel array, or from the current frame if the passed pixel array is none." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_mobjects_to_display:1 msgid "Used to get the list of mobjects to display with the camera." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_stroke_rgbas:1 msgid "Gets the RGBA array for the stroke of the passed VMobject." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 msgid "Initialize the background." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.is_in_frame:1 msgid "Checks whether the passed mobject is in frame or not." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 msgid "Makes a pixel array for the background by using coords_to_colors_func to determine each pixel's color." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.on_screen_pixels:1 msgid "Returns array of pixels that are on the screen from a given array of pixel_coordinates" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.overlay_PIL_image:1 msgid "Overlays a PIL image on the passed pixel array." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.overlay_rgba_array:1 msgid "Overlays an RGBA array on top of the given Pixel array." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.reset:1 msgid "Resets the camera's pixel array to that of the background" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.reset_pixel_shape:1 msgid "This method resets the height and width of a single pixel to the passed new_height and new_width." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.resize_frame_shape:1 msgid "Changes frame_shape to match the aspect ratio of the pixels, where fixed_dimension determines whether frame_height or frame_width remains fixed while the other changes accordingly." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_background:1 msgid "Sets the background to the passed pixel_array after converting to valid RGB values." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 msgid "Sets the background to a pixel array using coords_to_colors_func to determine each pixel's color." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_color:1 msgid "Sets the color of the cairo context" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_path:1 msgid "Sets a path for the cairo context with the vmobject passed" msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_pixel_array:1 msgid "Sets the pixel array of the camera to the passed pixel array." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.thickened_coordinates:1 msgid "Returns thickened coordinates for a passed array of pixel coords and a thickness to thicken by." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:63::1 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:1 msgid "Return the type of mobject, if it is a type that can be rendered." msgstr "" #: ../../source/reference/manim.camera.camera.Camera.rst:65 msgid "Attributes" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.adjust_out_of_range_points:4 msgid "The points to adjust" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.adjust_out_of_range_points:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_fill:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_stroke:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.convert_pixel_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_background_colored_vmobjects:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_vectorized:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_background_colored_vmobject_displayer:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cached_cairo_context:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cairo_context:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_coords_of_all_pixels:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_fill_rgbas:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_image:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_mobjects_to_display:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_stroke_rgbas:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.is_in_frame:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.make_background_from_func:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.on_screen_pixels:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.reset:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_color:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_path:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.thickened_coordinates:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:0 msgid "Returns" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.adjust_out_of_range_points:7 msgid "The adjusted points." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.adjust_out_of_range_points:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.adjusted_thickness:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_fill:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_stroke:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.convert_pixel_array:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_background_colored_vmobjects:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_vectorized:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_background_colored_vmobject_displayer:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cached_cairo_context:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cairo_context:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_coords_of_all_pixels:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_fill_rgbas:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_image:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_mobjects_to_display:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_stroke_rgbas:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_thickening_nudges:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.is_in_frame:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.make_background_from_func:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.on_screen_pixels:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.reset:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_color:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_path:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.thickened_coordinates:0 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:0 msgid "Return type" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_fill:3 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_stroke:3 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_color:3 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_path:3 msgid "The cairo context" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_fill:5 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_stroke:5 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_fill_rgbas:3 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_stroke_rgbas:4 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_path:5 msgid "The VMobject" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_fill:8 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_background_colored_vmobjects:8 msgid "The camera object." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_stroke:7 msgid "Whether or not to consider the background when applying this stroke width, by default False" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.apply_stroke:11 msgid "The camera object with the stroke applied." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.cache_cairo_context:3 msgid "The pixel array to cache" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.cache_cairo_context:5 msgid "The context to cache it into." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobject:3 msgid "This is a single-mobject version of :meth:`capture_mobjects`." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobject:5 msgid "Mobject to capture." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobject:6 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobjects:8 msgid "Keyword arguments to be passed to :meth:`get_mobjects_to_display`." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobjects:3 msgid "This is the essential function that converts the contents of a Scene into an array, which is then converted to an image or video." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobjects:6 msgid "Mobjects to capture." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobjects:12 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:12 msgid "Notes" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.capture_mobjects:13 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:13 msgid "For a list of classes that can currently be rendered, see :meth:`display_funcs`." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.convert_pixel_array:4 msgid "Pixel array to convert." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.convert_pixel_array:6 msgid "Whether or not to convert float values to ints, by default False" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.convert_pixel_array:9 msgid "The new, converted pixel array." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_image_mobject:3 msgid "The imageMobject to display" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_image_mobject:5 msgid "The Pixel array to put the imagemobject in." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_background_colored_vmobjects:3 msgid "List of Colored VMobjects" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_background_colored_vmobjects:5 msgid "The pixel array." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_image_mobjects:3 msgid "list of ImageMobjects" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_image_mobjects:5 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_point_cloud_mobjects:5 msgid "The pixel array to modify." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_non_background_colored_vmobjects:4 msgid "list of the VMobjects" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_non_background_colored_vmobjects:6 msgid "The Pixel array to add the VMobjects to." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_point_cloud_mobjects:3 msgid "List of PMobjects" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_vectorized_mobjects:3 msgid "list of VMobjects to display" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_multiple_vectorized_mobjects:5 msgid "The pixel array" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_point_cloud:1 msgid "Displays a PMobject by modifying the Pixel array suitably.. TODO: Write a description for the rgbas argument. :param pmobject: Point Cloud Mobject :type pmobject: PMobject :param points: The points to display in the point cloud mobject :type points: list :param rgbas: :type rgbas: np.array :param thickness: The thickness of each point of the PMobject :type thickness: int, float :param pixel_array: The pixel array to modify. :type pixel_array: np.array" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_vectorized:3 msgid "The Vectorized Mobject to display" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_vectorized:5 msgid "The cairo context to use." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.display_vectorized:8 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_color:10 msgid "The camera object" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_background_colored_vmobject_displayer:4 msgid "Object that displays VMobjects that have the same color as the background." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cached_cairo_context:4 msgid "The pixel array to check." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cached_cairo_context:7 msgid "The cached cairo context." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cairo_context:6 msgid "The Pixel array to get the cairo context of." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_cairo_context:9 msgid "The cairo context of the pixel array." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_coords_of_all_pixels:3 msgid "The array of cartesian coordinates." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_fill_rgbas:6 msgid "The RGBA Array of the fill of the VMobject" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_image:5 msgid "The pixel array from which to get an image, by default None" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_image:8 msgid "The PIL image of the array." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_mobjects_to_display:4 msgid "The Mobjects" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_mobjects_to_display:6 msgid "Whether or not to include the submobjects of mobjects, by default True" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_mobjects_to_display:8 msgid "Any mobjects to exclude, by default None" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_mobjects_to_display:11 msgid "list of mobjects" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_stroke_rgbas:6 msgid "Whether or not to consider the background when getting the stroke RGBAs, by default False" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.get_stroke_rgbas:10 msgid "The RGBA array of the stroke." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.init_background:1 msgid "Initialize the background. If self.background_image is the path of an image the image is set as background; else, the default background color fills the background." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.is_in_frame:4 msgid "The mobject for which the checking needs to be done." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.is_in_frame:7 msgid "True if in frame, False otherwise." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.make_background_from_func:1 msgid "Makes a pixel array for the background by using coords_to_colors_func to determine each pixel's color. Each input pixel's color. Each input to coords_to_colors_func is an (x, y) pair in space (in ordinary space coordinates; not pixel coordinates), and each output is expected to be an RGBA array of 4 floats." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.make_background_from_func:5 #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_background_from_func:5 msgid "The function whose input is an (x,y) pair of coordinates and whose return values must be the colors for that point" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.make_background_from_func:9 msgid "The pixel array which can then be passed to set_background." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.on_screen_pixels:4 msgid "The pixel coords to check." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.on_screen_pixels:7 msgid "The pixel coords on screen." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.overlay_PIL_image:3 msgid "The Pixel array" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.overlay_PIL_image:5 msgid "The Image to overlay." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.overlay_rgba_array:3 msgid "The original pixel array to modify." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.overlay_rgba_array:5 msgid "The new pixel array to overlay." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.reset:4 msgid "The camera object after setting the pixel array." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.reset_pixel_shape:4 msgid "The new height of the entire scene in pixels" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.reset_pixel_shape:6 msgid "The new width of the entire scene in pixels" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.resize_frame_shape:6 msgid "If 0, height is scaled with respect to width else, width is scaled with respect to height." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_background:4 msgid "The pixel array to set the background to." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_background:6 msgid "Whether or not to convert floats values to proper RGB valid ones, by default False" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_background_from_func:1 msgid "Sets the background to a pixel array using coords_to_colors_func to determine each pixel's color. Each input pixel's color. Each input to coords_to_colors_func is an (x, y) pair in space (in ordinary space coordinates; not pixel coordinates), and each output is expected to be an RGBA array of 4 floats." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_color:5 msgid "The RGBA array with which to color the context." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_color:7 msgid "The VMobject with which to set the color." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_cairo_context_path:8 msgid "Camera object after setting cairo_context_path" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_pixel_array:3 msgid "The pixel array to convert and then set as the camera's pixel array." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.set_pixel_array:5 msgid "Whether or not to convert float values to proper RGB values, by default False" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.thickened_coordinates:4 msgid "Pixel coordinates" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.thickened_coordinates:6 msgid "Thickness" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.thickened_coordinates:9 msgid "Array of thickened pixel coords." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:3 msgid "If `mobject` is an instance of a class that inherits from a class that can be rendered, return the super class. For example, an instance of a Square is also an instance of VMobject, and these can be rendered. Therefore, `type_or_raise(Square())` returns True." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:8 msgid "The object to take the type of." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:15 msgid "The type of mobjects, if it can be rendered." msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:16 msgid "Type[:class:`~.Mobject`]" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera.Camera.type_or_raise:0 msgid "Raises" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.camera.camera.pot000066400000000000000000000012621515024150700274700ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.camera.rst:2 msgid "camera" msgstr "" #: ../../../manim/camera/camera.py:docstring of manim.camera.camera:1 msgid "A camera converts the mobjects contained in a Scene into an array of pixels." msgstr "" #: ../../source/reference/manim.camera.camera.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.camera.camera.rst:22::0 msgid "param camera" msgstr "" #: ../../source/reference/manim.camera.camera.rst:22::1 msgid "Camera object to use." msgstr "" manim.camera.mapping_camera.MappingCamera.pot000066400000000000000000000052701515024150700336320ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.mapping_camera.MappingCamera.rst:2 msgid "MappingCamera" msgstr "" #: ../../source/reference/manim.camera.mapping_camera.MappingCamera.rst:4 msgid "Qualified name: ``manim.camera.mapping\\_camera.MappingCamera``" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera:1 msgid "Bases: :py:class:`manim.camera.camera.Camera`" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera:1 msgid "Camera object that allows mapping between objects." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera:4 msgid "Initialises the Camera." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera:0 #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera.capture_mobjects:0 msgid "Parameters" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera:6 msgid "What self.background should be, by default None as will be set later." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera:8 msgid "Any local variables to be set." msgstr "" #: ../../source/reference/manim.camera.mapping_camera.MappingCamera.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.camera.mapping_camera.MappingCamera.rst:21::1 #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera.capture_mobjects:1 msgid "Capture mobjects by printing them on :attr:`pixel_array`." msgstr "" #: ../../source/reference/manim.camera.mapping_camera.MappingCamera.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera.capture_mobjects:3 msgid "This is the essential function that converts the contents of a Scene into an array, which is then converted to an image or video." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera.capture_mobjects:6 msgid "Mobjects to capture." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera.capture_mobjects:8 msgid "Keyword arguments to be passed to :meth:`get_mobjects_to_display`." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.MappingCamera.capture_mobjects:12 msgid "Notes" msgstr "" manim.camera.mapping_camera.OldMultiCamera.pot000066400000000000000000000111141515024150700337620ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.mapping_camera.OldMultiCamera.rst:2 msgid "OldMultiCamera" msgstr "" #: ../../source/reference/manim.camera.mapping_camera.OldMultiCamera.rst:4 msgid "Qualified name: ``manim.camera.mapping\\_camera.OldMultiCamera``" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera:1 msgid "Bases: :py:class:`manim.camera.camera.Camera`" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera:1 msgid "Initialises the Camera." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera:0 #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.capture_mobjects:0 #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.set_background:0 #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.set_pixel_array:0 msgid "Parameters" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera:3 msgid "What self.background should be, by default None as will be set later." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera:5 msgid "Any local variables to be set." msgstr "" #: ../../source/reference/manim.camera.mapping_camera.OldMultiCamera.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.camera.mapping_camera.OldMultiCamera.rst:23::1 #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.capture_mobjects:1 msgid "Capture mobjects by printing them on :attr:`pixel_array`." msgstr "" #: ../../source/reference/manim.camera.mapping_camera.OldMultiCamera.rst:23::1 msgid "Initialize the background." msgstr "" #: ../../source/reference/manim.camera.mapping_camera.OldMultiCamera.rst:23::1 #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.set_background:1 msgid "Sets the background to the passed pixel_array after converting to valid RGB values." msgstr "" #: ../../source/reference/manim.camera.mapping_camera.OldMultiCamera.rst:23::1 #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.set_pixel_array:1 msgid "Sets the pixel array of the camera to the passed pixel array." msgstr "" #: ../../source/reference/manim.camera.mapping_camera.OldMultiCamera.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.capture_mobjects:3 msgid "This is the essential function that converts the contents of a Scene into an array, which is then converted to an image or video." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.capture_mobjects:6 msgid "Mobjects to capture." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.capture_mobjects:8 msgid "Keyword arguments to be passed to :meth:`get_mobjects_to_display`." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.capture_mobjects:12 msgid "Notes" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.capture_mobjects:13 msgid "For a list of classes that can currently be rendered, see :meth:`display_funcs`." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.init_background:1 msgid "Initialize the background. If self.background_image is the path of an image the image is set as background; else, the default background color fills the background." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.set_background:4 msgid "The pixel array to set the background to." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.set_background:6 msgid "Whether or not to convert floats values to proper RGB valid ones, by default False" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.OldMultiCamera.set_pixel_array:3 msgid "The pixel array to convert and then set as the camera's pixel array." msgstr "" manim.camera.mapping_camera.SplitScreenCamera.pot000066400000000000000000000026671515024150700345010ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.mapping_camera.SplitScreenCamera.rst:2 msgid "SplitScreenCamera" msgstr "" #: ../../source/reference/manim.camera.mapping_camera.SplitScreenCamera.rst:4 msgid "Qualified name: ``manim.camera.mapping\\_camera.SplitScreenCamera``" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.SplitScreenCamera:1 msgid "Bases: :py:class:`manim.camera.mapping_camera.OldMultiCamera`" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.SplitScreenCamera:1 msgid "Initialises the Camera." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.SplitScreenCamera:0 msgid "Parameters" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.SplitScreenCamera:3 msgid "What self.background should be, by default None as will be set later." msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera.SplitScreenCamera:5 msgid "Any local variables to be set." msgstr "" #: ../../source/reference/manim.camera.mapping_camera.SplitScreenCamera.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.camera.mapping_camera.SplitScreenCamera.rst:21 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.camera.mapping_camera.pot000066400000000000000000000015021515024150700312000ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.mapping_camera.rst:2 msgid "mapping\\_camera" msgstr "" #: ../../../manim/camera/mapping_camera.py:docstring of manim.camera.mapping_camera:1 msgid "A camera that allows mapping between objects." msgstr "" #: ../../source/reference/manim.camera.mapping_camera.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.camera.mapping_camera.rst:24::1 msgid "Camera object that allows mapping between objects." msgstr "" #: ../../source/reference/manim.camera.mapping_camera.rst:24::1 #: ../../source/reference/manim.camera.mapping_camera.rst:24::1 msgid "Initialises the Camera." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.camera.moving_camera.CameraFrame.pot000066400000000000000000000000011515024150700331770ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.camera.moving_camera.MovingCamera.pot000066400000000000000000000170501515024150700334200ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.moving_camera.MovingCamera.rst:2 msgid "MovingCamera" msgstr "" #: ../../source/reference/manim.camera.moving_camera.MovingCamera.rst:4 msgid "Qualified name: ``manim.camera.moving\\_camera.MovingCamera``" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera:1 msgid "Bases: :py:class:`manim.camera.camera.Camera`" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera:1 msgid "Stays in line with the height, width and position of it's 'frame', which is a Rectangle" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera:8 msgid "Frame is a Mobject, (should almost certainly be a rectangle) determining which region of space the camera displays" msgstr "" #: ../../source/reference/manim.camera.moving_camera.MovingCamera.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.camera.moving_camera.MovingCamera.rst:24::1 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:1 msgid "Zooms on to a given array of mobjects (or a singular mobject) and automatically resizes to frame all the mobjects." msgstr "" #: ../../source/reference/manim.camera.moving_camera.MovingCamera.rst:24::1 #: ../../source/reference/manim.camera.moving_camera.MovingCamera.rst:24::1 msgid "Since the frame can be moving around, the cairo context used for updating should be regenerated at each frame." msgstr "" #: ../../source/reference/manim.camera.moving_camera.MovingCamera.rst:24::1 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.capture_mobjects:1 msgid "Capture mobjects by printing them on :attr:`pixel_array`." msgstr "" #: ../../source/reference/manim.camera.moving_camera.MovingCamera.rst:24::1 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.get_mobjects_indicating_movement:1 msgid "Returns all mobjects whose movement implies that the camera should think of all other mobjects on the screen as moving" msgstr "" #: ../../source/reference/manim.camera.moving_camera.MovingCamera.rst:26 msgid "Attributes" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:1::1 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_center:1 msgid "Returns the centerpoint of the frame in cartesian coordinates." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:1::1 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_height:1 msgid "Returns the height of the frame." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:1::1 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_width:1 msgid "Returns the width of the frame" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:6 msgid "This method only works when 2D-objects in the XY-plane are considered, it will not work correctly when the camera has been rotated." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:0 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.capture_mobjects:0 msgid "Parameters" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:9 msgid "The mobject or array of mobjects that the camera will focus on." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:10 msgid "The width of the margin that is added to the frame (optional, 0 by default)." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:11 msgid "If set to ``True``, only allows focusing on mobjects that are already in frame." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:12 msgid "If set to ``False``, applies the changes instead of returning the corresponding animation" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:0 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_center:0 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_height:0 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_width:0 msgid "Returns" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:14 msgid "_AnimationBuilder that zooms the camera view to a given list of mobjects or ScreenRectangle with position and size updated to zoomed position." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.auto_zoom:0 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_center:0 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_height:0 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_width:0 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.get_mobjects_indicating_movement:0 msgid "Return type" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.cache_cairo_context:1 #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.get_cached_cairo_context:1 msgid "Since the frame can be moving around, the cairo context used for updating should be regenerated at each frame. So no caching." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.capture_mobjects:3 msgid "This is the essential function that converts the contents of a Scene into an array, which is then converted to an image or video." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.capture_mobjects:6 msgid "Mobjects to capture." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.capture_mobjects:8 msgid "Keyword arguments to be passed to :meth:`get_mobjects_to_display`." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.capture_mobjects:12 msgid "Notes" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.capture_mobjects:13 msgid "For a list of classes that can currently be rendered, see :meth:`display_funcs`." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_center:3 msgid "The cartesian coordinates of the center of the frame." msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera.MovingCamera.frame_height:3 msgid "The height of the frame." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.camera.moving_camera.pot000066400000000000000000000007361515024150700310540ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.moving_camera.rst:2 msgid "moving\\_camera" msgstr "" #: ../../../manim/camera/moving_camera.py:docstring of manim.camera.moving_camera:1 msgid "A camera able to move through a scene." msgstr "" #: ../../source/reference/manim.camera.moving_camera.rst:15 msgid "Classes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.camera.multi_camera.MultiCamera.pot000066400000000000000000000121121515024150700331000ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.multi_camera.MultiCamera.rst:2 msgid "MultiCamera" msgstr "" #: ../../source/reference/manim.camera.multi_camera.MultiCamera.rst:4 msgid "Qualified name: ``manim.camera.multi\\_camera.MultiCamera``" msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera:1 msgid "Bases: :py:class:`manim.camera.moving_camera.MovingCamera`" msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera:1 msgid "Camera Object that allows for multiple perspectives." msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera:3 msgid "Initialises the MultiCamera" msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera:0 #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.add_image_mobject_from_camera:0 #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.capture_mobjects:0 msgid "Parameters" msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera:7 msgid "Any valid keyword arguments of MovingCamera." msgstr "" #: ../../source/reference/manim.camera.multi_camera.MultiCamera.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.camera.multi_camera.MultiCamera.rst:24::1 #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.add_image_mobject_from_camera:1 msgid "Adds an ImageMobject that's been obtained from the camera into the list ``self.image_mobject_from_cameras``" msgstr "" #: ../../source/reference/manim.camera.multi_camera.MultiCamera.rst:24::1 #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.capture_mobjects:1 msgid "Capture mobjects by printing them on :attr:`pixel_array`." msgstr "" #: ../../source/reference/manim.camera.multi_camera.MultiCamera.rst:24::1 #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.get_mobjects_indicating_movement:1 msgid "Returns all mobjects whose movement implies that the camera should think of all other mobjects on the screen as moving" msgstr "" #: ../../source/reference/manim.camera.multi_camera.MultiCamera.rst:24::1 #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.reset:1 msgid "Resets the MultiCamera." msgstr "" #: ../../source/reference/manim.camera.multi_camera.MultiCamera.rst:24::1 #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.update_sub_cameras:1 msgid "Reshape sub_camera pixel_arrays" msgstr "" #: ../../source/reference/manim.camera.multi_camera.MultiCamera.rst:26 msgid "Attributes" msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.add_image_mobject_from_camera:1::1 msgid "Returns the centerpoint of the frame in cartesian coordinates." msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.add_image_mobject_from_camera:1::1 msgid "Returns the height of the frame." msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.add_image_mobject_from_camera:1::1 msgid "Returns the width of the frame" msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.add_image_mobject_from_camera:4 msgid "The ImageMobject to add to self.image_mobject_from_cameras" msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.capture_mobjects:3 msgid "This is the essential function that converts the contents of a Scene into an array, which is then converted to an image or video." msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.capture_mobjects:6 msgid "Mobjects to capture." msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.capture_mobjects:8 msgid "Keyword arguments to be passed to :meth:`get_mobjects_to_display`." msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.capture_mobjects:12 msgid "Notes" msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.capture_mobjects:13 msgid "For a list of classes that can currently be rendered, see :meth:`display_funcs`." msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.get_mobjects_indicating_movement:0 #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.reset:0 msgid "Return type" msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera.MultiCamera.reset:0 msgid "Returns" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.camera.multi_camera.pot000066400000000000000000000007351515024150700307060ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.multi_camera.rst:2 msgid "multi\\_camera" msgstr "" #: ../../../manim/camera/multi_camera.py:docstring of manim.camera.multi_camera:1 msgid "A camera supporting multiple perspectives." msgstr "" #: ../../source/reference/manim.camera.multi_camera.rst:15 msgid "Classes" msgstr "" manim.camera.three_d_camera.ThreeDCamera.pot000066400000000000000000000507341515024150700333760ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:2 msgid "ThreeDCamera" msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:4 msgid "Qualified name: ``manim.camera.three\\_d\\_camera.ThreeDCamera``" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera:1 msgid "Bases: :py:class:`manim.camera.camera.Camera`" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera:1 msgid "Initializes the ThreeDCamera" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.add_fixed_in_frame_mobjects:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.add_fixed_orientation_mobjects:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.capture_mobjects:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_fill_rgbas:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_mobjects_to_display:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_stroke_rgbas:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_point:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_points:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.remove_fixed_in_frame_mobjects:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.remove_fixed_orientation_mobjects:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_focal_distance:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_gamma:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_phi:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_theta:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_zoom:0 msgid "Parameters" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera:3 msgid "Any argument of Camera" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera:4 msgid "Any keyword argument of Camera." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 msgid "This method allows the mobject to have a fixed position, even when the camera moves around." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 msgid "This method allows the mobject to have a fixed orientation, even when the camera moves around." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.capture_mobjects:1 msgid "Capture mobjects by printing them on :attr:`pixel_array`." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.generate_rotation_matrix:1 msgid "Generates a rotation matrix based off the current position of the camera." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_fill_rgbas:1 msgid "Returns the RGBA array of the fill of the passed VMobject" msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_focal_distance:1 msgid "Returns focal_distance of the Camera." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_gamma:1 msgid "Returns the rotation of the camera about the vector from the ORIGIN to the Camera." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_mobjects_to_display:1 msgid "Used to get the list of mobjects to display with the camera." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_phi:1 msgid "Returns the Polar angle (the angle off Z_AXIS) phi." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_rotation_matrix:1 msgid "Returns the matrix corresponding to the current position of the camera." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_stroke_rgbas:1 msgid "Gets the RGBA array for the stroke of the passed VMobject." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_theta:1 msgid "Returns the Azimuthal i.e the angle that spins the camera around the Z_AXIS." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_value_trackers:1 msgid "Returns list of ValueTrackers of phi, theta, focal_distance and gamma" msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_zoom:1 msgid "Returns the zoom amount of the camera." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_point:1 msgid "Applies the current rotation_matrix as a projection matrix to the passed point." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_points:1 msgid "Applies the current rotation_matrix as a projection matrix to the passed array of points." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 msgid "If a mobject was fixed in frame by passing it through :meth:`.add_fixed_in_frame_mobjects`, then this undoes that fixing." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 msgid "If a mobject was fixed in its orientation by passing it through :meth:`.add_fixed_orientation_mobjects`, then this undoes that fixing." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.reset_rotation_matrix:1 msgid "Sets the value of self.rotation_matrix to the matrix corresponding to the current position of the camera" msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_focal_distance:1 msgid "Sets the focal_distance of the Camera." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_gamma:1 msgid "Sets the angle of rotation of the camera about the vector from the ORIGIN to the Camera." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_phi:1 msgid "Sets the polar angle i.e the angle between Z_AXIS and Camera through ORIGIN in radians." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_theta:1 msgid "Sets the azimuthal angle i.e the angle that spins the camera around Z_AXIS in radians." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:45::1 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_zoom:1 msgid "Sets the zoom amount of the camera." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.ThreeDCamera.rst:47 msgid "Attributes" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.add_fixed_in_frame_mobjects:1 msgid "This method allows the mobject to have a fixed position, even when the camera moves around. E.G If it was passed through this method, at the top of the frame, it will continue to be displayed at the top of the frame." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.add_fixed_in_frame_mobjects:6 msgid "Highly useful when displaying Titles or formulae or the like." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.add_fixed_in_frame_mobjects:8 msgid "The mobject to fix in frame." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.add_fixed_orientation_mobjects:1 msgid "This method allows the mobject to have a fixed orientation, even when the camera moves around. E.G If it was passed through this method, facing the camera, it will continue to face the camera even as the camera moves. Highly useful when adding labels to graphs and the like." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.add_fixed_orientation_mobjects:7 msgid "The mobject whose orientation must be fixed." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.add_fixed_orientation_mobjects:9 msgid "Whether or not to use the function that takes the mobject's center as centerpoint, by default False" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.add_fixed_orientation_mobjects:12 msgid "The function which returns the centerpoint with respect to which the mobject will be oriented, by default None" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.capture_mobjects:3 msgid "This is the essential function that converts the contents of a Scene into an array, which is then converted to an image or video." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.capture_mobjects:6 msgid "Mobjects to capture." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.capture_mobjects:8 msgid "Keyword arguments to be passed to :meth:`get_mobjects_to_display`." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.capture_mobjects:12 msgid "Notes" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.capture_mobjects:13 msgid "For a list of classes that can currently be rendered, see :meth:`display_funcs`." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.generate_rotation_matrix:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_fill_rgbas:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_focal_distance:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_gamma:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_mobjects_to_display:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_phi:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_rotation_matrix:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_stroke_rgbas:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_theta:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_value_trackers:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_zoom:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_point:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_points:0 msgid "Returns" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.generate_rotation_matrix:3 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_rotation_matrix:3 msgid "The matrix corresponding to the current position of the camera." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.generate_rotation_matrix:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_fill_rgbas:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_focal_distance:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_gamma:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_mobjects_to_display:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_phi:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_rotation_matrix:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_stroke_rgbas:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_theta:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_value_trackers:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_zoom:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_point:0 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_points:0 msgid "Return type" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_fill_rgbas:3 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_stroke_rgbas:4 msgid "The VMobject" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_fill_rgbas:6 msgid "The RGBA Array of the fill of the VMobject" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_focal_distance:3 msgid "The focal_distance of the Camera in MUnits." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_gamma:3 msgid "The angle of rotation of the camera about the vector from the ORIGIN to the Camera in radians" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_mobjects_to_display:4 msgid "The Mobjects" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_mobjects_to_display:6 msgid "Whether or not to include the submobjects of mobjects, by default True" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_mobjects_to_display:8 msgid "Any mobjects to exclude, by default None" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_mobjects_to_display:11 msgid "list of mobjects" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_phi:3 msgid "The Polar angle in radians." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_stroke_rgbas:6 msgid "Whether or not to consider the background when getting the stroke RGBAs, by default False" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_stroke_rgbas:10 msgid "The RGBA array of the stroke." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_theta:3 msgid "The Azimuthal angle in radians." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_value_trackers:3 msgid "list of ValueTracker objects" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.get_zoom:3 #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_zoom:3 msgid "The zoom amount of the camera." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_point:4 msgid "The point to project." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_point:7 msgid "The point after projection." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_points:4 msgid "The list of points to project." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.project_points:7 msgid "The points after projecting." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.remove_fixed_in_frame_mobjects:1 msgid "If a mobject was fixed in frame by passing it through :meth:`.add_fixed_in_frame_mobjects`, then this undoes that fixing. The Mobject will no longer be fixed in frame." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.remove_fixed_in_frame_mobjects:5 msgid "The mobjects which need not be fixed in frame any longer." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.remove_fixed_orientation_mobjects:1 msgid "If a mobject was fixed in its orientation by passing it through :meth:`.add_fixed_orientation_mobjects`, then this undoes that fixing. The Mobject will no longer have a fixed orientation." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.remove_fixed_orientation_mobjects:5 msgid "The mobjects whose orientation need not be fixed any longer." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_focal_distance:3 msgid "The focal_distance of the Camera." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_gamma:3 msgid "The new angle of rotation of the camera." msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera.ThreeDCamera.set_phi:3 msgid "The new value of the polar angle in radians." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.camera.three_d_camera.pot000066400000000000000000000010071515024150700311570ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.camera.three_d_camera.rst:2 msgid "three\\_d\\_camera" msgstr "" #: ../../../manim/camera/three_d_camera.py:docstring of manim.camera.three_d_camera:1 msgid "A camera that can be positioned and oriented in three-dimensional space." msgstr "" #: ../../source/reference/manim.camera.three_d_camera.rst:15 msgid "Classes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.constants.pot000066400000000000000000000040141515024150700270230ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.constants.rst:2 msgid "constants" msgstr "" #: ../../../manim/constants.py:docstring of manim.constants:1 msgid "Constant definitions." msgstr "" #: ../../source/reference/manim.constants.rst:11 msgid "Module Attributes" msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "The center of the coordinate system." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "One unit step in the positive Y direction." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "One unit step in the negative Y direction." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "One unit step in the positive X direction." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "One unit step in the negative X direction." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "One unit step in the negative Z direction." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "One unit step in the positive Z direction." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "One step up plus one step left." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "One step up plus one step right." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "One step down plus one step left." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "One step down plus one step right." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "The ratio of the circumference of a circle to its diameter." msgstr "" #: ../../source/reference/manim.constants.rst:27::1 msgid "The ratio of the circumference of a circle to its radius." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.boolean_ops.Difference.pot000066400000000000000000000000011515024150700327520ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.boolean_ops.Exclusion.pot000066400000000000000000000000011515024150700326710ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.boolean_ops.Intersection.pot000066400000000000000000000000011515024150700333660ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.boolean_ops.Union.pot000066400000000000000000000000011515024150700320100ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.boolean_ops.pot000066400000000000000000000000011515024150700307210ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.changing.AnimatedBoundary.pot000066400000000000000000000000011515024150700334240ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.changing.TracedPath.pot000066400000000000000000000000011515024150700322150ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.changing.pot000066400000000000000000000000011515024150700301770ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.coordinate_systems.Axes.pot000066400000000000000000000000011515024150700332360ustar00rootroot00000000000000 manim.mobject.coordinate_systems.ComplexPlane.pot000066400000000000000000000000011515024150700346460ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference manim.mobject.coordinate_systems.CoordinateSystem.pot000066400000000000000000000000011515024150700355530ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference manim.mobject.coordinate_systems.NumberPlane.pot000066400000000000000000000000011515024150700344670ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference manim.mobject.coordinate_systems.PolarPlane.pot000066400000000000000000000000011515024150700343140ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference manim.mobject.coordinate_systems.ThreeDAxes.pot000066400000000000000000000000011515024150700342530ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.coordinate_systems.pot000066400000000000000000000000011515024150700323370ustar00rootroot00000000000000 manim.mobject.frame.FullScreenFadeRectangle.pot000066400000000000000000000000011515024150700341020ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.frame.FullScreenRectangle.pot000066400000000000000000000027711515024150700334210ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.frame.FullScreenRectangle.rst:2 msgid "FullScreenRectangle" msgstr "" #: ../../source/reference/manim.mobject.frame.FullScreenRectangle.rst:4 msgid "Qualified name: ``manim.mobject.frame.FullScreenRectangle``" msgstr "" #: ../../../manim/mobject/frame.py:docstring of manim.mobject.frame.FullScreenRectangle:1 msgid "Bases: :py:class:`manim.mobject.frame.ScreenRectangle`" msgstr "" #: ../../source/reference/manim.mobject.frame.FullScreenRectangle.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.frame.FullScreenRectangle.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.frame.FullScreenRectangle.rst:33::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.frame.FullScreenRectangle.rst:33::1 msgid "The aspect ratio." msgstr "" #: ../../source/reference/manim.mobject.frame.FullScreenRectangle.rst:33::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.frame.FullScreenRectangle.rst:33::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.frame.FullScreenRectangle.rst:33::1 msgid "The height of the mobject." msgstr "" manim.mobject.frame.PictureInPictureFrame.pot000066400000000000000000000000011515024150700336440ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.frame.ScreenRectangle.pot000066400000000000000000000035501515024150700325720ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.frame.ScreenRectangle.rst:2 msgid "ScreenRectangle" msgstr "" #: ../../source/reference/manim.mobject.frame.ScreenRectangle.rst:4 msgid "Qualified name: ``manim.mobject.frame.ScreenRectangle``" msgstr "" #: ../../../manim/mobject/frame.py:docstring of manim.mobject.frame.ScreenRectangle:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.Rectangle`" msgstr "" #: ../../source/reference/manim.mobject.frame.ScreenRectangle.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.frame.ScreenRectangle.rst:21 msgid "Attributes" msgstr "" #: ../../../manim/mobject/frame.py:docstring of manim.mobject.frame.ScreenRectangle.aspect_ratio:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/frame.py:docstring of manim.mobject.frame.ScreenRectangle.aspect_ratio:1::1 #: ../../../manim/mobject/frame.py:docstring of manim.mobject.frame.ScreenRectangle.aspect_ratio:1 msgid "The aspect ratio." msgstr "" #: ../../../manim/mobject/frame.py:docstring of manim.mobject.frame.ScreenRectangle.aspect_ratio:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/frame.py:docstring of manim.mobject.frame.ScreenRectangle.aspect_ratio:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/frame.py:docstring of manim.mobject.frame.ScreenRectangle.aspect_ratio:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/frame.py:docstring of manim.mobject.frame.ScreenRectangle.aspect_ratio:1::1 msgid "The width of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.frame.pot000066400000000000000000000006451515024150700275310ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.frame.rst:2 msgid "frame" msgstr "" #: ../../../manim/mobject/frame.py:docstring of manim.mobject.frame:1 msgid "Special rectangles." msgstr "" #: ../../source/reference/manim.mobject.frame.rst:15 msgid "Classes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.functions.FunctionGraph.pot000066400000000000000000000000011515024150700331770ustar00rootroot00000000000000 manim.mobject.functions.ImplicitFunction.pot000066400000000000000000000000011515024150700336310ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference manim.mobject.functions.ParametricFunction.pot000066400000000000000000000000011515024150700341460ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.functions.pot000066400000000000000000000000011515024150700304310ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Angle.pot000066400000000000000000000000011515024150700313010ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.AnnotationDot.pot000066400000000000000000000000011515024150700330340ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.AnnularSector.pot000066400000000000000000000000011515024150700330330ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Annulus.pot000066400000000000000000000000011515024150700317000ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.ArcBetweenPoints.pot000066400000000000000000000000011515024150700334670ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.ArcPolygon.pot000066400000000000000000000000011515024150700323300ustar00rootroot00000000000000 manim.mobject.geometry.ArcPolygonFromArcs.pot000066400000000000000000000000011515024150700337060ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Arrow.pot000066400000000000000000000000011515024150700313450ustar00rootroot00000000000000 manim.mobject.geometry.ArrowCircleFilledTip.pot000066400000000000000000000000011515024150700342050ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.ArrowCircleTip.pot000066400000000000000000000000011515024150700331440ustar00rootroot00000000000000 manim.mobject.geometry.ArrowSquareFilledTip.pot000066400000000000000000000000011515024150700342440ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.ArrowSquareTip.pot000066400000000000000000000000011515024150700332030ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.ArrowTip.pot000066400000000000000000000000011515024150700320220ustar00rootroot00000000000000 manim.mobject.geometry.ArrowTriangleFilledTip.pot000066400000000000000000000000011515024150700345510ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.ArrowTriangleTip.pot000066400000000000000000000000011515024150700335100ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Circle.pot000066400000000000000000000000011515024150700314540ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.CubicBezier.pot000066400000000000000000000000011515024150700324410ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.CurvedArrow.pot000066400000000000000000000000011515024150700325160ustar00rootroot00000000000000 manim.mobject.geometry.CurvedDoubleArrow.pot000066400000000000000000000000011515024150700335720ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Cutout.pot000066400000000000000000000000011515024150700315360ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.DashedLine.pot000066400000000000000000000000011515024150700322530ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Dot.pot000066400000000000000000000000011515024150700310010ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.DoubleArrow.pot000066400000000000000000000000011515024150700325000ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Elbow.pot000066400000000000000000000000011515024150700313230ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Ellipse.pot000066400000000000000000000000011515024150700316500ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.LabeledDot.pot000066400000000000000000000000011515024150700322520ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Polygon.pot000066400000000000000000000000011515024150700317020ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Rectangle.pot000066400000000000000000000000011515024150700321570ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.RegularPolygon.pot000066400000000000000000000000011515024150700332240ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.RegularPolygram.pot000066400000000000000000000000011515024150700333670ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.RightAngle.pot000066400000000000000000000000011515024150700322770ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.RoundedRectangle.pot000066400000000000000000000000011515024150700335000ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Sector.pot000066400000000000000000000000011515024150700315120ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Square.pot000066400000000000000000000000011515024150700315130ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Star.pot000066400000000000000000000000011515024150700311640ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.TangentLine.pot000066400000000000000000000000011515024150700324630ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.TipableVMobject.pot000066400000000000000000000000011515024150700332650ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Triangle.pot000066400000000000000000000000011515024150700320200ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.Vector.pot000066400000000000000000000000011515024150700315150ustar00rootroot00000000000000 manim.mobject.geometry.arc.AnnotationDot.pot000066400000000000000000000032721515024150700335360ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.AnnotationDot.rst:2 msgid "AnnotationDot" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnotationDot.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.AnnotationDot``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnotationDot:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.Dot`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnotationDot:1 msgid "A dot with bigger radius and bold stroke to annotate scenes." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnotationDot.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnotationDot.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnotationDot.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnotationDot.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnotationDot.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnotationDot.rst:32::1 msgid "The height of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnotationDot.rst:32::1 msgid "The width of the mobject." msgstr "" manim.mobject.geometry.arc.AnnularSector.pot000066400000000000000000000070341515024150700335350ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.AnnularSector.rst:2 msgid "AnnularSector" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnularSector.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.AnnularSector``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.Arc`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector:1 msgid "The inside radius of the Annular Sector." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector:2 msgid "The outside radius of the Annular Sector." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector:3 msgid "The clockwise angle of the Annular Sector." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector:4 msgid "The starting clockwise angle of the Annular Sector." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector:5 msgid "The opacity of the color filled in the Annular Sector." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector:6 msgid "The stroke width of the Annular Sector." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector:7 msgid "The color filled into the Annular Sector." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector:10 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnularSector.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnularSector.rst:21::1 #: ../../source/reference/manim.mobject.geometry.arc.AnnularSector.rst:21::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector.generate_points:1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.AnnularSector.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector.generate_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.AnnularSector.generate_points:1::1 msgid "The width of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.Annulus.pot000066400000000000000000000057021515024150700324610ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.Annulus.rst:2 msgid "Annulus" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Annulus.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.Annulus``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.Circle`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus:1 msgid "Region between two concentric :class:`Circles <.Circle>`." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus:3 msgid "The radius of the inner :class:`Circle`." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus:4 msgid "The radius of the outer :class:`Circle`." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus:5 msgid "Additional arguments to be passed to :class:`Annulus`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus:8 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Annulus.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Annulus.rst:21::1 #: ../../source/reference/manim.mobject.geometry.arc.Annulus.rst:21::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus.generate_points:1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Annulus.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus.generate_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Annulus.generate_points:1::1 msgid "The width of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.Arc.pot000066400000000000000000000051521515024150700315400ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.Arc.rst:2 msgid "Arc" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Arc.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.Arc``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.TipableVMobject`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc:1 msgid "A circular arc." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc:5 msgid "A simple arc of angle Pi." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Arc.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Arc.rst:24::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Arc.rst:24::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc.get_arc_center:1 msgid "Looks at the normals to the first two anchors, and finds their intersection points" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Arc.rst:26 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc.generate_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc.generate_points:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Arc:0 msgid "Parameters" msgstr "" manim.mobject.geometry.arc.ArcBetweenPoints.pot000066400000000000000000000033561515024150700341740ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.ArcBetweenPoints.rst:2 msgid "ArcBetweenPoints" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcBetweenPoints.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.ArcBetweenPoints``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcBetweenPoints:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.Arc`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcBetweenPoints:1 msgid "Inherits from Arc and additionally takes 2 points between which the arc is spanned." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcBetweenPoints:4 msgid "Example" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcBetweenPoints.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcBetweenPoints.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcBetweenPoints.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcBetweenPoints.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcBetweenPoints.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcBetweenPoints.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.ArcPolygon.pot000066400000000000000000000110011515024150700330760ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygon.rst:2 msgid "ArcPolygon" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygon.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.ArcPolygon``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:1 msgid "A generalized polygon allowing for points to be connected with arcs." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:3 msgid "This version tries to stick close to the way :class:`Polygon` is used. Points can be passed to it directly which are used to generate the according arcs (using :class:`ArcBetweenPoints`). An angle or radius can be passed to it to use across all arcs, but to configure arcs individually an ``arc_config`` list has to be passed with the syntax explained below." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:9 msgid "A list of vertices, start and end points for the arc segments." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:10 msgid "The angle used for constructing the arcs. If no other parameters are set, this angle is used to construct all arcs." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:12 msgid "The circle radius used to construct the arcs. If specified, overrides the specified ``angle``." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:14 msgid "When passing a ``dict``, its content will be passed as keyword arguments to :class:`~.ArcBetweenPoints`. Otherwise, a list of dictionaries containing values that are passed as keyword arguments for every individual arc can be passed." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:18 msgid "Further keyword arguments that are passed to the constructor of :class:`~.VMobject`." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:25 msgid "The arcs created from the input parameters::" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:0 msgid "type" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:36 msgid "Two instances of :class:`ArcPolygon` can be transformed properly into one another as well. Be advised that any arc initialized with ``angle=0`` will actually be a straight line, so if a straight section should seamlessly transform into an arced section or vice versa, initialize the straight section with a negligible angle instead (such as ``angle=0.0001``)." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:43 msgid "There is an alternative version (:class:`ArcPolygonFromArcs`) that is instantiated with pre-defined arcs." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:49 msgid "Examples" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygon:68 msgid "For further examples see :class:`ArcPolygonFromArcs`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygon.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygon.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygon.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygon.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygon.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygon.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.arc.ArcPolygonFromArcs.pot000066400000000000000000000125431515024150700344700ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygonFromArcs.rst:2 msgid "ArcPolygonFromArcs" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygonFromArcs.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.ArcPolygonFromArcs``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:1 msgid "A generalized polygon allowing for points to be connected with arcs." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:3 msgid "This version takes in pre-defined arcs to generate the arcpolygon and introduces little new syntax. However unlike :class:`Polygon` it can't be created with points directly." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:7 msgid "For proper appearance the passed arcs should connect seamlessly: ``[a,b][b,c][c,a]``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:10 msgid "If there are any gaps between the arcs, those will be filled in with straight lines, which can be used deliberately for any straight sections. Arcs can also be passed as straight lines such as an arc initialized with ``angle=0``." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:15 msgid "These are the arcs from which the arcpolygon is assembled." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:16 msgid "Keyword arguments that are passed to the constructor of :class:`~.VMobject`. Affects how the ArcPolygon itself is drawn, but doesn't affect passed arcs." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:24 msgid "The arcs used to initialize the ArcPolygonFromArcs::" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:33 msgid "Two instances of :class:`ArcPolygon` can be transformed properly into one another as well. Be advised that any arc initialized with ``angle=0`` will actually be a straight line, so if a straight section should seamlessly transform into an arced section or vice versa, initialize the straight section with a negligible angle instead (such as ``angle=0.0001``)." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:40 msgid "There is an alternative version (:class:`ArcPolygon`) that can be instantiated with points." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:47 msgid "Examples" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:48 msgid "One example of an arcpolygon is the Reuleaux triangle. Instead of 3 straight lines connecting the outer points, a Reuleaux triangle has 3 arcs connecting those points, making a shape with constant width." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:53 msgid "Passed arcs are stored as submobjects in the arcpolygon. This means that the arcs are changed along with the arcpolygon, for example when it's shifted, and these arcs can be manipulated after the arcpolygon has been initialized." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:58 msgid "Also both the arcs contained in an :class:`~.ArcPolygonFromArcs`, as well as the arcpolygon itself are drawn, which affects draw time in :class:`~.Create` for example. In most cases the arcs themselves don't need to be drawn, in which case they can be passed as invisible." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.ArcPolygonFromArcs:80 msgid "The arcpolygon itself can also be hidden so that instead only the contained arcs are drawn. This can be used to easily debug arcs or to highlight them." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygonFromArcs.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygonFromArcs.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygonFromArcs.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygonFromArcs.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygonFromArcs.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.ArcPolygonFromArcs.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.Circle.pot000066400000000000000000000112751515024150700322370ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.Circle.rst:2 msgid "Circle" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Circle.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.Circle``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.Arc`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle:1 msgid "A circle." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle:0 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.from_three_points:0 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.point_at_angle:0 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.surround:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle:3 msgid "The color of the shape." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle:4 msgid "Additional arguments to be passed to :class:`Arc`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle:7 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.point_at_angle:9 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.surround:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Circle.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Circle.rst:22::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.from_three_points:1 msgid "Returns a circle passing through the specified three points." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Circle.rst:22::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.point_at_angle:1 msgid "Returns the position of a point on the circle." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Circle.rst:22::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.surround:1 msgid "Modifies a circle so that it surrounds a given mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Circle.rst:24 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.from_three_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.from_three_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.from_three_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.from_three_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.from_three_points:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.from_three_points:5 msgid "Example" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.point_at_angle:3 msgid "The angle of the point along the circle in radians." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.point_at_angle:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.point_at_angle:5 msgid "The location of the point along the circle's circumference." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.point_at_angle:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.surround:3 msgid "The mobject that the circle will be surrounding." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Circle.surround:5 msgid "Scales the circle with respect to the mobject. A `buffer_factor` < 1 makes the circle smaller than the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.CubicBezier.pot000066400000000000000000000027671515024150700332320ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.CubicBezier.rst:2 msgid "CubicBezier" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CubicBezier.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.CubicBezier``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.CubicBezier:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.CubicBezier:2 msgid "Example" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CubicBezier.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CubicBezier.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CubicBezier.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CubicBezier.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CubicBezier.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CubicBezier.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.CurvedArrow.pot000066400000000000000000000025701515024150700332770ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.CurvedArrow.rst:2 msgid "CurvedArrow" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedArrow.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.CurvedArrow``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.CurvedArrow:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.ArcBetweenPoints`" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedArrow.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedArrow.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedArrow.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedArrow.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedArrow.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedArrow.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.arc.CurvedDoubleArrow.pot000066400000000000000000000026651515024150700343600ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.CurvedDoubleArrow.rst:2 msgid "CurvedDoubleArrow" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedDoubleArrow.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.CurvedDoubleArrow``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.CurvedDoubleArrow:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.CurvedArrow`" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedDoubleArrow.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedDoubleArrow.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedDoubleArrow.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedDoubleArrow.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedDoubleArrow.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.CurvedDoubleArrow.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.Dot.pot000066400000000000000000000047321515024150700315640ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.Dot.rst:2 msgid "Dot" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Dot.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.Dot``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Dot:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.Circle`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Dot:1 msgid "A circle with a very small radius." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Dot:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Dot:3 msgid "The location of the dot." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Dot:4 msgid "The radius of the dot." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Dot:5 msgid "The thickness of the outline of the dot." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Dot:6 msgid "The opacity of the dot's fill_colour" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Dot:7 msgid "The color of the dot." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Dot:8 msgid "Additional arguments to be passed to :class:`Circle`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Dot:11 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Dot.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Dot.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Dot.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Dot.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Dot.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Dot.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.Ellipse.pot000066400000000000000000000042171515024150700324310ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.Ellipse.rst:2 msgid "Ellipse" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Ellipse.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.Ellipse``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Ellipse:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.Circle`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Ellipse:1 msgid "A circular shape; oval, circle." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Ellipse:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Ellipse:3 msgid "The horizontal width of the ellipse." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Ellipse:4 msgid "The vertical height of the ellipse." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Ellipse:5 msgid "Additional arguments to be passed to :class:`Circle`." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Ellipse:8 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Ellipse.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Ellipse.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Ellipse.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Ellipse.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Ellipse.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Ellipse.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.LabeledDot.pot000066400000000000000000000046721515024150700330400ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.LabeledDot.rst:2 msgid "LabeledDot" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.LabeledDot.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.LabeledDot``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.LabeledDot:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.Dot`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.LabeledDot:1 msgid "A :class:`Dot` containing a label in its center." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.LabeledDot:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.LabeledDot:3 msgid "The label of the :class:`Dot`. This is rendered as :class:`~.MathTex` by default (i.e., when passing a :class:`str`), but other classes representing rendered strings like :class:`~.Text` or :class:`~.Tex` can be passed as well." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.LabeledDot:7 msgid "The radius of the :class:`Dot`. If ``None`` (the default), the radius is calculated based on the size of the ``label``." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.LabeledDot:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.LabeledDot:11 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.LabeledDot.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.LabeledDot.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.LabeledDot.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.LabeledDot.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.LabeledDot.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.LabeledDot.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.Sector.pot000066400000000000000000000026651515024150700323000ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.Sector.rst:2 msgid "Sector" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Sector.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.Sector``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Sector:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.AnnularSector`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.Sector:2 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Sector.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Sector.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Sector.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Sector.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Sector.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.Sector.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.arc.TipableVMobject.pot000066400000000000000000000127561515024150700337760ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:2 msgid "TipableVMobject" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:4 msgid "Qualified name: ``manim.mobject.geometry.arc.TipableVMobject``" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:1 msgid "Meant for shared functionality between Arc and Line. Functionality can be classified broadly into these groups:" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:7 msgid "Adding, Creating, Modifying tips" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:5 msgid "add_tip calls create_tip, before pushing the new tip" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:6 msgid "into the TipableVMobject's list of submobjects" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:7 msgid "stylistic and positional configuration" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:11 msgid "Checking for tips" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:11 msgid "Boolean checks for whether the TipableVMobject has a tip" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:11 msgid "and a starting tip" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:15 msgid "Getters" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:15 msgid "Straightforward accessors, returning information pertaining" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject:15 msgid "to the TipableVMobject instance's tip(s), its length etc" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:36::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.add_tip:1 msgid "Adds a tip to the TipableVMobject instance, recognising that the endpoints might need to be switched if it's a 'starting tip' or not." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:36::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.create_tip:1 msgid "Stylises the tip, positions it spatially, and returns the newly instantiated tip to the caller." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:36::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.get_end:1 msgid "Returns the point, where the stroke that surrounds the :class:`~.Mobject` ends." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:36::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.get_start:1 msgid "Returns the point, where the stroke that surrounds the :class:`~.Mobject` starts." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:36::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.get_tip:1 msgid "Returns the TipableVMobject instance's (first) tip, otherwise throws an exception." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:36::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.get_tips:1 msgid "Returns a VGroup (collection of VMobjects) containing the TipableVMObject instance's tips." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:36::1 #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.get_unpositioned_tip:1 msgid "Returns a tip that has been stylistically configured, but has not yet been given a position in space." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.TipableVMobject.rst:38 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.add_tip:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.add_tip:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.add_tip:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc.TipableVMobject.add_tip:1::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.arc.pot000066400000000000000000000044431515024150700310360ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.arc.rst:2 msgid "arc" msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc:1 msgid "Mobjects that are curved." msgstr "" #: ../../../manim/mobject/geometry/arc.py:docstring of manim.mobject.geometry.arc:4 #: ../../source/reference/manim.mobject.geometry.arc.rst:50::0 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 msgid "A dot with bigger radius and bold stroke to annotate scenes." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::0 msgid "param inner_radius" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 msgid "The inside radius of the Annular Sector." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 msgid "Region between two concentric :class:`Circles <.Circle>`." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 msgid "A circular arc." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 msgid "Inherits from Arc and additionally takes 2 points between which the arc is spanned." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 msgid "A generalized polygon allowing for points to be connected with arcs." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 msgid "A circle." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::0 msgid "Example" msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 msgid "A circle with a very small radius." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 msgid "A circular shape; oval, circle." msgstr "" #: ../../source/reference/manim.mobject.geometry.arc.rst:50::1 msgid "A :class:`Dot` containing a label in its center." msgstr "" manim.mobject.geometry.boolean_ops.Difference.pot000066400000000000000000000045421515024150700345430ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Difference.rst:2 msgid "Difference" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Difference.rst:4 msgid "Qualified name: ``manim.mobject.geometry.boolean\\_ops.Difference``" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Difference:1 msgid "Bases: :py:class:`manim.mobject.geometry.boolean_ops._BooleanOps`" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Difference:1 msgid "Subtracts one :class:`~.VMobject` from another one." msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Difference:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Difference:3 msgid "The 1st :class:`~.VMobject`." msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Difference:4 msgid "The 2nd :class:`~.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Difference:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Difference:7 msgid "Example" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Difference.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Difference.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Difference.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Difference.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Difference.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Difference.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.boolean_ops.Exclusion.pot000066400000000000000000000046531515024150700344650ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Exclusion.rst:2 msgid "Exclusion" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Exclusion.rst:4 msgid "Qualified name: ``manim.mobject.geometry.boolean\\_ops.Exclusion``" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Exclusion:1 msgid "Bases: :py:class:`manim.mobject.geometry.boolean_ops._BooleanOps`" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Exclusion:1 msgid "Find the XOR between two :class:`~.VMobject`. This creates a new :class:`~.VMobject` consisting of the region covered by exactly one of them." msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Exclusion:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Exclusion:5 msgid "The 1st :class:`~.VMobject`." msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Exclusion:6 msgid "The 2nd :class:`~.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Exclusion:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Exclusion:9 msgid "Example" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Exclusion.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Exclusion.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Exclusion.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Exclusion.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Exclusion.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Exclusion.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.boolean_ops.Intersection.pot000066400000000000000000000051621515024150700351560ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Intersection.rst:2 msgid "Intersection" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Intersection.rst:4 msgid "Qualified name: ``manim.mobject.geometry.boolean\\_ops.Intersection``" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Intersection:1 msgid "Bases: :py:class:`manim.mobject.geometry.boolean_ops._BooleanOps`" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Intersection:1 msgid "Find the intersection of two :class:`~.VMobject` s. This keeps the parts covered by both :class:`~.VMobject` s." msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Intersection:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Intersection:4 msgid "The :class:`~.VMobject` to find the intersection." msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Intersection:0 msgid "Raises" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Intersection:6 msgid "If less the 2 :class:`~.VMobject` are passed." msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Intersection:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Intersection:9 msgid "Example" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Intersection.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Intersection.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Intersection.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Intersection.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Intersection.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Intersection.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.boolean_ops.Union.pot000066400000000000000000000047551515024150700336070ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Union.rst:2 msgid "Union" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Union.rst:4 msgid "Qualified name: ``manim.mobject.geometry.boolean\\_ops.Union``" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Union:1 msgid "Bases: :py:class:`manim.mobject.geometry.boolean_ops._BooleanOps`" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Union:1 msgid "Union of two or more :class:`~.VMobject` s. This returns the common region of the :class:`~VMobject` s." msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Union:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Union:4 msgid "The :class:`~.VMobject` s to find the union of." msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Union:0 msgid "Raises" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Union:6 msgid "If less than 2 :class:`~.VMobject` s are passed." msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Union:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops.Union:9 msgid "Example" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Union.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Union.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Union.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Union.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Union.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.Union.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.boolean_ops.pot000066400000000000000000000017211515024150700325650ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.boolean_ops.rst:2 msgid "boolean\\_ops" msgstr "" #: ../../../manim/mobject/geometry/boolean_ops.py:docstring of manim.mobject.geometry.boolean_ops:1 msgid "Boolean operations for two-dimensional mobjects." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.rst:26::1 msgid "Subtracts one :class:`~.VMobject` from another one." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.rst:26::1 msgid "Find the XOR between two :class:`~.VMobject`." msgstr "" #: ../../source/reference/manim.mobject.geometry.boolean_ops.rst:26::1 msgid "Find the intersection of two :class:`~.VMobject` s." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.line.Angle.pot000066400000000000000000000206341515024150700322450ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.line.Angle.rst:2 msgid "Angle" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Angle.rst:4 msgid "Qualified name: ``manim.mobject.geometry.line.Angle``" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:1 msgid "A circular arc or elbow-type mobject representing an angle of two lines." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:0 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:0 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_value:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:3 msgid "The first line." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:4 msgid "The second line." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:5 msgid "The radius of the :class:`Arc`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:6 msgid "A sequence of two :class:`int` numbers determining which of the 4 quadrants should be used. The first value indicates whether to anchor the arc on the first line closer to the end point (1) or start point (-1), and the second value functions similarly for the end (1) or start (-1) of the second line. Possibilities: (1,1), (-1,1), (1,-1), (-1,-1)." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:12 msgid "Toggles between the two possible angles defined by two points and an arc center. If set to False (default), the arc will always go counterclockwise from the point on line1 until the point on line2 is reached. If set to True, the angle will go clockwise from line1 to line2." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:15 msgid "Allows for a :class:`Dot` in the arc. Mainly used as an convention to indicate a right angle. The dot can be customized in the next three parameters." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:18 msgid "The radius of the :class:`Dot`. If not specified otherwise, this radius will be 1/10 of the arc radius." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:20 msgid "Relative distance from the center to the arc: 0 puts the dot in the center and 1 on the arc itself." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:22 msgid "The color of the :class:`Dot`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:24 msgid "Produces an elbow-type mobject indicating a right angle, see :class:`RightAngle` for more information and a shorthand." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:27 msgid "Further keyword arguments that are passed to the constructor of :class:`Arc` or :class:`Elbow`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:30 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:15 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_lines:7 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_value:9 msgid "Examples" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle:31 msgid "The first example shows some right angles with a dot in the middle while the second example shows all 8 possible angles defined by two lines." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Angle.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Angle.rst:22::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:1 msgid "The angle between the lines AB and BC." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Angle.rst:22::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_lines:1 msgid "Get the lines forming an angle of the :class:`Angle` class." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Angle.rst:22::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_value:1 msgid "Get the value of an angle of the :class:`Angle` class." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Angle.rst:24 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:3 msgid "This constructs the angle :math:`\\angle ABC`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:5 msgid "The endpoint of the first angle leg" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:6 msgid "The vertex of the angle" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:7 msgid "The endpoint of the second angle leg" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:8 msgid "Further keyword arguments are passed to :class:`.Angle`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:0 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_lines:0 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_value:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:10 msgid "Angle(line1, line2, radius=0.5, quadrant=(-1,1), stroke_width=8), Angle(line1, line2, radius=0.7, quadrant=(-1,-1), color=RED, other_angle=True)," msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.from_three_points:0 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_lines:0 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_value:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_lines:3 msgid "A :class:`~.VGroup` containing the lines that form the angle of the :class:`Angle` class." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_value:3 msgid "A boolean to decide the unit (deg/rad) in which the value of the angle is returned." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Angle.get_value:5 msgid "The value in degrees/radians of an angle of the :class:`Angle` class." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.line.Arrow.pot000066400000000000000000000115401515024150700323050ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.line.Arrow.rst:2 msgid "Arrow" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Arrow.rst:4 msgid "Qualified name: ``manim.mobject.geometry.line.Arrow``" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:1 msgid "Bases: :py:class:`manim.mobject.geometry.line.Line`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:1 msgid "An arrow." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:3 msgid "Arguments to be passed to :class:`Line`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:5 msgid "The thickness of the arrow. Influenced by :attr:`max_stroke_width_to_length_ratio`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:7 msgid "The distance of the arrow from its start and end points." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:9 msgid ":attr:`tip_length` scales with the length of the arrow. Increasing this ratio raises the max value of :attr:`tip_length`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:11 msgid ":attr:`stroke_width` scales with the length of the arrow. Increasing this ratio ratios the max value of :attr:`stroke_width`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:13 msgid "Additional arguments to be passed to :class:`Line`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:17 msgid ":class:`ArrowTip` :class:`CurvedArrow`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow:21 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_default_tip_length:4 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_normal_vector:4 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.scale:8 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Arrow.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Arrow.rst:23::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_default_tip_length:1 msgid "Returns the default tip_length of the arrow." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Arrow.rst:23::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_normal_vector:1 msgid "Returns the normal of a vector." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Arrow.rst:23::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.reset_normal_vector:1 msgid "Resets the normal of a vector" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Arrow.rst:23::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.scale:1 msgid "Scale an arrow, but keep stroke width and arrow tip size fixed." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Arrow.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_default_tip_length:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_default_tip_length:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_default_tip_length:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_default_tip_length:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_default_tip_length:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_default_tip_length:0 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Arrow.get_normal_vector:0 msgid "Return type" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.line.DashedLine.pot000066400000000000000000000101401515024150700332060ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.line.DashedLine.rst:2 msgid "DashedLine" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DashedLine.rst:4 msgid "Qualified name: ``manim.mobject.geometry.line.DashedLine``" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine:1 msgid "Bases: :py:class:`manim.mobject.geometry.line.Line`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine:1 msgid "A dashed :class:`Line`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine:3 msgid "Arguments to be passed to :class:`Line`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine:5 msgid "The length of each individual dash of the line." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine:7 msgid "The ratio of dash space to empty space. Range of 0-1." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine:9 msgid "Additional arguments to be passed to :class:`Line`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine:16 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_end:4 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_first_handle:4 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_last_handle:4 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_start:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DashedLine.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DashedLine.rst:23::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_end:1 msgid "Returns the end point of the line." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DashedLine.rst:23::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_first_handle:1 msgid "Returns the point of the first handle." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DashedLine.rst:23::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_last_handle:1 msgid "Returns the point of the last handle." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DashedLine.rst:23::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_start:1 msgid "Returns the start point of the line." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DashedLine.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_end:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_end:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_end:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_end:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DashedLine.get_end:1::1 msgid "The width of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.line.DoubleArrow.pot000066400000000000000000000043731515024150700334460ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.line.DoubleArrow.rst:2 msgid "DoubleArrow" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DoubleArrow.rst:4 msgid "Qualified name: ``manim.mobject.geometry.line.DoubleArrow``" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DoubleArrow:1 msgid "Bases: :py:class:`manim.mobject.geometry.line.Arrow`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DoubleArrow:1 msgid "An arrow with tips on both ends." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DoubleArrow:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DoubleArrow:3 msgid "Arguments to be passed to :class:`Arrow`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DoubleArrow:5 msgid "Additional arguments to be passed to :class:`Arrow`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DoubleArrow:9 msgid ":class:`.~ArrowTip` :class:`.~CurvedDoubleArrow`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.DoubleArrow:13 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DoubleArrow.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DoubleArrow.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DoubleArrow.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DoubleArrow.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DoubleArrow.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.DoubleArrow.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.line.Elbow.pot000066400000000000000000000042501515024150700322630ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.line.Elbow.rst:2 msgid "Elbow" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Elbow.rst:4 msgid "Qualified name: ``manim.mobject.geometry.line.Elbow``" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Elbow:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Elbow:1 msgid "Two lines that create a right angle about each other: L-shape." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Elbow:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Elbow:3 msgid "The length of the elbow's sides." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Elbow:5 msgid "The rotation of the elbow." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Elbow:7 msgid "Additional arguments to be passed to :class:`~.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Elbow:12 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Elbow.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Elbow.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Elbow.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Elbow.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Elbow.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Elbow.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.line.Line.pot000066400000000000000000000066531515024150700321130ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.line.Line.rst:2 msgid "Line" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Line.rst:4 msgid "Qualified name: ``manim.mobject.geometry.line.Line``" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line:1 msgid "Bases: :py:class:`manim.mobject.geometry.arc.TipableVMobject`" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Line.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Line.rst:31::1 #: ../../source/reference/manim.mobject.geometry.line.Line.rst:31::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.generate_points:1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Line.rst:31::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.get_projection:1 msgid "Returns the projection of a point onto a line." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Line.rst:31::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.put_start_and_end_on:1 msgid "Sets starts and end coordinates of a line." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Line.rst:33 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.generate_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.generate_points:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.generate_points:3 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.generate_points:3 msgid "Gets called upon creation. This is an empty method that can be implemented by subclasses." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.get_projection:0 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.put_start_and_end_on:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.get_projection:3 msgid "The point to which the line is projected." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Line.get_projection:0 msgid "Return type" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.line.RightAngle.pot000066400000000000000000000045731515024150700332470ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.line.RightAngle.rst:2 msgid "RightAngle" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.RightAngle.rst:4 msgid "Qualified name: ``manim.mobject.geometry.line.RightAngle``" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.RightAngle:1 msgid "Bases: :py:class:`manim.mobject.geometry.line.Angle`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.RightAngle:1 msgid "An elbow-type mobject representing a right angle between two lines." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.RightAngle:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.RightAngle:3 msgid "The first line." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.RightAngle:4 msgid "The second line." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.RightAngle:5 msgid "The length of the arms." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.RightAngle:6 msgid "Further keyword arguments that are passed to the constructor of :class:`Angle`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.RightAngle:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.RightAngle.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.RightAngle.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.RightAngle.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.RightAngle.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.RightAngle.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.RightAngle.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.line.TangentLine.pot000066400000000000000000000051261515024150700334260ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.line.TangentLine.rst:2 msgid "TangentLine" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.TangentLine.rst:4 msgid "Qualified name: ``manim.mobject.geometry.line.TangentLine``" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.TangentLine:1 msgid "Bases: :py:class:`manim.mobject.geometry.line.Line`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.TangentLine:1 msgid "Constructs a line tangent to a :class:`~.VMobject` at a specific point." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.TangentLine:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.TangentLine:3 msgid "The VMobject on which the tangent line is drawn." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.TangentLine:5 msgid "How far along the shape that the line will be constructed. range: 0-1." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.TangentLine:7 msgid "Length of the tangent line." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.TangentLine:9 msgid "The ``dx`` value" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.TangentLine:11 msgid "Additional arguments to be passed to :class:`Line`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.TangentLine:18 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.TangentLine.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.TangentLine.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.TangentLine.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.TangentLine.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.TangentLine.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.TangentLine.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.line.Vector.pot000066400000000000000000000100711515024150700324530ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.line.Vector.rst:2 msgid "Vector" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Vector.rst:4 msgid "Qualified name: ``manim.mobject.geometry.line.Vector``" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector:1 msgid "Bases: :py:class:`manim.mobject.geometry.line.Arrow`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector:1 msgid "A vector specialized for use in graphs." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector:0 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector:3 msgid "The direction of the arrow." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector:5 msgid "The distance of the vector from its endpoints." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector:7 msgid "Additional arguments to be passed to :class:`Arrow`" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector:11 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:12 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Vector.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Vector.rst:20::1 #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:1 msgid "Creates a label based on the coordinates of the vector." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.Vector.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:3 msgid "Whether or not to round the coordinates to integers." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:4 msgid "The number of dimensions of the vector." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:5 msgid "Sets the color of label, optional." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:6 msgid "Additional arguments to be passed to :class:`~.Matrix`." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:8 msgid "The label." msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line.Vector.coordinate_label:0 msgid "Return type" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.line.pot000066400000000000000000000027261515024150700312220ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.line.rst:2 msgid "line" msgstr "" #: ../../../manim/mobject/geometry/line.py:docstring of manim.mobject.geometry.line:1 msgid "Mobjects that are lines or variations of them." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.geometry.line.rst:36::1 msgid "A circular arc or elbow-type mobject representing an angle of two lines." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.rst:36::1 msgid "An arrow." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.rst:36::1 msgid "A dashed :class:`Line`." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.rst:36::1 msgid "An arrow with tips on both ends." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.rst:36::1 msgid "Two lines that create a right angle about each other: L-shape." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.rst:36::1 msgid "An elbow-type mobject representing a right angle between two lines." msgstr "" #: ../../source/reference/manim.mobject.geometry.line.rst:36::1 msgid "Constructs a line tangent to a :class:`~.VMobject` at a specific point." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.polygram.Cutout.pot000066400000000000000000000052111515024150700333770ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.Cutout.rst:2 msgid "Cutout" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Cutout.rst:4 msgid "Qualified name: ``manim.mobject.geometry.polygram.Cutout``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Cutout:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Cutout:1 msgid "A shape with smaller cutouts." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Cutout:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Cutout:3 msgid "The primary shape from which cutouts are made." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Cutout:5 msgid "The smaller shapes which are to be cut out of the ``main_shape``." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Cutout:7 msgid "Further keyword arguments that are passed to the constructor of :class:`~.VMobject`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Cutout:11 msgid "Technically, this class behaves similar to a symmetric difference: if parts of the ``mobjects`` are not located within the ``main_shape``, these parts will be added to the resulting :class:`~.VMobject`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Cutout:16 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Cutout.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Cutout.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Cutout.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Cutout.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Cutout.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Cutout.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.polygram.Polygon.pot000066400000000000000000000041571515024150700335530ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.Polygon.rst:2 msgid "Polygon" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygon.rst:4 msgid "Qualified name: ``manim.mobject.geometry.polygram.Polygon``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygon:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.Polygram`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygon:1 msgid "A shape consisting of one closed loop of vertices." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygon:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygon:3 msgid "The vertices of the :class:`Polygon`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygon:4 msgid "Forwarded to the parent constructor." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygon:7 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygon.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygon.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygon.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygon.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygon.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygon.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.polygram.Polygram.pot000066400000000000000000000130151515024150700336300ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.Polygram.rst:2 msgid "Polygram" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygram.rst:4 msgid "Qualified name: ``manim.mobject.geometry.polygram.Polygram``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram:1 msgid "A generalized :class:`Polygon`, allowing for disconnected sets of edges." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram:0 #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.round_corners:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram:3 msgid "The groups of vertices making up the :class:`Polygram`. The first vertex in each group is repeated to close the shape. Each point must be 3-dimensional: ``[x,y,z]``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram:3 msgid "The groups of vertices making up the :class:`Polygram`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram:5 msgid "The first vertex in each group is repeated to close the shape. Each point must be 3-dimensional: ``[x,y,z]``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram:7 msgid "The color of the :class:`Polygram`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram:8 msgid "Forwarded to the parent constructor." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram:11 #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertex_groups:7 #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertices:7 #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.round_corners:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygram.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygram.rst:22::1 #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertex_groups:1 msgid "Gets the vertex groups of the :class:`Polygram`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygram.rst:22::1 #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertices:1 msgid "Gets the vertices of the :class:`Polygram`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygram.rst:22::1 #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.round_corners:1 msgid "Rounds off the corners of the :class:`Polygram`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Polygram.rst:24 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertex_groups:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertex_groups:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertex_groups:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertex_groups:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertex_groups:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertex_groups:0 #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertices:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertex_groups:3 msgid "The vertex groups of the :class:`Polygram`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertex_groups:0 #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertices:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.get_vertices:3 msgid "The vertices of the :class:`Polygram`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Polygram.round_corners:3 msgid "The curvature of the corners of the :class:`Polygram`." msgstr "" manim.mobject.geometry.polygram.Rectangle.pot000066400000000000000000000060101515024150700337370ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.Rectangle.rst:2 msgid "Rectangle" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Rectangle.rst:4 msgid "Qualified name: ``manim.mobject.geometry.polygram.Rectangle``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.Polygon`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:1 msgid "A quadrilateral with two sets of parallel sides." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:3 msgid "The color of the rectangle." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:5 msgid "The vertical height of the rectangle." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:7 msgid "The horizontal width of the rectangle." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:9 msgid "Space between vertical grid lines." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:11 msgid "Space between horizontal grid lines." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:13 #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:15 msgid "No purpose." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:17 msgid "Additional arguments to be passed to :class:`Polygon`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Rectangle:21 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Rectangle.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Rectangle.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Rectangle.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Rectangle.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Rectangle.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Rectangle.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.polygram.RegularPolygon.pot000066400000000000000000000043461515024150700350160ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygon.rst:2 msgid "RegularPolygon" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygon.rst:4 msgid "Qualified name: ``manim.mobject.geometry.polygram.RegularPolygon``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygon:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.RegularPolygram`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygon:1 msgid "An n-sided regular :class:`Polygon`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygon:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygon:3 msgid "The number of sides of the :class:`RegularPolygon`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygon:4 msgid "Forwarded to the parent constructor." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygon:7 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygon.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygon.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygon.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygon.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygon.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygon.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.polygram.RegularPolygram.pot000066400000000000000000000064701515024150700351610ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygram.rst:2 msgid "RegularPolygram" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygram.rst:4 msgid "Qualified name: ``manim.mobject.geometry.polygram.RegularPolygram``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.Polygram`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:1 msgid "A :class:`Polygram` with regularly spaced vertices." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:3 msgid "The number of vertices." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:4 msgid "The density of the :class:`RegularPolygram`. Can be thought of as how many vertices to hop to draw a line between them. Every ``density``-th vertex is connected." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:4 msgid "The density of the :class:`RegularPolygram`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:6 msgid "Can be thought of as how many vertices to hop to draw a line between them. Every ``density``-th vertex is connected." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:9 msgid "The radius of the circle that the vertices are placed on." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:10 msgid "The angle the vertices start at; the rotation of the :class:`RegularPolygram`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:12 msgid "Forwarded to the parent constructor." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RegularPolygram:15 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygram.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygram.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygram.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygram.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygram.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RegularPolygram.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.polygram.RoundedRectangle.pot000066400000000000000000000044131515024150700352650ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.RoundedRectangle.rst:2 msgid "RoundedRectangle" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RoundedRectangle.rst:4 msgid "Qualified name: ``manim.mobject.geometry.polygram.RoundedRectangle``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RoundedRectangle:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.Rectangle`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RoundedRectangle:1 msgid "A rectangle with rounded corners." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RoundedRectangle:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RoundedRectangle:3 msgid "The curvature of the corners of the rectangle." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RoundedRectangle:5 msgid "Additional arguments to be passed to :class:`Rectangle`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.RoundedRectangle:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RoundedRectangle.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RoundedRectangle.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RoundedRectangle.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RoundedRectangle.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RoundedRectangle.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.RoundedRectangle.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.polygram.Square.pot000066400000000000000000000041471515024150700333630ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.Square.rst:2 msgid "Square" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Square.rst:4 msgid "Qualified name: ``manim.mobject.geometry.polygram.Square``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Square:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.Rectangle`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Square:1 msgid "A rectangle with equal side lengths." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Square:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Square:3 msgid "The length of the sides of the square." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Square:5 msgid "Additional arguments to be passed to :class:`Rectangle`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Square:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Square.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Square.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Square.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Square.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Square.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Square.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.polygram.Star.pot000066400000000000000000000102301515024150700330220ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.Star.rst:2 msgid "Star" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Star.rst:4 msgid "Qualified name: ``manim.mobject.geometry.polygram.Star``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.Polygon`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:1 msgid "A regular polygram without the intersecting lines." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:3 msgid "How many points on the :class:`Star`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:4 msgid "The radius of the circle that the outer vertices are placed on." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:5 msgid "The radius of the circle that the inner vertices are placed on. If unspecified, the inner radius will be calculated such that the edges of the :class:`Star` perfectly follow the edges of its :class:`RegularPolygram` counterpart." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:5 msgid "The radius of the circle that the inner vertices are placed on." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:7 msgid "If unspecified, the inner radius will be calculated such that the edges of the :class:`Star` perfectly follow the edges of its :class:`RegularPolygram` counterpart." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:11 msgid "The density of the :class:`Star`. Only used if ``inner_radius`` is unspecified. See :class:`RegularPolygram` for more information." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:11 msgid "The density of the :class:`Star`. Only used if ``inner_radius`` is unspecified." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:14 msgid "See :class:`RegularPolygram` for more information." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:15 msgid "The angle the vertices start at; the rotation of the :class:`Star`." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:17 msgid "Forwardeds to the parent constructor." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:0 msgid "Raises" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:19 msgid "If ``inner_radius`` is unspecified and ``density`` is not in the range ``[1, n/2)``." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Star:22 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Star.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Star.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Star.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Star.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Star.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Star.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.polygram.Triangle.pot000066400000000000000000000037431515024150700336120ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.Triangle.rst:2 msgid "Triangle" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Triangle.rst:4 msgid "Qualified name: ``manim.mobject.geometry.polygram.Triangle``" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Triangle:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.RegularPolygon`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Triangle:1 msgid "An equilateral triangle." msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Triangle:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Triangle:3 msgid "Additional arguments to be passed to :class:`RegularPolygon`" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram.Triangle:7 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Triangle.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Triangle.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Triangle.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Triangle.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Triangle.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.Triangle.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.polygram.pot000066400000000000000000000034211515024150700321160ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.polygram.rst:2 msgid "polygram" msgstr "" #: ../../../manim/mobject/geometry/polygram.py:docstring of manim.mobject.geometry.polygram:1 msgid "Mobjects that are simple geometric shapes." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.rst:38::1 msgid "A shape with smaller cutouts." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.rst:38::1 msgid "A shape consisting of one closed loop of vertices." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.rst:38::1 msgid "A generalized :class:`Polygon`, allowing for disconnected sets of edges." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.rst:38::1 msgid "A quadrilateral with two sets of parallel sides." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.rst:38::1 msgid "An n-sided regular :class:`Polygon`." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.rst:38::1 msgid "A :class:`Polygram` with regularly spaced vertices." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.rst:38::1 msgid "A rectangle with rounded corners." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.rst:38::1 msgid "A rectangle with equal side lengths." msgstr "" #: ../../source/reference/manim.mobject.geometry.polygram.rst:38::1 msgid "A regular polygram without the intersecting lines." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.pot000066400000000000000000000024271515024150700302720ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.rst:2 msgid "geometry" msgstr "" #: ../../../manim/mobject/geometry/__init__.py:docstring of manim.mobject.geometry:1 msgid "Various geometric Mobjects." msgstr "" #: ../../../manim/mobject/geometry/__init__.py:docstring of manim.mobject.geometry:4 msgid "Modules" msgstr "" #: ../../../manim/mobject/geometry/__init__.py:docstring of manim.mobject.geometry:15::1 msgid "Mobjects that are curved." msgstr "" #: ../../../manim/mobject/geometry/__init__.py:docstring of manim.mobject.geometry:15::1 msgid "Boolean operations for two-dimensional mobjects." msgstr "" #: ../../../manim/mobject/geometry/__init__.py:docstring of manim.mobject.geometry:15::1 msgid "Mobjects that are lines or variations of them." msgstr "" #: ../../../manim/mobject/geometry/__init__.py:docstring of manim.mobject.geometry:15::1 msgid "Mobjects that are simple geometric shapes." msgstr "" #: ../../../manim/mobject/geometry/__init__.py:docstring of manim.mobject.geometry:15::1 msgid "Mobjects used to mark and annotate other mobjects." msgstr "" manim.mobject.geometry.shape_matchers.BackgroundRectangle.pot000066400000000000000000000112201515024150700370720ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.shape_matchers.BackgroundRectangle.rst:2 msgid "BackgroundRectangle" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.BackgroundRectangle.rst:4 msgid "Qualified name: ``manim.mobject.geometry.shape\\_matchers.BackgroundRectangle``" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle:1 msgid "Bases: :py:class:`manim.mobject.geometry.shape_matchers.SurroundingRectangle`" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle:1 msgid "A background rectangle. Its default color is the background color of the scene." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle:5 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.BackgroundRectangle.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.BackgroundRectangle.rst:22::1 #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.get_fill_color:1::1 #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.get_fill_color:1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.BackgroundRectangle.rst:22::1 msgid "Given two bounds a and b, transforms the points of the self vmobject into the points of the vmobject passed as parameter with respect to the bounds." msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.BackgroundRectangle.rst:24 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.get_fill_color:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.get_fill_color:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.get_fill_color:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.get_fill_color:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle:0 #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.pointwise_become_partial:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.pointwise_become_partial:1 msgid "Given two bounds a and b, transforms the points of the self vmobject into the points of the vmobject passed as parameter with respect to the bounds. Points here stand for control points of the bezier curves (anchors and handles)" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.pointwise_become_partial:4 msgid "The vmobject that will serve as a model." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.pointwise_become_partial:6 msgid "upper-bound." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.pointwise_become_partial:8 msgid "lower-bound" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.pointwise_become_partial:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.pointwise_become_partial:11 msgid "``self``" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.BackgroundRectangle.pointwise_become_partial:0 msgid "Return type" msgstr "" manim.mobject.geometry.shape_matchers.Cross.pot000066400000000000000000000051571515024150700342730ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Cross.rst:2 msgid "Cross" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Cross.rst:4 msgid "Qualified name: ``manim.mobject.geometry.shape\\_matchers.Cross``" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Cross:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Cross:1 msgid "Creates a cross." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Cross:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Cross:3 msgid "The mobject linked to this instance. It fits the mobject when specified. Defaults to None." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Cross:4 msgid "Specifies the color of the cross lines. Defaults to RED." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Cross:5 msgid "Specifies the width of the cross lines. Defaults to 6." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Cross:6 msgid "Scales the cross to the provided units. Defaults to 1." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Cross:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Cross.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Cross.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Cross.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Cross.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Cross.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Cross.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.shape_matchers.SurroundingRectangle.pot000066400000000000000000000036651515024150700373500ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.shape_matchers.SurroundingRectangle.rst:2 msgid "SurroundingRectangle" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.SurroundingRectangle.rst:4 msgid "Qualified name: ``manim.mobject.geometry.shape\\_matchers.SurroundingRectangle``" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.SurroundingRectangle:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.RoundedRectangle`" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.SurroundingRectangle:1 msgid "A rectangle surrounding a :class:`~.Mobject`" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.SurroundingRectangle:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.SurroundingRectangle.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.SurroundingRectangle.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.SurroundingRectangle.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.SurroundingRectangle.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.SurroundingRectangle.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.SurroundingRectangle.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.geometry.shape_matchers.Underline.pot000066400000000000000000000040471515024150700351240ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Underline.rst:2 msgid "Underline" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Underline.rst:4 msgid "Qualified name: ``manim.mobject.geometry.shape\\_matchers.Underline``" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Underline:1 msgid "Bases: :py:class:`manim.mobject.geometry.line.Line`" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Underline:1 msgid "Creates an underline." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Underline:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Underline:3 msgid "The underline." msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers.Underline:6 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Underline.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Underline.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Underline.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Underline.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Underline.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.Underline.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.shape_matchers.pot000066400000000000000000000016531515024150700332570ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.shape_matchers.rst:2 msgid "shape\\_matchers" msgstr "" #: ../../../manim/mobject/geometry/shape_matchers.py:docstring of manim.mobject.geometry.shape_matchers:1 msgid "Mobjects used to mark and annotate other mobjects." msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.rst:26::1 msgid "A background rectangle." msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.rst:26::1 msgid "Creates a cross." msgstr "" #: ../../source/reference/manim.mobject.geometry.shape_matchers.rst:26::1 msgid "A rectangle surrounding a :class:`~.Mobject`" msgstr "" manim.mobject.geometry.tips.ArrowCircleFilledTip.pot000066400000000000000000000046041515024150700352000ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:2 msgid "ArrowCircleFilledTip" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:4 msgid "Qualified name: ``manim.mobject.geometry.tips.ArrowCircleFilledTip``" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowCircleFilledTip:1 msgid "Bases: :py:class:`manim.mobject.geometry.tips.ArrowCircleTip`" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowCircleFilledTip:1 msgid "Circular arrow tip with filled tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:37::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:37::1 msgid "The base point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:37::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:37::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:37::1 msgid "The height of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:37::1 msgid "The length of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:37::1 msgid "The angle of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:37::1 msgid "The tip point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleFilledTip.rst:37::1 msgid "The vector pointing from the base point to the tip point." msgstr "" manim.mobject.geometry.tips.ArrowCircleTip.pot000066400000000000000000000044671515024150700340670ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:2 msgid "ArrowCircleTip" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:4 msgid "Qualified name: ``manim.mobject.geometry.tips.ArrowCircleTip``" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowCircleTip:1 msgid "Bases: :py:class:`manim.mobject.geometry.tips.ArrowTip`, :py:class:`manim.mobject.geometry.arc.Circle`" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowCircleTip:1 msgid "Circular arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:37::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:37::1 msgid "The base point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:37::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:37::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:37::1 msgid "The height of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:37::1 msgid "The length of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:37::1 msgid "The angle of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:37::1 msgid "The tip point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowCircleTip.rst:37::1 msgid "The vector pointing from the base point to the tip point." msgstr "" manim.mobject.geometry.tips.ArrowSquareFilledTip.pot000066400000000000000000000046021515024150700352350ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:2 msgid "ArrowSquareFilledTip" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:4 msgid "Qualified name: ``manim.mobject.geometry.tips.ArrowSquareFilledTip``" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowSquareFilledTip:1 msgid "Bases: :py:class:`manim.mobject.geometry.tips.ArrowSquareTip`" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowSquareFilledTip:1 msgid "Square arrow tip with filled tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:37::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:37::1 msgid "The base point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:37::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:37::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:37::1 msgid "The height of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:37::1 msgid "The length of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:37::1 msgid "The angle of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:37::1 msgid "The tip point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareFilledTip.rst:37::1 msgid "The vector pointing from the base point to the tip point." msgstr "" manim.mobject.geometry.tips.ArrowSquareTip.pot000066400000000000000000000044721515024150700341220ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:2 msgid "ArrowSquareTip" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:4 msgid "Qualified name: ``manim.mobject.geometry.tips.ArrowSquareTip``" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowSquareTip:1 msgid "Bases: :py:class:`manim.mobject.geometry.tips.ArrowTip`, :py:class:`manim.mobject.geometry.polygram.Square`" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowSquareTip:1 msgid "Square arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:37::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:37::1 msgid "The base point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:37::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:37::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:37::1 msgid "The height of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:37::1 msgid "The length of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:37::1 msgid "The angle of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:37::1 msgid "The tip point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowSquareTip.rst:37::1 msgid "The vector pointing from the base point to the tip point." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.tips.ArrowTip.pot000066400000000000000000000114511515024150700330130ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTip.rst:2 msgid "ArrowTip" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTip.rst:4 msgid "Qualified name: ``manim.mobject.geometry.tips.ArrowTip``" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip:1 msgid "Base class for arrow tips." msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip:4 msgid ":class:`ArrowTriangleTip` :class:`ArrowTriangleFilledTip` :class:`ArrowCircleTip` :class:`ArrowCircleFilledTip` :class:`ArrowSquareTip` :class:`ArrowSquareFilledTip`" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip:12 #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:6 #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.length:4 #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.tip_angle:4 #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.tip_point:4 #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.vector:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip:13 msgid "Cannot be used directly, only intended for inheritance::" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip:20 msgid "Instead, use one of the pre-defined ones, or make a custom one like this:" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip:40 msgid "Using a class inherited from :class:`ArrowTip` to get a non-filled tip is a shorthand to manually specifying the arrow tip style as follows::" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip:46 msgid "The following example illustrates the usage of all of the predefined arrow tips." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTip.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTip.rst:21 msgid "Attributes" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1::1 #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1 msgid "The base point of the arrow tip." msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1::1 #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.length:1 msgid "The length of the arrow tip." msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1::1 #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.tip_angle:1 msgid "The angle of the arrow tip." msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1::1 #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.tip_point:1 msgid "The tip point of the arrow tip." msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1::1 #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.vector:1 msgid "The vector pointing from the base point to the tip point." msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTip.base:1::1 msgid "The width of the mobject." msgstr "" manim.mobject.geometry.tips.ArrowTriangleFilledTip.pot000066400000000000000000000051171515024150700355440ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:2 msgid "ArrowTriangleFilledTip" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:4 msgid "Qualified name: ``manim.mobject.geometry.tips.ArrowTriangleFilledTip``" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTriangleFilledTip:1 msgid "Bases: :py:class:`manim.mobject.geometry.tips.ArrowTriangleTip`" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTriangleFilledTip:1 msgid "Triangular arrow tip with filled tip." msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTriangleFilledTip:3 msgid "This is the default arrow tip shape." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:37::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:37::1 msgid "The base point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:37::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:37::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:37::1 msgid "The height of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:37::1 msgid "The length of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:37::1 msgid "The angle of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:37::1 msgid "The tip point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleFilledTip.rst:37::1 msgid "The vector pointing from the base point to the tip point." msgstr "" manim.mobject.geometry.tips.ArrowTriangleTip.pot000066400000000000000000000045421515024150700344250ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:2 msgid "ArrowTriangleTip" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:4 msgid "Qualified name: ``manim.mobject.geometry.tips.ArrowTriangleTip``" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTriangleTip:1 msgid "Bases: :py:class:`manim.mobject.geometry.tips.ArrowTip`, :py:class:`manim.mobject.geometry.polygram.Triangle`" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips.ArrowTriangleTip:1 msgid "Triangular arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:37::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:37::1 msgid "The base point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:37::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:37::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:37::1 msgid "The height of the mobject." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:37::1 msgid "The length of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:37::1 msgid "The angle of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:37::1 msgid "The tip point of the arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.ArrowTriangleTip.rst:37::1 msgid "The vector pointing from the base point to the tip point." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.geometry.tips.pot000066400000000000000000000023431515024150700312450ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.geometry.tips.rst:2 msgid "tips" msgstr "" #: ../../../manim/mobject/geometry/tips.py:docstring of manim.mobject.geometry.tips:1 msgid "A collection of tip mobjects for use with :class:`~.TipableVMobject`." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.rst:32::1 msgid "Circular arrow tip with filled tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.rst:32::1 msgid "Circular arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.rst:32::1 msgid "Square arrow tip with filled tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.rst:32::1 msgid "Square arrow tip." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.rst:32::1 msgid "Base class for arrow tips." msgstr "" #: ../../source/reference/manim.mobject.geometry.tips.rst:32::1 msgid "Triangular arrow tip with filled tip." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.graph.Graph.pot000066400000000000000000000353501515024150700306010ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graph.Graph.rst:2 msgid "Graph" msgstr "" #: ../../source/reference/manim.mobject.graph.Graph.rst:4 msgid "Qualified name: ``manim.mobject.graph.Graph``" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:1 msgid "An undirected graph (that is, a collection of vertices connected with edges)." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:3 msgid "Graphs can be instantiated by passing both a list of (distinct, hashable) vertex names, together with list of edges (as tuples of vertex names). See the examples below for details." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:9 msgid "This implementation uses updaters to make the edges move with the vertices." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_vertices:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.change_layout:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.from_networkx:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.remove_edges:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.remove_vertices:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:12 msgid "A list of vertices. Must be hashable elements." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:13 msgid "A list of edges, specified as tuples ``(u, v)`` where both ``u`` and ``v`` are vertices." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:15 msgid "Controls whether or not vertices are labeled. If ``False`` (the default), the vertices are not labeled; if ``True`` they are labeled using their names (as specified in ``vertices``) via :class:`~.MathTex`. Alternatively, custom labels can be specified by passing a dictionary whose keys are the vertices, and whose values are the corresponding vertex labels (rendered via, e.g., :class:`~.Text` or :class:`~.Tex`)." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:21 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_vertices:10 msgid "Sets the fill color of the default labels generated when ``labels`` is set to ``True``. Has no effect for other values of ``labels``." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:23 msgid "Either one of ``\"spring\"`` (the default), ``\"circular\"``, ``\"kamada_kawai\"``, ``\"planar\"``, ``\"random\"``, ``\"shell\"``, ``\"spectral\"``, ``\"spiral\"``, ``\"tree\"``, and ``\"partite\"`` for automatic vertex positioning using ``networkx`` (see `their documentation `_ for more details), or a dictionary specifying a coordinate (value) for each vertex (key) for manual positioning." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:29 msgid "Only for automatically generated layouts. A dictionary whose entries are passed as keyword arguments to the automatic layout algorithm specified via ``layout`` of``networkx``. The ``tree`` layout also accepts a special parameter ``vertex_spacing`` passed as a keyword argument inside the ``layout_config`` dictionary. Passing a tuple ``(space_x, space_y)`` as this argument overrides the value of ``layout_scale`` and ensures that vertices are arranged in a way such that the centers of siblings in the same layer are at least ``space_x`` units apart horizontally, and neighboring layers are spaced ``space_y`` units vertically." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:39 msgid "The scale of automatically generated layouts: the vertices will be arranged such that the coordinates are located within the interval ``[-scale, scale]``. Some layouts accept a tuple ``(scale_x, scale_y)`` causing the first coordinate to be in the interval ``[-scale_x, scale_x]``, and the second in ``[-scale_y, scale_y]``. Default: 2." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:44 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_vertices:12 msgid "The mobject class used for displaying vertices in the scene." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:45 msgid "Either a dictionary containing keyword arguments to be passed to the class specified via ``vertex_type``, or a dictionary whose keys are the vertices, and whose values are dictionaries containing keyword arguments for the mobject related to the corresponding vertex." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:49 msgid "A dictionary whose keys are the vertices, and whose values are mobjects to be used as vertices. Passing vertices here overrides all other configuration options for a vertex." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:52 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:6 msgid "The mobject class used for displaying edges in the scene." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:53 msgid "Either a dictionary containing keyword arguments to be passed to the class specified via ``edge_type``, or a dictionary whose keys are the edges, and whose values are dictionaries containing keyword arguments for the mobject related to the corresponding edge." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.change_layout:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.from_networkx:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.remove_edges:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:59 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.change_layout:7 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.from_networkx:7 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.remove_vertices:6 msgid "Examples" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:60 msgid "First, we create a small graph and demonstrate that the edges move together with the vertices." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:78 msgid "There are several automatic positioning algorithms to choose from:" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:99 msgid "Vertices can also be positioned manually:" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:112 msgid "The vertices in graphs can be labeled, and configurations for vertices and edges can be modified both by default and for specific vertices and edges." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:118 msgid "In ``edge_config``, edges can be passed in both directions: if ``(u, v)`` is an edge in the graph, both ``(u, v)`` as well as ``(v, u)`` can be used as keys in the dictionary." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:138 msgid "You can also lay out a partite graph on columns by specifying a list of the vertices on each side and choosing the partite layout." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:143 msgid "All vertices in your graph which are not listed in any of the partitions are collected in their own partition and rendered in the rightmost column." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:159 msgid "The representation of a linear artificial neural network is facilitated by the use of the partite layout and defining partitions for each layer." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:193 msgid "The custom tree layout can be used to show the graph by distance from the root vertex. You must pass the root vertex of the tree." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph:219 msgid "The following code sample illustrates the use of the ``vertex_spacing`` layout parameter specific to the ``\"tree\"`` layout. As mentioned above, setting ``vertex_spacing`` overrides the specified value for ``layout_scale``, and as such it is harder to control the size of the mobject. However, we can adjust the captured frame and zoom out by using a :class:`.MovingCameraScene`::" msgstr "" #: ../../source/reference/manim.mobject.graph.Graph.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graph.Graph.rst:25::1 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:1 msgid "Add new edges to the graph." msgstr "" #: ../../source/reference/manim.mobject.graph.Graph.rst:25::1 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_vertices:1 msgid "Add a list of vertices to the graph." msgstr "" #: ../../source/reference/manim.mobject.graph.Graph.rst:25::1 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.change_layout:1 msgid "Change the layout of this graph." msgstr "" #: ../../source/reference/manim.mobject.graph.Graph.rst:25::1 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.from_networkx:1 msgid "Build a :class:`~.Graph` from a given ``networkx`` graph." msgstr "" #: ../../source/reference/manim.mobject.graph.Graph.rst:25::1 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.remove_edges:1 msgid "Remove several edges from the graph." msgstr "" #: ../../source/reference/manim.mobject.graph.Graph.rst:25::1 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.remove_vertices:1 msgid "Remove several vertices from the graph." msgstr "" #: ../../source/reference/manim.mobject.graph.Graph.rst:27 msgid "Attributes" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:3 msgid "Edges (as tuples of vertex identifiers) to be added. If a non-existing vertex is passed, a new vertex with default settings will be created. Create new vertices yourself beforehand to customize them." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:7 msgid "A dictionary either containing keyword arguments to be passed to the class specified via ``edge_type``, or a dictionary whose keys are the edge tuples, and whose values are dictionaries containing keyword arguments to be passed for the construction of the corresponding edge." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:12 msgid "Any further keyword arguments are passed to :meth:`.add_vertices` which is used to create new vertices in the passed edges." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:0 #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.remove_edges:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_edges:15 msgid "A group containing all newly added vertices and edges." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_vertices:3 msgid "Hashable vertex identifiers." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_vertices:4 msgid "A dictionary specifying the coordinates where the new vertices should be added. If ``None``, all vertices are created at the center of the graph." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_vertices:6 msgid "Controls whether or not the vertex is labeled. If ``False`` (the default), the vertex is not labeled; if ``True`` it is labeled using its names (as specified in ``vertex``) via :class:`~.MathTex`. Alternatively, any :class:`~.Mobject` can be passed to be used as the label." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_vertices:13 msgid "A dictionary containing keyword arguments to be passed to the class specified via ``vertex_type``." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.add_vertices:15 msgid "A dictionary whose keys are the vertex identifiers, and whose values are mobjects that should be used as vertices. Overrides all other vertex customization options." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.change_layout:3 msgid "See the documentation of :class:`~.Graph` for details about the keyword arguments." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.from_networkx:3 msgid "A ``networkx`` graph." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.from_networkx:4 msgid "Keywords to be passed to the constructor of :class:`~.Graph`." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.remove_edges:3 msgid "Edges to be removed from the graph." msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph.Graph.remove_edges:5 msgid "A group containing all removed edges." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.graph.pot000066400000000000000000000007441515024150700275400ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graph.rst:2 msgid "graph" msgstr "" #: ../../../manim/mobject/graph.py:docstring of manim.mobject.graph:1 msgid "Mobjects used to represent mathematical graphs (think graph theory, not plotting)." msgstr "" #: ../../source/reference/manim.mobject.graph.rst:15 msgid "Classes" msgstr "" manim.mobject.graphing.coordinate_systems.Axes.pot000066400000000000000000000265371515024150700350030ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.Axes.rst:2 msgid "Axes" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.Axes.rst:4 msgid "Qualified name: ``manim.mobject.graphing.coordinate\\_systems.Axes``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`, :py:class:`manim.mobject.graphing.coordinate_systems.CoordinateSystem`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:1 msgid "Creates a set of axes." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.point_to_coords:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:3 msgid "The ``(x_min, x_max, x_step)`` values of the x-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:4 msgid "The ``(y_min, y_max, y_step)`` values of the y-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:5 msgid "The length of the x-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:6 msgid "The length of the y-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:7 msgid "Arguments to be passed to :class:`~.NumberLine` that influences both axes." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:8 msgid "Arguments to be passed to :class:`~.NumberLine` that influence the x-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:9 msgid "Arguments to be passed to :class:`~.NumberLine` that influence the y-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:10 msgid "Whether or not to include the tips on both axes." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:11 msgid "Additional arguments to be passed to :class:`CoordinateSystem` and :class:`~.VGroup`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes:14 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:16 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:21 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.point_to_coords:11 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.Axes.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.Axes.rst:23::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:1 msgid "Accepts coordinates from the axes and returns a point with respect to the scene." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.Axes.rst:23::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.get_axes:1 msgid "Gets the axes." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.Axes.rst:23::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:1 msgid "Draws a line graph." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.Axes.rst:23::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.point_to_coords:1 msgid "Accepts a point from the scene and returns its coordinates with respect to the axes." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.Axes.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:3 msgid "The coordinates. Each coord is passed as a separate argument: ``ax.coords_to_point(1, 2, 3)``. Also accepts a list of coordinates ``ax.coords_to_point( [x_0, x_1, ...], [y_0, y_1, ...], ... )`` ``ax.coords_to_point( [[x_0, y_0, z_0], [x_1, y_1, z_1]] )``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:3 msgid "The coordinates. Each coord is passed as a separate argument: ``ax.coords_to_point(1, 2, 3)``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:5 msgid "Also accepts a list of coordinates" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:7 msgid "``ax.coords_to_point( [x_0, x_1, ...], [y_0, y_1, ...], ... )``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:9 msgid "``ax.coords_to_point( [[x_0, y_0, z_0], [x_1, y_1, z_1]] )``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.get_axes:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.point_to_coords:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:11 msgid "A point with respect to the scene's coordinate system. The shape of the array will be similar to the shape of the input." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.coords_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.get_axes:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.point_to_coords:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.get_axes:3 msgid "A pair of axes." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:3 msgid "The graph connects the vertices formed from zipping ``x_values``, ``y_values`` and ``z_values``. Also adds :class:`Dots <.Dot>` at the vertices if ``add_vertex_dots`` is set to ``True``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:7 msgid "Iterable of values along the x-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:8 msgid "Iterable of values along the y-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:9 msgid "Iterable of values (zeros if z_values is None) along the z-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:10 msgid "Color for the line graph." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:11 msgid "Whether or not to add :class:`~.Dot` at each vertex." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:12 msgid "Radius for the :class:`~.Dot` at each vertex." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:13 msgid "Style arguments to be passed into :class:`~.Dot` at each vertex." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:14 msgid "Additional arguments to be passed into :class:`~.VMobject`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.plot_line_graph:16 msgid "A VDict containing both the line and dots (if specified). The line can be accessed with: ``line_graph[\"line_graph\"]``. The dots can be accessed with: ``line_graph[\"vertex_dots\"]``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.Axes.point_to_coords:3 msgid "The point, i.e. ``RIGHT`` or ``[0, 1, 0]``. Also accepts a list of points as ``[RIGHT, [0, 1, 0]]``." msgstr "" manim.mobject.graphing.coordinate_systems.ComplexPlane.pot000066400000000000000000000176511515024150700364670ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ComplexPlane.rst:2 msgid "ComplexPlane" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ComplexPlane.rst:4 msgid "Qualified name: ``manim.mobject.graphing.coordinate\\_systems.ComplexPlane``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane:1 msgid "Bases: :py:class:`manim.mobject.graphing.coordinate_systems.NumberPlane`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane:1 msgid "A :class:`~.NumberPlane` specialized for use with complex numbers." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ComplexPlane.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ComplexPlane.rst:25::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.add_coordinates:1 msgid "Adds the labels produced from :meth:`~.NumberPlane.get_coordinate_labels` to the plane." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ComplexPlane.rst:25::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.get_coordinate_labels:1 msgid "Generates the :class:`~.DecimalNumber` mobjects for the coordinates of the plane." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ComplexPlane.rst:25::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.n2p:1 msgid "Abbreviation for :meth:`number_to_point`." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ComplexPlane.rst:25::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.number_to_point:1 msgid "Accepts a float/complex number and returns the equivalent point on the plane." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ComplexPlane.rst:25::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.p2n:1 msgid "Abbreviation for :meth:`point_to_number`." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ComplexPlane.rst:25::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.point_to_number:1 msgid "Accepts a point and returns a complex number equivalent to that point on the plane." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ComplexPlane.rst:27 msgid "Attributes" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.add_coordinates:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.add_coordinates:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.add_coordinates:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.add_coordinates:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.add_coordinates:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.add_coordinates:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.get_coordinate_labels:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.n2p:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.number_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.p2n:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.point_to_number:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.add_coordinates:3 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.get_coordinate_labels:3 msgid "An iterable of floats/complex numbers. Floats are positioned along the x-axis, complex numbers along the y-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.add_coordinates:4 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.get_coordinate_labels:4 msgid "Additional arguments to be passed to :meth:`~.NumberLine.get_number_mobject`, i.e. :class:`~.DecimalNumber`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.get_coordinate_labels:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.number_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.point_to_number:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.get_coordinate_labels:6 msgid "A :class:`~.VGroup` containing the positioned label mobjects." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.get_coordinate_labels:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.n2p:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.number_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.p2n:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.point_to_number:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.number_to_point:3 msgid "The number. Can be a float or a complex number." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.number_to_point:5 msgid "The point on the plane." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ComplexPlane.point_to_number:3 msgid "The point in manim's coordinate-system" msgstr "" manim.mobject.graphing.coordinate_systems.CoordinateSystem.pot000066400000000000000000001736261515024150700374010ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.CoordinateSystem.rst:2 msgid "CoordinateSystem" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.CoordinateSystem.rst:4 msgid "Qualified name: ``manim.mobject.graphing.coordinate\\_systems.CoordinateSystem``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem:1 msgid "Abstract base class for Axes and NumberPlane." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem:4 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:7 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.angle_of_tangent:12 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:17 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:16 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_axis_labels:17 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:16 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_horizontal_line:10 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_lines_to_point:14 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:22 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:21 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_line:10 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_lines_to_graph:12 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_x_axis_label:12 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_y_axis_label:12 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_coords:5 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_point:12 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:18 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:20 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_derivative_graph:11 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_implicit_curve:9 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_polar_graph:8 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:17 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.polar_to_point:10 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.slope_of_tangent:11 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.CoordinateSystem.rst:14 msgid "Methods" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 msgid "Adds labels to the axes." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.angle_of_tangent:1 msgid "Returns the angle to the x-axis of the tangent to the plotted curve at a particular x-value." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.c2p:1 msgid "Abbreviation for :meth:`coords_to_point`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:1 msgid "Creates a labelled triangle marker with a vertical line from the x-axis to a curve at a given x-value." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:1 msgid "Returns a :class:`~.Polygon` representing the area under the graph passed." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_axis_labels:1 msgid "Defines labels for the x_axis and y_axis of the graph." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:1 msgid "Creates a properly positioned label for the passed graph, with an optional dot." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_horizontal_line:1 msgid "A horizontal line from the y-axis to a given point in the scene." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:1 msgid "Returns a straight line from a given axis to a point in the scene." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_lines_to_point:1 msgid "Generate both horizontal and vertical lines from the axis to a point." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_origin:1 msgid "Gets the origin of :class:`~.Axes`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:1 msgid "Generates a :class:`~.VGroup` of the Riemann Rectangles for a given curve." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:2 msgid "Creates two lines representing `dx` and `df`, the labels for `dx` and `df`, and" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_line:1 msgid "A vertical line from the x-axis to a given point in the scene." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_lines_to_graph:1 msgid "Obtains multiple lines from the x-axis to the curve." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_x_axis_label:1 msgid "Generate an x-axis label." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_y_axis_label:1 msgid "Generate a y-axis label." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.i2gc:1 msgid "Alias for :meth:`input_to_graph_coords`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.i2gp:1 msgid "Alias for :meth:`input_to_graph_point`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_coords:1 msgid "Returns a tuple of the axis relative coordinates of the point on the graph based on the x-value given." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_point:1 msgid "Returns the coordinates of the point on a ``graph`` corresponding to an ``x`` value." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.p2c:1 msgid "Abbreviation for :meth:`point_to_coords`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:1 msgid "Generates a curve based on a function." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:1 msgid "Plots an antiderivative graph." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_derivative_graph:1 msgid "Returns the curve of the derivative of the passed graph." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_implicit_curve:1 msgid "Creates the curves of an implicit function." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_parametric_curve:1 msgid "A parametric curve." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_polar_graph:1 msgid "A polar graph." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:1 msgid "Generates a surface based on a function." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.point_to_polar:1 msgid "Gets polar coordinates from a point." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.polar_to_point:1 msgid "Gets a point from polar coordinates." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.pr2pt:1 msgid "Abbreviation for :meth:`polar_to_point`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.pt2pr:1 msgid "Abbreviation for :meth:`point_to_polar`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.slope_of_tangent:1 msgid "Returns the slope of the tangent to the plotted curve at a particular x-value." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:1 msgid "Adds labels to the axes. Use ``Axes.coordinate_labels`` to access the coordinates after creation." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.angle_of_tangent:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_axis_labels:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_horizontal_line:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_lines_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_line:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_lines_to_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_x_axis_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_y_axis_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.i2gc:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.i2gp:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_coords:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_derivative_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_implicit_curve:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_parametric_curve:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_polar_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.point_to_polar:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.polar_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.pr2pt:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.pt2pr:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.slope_of_tangent:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:4 msgid "The numbers to be added to the axes. Use ``None`` to represent an axis with default labels." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.add_coordinates:16 msgid "You can also specifically control the position and value of the labels using a dict." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.angle_of_tangent:4 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.slope_of_tangent:4 msgid "The x-value at which the tangent must touch the curve." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.angle_of_tangent:5 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.slope_of_tangent:5 msgid "The :class:`~.ParametricFunction` for which to calculate the tangent." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.angle_of_tangent:6 msgid "The change in `x` used to determine the angle of the tangent to the curve." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.angle_of_tangent:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_axis_labels:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_horizontal_line:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_lines_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_origin:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_line:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_lines_to_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_x_axis_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_y_axis_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_derivative_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.point_to_polar:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.polar_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.slope_of_tangent:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.angle_of_tangent:8 msgid "The angle of the tangent to the curve." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.angle_of_tangent:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_axis_labels:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_horizontal_line:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_lines_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_origin:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_line:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_lines_to_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_x_axis_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_y_axis_label:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.i2gc:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.i2gp:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_coords:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_derivative_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_implicit_curve:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_parametric_curve:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_polar_graph:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.point_to_polar:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.polar_to_point:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.pr2pt:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.pt2pr:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.slope_of_tangent:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:4 msgid "The position along the curve at which the label, line and triangle will be constructed." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:5 msgid "The :class:`~.ParametricFunction` for which to construct the label." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:6 msgid "The label of the vertical line and triangle." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:7 msgid "The color of the label." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:8 msgid "The size of the triangle." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:9 msgid "The color of the triangle." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:10 msgid "The function used to construct the vertical line." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:11 msgid "The color of the vertical line." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_T_label:13 msgid "A :class:`~.VGroup` of the label, triangle and vertical line mobjects." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:3 msgid "The graph/curve for which the area needs to be gotten." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:4 msgid "The range of the minimum and maximum x-values of the area. ``x_range = [x_min, x_max]``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:5 msgid "The color of the area. Creates a gradient if a list of colors is provided." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:6 msgid "The opacity of the area." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:7 msgid "If a secondary :attr:`graph` is specified, encloses the area between the two curves." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:8 msgid "Additional parameters passed to :class:`~.Polygon`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:10 msgid "The :class:`~.Polygon` representing the area." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_point:0 msgid "Raises" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_area:13 msgid "When x_ranges do not match (either area x_range, graph's x_range or bounded_graph's x_range)." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_axis_labels:3 msgid "For increased control over the position of the labels, use :meth:`get_x_axis_label` and :meth:`get_y_axis_label`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_axis_labels:6 msgid "The label for the x_axis. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_axis_labels:7 msgid "The label for the y_axis. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_axis_labels:9 msgid "A :class:`~.Vgroup` of the labels for the x_axis and y_axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_axis_labels:13 msgid ":class:`get_x_axis_label` :class:`get_y_axis_label`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:3 msgid "The curve." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:4 msgid "The label for the function's curve. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:5 msgid "The x_value along the curve that positions the label." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:6 msgid "The cartesian position, relative to the curve that the label will be at --> ``LEFT``, ``RIGHT``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:7 msgid "The distance between the curve and the label." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:8 msgid "The color of the label. Defaults to the color of the curve." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:9 msgid "Whether to add a dot at the point on the graph." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:10 msgid "Additional parameters to be passed to :class:`~.Dot`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_graph_label:12 msgid "The positioned label and :class:`~.Dot`, if applicable." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_horizontal_line:3 msgid "The point to which the horizontal line will be drawn." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_horizontal_line:4 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_line:4 msgid "Additional parameters to be passed to :class:`get_line_from_axis_to_point`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_horizontal_line:6 msgid "A horizontal line from the y-axis to the point." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:3 msgid "Specifies the axis from which to draw the line. `0 = x_axis`, `1 = y_axis`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:4 msgid "The point to which the line will be drawn." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:5 msgid "The function of the :class:`~.Line` mobject used to construct the line." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:6 msgid "Optional arguments to passed to :attr:`line_func`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:7 msgid "The color of the line." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:8 msgid "The stroke width of the line." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:10 msgid "The line from an axis to a point." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_line_from_axis_to_point:14 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_lines_to_point:10 msgid ":meth:`~.CoordinateSystem.get_vertical_line` :meth:`~.CoordinateSystem.get_horizontal_line`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_lines_to_point:3 msgid "A point on the scene." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_lines_to_point:4 msgid "Additional parameters to be passed to :meth:`get_line_from_axis_to_point`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_lines_to_point:6 msgid "A :class:`~.VGroup` of the horizontal and vertical lines." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_origin:3 msgid "The center point." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:3 msgid "The graph whose area will be approximated by Riemann rectangles." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:4 msgid "The minimum and maximum x-values of the rectangles. ``x_range = [x_min, x_max]``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:5 msgid "The change in x-value that separates each rectangle." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:6 msgid "Can be any of ``\"left\"``, ``\"right\"`` or ``\"center\"``. Refers to where the sample point for the height of each Riemann Rectangle will be inside the segments of the partition." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:9 msgid "The stroke_width of the border of the rectangles." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:10 msgid "The color of the border of the rectangle." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:11 msgid "The opacity of the rectangles." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:12 msgid "The colors of the rectangles. Creates a balanced gradient if multiple colors are passed." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:13 msgid "Indicates negative area when the curve dips below the x-axis by inverting its color." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:14 msgid "Sets the :attr:`stroke_color` to :attr:`fill_color`, blending the rectangles without clear separation." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:15 msgid "If a secondary graph is specified, encloses the area between the two curves." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:16 msgid "The factor by which the width of the rectangles is scaled." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_riemann_rectangles:18 msgid "A :class:`~.VGroup` containing the Riemann Rectangles." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:2 msgid "the secant to the curve at a particular x-value." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:4 msgid "The x-value at which the secant intersects the graph for the first time." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:5 msgid "The curve for which the secant will be found." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:6 msgid "The change in `x` after which the secant exits." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:7 msgid "The color of the line that indicates the change in `x`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:8 msgid "The color of the line that indicates the change in `y`. Defaults to the color of :attr:`graph`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:9 msgid "The label for the `dx` line. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:10 msgid "The label for the `dy` line. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:11 msgid "Whether to include the secant line in the graph, or just the df/dx lines and labels." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:13 msgid "The color of the secant line." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:14 msgid "The length of the secant line." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_secant_slope_group:16 msgid "A group containing the elements: `dx_line`, `df_line`, and if applicable also :attr:`dx_label`, :attr:`df_label`, `secant_line`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_line:3 msgid "The point to which the vertical line will be drawn." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_line:6 msgid "A vertical line from the x-axis to the point." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_lines_to_graph:3 msgid "The graph along which the lines are placed." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_lines_to_graph:4 msgid "A list containing the lower and and upper bounds of the lines: ``x_range = [x_min, x_max]``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_lines_to_graph:5 msgid "The number of evenly spaced lines." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_lines_to_graph:6 msgid "Additional arguments to be passed to :meth:`~.CoordinateSystem.get_vertical_line`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_vertical_lines_to_graph:8 msgid "The :class:`~.VGroup` of the evenly spaced lines." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_x_axis_label:3 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_y_axis_label:3 msgid "The label. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_x_axis_label:4 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_y_axis_label:4 msgid "The edge of the x-axis to which the label will be added, by default ``UR``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_x_axis_label:5 msgid "Allows for further positioning of the label from an edge, by default ``UR``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_x_axis_label:6 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_y_axis_label:6 msgid "The distance of the label from the line." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_x_axis_label:8 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_y_axis_label:8 msgid "The positioned label." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.get_y_axis_label:5 msgid "Allows for further positioning of the label from an edge, by default ``UR``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_point:3 msgid "The x-value of a point on the ``graph``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_point:4 msgid "The :class:`~.ParametricFunction` on which the point lies." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_point:6 msgid "The coordinates of the point on the :attr:`graph` corresponding to the :attr:`x` value." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.input_to_graph_point:9 msgid "When the target x is not in the range of the line graph." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:3 msgid "The function used to construct the :class:`~.ParametricFunction`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:4 msgid "The range of the curve along the axes. ``x_range = [x_min, x_max, x_step]``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:5 msgid "Whether to pass in the generated t value array to the function. Only use this if your function supports it. Output should be a numpy array of shape ``[y_0, y_1, ...]``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:7 msgid "Additional parameters to be passed to :class:`~.ParametricFunction`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:9 msgid "The plotted curve." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot:13 msgid "This method may not produce accurate graphs since Manim currently relies on interpolation between evenly-spaced samples of the curve, instead of intelligent plotting. See the example below for some solutions to this problem." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:3 msgid "The graph for which the antiderivative will be found." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:4 msgid "The y-value at which the graph intercepts the y-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:5 msgid "The number of points to take the area under the graph." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:6 msgid "Whether to use the vectorized version of the antiderivative. This means to pass in the generated t value array to the function. Only use this if your function supports it. Output should be a numpy array of shape ``[y_0, y_1, ...]``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:9 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_derivative_graph:5 msgid "Any valid keyword argument of :class:`~.ParametricFunction`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:11 msgid "The curve of the antiderivative." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_antiderivative_graph:15 msgid "This graph is plotted from the values of area under the reference graph. The result might not be ideal if the reference graph contains uncalculatable areas from x=0." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_derivative_graph:3 msgid "The graph for which the derivative will be found." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_derivative_graph:4 msgid "The color of the derivative curve." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_derivative_graph:7 msgid "The curve of the derivative." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_implicit_curve:3 msgid "The function to graph, in the form of f(x, y) = 0." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_implicit_curve:4 msgid "The minimum depth of the function to calculate." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_implicit_curve:5 msgid "The maximum number of quads to use." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_implicit_curve:6 msgid "Additional parameters to pass into :class:`ImplicitFunction`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_parametric_curve:3 msgid "A parametric function mapping a number to a point in the coordinate system." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_parametric_curve:5 msgid "Whether to pass in the generated t value array to the function. Only use this if your function supports it." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_parametric_curve:6 msgid "Any further keyword arguments are passed to :class:`.ParametricFunction`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_parametric_curve:9 msgid "Example" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_polar_graph:3 msgid "The function r of theta." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_polar_graph:4 msgid "The range of theta as ``theta_range = [theta_min, theta_max, theta_step]``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_polar_graph:5 msgid "Additional parameters passed to :class:`~.ParametricFunction`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:3 msgid "The function used to construct the :class:`~.Surface`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:4 msgid "The range of the ``u`` variable: ``(u_min, u_max)``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:5 msgid "The range of the ``v`` variable: ``(v_min, v_max)``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:6 msgid "Colors of the surface. Passing a list of colors will color the surface by z-value. Passing a list of tuples in the form ``(color, pivot)`` allows user-defined pivots where the color transitions." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:9 msgid "Defines the axis on which the colorscale is applied (0 = x, 1 = y, 2 = z), default is z-axis (2)." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:11 msgid "Additional parameters to be passed to :class:`~.Surface`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.plot_surface:13 msgid "The plotted surface." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.point_to_polar:3 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.polar_to_point:6 msgid "The point." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.point_to_polar:5 msgid "The coordinate radius (:math:`r`) and the coordinate azimuth (:math:`\\theta`)." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.point_to_polar:6 msgid "Tuple[:class:`float`, :class:`float`]" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.polar_to_point:3 msgid "The coordinate radius (:math:`r`)." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.CoordinateSystem.polar_to_point:4 msgid "The coordinate azimuth (:math:`\\theta`)." msgstr "" manim.mobject.graphing.coordinate_systems.NumberPlane.pot000066400000000000000000000102221515024150700362730ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.NumberPlane.rst:2 msgid "NumberPlane" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.NumberPlane.rst:4 msgid "Qualified name: ``manim.mobject.graphing.coordinate\\_systems.NumberPlane``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:1 msgid "Bases: :py:class:`manim.mobject.graphing.coordinate_systems.Axes`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:1 msgid "Creates a cartesian plane with background lines." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:3 msgid "The ``[x_min, x_max, x_step]`` values of the plane in the horizontal direction." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:4 msgid "The ``[y_min, y_max, y_step]`` values of the plane in the vertical direction." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:5 msgid "The width of the plane." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:6 msgid "The height of the plane." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:7 msgid "Arguments that influence the construction of the background lines of the plane." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:8 msgid "Similar to :attr:`background_line_style`, affects the construction of the scene's background lines." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:9 msgid "Determines the number of boxes within the background lines: :code:`2` = 4 boxes, :code:`3` = 9 boxes." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:10 msgid "Currently non-functional." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:11 msgid "Additional arguments to be passed to :class:`Axes`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:14 msgid "If :attr:`x_length` or :attr:`y_length` are not defined, they are automatically calculated such that one unit on each axis is one Manim unit long." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.NumberPlane:18 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.NumberPlane.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.NumberPlane.rst:23 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.NumberPlane.rst:34::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.NumberPlane.rst:34::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.NumberPlane.rst:34::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.NumberPlane.rst:34::1 msgid "The height of the mobject." msgstr "" manim.mobject.graphing.coordinate_systems.PolarPlane.pot000066400000000000000000000264651515024150700361400ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.PolarPlane.rst:2 msgid "PolarPlane" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.PolarPlane.rst:4 msgid "Qualified name: ``manim.mobject.graphing.coordinate\\_systems.PolarPlane``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:1 msgid "Bases: :py:class:`manim.mobject.graphing.coordinate_systems.Axes`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:1 msgid "Creates a polar plane with background lines." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.add_coordinates:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.get_coordinate_labels:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:3 msgid "The number of divisions in the azimuth (also known as the `angular coordinate` or `polar angle`). If ``None`` is specified then it will use the default specified by ``azimuth_units``: - ``\"PI radians\"`` or ``\"TAU radians\"``: 20 - ``\"degrees\"``: 36 - ``\"gradians\"``: 40 - ``None``: 1 A non-integer value will result in a partial division at the end of the circle." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:3 msgid "The number of divisions in the azimuth (also known as the `angular coordinate` or `polar angle`). If ``None`` is specified then it will use the default specified by ``azimuth_units``:" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:6 msgid "``\"PI radians\"`` or ``\"TAU radians\"``: 20" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:7 msgid "``\"degrees\"``: 36" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:8 msgid "``\"gradians\"``: 40" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:9 msgid "``None``: 1" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:11 msgid "A non-integer value will result in a partial division at the end of the circle." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:12 msgid "The diameter of the plane." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:13 msgid "The distance between faded radius lines." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:14 msgid "The maximum value of the radius." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:15 msgid "Specifies a default labelling system for the azimuth. Choices are: - ``\"PI radians\"``: Fractional labels in the interval :math:`\\left[0, 2\\pi\\right]` with :math:`\\pi` as a constant. - ``\"TAU radians\"``: Fractional labels in the interval :math:`\\left[0, \\tau\\right]` (where :math:`\\tau = 2\\pi`) with :math:`\\tau` as a constant. - ``\"degrees\"``: Decimal labels in the interval :math:`\\left[0, 360\\right]` with a degree (:math:`^{\\circ}`) symbol. - ``\"gradians\"``: Decimal labels in the interval :math:`\\left[0, 400\\right]` with a superscript \"g\" (:math:`^{g}`). - ``None``: Decimal labels in the interval :math:`\\left[0, 1\\right]`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:15 msgid "Specifies a default labelling system for the azimuth. Choices are:" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:17 msgid "``\"PI radians\"``: Fractional labels in the interval :math:`\\left[0, 2\\pi\\right]` with :math:`\\pi` as a constant." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:18 msgid "``\"TAU radians\"``: Fractional labels in the interval :math:`\\left[0, \\tau\\right]` (where :math:`\\tau = 2\\pi`) with :math:`\\tau` as a constant." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:19 msgid "``\"degrees\"``: Decimal labels in the interval :math:`\\left[0, 360\\right]` with a degree (:math:`^{\\circ}`) symbol." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:20 msgid "``\"gradians\"``: Decimal labels in the interval :math:`\\left[0, 400\\right]` with a superscript \"g\" (:math:`^{g}`)." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:21 msgid "``None``: Decimal labels in the interval :math:`\\left[0, 1\\right]`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:22 msgid "If the ``azimuth_units`` choice has fractional labels, choose whether to combine the constant in a compact form :math:`\\tfrac{xu}{y}` as opposed to :math:`\\tfrac{x}{y}u`, where :math:`u` is the constant." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:25 msgid "The angle offset of the azimuth, expressed in radians." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:26 msgid "The direction of the azimuth. - ``\"CW\"``: Clockwise. - ``\"CCW\"``: Anti-clockwise." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:26 msgid "The direction of the azimuth." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:28 msgid "``\"CW\"``: Clockwise." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:29 msgid "``\"CCW\"``: Anti-clockwise." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:30 msgid "The buffer for the azimuth labels." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:31 msgid "The font size of the azimuth labels." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:32 msgid "The axis config for the radius." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane:35 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.PolarPlane.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.PolarPlane.rst:25::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.add_coordinates:1 msgid "Adds the coordinates." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.PolarPlane.rst:25::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.get_axes:1 msgid "Gets the axes." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.PolarPlane.rst:25::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.get_coordinate_labels:1 msgid "Gets labels for the coordinates" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.PolarPlane.rst:27 msgid "Attributes" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.add_coordinates:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.add_coordinates:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.add_coordinates:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.add_coordinates:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.add_coordinates:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.add_coordinates:3 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.get_coordinate_labels:3 msgid "Iterable of values along the radius, by default None." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.add_coordinates:4 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.get_coordinate_labels:4 msgid "Iterable of values along the azimuth, by default None." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.get_axes:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.get_coordinate_labels:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.get_axes:3 msgid "A pair of axes." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.get_axes:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.PolarPlane.get_coordinate_labels:0 msgid "Return type" msgstr "" manim.mobject.graphing.coordinate_systems.ThreeDAxes.pot000066400000000000000000000155211515024150700360660ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ThreeDAxes.rst:2 msgid "ThreeDAxes" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ThreeDAxes.rst:4 msgid "Qualified name: ``manim.mobject.graphing.coordinate\\_systems.ThreeDAxes``" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:1 msgid "Bases: :py:class:`manim.mobject.graphing.coordinate_systems.Axes`" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:1 msgid "A 3-dimensional set of axes." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:0 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:3 msgid "The ``[x_min, x_max, x_step]`` values of the x-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:4 msgid "The ``[y_min, y_max, y_step]`` values of the y-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:5 msgid "The ``[z_min, z_max, z_step]`` values of the z-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:6 msgid "The length of the x-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:7 msgid "The length of the y-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:8 msgid "The length of the z-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:9 msgid "Arguments to be passed to :class:`~.NumberLine` that influence the z-axis." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:10 msgid "The direction of the normal." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:11 msgid "The number of pieces used to construct the axes." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:12 msgid "The direction of the light source." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:13 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:14 msgid "Currently non-functional." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes:15 msgid "Additional arguments to be passed to :class:`Axes`." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ThreeDAxes.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ThreeDAxes.rst:20::1 #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:1 msgid "Generate a z-axis label." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.ThreeDAxes.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:3 msgid "The label. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:4 msgid "The edge of the x-axis to which the label will be added, by default ``UR``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:5 msgid "Allows for further positioning of the label from an edge, by default ``UR``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:6 msgid "The distance of the label from the line." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:7 msgid "The angle at which to rotate the label, by default ``PI/2``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:8 msgid "The axis about which to rotate the label, by default ``RIGHT``." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:10 msgid "The positioned label." msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems.ThreeDAxes.get_z_axis_label:0 msgid "Return type" msgstr "" manim.mobject.graphing.coordinate_systems.pot000066400000000000000000000024601515024150700340710ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.rst:2 msgid "coordinate\\_systems" msgstr "" #: ../../../manim/mobject/graphing/coordinate_systems.py:docstring of manim.mobject.graphing.coordinate_systems:1 msgid "Mobjects that represent coordinate systems." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.rst:30::1 msgid "Creates a set of axes." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.rst:30::1 msgid "A :class:`~.NumberPlane` specialized for use with complex numbers." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.rst:30::1 msgid "Abstract base class for Axes and NumberPlane." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.rst:30::1 msgid "Creates a cartesian plane with background lines." msgstr "" #: ../../source/reference/manim.mobject.graphing.coordinate_systems.rst:30::1 msgid "Creates a polar plane with background lines." msgstr "" manim.mobject.graphing.functions.FunctionGraph.pot000066400000000000000000000034601515024150700347320ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.functions.FunctionGraph.rst:2 msgid "FunctionGraph" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.FunctionGraph.rst:4 msgid "Qualified name: ``manim.mobject.graphing.functions.FunctionGraph``" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.FunctionGraph:1 msgid "Bases: :py:class:`manim.mobject.graphing.functions.ParametricFunction`" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.FunctionGraph:1 msgid "A :class:`ParametricFunction` that spans the length of the scene by default." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.FunctionGraph:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.FunctionGraph.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.FunctionGraph.rst:23 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.FunctionGraph.rst:34::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.FunctionGraph.rst:34::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.FunctionGraph.rst:34::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.FunctionGraph.rst:34::1 msgid "The height of the mobject." msgstr "" manim.mobject.graphing.functions.ImplicitFunction.pot000066400000000000000000000110311515024150700354340ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.functions.ImplicitFunction.rst:2 msgid "ImplicitFunction" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.ImplicitFunction.rst:4 msgid "Qualified name: ``manim.mobject.graphing.functions.ImplicitFunction``" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:1 msgid "An implicit function." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:3 msgid "The implicit function in the form ``f(x, y) = 0``." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:4 msgid "The x min and max of the function." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:5 msgid "The y min and max of the function." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:6 msgid "The minimum depth of the function to calculate." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:7 msgid "The maximum number of quads to use." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:8 msgid "Whether or not to smoothen the curves." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:9 msgid "Additional parameters to pass into :class:`VMobject`" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:12 msgid "A small ``min_depth`` :math:`d` means that some small details might be ignored if they don't cross an edge of one of the :math:`4^d` uniform quads." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:16 msgid "The value of ``max_quads`` strongly corresponds to the quality of the curve, but a higher number of quads may take longer to render." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction:21 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.ImplicitFunction.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.ImplicitFunction.rst:21::1 #: ../../source/reference/manim.mobject.graphing.functions.ImplicitFunction.rst:21::1 #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction.generate_points:1 #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.ImplicitFunction.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction.generate_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ImplicitFunction.generate_points:1::1 msgid "The width of the mobject." msgstr "" manim.mobject.graphing.functions.ParametricFunction.pot000066400000000000000000000114041515024150700357550ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.functions.ParametricFunction.rst:2 msgid "ParametricFunction" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.ParametricFunction.rst:4 msgid "Qualified name: ``manim.mobject.graphing.functions.ParametricFunction``" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:1 msgid "A parametric curve." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:3 msgid "The function to be plotted in the form of ``(lambda x: x**2)``" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:4 msgid "Determines the length that the function spans. By default ``[0, 1]``" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:5 msgid "Scaling class applied to the points of the function. Default of :class:`~.LinearBase`." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:6 msgid "Whether to interpolate between the points of the function after they have been created. (Will have odd behaviour with a low number of points)" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:8 msgid "Whether to pass in the generated t value array to the function as ``[t_0, t_1, ...]``. Only use this if your function supports it. Output should be a numpy array of shape ``[[x_0, x_1, ...], [y_0, y_1, ...], [z_0, z_1, ...]]`` but ``z`` can also be 0 if the Axes is 2D" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:12 msgid "Values of t at which the function experiences discontinuity." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:13 msgid "The left and right tolerance for the discontinuities." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:16 msgid "Examples" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction:46 msgid "If your function has discontinuities, you'll have to specify the location of the discontinuities manually. See the following example for guidance." msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.ParametricFunction.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.ParametricFunction.rst:23::1 #: ../../source/reference/manim.mobject.graphing.functions.ParametricFunction.rst:23::1 #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction.generate_points:1 #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.ParametricFunction.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction.generate_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions.ParametricFunction.generate_points:1::1 msgid "The width of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.graphing.functions.pot000066400000000000000000000014351515024150700322430ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.functions.rst:2 msgid "functions" msgstr "" #: ../../../manim/mobject/graphing/functions.py:docstring of manim.mobject.graphing.functions:1 msgid "Mobjects representing function graphs." msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.rst:24::1 msgid "A :class:`ParametricFunction` that spans the length of the scene by default." msgstr "" #: ../../source/reference/manim.mobject.graphing.functions.rst:24::1 msgid "An implicit function." msgstr "" manim.mobject.graphing.number_line.NumberLine.pot000066400000000000000000000431751515024150700345210ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:2 msgid "NumberLine" msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:4 msgid "Qualified name: ``manim.mobject.graphing.number\\_line.NumberLine``" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:1 msgid "Bases: :py:class:`manim.mobject.geometry.line.Line`" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:1 msgid "Creates a number line with tick marks." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_numbers:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_number_mobject:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.n2p:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.number_to_point:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.p2n:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.point_to_number:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:3 msgid "The ``[x_min, x_max, x_step]`` values to create the line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:4 msgid "The length of the number line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:5 msgid "The distance between each tick of the line. Overwritten by :attr:`length`, if specified." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:6 msgid "Whether to include ticks on the number line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:7 msgid "The length of each tick mark." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:8 msgid "An iterable of specific values with elongated ticks." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:9 msgid "Influences how many times larger elongated ticks are than regular ticks (2 = 2x)." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:10 msgid "The angle (in radians) at which the line is rotated." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:11 msgid "The thickness of the line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:12 msgid "Whether to add a tip to the end of the line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:13 msgid "The width of the tip." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:14 msgid "The height of the tip." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:15 msgid "Whether to add numbers to the tick marks. The number of decimal places is determined by the step size, this default can be overridden by ``decimal_number_config``." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:17 msgid "The way the ``x_range`` is value is scaled, i.e. :class:`~.LogBase` for a logarithmic numberline. Defaults to :class:`~.LinearBase`." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:18 msgid "The size of the label mobjects. Defaults to 36." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:19 msgid "The specific position to which label mobjects are added on the line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:20 msgid "Determines the mobject class that will be used to construct the labels of the number line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:21 msgid "The distance between the line and the label mobject." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:22 msgid "Arguments that can be passed to :class:`~.numbers.DecimalNumber` to influence number mobjects." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:23 msgid "An explicit iterable of numbers to not be added to the number line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:24 msgid "An explicit iterable of numbers to add to the number line" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:25 msgid "Additional arguments to be passed to :class:`~.Line`." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:29 msgid "Number ranges that include both negative and positive values will be generated from the 0 point, and may not include a tick at the min / max values as the tick locations are dependent on the step size." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine:34 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.number_to_point:10 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.point_to_number:10 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:36::1 msgid "Adds specifically positioned labels to the :class:`~.NumberLine` using a ``dict``." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:36::1 msgid "Adds :class:`~.DecimalNumber` mobjects representing their position at each tick of the number line." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:36::1 msgid "Adds ticks to the number line." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:36::1 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_number_mobject:1 msgid "Generates a positioned :class:`~.DecimalNumber` mobject generated according to ``label_constructor``." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:36::1 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick:1 msgid "Generates a tick and positions it along the number line." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:36::1 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick_range:1 msgid "Generates the range of values on which labels are plotted based on the ``x_range`` attribute of the number line." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:36::1 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.n2p:1 msgid "Abbreviation for :meth:`~.NumberLine.number_to_point`." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:36::1 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.number_to_point:1 msgid "Accepts a value along the number line and returns a point with respect to the scene." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:36::1 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.p2n:1 msgid "Abbreviation for :meth:`~.NumberLine.point_to_number`." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:36::1 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.point_to_number:1 msgid "Accepts a point with respect to the scene and returns a float along the number line." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.NumberLine.rst:38 msgid "Attributes" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:1 msgid "Adds specifically positioned labels to the :class:`~.NumberLine` using a ``dict``. The labels can be accessed after creation via ``self.labels``." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:4 msgid "A dictionary consisting of the position along the number line and the mobject to be added: ``{1: Tex(\"Monday\"), 3: Tex(\"Tuesday\")}``. :attr:`label_constructor` will be used to construct the labels if the value is not a mobject (``str`` or ``float``)." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:7 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_number_mobject:5 msgid "Determines the direction at which the label is positioned next to the line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:8 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_number_mobject:6 msgid "The distance of the label from the line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:9 msgid "The font size of the mobject to be positioned." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:10 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_numbers:10 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_number_mobject:8 msgid "The :class:`~.VMobject` class that will be used to construct the label. Defaults to the ``label_constructor`` attribute of the number line if not specified." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:0 msgid "Raises" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_labels:14 msgid "If the label does not have a ``font_size`` attribute, an ``AttributeError`` is raised." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_numbers:1 msgid "Adds :class:`~.DecimalNumber` mobjects representing their position at each tick of the number line. The numbers can be accessed after creation via ``self.numbers``." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_numbers:5 msgid "An iterable of the values used to position and create the labels. Defaults to the output produced by :meth:`~.NumberLine.get_tick_range`" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_numbers:7 msgid "A list of values to exclude from :attr:`x_values`." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_numbers:8 msgid "The font size of the labels. Defaults to the ``font_size`` attribute of the number line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.add_ticks:1 msgid "Adds ticks to the number line. Ticks can be accessed after creation via ``self.ticks``." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_number_mobject:4 msgid "The x-value at which the mobject should be positioned." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_number_mobject:7 msgid "The font size of the label mobject." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_number_mobject:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick_range:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.number_to_point:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.point_to_number:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_number_mobject:12 msgid "The positioned mobject." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_number_mobject:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick_range:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.n2p:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.number_to_point:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.p2n:0 #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.point_to_number:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick:3 msgid "The position of the tick." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick:4 msgid "The factor by which the tick is scaled." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick:6 msgid "A positioned tick." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.get_tick_range:4 msgid "A numpy array of floats represnting values along the number line." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.number_to_point:4 msgid "The value to be transformed into a coordinate. Or a list of values." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.number_to_point:6 msgid "A point with respect to the scene's coordinate system. Or a list of points." msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.NumberLine.point_to_number:4 msgid "A sequence of values consisting of ``(x_coord, y_coord, z_coord)``." msgstr "" manim.mobject.graphing.number_line.UnitInterval.pot000066400000000000000000000027371515024150700351040ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.number_line.UnitInterval.rst:2 msgid "UnitInterval" msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.UnitInterval.rst:4 msgid "Qualified name: ``manim.mobject.graphing.number\\_line.UnitInterval``" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line.UnitInterval:1 msgid "Bases: :py:class:`manim.mobject.graphing.number_line.NumberLine`" msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.UnitInterval.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.UnitInterval.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.UnitInterval.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.UnitInterval.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.UnitInterval.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.UnitInterval.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.graphing.number_line.pot000066400000000000000000000012071515024150700325270ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.number_line.rst:2 msgid "number\\_line" msgstr "" #: ../../../manim/mobject/graphing/number_line.py:docstring of manim.mobject.graphing.number_line:1 msgid "Mobject representing a number line." msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.graphing.number_line.rst:22::1 msgid "Creates a number line with tick marks." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.graphing.pot000066400000000000000000000022421515024150700302310ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.rst:2 msgid "graphing" msgstr "" #: ../../../manim/mobject/graphing/__init__.py:docstring of manim.mobject.graphing:1 msgid "Coordinate systems and function graphing related mobjects." msgstr "" #: ../../../manim/mobject/graphing/__init__.py:docstring of manim.mobject.graphing:4 msgid "Modules" msgstr "" #: ../../../manim/mobject/graphing/__init__.py:docstring of manim.mobject.graphing:14::1 msgid "Mobjects that represent coordinate systems." msgstr "" #: ../../../manim/mobject/graphing/__init__.py:docstring of manim.mobject.graphing:14::1 msgid "Mobjects representing function graphs." msgstr "" #: ../../../manim/mobject/graphing/__init__.py:docstring of manim.mobject.graphing:14::1 msgid "Mobject representing a number line." msgstr "" #: ../../../manim/mobject/graphing/__init__.py:docstring of manim.mobject.graphing:14::1 msgid "Mobjects representing objects from probability theory and statistics." msgstr "" manim.mobject.graphing.probability.BarChart.pot000066400000000000000000000150441515024150700341620ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.probability.BarChart.rst:2 msgid "BarChart" msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.BarChart.rst:4 msgid "Qualified name: ``manim.mobject.graphing.probability.BarChart``" msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:1 msgid "Bases: :py:class:`manim.mobject.graphing.coordinate_systems.Axes`" msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:1 msgid "Creates a bar chart. Inherits from :class:`~.Axes`, so it shares its methods and attributes. Each axis inherits from :class:`~.NumberLine`, so pass in ``x_axis_config``/``y_axis_config`` to control their attributes." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:0 #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.change_bar_values:0 #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.get_bar_labels:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:5 msgid "A sequence of values that determines the height of each bar. Accepts negative values." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:6 msgid "A sequence of names for each bar. Does not have to match the length of ``values``." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:7 msgid "The y_axis range of values. If ``None``, the range will be calculated based on the min/max of ``values`` and the step will be calculated based on ``y_length``." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:9 msgid "The length of the x-axis. If ``None``, it is automatically calculated based on the number of values and the width of the screen." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:11 msgid "The length of the y-axis." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:12 msgid "The color for the bars. Accepts a sequence of colors (can contain just one item). If the length of``bar_colors`` does not match that of ``values``, intermediate colors will be automatically determined." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:15 msgid "The length of a bar. Must be between 0 and 1." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:16 msgid "The fill opacity of the bars." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:17 msgid "The stroke width of the bars." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart:20 #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.change_bar_values:8 #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.get_bar_labels:10 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.BarChart.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.BarChart.rst:21::1 #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.change_bar_values:1 msgid "Updates the height of the bars of the chart." msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.BarChart.rst:21::1 msgid "Annotates each bar with its corresponding value." msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.BarChart.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.change_bar_values:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.change_bar_values:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.change_bar_values:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.change_bar_values:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.change_bar_values:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.change_bar_values:3 msgid "The values that will be used to update the height of the bars. Does not have to match the number of bars." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.change_bar_values:5 msgid "Whether to re-initalize the colors of the bars based on ``self.bar_colors``." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.get_bar_labels:1 msgid "Annotates each bar with its corresponding value. Use ``self.bar_labels`` to access the labels after creation." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.get_bar_labels:4 msgid "The color of each label. By default ``None`` and is based on the parent's bar color." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.get_bar_labels:5 msgid "The font size of each label." msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.BarChart.get_bar_labels:6 msgid "The distance from each label to its bar. By default 0.4." msgstr "" manim.mobject.graphing.probability.SampleSpace.pot000066400000000000000000000031321515024150700346640ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.probability.SampleSpace.rst:2 msgid "SampleSpace" msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.SampleSpace.rst:4 msgid "Qualified name: ``manim.mobject.graphing.probability.SampleSpace``" msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.SampleSpace:1 msgid "Bases: :py:class:`manim.mobject.geometry.polygram.Rectangle`" msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability.SampleSpace:2 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.SampleSpace.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.SampleSpace.rst:34 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.SampleSpace.rst:45::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.SampleSpace.rst:45::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.SampleSpace.rst:45::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.SampleSpace.rst:45::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.graphing.probability.pot000066400000000000000000000012251515024150700325500ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.probability.rst:2 msgid "probability" msgstr "" #: ../../../manim/mobject/graphing/probability.py:docstring of manim.mobject.graphing.probability:1 msgid "Mobjects representing objects from probability theory and statistics." msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.graphing.probability.rst:22::1 msgid "Creates a bar chart." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.graphing.scale.LinearBase.pot000066400000000000000000000045741515024150700333350ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.scale.LinearBase.rst:2 msgid "LinearBase" msgstr "" #: ../../source/reference/manim.mobject.graphing.scale.LinearBase.rst:4 msgid "Qualified name: ``manim.mobject.graphing.scale.LinearBase``" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase:1 msgid "Bases: :py:class:`manim.mobject.graphing.scale._ScaleBase`" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase:1 msgid "The default scaling class." msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase:0 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase.function:0 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase.inverse_function:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase:3 msgid "The slope of the linear function, by default 1.0" msgstr "" #: ../../source/reference/manim.mobject.graphing.scale.LinearBase.rst:14 msgid "Methods" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase.function:1::1 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase.function:1 msgid "Multiplies the value by the scale factor." msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase.function:1::1 msgid "Inverse of function." msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase.function:3 msgid "Value to be multiplied by the scale factor." msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase.function:0 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase.inverse_function:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LinearBase.inverse_function:1 msgid "Inverse of function. Divides the value by the scale factor." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.graphing.scale.LogBase.pot000066400000000000000000000067071515024150700326440ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.scale.LogBase.rst:2 msgid "LogBase" msgstr "" #: ../../source/reference/manim.mobject.graphing.scale.LogBase.rst:4 msgid "Qualified name: ``manim.mobject.graphing.scale.LogBase``" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase:1 msgid "Bases: :py:class:`manim.mobject.graphing.scale._ScaleBase`" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase:1 msgid "Scale for logarithmic graphs/functions." msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase:0 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.function:0 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.get_custom_labels:0 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.inverse_function:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase:3 msgid "The base of the log, by default 10." msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase:4 msgid "For use with :class:`~.Axes`: Whetherer or not to include ``LaTeX`` axis labels, by default True." msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.graphing.scale.LogBase.rst:14 msgid "Methods" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.function:1::1 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.function:1 msgid "Scales the value to fit it to a logarithmic scale.``self.function(5)==10**5``" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.function:1::1 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.get_custom_labels:1 msgid "Produces custom :class:`~.Integer` labels in the form of ``10^2``." msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.function:1::1 msgid "Inverse of ``function``." msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.function:0 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.get_custom_labels:0 #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.inverse_function:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.get_custom_labels:3 msgid "The iterable of values used to create the labels. Determines the exponent." msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.get_custom_labels:4 msgid "The number of decimal places to include in the exponent" msgstr "" #: ../../../manim/mobject/graphing/scale.py:docstring of manim.mobject.graphing.scale.LogBase.get_custom_labels:5 msgid "Additional arguments to be passed to :class:`~.Integer`." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.graphing.scale.pot000066400000000000000000000007061515024150700313220ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.graphing.scale.rst:2 msgid "scale" msgstr "" #: ../../source/reference/manim.mobject.graphing.scale.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.graphing.scale.rst:22::1 msgid "The default scaling class." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.logo.ManimBanner.pot000066400000000000000000000130031515024150700315550ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.logo.ManimBanner.rst:2 msgid "ManimBanner" msgstr "" #: ../../source/reference/manim.mobject.logo.ManimBanner.rst:4 msgid "Qualified name: ``manim.mobject.logo.ManimBanner``" msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner:1 msgid "Convenience class representing Manim's banner." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner:3 msgid "Can be animated using custom methods." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner:0 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:0 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:0 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.scale:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner:5 msgid "If ``True`` (the default), the dark theme version of the logo (with light text font) will be rendered. Otherwise, if ``False``, the light theme version (with dark text font) is used." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner:10 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:23 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.logo.ManimBanner.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.logo.ManimBanner.rst:22::1 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:1 msgid "The creation animation for Manim's logo." msgstr "" #: ../../source/reference/manim.mobject.logo.ManimBanner.rst:22::1 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:1 msgid "An animation that expands Manim's logo into its banner." msgstr "" #: ../../source/reference/manim.mobject.logo.ManimBanner.rst:22::1 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.scale:1 msgid "Scale the banner by the specified scale factor." msgstr "" #: ../../source/reference/manim.mobject.logo.ManimBanner.rst:24 msgid "Attributes" msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:3 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:16 msgid "The run time of the animation." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:0 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:0 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.scale:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:5 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:19 msgid "An animation to be used in a :meth:`.Scene.play` call." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.create:0 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:0 #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.scale:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:3 msgid "The returned animation transforms the banner from its initial state (representing Manim's logo with just the icons) to its expanded state (showing the full name together with the icons)." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:7 msgid "See the class documentation for how to use this." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:11 msgid "Before calling this method, the text \"anim\" is not a submobject of the banner object. After the expansion, it is added as a submobject so subsequent animations to the banner object apply to the text \"anim\" as well." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.expand:17 msgid "The direction in which the logo is expanded." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.scale:3 msgid "The factor used for scaling the banner." msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo.ManimBanner.scale:5 msgid "The scaled banner." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.logo.pot000066400000000000000000000006631515024150700273770ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.logo.rst:2 msgid "logo" msgstr "" #: ../../../manim/mobject/logo.py:docstring of manim.mobject.logo:1 msgid "Utilities for Manim's logo and banner." msgstr "" #: ../../source/reference/manim.mobject.logo.rst:15 msgid "Classes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.matrix.DecimalMatrix.pot000066400000000000000000000045151515024150700324650ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.matrix.DecimalMatrix.rst:2 msgid "DecimalMatrix" msgstr "" #: ../../source/reference/manim.mobject.matrix.DecimalMatrix.rst:4 msgid "Qualified name: ``manim.mobject.matrix.DecimalMatrix``" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.DecimalMatrix:1 msgid "Bases: :py:class:`manim.mobject.matrix.Matrix`" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.DecimalMatrix:1 msgid "A mobject that displays a matrix with decimal entries on the screen." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.DecimalMatrix:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.DecimalMatrix:17 msgid "Will round/truncate the decimal places as per the provided config." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.DecimalMatrix:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.DecimalMatrix:19 msgid "A numpy 2d array or list of lists" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.DecimalMatrix:21 msgid "Mobject to use, by default DecimalNumber" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.DecimalMatrix:23 msgid "Config for the desired mobject, by default {\"num_decimal_places\": 1}" msgstr "" #: ../../source/reference/manim.mobject.matrix.DecimalMatrix.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.matrix.DecimalMatrix.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.matrix.DecimalMatrix.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.matrix.DecimalMatrix.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.matrix.DecimalMatrix.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.matrix.DecimalMatrix.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.matrix.IntegerMatrix.pot000066400000000000000000000042121515024150700325160ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.matrix.IntegerMatrix.rst:2 msgid "IntegerMatrix" msgstr "" #: ../../source/reference/manim.mobject.matrix.IntegerMatrix.rst:4 msgid "Qualified name: ``manim.mobject.matrix.IntegerMatrix``" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.IntegerMatrix:1 msgid "Bases: :py:class:`manim.mobject.matrix.Matrix`" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.IntegerMatrix:1 msgid "A mobject that displays a matrix with integer entries on the screen." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.IntegerMatrix:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.IntegerMatrix:16 msgid "Will round if there are decimal entries in the matrix." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.IntegerMatrix:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.IntegerMatrix:18 msgid "A numpy 2d array or list of lists" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.IntegerMatrix:20 msgid "Mobject to use, by default Integer" msgstr "" #: ../../source/reference/manim.mobject.matrix.IntegerMatrix.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.matrix.IntegerMatrix.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.matrix.IntegerMatrix.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.matrix.IntegerMatrix.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.matrix.IntegerMatrix.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.matrix.IntegerMatrix.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.matrix.Matrix.pot000066400000000000000000000242771515024150700312150ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:2 msgid "Matrix" msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:4 msgid "Qualified name: ``manim.mobject.matrix.Matrix``" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:1 msgid "A mobject that displays a matrix on the screen." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:4 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_brackets:7 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_columns:7 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_entries:7 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_rows:7 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_column_colors:10 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_row_colors:10 msgid "Examples" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:5 msgid "The first example shows a variety of uses of this module while the second example exlpains the use of the options `add_background_rectangles_to_entries` and `include_background_rectangle`." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_column_colors:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_row_colors:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:56 msgid "A numpy 2d array or list of lists." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:57 msgid "Vertical distance between elements, by default 0.8." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:58 msgid "Horizontal distance between elements, by default 1.3." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:59 msgid "Distance of the brackets from the matrix, by default ``MED_SMALL_BUFF``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:60 msgid "Height of the brackets, by default ``MED_SMALL_BUFF``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:61 msgid "``True`` if should add backgraound rectangles to entries, by default ``False``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:62 msgid "``True`` if should include background rectangle, by default ``False``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:63 msgid "The mobject class used to construct the elements, by default :class:`~.MathTex`." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:64 msgid "Additional arguments to be passed to the constructor in ``element_to_mobject``, by default ``{}``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:66 msgid "The corner to which elements are aligned, by default ``DR``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:67 msgid "The left bracket type, by default ``\"[\"``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:68 msgid "The right bracket type, by default ``\"]\"``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:69 msgid "``True`` if should stretch the brackets to fit the height of matrix contents, by default ``True``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix:70 msgid "Additional arguments to be passed to :class:`~.MathTex` when constructing the brackets." msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:27::1 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.add_background_to_entries:1 msgid "Add a black background rectangle to the matrix, see above for an example." msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:27::1 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_brackets:1 msgid "Return the bracket mobjects." msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:27::1 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_columns:1 msgid "Return columns of the matrix as VGroups." msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:27::1 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_entries:1 msgid "Return the individual entries of the matrix." msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:27::1 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_mob_matrix:1 msgid "Return the underlying mob matrix mobjects." msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:27::1 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_rows:1 msgid "Return rows of the matrix as VGroups." msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:27::1 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_column_colors:1 msgid "Set individual colors for each columns of the matrix." msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:27::1 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_row_colors:1 msgid "Set individual colors for each row of the matrix." msgstr "" #: ../../source/reference/manim.mobject.matrix.Matrix.rst:29 msgid "Attributes" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.add_background_to_entries:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.add_background_to_entries:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.add_background_to_entries:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.add_background_to_entries:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.add_background_to_entries:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.add_background_to_entries:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_brackets:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_columns:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_entries:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_mob_matrix:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_rows:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_column_colors:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_row_colors:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.add_background_to_entries:4 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_column_colors:6 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_row_colors:6 msgid "The current matrix object (self)." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.add_background_to_entries:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_brackets:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_columns:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_entries:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_mob_matrix:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_rows:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_column_colors:0 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_row_colors:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_brackets:3 msgid "Each VGroup contains a bracket" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_brackets:4 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_columns:4 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_mob_matrix:4 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_rows:4 msgid "List[:class:`~.VGroup`]" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_columns:3 msgid "Each VGroup contains a column of the matrix." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_entries:3 msgid "VGroup containing entries of the matrix." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_mob_matrix:3 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.get_rows:3 msgid "Each VGroup contains a row of the matrix." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.Matrix.set_column_colors:3 msgid "The list of colors; each color specified corresponds to a column." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.matrix.MobjectMatrix.pot000066400000000000000000000101051515024150700325020ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.matrix.MobjectMatrix.rst:2 msgid "MobjectMatrix" msgstr "" #: ../../source/reference/manim.mobject.matrix.MobjectMatrix.rst:4 msgid "Qualified name: ``manim.mobject.matrix.MobjectMatrix``" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:1 msgid "Bases: :py:class:`manim.mobject.matrix.Matrix`" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:1 msgid "A mobject that displays a matrix of mobject entries on the screen." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:17 msgid "A numpy 2d array or list of lists." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:18 msgid "Vertical distance between elements, by default 0.8." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:19 msgid "Horizontal distance between elements, by default 1.3." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:20 msgid "Distance of the brackets from the matrix, by default ``MED_SMALL_BUFF``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:21 msgid "Height of the brackets, by default ``MED_SMALL_BUFF``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:22 msgid "``True`` if should add backgraound rectangles to entries, by default ``False``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:23 msgid "``True`` if should include background rectangle, by default ``False``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:24 msgid "The mobject class used to construct the elements, by default :class:`~.MathTex`." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:25 msgid "Additional arguments to be passed to the constructor in ``element_to_mobject``, by default ``{}``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:27 msgid "The corner to which elements are aligned, by default ``DR``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:28 msgid "The left bracket type, by default ``\"[\"``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:29 msgid "The right bracket type, by default ``\"]\"``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:30 msgid "``True`` if should stretch the brackets to fit the height of matrix contents, by default ``True``." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.MobjectMatrix:31 msgid "Additional arguments to be passed to :class:`~.MathTex` when constructing the brackets." msgstr "" #: ../../source/reference/manim.mobject.matrix.MobjectMatrix.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.matrix.MobjectMatrix.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.matrix.MobjectMatrix.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.matrix.MobjectMatrix.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.matrix.MobjectMatrix.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.matrix.MobjectMatrix.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.matrix.pot000066400000000000000000000047261515024150700277470ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.matrix.rst:2 msgid "matrix" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix:1 msgid "Mobjects representing matrices." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix:4 #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.get_det_text:16 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.matrix.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.matrix.rst:32::1 msgid "A mobject that displays a matrix with decimal entries on the screen." msgstr "" #: ../../source/reference/manim.mobject.matrix.rst:32::1 msgid "A mobject that displays a matrix with integer entries on the screen." msgstr "" #: ../../source/reference/manim.mobject.matrix.rst:32::1 msgid "A mobject that displays a matrix on the screen." msgstr "" #: ../../source/reference/manim.mobject.matrix.rst:32::1 msgid "A mobject that displays a matrix of mobject entries on the screen." msgstr "" #: ../../source/reference/manim.mobject.matrix.rst:35 msgid "Functions" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.get_det_text:1 msgid "Helper function to create determinant." msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.get_det_text:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.get_det_text:3 msgid "The matrix whose determinant is to be created" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.get_det_text:5 msgid "The value of the determinant of the matrix" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.get_det_text:7 msgid "The background rectangle" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.get_det_text:9 msgid "The scale of the text `det` w.r.t the matrix" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.get_det_text:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.get_det_text:12 msgid "A VGroup containing the determinant" msgstr "" #: ../../../manim/mobject/matrix.py:docstring of manim.mobject.matrix.get_det_text:0 msgid "Return type" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.mobject.Group.pot000066400000000000000000000031201515024150700311440ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.mobject.Group.rst:2 msgid "Group" msgstr "" #: ../../source/reference/manim.mobject.mobject.Group.rst:4 msgid "Qualified name: ``manim.mobject.mobject.Group``" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Group:1 msgid "Bases: :py:class:`manim.mobject.mobject.Mobject`" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Group:1 msgid "Groups together multiple :class:`Mobjects <.Mobject>`." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Group:4 msgid "Notes" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Group:5 msgid "When adding the same mobject more than once, repetitions are ignored. Use :meth:`.Mobject.copy` to create a separate copy which can then be added to the group." msgstr "" #: ../../source/reference/manim.mobject.mobject.Group.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.mobject.Group.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.mobject.Group.rst:28::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Group.rst:28::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.mobject.Group.rst:28::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.mobject.Mobject.pot000066400000000000000000002006241515024150700314430ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:2 msgid "Mobject" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:4 msgid "Qualified name: ``manim.mobject.mobject.Mobject``" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject:1 msgid "Mathematical Object: base class for objects that can be displayed on screen." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject:3 msgid "There is a compatibility layer that allows for getting and setting generic attributes with ``get_*`` and ``set_*`` methods. See :meth:`set` for more details." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject:9 msgid "The contained objects." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject:0 msgid "type" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject:11 msgid "List[:class:`Mobject`]" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject:15 msgid "The points of the objects." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:1 msgid "Add mobjects as submobjects." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_animation_override:1 msgid "Add an animation override." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_background_rectangle:1 msgid "Add a BackgroundRectangle as submobject." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:1 msgid "Add all passed mobjects to the back of the submobjects." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_updater:1 msgid "Add an update function to this mobject." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.align_data:1 msgid "Aligns the data of this mobject with another mobject." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.align_on_border:1 msgid "Direction just needs to be a vector pointing towards side or corner in the 2d plane." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.align_to:1 msgid "Aligns mobject to another :class:`~.Mobject` in a certain direction." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animation_override_for:1 msgid "Returns the function defining a specific animation override for this class." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 msgid "Applies a complex function to a :class:`Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.apply_to_family:1 msgid "Apply a function to ``self`` and every submobject with points recursively." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange:1 msgid "Sorts :class:`~.Mobject` next to each other on screen." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:1 msgid "Arrange submobjects in a grid." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_submobjects:1 msgid "Arrange the position of :attr:`submobjects` with a small buffer." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.become:1 msgid "Edit points, colors and submobjects to be identical to another :class:`~.Mobject`" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.clear_updaters:1 msgid "Remove every updater." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.copy:1 msgid "Create and return an identical copy of the :class:`Mobject` including all :attr:`submobjects`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.flip:1 msgid "Flips/Mirrors an mobject about its center." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_bottom:1 msgid "Get bottom coordinates of a box bounding the :class:`~.Mobject`" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_center:1 msgid "Get center coordinates" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_color:1 msgid "Returns the color of the :class:`~.Mobject`" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_coord:1 msgid "Meant to generalize ``get_x``, ``get_y`` and ``get_z``" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_corner:1 msgid "Get corner coordinates for certain direction." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 msgid "Picture a box bounding the :class:`~.Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_edge_center:1 msgid "Get edge coordinates for certain direction." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_end:1 msgid "Returns the point, where the stroke that surrounds the :class:`~.Mobject` ends." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_left:1 msgid "Get left coordinates of a box bounding the :class:`~.Mobject`" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_midpoint:1 msgid "Get coordinates of the middle of the path that forms the :class:`~.Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_nadir:1 msgid "Get nadir (opposite the zenith) coordinates of a box bounding a 3D :class:`~.Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 msgid "The simplest :class:`~.Mobject` to be transformed to or from self." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_right:1 msgid "Get right coordinates of a box bounding the :class:`~.Mobject`" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_start:1 msgid "Returns the point, where the stroke that surrounds the :class:`~.Mobject` starts." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_start_and_end:1 msgid "Returns starting and ending point of a stroke as a ``tuple``." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_time_based_updaters:1 msgid "Return all updaters using the ``dt`` parameter." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_top:1 msgid "Get top coordinates of a box bounding the :class:`~.Mobject`" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_updaters:1 msgid "Return all updaters." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_x:1 msgid "Returns x coordinate of the center of the :class:`~.Mobject` as ``float``" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_y:1 msgid "Returns y coordinate of the center of the :class:`~.Mobject` as ``float``" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_z:1 msgid "Returns z coordinate of the center of the :class:`~.Mobject` as ``float``" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_zenith:1 msgid "Get zenith coordinates of a box bounding a 3D :class:`~.Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.has_no_points:1 msgid "Check if :class:`~.Mobject` *does not* contains points." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.has_points:1 msgid "Check if :class:`~.Mobject` contains points." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.has_time_based_updater:1 msgid "Test if ``self`` has a time based updater." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.init_colors:1 msgid "Initializes the colors." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.insert:1 msgid "Inserts a mobject at a specific position into self.submobjects" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.interpolate:1 msgid "Turns this :class:`~.Mobject` into an interpolation between ``mobject1`` and ``mobject2``." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.invert:1 msgid "Inverts the list of :attr:`submobjects`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.length_over_dim:1 msgid "Measure the length of an :class:`~.Mobject` in a certain direction." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_color:1 msgid "Match the color with the color of another :class:`~.Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_coord:1 msgid "Match the coordinates with the coordinates of another :class:`~.Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_depth:1 msgid "Match the depth with the depth of another :class:`~.Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_dim_size:1 msgid "Match the specified dimension with the dimension of another :class:`~.Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_height:1 msgid "Match the height with the height of another :class:`~.Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_points:1 msgid "Edit points, positions, and submobjects to be identical to another :class:`~.Mobject`, while keeping the style unchanged." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_updaters:1 msgid "Match the updaters of the given mobject." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_width:1 msgid "Match the width with the width of another :class:`~.Mobject`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 msgid "Match x coord." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 msgid "Match y coord." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 msgid "Match z coord." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.move_to:1 msgid "Move center of the :class:`~.Mobject` to certain coordinate." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.next_to:1 msgid "Move this :class:`~.Mobject` next to another's :class:`~.Mobject` or coordinate." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.null_point_align:1 msgid "If a :class:`~.Mobject` with points is being aligned to one without, treat both as groups, and push the one with points into its own submobjects list." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove:1 msgid "Remove :attr:`submobjects`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove_updater:1 msgid "Remove an updater." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.repeat:1 msgid "This can make transition animations nicer" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.reset_points:1 msgid "Sets :attr:`points` to be an empty array." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.restore:1 msgid "Restores the state that was previously saved with :meth:`~.Mobject.save_state`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.resume_updating:1 msgid "Enable updating from updaters and animations." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.rotate:1 msgid "Rotates the :class:`~.Mobject` about a certain point." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.rotate_about_origin:1 msgid "Rotates the :class:`~.Mobject` about the ORIGIN, which is at [0,0,0]." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.save_image:1 msgid "Saves an image of only this :class:`Mobject` at its position to a png file." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 msgid "Save the current state (position, color & size)." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale:1 msgid "Scale the size by a factor." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_depth:1 msgid "Scales the :class:`~.Mobject` to fit a depth while keeping width/height proportional." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_height:1 msgid "Scales the :class:`~.Mobject` to fit a height while keeping width/depth proportional." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_width:1 msgid "Scales the :class:`~.Mobject` to fit a width while keeping height/depth proportional." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:1 msgid "Sets attributes." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 msgid "Condition is function which takes in one arguments, (x, y, z)." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_default:1 msgid "Sets the default values of keyword arguments." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_x:1 msgid "Set x value of the center of the :class:`~.Mobject` (``int`` or ``float``)" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_y:1 msgid "Set y value of the center of the :class:`~.Mobject` (``int`` or ``float``)" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z:1 msgid "Set z value of the center of the :class:`~.Mobject` (``int`` or ``float``)" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index:1 msgid "Sets the :class:`~.Mobject`'s :attr:`z_index` to the value specified in `z_index_value`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index_by_z_coordinate:1 msgid "Sets the :class:`~.Mobject`'s z coordinate to the value of :attr:`z_index`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.shift:1 msgid "Shift by the given vectors." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.shuffle:1 msgid "Shuffles the list of :attr:`submobjects`." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.shuffle_submobjects:1 msgid "Shuffles the order of :attr:`submobjects`" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.sort:1 msgid "Sorts the list of :attr:`submobjects` by a function defined by ``submob_func``." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.sort_submobjects:1 msgid "Sort the :attr:`submobjects`" msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_depth:1 msgid "Stretches the :class:`~.Mobject` to fit a depth, not keeping width/height proportional." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_height:1 msgid "Stretches the :class:`~.Mobject` to fit a height, not keeping width/depth proportional." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_width:1 msgid "Stretches the :class:`~.Mobject` to fit a width, not keeping height/depth proportional." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.suspend_updating:1 msgid "Disable updating from updaters and animations." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:175::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.update:1 msgid "Apply all updaters." msgstr "" #: ../../source/reference/manim.mobject.mobject.Mobject.rst:177 msgid "Attributes" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:1::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:1::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.depth:1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:1::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.height:1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:1::1 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.width:1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:3 msgid "The mobjects are added to :attr:`submobjects`." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:5 msgid "Subclasses of mobject may implement ``+`` and ``+=`` dunder methods." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_animation_override:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_background_rectangle:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_updater:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.align_data:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.align_to:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animation_override_for:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.apply_to_family:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.become:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.clear_updaters:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.copy:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.insert:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.invert:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_color:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_coord:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_depth:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_dim_size:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_height:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_points:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_updaters:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_width:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_x:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_y:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_z:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.null_point_align:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove_updater:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.repeat:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.resume_updating:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.rotate:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_color:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_default:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.shift:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.suspend_updating:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.update:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:7 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:6 msgid "The mobjects to add." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_background_rectangle:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_updater:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animation_override_for:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.apply_to_family:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.clear_updaters:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.copy:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_time_based_updaters:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_updaters:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.has_time_based_updater:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_updaters:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.null_point_align:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove_updater:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.resume_updating:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_height:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_width:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index_by_z_coordinate:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.shift:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_height:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_width:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.suspend_updating:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.update:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:9 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_background_rectangle:11 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:8 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_updater:17 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.apply_to_family:6 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:20 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.clear_updaters:5 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_updaters:5 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.null_point_align:6 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove:9 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove_updater:7 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.resume_updating:5 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale:11 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_height:3 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_width:3 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:33 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.shift:6 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_height:3 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_width:3 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.suspend_updating:6 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.update:9 msgid "``self``" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_background_rectangle:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_updater:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animation_override_for:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.apply_to_family:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.clear_updaters:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.copy:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.depth:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_bottom:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_center:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_corner:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_edge_center:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_left:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_midpoint:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_nadir:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_right:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_time_based_updaters:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_top:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_updaters:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_x:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_y:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_z:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_zenith:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.has_no_points:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.has_points:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.has_time_based_updater:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.height:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_updaters:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.null_point_align:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove_updater:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.resume_updating:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_height:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_width:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index_by_z_coordinate:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.shift:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_height:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_width:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.suspend_updating:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.update:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.width:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_animation_override:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:0 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:0 msgid "Raises" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:12 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:18 msgid "When a mobject tries to add itself." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:13 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:19 msgid "When trying to add an object that is not an instance of :class:`Mobject`." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:16 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:22 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:27 msgid "Notes" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:17 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:23 msgid "A mobject cannot contain itself, and it cannot contain a submobject more than once. If the parent mobject is displayed, the newly-added submobjects will also be displayed (i.e. they are automatically added to the parent Scene)." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:25 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_updater:21 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:46 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange:4 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:36 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_submobjects:4 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.become:16 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.flip:4 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_midpoint:4 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.height:6 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.interpolate:5 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.invert:6 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_points:5 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.next_to:4 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale:15 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_height:7 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale_to_fit_width:7 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:37 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_default:12 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index:10 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.shuffle_submobjects:4 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_height:7 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.stretch_to_fit_width:7 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.width:6 msgid "Examples" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:32 msgid "Duplicates are not added again::" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:38 msgid "Adding an object to itself raises an error::" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add:45 msgid "A given mobject cannot be added as a submobject twice to some parent::" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_animation_override:3 msgid "This does not apply to subclasses." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_animation_override:5 msgid "The animation type to be overridden" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_animation_override:6 msgid "The function returning an animation replacing the default animation. It gets passed the parameters given to the animnation constructor." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_animation_override:9 msgid "If the overridden animation was already overridden." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_background_rectangle:3 msgid "The BackgroundRectangle is added behind other submobjects." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_background_rectangle:5 msgid "This can be used to increase the mobjects visibility in front of a noisy background." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_background_rectangle:7 msgid "The color of the BackgroundRectangle" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_background_rectangle:8 msgid "The opacity of the BackgroundRectangle" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_background_rectangle:9 msgid "Additional keyword arguments passed to the BackgroundRectangle constructor" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:3 msgid "If :attr:`submobjects` already contains the given mobjects, they just get moved to the back instead." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_to_back:13 msgid "Technically, this is done by adding (or moving) the mobjects to the head of :attr:`submobjects`. The head of this list is rendered first, which places the corresponding mobjects behind the subsequent list members." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_updater:3 msgid "Update functions, or updaters in short, are functions that are applied to the Mobject in every frame." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_updater:6 msgid "The update function to be added. Whenever :meth:`update` is called, this update function gets called using ``self`` as the first parameter. The updater can have a second parameter ``dt``. If it uses this parameter, it gets called using a second value ``dt``, usually representing the time in seconds since the last call of :meth:`update`." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_updater:12 msgid "The index at which the new updater should be added in ``self.updaters``. In case ``index`` is ``None`` the updater will be added at the end." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.add_updater:14 msgid "Whether or not to call the updater initially. If ``True``, the updater will be called using ``dt=0``." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.align_data:3 msgid "Afterwards, the two mobjects will have the same number of submobjects (see :meth:`.align_submobjects`), the same parent structure (see :meth:`.null_point_align`). If ``skip_point_alignment`` is false, they will also have the same number of points (see :meth:`.align_points`)." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.align_data:8 msgid "The other mobject this mobject should be aligned to." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.align_data:9 msgid "Controls whether or not the computationally expensive point alignment is skipped (default: False)." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.align_to:3 msgid "Examples: mob1.align_to(mob2, UP) moves mob1 vertically so that its top edge lines ups with mob2's top edge." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.align_to:7 msgid "mob1.align_to(mob2, alignment_vect = RIGHT) moves mob1 horizontally so that it's center is directly above/below the center of mob2" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:3 msgid "Any method called on :code:`animate` is converted to an animation of applying that method on the mobject itself." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:6 msgid "For example, :code:`square.set_fill(WHITE)` sets the fill color of a square, while :code:`square.animate.set_fill(WHITE)` animates this action." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:9 msgid "Multiple methods can be put in a single animation once via chaining:" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:17 msgid "Passing multiple animations for the same :class:`Mobject` in one call to :meth:`~.Scene.play` is discouraged and will most likely not work properly. Instead of writing an animation like" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:25 msgid "make use of method chaining." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:27 msgid "Keyword arguments that can be passed to :meth:`.Scene.play` can be passed directly after accessing ``.animate``, like so::" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:32 msgid "This is especially useful when animating simultaneous ``.animate`` calls that you want to behave differently::" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:89 msgid "``.animate``" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animate:85 msgid "will interpolate the :class:`~.Mobject` between its points prior to ``.animate`` and its points after applying ``.animate`` to it. This may result in unexpected behavior when attempting to interpolate along paths, or rotations. If you want animations to consider the points between, consider using :class:`~.ValueTracker` with updaters instead." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animation_override_for:3 msgid "The animation class for which the override function should be returned." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.animation_override_for:5 msgid "The function returning the override animation or ``None`` if no such animation override is defined." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.apply_complex_function:1 msgid "Applies a complex function to a :class:`Mobject`. The x and y coordinates correspond to the real and imaginary parts respectively." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.apply_complex_function:5 msgid "Example" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.apply_to_family:3 msgid "The function to apply to each mobject. ``func`` gets passed the respective (sub)mobject as parameter." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:3 msgid "The number of rows in the grid." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:4 msgid "The number of columns in the grid." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:5 msgid "The gap between grid cells. To specify a different buffer in the horizontal and vertical directions, a tuple of two values can be given - ``(row, col)``." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:7 msgid "The way each submobject is aligned in its grid cell." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:8 msgid "The vertical alignment for each row (top to bottom). Accepts the following characters: ``\"u\"`` - up, ``\"c\"`` - center, ``\"d\"`` - down." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:10 msgid "The horizontal alignment for each column (left to right). Accepts the following characters ``\"l\"`` - left, ``\"c\"`` - center, ``\"r\"`` - right." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:12 msgid "Defines a list of heights for certain rows (top to bottom). If the list contains ``None``, the corresponding row will fit its height automatically based on the highest element in that row." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:15 msgid "Defines a list of widths for certain columns (left to right). If the list contains ``None``, the corresponding column will fit its width automatically based on the widest element in that column." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:17 msgid "The order in which submobjects fill the grid. Can be one of the following values: \"rd\", \"dr\", \"ld\", \"dl\", \"ru\", \"ur\", \"lu\", \"ul\". (\"rd\" -> fill rightwards then downwards)" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:23 msgid "If ``rows`` and ``cols`` are too small to fit all submobjects." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:24 msgid "If :code:`cols`, :code:`col_alignments` and :code:`col_widths` or :code:`rows`, :code:`row_alignments` and :code:`row_heights` have mismatching sizes." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:28 msgid "If only one of ``cols`` and ``rows`` is set implicitly, the other one will be chosen big enough to fit all submobjects. If neither is set, they will be chosen to be about the same, tending towards ``cols`` > ``rows`` (simply because videos are wider than they are high)." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.arrange_in_grid:32 msgid "If both ``cell_alignment`` and ``row_alignments`` / ``col_alignments`` are defined, the latter has higher priority." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.become:6 msgid "If both match_height and match_width are ``True`` then the transformed :class:`~.Mobject` will match the height first and then the width" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.become:9 msgid "If ``True``, then the transformed :class:`~.Mobject` will match the height of the original" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.become:10 msgid "If ``True``, then the transformed :class:`~.Mobject` will match the width of the original" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.become:11 msgid "If ``True``, then the transformed :class:`~.Mobject` will match the depth of the original" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.become:12 msgid "If ``True``, then the transformed :class:`~.Mobject` will match the center of the original" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.become:13 msgid "If ``True``, then the transformed :class:`~.Mobject` will stretch to fit the proportions of the original" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.clear_updaters:3 msgid "Whether to recursively call ``clear_updaters`` on all submobjects." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.copy:4 msgid "The copy." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.copy:7 msgid "The clone is initially not visible in the Scene, even if the original was." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.generate_points:3 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.init_colors:3 msgid "Gets called upon creation. This is an empty method that can be implemented by subclasses." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_critical_point:1 msgid "Picture a box bounding the :class:`~.Mobject`. Such a box has 9 'critical points': 4 corners, 4 edge center, the center. This returns one of them, along the given direction." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_point_mobject:1 msgid "The simplest :class:`~.Mobject` to be transformed to or from self. Should by a point of the appropriate type" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_time_based_updaters:3 msgid "The updaters use this parameter as the input for difference in time." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_time_based_updaters:5 msgid "The list of time based updaters." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_time_based_updaters:6 #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_updaters:4 msgid "List[:class:`Callable`]" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.get_updaters:3 msgid "The list of updaters." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.has_time_based_updater:3 msgid "**class** -- ``True`` if at least one updater uses the ``dt`` parameter, ``False`` otherwise." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.has_time_based_updater:5 msgid "`bool`" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.insert:3 msgid "Effectively just calls ``self.submobjects.insert(index, mobject)``, where ``self.submobjects`` is a list." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.insert:6 msgid "Highly adapted from ``Mobject.add``." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.insert:8 msgid "The index at which" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.insert:9 msgid "The mobject to be inserted." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.invert:3 msgid "If ``True``, all submobject lists of this mobject's family are inverted." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_updaters:3 msgid "The mobject whose updaters get matched." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_updaters:10 msgid "All updaters from submobjects are removed, but only updaters of the given mobject are matched, not those of it's submobjects." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_x:1 msgid "Match x coord. to the x coord. of another :class:`~.Mobject`." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_y:1 msgid "Match y coord. to the x coord. of another :class:`~.Mobject`." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.match_z:1 msgid "Match z coord. to the x coord. of another :class:`~.Mobject`." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove:3 msgid "The mobjects are removed from :attr:`submobjects`, if they exist." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove:5 msgid "Subclasses of mobject may implement ``-`` and ``-=`` dunder methods." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove:7 msgid "The mobjects to remove." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove_updater:3 msgid "If the same updater is applied multiple times, every instance gets removed." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.remove_updater:5 msgid "The update function to be removed." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.resume_updating:3 msgid "Whether to recursively enable updating on all submobjects." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.save_state:1 msgid "Save the current state (position, color & size). Can be restored with :meth:`~.Mobject.restore`." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale:3 msgid "Default behavior is to scale about the center of the mobject." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale:5 msgid "The scaling factor :math:`\\alpha`. If :math:`0 < |\\alpha|ย < 1`, the mobject will shrink, and for :math:`|\\alpha| > 1` it will grow. Furthermore, if :math:`\\alpha < 0`, the mobject is also flipped." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.scale:8 msgid "Additional keyword arguments passed to :meth:`apply_points_function_about_point`." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:3 msgid "I.e. ``my_mobject.set(foo=1)`` applies ``my_mobject.foo = 1``." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:5 msgid "This is a convenience to be used along with :attr:`animate` to animate setting attributes." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:8 msgid "In addition to this method, there is a compatibility layer that allows ``get_*`` and ``set_*`` methods to get and set generic attributes. For instance::" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:20 msgid "This compatibility layer does not interfere with any ``get_*`` or ``set_*`` methods that are explicitly defined." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:26 msgid "This compatibility layer is for backwards compatibility and is not guaranteed to stay around. Where applicable, please prefer getting/setting attributes normally or with the :meth:`set` method." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set:31 msgid "The attributes and corresponding values to set." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_color:1 msgid "Condition is function which takes in one arguments, (x, y, z). Here it just recurses to submobjects, but in subclasses this should be further implemented based on the the inner workings of color" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_default:3 msgid "If this method is called without any additional keyword arguments, the original default values of the initialization method of this class are restored." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_default:7 msgid "Passing any keyword argument will update the default values of the keyword arguments of the initialization function of this class." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index:3 msgid "The new value of :attr:`z_index` set." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index:4 msgid "If ``True``, the :attr:`z_index` value of all submobjects is also set." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index:6 msgid "The Mobject itself, after :attr:`z_index` is set. For chaining purposes. (Returns `self`.)" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.set_z_index_by_z_coordinate:3 msgid "The Mobject itself, after :attr:`z_index` is set. (Returns `self`.)" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.shift:3 msgid "Vectors to shift by. If multiple vectors are given, they are added together." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.suspend_updating:4 msgid "Whether to recursively suspend updating on all submobjects." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.update:3 msgid "Does nothing if updating is suspended." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.update:5 msgid "The parameter ``dt`` to pass to the update functions. Usually this is the time in seconds since the last call of ``update``." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.Mobject.update:7 msgid "Whether to recursively update all submobjects." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.mobject.pot000066400000000000000000000030161515024150700300550ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.mobject.rst:2 msgid "mobject" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject:1 msgid "Base classes for objects that can be displayed." msgstr "" #: ../../source/reference/manim.mobject.mobject.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.mobject.rst:28::1 msgid "Groups together multiple :class:`Mobjects <.Mobject>`." msgstr "" #: ../../source/reference/manim.mobject.mobject.rst:28::1 msgid "Mathematical Object: base class for objects that can be displayed on screen." msgstr "" #: ../../source/reference/manim.mobject.mobject.rst:31 msgid "Functions" msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.override_animate:1 msgid "Decorator for overriding method animations." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.override_animate:3 msgid "This allows to specify a method (returning an :class:`~.Animation`) which is called when the decorated method is used with the ``.animate`` syntax for animating the application of a method." msgstr "" #: ../../../manim/mobject/mobject.py:docstring of manim.mobject.mobject.override_animate:13 msgid "Overridden methods cannot be combined with normal or other overridden methods using method chaining with the ``.animate`` syntax." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.mobject_update_utils.pot000066400000000000000000000000011515024150700326260ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.number_line.NumberLine.pot000066400000000000000000000000011515024150700327570ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.number_line.UnitInterval.pot000066400000000000000000000000011515024150700333430ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.number_line.pot000066400000000000000000000000011515024150700307200ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.numbers.DecimalNumber.pot000066400000000000000000000000011515024150700326020ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.numbers.Integer.pot000066400000000000000000000000011515024150700314700ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.numbers.Variable.pot000066400000000000000000000000011515024150700316200ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.numbers.pot000066400000000000000000000000011515024150700300740ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.polyhedra.Dodecahedron.pot000066400000000000000000000000011515024150700327660ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.polyhedra.Icosahedron.pot000066400000000000000000000000011515024150700326450ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.polyhedra.Octahedron.pot000066400000000000000000000000011515024150700324750ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.polyhedra.Polyhedron.pot000066400000000000000000000000011515024150700325320ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.polyhedra.Tetrahedron.pot000066400000000000000000000000011515024150700326660ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.polyhedra.pot000066400000000000000000000000011515024150700304100ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.probability.BarChart.pot000066400000000000000000000000011515024150700324260ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.probability.SampleSpace.pot000066400000000000000000000000011515024150700331350ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.probability.pot000066400000000000000000000000011515024150700307410ustar00rootroot00000000000000 manim.mobject.shape_matchers.BackgroundRectangle.pot000066400000000000000000000000011515024150700352330ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.shape_matchers.Cross.pot000066400000000000000000000000011515024150700324770ustar00rootroot00000000000000 manim.mobject.shape_matchers.SurroundingRectangle.pot000066400000000000000000000000011515024150700354730ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.shape_matchers.Underline.pot000066400000000000000000000000011515024150700333330ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.shape_matchers.pot000066400000000000000000000000011515024150700314070ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.brace.ArcBrace.pot000066400000000000000000000057271515024150700317600ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.brace.ArcBrace.rst:2 msgid "ArcBrace" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.ArcBrace.rst:4 msgid "Qualified name: ``manim.mobject.svg.brace.ArcBrace``" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.ArcBrace:1 msgid "Bases: :py:class:`manim.mobject.svg.brace.Brace`" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.ArcBrace:1 msgid "Creates a :class:`~Brace` that wraps around an :class:`~.Arc`." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.ArcBrace:3 msgid "The direction parameter allows the brace to be applied from outside or inside the arc." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.ArcBrace:7 msgid "The :class:`ArcBrace` is smaller for arcs with smaller radii." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.ArcBrace:10 msgid "The :class:`ArcBrace` is initially a vertical :class:`Brace` defined by the length of the :class:`~.Arc`, but is scaled down to match the start and end angles. An exponential function is then applied after it is shifted based on the radius of the arc." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.ArcBrace:15 msgid "The scaling effect is not applied for arcs with radii smaller than 1 to prevent over-scaling." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.ArcBrace:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.ArcBrace:18 msgid "The :class:`~.Arc` that wraps around the :class:`Brace` mobject." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.ArcBrace:19 msgid "The direction from which the brace faces the arc. ``LEFT`` for inside the arc, and ``RIGHT`` for the outside." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.ArcBrace:23 msgid "Example" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.ArcBrace.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.ArcBrace.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.ArcBrace.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.ArcBrace.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.ArcBrace.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.ArcBrace.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.brace.Brace.pot000066400000000000000000000071171515024150700313250ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.brace.Brace.rst:2 msgid "Brace" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.Brace.rst:4 msgid "Qualified name: ``manim.mobject.svg.brace.Brace``" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace:1 msgid "Bases: :py:class:`manim.mobject.svg.svg_path.SVGPathMobject`" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace:1 msgid "Takes a mobject and draws a brace adjacent to it." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace:3 msgid "Passing a direction vector determines the direction from which the brace is drawn. By default it is drawn from below." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace:6 msgid "The mobject adjacent to which the brace is placed." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace:8 msgid "The direction from which the brace faces the mobject." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace:13 #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:6 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.Brace.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.Brace.rst:24::1 msgid "Uses :func:`~.space_ops.shoelace_direction` to calculate the direction." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.Brace.rst:26 msgid "Attributes" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:1 msgid "Uses :func:`~.space_ops.shoelace_direction` to calculate the direction. The direction of points determines in which direction the object is drawn, clockwise or counterclockwise." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:7 msgid "The default direction of a :class:`~.Circle` is counterclockwise::" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:13 msgid "Either ``\"CW\"`` or ``\"CCW\"``." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.Brace.get_direction:0 msgid "Return type" msgstr "" manim.mobject.svg.brace.BraceBetweenPoints.pot000066400000000000000000000051471515024150700337560ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.brace.BraceBetweenPoints.rst:2 msgid "BraceBetweenPoints" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceBetweenPoints.rst:4 msgid "Qualified name: ``manim.mobject.svg.brace.BraceBetweenPoints``" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.BraceBetweenPoints:1 msgid "Bases: :py:class:`manim.mobject.svg.brace.Brace`" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.BraceBetweenPoints:1 msgid "Similar to Brace, but instead of taking a mobject it uses 2 points to place the brace." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.BraceBetweenPoints:4 msgid "A fitting direction for the brace is computed, but it still can be manually overridden. If the points go from left to right, the brace is drawn from below. Swapping the points places the brace on the opposite side." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.BraceBetweenPoints:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.BraceBetweenPoints:9 msgid "The first point." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.BraceBetweenPoints:10 msgid "The second point." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.BraceBetweenPoints:11 msgid "The direction from which the brace faces towards the points." msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.BraceBetweenPoints:14 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceBetweenPoints.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceBetweenPoints.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceBetweenPoints.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceBetweenPoints.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceBetweenPoints.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceBetweenPoints.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.brace.BraceLabel.pot000066400000000000000000000025201515024150700322560ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.brace.BraceLabel.rst:2 msgid "BraceLabel" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceLabel.rst:4 msgid "Qualified name: ``manim.mobject.svg.brace.BraceLabel``" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.BraceLabel:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceLabel.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceLabel.rst:25 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceLabel.rst:36::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceLabel.rst:36::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceLabel.rst:36::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceLabel.rst:36::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.brace.BraceText.pot000066400000000000000000000024701515024150700321670ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.brace.BraceText.rst:2 msgid "BraceText" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceText.rst:4 msgid "Qualified name: ``manim.mobject.svg.brace.BraceText``" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace.BraceText:1 msgid "Bases: :py:class:`manim.mobject.svg.brace.BraceLabel`" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceText.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceText.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceText.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceText.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceText.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.BraceText.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.brace.pot000066400000000000000000000016401515024150700303050ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.brace.rst:2 msgid "brace" msgstr "" #: ../../../manim/mobject/svg/brace.py:docstring of manim.mobject.svg.brace:1 msgid "Mobject representing curly braces." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.svg.brace.rst:28::1 msgid "Creates a :class:`~Brace` that wraps around an :class:`~.Arc`." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.rst:28::1 msgid "Takes a mobject and draws a brace adjacent to it." msgstr "" #: ../../source/reference/manim.mobject.svg.brace.rst:28::1 msgid "Similar to Brace, but instead of taking a mobject it uses 2 points to place the brace." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.code_mobject.Code.pot000066400000000000000000000000011515024150700325050ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.code_mobject.pot000066400000000000000000000000011515024150700316340ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.pot000066400000000000000000000016071515024150700272350ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.rst:2 msgid "svg" msgstr "" #: ../../../manim/mobject/svg/__init__.py:docstring of manim.mobject.svg:1 msgid "Mobjects related to SVG images." msgstr "" #: ../../../manim/mobject/svg/__init__.py:docstring of manim.mobject.svg:4 msgid "Modules" msgstr "" #: ../../../manim/mobject/svg/__init__.py:docstring of manim.mobject.svg:13::1 msgid "Mobject representing curly braces." msgstr "" #: ../../../manim/mobject/svg/__init__.py:docstring of manim.mobject.svg:13::1 msgid "Utility functions for parsing SVG styles." msgstr "" #: ../../../manim/mobject/svg/__init__.py:docstring of manim.mobject.svg:13::1 msgid "Mobjects generated from an SVG file." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.style_utils.pot000066400000000000000000000115151515024150700316130ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.style_utils.rst:2 msgid "style\\_utils" msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils:1 msgid "Utility functions for parsing SVG styles." msgstr "" #: ../../source/reference/manim.mobject.svg.style_utils.rst:20 msgid "Functions" msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.cascade_element_style:1 msgid "Collect the element's style attributes based upon both its inheritance and its own attributes." msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.cascade_element_style:3 msgid "SVG uses cascading element styles. A closer ancestor's style takes precedence over a more distant ancestor's style. In order to correctly calculate the styles, the attributes are passed down through the inheritance tree, updating where necessary." msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.cascade_element_style:7 msgid "Note that this method only copies the values and does not parse them. See :meth:`parse_color_string` for converting from SVG attributes to manim keyword arguments." msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.cascade_element_style:0 #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.fill_default_values:0 #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_color_string:0 #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_style:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.cascade_element_style:10 msgid "Element of the SVG parse tree" msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.cascade_element_style:12 msgid "Dictionary of SVG attributes inherited from the parent element." msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.cascade_element_style:0 #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.fill_default_values:0 #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_color_string:0 #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_style:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.cascade_element_style:15 msgid "Dictionary mapping svg attributes to values with `element`'s values overriding inherited values." msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.cascade_element_style:0 #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.fill_default_values:0 #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_color_string:0 #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_style:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.fill_default_values:1 msgid "Fill in the default values for properties of SVG elements, if they are not currently set in the style dictionary." msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.fill_default_values:4 msgid "Style dictionary with SVG property names. Some may be missing." msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.fill_default_values:7 msgid "Style attributes; none are missing." msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_color_string:1 msgid "Handle the SVG-specific color strings and convert them to HTML #rrggbb format." msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_color_string:3 msgid "String in any web-compatible format" msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_color_string:6 msgid "Hexadecimal color string in the format `#rrggbb`" msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_style:1 msgid "Convert a dictionary of SVG attributes to Manim VMobject keyword arguments." msgstr "" #: ../../../manim/mobject/svg/style_utils.py:docstring of manim.mobject.svg.style_utils.parse_style:3 msgid "Style attributes as a string-to-string dictionary. Keys are valid SVG element attributes (fill, stroke, etc)" msgstr "" manim.mobject.svg.svg_mobject.SVGMobject.pot000066400000000000000000000116601515024150700334210ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.svg_mobject.SVGMobject.rst:2 msgid "SVGMobject" msgstr "" #: ../../source/reference/manim.mobject.svg.svg_mobject.SVGMobject.rst:4 msgid "Qualified name: ``manim.mobject.svg.svg\\_mobject.SVGMobject``" msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:1 msgid "A SVGMobject is a Vector Mobject constructed from an SVG (or XDV) file." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:3 msgid "SVGMobjects are constructed from the XML data within the SVG file structure. As such, subcomponents from the XML data can be accessed via the submobjects attribute. There is varying amounts of support for SVG elements, experiment with SVG files at your own peril." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:9 msgid "Examples" msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:16 msgid "The file's path name. When possible, the full path is preferred but a relative path may be used as well. Relative paths are relative to the directory specified by the `--assets_dir` command line argument." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:21 msgid "Whether the SVGMobject should be centered to the origin. Defaults to `True`." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:23 msgid "Specify the final height of the SVG file. Defaults to 2 units." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:25 msgid "Specify the width the SVG file should occupy. Defaults to `None`." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:27 msgid "Whether the hierarchies of VGroups generated should be flattened. Defaults to `True`." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:29 msgid "The stroke width of the outer edge of an SVG path element. Defaults to `4`." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject:31 msgid "Specifies the opacity of the image. `1` is opaque, `0` is transparent. Defaults to `1`." msgstr "" #: ../../source/reference/manim.mobject.svg.svg_mobject.SVGMobject.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.svg.svg_mobject.SVGMobject.rst:23::1 #: ../../source/reference/manim.mobject.svg.svg_mobject.SVGMobject.rst:23::1 msgid "Called by the Mobject abstract base class." msgstr "" #: ../../source/reference/manim.mobject.svg.svg_mobject.SVGMobject.rst:23::1 #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject.init_colors:1 msgid "Initializes the colors." msgstr "" #: ../../source/reference/manim.mobject.svg.svg_mobject.SVGMobject.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject.generate_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject.generate_points:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject.generate_points:1 #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject.SVGMobject.generate_points:1 msgid "Called by the Mobject abstract base class. Responsible for generating the SVGMobject's points from XML tags, populating self.mobjects, and any submobjects within self.mobjects." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.svg_mobject.pot000066400000000000000000000007461515024150700315410ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.svg_mobject.rst:2 msgid "svg\\_mobject" msgstr "" #: ../../../manim/mobject/svg/svg_mobject.py:docstring of manim.mobject.svg.svg_mobject:1 msgid "Mobjects generated from an SVG file." msgstr "" #: ../../source/reference/manim.mobject.svg.svg_mobject.rst:15 msgid "Classes" msgstr "" manim.mobject.svg.svg_path.SVGPathMobject.pot000066400000000000000000000120661515024150700335500ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.svg_path.SVGPathMobject.rst:2 msgid "SVGPathMobject" msgstr "" #: ../../source/reference/manim.mobject.svg.svg_path.SVGPathMobject.rst:4 msgid "Qualified name: ``manim.mobject.svg.svg\\_path.SVGPathMobject``" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../source/reference/manim.mobject.svg.svg_path.SVGPathMobject.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.svg.svg_path.SVGPathMobject.rst:26::1 #: ../../source/reference/manim.mobject.svg.svg_path.SVGPathMobject.rst:26::1 #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.generate_points:1 #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.generate_points:1 msgid "Generates points from a given an SVG ``d`` attribute." msgstr "" #: ../../source/reference/manim.mobject.svg.svg_path.SVGPathMobject.rst:26::1 #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.get_original_path_string:1 msgid "A simple getter for the path's ``d`` attribute." msgstr "" #: ../../source/reference/manim.mobject.svg.svg_path.SVGPathMobject.rst:26::1 #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.get_path_commands:1 msgid "Returns a list of possible path commands used within an SVG ``d`` attribute." msgstr "" #: ../../source/reference/manim.mobject.svg.svg_path.SVGPathMobject.rst:26::1 #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.handle_command:1 msgid "Core logic for handling each of the various path commands." msgstr "" #: ../../source/reference/manim.mobject.svg.svg_path.SVGPathMobject.rst:26::1 #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.string_to_points:1 msgid "Convert an SVG command string into a sequence of absolute-positioned control points." msgstr "" #: ../../source/reference/manim.mobject.svg.svg_path.SVGPathMobject.rst:28 msgid "Attributes" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.generate_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.generate_points:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.get_path_commands:4 msgid "See: https://svgwg.org/svg2-draft/paths.html#DProperty for further details on what each path command does." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.get_path_commands:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.get_path_commands:7 msgid "The various upper and lower cased path commands." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.get_path_commands:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.get_path_commands:8 msgid "List[:class:`str`]" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.string_to_points:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.string_to_points:3 msgid "A string containing a single uppercase letter representing the SVG command." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.string_to_points:5 msgid "Whether the command is relative to the end of the previous command" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.SVGPathMobject.string_to_points:7 msgid "A string that contains many comma- or space-separated numbers that defined the control points. Different commands require different numbers of numbers as arguments." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.svg_path.pot000066400000000000000000000057241515024150700310530ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.svg.svg_path.rst:2 msgid "svg\\_path" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path:1 msgid "Mobjects generated from an SVG pathstring." msgstr "" #: ../../source/reference/manim.mobject.svg.svg_path.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.svg.svg_path.rst:29 msgid "Functions" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.correct_out_of_range_radii:1 msgid "Correction of out-of-range radii." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.correct_out_of_range_radii:3 msgid "See: https://www.w3.org/TR/SVG11/implnote.html#ArcCorrectionOutOfRangeRadii" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.elliptical_arc_to_cubic_bezier:1 msgid "Generate cubic bezier points to approximate SVG elliptical arc." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.elliptical_arc_to_cubic_bezier:3 msgid "See: http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.get_elliptical_arc_center_parameters:1 msgid "Conversion from endpoint to center parameterization." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.get_elliptical_arc_center_parameters:3 msgid "See: https://www.w3.org/TR/SVG11/implnote.html#ArcConversionEndpointToCenter" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.grouped:1 msgid "Group iterable into arrays of n items." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.string_to_numbers:1 msgid "Parse the SVG string representing a sequence of numbers into an array of floats." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.string_to_numbers:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.string_to_numbers:3 msgid "String representing a sequence of numbers, separated by commas, spaces, etc." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.string_to_numbers:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.string_to_numbers:6 msgid "List of float values parsed out of the string." msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.string_to_numbers:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/svg/svg_path.py:docstring of manim.mobject.svg.svg_path.vector_angle:1 msgid "Calculate the dot product angle between two vectors." msgstr "" manim.mobject.svg.tex_mobject.BulletedList.pot000066400000000000000000000000011515024150700340360ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.tex_mobject.MathTex.pot000066400000000000000000000000011515024150700330730ustar00rootroot00000000000000 manim.mobject.svg.tex_mobject.SingleStringMathTex.pot000066400000000000000000000000011515024150700353450ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.tex_mobject.Tex.pot000066400000000000000000000000011515024150700322610ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.tex_mobject.TexSymbol.pot000066400000000000000000000000011515024150700334470ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.tex_mobject.Title.pot000066400000000000000000000000011515024150700326020ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.tex_mobject.pot000066400000000000000000000000011515024150700315220ustar00rootroot00000000000000 manim.mobject.svg.text_mobject.MarkupText.pot000066400000000000000000000000011515024150700337320ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference manim.mobject.svg.text_mobject.Paragraph.pot000066400000000000000000000000011515024150700335330ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.text_mobject.Text.pot000066400000000000000000000000011515024150700326310ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.svg.text_mobject.pot000066400000000000000000000000011515024150700317060ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.table.DecimalTable.pot000066400000000000000000000053761515024150700320410ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.table.DecimalTable.rst:2 msgid "DecimalTable" msgstr "" #: ../../source/reference/manim.mobject.table.DecimalTable.rst:4 msgid "Qualified name: ``manim.mobject.table.DecimalTable``" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.DecimalTable:1 msgid "Bases: :py:class:`manim.mobject.table.Table`" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.DecimalTable:1 msgid "A specialized :class:`~.Table` mobject for use with :class:`~.DecimalNumber` to display decimal entries." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.DecimalTable:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.DecimalTable:19 msgid "Special case of :class:`~.Table` with ``element_to_mobject`` set to :class:`~.DecimalNumber`. By default, ``num_decimal_places`` is set to 1. Will round/truncate the decimal places based on the provided ``element_to_mobject_config``." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.DecimalTable:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.DecimalTable:23 msgid "A 2D array, or a list of lists. Content of the table must be valid input for :class:`~.DecimalNumber`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.DecimalTable:25 msgid "The :class:`~.Mobject` class applied to the table entries. Set as :class:`~.DecimalNumber`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.DecimalTable:26 msgid "Element to mobject config, here set as {\"num_decimal_places\": 1}." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.DecimalTable:27 msgid "Additional arguments to be passed to :class:`~.Table`." msgstr "" #: ../../source/reference/manim.mobject.table.DecimalTable.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.table.DecimalTable.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.table.DecimalTable.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.table.DecimalTable.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.table.DecimalTable.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.table.DecimalTable.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.table.IntegerTable.pot000066400000000000000000000047071515024150700320750ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.table.IntegerTable.rst:2 msgid "IntegerTable" msgstr "" #: ../../source/reference/manim.mobject.table.IntegerTable.rst:4 msgid "Qualified name: ``manim.mobject.table.IntegerTable``" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.IntegerTable:1 msgid "Bases: :py:class:`manim.mobject.table.Table`" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.IntegerTable:1 msgid "A specialized :class:`~.Table` mobject for use with :class:`~.Integer`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.IntegerTable:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.IntegerTable:24 msgid "Special case of :class:`~.Table` with `element_to_mobject` set to :class:`~.Integer`. Will round if there are decimal entries in the table." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.IntegerTable:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.IntegerTable:27 msgid "A 2d array or list of lists. Content of the table has to be valid input for :class:`~.Integer`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.IntegerTable:29 msgid "The :class:`~.Mobject` class applied to the table entries. Set as :class:`~.Integer`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.IntegerTable:30 msgid "Additional arguments to be passed to :class:`~.Table`." msgstr "" #: ../../source/reference/manim.mobject.table.IntegerTable.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.table.IntegerTable.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.table.IntegerTable.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.table.IntegerTable.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.table.IntegerTable.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.table.IntegerTable.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.table.MathTable.pot000066400000000000000000000046151515024150700313670ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.table.MathTable.rst:2 msgid "MathTable" msgstr "" #: ../../source/reference/manim.mobject.table.MathTable.rst:4 msgid "Qualified name: ``manim.mobject.table.MathTable``" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MathTable:1 msgid "Bases: :py:class:`manim.mobject.table.Table`" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MathTable:1 msgid "A specialized :class:`~.Table` mobject for use with LaTeX." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MathTable:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MathTable:18 msgid "Special case of :class:`~.Table` with `element_to_mobject` set to :class:`~.MathTex`. Every entry in `table` is set in a Latex `align` environment." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MathTable:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MathTable:21 msgid "A 2d array or list of lists. Content of the table have to be valid input for :class:`~.MathTex`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MathTable:23 msgid "The :class:`~.Mobject` class applied to the table entries. Set as :class:`~.MathTex`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MathTable:24 msgid "Additional arguments to be passed to :class:`~.Table`." msgstr "" #: ../../source/reference/manim.mobject.table.MathTable.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.table.MathTable.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.table.MathTable.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.table.MathTable.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.table.MathTable.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.table.MathTable.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.table.MobjectTable.pot000066400000000000000000000047441515024150700320640ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.table.MobjectTable.rst:2 msgid "MobjectTable" msgstr "" #: ../../source/reference/manim.mobject.table.MobjectTable.rst:4 msgid "Qualified name: ``manim.mobject.table.MobjectTable``" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MobjectTable:1 msgid "Bases: :py:class:`manim.mobject.table.Table`" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MobjectTable:1 msgid "A specialized :class:`~.Table` mobject for use with :class:`~.Mobject`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MobjectTable:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MobjectTable:26 msgid "Special case of :class:`~.Table` with ``element_to_mobject`` set to an identity function. Here, every item in ``table`` must already be of type :class:`~.Mobject`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MobjectTable:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MobjectTable:29 msgid "A 2D array or list of lists. Content of the table must be of type :class:`~.Mobject`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MobjectTable:30 msgid "The :class:`~.Mobject` class applied to the table entries. Set as ``lambda m : m`` to return itself." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.MobjectTable:31 msgid "Additional arguments to be passed to :class:`~.Table`." msgstr "" #: ../../source/reference/manim.mobject.table.MobjectTable.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.table.MobjectTable.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.table.MobjectTable.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.table.MobjectTable.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.table.MobjectTable.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.table.MobjectTable.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.table.Table.pot000066400000000000000000000464461515024150700305650ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.table.Table.rst:2 msgid "Table" msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:4 msgid "Qualified name: ``manim.mobject.table.Table``" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:1 msgid "A mobject that displays a table on the screen." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:4 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_highlighted_cell:10 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:15 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_cell:12 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_col_labels:7 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_columns:7 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries:12 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries_without_labels:12 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_highlighted_cell:10 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_horizontal_lines:7 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_labels:7 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_row_labels:7 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_rows:7 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_vertical_lines:7 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.scale:15 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.set_column_colors:6 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.set_row_colors:6 msgid "Examples" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_background_to_entries:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_highlighted_cell:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_cell:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries_without_labels:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_highlighted_cell:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.scale:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.set_column_colors:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.set_row_colors:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:62 msgid "A 2D array or list of lists. Content of the table has to be a valid input for the callable set in ``element_to_mobject``." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:64 msgid "List of :class:`~.VMobject` representing the labels of each row." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:65 msgid "List of :class:`~.VMobject` representing the labels of each column." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:66 msgid "The top-left entry of the table, can only be specified if row and column labels are given." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:68 msgid "Vertical buffer passed to :meth:`~.Mobject.arrange_in_grid`, by default 0.8." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:69 msgid "Horizontal buffer passed to :meth:`~.Mobject.arrange_in_grid`, by default 1.3." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:70 msgid "``True`` if the table should include outer lines, by default False." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:71 msgid "``True`` if background rectangles should be added to entries, by default ``False``." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:72 msgid "Background color of entries if ``add_background_rectangles_to_entries`` is ``True``." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:73 msgid "``True`` if the table should have a background rectangle, by default ``False``." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:74 msgid "Background color of table if ``include_background_rectangle`` is ``True``." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:75 msgid "The :class:`~.Mobject` class applied to the table entries. by default :class:`~.Paragraph`. For common choices, see :mod:`~.text_mobject`/:mod:`~.tex_mobject`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:76 msgid "Custom configuration passed to :attr:`element_to_mobject`, by default {}." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:77 msgid "Dict passed to :meth:`~.Mobject.arrange_in_grid`, customizes the arrangement of the table." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:78 msgid "Dict passed to :class:`~.Line`, customizes the lines of the table." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table:79 msgid "Additional arguments to be passed to :class:`~.VGroup`." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_background_to_entries:1 msgid "Adds a black :class:`~.BackgroundRectangle` to each entry of the table." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_highlighted_cell:1 msgid "Highlights one cell at a specific position on the table by adding a :class:`~.BackgroundRectangle`." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:1 msgid "Customized create-type function for tables." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_cell:1 msgid "Returns one specific cell as a rectangular :class:`~.Polygon` without the entry." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_col_labels:1 msgid "Return the column labels of the table." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_columns:1 msgid "Return columns of the table as a :class:`~.VGroup` of :class:`~.VGroup`." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries:1 msgid "Return the individual entries of the table (including labels) or one specific entry if the parameter, ``pos``, is set." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries_without_labels:1 msgid "Return the individual entries of the table (without labels) or one specific entry if the parameter, ``pos``, is set." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_highlighted_cell:1 msgid "Returns a :class:`~.BackgroundRectangle` of the cell at the given position." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_horizontal_lines:1 msgid "Return the horizontal lines of the table." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_labels:1 msgid "Returns the labels of the table." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_row_labels:1 msgid "Return the row labels of the table." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_rows:1 msgid "Return the rows of the table as a :class:`~.VGroup` of :class:`~.VGroup`." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_vertical_lines:1 msgid "Return the vertical lines of the table." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.scale:1 msgid "Scale the size by a factor." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.set_column_colors:1 msgid "Set individual colors for each column of the table." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:36::1 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.set_row_colors:1 msgid "Set individual colors for each row of the table." msgstr "" #: ../../source/reference/manim.mobject.table.Table.rst:38 msgid "Attributes" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_background_to_entries:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_background_to_entries:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_background_to_entries:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_background_to_entries:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_background_to_entries:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_background_to_entries:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_highlighted_cell:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_cell:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_col_labels:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_columns:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries_without_labels:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_highlighted_cell:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_horizontal_lines:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_labels:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_row_labels:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_rows:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_vertical_lines:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.scale:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.set_column_colors:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.set_row_colors:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_highlighted_cell:3 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_cell:3 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries:4 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_highlighted_cell:3 msgid "The position of a specific entry on the table. ``(1,1)`` being the top left entry of the table." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_highlighted_cell:5 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_highlighted_cell:5 msgid "The color used to highlight the cell." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.add_highlighted_cell:6 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_highlighted_cell:6 msgid "Additional arguments to be passed to :class:`~.BackgroundRectangle`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:3 msgid "The run time of the line creation and the writing of the elements." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:4 msgid "The lag ratio of the animation." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:5 msgid "The animation style of the table lines, see :mod:`~.creation` for examples." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:6 msgid "The animation style of the table labels, see :mod:`~.creation` for examples." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:7 msgid "The animation style of the table elements, see :mod:`~.creation` for examples." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:8 msgid "Further arguments passed to the creation animations." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_cell:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_col_labels:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_columns:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries_without_labels:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_horizontal_lines:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_labels:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_row_labels:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_rows:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_vertical_lines:0 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.scale:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.create:11 msgid "AnimationGroup containing creation of the lines and of the elements." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_cell:5 msgid "Additional arguments to be passed to :class:`~.Polygon`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_cell:8 msgid "Polygon mimicking one specific cell of the Table." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_col_labels:3 msgid "VGroup containing the column labels of the table." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_columns:3 msgid ":class:`~.VGroup` containing each column in a :class:`~.VGroup`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries:7 msgid ":class:`~.VGroup` containing all entries of the table (including labels) or the :class:`~.VMobject` at the given position if ``pos`` is set." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries:9 #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries_without_labels:9 msgid "Union[:class:`~.VMobject`, :class:`~.VGroup`]" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries_without_labels:4 msgid "The position of a specific entry on the table. ``(1,1)`` being the top left entry of the table (without labels)." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_entries_without_labels:7 msgid ":class:`~.VGroup` containing all entries of the table (without labels) or the :class:`~.VMobject` at the given position if ``pos`` is set." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_horizontal_lines:3 msgid ":class:`~.VGroup` containing all the horizontal lines of the table." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_labels:3 msgid ":class:`~.VGroup` containing all the labels of the table." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_row_labels:3 msgid ":class:`~.VGroup` containing the row labels of the table." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_rows:3 msgid ":class:`~.VGroup` containing each row in a :class:`~.VGroup`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.get_vertical_lines:3 msgid ":class:`~.VGroup` containing all the vertical lines of the table." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.scale:3 msgid "Default behavior is to scale about the center of the mobject." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.scale:5 msgid "The scaling factor :math:`\\alpha`. If :math:`0 < |\\alpha|ย < 1`, the mobject will shrink, and for :math:`|\\alpha| > 1` it will grow. Furthermore, if :math:`\\alpha < 0`, the mobject is also flipped." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.scale:8 msgid "Additional keyword arguments passed to :meth:`apply_points_function_about_point`." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.scale:11 msgid "``self``" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table.Table.set_column_colors:3 msgid "An iterable of colors; each color corresponds to a column." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.table.pot000066400000000000000000000022451515024150700275240ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.table.rst:2 msgid "table" msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table:1 msgid "Mobjects representing tables." msgstr "" #: ../../../manim/mobject/table.py:docstring of manim.mobject.table:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.table.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.table.rst:28::1 msgid "A specialized :class:`~.Table` mobject for use with :class:`~.DecimalNumber` to display decimal entries." msgstr "" #: ../../source/reference/manim.mobject.table.rst:28::1 msgid "A specialized :class:`~.Table` mobject for use with :class:`~.Integer`." msgstr "" #: ../../source/reference/manim.mobject.table.rst:28::1 msgid "A specialized :class:`~.Table` mobject for use with LaTeX." msgstr "" #: ../../source/reference/manim.mobject.table.rst:28::1 msgid "A specialized :class:`~.Table` mobject for use with :class:`~.Mobject`." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.code_mobject.Code.pot000066400000000000000000000201071515024150700327030ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.code_mobject.Code.rst:2 msgid "Code" msgstr "" #: ../../source/reference/manim.mobject.text.code_mobject.Code.rst:4 msgid "Qualified name: ``manim.mobject.text.code\\_mobject.Code``" msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:1 msgid "A highlighted source code listing." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:3 msgid "An object ``listing`` of :class:`.Code` is a :class:`.VGroup` consisting of three objects:" msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:6 msgid "The background, ``listing.background_mobject``. This is either a :class:`.Rectangle` (if the listing has been initialized with ``background=\"rectangle\"``, the default option) or a :class:`.VGroup` resembling a window (if ``background=\"window\"`` has been passed)." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:11 msgid "The line numbers, ``listing.line_numbers`` (a :class:`.Paragraph` object)." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:14 msgid "The highlighted code itself, ``listing.code`` (a :class:`.Paragraph` object)." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:19 msgid "Using a :class:`.Transform` on text with leading whitespace (and in this particular case: code) can look `weird `_. Consider using :meth:`remove_invisible_chars` to resolve this issue." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:25 msgid "Examples" msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:26 msgid "Normal usage::" msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:39 msgid "We can also render code passed as a string (but note that the language has to be specified in this case):" msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:60 msgid "Name of the code file to display." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:62 msgid "If ``file_name`` is not specified, a code string can be passed directly." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:65 msgid "Number of space characters corresponding to a tab character. Defaults to 3." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:67 msgid "Amount of space between lines in relation to font size. Defaults to 0.3, which means 30% of font size." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:69 msgid "A number which scales displayed code. Defaults to 24." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:71 msgid "The name of the text font to be used. Defaults to ``\"Monospac821 BT\"``." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:73 msgid "Stroke width for text. 0 is recommended, and the default." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:75 msgid "Inner margin of text from the background. Defaults to 0.3." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:77 msgid "\"Indentation chars\" refers to the spaces/tabs at the beginning of a given code line. Defaults to ``\" \"`` (spaces)." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:79 msgid "Defines the background's type. Currently supports only ``\"rectangle\"`` (default) and ``\"window\"``." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:81 msgid "Defines the stroke width of the background. Defaults to 1." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:83 msgid "Defines the stroke color for the background. Defaults to ``WHITE``." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:85 msgid "Defines the corner radius for the background. Defaults to 0.2." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:87 msgid "Defines whether line numbers should be inserted in displayed code. Defaults to ``True``." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:89 msgid "Defines the first line's number in the line count. Defaults to 1." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:91 msgid "Defines the spacing between line numbers and displayed code. Defaults to 0.4." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:93 msgid "Defines the style type of displayed code. You can see possible names of styles in with :attr:`styles_list`. Defaults to ``\"vim\"``." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:95 msgid "Specifies the programming language the given code was written in. If ``None`` (the default), the language will be automatically detected. For the list of possible options, visit https://pygments.org/docs/lexers/ and look for 'aliases or short names'." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:100 msgid "Defines whether to generate highlighted html code to the folder `assets/codes/generated_html_files`. Defaults to `False`." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:105 msgid "The background of the code listing." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:0 #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:0 #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:0 msgid "type" msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:111 msgid "The line numbers for the code listing. Empty, if ``insert_line_no=False`` has been specified." msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject.Code:118 msgid "The highlighted code." msgstr "" #: ../../source/reference/manim.mobject.text.code_mobject.Code.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.code_mobject.Code.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.text.code_mobject.Code.rst:33::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.text.code_mobject.Code.rst:33::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.code_mobject.Code.rst:33::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.text.code_mobject.Code.rst:33::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.code_mobject.pot000066400000000000000000000010011515024150700320220ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.code_mobject.rst:2 msgid "code\\_mobject" msgstr "" #: ../../../manim/mobject/text/code_mobject.py:docstring of manim.mobject.text.code_mobject:1 msgid "Mobject representing highlighted source code listings." msgstr "" #: ../../source/reference/manim.mobject.text.code_mobject.rst:15 msgid "Classes" msgstr "" manim.mobject.text.numbers.DecimalNumber.pot000066400000000000000000000054011515024150700335170ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.numbers.DecimalNumber.rst:2 msgid "DecimalNumber" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.DecimalNumber.rst:4 msgid "Qualified name: ``manim.mobject.text.numbers.DecimalNumber``" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber:1 msgid "An mobject representing a decimal number." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.DecimalNumber.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.DecimalNumber.rst:22::1 #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber.set_value:1 msgid "Set the value of the :class:`~.DecimalNumber` to a new number." msgstr "" #: ../../source/reference/manim.mobject.text.numbers.DecimalNumber.rst:24 msgid "Attributes" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber.font_size:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber.font_size:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber.font_size:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber.font_size:1::1 #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber.font_size:1 msgid "The font size of the tex mobject." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber.font_size:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber.font_size:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber:0 #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.DecimalNumber.set_value:0 msgid "Parameters" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.numbers.Integer.pot000066400000000000000000000033321515024150700324650ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.numbers.Integer.rst:2 msgid "Integer" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Integer.rst:4 msgid "Qualified name: ``manim.mobject.text.numbers.Integer``" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Integer:1 msgid "Bases: :py:class:`manim.mobject.text.numbers.DecimalNumber`" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Integer:1 msgid "A class for displaying Integers." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Integer:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Integer.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Integer.rst:22 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Integer.rst:34::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Integer.rst:34::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Integer.rst:34::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Integer.rst:34::1 msgid "The font size of the tex mobject." msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Integer.rst:34::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.numbers.Variable.pot000066400000000000000000000100551515024150700326150ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.numbers.Variable.rst:2 msgid "Variable" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Variable.rst:4 msgid "Qualified name: ``manim.mobject.text.numbers.Variable``" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:1 msgid "A class for displaying text that shows \"label = value\" with the value continuously updated from a :class:`~.ValueTracker`." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:4 msgid "The initial value you need to keep track of and display." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:6 msgid "The label for your variable. Raw strings are convertex to :class:`~.MathTex` objects." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:8 msgid "The class used for displaying the number. Defaults to :class:`DecimalNumber`." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:10 msgid "The number of decimal places to display in your variable. Defaults to 2. If `var_type` is an :class:`Integer`, this parameter is ignored." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:13 msgid "Other arguments to be passed to `~.Mobject`." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:18 msgid "The label for your variable, for example ``x = ...``." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:0 #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:0 #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:0 msgid "type" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:20 msgid "Union[:class:`str`, :class:`~.Tex`, :class:`~.MathTex`, :class:`~.Text`, :class:`~.TexSymbol`, :class:`~.SingleStringMathTex`]" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:24 msgid "Useful in updating the value of your variable on-screen." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:30 msgid "The tex for the value of your variable." msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:32 msgid "Union[:class:`DecimalNumber`, :class:`Integer`]" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:35 msgid "Examples" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers.Variable:36 msgid "Normal usage::" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Variable.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Variable.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Variable.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Variable.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Variable.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.Variable.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.numbers.pot000066400000000000000000000013271515024150700310730ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.numbers.rst:2 msgid "numbers" msgstr "" #: ../../../manim/mobject/text/numbers.py:docstring of manim.mobject.text.numbers:1 msgid "Mobjects representing numbers." msgstr "" #: ../../source/reference/manim.mobject.text.numbers.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.text.numbers.rst:24::1 msgid "An mobject representing a decimal number." msgstr "" #: ../../source/reference/manim.mobject.text.numbers.rst:24::1 msgid "A class for displaying Integers." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.pot000066400000000000000000000016741515024150700274260ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.rst:2 msgid "text" msgstr "" #: ../../../manim/mobject/text/__init__.py:docstring of manim.mobject.text:1 msgid "Mobjects used to display Text using Pango or LaTeX." msgstr "" #: ../../../manim/mobject/text/__init__.py:docstring of manim.mobject.text:4 msgid "Modules" msgstr "" #: ../../../manim/mobject/text/__init__.py:docstring of manim.mobject.text:13::1 msgid "Mobject representing highlighted source code listings." msgstr "" #: ../../../manim/mobject/text/__init__.py:docstring of manim.mobject.text:13::1 msgid "Mobjects representing numbers." msgstr "" #: ../../../manim/mobject/text/__init__.py:docstring of manim.mobject.text:13::1 msgid "Mobjects representing text rendered using LaTeX." msgstr "" manim.mobject.text.tex_mobject.BulletedList.pot000066400000000000000000000032771515024150700342450ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.tex_mobject.BulletedList.rst:2 msgid "BulletedList" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.BulletedList.rst:4 msgid "Qualified name: ``manim.mobject.text.tex\\_mobject.BulletedList``" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.BulletedList:1 msgid "Bases: :py:class:`manim.mobject.text.tex_mobject.Tex`" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.BulletedList:2 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.BulletedList.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.BulletedList.rst:22 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.BulletedList.rst:34::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.BulletedList.rst:34::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.BulletedList.rst:34::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.BulletedList.rst:34::1 msgid "The font size of the tex mobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.BulletedList.rst:34::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.tex_mobject.MathTex.pot000066400000000000000000000046161515024150700333000ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.tex_mobject.MathTex.rst:2 msgid "MathTex" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.MathTex.rst:4 msgid "Qualified name: ``manim.mobject.text.tex\\_mobject.MathTex``" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.MathTex:1 msgid "Bases: :py:class:`manim.mobject.text.tex_mobject.SingleStringMathTex`" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.MathTex:1 msgid "A string compiled with LaTeX in math mode." msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.MathTex:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.MathTex:14 msgid "Tests" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.MathTex:15 msgid "Check that creating a :class:`~.MathTex` works::" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.MathTex:20 msgid "Check that double brace group splitting works correctly::" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.MathTex.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.MathTex.rst:28 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.MathTex.rst:40::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.MathTex.rst:40::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.MathTex.rst:40::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.MathTex.rst:40::1 msgid "The font size of the tex mobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.MathTex.rst:40::1 msgid "The height of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.MathTex.rst:40::1 msgid "The width of the mobject." msgstr "" manim.mobject.text.tex_mobject.SingleStringMathTex.pot000066400000000000000000000060501515024150700355440ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.tex_mobject.SingleStringMathTex.rst:2 msgid "SingleStringMathTex" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.SingleStringMathTex.rst:4 msgid "Qualified name: ``manim.mobject.text.tex\\_mobject.SingleStringMathTex``" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex:1 msgid "Bases: :py:class:`manim.mobject.svg.svg_mobject.SVGMobject`" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex:1 msgid "Elementary building block for rendering text with LaTeX." msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex:4 msgid "Tests" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex:5 msgid "Check that creating a :class:`~.SingleStringMathTex` object works::" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.SingleStringMathTex.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.SingleStringMathTex.rst:22::1 #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex.init_colors:1 msgid "Initializes the colors." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.SingleStringMathTex.rst:24 msgid "Attributes" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex.font_size:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex.font_size:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex.font_size:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex.font_size:1::1 #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex.font_size:1 msgid "The font size of the tex mobject." msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex.font_size:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex.font_size:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.SingleStringMathTex:0 msgid "Parameters" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.tex_mobject.Tex.pot000066400000000000000000000036131515024150700324620ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.tex_mobject.Tex.rst:2 msgid "Tex" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Tex.rst:4 msgid "Qualified name: ``manim.mobject.text.tex\\_mobject.Tex``" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.Tex:1 msgid "Bases: :py:class:`manim.mobject.text.tex_mobject.MathTex`" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.Tex:1 msgid "A string compiled with LaTeX in normal mode." msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.Tex:4 msgid "Tests" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.Tex:5 msgid "Check whether writing a LaTeX string works::" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Tex.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Tex.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Tex.rst:33::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Tex.rst:33::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Tex.rst:33::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Tex.rst:33::1 msgid "The font size of the tex mobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Tex.rst:33::1 msgid "The height of the mobject." msgstr "" manim.mobject.text.tex_mobject.TexSymbol.pot000066400000000000000000000030541515024150700335700ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.tex_mobject.TexSymbol.rst:2 msgid "TexSymbol" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.TexSymbol.rst:4 msgid "Qualified name: ``manim.mobject.text.tex\\_mobject.TexSymbol``" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.TexSymbol:1 msgid "Bases: :py:class:`manim.mobject.svg.svg_path.SVGPathMobject`" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.TexSymbol:1 msgid "Purely a renaming of SVGPathMobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.TexSymbol.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.TexSymbol.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.TexSymbol.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.TexSymbol.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.TexSymbol.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.TexSymbol.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.tex_mobject.Title.pot000066400000000000000000000031441515024150700330020ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.tex_mobject.Title.rst:2 msgid "Title" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Title.rst:4 msgid "Qualified name: ``manim.mobject.text.tex\\_mobject.Title``" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.Title:1 msgid "Bases: :py:class:`manim.mobject.text.tex_mobject.Tex`" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject.Title:2 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Title.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Title.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Title.rst:33::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Title.rst:33::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Title.rst:33::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Title.rst:33::1 msgid "The font size of the tex mobject." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.Title.rst:33::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.tex_mobject.pot000066400000000000000000000032261515024150700317230ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.tex_mobject.rst:2 msgid "tex\\_mobject" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject:1 msgid "Mobjects representing text rendered using LaTeX." msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject:5 msgid "See the corresponding tutorial :ref:`rendering-with-latex`" msgstr "" #: ../../../manim/mobject/text/tex_mobject.py:docstring of manim.mobject.text.tex_mobject:9 msgid "Just as you can use :class:`~.Text` (from the module :mod:`~.text_mobject`) to add text to your videos, you can use :class:`~.Tex` and :class:`~.MathTex` to insert LaTeX." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.rst:0 #: ../../source/reference/manim.mobject.text.tex_mobject.rst:0 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.rst:30::1 msgid "A string compiled with LaTeX in math mode." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.rst:30::1 msgid "Elementary building block for rendering text with LaTeX." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.rst:30::1 msgid "A string compiled with LaTeX in normal mode." msgstr "" #: ../../source/reference/manim.mobject.text.tex_mobject.rst:30::1 msgid "Purely a renaming of SVGPathMobject." msgstr "" manim.mobject.text.text_mobject.MarkupText.pot000066400000000000000000000300731515024150700341330ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.text_mobject.MarkupText.rst:2 msgid "MarkupText" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.MarkupText.rst:4 msgid "Qualified name: ``manim.mobject.text.text\\_mobject.MarkupText``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:1 msgid "Bases: :py:class:`manim.mobject.svg.svg_mobject.SVGMobject`" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:1 msgid "Display (non-LaTeX) text rendered using `Pango `_." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:3 msgid "Text objects behave like a :class:`.VGroup`-like iterable of all characters in the given text. In particular, slicing is possible." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:6 msgid "**What is PangoMarkup?**" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:8 msgid "PangoMarkup is a small markup language like html and it helps you avoid using \"range of characters\" while coloring or styling a piece a Text. You can use this language with :class:`~.MarkupText`." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:12 msgid "A simple example of a marked-up string might be::" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:16 msgid "and it can be used with :class:`~.MarkupText` as" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:26 msgid "A more elaborate example would be:" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:42 msgid "PangoMarkup can also contain XML features such as numeric character entities such as ``©`` for ยฉ can be used too." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:45 msgid "The most general markup tag is ````, then there are some convenience tags." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:48 msgid "Here is a list of supported tags:" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:50 msgid "``bold``, ``italic`` and ``bold+italic``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:51 msgid "``
    underline
`` and ``strike through``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:52 msgid "``typewriter font``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:53 msgid "``bigger font`` and ``smaller font``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:54 msgid "``superscript`` and ``subscript``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:55 msgid "``double underline``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:56 msgid "``error underline``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:57 msgid "``overline``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:58 msgid "``strikethrough``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:59 msgid "``temporary change of font``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:60 msgid "``temporary change of color``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:61 msgid "``temporary change of color``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:62 msgid "``temporary gradient``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:64 msgid "For ```` markup, colors can be specified either as hex triples like ``#aabbcc`` or as named CSS colors like ``AliceBlue``. The ```` tag is handled by Manim rather than Pango, and supports hex triplets or Manim constants like ``RED`` or ``RED_A``. If you want to use Manim constants like ``RED_A`` together with ````, you will need to use Python's f-String syntax as follows::" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:76 msgid "If your text contains ligatures, the :class:`MarkupText` class may incorrectly determine the first and last letter when creating the gradient. This is due to the fact that ``fl`` are two separate characters, but might be set as one single glyph - a ligature. If your language does not depend on ligatures, consider setting ``disable_ligatures`` to ``True``. If you must use ligatures, the ``gradient`` tag supports an optional attribute ``offset`` which can be used to compensate for that error." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:84 msgid "For example:" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:86 msgid "``example`` to *start* the gradient one letter earlier" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:87 msgid "``example`` to *end* the gradient one letter earlier" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:88 msgid "``example`` to *start* the gradient two letters earlier and *end* it one letter earlier" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:90 msgid "Specifying a second offset may be necessary if the text to be colored does itself contain ligatures. The same can happen when using HTML entities for special chars." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:94 msgid "When using ``underline``, ``overline`` or ``strikethrough`` together with ```` tags, you will also need to use the offset, because underlines are additional paths in the final :class:`SVGMobject`. Check out the following example." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:99 msgid "Escaping of special characters: ``>`` **should** be written as ``>`` whereas ``<`` and ``&`` *must* be written as ``<`` and ``&``." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:103 msgid "You can find more information about Pango markup formatting at the corresponding documentation page: `Pango Markup `_. Please be aware that not all features are supported by this class and that the ```` tag mentioned above is not supported by Pango." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:109 msgid "The text that needs to be created as mobject." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:110 msgid "The fill opacity, with 1 meaning opaque and 0 meaning transparent." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:111 msgid "Stroke width." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:112 msgid "Font size." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:113 msgid "Line spacing." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:114 msgid "Global font setting for the entire text. Local overrides are possible." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:115 msgid "Global slant setting, e.g. `NORMAL` or `ITALIC`. Local overrides are possible." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:116 msgid "Global weight setting, e.g. `NORMAL` or `BOLD`. Local overrides are possible." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:117 msgid "Global gradient setting. Local overrides are possible." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:119 msgid "The text displayed in form of a :class:`.VGroup`-like mobject." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:123 msgid "Examples" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:224 msgid "As :class:`MarkupText` uses Pango to render text, rendering non-English characters is easily possible:" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:243 msgid "You can justify the text by passing :attr:`justify` parameter." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:278 msgid "Tests" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.MarkupText:279 msgid "Check that the creation of :class:`~.MarkupText` works::" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.MarkupText.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.MarkupText.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.MarkupText.rst:33::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.MarkupText.rst:33::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.MarkupText.rst:33::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.MarkupText.rst:33::1 msgid "The height of the mobject." msgstr "" manim.mobject.text.text_mobject.Paragraph.pot000066400000000000000000000057661515024150700337470ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.text_mobject.Paragraph.rst:2 msgid "Paragraph" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Paragraph.rst:4 msgid "Qualified name: ``manim.mobject.text.text\\_mobject.Paragraph``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Paragraph:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Paragraph:1 msgid "Display a paragraph of text." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Paragraph:3 msgid "For a given :class:`.Paragraph` ``par``, the attribute ``par.chars`` is a :class:`.VGroup` containing all the lines. In this context, every line is constructed as a :class:`.VGroup` of characters contained in the line." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Paragraph:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Paragraph:8 msgid "Represents the spacing between lines. Defaults to -1, which means auto." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Paragraph:9 msgid "Defines the alignment of paragraph. Defaults to None. Possible values are \"left\", \"right\" or \"center\"." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Paragraph:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Paragraph:12 msgid "Examples" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Paragraph:13 msgid "Normal usage::" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Paragraph:20 msgid "Remove unwanted invisible characters::" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Paragraph.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Paragraph.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Paragraph.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Paragraph.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Paragraph.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Paragraph.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.text_mobject.Text.pot000066400000000000000000000072341515024150700330350ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.text_mobject.Text.rst:2 msgid "Text" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Text.rst:4 msgid "Qualified name: ``manim.mobject.text.text\\_mobject.Text``" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:1 msgid "Bases: :py:class:`manim.mobject.svg.svg_mobject.SVGMobject`" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:1 msgid "Display (non-LaTeX) text rendered using `Pango `_." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:3 msgid "Text objects behave like a :class:`.VGroup`-like iterable of all characters in the given text. In particular, slicing is possible." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:6 msgid "The text that needs to be created as a mobject." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:8 msgid "The mobject-like :class:`.VGroup`." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:12 msgid "Examples" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:61 msgid "As :class:`Text` uses Pango to render text, rendering non-English characters is easily possible:" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:94 msgid "Tests" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text:95 msgid "Check that the creation of :class:`~.Text` works::" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Text.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Text.rst:20::1 #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text.init_colors:1 msgid "Initializes the colors." msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.Text.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text.init_colors:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text.init_colors:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text.init_colors:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text.init_colors:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.Text.init_colors:1::1 msgid "The width of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.text.text_mobject.pot000066400000000000000000000124421515024150700321070ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.text.text_mobject.rst:2 msgid "text\\_mobject" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject:1 msgid "Mobjects used for displaying (non-LaTeX) text." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject:4 msgid "Just as you can use :class:`~.Tex` and :class:`~.MathTex` (from the module :mod:`~.tex_mobject`) to insert LaTeX to your videos, you can use :class:`~.Text` to to add normal text." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject:9 msgid "See the corresponding tutorial :ref:`rendering-with-latex`" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject:12 msgid "The simplest way to add text to your animations is to use the :class:`~.Text` class. It uses the Pango library to render text. With Pango, you are also able to render non-English alphabets like `ไฝ ๅฅฝ` or `ใ“ใ‚“ใซใกใฏ` or `์•ˆ๋…•ํ•˜์„ธ์š”` or `ู…ุฑุญุจุง ุจุงู„ุนุงู„ู…`." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject:16 #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:13 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.rst:30::1 #: ../../source/reference/manim.mobject.text.text_mobject.rst:30::1 msgid "Display (non-LaTeX) text rendered using `Pango `_." msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.rst:30::1 msgid "Display a paragraph of text." msgstr "" #: ../../source/reference/manim.mobject.text.text_mobject.rst:33 msgid "Functions" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:1 msgid "Temporarily add a font file to Pango's search path." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:3 msgid "This searches for the font_file at various places. The order it searches it described below." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:5 msgid "Absolute path." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:6 msgid "In ``assets/fonts`` folder." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:7 msgid "In ``font/`` folder." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:8 msgid "In the same directory." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:0 #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:0 #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.remove_invisible_chars:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:10 msgid "The font file to add." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:14 msgid "Use ``with register_font(...)`` to add a font file to search path." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:0 msgid "Raises" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:22 msgid "If the font doesn't exists." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:23 msgid "If this method is used on macOS." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.register_font:24 msgid "This method is available for macOS for ``ManimPango>=v0.2.3``. Using this method with previous releases will raise an :class:`AttributeError` on macOS." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.remove_invisible_chars:1 msgid "Function to remove unwanted invisible characters from some mobjects." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.remove_invisible_chars:3 msgid "Any SVGMobject from which we want to remove unwanted invisible characters." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.remove_invisible_chars:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.remove_invisible_chars:5 msgid "The SVGMobject without unwanted invisible characters." msgstr "" #: ../../../manim/mobject/text/text_mobject.py:docstring of manim.mobject.text.text_mobject.remove_invisible_chars:0 msgid "Return type" msgstr "" manim.mobject.three_d.polyhedra.Dodecahedron.pot000066400000000000000000000041231515024150700343310ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.polyhedra.Dodecahedron.rst:2 msgid "Dodecahedron" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Dodecahedron.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.polyhedra.Dodecahedron``" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Dodecahedron:1 msgid "Bases: :py:class:`manim.mobject.three_d.polyhedra.Polyhedron`" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Dodecahedron:1 msgid "A dodecahedron, one of the five platonic solids. It has 12 faces, 30 edges and 20 vertices." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Dodecahedron:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Dodecahedron:3 msgid "The length of an edge between any two vertices." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Dodecahedron:6 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Dodecahedron.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Dodecahedron.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Dodecahedron.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Dodecahedron.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Dodecahedron.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Dodecahedron.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.three_d.polyhedra.Icosahedron.pot000066400000000000000000000041041515024150700342070ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.polyhedra.Icosahedron.rst:2 msgid "Icosahedron" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Icosahedron.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.polyhedra.Icosahedron``" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Icosahedron:1 msgid "Bases: :py:class:`manim.mobject.three_d.polyhedra.Polyhedron`" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Icosahedron:1 msgid "An icosahedron, one of the five platonic solids. It has 20 faces, 30 edges and 12 vertices." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Icosahedron:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Icosahedron:3 msgid "The length of an edge between any two vertices." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Icosahedron:6 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Icosahedron.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Icosahedron.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Icosahedron.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Icosahedron.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Icosahedron.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Icosahedron.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.three_d.polyhedra.Octahedron.pot000066400000000000000000000040621515024150700340420ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.polyhedra.Octahedron.rst:2 msgid "Octahedron" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Octahedron.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.polyhedra.Octahedron``" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Octahedron:1 msgid "Bases: :py:class:`manim.mobject.three_d.polyhedra.Polyhedron`" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Octahedron:1 msgid "An octahedron, one of the five platonic solids. It has 8 faces, 12 edges and 6 vertices." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Octahedron:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Octahedron:3 msgid "The length of an edge between any two vertices." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Octahedron:6 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Octahedron.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Octahedron.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Octahedron.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Octahedron.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Octahedron.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Octahedron.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.three_d.polyhedra.Polyhedron.pot000066400000000000000000000137731515024150700341100ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.polyhedra.Polyhedron.rst:2 msgid "Polyhedron" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Polyhedron.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.polyhedra.Polyhedron``" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:1 msgid "An abstract polyhedra class." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:3 msgid "In this implementation, polyhedra are defined with a list of vertex coordinates in space, and a list of faces. This implementation mirrors that of a standard polyhedral data format (OFF, object file format)." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:0 #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.create_faces:0 #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.get_edges:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:6 msgid "A list of coordinates of the corresponding vertices in the polyhedron. Each coordinate will correspond to a vertex. The vertices are indexed with the usual indexing of Python." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:8 msgid "A list of faces. Each face is a sublist containing the indices of the vertices that form the corners of that face." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:9 msgid "Configuration for the polygons representing the faces of the polyhedron." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:10 msgid "Configuration for the graph containing the vertices and edges of the polyhedron." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:13 msgid "Examples" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:14 msgid "To understand how to create a custom polyhedra, let's use the example of a rather simple one - a square pyramid." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:39 msgid "In defining the polyhedron above, we first defined the coordinates of the vertices. These are the corners of the square base, given as the first four coordinates in the vertex list, and the apex, the last coordinate in the list." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:43 msgid "Next, we define the faces of the polyhedron. The triangular surfaces of the pyramid are polygons with two adjacent vertices in the base and the vertex at the apex as corners. We thus define these surfaces in the first four elements of our face list. The last element defines the base of the pyramid." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron:47 msgid "The graph and faces of polyhedra can also be accessed and modified directly, after instantiation. They are stored in the `graph` and `faces` attributes respectively." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Polyhedron.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Polyhedron.rst:23::1 #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.create_faces:1 msgid "Creates VGroup of faces from a list of face coordinates." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Polyhedron.rst:23::1 msgid "Extracts the coordinates of the vertices in the graph." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Polyhedron.rst:23::1 #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.get_edges:1 msgid "Creates list of cyclic pairwise tuples." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Polyhedron.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.create_faces:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.create_faces:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.create_faces:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.create_faces:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.create_faces:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.create_faces:0 #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.extract_face_coords:0 #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Polyhedron.get_edges:0 msgid "Return type" msgstr "" manim.mobject.three_d.polyhedra.Tetrahedron.pot000066400000000000000000000041011515024150700342250ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.polyhedra.Tetrahedron.rst:2 msgid "Tetrahedron" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Tetrahedron.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.polyhedra.Tetrahedron``" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Tetrahedron:1 msgid "Bases: :py:class:`manim.mobject.three_d.polyhedra.Polyhedron`" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Tetrahedron:1 msgid "A tetrahedron, one of the five platonic solids. It has 4 faces, 6 edges, and 4 vertices." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Tetrahedron:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Tetrahedron:3 msgid "The length of an edge between any two vertices." msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra.Tetrahedron:6 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Tetrahedron.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Tetrahedron.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Tetrahedron.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Tetrahedron.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Tetrahedron.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.Tetrahedron.rst:32::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_d.polyhedra.pot000066400000000000000000000020621515024150700320320ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.polyhedra.rst:2 msgid "polyhedra" msgstr "" #: ../../../manim/mobject/three_d/polyhedra.py:docstring of manim.mobject.three_d.polyhedra:1 msgid "General polyhedral class and platonic solids." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.rst:28::1 msgid "A dodecahedron, one of the five platonic solids." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.rst:28::1 msgid "An icosahedron, one of the five platonic solids." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.rst:28::1 msgid "An octahedron, one of the five platonic solids." msgstr "" #: ../../source/reference/manim.mobject.three_d.polyhedra.rst:28::1 msgid "An abstract polyhedra class." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_d.pot000066400000000000000000000016201515024150700300430ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.rst:2 msgid "three\\_d" msgstr "" #: ../../../manim/mobject/three_d/__init__.py:docstring of manim.mobject.three_d:1 #: ../../../manim/mobject/three_d/__init__.py:docstring of manim.mobject.three_d:12::1 msgid "Three-dimensional mobjects." msgstr "" #: ../../../manim/mobject/three_d/__init__.py:docstring of manim.mobject.three_d:4 msgid "Modules" msgstr "" #: ../../../manim/mobject/three_d/__init__.py:docstring of manim.mobject.three_d:12::1 msgid "General polyhedral class and platonic solids." msgstr "" #: ../../../manim/mobject/three_d/__init__.py:docstring of manim.mobject.three_d:12::1 msgid "Utility functions for three-dimensional mobjects." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_d.three_d_utils.pot000066400000000000000000000006571515024150700327050ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_d_utils.rst:2 msgid "three\\_d\\_utils" msgstr "" #: ../../../manim/mobject/three_d/three_d_utils.py:docstring of manim.mobject.three_d.three_d_utils:1 msgid "Utility functions for three-dimensional mobjects." msgstr "" manim.mobject.three_d.three_dimensions.Arrow3D.pot000066400000000000000000000054011515024150700346030ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Arrow3D.rst:2 msgid "Arrow3D" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Arrow3D.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.Arrow3D``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Arrow3D:1 msgid "Bases: :py:class:`manim.mobject.three_d.three_dimensions.Line3D`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Arrow3D:1 msgid "An arrow made out of a cylindrical line and a conical tip." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Arrow3D:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Arrow3D:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Arrow3D:15 msgid "The start position of the arrow." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Arrow3D:17 msgid "The end position of the arrow." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Arrow3D:19 msgid "The thickness of the arrow." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Arrow3D:21 msgid "The height of the conical tip." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Arrow3D:23 msgid "The base radius of the conical tip." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Arrow3D.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Arrow3D.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Arrow3D.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Arrow3D.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Arrow3D.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Arrow3D.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.three_d.three_dimensions.Cone.pot000066400000000000000000000125501515024150700342110ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cone.rst:2 msgid "Cone" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cone.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.Cone``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:1 msgid "Bases: :py:class:`manim.mobject.three_d.three_dimensions.Surface`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:1 msgid "A circular cone. Can be defined using 2 parameters: its height, and its base radius. The polar angle, theta, can be calculated using arctan(base_radius / height) The spherical radius, r, is calculated using the pythagorean theorem." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:8 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.get_direction:6 msgid "Examples" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:19 msgid "The base radius from which the cone tapers." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:21 msgid "The height measured from the plane formed by the base_radius to the apex of the cone." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:23 msgid "The direction of the apex." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:25 msgid "Whether to show the base plane or not." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:27 msgid "The azimuthal angle to start and end at." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:29 msgid "The radius at the apex." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone:31 msgid "Show checkerboard grid texture on the cone." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cone.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cone.rst:22::1 msgid "Converts from spherical coordinates to cartesian." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cone.rst:22::1 msgid "Uses :func:`~.space_ops.shoelace_direction` to calculate the direction." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cone.rst:24 msgid "Attributes" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.func:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.func:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.func:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.func:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.func:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.func:1 msgid "Converts from spherical coordinates to cartesian. :param u: The radius. :type u: :class:`float` :param v: The azimuthal angle. :type v: :class:`float`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.get_direction:1 msgid "Uses :func:`~.space_ops.shoelace_direction` to calculate the direction. The direction of points determines in which direction the object is drawn, clockwise or counterclockwise." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.get_direction:7 msgid "The default direction of a :class:`~.Circle` is counterclockwise::" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.get_direction:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.get_direction:13 msgid "Either ``\"CW\"`` or ``\"CCW\"``." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cone.get_direction:0 msgid "Return type" msgstr "" manim.mobject.three_d.three_dimensions.Cube.pot000066400000000000000000000045061515024150700342050ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cube.rst:2 msgid "Cube" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cube.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.Cube``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cube:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cube.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cube.rst:21::1 #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cube.rst:21::1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cube.generate_points:1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cube.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cube.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cube.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cube.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cube.generate_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cube.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cube.generate_points:1::1 msgid "The width of the mobject." msgstr "" manim.mobject.three_d.three_dimensions.Cylinder.pot000066400000000000000000000076631515024150700351070ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cylinder.rst:2 msgid "Cylinder" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cylinder.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.Cylinder``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder:1 msgid "Bases: :py:class:`manim.mobject.three_d.three_dimensions.Surface`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder:1 msgid "A cylinder, defined by its height, radius and direction," msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder:15 msgid "The radius of the cylinder." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder:17 msgid "The height of the cylinder." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder:19 msgid "The direction of the central axis of the cylinder." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder:21 msgid "The height along the height axis (given by direction) to start and end on." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder:23 msgid "Whether to show the end caps or not." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cylinder.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cylinder.rst:23::1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder.add_bases:1 msgid "Adds the end caps of the cylinder." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cylinder.rst:23::1 msgid "Converts from cylindrical coordinates to cartesian." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cylinder.rst:23::1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder.get_direction:1 msgid "Returns the direction of the central axis of the cylinder." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Cylinder.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder.add_bases:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder.add_bases:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder.add_bases:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder.add_bases:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Cylinder.add_bases:1::1 msgid "The width of the mobject." msgstr "" manim.mobject.three_d.three_dimensions.Dot3D.pot000066400000000000000000000045241515024150700342440ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Dot3D.rst:2 msgid "Dot3D" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Dot3D.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.Dot3D``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Dot3D:1 msgid "Bases: :py:class:`manim.mobject.three_d.three_dimensions.Sphere`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Dot3D:1 msgid "A spherical dot." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Dot3D:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Dot3D:3 msgid "The location of the dot." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Dot3D:5 msgid "The radius of the dot." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Dot3D:7 msgid "The color of the :class:`Dot3D`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Dot3D:11 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Dot3D.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Dot3D.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Dot3D.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Dot3D.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Dot3D.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Dot3D.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.three_d.three_dimensions.Line3D.pot000066400000000000000000000133651515024150700344100ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Line3D.rst:2 msgid "Line3D" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Line3D.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.Line3D``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D:1 msgid "Bases: :py:class:`manim.mobject.three_d.three_dimensions.Cylinder`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D:1 msgid "A cylindrical line, for use in ThreeDScene." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D:4 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.parallel_to:9 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.perpendicular_to:9 msgid "Examples" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D:0 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.parallel_to:0 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.perpendicular_to:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D:15 msgid "The start position of the line." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D:17 msgid "The end position of the line." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D:19 msgid "The thickness of the line." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Line3D.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Line3D.rst:25::1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.get_end:1 msgid "Returns the point, where the stroke that surrounds the :class:`~.Mobject` ends." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Line3D.rst:25::1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.get_start:1 msgid "Returns the point, where the stroke that surrounds the :class:`~.Mobject` starts." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Line3D.rst:25::1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.parallel_to:1 msgid "Returns a line parallel to another line going through a given point." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Line3D.rst:25::1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.perpendicular_to:1 msgid "Returns a line perpendicular to another line going through a given point." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Line3D.rst:25::1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.set_start_and_end_attrs:1 msgid "Sets the start and end points of the line." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Line3D.rst:27 msgid "Attributes" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.get_end:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.get_end:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.get_end:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.get_end:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.get_end:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.parallel_to:4 msgid "The line to be parallel to." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.parallel_to:5 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.perpendicular_to:5 msgid "The point to pass through." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.parallel_to:6 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.perpendicular_to:6 msgid "Additional parameters to be passed to the class." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Line3D.perpendicular_to:4 msgid "The line to be perpendicular to." msgstr "" manim.mobject.three_d.three_dimensions.Prism.pot000066400000000000000000000046211515024150700344170ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Prism.rst:2 msgid "Prism" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Prism.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.Prism``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Prism:1 msgid "Bases: :py:class:`manim.mobject.three_d.three_dimensions.Cube`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Prism:1 msgid "A cuboid." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Prism:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Prism.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Prism.rst:20::1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Prism.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Prism.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Prism.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Prism.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Prism.generate_points:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Prism.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Prism.generate_points:1::1 msgid "The width of the mobject." msgstr "" manim.mobject.three_d.three_dimensions.Sphere.pot000066400000000000000000000034241515024150700345530ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Sphere.rst:2 msgid "Sphere" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Sphere.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.Sphere``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Sphere:1 msgid "Bases: :py:class:`manim.mobject.three_d.three_dimensions.Surface`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Sphere:1 msgid "A mobject representing a three-dimensional sphere." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Sphere:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Sphere.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Sphere.rst:22 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Sphere.rst:33::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Sphere.rst:33::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Sphere.rst:33::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Sphere.rst:33::1 msgid "The height of the mobject." msgstr "" manim.mobject.three_d.three_dimensions.Surface.pot000066400000000000000000000122431515024150700347140ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Surface.rst:2 msgid "Surface" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Surface.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.Surface``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface:1 msgid "Creates a Parametric Surface using a checkerboard pattern." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface:0 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface:3 msgid "The function that defines the surface." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface:4 msgid "The range of the ``u`` variable: ``(u_min, u_max)``." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface:5 msgid "The range of the ``v`` variable: ``(v_min, v_max)``." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface:6 msgid "The number of samples taken of the surface. A tuple can be used to define different resolutions for ``u`` and ``v`` respectively." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface:0 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface:11 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:12 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Surface.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Surface.rst:21::1 #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:1 msgid "Sets the color of each mobject of a parametric surface to a color relative to its axis-value" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Surface.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:3 msgid "The axes for the parametric surface, which will be used to map axis-values to colors." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:4 msgid "A list of colors, ordered from lower axis-values to higher axis-values. If a list of tuples is passed containing colors paired with numbers, then those numbers will be used as the pivots." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:6 msgid "The chosen axis to use for the color mapping. (0 = x, 1 = y, 2 = z)" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Surface.set_fill_by_value:8 msgid "The parametric surface with a gradient applied by value. For chaining." msgstr "" manim.mobject.three_d.three_dimensions.ThreeDVMobject.pot000066400000000000000000000030451515024150700361310ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.ThreeDVMobject.rst:2 msgid "ThreeDVMobject" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.ThreeDVMobject.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.ThreeDVMobject``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.ThreeDVMobject:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.ThreeDVMobject.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.ThreeDVMobject.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.ThreeDVMobject.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.ThreeDVMobject.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.ThreeDVMobject.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.ThreeDVMobject.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.three_d.three_dimensions.Torus.pot000066400000000000000000000043161515024150700344420ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Torus.rst:2 msgid "Torus" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Torus.rst:4 msgid "Qualified name: ``manim.mobject.three\\_d.three\\_dimensions.Torus``" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Torus:1 msgid "Bases: :py:class:`manim.mobject.three_d.three_dimensions.Surface`" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Torus:1 msgid "A torus." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Torus:4 msgid "Examples" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Torus:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Torus:15 msgid "Distance from the center of the tube to the center of the torus." msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions.Torus:17 msgid "Radius of the tube." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Torus.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Torus.rst:22 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Torus.rst:33::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Torus.rst:33::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Torus.rst:33::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.Torus.rst:33::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_d.three_dimensions.pot000066400000000000000000000032301515024150700334000ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.three_d.three_dimensions.rst:2 msgid "three\\_dimensions" msgstr "" #: ../../../manim/mobject/three_d/three_dimensions.py:docstring of manim.mobject.three_d.three_dimensions:1 msgid "Three-dimensional mobjects." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.rst:40::1 msgid "An arrow made out of a cylindrical line and a conical tip." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.rst:40::1 msgid "A circular cone." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.rst:40::1 msgid "A cylinder, defined by its height, radius and direction," msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.rst:40::1 msgid "A spherical dot." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.rst:40::1 msgid "A cylindrical line, for use in ThreeDScene." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.rst:40::1 msgid "A cuboid." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.rst:40::1 msgid "A mobject representing a three-dimensional sphere." msgstr "" #: ../../source/reference/manim.mobject.three_d.three_dimensions.rst:40::1 msgid "Creates a Parametric Surface using a checkerboard pattern." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_d_utils.pot000066400000000000000000000000011515024150700312530ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.Arrow3D.pot000066400000000000000000000000011515024150700332400ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.Cone.pot000066400000000000000000000000011515024150700326430ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.Cube.pot000066400000000000000000000000011515024150700326350ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.Cylinder.pot000066400000000000000000000000011515024150700335300ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.Dot3D.pot000066400000000000000000000000011515024150700326740ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.Line3D.pot000066400000000000000000000000011515024150700330350ustar00rootroot00000000000000 manim.mobject.three_dimensions.ParametricSurface.pot000066400000000000000000000000011515024150700353000ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.Prism.pot000066400000000000000000000000011515024150700330510ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.Sphere.pot000066400000000000000000000000011515024150700332050ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.Surface.pot000066400000000000000000000000011515024150700333470ustar00rootroot00000000000000 manim.mobject.three_dimensions.ThreeDVMobject.pot000066400000000000000000000000011515024150700345050ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.Torus.pot000066400000000000000000000000011515024150700330730ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.three_dimensions.pot000066400000000000000000000000011515024150700317600ustar00rootroot00000000000000 manim.mobject.types.image_mobject.AbstractImageMobject.pot000066400000000000000000000122271515024150700363200ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.image_mobject.AbstractImageMobject.rst:2 msgid "AbstractImageMobject" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.AbstractImageMobject.rst:4 msgid "Qualified name: ``manim.mobject.types.image\\_mobject.AbstractImageMobject``" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject:1 msgid "Bases: :py:class:`manim.mobject.mobject.Mobject`" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject:1 msgid "Automatically filters out black pixels" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject:0 #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.set_resampling_algorithm:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject:3 msgid "At this resolution the image is placed pixel by pixel onto the screen, so it will look the sharpest and best. This is a custom parameter of ImageMobject so that rendering a scene with e.g. the ``--quality low`` or ``--quality medium`` flag for faster rendering won't effect the position of the image on the screen." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.AbstractImageMobject.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.AbstractImageMobject.rst:23::1 #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.reset_points:1 msgid "Sets :attr:`points` to be an empty array." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.AbstractImageMobject.rst:23::1 msgid "Condition is function which takes in one arguments, (x, y, z)." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.AbstractImageMobject.rst:23::1 msgid "Sets the interpolation method for upscaling the image." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.AbstractImageMobject.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.reset_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.reset_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.reset_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.reset_points:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.set_color:1 msgid "Condition is function which takes in one arguments, (x, y, z). Here it just recurses to submobjects, but in subclasses this should be further implemented based on the the inner workings of color" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.set_resampling_algorithm:1 msgid "Sets the interpolation method for upscaling the image. By default the image is interpolated using bicubic algorithm. This method lets you change it. Interpolation is done internally using Pillow, and the function besides the string constants describing the algorithm accepts the Pillow integer constants." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.set_resampling_algorithm:11 msgid "* 'bicubic' or 'cubic' * 'nearest' or 'none' * 'box' * 'bilinear' or 'linear' * 'hamming' * 'lanczos' or 'antialias'" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.set_resampling_algorithm:12 msgid "'bicubic' or 'cubic'" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.set_resampling_algorithm:13 msgid "'nearest' or 'none'" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.set_resampling_algorithm:14 msgid "'box'" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.set_resampling_algorithm:15 msgid "'bilinear' or 'linear'" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.AbstractImageMobject.set_resampling_algorithm:16 msgid "'hamming'" msgstr "" manim.mobject.types.image_mobject.ImageMobject.pot000066400000000000000000000130401515024150700346260ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobject.rst:2 msgid "ImageMobject" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobject.rst:4 msgid "Qualified name: ``manim.mobject.types.image\\_mobject.ImageMobject``" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject:1 msgid "Bases: :py:class:`manim.mobject.types.image_mobject.AbstractImageMobject`" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject:1 msgid "Displays an Image from a numpy array or a file." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject:0 #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.fade:0 #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.interpolate_color:0 #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.set_opacity:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject:3 msgid "At this resolution the image is placed pixel by pixel onto the screen, so it will look the sharpest and best. This is a custom parameter of ImageMobject so that rendering a scene with e.g. the ``--quality low`` or ``--quality medium`` flag for faster rendering won't effect the position of the image on the screen." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject:11 msgid "Example" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject:22 msgid "Changing interpolation style:" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobject.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobject.rst:25::1 #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.fade:1 msgid "Sets the image's opacity using a 1 - alpha relationship." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobject.rst:25::1 #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.get_pixel_array:1 msgid "A simple getter method." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobject.rst:25::1 #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.interpolate_color:1 msgid "Interpolates an array of pixel color values into another array of equal size." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobject.rst:25::1 msgid "Condition is function which takes in one arguments, (x, y, z)." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobject.rst:25::1 #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.set_opacity:1 msgid "Sets the image's opacity." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobject.rst:27 msgid "Attributes" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.fade:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.fade:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.fade:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.fade:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.fade:3 msgid "The alpha value of the object, 1 being transparent and 0 being opaque." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.fade:6 msgid "Whether the submobjects of the ImageMobject should be affected." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.interpolate_color:4 msgid "The ImageMobject to transform from." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.interpolate_color:6 msgid "The ImageMobject to transform into." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.interpolate_color:8 msgid "Used to track the lerp relationship. Not opacity related." msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobject.set_color:1 msgid "Condition is function which takes in one arguments, (x, y, z). Here it just recurses to submobjects, but in subclasses this should be further implemented based on the the inner workings of color" msgstr "" manim.mobject.types.image_mobject.ImageMobjectFromCamera.pot000066400000000000000000000026071515024150700365720ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobjectFromCamera.rst:2 msgid "ImageMobjectFromCamera" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobjectFromCamera.rst:4 msgid "Qualified name: ``manim.mobject.types.image\\_mobject.ImageMobjectFromCamera``" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject.ImageMobjectFromCamera:1 msgid "Bases: :py:class:`manim.mobject.types.image_mobject.AbstractImageMobject`" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobjectFromCamera.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobjectFromCamera.rst:24 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobjectFromCamera.rst:31::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobjectFromCamera.rst:31::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.ImageMobjectFromCamera.rst:31::1 msgid "The height of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.types.image_mobject.pot000066400000000000000000000014331515024150700323630ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.image_mobject.rst:2 msgid "image\\_mobject" msgstr "" #: ../../../manim/mobject/types/image_mobject.py:docstring of manim.mobject.types.image_mobject:1 msgid "Mobjects representing raster images." msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.rst:24::1 msgid "Automatically filters out black pixels" msgstr "" #: ../../source/reference/manim.mobject.types.image_mobject.rst:24::1 msgid "Displays an Image from a numpy array or a file." msgstr "" manim.mobject.types.point_cloud_mobject.Mobject1D.pot000066400000000000000000000024751515024150700353170ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject1D.rst:2 msgid "Mobject1D" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject1D.rst:4 msgid "Qualified name: ``manim.mobject.types.point\\_cloud\\_mobject.Mobject1D``" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.Mobject1D:1 msgid "Bases: :py:class:`manim.mobject.types.point_cloud_mobject.PMobject`" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject1D.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject1D.rst:22 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject1D.rst:29::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject1D.rst:29::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject1D.rst:29::1 msgid "The height of the mobject." msgstr "" manim.mobject.types.point_cloud_mobject.Mobject2D.pot000066400000000000000000000024751515024150700353200ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject2D.rst:2 msgid "Mobject2D" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject2D.rst:4 msgid "Qualified name: ``manim.mobject.types.point\\_cloud\\_mobject.Mobject2D``" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.Mobject2D:1 msgid "Bases: :py:class:`manim.mobject.types.point_cloud_mobject.PMobject`" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject2D.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject2D.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject2D.rst:28::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject2D.rst:28::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Mobject2D.rst:28::1 msgid "The height of the mobject." msgstr "" manim.mobject.types.point_cloud_mobject.PGroup.pot000066400000000000000000000026601515024150700347570ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PGroup.rst:2 msgid "PGroup" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PGroup.rst:4 msgid "Qualified name: ``manim.mobject.types.point\\_cloud\\_mobject.PGroup``" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PGroup:1 msgid "Bases: :py:class:`manim.mobject.types.point_cloud_mobject.PMobject`" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PGroup:2 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PGroup.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PGroup.rst:22 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PGroup.rst:29::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PGroup.rst:29::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PGroup.rst:29::1 msgid "The height of the mobject." msgstr "" manim.mobject.types.point_cloud_mobject.PMobject.pot000066400000000000000000000102201515024150700352350ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:2 msgid "PMobject" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:4 msgid "Qualified name: ``manim.mobject.types.point\\_cloud\\_mobject.PMobject``" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject:1 msgid "Bases: :py:class:`manim.mobject.mobject.Mobject`" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject:1 msgid "A disc made of a cloud of Dots" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:40::1 #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.add_points:1 msgid "Add points." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:40::1 #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.get_color:1 msgid "Returns the color of the :class:`~.Mobject`" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:40::1 msgid "The simplest :class:`~.Mobject` to be transformed to or from self." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:40::1 #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.reset_points:1 msgid "Sets :attr:`points` to be an empty array." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:40::1 msgid "Condition is function which takes in one arguments, (x, y, z)." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:40::1 #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.sort_points:1 msgid "Function is any map from R^3 to R" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:40::1 #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.thin_out:1 msgid "Removes all but every nth point for n = factor" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PMobject.rst:42 msgid "Attributes" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.add_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.add_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.add_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.add_points:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.add_points:3 msgid "Points must be a Nx3 numpy array. Rgbas must be a Nx4 numpy array if it is not None." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PMobject.get_point_mobject:1 msgid "The simplest :class:`~.Mobject` to be transformed to or from self. Should by a point of the appropriate type" msgstr "" manim.mobject.types.point_cloud_mobject.Point.pot000066400000000000000000000040571515024150700346360ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Point.rst:2 msgid "Point" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Point.rst:4 msgid "Qualified name: ``manim.mobject.types.point\\_cloud\\_mobject.Point``" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.Point:1 msgid "Bases: :py:class:`manim.mobject.types.point_cloud_mobject.PMobject`" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.Point:2 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Point.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Point.rst:21::1 #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.Point.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.Point.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.Point.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.Point.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.Point.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.Point.generate_points:1::1 msgid "The width of the mobject." msgstr "" manim.mobject.types.point_cloud_mobject.PointCloudDot.pot000066400000000000000000000043131515024150700362670ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PointCloudDot.rst:2 msgid "PointCloudDot" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PointCloudDot.rst:4 msgid "Qualified name: ``manim.mobject.types.point\\_cloud\\_mobject.PointCloudDot``" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PointCloudDot:1 msgid "Bases: :py:class:`manim.mobject.types.point_cloud_mobject.Mobject1D`" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PointCloudDot:1 msgid "A disc made of a cloud of Dots .. rubric:: Examples" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PointCloudDot.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PointCloudDot.rst:21::1 #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PointCloudDot.generate_points:1 msgid "Initializes :attr:`points` and therefore the shape." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.PointCloudDot.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PointCloudDot.generate_points:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PointCloudDot.generate_points:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PointCloudDot.generate_points:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject.PointCloudDot.generate_points:1::1 msgid "The width of the mobject." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.types.point_cloud_mobject.pot000066400000000000000000000015601515024150700336210ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.rst:2 msgid "point\\_cloud\\_mobject" msgstr "" #: ../../../manim/mobject/types/point_cloud_mobject.py:docstring of manim.mobject.types.point_cloud_mobject:1 msgid "Mobjects representing point clouds." msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.rst:30::0 #: ../../source/reference/manim.mobject.types.point_cloud_mobject.rst:30::0 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.types.point_cloud_mobject.rst:30::1 msgid "A disc made of a cloud of Dots" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.types.pot000066400000000000000000000014051515024150700275760ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.rst:2 msgid "types" msgstr "" #: ../../../manim/mobject/types/__init__.py:docstring of manim.mobject.types:1 msgid "Specialized mobject base classes." msgstr "" #: ../../../manim/mobject/types/__init__.py:docstring of manim.mobject.types:4 msgid "Modules" msgstr "" #: ../../../manim/mobject/types/__init__.py:docstring of manim.mobject.types:12::1 msgid "Mobjects representing raster images." msgstr "" #: ../../../manim/mobject/types/__init__.py:docstring of manim.mobject.types:12::1 msgid "Mobjects representing point clouds." msgstr "" manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects.pot000066400000000000000000000036621515024150700373410ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects.rst:2 msgid "CurvesAsSubmobjects" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects.rst:4 msgid "Qualified name: ``manim.mobject.types.vectorized\\_mobject.CurvesAsSubmobjects``" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects:1 msgid "Convert a curve's elements to submobjects." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects:4 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.CurvesAsSubmobjects.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.types.vectorized_mobject.DashedVMobject.pot000066400000000000000000000060531515024150700362240ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.vectorized_mobject.DashedVMobject.rst:2 msgid "DashedVMobject" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.DashedVMobject.rst:4 msgid "Qualified name: ``manim.mobject.types.vectorized\\_mobject.DashedVMobject``" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.DashedVMobject:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.DashedVMobject:1 msgid "A :class:`VMobject` composed of dashes instead of lines." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.DashedVMobject:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.DashedVMobject:3 msgid "The object that will get dashed" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.DashedVMobject:4 msgid "Number of dashes to add." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.DashedVMobject:5 msgid "Ratio of dash to empty space." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.DashedVMobject:6 msgid "Shifts the starting point of dashes along the path. Value 1 shifts by one full dash length." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.DashedVMobject:8 msgid "If ``True``, dashes will be (approximately) equally long. If ``False``, dashes will be split evenly in the curve's input t variable (legacy behavior)." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.DashedVMobject:13 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.DashedVMobject.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.DashedVMobject.rst:21 msgid "Attributes" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.DashedVMobject.rst:32::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.DashedVMobject.rst:32::1 msgid "The depth of the mobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.DashedVMobject.rst:32::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.DashedVMobject.rst:32::1 msgid "The height of the mobject." msgstr "" manim.mobject.types.vectorized_mobject.VDict.pot000066400000000000000000000225541515024150700344170ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VDict.rst:2 msgid "VDict" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VDict.rst:4 msgid "Qualified name: ``manim.mobject.types.vectorized\\_mobject.VDict``" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:1 msgid "A VGroup-like class, also offering submobject access by key, like a python dict" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add_key_value_pair:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.remove:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:4 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:6 msgid "The parameter specifying the key-value mapping of keys and mobjects." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:6 msgid "Whether to also display the key associated with the mobject. This might be useful when debugging, especially when there are a lot of mobjects in the :class:`VDict`. Defaults to False." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:11 msgid "Other arguments to be passed to `Mobject`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:16 msgid "Whether to also display the key associated with the mobject. This might be useful when debugging, especially when there are a lot of mobjects in the :class:`VDict`. When displayed, the key is towards the left of the mobject. Defaults to False." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:0 msgid "type" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:27 msgid "Is the actual python dictionary that is used to bind the keys to the mobjects." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict:33 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:13 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add_key_value_pair:14 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.get_all_submobjects:7 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.remove:13 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VDict.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VDict.rst:23::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:1 msgid "Adds the key-value pairs to the :class:`VDict` object." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VDict.rst:23::1 msgid "A utility function used by :meth:`add` to add the key-value pair to :attr:`submob_dict`." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VDict.rst:23::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.get_all_submobjects:1 msgid "To get all the submobjects associated with a particular :class:`VDict` object" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VDict.rst:23::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.remove:1 msgid "Removes the mobject from the :class:`VDict` object having the key `key`" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VDict.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:3 msgid "Also, it internally adds the value to the `submobjects` :class:`list` of :class:`~.Mobject`, which is responsible for actual on-screen display." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.get_all_submobjects:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.remove:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:9 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.remove:9 msgid "Returns the :class:`VDict` object on which this method was called." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add_key_value_pair:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.get_all_submobjects:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.remove:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add:14 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add_key_value_pair:15 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.get_all_submobjects:8 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.remove:14 msgid "Normal usage::" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add_key_value_pair:1 msgid "A utility function used by :meth:`add` to add the key-value pair to :attr:`submob_dict`. Not really meant to be used externally." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add_key_value_pair:4 msgid "The key of the submobject to be added." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add_key_value_pair:6 msgid "The mobject associated with the key" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add_key_value_pair:0 msgid "Raises" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.add_key_value_pair:11 msgid "If the value is not an instance of VMobject" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.get_all_submobjects:3 msgid "All the submobjects associated with the :class:`VDict` object" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VDict.remove:3 msgid "Also, it internally removes the mobject from the `submobjects` :class:`list` of :class:`~.Mobject`, (which is responsible for removing it from the screen)" msgstr "" manim.mobject.types.vectorized_mobject.VGroup.pot000066400000000000000000000102371515024150700346230ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VGroup.rst:2 msgid "VGroup" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VGroup.rst:4 msgid "Qualified name: ``manim.mobject.types.vectorized\\_mobject.VGroup``" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup:1 msgid "A group of vectorized mobjects." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup:3 msgid "This can be used to group multiple :class:`~.VMobject` instances together in order to scale, move, ... them together." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup:7 msgid "Notes" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup:8 msgid "When adding the same mobject more than once, repetitions are ignored. Use :meth:`.Mobject.copy` to create a separate copy which can then be added to the group." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup:13 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:11 msgid "Examples" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup:14 msgid "To add :class:`~.VMobject`s to a :class:`~.VGroup`, you can either use the :meth:`~.VGroup.add` method, or use the `+` and `+=` operators. Similarly, you can subtract elements of a VGroup via :meth:`~.VGroup.remove` method, or `-` and `-=` operators:" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VGroup.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VGroup.rst:20::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:1 msgid "Checks if all passed elements are an instance of VMobject and then add them to submobjects" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VGroup.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:3 msgid "List of VMobject to add" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VGroup.add:0 msgid "Raises" msgstr "" manim.mobject.types.vectorized_mobject.VMobject.pot000066400000000000000000001471261515024150700351220ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:2 msgid "VMobject" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:4 msgid "Qualified name: ``manim.mobject.types.vectorized\\_mobject.VMobject``" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:1 msgid "Bases: :py:class:`manim.mobject.mobject.Mobject`" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:1 msgid "A vectorized mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_line_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_quadratic_bezier_curve_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_smooth_curve_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.align_points:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.change_anchor_mode:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.consider_points_equals_2d:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.force_direction:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.gen_cubic_bezier_tuples_from_points:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_arc_length:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_curve_functions_with_lengths:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function_with_length:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length_pieces:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_points:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subcurve:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves_to_point_list:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.point_from_proportion:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.pointwise_become_partial:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.proportion_from_point:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.rotate:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.rotate_sheen_direction:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.scale_handle_to_anchor_distances:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_anchors_and_handles:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_fill:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_points_as_corners:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_sheen:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_sheen_direction:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:3 msgid "The purpose of background stroke is to have something that won't overlap fill, e.g. For text against some textured background." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:6 msgid "When a color c is set, there will be a second color computed based on interpolating c to WHITE by with sheen_factor, and the display will gradient to this secondary color in the direction of sheen_direction." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:10 msgid "Indicates that it will not be displayed, but that it should count in parent mobject's path" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:12 msgid "This is within a pixel" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:1 msgid "Add cubic bezier curve to the path." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_line_to:1 msgid "Add a straight line from the last point of VMobject to the given point." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_quadratic_bezier_curve_to:1 msgid "Add Quadratic bezier curve to the path." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 msgid "Creates a smooth curve from given points and add it to the VMobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.align_points:1 msgid "Adds points to self and vmobject so that they both have the same number of subpaths, with corresponding subpaths each containing the same number of points." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 msgid "Changes the anchor mode of the bezier curves." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.consider_points_equals_2d:1 msgid "Determine if two points are close enough to be considered equal." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.force_direction:1 msgid "Makes sure that points are either directed clockwise or counterclockwise." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.gen_cubic_bezier_tuples_from_points:1 msgid "Returns the bezier tuples from an array of points." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 msgid "First arg can be either a color, or a tuple/list of colors." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_anchors:1 msgid "Returns the anchors of the curves forming the VMobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_anchors_and_handles:1 msgid "Returns anchors1, handles1, handles2, anchors2, where (anchors1[i], handles1[i], handles2[i], anchors2[i]) will be four points defining a cubic bezier curve for any i in range(0, len(anchors1))" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_arc_length:1 msgid "Return the approximated length of the whole curve." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_color:1 msgid "Returns the color of the :class:`~.Mobject`" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_curve_functions:1 msgid "Gets the functions for the curves of the mobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_curve_functions_with_lengths:1 msgid "Gets the functions and lengths of the curves for the mobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 msgid "Uses :func:`~.space_ops.shoelace_direction` to calculate the direction." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_end_anchors:1 msgid "Return the end anchors of the bezier curves." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:1::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.fill_color:1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_fill_color:1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_fill_opacity:1 msgid "If there are multiple opacities, this returns the first" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function:1 msgid "Returns the expression of the nth curve." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function_with_length:1 msgid "Returns the expression of the nth curve along with its (approximate) length." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length:1 msgid "Returns the (approximate) length of the nth curve." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length_pieces:1 msgid "Returns the array of short line lengths used for length approximation." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_points:1 msgid "Returns the points defining the nth curve of the vmobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_num_curves:1 msgid "Returns the number of curves of the vmobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 msgid "The simplest :class:`~.Mobject` to be transformed to or from self." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_start_anchors:1 msgid "Returns the start anchors of the bezier curves." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 msgid "Returns the subcurve of the VMobject between the interval [a, b]." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subpaths:1 msgid "Returns subpaths formed by the curves of the VMobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.init_colors:1 msgid "Initializes the colors." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves:1 msgid "Inserts n curves to the bezier curves of the vmobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves_to_point_list:1 msgid "Given an array of k points defining a bezier curves (anchors and handles), returns points defining exactly k + n bezier curves." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.point_from_proportion:1 msgid "Gets the point at a proportion along the path of the :class:`VMobject`." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 msgid "Given two bounds a and b, transforms the points of the self vmobject into the points of the vmobject passed as parameter with respect to the bounds." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.proportion_from_point:1 msgid "Returns the proportion along the path of the :class:`VMobject` a particular given point is at." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.reverse_direction:1 msgid "Reverts the point direction by inverting the point order." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.rotate:1 msgid "Rotates the :class:`~.Mobject` about a certain point." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.rotate_sheen_direction:1 msgid "Rotates the direction of the applied sheen." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 msgid "If the distance between a given handle point H and its associated anchor point A is d, then it changes H to be a distances factor*d away from A, but so that the line from A to H doesn't change." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_anchors_and_handles:1 msgid "Given two sets of anchors and handles, process them to set them as anchors and handles of the VMobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 msgid "Condition is function which takes in one arguments, (x, y, z)." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_fill:1 msgid "Set the fill color and fill opacity of a :class:`VMobject`." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_points_as_corners:1 msgid "Given an array of points, set them as corner of the vmobject." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_sheen:1 msgid "Applies a color gradient from a direction." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:114::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_sheen_direction:1 msgid "Sets the direction of the applied sheen." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VMobject.rst:116 msgid "Attributes" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:3 msgid "NOTE : the first anchor is not a parameter as by default the end of the last sub-path!" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:5 msgid "first handle" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:7 msgid "second handle" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:9 msgid "anchor" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_line_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_quadratic_bezier_curve_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_smooth_curve_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.align_points:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.change_anchor_mode:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.consider_points_equals_2d:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.gen_cubic_bezier_tuples_from_points:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_anchors:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_anchors_and_handles:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_arc_length:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_curve_functions:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_curve_functions_with_lengths:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_direction:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_end_anchors:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function_with_length:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length_pieces:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_points:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_num_curves:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_start_anchors:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subcurve:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subpaths:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves_to_point_list:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.point_from_proportion:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.pointwise_become_partial:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.proportion_from_point:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.reverse_direction:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.scale_handle_to_anchor_distances:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_anchors_and_handles:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_fill:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_points_as_corners:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:12 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_line_to:6 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_quadratic_bezier_curve_to:3 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_smooth_curve_to:7 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.align_points:9 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.change_anchor_mode:5 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves:5 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.pointwise_become_partial:11 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.scale_handle_to_anchor_distances:11 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_anchors_and_handles:9 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_fill:7 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_points_as_corners:9 msgid "``self``" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_cubic_bezier_curve_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_line_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_quadratic_bezier_curve_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_smooth_curve_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.align_points:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.change_anchor_mode:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.consider_points_equals_2d:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.gen_cubic_bezier_tuples_from_points:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_anchors:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_anchors_and_handles:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_arc_length:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_curve_functions:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_curve_functions_with_lengths:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_direction:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_end_anchors:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function_with_length:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length_pieces:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_points:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_num_curves:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_start_anchors:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subcurve:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subpaths:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves_to_point_list:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.point_from_proportion:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.pointwise_become_partial:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.proportion_from_point:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.reverse_direction:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.scale_handle_to_anchor_distances:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_anchors_and_handles:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_fill:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_points_as_corners:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_line_to:3 msgid "end of the straight line." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_smooth_curve_to:1 msgid "Creates a smooth curve from given points and add it to the VMobject. If two points are passed in, the first is interpreted as a handle, the second as an anchor." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_smooth_curve_to:4 msgid "Points (anchor and handle, or just anchor) to add a smooth curve from" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_smooth_curve_to:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.point_from_proportion:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.proportion_from_point:0 msgid "Raises" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.add_smooth_curve_to:10 msgid "If 0 or more than 2 points are given." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.align_points:4 msgid "Points are added either by subdividing curves evenly along the subpath, or by creating new subpaths consisting of a single point repeated." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.align_points:7 msgid "The object to align points with." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.change_anchor_mode:1 msgid "Changes the anchor mode of the bezier curves. This will modify the handles." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.change_anchor_mode:3 msgid "There can be only two modes, \"jagged\", and \"smooth\"." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.consider_points_equals_2d:3 msgid "This uses the algorithm from np.isclose(), but expanded here for the 2D point case. NumPy is overkill for such a small question. :param p0: first point :type p0: np.ndarray :param p1: second point :type p1: np.ndarray" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.consider_points_equals_2d:10 msgid "whether two points considered close." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.force_direction:4 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_direction:13 msgid "Either ``\"CW\"`` or ``\"CCW\"``." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.gen_cubic_bezier_tuples_from_points:3 msgid "self.points is a list of the anchors and handles of the bezier curves of the mobject (ie [anchor1, handle1, handle2, anchor2, anchor3 ..]) This algorithm basically retrieve them by taking an element every n, where n is the number of control points of the bezier curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.gen_cubic_bezier_tuples_from_points:8 msgid "Points from which control points will be extracted." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.gen_cubic_bezier_tuples_from_points:11 msgid "Bezier control points." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.generate_rgbas_array:1 msgid "First arg can be either a color, or a tuple/list of colors. Likewise, opacity can either be a float, or a tuple of floats. If self.sheen_factor is not zero, and only one color was passed in, a second slightly light color will automatically be added for the gradient" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_anchors:3 msgid "The anchors." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_anchors_and_handles:6 msgid "Iterable of the anchors and handles." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_arc_length:3 msgid "Number of sample points per curve used to approximate the length. More points result in a better approximation." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_arc_length:5 msgid "The length of the :class:`VMobject`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_curve_functions:3 msgid "The functions for the curves." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_curve_functions_with_lengths:3 msgid "The keyword arguments passed to :meth:`get_nth_curve_function_with_length`" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_curve_functions_with_lengths:5 msgid "The functions and lengths of the curves." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_direction:1 msgid "Uses :func:`~.space_ops.shoelace_direction` to calculate the direction. The direction of points determines in which direction the object is drawn, clockwise or counterclockwise." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_direction:6 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.reverse_direction:7 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.rotate_sheen_direction:9 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_fill:11 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_sheen:11 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_sheen_direction:7 msgid "Examples" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_direction:7 msgid "The default direction of a :class:`~.Circle` is counterclockwise::" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_end_anchors:3 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_start_anchors:3 msgid "Starting anchors" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function:3 msgid "index of the desired curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function:6 msgid "expression of the nth bezier curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function_with_length:3 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length:3 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length_pieces:3 msgid "The index of the desired curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function_with_length:4 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length:4 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length_pieces:4 msgid "The number of points to sample to find the length." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function_with_length:6 msgid "* **curve** (*typing.Callable[[float], np.ndarray]*) -- The function for the nth curve. * **length** (:class:`float`) -- The length of the nth curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function_with_length:6 msgid "**curve** (*typing.Callable[[float], np.ndarray]*) -- The function for the nth curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_function_with_length:7 msgid "**length** (:class:`float`) -- The length of the nth curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length:6 msgid "**length** -- The length of the nth curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_length_pieces:6 msgid "The short length-pieces of the nth curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_points:3 msgid "index of the desired bezier curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_nth_curve_points:6 msgid "points defininf the nth bezier curve (anchors, handles)" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_num_curves:3 msgid "number of curves. of the vmobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_point_mobject:1 msgid "The simplest :class:`~.Mobject` to be transformed to or from self. Should by a point of the appropriate type" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subcurve:1 msgid "Returns the subcurve of the VMobject between the interval [a, b]. The curve is a VMobject itself." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subcurve:4 msgid "The lower bound." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subcurve:5 msgid "The upper bound." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subcurve:7 msgid "The subcurve between of [a, b]" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subpaths:3 msgid "Subpaths are ranges of curves with each pair of consecutive curves having their end/start points coincident." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.get_subpaths:5 msgid "subpaths." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.init_colors:3 msgid "Gets called upon creation. This is an empty method that can be implemented by subclasses." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves:3 msgid "Number of curves to insert." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves_to_point_list:3 msgid "Number of desired curves." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves_to_point_list:5 msgid "Starting points." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.insert_n_curves_to_point_list:8 msgid "Points generated." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.point_from_proportion:3 msgid "The proportion along the the path of the :class:`VMobject`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.point_from_proportion:5 msgid "The point on the :class:`VMobject`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.point_from_proportion:8 msgid "If ``alpha`` is not between 0 and 1." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.point_from_proportion:9 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.proportion_from_point:10 msgid "If the :class:`VMobject` has no points." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.pointwise_become_partial:1 msgid "Given two bounds a and b, transforms the points of the self vmobject into the points of the vmobject passed as parameter with respect to the bounds. Points here stand for control points of the bezier curves (anchors and handles)" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.pointwise_become_partial:4 msgid "The vmobject that will serve as a model." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.pointwise_become_partial:6 msgid "upper-bound." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.pointwise_become_partial:8 msgid "lower-bound" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.proportion_from_point:4 msgid "The Cartesian coordinates of the point which may or may not lie on the :class:`VMobject`" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.proportion_from_point:6 msgid "The proportion along the path of the :class:`VMobject`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.proportion_from_point:9 msgid "If ``point`` does not lie on the curve." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.reverse_direction:3 msgid "Returns self." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.rotate_sheen_direction:3 msgid "Angle by which the direction of sheen is rotated." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.rotate_sheen_direction:5 msgid "Axis of rotation." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.rotate_sheen_direction:10 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_sheen_direction:8 msgid "Normal usage::" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.scale_handle_to_anchor_distances:1 msgid "If the distance between a given handle point H and its associated anchor point A is d, then it changes H to be a distances factor*d away from A, but so that the line from A to H doesn't change. This is mostly useful in the context of applying a (differentiable) function, to preserve tangency properties. One would pull all the handles closer to their anchors, apply the function then push them out again." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.scale_handle_to_anchor_distances:9 msgid "The factor used for scaling." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_anchors_and_handles:4 msgid "anchors1[i], handles1[i], handles2[i] and anchors2[i] define the i-th bezier curve of the vmobject. There are four hardcoded parameters and this is a problem as it makes the number of points per cubic curve unchangeable from 4 (two anchors and two handles)." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_color:1 msgid "Condition is function which takes in one arguments, (x, y, z). Here it just recurses to submobjects, but in subclasses this should be further implemented based on the the inner workings of color" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_fill:3 msgid "Fill color of the :class:`VMobject`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_fill:4 msgid "Fill opacity of the :class:`VMobject`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_fill:5 msgid "If ``True``, the fill color of all submobjects is also set." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_points_as_corners:3 msgid "To achieve that, this algorithm sets handles aligned with the anchors such that the resultant bezier curve will be the segment between the two anchors." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_points_as_corners:6 msgid "Array of points that will be set as corners." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_sheen:3 msgid "The extent of lustre/gradient to apply. If negative, the gradient starts from black, if positive the gradient starts from white and changes to the current color." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_sheen:7 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject.set_sheen_direction:3 msgid "Direction from where the gradient is applied." msgstr "" manim.mobject.types.vectorized_mobject.VectorizedPoint.pot000066400000000000000000000052361515024150700365340ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VectorizedPoint.rst:2 msgid "VectorizedPoint" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VectorizedPoint.rst:4 msgid "Qualified name: ``manim.mobject.types.vectorized\\_mobject.VectorizedPoint``" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VectorizedPoint:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VMobject`" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VectorizedPoint.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.VectorizedPoint.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:1::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VectorizedPoint.height:1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VMobject:1::1 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VectorizedPoint.width:1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VectorizedPoint.height:0 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VectorizedPoint.width:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VectorizedPoint.height:6 #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject.VectorizedPoint.width:6 msgid "Examples" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.types.vectorized_mobject.pot000066400000000000000000000024201515024150700334540ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.types.vectorized_mobject.rst:2 msgid "vectorized\\_mobject" msgstr "" #: ../../../manim/mobject/types/vectorized_mobject.py:docstring of manim.mobject.types.vectorized_mobject:1 msgid "Mobjects that use vector graphics." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.rst:30::1 msgid "Convert a curve's elements to submobjects." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.rst:30::1 msgid "A :class:`VMobject` composed of dashes instead of lines." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.rst:30::1 msgid "A VGroup-like class, also offering submobject access by key, like a python dict" msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.rst:30::1 msgid "A group of vectorized mobjects." msgstr "" #: ../../source/reference/manim.mobject.types.vectorized_mobject.rst:30::1 msgid "A vectorized mobject." msgstr "" manim.mobject.value_tracker.ComplexValueTracker.pot000066400000000000000000000052441515024150700351260ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.value_tracker.ComplexValueTracker.rst:2 msgid "ComplexValueTracker" msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ComplexValueTracker.rst:4 msgid "Qualified name: ``manim.mobject.value\\_tracker.ComplexValueTracker``" msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ComplexValueTracker:1 msgid "Bases: :py:class:`manim.mobject.value_tracker.ValueTracker`" msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ComplexValueTracker:1 msgid "Tracks a complex-valued parameter." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ComplexValueTracker:3 msgid "When the value is set through :attr:`animate`, the value will take a straight path from the source point to the destination point." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ComplexValueTracker:7 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ComplexValueTracker.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ComplexValueTracker.rst:21::1 #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ComplexValueTracker.get_value:1 msgid "Get the current value of this value tracker as a complex number." msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ComplexValueTracker.rst:21::1 #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ComplexValueTracker.set_value:1 msgid "Sets a new complex value to the ComplexValueTracker" msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ComplexValueTracker.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ComplexValueTracker.get_value:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ComplexValueTracker.get_value:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ComplexValueTracker.get_value:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ComplexValueTracker.get_value:1::1 msgid "The width of the mobject." msgstr "" manim.mobject.value_tracker.ValueTracker.pot000066400000000000000000000075051515024150700336000ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.value_tracker.ValueTracker.rst:2 msgid "ValueTracker" msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ValueTracker.rst:4 msgid "Qualified name: ``manim.mobject.value\\_tracker.ValueTracker``" msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker:1 msgid "Bases: :py:class:`manim.mobject.mobject.Mobject`" msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker:1 msgid "A mobject that can be used for tracking (real-valued) parameters. Useful for animating parameter changes." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker:4 msgid "Not meant to be displayed. Instead the position encodes some number, often one which another animation or continual_animation uses for its update function, and by treating it as a mobject it can still be animated and manipulated just like anything else." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker:9 msgid "This value changes continuously when animated using the :attr:`animate` syntax." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker:12 msgid "Examples" msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker:41 msgid "You can also link ValueTrackers to updaters. In this case, you have to make sure that the ValueTracker is added to the scene by ``add``" msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ValueTracker.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ValueTracker.rst:23::1 #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker.get_value:1 msgid "Get the current value of this ValueTracker." msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ValueTracker.rst:23::1 #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker.increment_value:1 msgid "Increments (adds) a scalar value to the ValueTracker" msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ValueTracker.rst:23::1 #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker.interpolate:1 msgid "Turns self into an interpolation between mobject1 and mobject2." msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ValueTracker.rst:23::1 #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker.set_value:1 msgid "Sets a new scalar value to the ValueTracker" msgstr "" #: ../../source/reference/manim.mobject.value_tracker.ValueTracker.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker.get_value:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker.get_value:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker.get_value:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker.get_value:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker.ValueTracker.get_value:0 msgid "Return type" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.value_tracker.pot000066400000000000000000000012031515024150700312550ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.value_tracker.rst:2 msgid "value\\_tracker" msgstr "" #: ../../../manim/mobject/value_tracker.py:docstring of manim.mobject.value_tracker:1 msgid "Simple mobjects that can be used for storing (and updating) a value." msgstr "" #: ../../source/reference/manim.mobject.value_tracker.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.value_tracker.rst:22::1 msgid "Tracks a complex-valued parameter." msgstr "" manim.mobject.vector_field.ArrowVectorField.pot000066400000000000000000000143501515024150700342430ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.vector_field.ArrowVectorField.rst:2 msgid "ArrowVectorField" msgstr "" #: ../../source/reference/manim.mobject.vector_field.ArrowVectorField.rst:4 msgid "Qualified name: ``manim.mobject.vector\\_field.ArrowVectorField``" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:1 msgid "Bases: :py:class:`manim.mobject.vector_field.VectorField`" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:1 msgid "A :class:`VectorField` represented by a set of change vectors." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:3 msgid "Vector fields are always based on a function defining the :class:`~.Vector` at every position. The values of this functions is displayed as a grid of vectors. By default the color of each vector is determined by it's magnitude. Other color schemes can be used however." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField.get_vector:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:8 msgid "The function defining the rate of change at every position of the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:9 msgid "The color of the vector field. If set, position-specific coloring is disabled." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:10 msgid "A function mapping a vector to a single value. This value gives the position in the color gradient defined using `min_color_scheme_value`, `max_color_scheme_value` and `colors`." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:11 msgid "The value of the color_scheme function to be mapped to the first color in `colors`. Lower values also result in the first color of the gradient." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:12 msgid "The value of the color_scheme function to be mapped to the last color in `colors`. Higher values also result in the last color of the gradient." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:13 msgid "The colors defining the color gradient of the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:14 msgid "A sequence of x_min, x_max, delta_x" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:15 msgid "A sequence of y_min, y_max, delta_y" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:16 msgid "A sequence of z_min, z_max, delta_z" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:17 msgid "Enables three_dimensions. Default set to False, automatically turns True if z_range is not None." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:19 msgid "The function determining the displayed size of the vectors. The actual size of the vector is passed, the returned value will be used as display size for the vector. By default this is used to cap the displayed size of vectors to reduce the clutter." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:22 msgid "The opacity of the arrows." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:23 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField.get_vector:8 msgid "Additional arguments to be passed to the :class:`~.Vector` constructor" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:24 msgid "Additional arguments to be passed to the :class:`~.VGroup` constructor" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField:28 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.vector_field.ArrowVectorField.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.vector_field.ArrowVectorField.rst:20::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField.get_vector:1 msgid "Creates a vector in the vector field." msgstr "" #: ../../source/reference/manim.mobject.vector_field.ArrowVectorField.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField.get_vector:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField.get_vector:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField.get_vector:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField.get_vector:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField.get_vector:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.ArrowVectorField.get_vector:3 msgid "The created vector is based on the function of the vector field and is rooted in the given point. Color and length fit the specifications of this vector field." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.vector_field.StreamLines.pot000066400000000000000000000247671515024150700333440ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.vector_field.StreamLines.rst:2 msgid "StreamLines" msgstr "" #: ../../source/reference/manim.mobject.vector_field.StreamLines.rst:4 msgid "Qualified name: ``manim.mobject.vector\\_field.StreamLines``" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:1 msgid "Bases: :py:class:`manim.mobject.vector_field.VectorField`" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:1 msgid "StreamLines represent the flow of a :class:`VectorField` using the trace of moving agents." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:3 msgid "Vector fields are always based on a function defining the vector at every position. The values of this functions is displayed by moving many agents along the vector field and showing their trace." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.start_animation:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:7 msgid "The function defining the rate of change at every position of the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:8 msgid "The color of the vector field. If set, position-specific coloring is disabled." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:9 msgid "A function mapping a vector to a single value. This value gives the position in the color gradient defined using `min_color_scheme_value`, `max_color_scheme_value` and `colors`." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:10 msgid "The value of the color_scheme function to be mapped to the first color in `colors`. Lower values also result in the first color of the gradient." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:11 msgid "The value of the color_scheme function to be mapped to the last color in `colors`. Higher values also result in the last color of the gradient." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:12 msgid "The colors defining the color gradient of the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:13 msgid "A sequence of x_min, x_max, delta_x" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:14 msgid "A sequence of y_min, y_max, delta_y" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:15 msgid "A sequence of z_min, z_max, delta_z" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:16 msgid "Enables three_dimensions. Default set to False, automatically turns True if z_range is not None." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:18 msgid "The amount by which the starting position of each agent is altered along each axis. Defaults to :code:`delta_y / 2` if not defined." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:19 msgid "The number of agents generated at each starting point." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:20 msgid "The factor by which the distance an agent moves per step is stretched. Lower values result in a better approximation of the trajectories in the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:21 msgid "The time the agents get to move in the vector field. Higher values therefore result in longer stream lines. However, this whole time gets simulated upon creation." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:22 msgid "The maximum number of anchors per line. Lines with more anchors get reduced in complexity, not in length." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:23 msgid "The distance agents can move out of the generation area before being terminated." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:24 msgid "The stroke with of the stream lines." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:25 msgid "The opacity of the stream lines." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines:28 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:14 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.end_animation:11 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.start_animation:13 msgid "Examples" msgstr "" #: ../../source/reference/manim.mobject.vector_field.StreamLines.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.vector_field.StreamLines.rst:22::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:10 msgid "The creation animation of the stream lines." msgstr "" #: ../../source/reference/manim.mobject.vector_field.StreamLines.rst:22::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.end_animation:1 msgid "End the stream line animation smoothly." msgstr "" #: ../../source/reference/manim.mobject.vector_field.StreamLines.rst:22::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.start_animation:1 msgid "Animates the stream lines using an updater." msgstr "" #: ../../source/reference/manim.mobject.vector_field.StreamLines.rst:24 msgid "Attributes" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:3 msgid "The stream lines appear in random order." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:5 msgid "The lag ratio of the animation. If undefined, it will be selected so that the total animation length is 1.5 times the run time of each stream line creation." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:7 msgid "The run time of every single stream line creation. The runtime of the whole animation might be longer due to the `lag_ratio`. If undefined, the virtual time of the stream lines is used as run time." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.end_animation:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.create:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.end_animation:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.start_animation:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.end_animation:3 msgid "Returns an animation resulting in fully displayed stream lines without a noticeable cut." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.end_animation:5 msgid "The animation fading out the running stream animation." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.end_animation:0 msgid "Raises" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.end_animation:8 msgid "if no stream line animation is running" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.start_animation:3 msgid "The stream lines will continuously flow" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.start_animation:5 msgid "If `True` the animation is initialized line by line. Otherwise it starts with all lines shown." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.start_animation:7 msgid "At `flow_speed=1` the distance the flow moves per second is equal to the magnitude of the vector field along its path. The speed value scales the speed of this flow." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.start_animation:8 msgid "The proportion of the stream line shown while being animated" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.StreamLines.start_animation:9 msgid "The rate function of each stream line flashing" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.vector_field.VectorField.pot000066400000000000000000000407151515024150700333130ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:2 msgid "VectorField" msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:4 msgid "Qualified name: ``manim.mobject.vector\\_field.VectorField``" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:1 msgid "Bases: :py:class:`manim.mobject.types.vectorized_mobject.VGroup`" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:1 msgid "A vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:3 msgid "Vector fields are based on a function defining a vector at every position. This class does by default not include any visible elements but provides methods to move other :class:`~.Mobject` s along the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.fit_to_coordinate_system:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_colored_background_image:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_nudge_updater:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_vectorized_rgba_gradient_function:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge_submobjects:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.shift_func:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.start_submobject_movement:0 msgid "Parameters" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:7 msgid "The function defining the rate of change at every position of the `VectorField`." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:8 msgid "The color of the vector field. If set, position-specific coloring is disabled." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:9 msgid "A function mapping a vector to a single value. This value gives the position in the color gradient defined using `min_color_scheme_value`, `max_color_scheme_value` and `colors`." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:10 msgid "The value of the color_scheme function to be mapped to the first color in `colors`. Lower values also result in the first color of the gradient." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:11 msgid "The value of the color_scheme function to be mapped to the last color in `colors`. Higher values also result in the last color of the gradient." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:12 msgid "The colors defining the color gradient of the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField:13 msgid "Additional arguments to be passed to the :class:`~.VGroup` constructor" msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:29::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.fit_to_coordinate_system:1 msgid "Scale the vector field to fit a coordinate system." msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:29::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_colored_background_image:1 msgid "Generate an image that displays the vector field." msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:29::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_nudge_updater:1 msgid "Get an update function to move a :class:`~.Mobject` along the vector field." msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:29::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_vectorized_rgba_gradient_function:1 msgid "Generates a gradient of rgbas as a numpy array" msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:29::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge:1 msgid "Nudge a :class:`~.Mobject` along the vector field." msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:29::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge_submobjects:1 msgid "Apply a nudge along the vector field to all submobjects." msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:29::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:1 msgid "Scale a vector field function." msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:29::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.shift_func:1 msgid "Shift a vector field function." msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:29::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.start_submobject_movement:1 msgid "Start continuously moving all submobjects along the vector field." msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:29::1 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.stop_submobject_movement:1 msgid "Stops the continuous movement started using :meth:`start_submobject_movement`." msgstr "" #: ../../source/reference/manim.mobject.vector_field.VectorField.rst:31 msgid "Attributes" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.fit_to_coordinate_system:1::1 msgid "Used to animate the application of any method of :code:`self`." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.fit_to_coordinate_system:1::1 msgid "The depth of the mobject." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.fit_to_coordinate_system:1::1 msgid "If there are multiple colors (for gradient) this returns the first one" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.fit_to_coordinate_system:1::1 msgid "The height of the mobject." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.fit_to_coordinate_system:1::1 msgid "The width of the mobject." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.fit_to_coordinate_system:3 msgid "This method is useful when the vector field is defined in a coordinate system different from the one used to display the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.fit_to_coordinate_system:6 msgid "This method can only be used once because it transforms the origin of each vector." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.fit_to_coordinate_system:8 msgid "The coordinate system to fit the vector field to." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_colored_background_image:3 msgid "The color at each position is calculated by passing the positing through a series of steps: Calculate the vector field function at that position, map that vector to a single value using `self.color_scheme` and finally generate a color from that value using the color gradient." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_colored_background_image:9 msgid "The stepsize at which pixels get included in the image. Lower values give more accurate results, but may take a long time to compute." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_colored_background_image:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_nudge_updater:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge_submobjects:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.shift_func:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.start_submobject_movement:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.stop_submobject_movement:0 msgid "Returns" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_colored_background_image:12 msgid "The vector field image." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_colored_background_image:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_nudge_updater:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_vectorized_rgba_gradient_function:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge_submobjects:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.shift_func:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.start_submobject_movement:0 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.stop_submobject_movement:0 msgid "Return type" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_nudge_updater:3 msgid "When used with :meth:`~.Mobject.add_updater`, the mobject will move along the vector field, where its speed is determined by the magnitude of the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_nudge_updater:5 msgid "At `speed=1` the distance a mobject moves per second is equal to the magnitude of the vector field along its path. The speed value scales the speed of such a mobject." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_nudge_updater:6 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge_submobjects:7 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.start_submobject_movement:6 msgid "Whether to move the mobject along the vector field. See :meth:`nudge` for details." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_nudge_updater:8 msgid "The update function." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_vectorized_rgba_gradient_function:3 msgid "start value used for inverse interpolation at :func:`~.inverse_interpolate`" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_vectorized_rgba_gradient_function:4 msgid "end value used for inverse interpolation at :func:`~.inverse_interpolate`" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.get_vectorized_rgba_gradient_function:5 msgid "list of colors to generate the gradient" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge:3 msgid "The mobject to move along the vector field" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge:4 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge_submobjects:3 msgid "A scalar to the amount the mobject is moved along the vector field. The actual distance is based on the magnitude of the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge:6 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge_submobjects:5 msgid "The amount of steps the whole nudge is divided into. Higher values give more accurate approximations." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge:8 msgid "Whether to move the mobject along the vector field. If `False` the vector field takes effect on the center of the given :class:`~.Mobject`. If `True` the vector field takes effect on the points of the individual points of the :class:`~.Mobject`, potentially distorting it." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge:14 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge_submobjects:9 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.start_submobject_movement:8 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.stop_submobject_movement:3 msgid "This vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.nudge:18 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:7 msgid "Examples" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:3 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.shift_func:3 msgid "The function defining a vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:4 msgid "The scalar to be applied to the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:21 msgid "The scaled vector field function." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.scale_func:22 #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.shift_func:7 msgid "`Callable[[np.ndarray], np.ndarray]`" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.shift_func:4 msgid "The shift to be applied to the vector field." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.shift_func:6 msgid "The shifted vector field function." msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field.VectorField.start_submobject_movement:3 msgid "Calling this method multiple times will result in removing the previous updater created by this method." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.mobject.vector_field.pot000066400000000000000000000014631515024150700311030ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.mobject.vector_field.rst:2 msgid "vector\\_field" msgstr "" #: ../../../manim/mobject/vector_field.py:docstring of manim.mobject.vector_field:1 msgid "Mobjects representing vector fields." msgstr "" #: ../../source/reference/manim.mobject.vector_field.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.mobject.vector_field.rst:24::1 msgid "A :class:`VectorField` represented by a set of change vectors." msgstr "" #: ../../source/reference/manim.mobject.vector_field.rst:24::1 msgid "StreamLines represent the flow of a :class:`VectorField` using the trace of moving agents." msgstr "" manim.scene.moving_camera_scene.MovingCameraScene.pot000066400000000000000000000031501515024150700353350ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.moving_camera_scene.MovingCameraScene.rst:2 msgid "MovingCameraScene" msgstr "" #: ../../source/reference/manim.scene.moving_camera_scene.MovingCameraScene.rst:4 msgid "Qualified name: ``manim.scene.moving\\_camera\\_scene.MovingCameraScene``" msgstr "" #: ../../../manim/scene/moving_camera_scene.py:docstring of manim.scene.moving_camera_scene.MovingCameraScene:1 msgid "Bases: :py:class:`manim.scene.scene.Scene`" msgstr "" #: ../../../manim/scene/moving_camera_scene.py:docstring of manim.scene.moving_camera_scene.MovingCameraScene:1 msgid "This is a Scene, with special configurations and properties that make it suitable for cases where the camera must be moved around." msgstr "" #: ../../source/reference/manim.scene.moving_camera_scene.MovingCameraScene.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.scene.moving_camera_scene.MovingCameraScene.rst:20::1 #: ../../../manim/scene/moving_camera_scene.py:docstring of manim.scene.moving_camera_scene.MovingCameraScene.get_moving_mobjects:1 msgid "This method returns a list of all of the Mobjects in the Scene that are moving, that are also in the animations passed." msgstr "" #: ../../source/reference/manim.scene.moving_camera_scene.MovingCameraScene.rst:22 msgid "Attributes" msgstr "" #: ../../../manim/scene/moving_camera_scene.py:docstring of manim.scene.moving_camera_scene.MovingCameraScene.get_moving_mobjects:0 msgid "Parameters" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.moving_camera_scene.pot000066400000000000000000000011671515024150700320750ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.moving_camera_scene.rst:2 msgid "moving\\_camera\\_scene" msgstr "" #: ../../../manim/scene/moving_camera_scene.py:docstring of manim.scene.moving_camera_scene:1 msgid "A scene whose camera can be moved around." msgstr "" #: ../../../manim/scene/moving_camera_scene.py:docstring of manim.scene.moving_camera_scene:9 msgid "Examples" msgstr "" #: ../../source/reference/manim.scene.moving_camera_scene.rst:15 msgid "Classes" msgstr "" manim.scene.reconfigurable_scene.ReconfigurableScene.pot000066400000000000000000000000011515024150700360640ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.reconfigurable_scene.pot000066400000000000000000000000011515024150700322370ustar00rootroot00000000000000 manim.scene.sample_space_scene.SampleSpaceScene.pot000066400000000000000000000000011515024150700347770ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.sample_space_scene.pot000066400000000000000000000000011515024150700317040ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.scene.RerunSceneHandler.pot000066400000000000000000000023171515024150700325520ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.scene.RerunSceneHandler.rst:2 msgid "RerunSceneHandler" msgstr "" #: ../../source/reference/manim.scene.scene.RerunSceneHandler.rst:4 msgid "Qualified name: ``manim.scene.scene.RerunSceneHandler``" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.RerunSceneHandler:1 msgid "Bases: :py:class:`watchdog.events.FileSystemEventHandler`" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.RerunSceneHandler:1 msgid "A class to handle rerunning a Scene after the input file is modified." msgstr "" #: ../../source/reference/manim.scene.scene.RerunSceneHandler.rst:14 msgid "Methods" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.RerunSceneHandler.on_modified:1::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.RerunSceneHandler.on_modified:1 msgid "Called when a file or directory is modified." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.RerunSceneHandler.on_modified:0 msgid "Parameters" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.scene.Scene.pot000066400000000000000000001035611515024150700302430ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.scene.Scene.rst:2 msgid "Scene" msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:4 msgid "Qualified name: ``manim.scene.scene.Scene``" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene:1 msgid "A Scene is the canvas of your animation." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene:3 msgid "The primary role of :class:`Scene` is to provide the user with tools to manage mobjects and animations. Generally speaking, a manim script consists of a class that derives from :class:`Scene` whose :meth:`Scene.construct` method is overridden by the user's code." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene:8 msgid "Mobjects are displayed on screen by calling :meth:`Scene.add` and removed from screen by calling :meth:`Scene.remove`. All mobjects currently on screen are kept in :attr:`Scene.mobjects`. Animations are played by calling :meth:`Scene.play`." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene:12 msgid "A :class:`Scene` is rendered internally by calling :meth:`Scene.render`. This in turn calls :meth:`Scene.setup`, :meth:`Scene.construct`, and :meth:`Scene.tear_down`, in that order." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene:16 msgid "It is not recommended to override the ``__init__`` method in user Scenes. For code that should be ran before a Scene is rendered, use :meth:`Scene.setup` instead." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene:20 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_sound:12 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_subcaption:12 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.construct:14 msgid "Examples" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene:21 msgid "Override the :meth:`Scene.construct` method with your code." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add:1 msgid "Mobjects will be displayed, from background to foreground in the order with which they are added." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobject:1 msgid "Adds a single mobject to the foreground, and internally to the list foreground_mobjects, and mobjects." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobjects:1 msgid "Adds mobjects to the foreground, and internally to the list foreground_mobjects, and mobjects." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_sound:1 msgid "This method is used to add a sound to the animation." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_subcaption:1 msgid "Adds an entry in the corresponding subcaption file at the current time stamp." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_updater:1 msgid "Add an update function to the scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.begin_animations:1 msgid "Start the animations of the scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_back:1 msgid "Removes the mobject from the scene and adds them to the back of the scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_front:1 msgid "Adds the passed mobjects to the scene again, pushing them to he front of the scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.clear:1 msgid "Removes all mobjects present in self.mobjects and self.foreground_mobjects from the scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animation_data:1 msgid "Given a list of animations, compile the corresponding static and moving mobjects, and gather the animation durations." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animations:1 msgid "Creates _MethodAnimations from any _AnimationBuilders and updates animation kwargs with kwargs passed to play()." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.construct:1 msgid "Add content to the Scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_attrs:1 msgid "Gets attributes of a scene given the attribute's identifier/name." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 msgid "Returns list of family-members of all mobjects in scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_moving_mobjects:1 msgid "Gets all moving mobjects in the passed animation(s)." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_restructured_mobject_list:1 msgid "Given a list of mobjects and a list of mobjects to be removed, this filters out the removable mobjects from the list of mobjects." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_run_time:1 msgid "Gets the total run time for a list of animations." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 msgid "You will hardly use this when making your own animations." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_top_level_mobjects:1 msgid "Returns all mobjects which are not submobjects." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.interactive_embed:1 msgid "Like embed(), but allows for screen interaction." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.is_current_animation_frozen_frame:1 msgid "Returns whether the current animation produces a static frame (generally a Wait)." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 msgid "Create separation here; the last section gets finished and a new one gets created." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.pause:1 msgid "Pauses the scene (i.e., displays a frozen frame)." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play:1 msgid "Plays an animation in this scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play_internal:1 msgid "This method is used to prep the animations for rendering, apply the arguments and parameters required to them, render them, and write them to the video file." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove:1 msgid "Removes mobjects in the passed list of mobjects from the scene and the foreground, by removing them from \"mobjects\" and \"foreground_mobjects\"" msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobject:1 msgid "Removes a single mobject from the foreground, and internally from the list foreground_mobjects." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobjects:1 msgid "Removes mobjects from the foreground, and internally from the list foreground_mobjects." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_updater:1 msgid "Remove an update function from the scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.render:1 msgid "Renders this Scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.restructure_mobjects:4 msgid "tl:wr" msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.setup:1 msgid "This is meant to be implemented by any scenes which are commonly subclassed, and have some common setup involved before the construct method is called." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.should_update_mobjects:1 msgid "Returns True if the mobjects of this scene should be updated." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.tear_down:1 msgid "This is meant to be implemented by any scenes which are commonly subclassed, and have some common method to be invoked before the scene ends." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.update_mobjects:1 msgid "Begins updating all mobjects in the Scene." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.update_self:1 msgid "Run all scene updater functions." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.wait:1 msgid "Plays a \"no operation\" animation." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:74::1 msgid "Like a wrapper for wait()." msgstr "" #: ../../source/reference/manim.scene.scene.Scene.rst:76 msgid "Attributes" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobject:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_sound:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_subcaption:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_updater:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_back:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_front:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animation_data:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animations:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_attrs:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_moving_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_restructured_mobject_list:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_run_time:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_time_progression:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.next_section:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.pause:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play_internal:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobject:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_updater:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.render:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.restructure_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.update_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.update_self:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.wait:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.wait_until:0 msgid "Parameters" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add:4 msgid "Mobjects to add." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobject:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_back:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_front:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.clear:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animation_data:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animations:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_attrs:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_mobject_family_members:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_moving_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_restructured_mobject_list:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_run_time:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_time_progression:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_top_level_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobject:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.restructure_mobjects:0 msgid "Returns" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add:7 msgid "The same scene after adding the Mobjects in." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobject:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_subcaption:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_updater:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.begin_animations:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_back:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_front:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.clear:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animation_data:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animations:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_attrs:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_mobject_family_members:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_moving_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_restructured_mobject_list:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_run_time:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_time_progression:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_top_level_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.is_current_animation_frozen_frame:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.next_section:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobject:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_updater:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.restructure_mobjects:0 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.should_update_mobjects:0 msgid "Return type" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobject:4 msgid "The Mobject to add to the foreground." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobject:7 msgid "The Scene, with the foreground mobject added." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobjects:4 msgid "The Mobjects to add to the foreground." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_foreground_mobjects:7 msgid "The Scene, with the foreground mobjects added." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_sound:3 msgid "The path to the sound file." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_sound:5 msgid "The offset in the sound file after which the sound can be played." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_sound:8 msgid "Amplification of the sound." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_sound:29 msgid "Download the resource for the previous example `here `_ ." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_subcaption:4 msgid "The current time stamp is obtained from ``Scene.renderer.time``." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_subcaption:6 msgid "The subcaption content." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_subcaption:7 msgid "The duration (in seconds) for which the subcaption is shown." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_subcaption:8 msgid "This offset (in seconds) is added to the starting time stamp of the subcaption." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_subcaption:13 msgid "This example illustrates both possibilities for adding subcaptions to Manimations::" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_updater:3 msgid "The scene updater functions are run every frame, and they are the last type of updaters to run." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_updater:8 msgid "When using the Cairo renderer, scene updaters that modify mobjects are not detected in the same way that mobject updaters are. To be more concrete, a mobject only modified via a scene updater will not necessarily be added to the list of *moving mobjects* and thus might not be updated every frame." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_updater:15 msgid "TL;DR: Use mobject updaters to update mobjects." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.add_updater:17 msgid "The updater function. It takes a float, which is the time difference since the last update (usually equal to the frame rate)." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_back:4 msgid "The mobject(s) to push to the back of the scene." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_back:7 msgid "The Scene, with the mobjects pushed to the back of the scene." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_front:4 msgid "The mobject(s) to bring to the front of the scene." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.bring_to_front:7 msgid "The Scene, with the mobjects brought to the front of the scene." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.clear:4 msgid "The Scene, with all of its mobjects in self.mobjects and self.foreground_mobjects removed." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animation_data:4 msgid "This also begins the animations." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animation_data:6 msgid "Whether the rendering should be skipped, by default False" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animation_data:9 msgid "None if there is nothing to play, or self otherwise." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animations:4 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animations:8 #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play:3 msgid "Animations to be played." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animations:6 msgid "Configuration for the call to play()." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.compile_animations:9 msgid "Tuple[:class:`Animation`]" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.construct:3 msgid "From within :meth:`Scene.construct`, display mobjects on screen by calling :meth:`Scene.add` and remove them from screen by calling :meth:`Scene.remove`. All mobjects currently on screen are kept in :attr:`Scene.mobjects`. Play animations by calling :meth:`Scene.play`." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.construct:9 msgid "Notes" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.construct:10 msgid "Initialization code should go in :meth:`Scene.setup`. Termination code should go in :meth:`Scene.tear_down`." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.construct:15 msgid "A typical manim script includes a class derived from :class:`Scene` with an overridden :meth:`Scene.contruct` method:" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_attrs:3 msgid "Name(s) of the argument(s) to return the attribute of." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_attrs:6 msgid "List of attributes of the passed identifiers." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_mobject_family_members:1 msgid "Returns list of family-members of all mobjects in scene. If a Circle() and a VGroup(Rectangle(),Triangle()) were added, it returns not only the Circle(), Rectangle() and Triangle(), but also the VGroup() object." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_mobject_family_members:6 msgid "List of mobject family members." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_moving_mobjects:3 msgid "The animations to check for moving mobjects." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_moving_mobjects:6 msgid "The list of mobjects that could be moving in the Animation(s)" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_restructured_mobject_list:4 msgid "The Mobjects to check." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_restructured_mobject_list:6 msgid "The list of mobjects to remove." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_restructured_mobject_list:9 msgid "The list of mobjects with the mobjects to remove removed." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_run_time:3 msgid "A list of the animations whose total ``run_time`` is to be calculated." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_run_time:7 msgid "The total ``run_time`` of all of the animations in the list." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_time_progression:1 msgid "You will hardly use this when making your own animations. This method is for Manim's internal use." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_time_progression:4 msgid "Returns a CommandLine ProgressBar whose ``fill_time`` is dependent on the ``run_time`` of an animation, the iterations to perform in that animation and a bool saying whether or not to consider the skipped animations." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_time_progression:10 msgid "The ``run_time`` of the animation." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_time_progression:12 msgid "The number of iterations in the animation." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_time_progression:14 msgid "Whether or not to show skipped animations in the progress bar." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_time_progression:17 msgid "The CommandLine Progress Bar." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.get_top_level_mobjects:3 msgid "List of top level mobjects." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.next_section:1 msgid "Create separation here; the last section gets finished and a new one gets created. ``skip_animations`` skips the rendering of all animations in this section. Refer to :doc:`the documentation
` on how to use sections." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.pause:3 msgid "This is an alias for :meth:`.wait` with ``frozen_frame`` set to ``True``." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.pause:6 msgid "The duration of the pause." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play:4 msgid "The content of the external subcaption that should be added during the animation." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play:6 msgid "The duration for which the specified subcaption is added. If ``None`` (the default), the run time of the animation is taken." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play:9 msgid "An offset (in seconds) for the start time of the added subcaption." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play:11 msgid "All other keywords are passed to the renderer." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play_internal:5 msgid "Animation or mobject with mobject method and params" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.play_internal:6 msgid "named parameters affecting what was passed in ``args``, e.g. ``run_time``, ``lag_ratio`` and so on." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove:5 msgid "The mobjects to remove." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobject:4 msgid "The mobject to remove from the foreground." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobject:7 msgid "The Scene, with the foreground mobject removed." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobjects:4 msgid "The mobject(s) to remove from the foreground." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_foreground_mobjects:7 msgid "The Scene, with the foreground mobjects removed." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.remove_updater:3 msgid "The updater function to be removed." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.render:3 msgid "If true, opens scene in a file viewer." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.restructure_mobjects:2 msgid "If your scene has a Group(), and you removed a mobject from the Group, this dissolves the group and puts the rest of the mobjects directly in self.mobjects or self.foreground_mobjects." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.restructure_mobjects:6 msgid "In cases where the scene contains a group, e.g. Group(m1, m2, m3), but one of its submobjects is removed, e.g. scene.remove(m1), the list of mobjects will be edited to contain other submobjects, but not m1, e.g. it will now insert m2 and m3 to where the group once was." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.restructure_mobjects:11 msgid "The Mobject to remove." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.restructure_mobjects:13 msgid "The list of mobjects (\"mobjects\", \"foreground_mobjects\" etc) to remove from." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.restructure_mobjects:15 msgid "Whether the mobject's families should be recursively extracted." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.restructure_mobjects:18 msgid "The Scene mobject with restructured Mobjects." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.should_update_mobjects:3 msgid "In particular, this checks whether" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.should_update_mobjects:5 msgid "the :attr:`always_update_mobjects` attribute of :class:`.Scene` is set to ``True``," msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.should_update_mobjects:7 msgid "the :class:`.Scene` itself has time-based updaters attached," msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.should_update_mobjects:8 msgid "any mobject in this :class:`.Scene` has time-based updaters attached." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.should_update_mobjects:10 msgid "This is only called when a single Wait animation is played." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.update_mobjects:3 msgid "Change in time between updates. Defaults (mostly) to 1/frames_per_second" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.update_self:3 msgid "Among all types of update functions (mobject updaters, mesh updaters, scene updaters), scene update functions are called last." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.update_self:6 msgid "Scene time since last update." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.wait:3 msgid "The run time of the animation." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.wait:4 msgid "A function without positional arguments that is evaluated every time a frame is rendered. The animation only stops when the return value of the function is truthy. Overrides any value passed to ``duration``." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.wait:7 msgid "If True, updater functions are not evaluated, and the animation outputs a frozen frame. If False, updater functions are called and frames are rendered as usual. If None (the default), the scene tries to determine whether or not the frame is frozen on its own." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.wait_until:1 msgid "Like a wrapper for wait(). You pass a function that determines whether to continue waiting, and a max wait time if that is never fulfilled." msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene.Scene.wait_until:5 msgid "The function whose boolean return value determines whether to continue waiting" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.scene.pot000066400000000000000000000011021515024150700271730ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.scene.rst:2 msgid "scene" msgstr "" #: ../../../manim/scene/scene.py:docstring of manim.scene.scene:1 msgid "Basic canvas for animations." msgstr "" #: ../../source/reference/manim.scene.scene.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.scene.scene.rst:22::1 msgid "A class to handle rerunning a Scene after the input file is modified." msgstr "" manim.scene.scene_file_writer.SceneFileWriter.pot000066400000000000000000000405621515024150700345550ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:2 msgid "SceneFileWriter" msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:4 msgid "Qualified name: ``manim.scene.scene\\_file\\_writer.SceneFileWriter``" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:1 msgid "SceneFileWriter is the object that actually writes the animations played, into video files, using FFMPEG. This is mostly for Manim's internal use. You will rarely, if ever, have to use the methods for this class, unless tinkering with the very fabric of Manim's reality." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:9 msgid "used to segment scene" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:0 msgid "type" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:11 msgid "list of :class:`.Section`" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:15 msgid "where are section videos stored" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:17 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:23 msgid "str" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:21 msgid "name of movie without extension and basis for section video names" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:32 msgid "Some useful attributes are:" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:26 msgid "\"write_to_movie\" (bool=False)" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:27 msgid "Whether or not to write the animations into a video file." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:28 msgid "\"movie_file_extension\" (str=\".mp4\")" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:29 msgid "The file-type extension of the outputted video." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:32 msgid "\"partial_movie_files\"" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter:31 msgid "List of all the partial-movie files." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_audio_segment:1 msgid "This method adds an audio segment from an AudioSegment type object and suitable parameters." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 msgid "Adds a new partial movie file path to `scene.partial_movie_files` and current section from a hash." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_sound:1 msgid "This method adds an audio segment from a sound file." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.begin_animation:1 msgid "Used internally by manim to stream the animation to FFMPEG for displaying or writing to a file." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.clean_cache:1 msgid "Will clean the cache by removing the oldest partial_movie_files." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.close_movie_pipe:1 msgid "Used internally by Manim to gracefully stop writing to FFMPEG's input buffer" msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.combine_to_movie:1 msgid "Used internally by Manim to combine the separate partial movie files that make up a Scene into a single video file for that Scene." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.combine_to_section_videos:1 msgid "Concatenate partial movie files for each section." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.create_audio_segment:1 msgid "Creates an empty, silent, Audio Segment." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.end_animation:1 msgid "Internally used by Manim to stop streaming to FFMPEG gracefully." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 msgid "Finishes writing to the FFMPEG buffer or writing images to output directory." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.finish_last_section:1 msgid "Delete current section if it is empty." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.flush_cache_directory:1 msgid "Delete all the cached partial movie files" msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.get_resolution_directory:1 msgid "Get the name of the resolution directory directly containing the video file." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.init_audio:1 msgid "Preps the writer for adding audio to the movie." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.init_output_directories:1 msgid "Initialise output directories." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.is_already_cached:1 msgid "Will check if a file named with `hash_invocation` exists." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.next_section:1 msgid "Create segmentation cut here." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.open_movie_pipe:1 msgid "Used internally by Manim to initialise FFMPEG and begin writing to FFMPEG's input buffer." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.print_file_ready_message:1 msgid "Prints the \"File Ready\" message to STDOUT." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 msgid "The name is a misnomer." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.write_frame:1 msgid "Used internally by Manim to write a frame to the FFMPEG input buffer." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:46::1 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.write_subcaption_file:1 msgid "Writes the subcaption file." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.SceneFileWriter.rst:48 msgid "Attributes" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_audio_segment:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_partial_movie_file:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_sound:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.begin_animation:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.end_animation:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.is_already_cached:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.next_section:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.save_final_image:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.write_frame:0 msgid "Parameters" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_audio_segment:4 msgid "The audio segment to add" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_audio_segment:6 msgid "the timestamp at which the sound should be added." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_audio_segment:9 msgid "The gain of the segment from the background." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_partial_movie_file:1 msgid "Adds a new partial movie file path to `scene.partial_movie_files` and current section from a hash. This method will compute the path from the hash. In addition to that it adds the new animation to the current section." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_partial_movie_file:4 msgid "Hash of the animation." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_sound:3 msgid "The path to the sound file." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_sound:5 msgid "The timestamp at which the audio should be added." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_sound:7 msgid "The gain of the given audio segment." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.add_sound:9 msgid "This method uses add_audio_segment, so any keyword arguments used there can be referenced here." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.begin_animation:4 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.end_animation:4 msgid "Whether or not to write to a video file." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.combine_to_section_videos:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.finish_last_section:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.get_resolution_directory:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.is_already_cached:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.next_section:0 msgid "Return type" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.finish:1 msgid "Finishes writing to the FFMPEG buffer or writing images to output directory. Combines the partial movie files into the whole scene. If save_last_frame is True, saves the last frame in the default image directory." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.get_resolution_directory:4 msgid "This method gets the name of the directory that immediately contains the video file. This name is ``p``. For example, if you are rendering an 854x480 px animation at 15fps, the name of the directory that immediately contains the video, file will be ``480p15``." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.get_resolution_directory:10 msgid "The file structure should look something like::" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.get_resolution_directory:0 #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.is_already_cached:0 msgid "Returns" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.get_resolution_directory:20 msgid "The name of the directory." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.init_output_directories:4 msgid "Notes" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.init_output_directories:5 msgid "The directories are read from ``config``, for example ``config['media_dir']``. If the target directories don't already exist, they will be created." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.is_already_cached:3 msgid "The hash corresponding to an invocation to either `scene.play` or `scene.wait`." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.is_already_cached:6 msgid "Whether the file exists." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.save_final_image:1 msgid "The name is a misnomer. This method saves the image passed to it as an in the default image directory." msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer.SceneFileWriter.save_final_image:4 msgid "The pixel array of the image to save." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.scene_file_writer.pot000066400000000000000000000007621515024150700316010ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.scene_file_writer.rst:2 msgid "scene\\_file\\_writer" msgstr "" #: ../../../manim/scene/scene_file_writer.py:docstring of manim.scene.scene_file_writer:1 msgid "The interface between scenes and ffmpeg." msgstr "" #: ../../source/reference/manim.scene.scene_file_writer.rst:15 msgid "Classes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.section.DefaultSectionType.pot000066400000000000000000000022431515024150700333230ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.section.DefaultSectionType.rst:2 msgid "DefaultSectionType" msgstr "" #: ../../source/reference/manim.scene.section.DefaultSectionType.rst:4 msgid "Qualified name: ``manim.scene.section.DefaultSectionType``" msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.DefaultSectionType:1 msgid "Bases: :py:class:`str`, :py:class:`enum.Enum`" msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.DefaultSectionType:1 msgid "The type of a section can be used for third party applications. A presentation system could for example use the types to created loops." msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.DefaultSectionType:5 msgid "Examples" msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.DefaultSectionType:6 msgid "This class can be reimplemented for more types::" msgstr "" #: ../../source/reference/manim.scene.section.DefaultSectionType.rst:16 msgid "Attributes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.section.Section.pot000066400000000000000000000065351515024150700311640ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.section.Section.rst:2 msgid "Section" msgstr "" #: ../../source/reference/manim.scene.section.Section.rst:4 msgid "Qualified name: ``manim.scene.section.Section``" msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section:1 msgid "A :class:`.Scene` can be segmented into multiple Sections. Refer to :doc:`the documentation
` for more info. It consists of multiple animations." msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section:0 #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.get_dict:0 msgid "Parameters" msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section:7 msgid "Can be used by a third party applications to classify different types of sections." msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section:11 msgid "Path to video file with animations belonging to section relative to sections directory. If ``None``, then the section will not be saved." msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section:16 msgid "Human readable, non-unique name for this section." msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section:20 msgid "Skip rendering the animations in this section when ``True``." msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section:24 msgid "Animations belonging to this section." msgstr "" #: ../../source/reference/manim.scene.section.Section.rst:14 msgid "Methods" msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.get_clean_partial_movie_files:1::1 #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.get_clean_partial_movie_files:1 msgid "Return all partial movie files that are not ``None``." msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.get_clean_partial_movie_files:1::1 #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.get_dict:1 msgid "Get dictionary representation with metadata of output video." msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.get_clean_partial_movie_files:1::1 #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.is_empty:1 msgid "Check whether this section is empty." msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.get_clean_partial_movie_files:0 #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.get_dict:0 #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.is_empty:0 msgid "Return type" msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section.Section.get_dict:3 msgid "The output from this function is used from every section to build the sections index file. The output video must have been created in the ``sections_dir`` before executing this method. This is the main part of the Segmented Video API." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.section.pot000066400000000000000000000011221515024150700275440ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.section.rst:2 msgid "section" msgstr "" #: ../../../manim/scene/section.py:docstring of manim.scene.section:1 msgid "building blocks of segmented video API" msgstr "" #: ../../source/reference/manim.scene.section.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.scene.section.rst:22::1 msgid "The type of a section can be used for third party applications." msgstr "" manim.scene.three_d_scene.SpecialThreeDScene.pot000066400000000000000000000103611515024150700342460ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.three_d_scene.SpecialThreeDScene.rst:2 msgid "SpecialThreeDScene" msgstr "" #: ../../source/reference/manim.scene.three_d_scene.SpecialThreeDScene.rst:4 msgid "Qualified name: ``manim.scene.three\\_d\\_scene.SpecialThreeDScene``" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene:1 msgid "Bases: :py:class:`manim.scene.three_d_scene.ThreeDScene`" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene:1 msgid "An extension of :class:`ThreeDScene` with more settings." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene:3 msgid "It has some extra configuration for axes, spheres, and an override for low quality rendering. Further key differences are:" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene:7 msgid "The camera shades applicable 3DMobjects by default, except if rendering in low quality." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene:9 msgid "Some default params for Spheres and Axes have been added." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.SpecialThreeDScene.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.scene.three_d_scene.SpecialThreeDScene.rst:23::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_axes:1 msgid "Return a set of 3D axes." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.SpecialThreeDScene.rst:23::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_default_camera_position:1 msgid "Returns the default_angled_camera position." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.SpecialThreeDScene.rst:23::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_sphere:1 msgid "Returns a sphere with the passed keyword arguments as properties." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.SpecialThreeDScene.rst:23::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.set_camera_to_default_position:1 msgid "Sets the camera to its default position." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.SpecialThreeDScene.rst:25 msgid "Attributes" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_axes:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_default_camera_position:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_sphere:0 msgid "Returns" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_axes:3 msgid "A set of 3D axes." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_axes:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_default_camera_position:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_sphere:0 msgid "Return type" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_default_camera_position:3 msgid "Dictionary of phi, theta, focal_distance, and gamma." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_sphere:0 msgid "Parameters" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_sphere:3 msgid "Any valid parameter of :class:`~.Sphere` or :class:`~.Surface`." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.SpecialThreeDScene.get_sphere:5 msgid "The sphere object." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.three_d_scene.ThreeDScene.pot000066400000000000000000000267231515024150700330350ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:2 msgid "ThreeDScene" msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:4 msgid "Qualified name: ``manim.scene.three\\_d\\_scene.ThreeDScene``" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene:1 msgid "Bases: :py:class:`manim.scene.scene.Scene`" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene:1 msgid "This is a Scene, with special configurations and properties that make it suitable for Three Dimensional Scenes." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 msgid "This method is used to prevent the rotation and movement of mobjects as the camera moves around." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 msgid "This method is used to prevent the rotation and tilting of mobjects as the camera moves around." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.begin_3dillusion_camera_rotation:1 msgid "This method creates a 3D camera rotation illusion around the current camera orientation." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.begin_ambient_camera_rotation:1 msgid "This method begins an ambient rotation of the camera about the Z_AXIS, in the anticlockwise direction" msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.get_moving_mobjects:1 msgid "This method returns a list of all of the Mobjects in the Scene that are moving, that are also in the animations passed." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.move_camera:1 msgid "This method animates the movement of the camera to the given spherical coordinates." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 msgid "This method undoes what add_fixed_in_frame_mobjects does." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 msgid "This method \"unfixes\" the orientation of the mobjects passed, meaning they will no longer be at the same angle relative to the camera." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.set_camera_orientation:1 msgid "This method sets the orientation of the camera in the scene." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.set_to_default_angled_camera_orientation:1 msgid "This method sets the default_angled_camera_orientation to the keyword arguments passed, and sets the camera to that orientation." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.stop_3dillusion_camera_rotation:1 msgid "This method stops all illusion camera rotations." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:31::1 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.stop_ambient_camera_rotation:1 msgid "This method stops all ambient camera rotation." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.ThreeDScene.rst:33 msgid "Attributes" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.add_fixed_in_frame_mobjects:1 msgid "This method is used to prevent the rotation and movement of mobjects as the camera moves around. The mobject is essentially overlaid, and is not impacted by the camera's movement in any way." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.add_fixed_in_frame_mobjects:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.add_fixed_orientation_mobjects:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.begin_3dillusion_camera_rotation:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.begin_ambient_camera_rotation:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.get_moving_mobjects:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.move_camera:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.remove_fixed_in_frame_mobjects:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.remove_fixed_orientation_mobjects:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.set_camera_orientation:0 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.set_to_default_angled_camera_orientation:0 msgid "Parameters" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.add_fixed_in_frame_mobjects:6 msgid "The Mobjects whose orientation must be fixed." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.add_fixed_orientation_mobjects:1 msgid "This method is used to prevent the rotation and tilting of mobjects as the camera moves around. The mobject can still move in the x,y,z directions, but will always be at the angle (relative to the camera) that it was at when it was passed through this method.)" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.add_fixed_orientation_mobjects:7 msgid "The Mobject(s) whose orientation must be fixed." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.add_fixed_orientation_mobjects:9 msgid "Some valid kwargs are use_static_center_func : bool center_func : function" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.add_fixed_orientation_mobjects:11 msgid "Some valid kwargs are" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.add_fixed_orientation_mobjects:11 msgid "use_static_center_func : bool center_func : function" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.begin_3dillusion_camera_rotation:4 msgid "The rate at which the camera rotation illusion should operate." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.begin_3dillusion_camera_rotation:5 msgid "The polar angle the camera should move around. Defaults to the current phi angle." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.begin_3dillusion_camera_rotation:7 msgid "The azimutal angle the camera should move around. Defaults to the current theta angle." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.begin_ambient_camera_rotation:4 msgid "The rate at which the camera should rotate about the Z_AXIS. Negative rate means clockwise rotation." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.begin_ambient_camera_rotation:7 msgid "one of 3 options: [\"theta\", \"phi\", \"gamma\"]. defaults to theta." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.get_moving_mobjects:4 msgid "The animations whose mobjects will be checked." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.move_camera:4 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.set_camera_orientation:3 msgid "The polar angle i.e the angle between Z_AXIS and Camera through ORIGIN in radians." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.move_camera:6 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.set_camera_orientation:5 msgid "The azimuthal angle i.e the angle that spins the camera around the Z_AXIS." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.move_camera:8 msgid "The radial focal_distance between ORIGIN and Camera." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.move_camera:10 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.set_camera_orientation:9 msgid "The rotation of the camera about the vector from the ORIGIN to the Camera." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.move_camera:12 msgid "The zoom factor of the camera." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.move_camera:14 #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.set_camera_orientation:13 msgid "The new center of the camera frame in cartesian coordinates." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.move_camera:16 msgid "Any other animations to be played at the same time." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.remove_fixed_in_frame_mobjects:1 msgid "This method undoes what add_fixed_in_frame_mobjects does. It allows the mobject to be affected by the movement of the camera." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.remove_fixed_in_frame_mobjects:5 msgid "The Mobjects whose position and orientation must be unfixed." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.remove_fixed_orientation_mobjects:1 msgid "This method \"unfixes\" the orientation of the mobjects passed, meaning they will no longer be at the same angle relative to the camera. This only makes sense if the mobject was passed through add_fixed_orientation_mobjects first." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.remove_fixed_orientation_mobjects:6 msgid "The Mobjects whose orientation must be unfixed." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.set_camera_orientation:7 msgid "The focal_distance of the Camera." msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene.ThreeDScene.set_camera_orientation:11 msgid "The zoom factor of the scene." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.three_d_scene.pot000066400000000000000000000012251515024150700306730ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.three_d_scene.rst:2 msgid "three\\_d\\_scene" msgstr "" #: ../../../manim/scene/three_d_scene.py:docstring of manim.scene.three_d_scene:1 msgid "A scene suitable for rendering three-dimensional objects and animations." msgstr "" #: ../../source/reference/manim.scene.three_d_scene.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.scene.three_d_scene.rst:22::1 msgid "An extension of :class:`ThreeDScene` with more settings." msgstr "" manim.scene.vector_space_scene.LinearTransformationScene.pot000066400000000000000000000677041515024150700370130ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:2 msgid "LinearTransformationScene" msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:4 msgid "Qualified name: ``manim.scene.vector\\_space\\_scene.LinearTransformationScene``" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:1 msgid "Bases: :py:class:`manim.scene.vector_space_scene.VectorScene`" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:1 msgid "This scene contains special methods that make it especially suitable for showing linear transformations." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_background_mobject:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_foreground_mobject:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_moving_mobject:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_special_mobjects:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_title:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_label:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_mobject:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_unit_square:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_function:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_inverse:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_inverse_transpose:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_matrix:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_nonlinear_transformation:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_transposed_matrix:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_matrix_transformation:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_moving_mobject_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_piece_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_transposed_matrix_transformation:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_unit_square:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_vector_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.write_vector_coordinates:0 msgid "Parameters" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:4 msgid "Whether or not to include the background plane in the scene." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:5 msgid "Whether or not to include the foreground plane in the scene." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:6 msgid "Parameters to be passed to :class:`NumberPlane` to adjust the background plane." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:7 msgid "Parameters to be passed to :class:`NumberPlane` to adjust the foreground plane." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:8 msgid "Whether or not to include the coordinates for the background plane." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:9 msgid "Whether to show the basis x_axis -> ``i_hat`` and y_axis -> ``j_hat`` vectors." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:10 msgid "The ``stroke_width`` of the basis vectors." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:11 msgid "The color of the ``i_hat`` vector." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:12 msgid "The color of the ``j_hat`` vector." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:13 msgid "Indicates the previous position of the basis vectors following a transformation." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene:16 msgid "Examples" msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_background_mobject:1 msgid "Adds the mobjects to the special list self.background_mobjects." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_foreground_mobject:1 msgid "Adds the mobjects to the special list self.foreground_mobjects." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_moving_mobject:1 msgid "Adds the mobject to the special list self.moving_mobject, and adds a property to the mobject called mobject.target, which keeps track of what the mobject will move to or become etc." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_special_mobjects:1 msgid "Adds mobjects to a separate list that can be tracked, if these mobjects have some extra importance." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 msgid "Adds a title, after scaling it, adding a background rectangle, moving it to the top and adding it to foreground_mobjects adding it as a local variable of self." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_label:1 msgid "Method for creating, and animating the addition of a transformable label for the vector." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_mobject:1 msgid "Adds the mobjects to the special list self.transformable_mobjects." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_unit_square:1 msgid "Adds a unit square to the scene via self.get_unit_square." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_vector:1 msgid "Adds a vector to the scene, and puts it in the special list self.moving_vectors." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_function:1 msgid "Applies the given function to each of the mobjects in self.transformable_mobjects, and plays the animation showing this." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_inverse:1 msgid "This method applies the linear transformation represented by the inverse of the passed matrix to the number plane, and each vector/similar mobject on it." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_inverse_transpose:1 msgid "Applies the inverse of the transformation represented by the given transposed matrix to the number plane and each vector/similar mobject on it." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_matrix:1 msgid "Applies the transformation represented by the given matrix to the number plane, and each vector/similar mobject on it." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_nonlinear_transformation:1 msgid "Applies the non-linear transformation represented by the given function to the number plane and each vector/similar mobject on it." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_transposed_matrix:1 msgid "Applies the transformation represented by the given transposed matrix to the number plane, and each vector/similar mobject on it." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_matrix_transformation:1 msgid "Returns a function corresponding to the linear transformation represented by the matrix passed." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 msgid "This method returns an animation that moves a mobject in \"self.moving_mobjects\" to its corresponding .target value." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 msgid "This method returns an animation that moves an arbitrary mobject in \"pieces\" to its corresponding .target value." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_transformable_label_movement:1 msgid "This method returns an animation that moves all labels in \"self.transformable_labels\" to its corresponding .target ." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_transposed_matrix_transformation:1 msgid "Returns a function corresponding to the linear transformation represented by the transposed matrix passed." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_unit_square:1 msgid "Returns a unit square for the current NumberPlane." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 msgid "This method returns an animation that moves a mobject in \"self.moving_vectors\" to its corresponding .target value." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.setup:1 msgid "This is meant to be implemented by any scenes which are commonly subclassed, and have some common setup involved before the construct method is called." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:44::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.write_vector_coordinates:1 msgid "Returns a column matrix indicating the vector coordinates, after writing them to the screen, and adding them to the special list self.foreground_mobjects" msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.LinearTransformationScene.rst:46 msgid "Attributes" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_background_mobject:4 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_mobject:4 msgid "The mobjects to add to the list." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_foreground_mobject:4 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_moving_mobject:7 msgid "The mobjects to add to the list" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_moving_mobject:9 msgid "What the moving_mobject goes to, etc." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_special_mobjects:4 msgid "The special list to which you want to add these mobjects." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_special_mobjects:7 msgid "The mobjects to add." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_title:1 msgid "Adds a title, after scaling it, adding a background rectangle, moving it to the top and adding it to foreground_mobjects adding it as a local variable of self. Returns the Scene." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_title:5 msgid "What the title should be." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_title:7 msgid "How much the title should be scaled by." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_title:9 msgid "Whether or not to animate the addition." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_title:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_label:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_unit_square:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_moving_mobject_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_piece_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_transformable_label_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_vector_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.write_vector_coordinates:0 msgid "Returns" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_title:12 msgid "The scene with the title added to it." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_title:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_label:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_unit_square:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_moving_mobject_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_piece_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_transformable_label_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_unit_square:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_vector_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.write_vector_coordinates:0 msgid "Return type" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_label:4 msgid "The vector for which the label must be added." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_label:6 msgid "The MathTex/string of the label." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_label:8 msgid "The name to give the transformation as a label." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_label:10 msgid "What the label should display after a Linear Transformation" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_label:12 msgid "Any valid keyword argument of get_vector_label" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_transformable_label:14 msgid "The MathTex of the label." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_unit_square:4 msgid "Whether or not to animate the addition with DrawBorderThenFill." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_unit_square:6 msgid "Any valid keyword arguments of self.get_unit_square()" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_unit_square:9 msgid "The unit square." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_vector:4 msgid "It can be a pre-made graphical vector, or the coordinates of one." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_vector:7 msgid "The string of the hex color of the vector. This is only taken into consideration if 'vector' is not an Arrow. Defaults to YELLOW." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_vector:11 msgid "Any valid keyword argument of VectorScene.add_vector." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.add_vector:13 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.write_vector_coordinates:5 msgid "The arrow representing the vector." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_function:5 msgid "The function that affects each point of each mobject in self.transformable_mobjects." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_function:8 msgid "Any other animations that need to be played simultaneously with this." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_function:11 msgid "Any valid keyword argument of a self.play() call." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_inverse:5 msgid "The matrix whose inverse is to be applied." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_inverse:7 msgid "Any valid keyword argument of self.apply_matrix()" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_inverse_transpose:5 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_matrix:5 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_transposed_matrix:5 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_matrix_transformation:4 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_transposed_matrix_transformation:5 msgid "The matrix." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_inverse_transpose:7 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_matrix:7 msgid "Any valid keyword argument of self.apply_transposed_matrix()" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_nonlinear_transformation:5 msgid "The function." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_nonlinear_transformation:7 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.apply_transposed_matrix:7 msgid "Any valid keyword argument of self.apply_function()" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_moving_mobject_movement:1 msgid "This method returns an animation that moves a mobject in \"self.moving_mobjects\" to its corresponding .target value. func is a function that determines where the .target goes." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_moving_mobject_movement:5 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_vector_movement:5 msgid "The function that determines where the .target of the moving mobject goes." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_moving_mobject_movement:9 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_piece_movement:9 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_transformable_label_movement:4 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_vector_movement:9 msgid "The animation of the movement." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_piece_movement:1 msgid "This method returns an animation that moves an arbitrary mobject in \"pieces\" to its corresponding .target value. If self.leave_ghost_vectors is True, ghosts of the original positions/mobjects are left on screen" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_piece_movement:6 msgid "The pieces for which the movement must be shown." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_unit_square:3 msgid "The string of the hex color code of the color wanted." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_unit_square:5 msgid "The opacity of the square" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_unit_square:7 msgid "The stroke_width in pixels of the border of the square" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.get_vector_movement:1 msgid "This method returns an animation that moves a mobject in \"self.moving_vectors\" to its corresponding .target value. func is a function that determines where the .target goes." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.LinearTransformationScene.write_vector_coordinates:7 msgid "Any valid keyword arguments of VectorScene.write_vector_coordinates" msgstr "" manim.scene.vector_space_scene.VectorScene.pot000066400000000000000000000456611515024150700341120ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:2 msgid "VectorScene" msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:4 msgid "Qualified name: ``manim.scene.vector\\_space\\_scene.VectorScene``" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene:1 msgid "Bases: :py:class:`manim.scene.scene.Scene`" msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_axes:1 msgid "Adds a pair of Axes to the Scene." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_plane:1 msgid "Adds a NumberPlane object to the background." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_vector:1 msgid "Returns the Vector after adding it to the Plane." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 msgid "This method writes the vector as a column matrix (henceforth called the label), takes the values in it one by one, and form the corresponding lines that make up the x and y components of the vector." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vector_labels:1 msgid "Returns naming labels for the basis vectors." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vectors:1 msgid "Returns a VGroup of the Basis Vectors (1,0) and (0,1)" msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector:1 msgid "Returns an arrow on the Plane given an input numerical vector." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:1 msgid "Returns naming labels for the passed vector." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.label_vector:1 msgid "Shortcut method for creating, and animating the addition of a label for the vector." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.lock_in_faded_grid:1 msgid "This method freezes the NumberPlane and Axes that were already in the background, and adds new, manipulatable ones to the foreground." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 msgid "This method plays an animation that partially shows the entire plane moving in the direction of a particular vector." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 msgid "This method displays vector as a Vector() based vector, and then shows the corresponding lines that make up the x and y components of the vector." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:34::1 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:1 msgid "Returns a column matrix indicating the vector coordinates, after writing them to the screen." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.VectorScene.rst:36 msgid "Attributes" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_axes:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_plane:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.coords_to_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vector_labels:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vectors:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.label_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.lock_in_faded_grid:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.show_ghost_movement:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.vector_to_coords:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:0 msgid "Parameters" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_axes:3 msgid "Whether or not to animate the addition of the axes through Create." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_axes:5 msgid "The color of the axes. Defaults to WHITE." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_plane:3 msgid "Whether or not to animate the addition of the plane via Create." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_plane:5 msgid "Any valid keyword arguments accepted by NumberPlane." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_plane:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vectors:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.label_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:0 msgid "Returns" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_plane:7 msgid "The NumberPlane object." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_plane:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vectors:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.label_vector:0 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:0 msgid "Return type" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_vector:3 msgid "It can be a pre-made graphical vector, or the coordinates of one." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_vector:6 msgid "The string of the hex color of the vector. This is only taken into consideration if 'vector' is not an Arrow. Defaults to YELLOW." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_vector:10 msgid "Whether or not to animate the addition of the vector by using GrowArrow" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_vector:13 msgid "Any valid keyword argument of Arrow. These are only considered if vector is not an Arrow." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.add_vector:17 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:4 msgid "The arrow representing the vector." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.coords_to_vector:1 msgid "This method writes the vector as a column matrix (henceforth called the label), takes the values in it one by one, and form the corresponding lines that make up the x and y components of the vector. Then, an Vector() based vector is created between the lines on the Screen." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.coords_to_vector:6 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.vector_to_coords:6 msgid "The vector to show." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.coords_to_vector:8 msgid "The starting point of the location of the label of the vector that shows it numerically. Defaults to 2 * RIGHT + 2 * UP or (2,2)" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.coords_to_vector:13 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.vector_to_coords:11 msgid "Whether or not to remove whatever this method did after it's done." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vector_labels:3 msgid "Any valid keyword arguments of get_vector_label: vector, label (str,MathTex) at_tip (bool=False), direction (str=\"left\"), rotate (bool), color (str), label_scale_factor=VECTOR_LABEL_SCALE_FACTOR (int, float)," msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vector_labels:10 msgid "Any valid keyword arguments of get_vector_label:" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vector_labels:5 msgid "vector, label (str,MathTex) at_tip (bool=False), direction (str=\"left\"), rotate (bool), color (str), label_scale_factor=VECTOR_LABEL_SCALE_FACTOR (int, float)," msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vectors:3 msgid "The hex colour to use for the basis vector in the x direction" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vectors:5 msgid "The hex colour to use for the basis vector in the y direction" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_basis_vectors:8 msgid "VGroup of the Vector Mobjects representing the basis vectors." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector:3 msgid "The Vector to plot." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector:5 msgid "Any valid keyword argument of Arrow." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector:7 msgid "The Arrow representing the Vector." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:3 msgid "Vector Object for which to get the label." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:5 msgid "Whether or not to place the label at the tip of the vector." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:7 msgid "If the label should be on the \"left\" or right of the vector." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:9 msgid "Whether or not to rotate it to align it with the vector." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:11 msgid "The color to give the label." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:13 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:14 msgid "How much to scale the label by." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.get_vector_label:16 #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.label_vector:12 msgid "The MathTex of the label." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.label_vector:4 msgid "The vector for which the label must be added." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.label_vector:6 msgid "The MathTex/string of the label." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.label_vector:8 msgid "Whether or not to animate the labelling w/ Write" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.label_vector:10 msgid "Any valid keyword argument of get_vector_label" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.lock_in_faded_grid:4 msgid "The required dimness of the NumberPlane" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.lock_in_faded_grid:6 msgid "The required dimness of the Axes." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.show_ghost_movement:1 msgid "This method plays an animation that partially shows the entire plane moving in the direction of a particular vector. This is useful when you wish to convey the idea of mentally moving the entire plane in a direction, without actually moving the plane." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.show_ghost_movement:6 msgid "The vector which indicates the direction of movement." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.vector_to_coords:1 msgid "This method displays vector as a Vector() based vector, and then shows the corresponding lines that make up the x and y components of the vector. Then, a column matrix (henceforth called the label) is created near the head of the Vector." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.vector_to_coords:8 msgid "Whether or not to round the value displayed. in the vector's label to the nearest integer" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:6 msgid "Any valid keyword arguments of :meth:`~.geometry.Vector.coordinate_label`: integer_labels : :class:`bool` Whether or not to round the coordinates to integers. Default: ``True``. n_dim : :class:`int` The number of dimensions of the vector. Default: ``2``. color The color of the label. Default: ``WHITE``." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:6 msgid "Any valid keyword arguments of :meth:`~.geometry.Vector.coordinate_label`:" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:8 msgid "integer_labels : :class:`bool`" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:7 msgid "bool" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:9 msgid "Whether or not to round the coordinates to integers. Default: ``True``." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:10 msgid "n_dim : :class:`int`" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:9 msgid "int" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:11 msgid "The number of dimensions of the vector. Default: ``2``." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:13 msgid "color" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:13 msgid "The color of the label. Default: ``WHITE``." msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene.VectorScene.write_vector_coordinates:15 msgid "The column matrix representing the vector." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.vector_space_scene.pot000066400000000000000000000012761515024150700317440ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.vector_space_scene.rst:2 msgid "vector\\_space\\_scene" msgstr "" #: ../../../manim/scene/vector_space_scene.py:docstring of manim.scene.vector_space_scene:1 msgid "A scene suitable for vector spaces." msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.scene.vector_space_scene.rst:22::1 msgid "This scene contains special methods that make it especially suitable for showing linear transformations." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.zoomed_scene.ZoomedScene.pot000066400000000000000000000101311515024150700327640ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.zoomed_scene.ZoomedScene.rst:2 msgid "ZoomedScene" msgstr "" #: ../../source/reference/manim.scene.zoomed_scene.ZoomedScene.rst:4 msgid "Qualified name: ``manim.scene.zoomed\\_scene.ZoomedScene``" msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene:1 msgid "Bases: :py:class:`manim.scene.moving_camera_scene.MovingCameraScene`" msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene:1 msgid "This is a Scene with special configurations made for when a particular part of the scene must be zoomed in on and displayed separately." msgstr "" #: ../../source/reference/manim.scene.zoomed_scene.ZoomedScene.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.scene.zoomed_scene.ZoomedScene.rst:24::1 #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.activate_zooming:1 msgid "This method is used to activate the zooming for the zoomed_camera." msgstr "" #: ../../source/reference/manim.scene.zoomed_scene.ZoomedScene.rst:24::1 msgid "Returns the Zoom factor of the Zoomed camera." msgstr "" #: ../../source/reference/manim.scene.zoomed_scene.ZoomedScene.rst:24::1 #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoom_in_animation:1 msgid "Returns the animation of camera zooming in." msgstr "" #: ../../source/reference/manim.scene.zoomed_scene.ZoomedScene.rst:24::1 #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoomed_display_pop_out_animation:1 msgid "This is the animation of the popping out of the mini-display that shows the content of the zoomed camera." msgstr "" #: ../../source/reference/manim.scene.zoomed_scene.ZoomedScene.rst:24::1 #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.setup:1 msgid "This method is used internally by Manim to setup the scene for proper use." msgstr "" #: ../../source/reference/manim.scene.zoomed_scene.ZoomedScene.rst:26 msgid "Attributes" msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.activate_zooming:0 #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoom_in_animation:0 msgid "Parameters" msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.activate_zooming:4 msgid "Whether or not to animate the activation of the zoomed camera." msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoom_factor:1 msgid "Returns the Zoom factor of the Zoomed camera. Defined as the ratio between the height of the zoomed camera and the height of the zoomed mini display. :returns: The zoom factor. :rtype: float" msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoom_in_animation:3 msgid "The run_time of the animation of the camera zooming in." msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoom_in_animation:5 msgid "Any valid keyword arguments of ApplyMethod()" msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoom_in_animation:0 #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoomed_display_pop_out_animation:0 msgid "Returns" msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoom_in_animation:7 msgid "The animation of the camera zooming in." msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoom_in_animation:0 #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene.ZoomedScene.get_zoomed_display_pop_out_animation:0 msgid "Return type" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.scene.zoomed_scene.pot000066400000000000000000000011201515024150700305500ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.scene.zoomed_scene.rst:2 msgid "zoomed\\_scene" msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene:1 msgid "A scene supporting zooming in on a specified section." msgstr "" #: ../../../manim/scene/zoomed_scene.py:docstring of manim.scene.zoomed_scene:5 msgid "Examples" msgstr "" #: ../../source/reference/manim.scene.zoomed_scene.rst:15 msgid "Classes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.bezier.pot000066400000000000000000000271631515024150700274400ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.bezier.rst:2 msgid "bezier" msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier:1 msgid "Utility functions related to Bรฉzier curves." msgstr "" #: ../../source/reference/manim.utils.bezier.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.bezier:1 msgid "Classic implementation of a bezier curve." msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.bezier:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.diag_to_matrix:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.get_smooth_handle_points:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.integer_interpolate:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.interpolate:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.inverse_interpolate:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.is_closed:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.match_interpolate:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.mid:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.partial_bezier_points:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.point_lies_on_bezier:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.proportions_along_bezier_curve_for_point:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.quadratic_bezier_remap:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.split_quadratic_bezier:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.subdivide_quadratic_bezier:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.bezier:3 msgid "points defining the desired bezier curve." msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.bezier:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.get_smooth_handle_points:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.partial_bezier_points:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.point_lies_on_bezier:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.proportions_along_bezier_curve_for_point:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.split_quadratic_bezier:0 msgid "Returns" msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.bezier:6 msgid "function describing the bezier curve." msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.bezier:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.diag_to_matrix:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.get_smooth_handle_points:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.integer_interpolate:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.interpolate:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.inverse_interpolate:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.is_closed:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.match_interpolate:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.mid:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.partial_bezier_points:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.point_lies_on_bezier:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.proportions_along_bezier_curve_for_point:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.quadratic_bezier_remap:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.split_quadratic_bezier:0 #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.subdivide_quadratic_bezier:0 msgid "Return type" msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.diag_to_matrix:1 msgid "Converts array whose rows represent diagonal entries of a matrix into the matrix itself. See scipy.linalg.solve_banded" msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.get_smooth_handle_points:1 msgid "Given some anchors (points), compute handles so the resulting bezier curve is smooth." msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.get_smooth_handle_points:3 msgid "Anchors." msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.get_smooth_handle_points:6 msgid "Computed handles." msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.integer_interpolate:1 msgid "Alpha is a float between 0 and 1. This returns an integer between start and end (inclusive) representing appropriate interpolation between them, along with a \"residue\" representing a new proportion between the returned integer and the next one of the list." msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.integer_interpolate:8 msgid "For example, if start=0, end=10, alpha=0.46, This would return (4, 0.6)." msgstr "" #: ../../../manim/utils/bezier.py:docstring of manim.utils.bezier.partial_bezier_points:1 msgid "Given an array of points which define bezier curve, and two numbers 0<=a:1 msgid "A list of pre-defined colors." msgstr "" #: ../../source/reference/manim.utils.color.rst:29 msgid "Functions" msgstr "" #: ../../../manim/utils/color.py:docstring of manim.utils.color.average_color:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.color_gradient:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.color_to_int_rgb:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.color_to_int_rgba:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.color_to_rgb:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.color_to_rgba:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.get_shaded_rgb:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.hex_to_rgb:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.interpolate_color:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.invert_color:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.rgb_to_color:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.rgb_to_hex:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.rgba_to_color:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/color.py:docstring of manim.utils.color.average_color:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.color_gradient:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.color_to_int_rgb:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.color_to_int_rgba:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.color_to_rgb:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.color_to_rgba:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.get_shaded_rgb:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.hex_to_rgb:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.interpolate_color:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.invert_color:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.random_bright_color:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.random_color:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.rgb_to_color:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.rgb_to_hex:0 #: ../../../manim/utils/color.py:docstring of manim.utils.color.rgba_to_color:0 msgid "Return type" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.commands.pot000066400000000000000000000013141515024150700277470ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.commands.rst:2 msgid "commands" msgstr "" #: ../../source/reference/manim.utils.commands.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/commands.py:docstring of manim.utils.commands.get_dir_layout:1 msgid "Get list of paths relative to dirpath of all files in dir and subdirs recursively." msgstr "" #: ../../../manim/utils/commands.py:docstring of manim.utils.commands.get_dir_layout:0 #: ../../../manim/utils/commands.py:docstring of manim.utils.commands.get_video_metadata:0 msgid "Parameters" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.config_ops.DictAsObject.pot000066400000000000000000000010261515024150700325710ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.config_ops.DictAsObject.rst:2 msgid "DictAsObject" msgstr "" #: ../../source/reference/manim.utils.config_ops.DictAsObject.rst:4 msgid "Qualified name: ``manim.utils.config\\_ops.DictAsObject``" msgstr "" #: ../../../manim/utils/config_ops.py:docstring of manim.utils.config_ops.DictAsObject:1 msgid "Bases: :py:class:`object`" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.config_ops.pot000066400000000000000000000017511515024150700303010ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.config_ops.rst:2 msgid "config\\_ops" msgstr "" #: ../../../manim/utils/config_ops.py:docstring of manim.utils.config_ops:1 msgid "Utilities that might be useful for configuration dictionaries." msgstr "" #: ../../source/reference/manim.utils.config_ops.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.utils.config_ops.rst:29 msgid "Functions" msgstr "" #: ../../../manim/utils/config_ops.py:docstring of manim.utils.config_ops.merge_dicts_recursively:1 msgid "Creates a dict whose keyset is the union of all the input dictionaries. The value for each key is based on the first dict in the list with that key." msgstr "" #: ../../../manim/utils/config_ops.py:docstring of manim.utils.config_ops.merge_dicts_recursively:5 msgid "dicts later in the list have higher priority" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.debug.pot000066400000000000000000000033601515024150700272370ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.debug.rst:2 msgid "debug" msgstr "" #: ../../../manim/utils/debug.py:docstring of manim.utils.debug:1 msgid "Debugging utilities." msgstr "" #: ../../source/reference/manim.utils.debug.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/debug.py:docstring of manim.utils.debug.index_labels:1 msgid "Returns a :class:`~.VGroup` of :class:`~.Integer` mobjects that shows the index of each submobject." msgstr "" #: ../../../manim/utils/debug.py:docstring of manim.utils.debug.index_labels:4 msgid "Useful for working with parts of complicated mobjects." msgstr "" #: ../../../manim/utils/debug.py:docstring of manim.utils.debug.index_labels:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/debug.py:docstring of manim.utils.debug.index_labels:6 msgid "The mobject that will have its submobjects labelled." msgstr "" #: ../../../manim/utils/debug.py:docstring of manim.utils.debug.index_labels:7 msgid "The height of the labels, by default 0.15." msgstr "" #: ../../../manim/utils/debug.py:docstring of manim.utils.debug.index_labels:8 msgid "The stroke width of the outline of the labels, by default 5." msgstr "" #: ../../../manim/utils/debug.py:docstring of manim.utils.debug.index_labels:9 msgid "The stroke color of the outline of labels." msgstr "" #: ../../../manim/utils/debug.py:docstring of manim.utils.debug.index_labels:10 msgid "Additional parameters to be passed into the :class`~.Integer` mobjects used to construct the labels." msgstr "" #: ../../../manim/utils/debug.py:docstring of manim.utils.debug.index_labels:14 msgid "Examples" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.deprecation.pot000066400000000000000000000170211515024150700304450ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.deprecation.rst:2 msgid "deprecation" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation:1 msgid "Decorators for deprecating classes, functions and function parameters." msgstr "" #: ../../source/reference/manim.utils.deprecation.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:1 msgid "Decorator to mark a callable as deprecated." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:3 msgid "The decorated callable will cause a warning when used. The docstring of the deprecated callable is adjusted to indicate that this callable is deprecated." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:0 #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:6 msgid "The function to be decorated. Should not be set by the user." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:7 #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:10 msgid "The version or date since deprecation." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:8 #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:11 msgid "The version or date until removal of the deprecated callable." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:9 msgid "The identifier of the callable replacing the deprecated one." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:10 #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:12 msgid "The reason for why the callable has been deprecated." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:0 #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:0 msgid "Returns" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:12 #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:25 msgid "The decorated callable." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:0 #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:0 msgid "Return type" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:16 #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:32 msgid "Examples" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:17 #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:33 msgid "Basic usage::" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:43 msgid "You can specify additional information for a more precise warning::" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated:59 msgid "You may also use dates instead of versions::" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:1 msgid "Decorator to mark parameters of a callable as deprecated." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:3 msgid "It can also be used to automatically redirect deprecated parameter values to their replacements." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:6 msgid "The parameters to be deprecated. Can consist of: * An iterable of strings, with each element representing a parameter to deprecate * A single string, with parameter names separated by commas or spaces." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:6 msgid "The parameters to be deprecated. Can consist of:" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:8 msgid "An iterable of strings, with each element representing a parameter to deprecate" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:9 msgid "A single string, with parameter names separated by commas or spaces." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:13 msgid "A list of parameter redirections. Each redirection can be one of the following: * A tuple of two strings. The first string defines the name of the deprecated parameter; the second string defines the name of the parameter to redirect to, when attempting to use the first string. * A function performing the mapping operation. The parameter names of the function determine which parameters are used as input. The function must return a dictionary which contains the redirected arguments. Redirected parameters are also implicitly deprecated." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:13 msgid "A list of parameter redirections. Each redirection can be one of the following:" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:15 msgid "A tuple of two strings. The first string defines the name of the deprecated parameter; the second string defines the name of the parameter to redirect to, when attempting to use the first string." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:19 msgid "A function performing the mapping operation. The parameter names of the function determine which parameters are used as input. The function must return a dictionary which contains the redirected arguments." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:23 msgid "Redirected parameters are also implicitly deprecated." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:0 msgid "Raises" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:28 msgid "If no parameters are defined (neither explicitly nor implicitly)." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:29 msgid "If defined parameters are invalid python identifiers." msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:47 msgid "You can also specify additional information for a more precise warning::" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:63 msgid "Basic parameter redirection::" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:79 msgid "Redirecting using a calculated value::" msgstr "" #: ../../../manim/utils/deprecation.py:docstring of manim.utils.deprecation.deprecated_params:93 msgid "Redirecting multiple parameter values to one::" msgstr "" manim.utils.docbuild.manim_directive.ManimDirective.pot000066400000000000000000000000011515024150700357010ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.docbuild.manim_directive.pot000066400000000000000000000000011515024150700330610ustar00rootroot00000000000000 manim.utils.docbuild.manim_directive.skip_manim_node.pot000066400000000000000000000000011515024150700361350ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.docbuild.pot000066400000000000000000000002331515024150700277320ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.hashing.pot000066400000000000000000000045111515024150700275710ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.hashing.rst:2 msgid "hashing" msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing:1 msgid "Utilities for scene caching." msgstr "" #: ../../source/reference/manim.utils.hashing.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_hash_from_play_call:1 msgid "Take the list of animations and a list of mobjects and output their hashes. This is meant to be used for `scene.play` function." msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_hash_from_play_call:0 #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_json:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_hash_from_play_call:3 msgid "The scene object." msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_hash_from_play_call:5 msgid "The camera object used in the scene." msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_hash_from_play_call:7 msgid "The list of animations." msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_hash_from_play_call:9 msgid "The list of mobjects." msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_hash_from_play_call:0 #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_json:0 msgid "Returns" msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_hash_from_play_call:12 msgid "A string concatenation of the respective hashes of `camera_object`, `animations_list` and `current_mobjects_list`, separated by `_`." msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_hash_from_play_call:0 #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_json:0 msgid "Return type" msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_json:1 msgid "Recursively serialize `object` to JSON using the :class:`CustomEncoder` class." msgstr "" #: ../../../manim/utils/hashing.py:docstring of manim.utils.hashing.get_json:3 msgid "The dict to flatten" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.images.pot000066400000000000000000000015741515024150700274230ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.images.rst:2 msgid "images" msgstr "" #: ../../../manim/utils/images.py:docstring of manim.utils.images:1 msgid "Image manipulation utilities." msgstr "" #: ../../source/reference/manim.utils.images.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/images.py:docstring of manim.utils.images.change_to_rgba_array:1 msgid "Converts an RGB array into RGBA with the alpha value opacity maxed." msgstr "" #: ../../../manim/utils/images.py:docstring of manim.utils.images.drag_pixels:0 #: ../../../manim/utils/images.py:docstring of manim.utils.images.get_full_raster_image_path:0 #: ../../../manim/utils/images.py:docstring of manim.utils.images.invert_image:0 msgid "Parameters" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.ipython_magic.ManimMagic.pot000066400000000000000000000142501515024150700330040ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.ipython_magic.ManimMagic.rst:2 msgid "ManimMagic" msgstr "" #: ../../source/reference/manim.utils.ipython_magic.ManimMagic.rst:4 msgid "Qualified name: ``manim.utils.ipython\\_magic.ManimMagic``" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic:1 msgid "Bases: :py:class:`IPython.core.magic.Magics`" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic:1 msgid "Create a configurable given a config config." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic:0 #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic:3 msgid "If this is empty, default values are used. If config is a :class:`Config` instance, it will be used to configure the instance." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic:7 msgid "The parent Configurable instance of this object." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic:11 msgid "Notes" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic:12 msgid "Subclasses of Configurable must call the :meth:`__init__` method of :class:`Configurable` *before* doing anything else and using :func:`super`::" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic:21 msgid "This ensures that instances will be configured properly." msgstr "" #: ../../source/reference/manim.utils.ipython_magic.ManimMagic.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.utils.ipython_magic.ManimMagic.rst:21::1 msgid "Render Manim scenes contained in IPython cells." msgstr "" #: ../../source/reference/manim.utils.ipython_magic.ManimMagic.rst:23 msgid "Attributes" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:1::1 #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:1::1 msgid "A trait whose value must be an instance of a specified class." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:1::1 msgid "A contextmanager for running a block with our cross validation lock set to True." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:1 msgid "Render Manim scenes contained in IPython cells. Works as a line or cell magic." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:6 msgid "This line and cell magic works best when used in a JupyterLab environment: while all of the functionality is available for classic Jupyter notebooks as well, it is possible that videos sometimes don't update on repeated execution of the same cell if the scene name stays the same." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:12 msgid "This problem does not occur when using JupyterLab." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:14 msgid "Please refer to ``_ for more information about JupyterLab and Jupyter notebooks." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:17 msgid "Usage in line mode::" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:21 msgid "Usage in cell mode::" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:29 msgid "Run ``%manim --help`` and ``%manim render --help`` for possible command line interface options." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:33 msgid "The maximal width of the rendered videos that are displayed in the notebook can be configured via the ``media_width`` configuration option. The default is set to ``25vw``, which is 25% of your current viewport width. To allow the output to become as large as possible, set ``config.media_width = \"100%\"``." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:38 msgid "The ``media_embed`` option will embed the image/video output in the notebook. This is generally undesirable as it makes the notebooks very large, but is required on some platforms (notably Google's CoLab, where it is automatically enabled unless suppressed by ``config.embed = False``) and needed in cases when the notebook (or converted HTML file) will be moved relative to the video locations. Use-cases include building documentation with Sphinx and JupyterBook. See also the :mod:`manim directive for Sphinx `." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:47 msgid "Examples" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:48 msgid "First make sure to put ``import manim``, or even ``from manim import *`` in a cell and evaluate it. Then, a typical Jupyter notebook cell for Manim could look as follows::" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:64 msgid "Evaluating this cell will render and display the ``BannerExample`` scene defined in the body of the cell." msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic.ManimMagic.manim:68 msgid "In case you want to hide the red box containing the output progress bar, the ``progress_bar`` config option should be set to ``None``. This can also be done by passing ``--progress_bar None`` as a CLI flag." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.ipython_magic.pot000066400000000000000000000007751515024150700310120ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.ipython_magic.rst:2 msgid "ipython\\_magic" msgstr "" #: ../../../manim/utils/ipython_magic.py:docstring of manim.utils.ipython_magic:1 msgid "Utilities for using Manim with IPython (in particular: Jupyter notebooks)" msgstr "" #: ../../source/reference/manim.utils.ipython_magic.rst:15 msgid "Classes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.iterables.pot000066400000000000000000000275071515024150700301340ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.iterables.rst:2 msgid "iterables" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables:1 msgid "Operations on iterables." msgstr "" #: ../../source/reference/manim.utils.iterables.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_n_tuples:1 msgid "Returns the Sequence objects cyclically split into n length tuples." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_n_tuples:6 msgid "alias with n=2" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_n_tuples:9 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_pairs:6 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.batch_by_property:8 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.concatenate_lists:4 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_difference_update:4 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_update:6 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.listify:4 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even:10 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even_by_cycling:10 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.remove_nones:4 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_array:13 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_preserving_order:16 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_with_interpolation:16 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.tuplify:4 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.uniq_chain:5 msgid "Examples" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_n_tuples:10 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_pairs:7 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.batch_by_property:9 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.concatenate_lists:5 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_difference_update:5 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_update:7 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.listify:5 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even:11 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even_by_cycling:11 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.remove_nones:5 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_array:14 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_preserving_order:17 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_with_interpolation:17 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.tuplify:5 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.uniq_chain:6 msgid "Normal usage::" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_n_tuples:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_pairs:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.all_elements_are_instances:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.batch_by_property:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.concatenate_lists:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_difference_update:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_update:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even_by_cycling:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.remove_list_redundancies:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.remove_nones:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_array:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_preserving_order:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_with_interpolation:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.stretch_array_to_length:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.uniq_chain:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_n_tuples:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_pairs:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.all_elements_are_instances:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.batch_by_property:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.concatenate_lists:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_difference_update:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_update:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.listify:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even_by_cycling:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.remove_list_redundancies:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.remove_nones:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_array:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_preserving_order:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_with_interpolation:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.stretch_array_to_length:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.tuplify:0 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.uniq_chain:0 msgid "Return type" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.adjacent_pairs:1 msgid "Alias for ``adjacent_n_tuples(objects, 2)``." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.all_elements_are_instances:1 msgid "Returns ``True`` if all elements of iterable are instances of Class. False otherwise." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.batch_by_property:1 msgid "Takes in a Sequence, and returns a list of tuples, (batch, prop) such that all items in a batch have the same output when put into the Callable property_func, and such that chaining all these batches together would give the original Sequence (i.e. order is preserved)." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.concatenate_lists:1 msgid "Combines the Iterables provided as arguments into one list." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_difference_update:1 msgid "Returns a list containing all the elements of l1 not in l2." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_update:3 msgid "Used instead of ``set.update()`` to maintain order," msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.list_update:2 msgid "making sure duplicates are removed from l1, not l2. Removes overlap of l1 and l2 and then concatenates l2 unchanged." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.listify:1 msgid "Converts obj to a list intelligently." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even:2 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even_by_cycling:2 msgid "Extends the shorter of the two iterables with duplicate values until its" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even:2 msgid "length is equal to the longer iterable (favours earlier elements)." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even:7 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_preserving_order:10 msgid "cycles elements instead of favouring earlier ones" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even_by_cycling:2 msgid "length is equal to the longer iterable (cycles over shorter iterable)." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.make_even_by_cycling:7 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_array:7 msgid "favours earlier elements instead of cycling them" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.remove_list_redundancies:1 msgid "Used instead of ``list(set(l))`` to maintain order. Keeps the last occurrence of each element." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.remove_nones:1 msgid "Removes elements where bool(x) evaluates to False." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_array:2 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_preserving_order:5 #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_with_interpolation:5 msgid "Extends/truncates nparray so that ``len(result) == length``." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_array:2 msgid "The elements of nparray are cycled to achieve the desired length." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_array:10 msgid "similar cycling behaviour for balancing 2 iterables" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_preserving_order:2 msgid "The elements of nparray are duplicated to achieve the desired length (favours earlier elements)." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_preserving_order:5 msgid "Constructs a zeroes array of length if nparray is empty." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_preserving_order:13 msgid "similar earlier-favouring behaviour for balancing 2 iterables" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_with_interpolation:2 msgid "New elements are interpolated to achieve the desired length." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_with_interpolation:4 msgid "Note that if nparray's length changes, its dtype may too (e.g. int -> float: see Examples)" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_with_interpolation:10 msgid "cycles elements instead of interpolating" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.resize_with_interpolation:13 msgid "favours earlier elements instead of interpolating" msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.tuplify:1 msgid "Converts obj to a tuple intelligently." msgstr "" #: ../../../manim/utils/iterables.py:docstring of manim.utils.iterables.uniq_chain:2 msgid "Returns a generator that yields all unique elements of the Iterables" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.paths.pot000066400000000000000000000073711515024150700272760ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.paths.rst:2 msgid "paths" msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths:1 msgid "Functions determining transformation paths between sets of points." msgstr "" #: ../../source/reference/manim.utils.paths.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.clockwise_path:1 msgid "This function transforms each point by moving clockwise around a half circle." msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.clockwise_path:4 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.counterclockwise_path:4 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_arc:7 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_circles:10 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.spiral_path:7 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.straight_path:4 msgid "Examples" msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.clockwise_path:0 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.counterclockwise_path:0 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_arc:0 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_circles:0 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.spiral_path:0 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.straight_path:0 msgid "Return type" msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.counterclockwise_path:1 msgid "This function transforms each point by moving counterclockwise around a half circle." msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_arc:1 msgid "This function transforms each point by moving it along a circular arc." msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_arc:0 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_circles:0 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.spiral_path:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_arc:3 msgid "The angle each point traverses around a circular arc." msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_arc:4 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_circles:7 #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.spiral_path:4 msgid "The axis of rotation." msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_circles:1 msgid "This function transforms each point by moving it roughly along a circle, each with its own specified center." msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_circles:3 msgid "The path may be seen as each point smoothly changing its orbit from its starting position to its destination." msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_circles:5 msgid "The angle each point traverses around the quasicircle." msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.path_along_circles:6 msgid "The centers of each point's quasicircle to rotate around." msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.spiral_path:1 msgid "This function transforms each point by moving along a spiral to its destination." msgstr "" #: ../../../manim/utils/paths.py:docstring of manim.utils.paths.spiral_path:3 msgid "The angle each point traverses around a spiral." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.rate_functions.pot000066400000000000000000000134771515024150700312060ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.rate_functions.rst:2 msgid "rate\\_functions" msgstr "" #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions:1 msgid "A selection of rate functions, i.e., *speed curves* for animations. Please find a standard list at https://easings.net/. Here is a picture for the non-standard ones" msgstr "" #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions:46 msgid "There are primarily 3 kinds of standard easing functions:" msgstr "" #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions:48 msgid "Ease In - The animation has a smooth start." msgstr "" #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions:49 msgid "Ease Out - The animation has a smooth end." msgstr "" #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions:50 msgid "Ease In Out - The animation has a smooth start as well as smooth end." msgstr "" #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions:52 msgid "The standard functions are not exported, so to use them you do something like this: rate_func=rate_functions.ease_in_sine On the other hand, the non-standard functions, which are used more commonly, are exported and can be used directly." msgstr "" #: ../../source/reference/manim.utils.rate_functions.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.double_smooth:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_back:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_bounce:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_circ:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_cubic:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_elastic:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_expo:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_out_back:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_out_bounce:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_out_circ:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_out_cubic:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_out_elastic:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_out_expo:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_out_quad:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_out_quart:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_out_quint:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_out_sine:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_quad:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_quart:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_quint:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_in_sine:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_out_back:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_out_bounce:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_out_circ:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_out_cubic:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_out_elastic:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_out_expo:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_out_quad:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_out_quart:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_out_quint:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.ease_out_sine:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.exponential_decay:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.linear:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.lingering:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.not_quite_there:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.running_start:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.rush_from:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.rush_into:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.slow_into:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.smooth:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.squish_rate_func:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.there_and_back:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.there_and_back_with_pause:0 #: ../../../manim/utils/rate_functions.py:docstring of manim.utils.rate_functions.wiggle:0 msgid "Parameters" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.scale.LinearBase.pot000066400000000000000000000000011515024150700312310ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.scale.LogBase.pot000066400000000000000000000000011515024150700305400ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.scale.pot000066400000000000000000000000011515024150700272250ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.simple_functions.pot000066400000000000000000000114541515024150700315350ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.simple_functions.rst:2 msgid "simple\\_functions" msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions:1 msgid "A collection of simple functions." msgstr "" #: ../../source/reference/manim.utils.simple_functions.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.binary_search:1 msgid "Searches for a value in a range by repeatedly dividing the range in half." msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.binary_search:3 msgid "To be more precise, performs numerical binary search to determine the input to ``function``, between the bounds given, that outputs ``target`` to within ``tolerance`` (default of 0.0001). Returns ``None`` if no input can be found within the bounds." msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.binary_search:9 #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.clip:8 #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.get_parameters:5 msgid "Examples" msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.binary_search:10 msgid "Consider the polynomial :math:`x^2 + 3x + 1` where we search for a target value of :math:`11`. An exact solution is :math:`x = 2`." msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.binary_search:22 msgid "Searching in the interval :math:`[0, 5]` for a target value of :math:`71` does not yield a solution::" msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.binary_search:0 #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.choose:0 #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.get_parameters:0 #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.sigmoid:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.binary_search:0 #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.choose:0 #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.get_parameters:0 #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.sigmoid:0 msgid "Return type" msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.choose:1 msgid "The binomial coefficient n choose k." msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.choose:3 msgid ":math:`\\binom{n}{k}` describes the number of possible choices of :math:`k` elements from a set of :math:`n` elements." msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.choose:7 #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.sigmoid:7 msgid "References" msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.choose:8 msgid "https://en.wikipedia.org/wiki/Combination" msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.choose:9 msgid "https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.comb.html" msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.clip:1 msgid "Clips ``a`` to the interval [``min_a``, ``max_a``]." msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.clip:3 msgid "Accepts any comparable objects (i.e. those that support <, >). Returns ``a`` if it is between ``min_a`` and ``max_a``. Otherwise, whichever of ``min_a`` and ``max_a`` is closest." msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.get_parameters:1 msgid "Return the parameters of ``function`` as an ordered mapping of parameters' names to their corresponding ``Parameter`` objects." msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.sigmoid:1 msgid "Returns the output of the logistic function." msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.sigmoid:3 msgid "The logistic function, a common example of a sigmoid function, is defined as :math:`\\frac{1}{1 + e^{-x}}`." msgstr "" #: ../../../manim/utils/simple_functions.py:docstring of manim.utils.simple_functions.sigmoid:8 msgid "https://en.wikipedia.org/wiki/Sigmoid_function" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.sounds.pot000066400000000000000000000005401515024150700274610ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.sounds.rst:2 msgid "sounds" msgstr "" #: ../../../manim/utils/sounds.py:docstring of manim.utils.sounds:1 msgid "Sound-related utility functions." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.space_ops.pot000066400000000000000000000567231515024150700301400ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.space_ops.rst:2 msgid "space\\_ops" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops:1 msgid "Utility functions for two- and three-dimensional vectors." msgstr "" #: ../../source/reference/manim.utils.space_ops.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.R3_to_complex:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_axis_from_quaternion:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_between_vectors:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_of_vector:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.cartesian_to_spherical:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.center_of_mass:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.compass_directions:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.complex_to_R3:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.earclip_triangulation:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.find_intersection:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.get_unit_normal:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.get_winding_number:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.line_intersection:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.midpoint:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.norm_squared:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.normalize:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.normalize_along_axis:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.perpendicular_bisector:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_conjugate:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_from_angle_axis:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_mult:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotate_vector:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_about_z:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix_from_quaternion:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix_transpose:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix_transpose_from_quaternion:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.shoelace:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.shoelace_direction:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.spherical_to_cartesian:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.thick_diagonal:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.z_to_vector:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.R3_to_complex:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_axis_from_quaternion:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_between_vectors:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_of_vector:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.cartesian_to_spherical:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.center_of_mass:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.compass_directions:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.complex_to_R3:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.earclip_triangulation:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.find_intersection:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.get_unit_normal:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.get_winding_number:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.line_intersection:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.midpoint:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.norm_squared:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.normalize:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.normalize_along_axis:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.perpendicular_bisector:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_conjugate:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_from_angle_axis:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_mult:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotate_vector:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_about_z:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix_from_quaternion:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix_transpose:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix_transpose_from_quaternion:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.shoelace:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.shoelace_direction:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.spherical_to_cartesian:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.thick_diagonal:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.z_to_vector:0 msgid "Return type" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_axis_from_quaternion:1 msgid "Gets angle and axis from a quaternion." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_axis_from_quaternion:3 msgid "The quaternion from which we get the angle and axis." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_axis_from_quaternion:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_between_vectors:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_of_vector:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.center_of_mass:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.compass_directions:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.earclip_triangulation:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.get_unit_normal:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.line_intersection:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.midpoint:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.normalize_along_axis:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.perpendicular_bisector:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_conjugate:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_from_angle_axis:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_mult:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotate_vector:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_about_z:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix_transpose_from_quaternion:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.shoelace:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.shoelace_direction:0 msgid "Returns" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_axis_from_quaternion:5 msgid "Gives the angle and axis" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_between_vectors:1 msgid "Returns the angle between two vectors. This angle will always be between 0 and pi" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_between_vectors:4 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.get_unit_normal:3 msgid "The first vector." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_between_vectors:5 msgid "The second vector." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_between_vectors:7 msgid "The angle between the vectors." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_of_vector:1 msgid "Returns polar coordinate theta when vector is projected on xy plane." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_of_vector:3 msgid "The vector to find the angle for." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.angle_of_vector:5 msgid "The angle of the vector projected." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.cartesian_to_spherical:1 msgid "Returns an array of numbers corresponding to each polar coordinate value (distance, phi, theta)." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.cartesian_to_spherical:4 msgid "A numpy array ``[x, y, z]``." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.center_of_mass:1 msgid "Gets the center of mass of the points in space." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.center_of_mass:3 msgid "The points to find the center of mass from." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.center_of_mass:5 msgid "The center of mass of the points." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.compass_directions:1 msgid "Finds the cardinal directions using tau." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.compass_directions:3 msgid "The amount to be rotated, by default 4" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.compass_directions:4 msgid "The direction for the angle to start with, by default RIGHT" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.compass_directions:6 msgid "The angle which has been rotated." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.earclip_triangulation:1 msgid "Returns a list of indices giving a triangulation of a polygon, potentially with holes." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.earclip_triangulation:4 msgid "verts is a numpy array of points." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.earclip_triangulation:5 msgid "ring_ends is a list of indices indicating where" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.earclip_triangulation:8 msgid "A list of indices giving a triangulation of a polygon." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.find_intersection:1 msgid "Return the intersection of a line passing through p0 in direction v0 with one passing through p1 in direction v1 (or array of intersections from arrays of such points/directions). For 3d values, it returns the point on the ray p0 + v0 * t closest to the ray p1 + v1 * t" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.get_unit_normal:1 msgid "Gets the unit normal of the vectors." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.get_unit_normal:4 msgid "The second vector" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.get_unit_normal:5 msgid "[description], by default 1e-6" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.get_unit_normal:7 msgid "The normal of the two vectors." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.line_intersection:1 msgid "Returns the intersection point of two lines, each defined by a pair of distinct points lying on the line." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.line_intersection:4 msgid "A list of two points that determine the first line." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.line_intersection:5 msgid "A list of two points that determine the second line." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.line_intersection:7 msgid "The intersection points of the two lines which are intersecting." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.line_intersection:0 #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotate_vector:0 msgid "Raises" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.line_intersection:10 msgid "Error is produced if the two lines don't intersect with each other or if the coordinates don't lie on the xy-plane." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.midpoint:1 msgid "Gets the midpoint of two points." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.midpoint:3 msgid "The first point." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.midpoint:4 msgid "The second point." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.midpoint:6 msgid "The midpoint of the points" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.normalize_along_axis:1 msgid "Normalizes an array with the provided axis." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.normalize_along_axis:3 msgid "The array which has to be normalized." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.normalize_along_axis:4 msgid "The axis to be normalized to." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.normalize_along_axis:6 msgid "Array which has been normalized according to the axis." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.perpendicular_bisector:1 msgid "Returns a list of two points that correspond to the ends of the perpendicular bisector of the two points given." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.perpendicular_bisector:5 msgid "a list of two numpy array points (corresponding to the ends of a line)." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.perpendicular_bisector:7 msgid "the vector perpendicular to both the line given and the perpendicular bisector." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.perpendicular_bisector:10 msgid "A list of two numpy array points that correspond to the ends of the perpendicular bisector" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_conjugate:1 msgid "Used for finding the conjugate of the quaternion" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_conjugate:3 msgid "The quaternion for which you want to find the conjugate for." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_conjugate:5 msgid "The conjugate of the quaternion." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_from_angle_axis:1 msgid "Gets a quaternion from an angle and an axis. For more information, check `this Wikipedia page `__." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_from_angle_axis:5 msgid "The angle for the quaternion." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_from_angle_axis:6 msgid "The axis for the quaternion" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_from_angle_axis:7 msgid "Checks whether the axis is normalized, by default False" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_from_angle_axis:10 msgid "Gives back a quaternion from the angle and axis" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_mult:1 msgid "Gets the Hamilton product of the quaternions provided. For more information, check `this Wikipedia page `__." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.quaternion_mult:5 msgid "Returns a list of product of two quaternions." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:1 msgid "Generates regularly spaced vertices around a circle centered at the origin." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:3 msgid "The number of vertices" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:4 msgid "The radius of the circle that the vertices are placed on." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:5 msgid "The angle the vertices start at. If unspecified, for even ``n`` values, ``0`` will be used. For odd ``n`` values, 90 degrees is used." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:5 msgid "The angle the vertices start at." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:7 msgid "If unspecified, for even ``n`` values, ``0`` will be used. For odd ``n`` values, 90 degrees is used." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:10 msgid "* **vertices** (:class:`numpy.ndarray`) -- The regularly spaced vertices. * **start_angle** (:class:`float`) -- The angle the vertices start at." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:10 msgid "**vertices** (:class:`numpy.ndarray`) -- The regularly spaced vertices." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.regular_vertices:11 msgid "**start_angle** (:class:`float`) -- The angle the vertices start at." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotate_vector:1 msgid "Function for rotating a vector." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotate_vector:3 msgid "The vector to be rotated." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotate_vector:4 msgid "The angle to be rotated by." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotate_vector:5 msgid "The axis to be rotated, by default OUT" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotate_vector:7 msgid "The rotated vector with provided angle and axis." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotate_vector:10 msgid "If vector is not of dimension 2 or 3." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_about_z:1 msgid "Returns a rotation matrix for a given angle." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_about_z:3 msgid "Angle for the rotation matrix." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_about_z:6 msgid "Gives back the rotated matrix." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix:1 msgid "Rotation in R^3 about a specified axis of rotation." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix_transpose_from_quaternion:1 msgid "Converts the quaternion, quat, to an equivalent rotation matrix representation. For more information, check `this page `_." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix_transpose_from_quaternion:5 msgid "The quaternion which is to be converted." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.rotation_matrix_transpose_from_quaternion:7 msgid "Gives back the Rotation matrix representation, returned as a 3-by-3 matrix or 3-by-3-by-N multidimensional array." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.shoelace:1 msgid "2D implementation of the shoelace formula." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.shoelace:3 msgid "Returns signed area." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.shoelace_direction:1 msgid "Uses the area determined by the shoelace method to determine whether the input set of points is directed clockwise or counterclockwise." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.shoelace_direction:4 msgid "Either ``\"CW\"`` or ``\"CCW\"``." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.spherical_to_cartesian:1 msgid "Returns a numpy array ``[x, y, z]`` based on the spherical coordinates given." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.spherical_to_cartesian:4 msgid "A list of three floats that correspond to the following: r - The distance between the point and the origin. theta - The azimuthal angle of the point to the positive x-axis. phi - The vertical angle of the point to the positive z-axis." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.spherical_to_cartesian:4 msgid "A list of three floats that correspond to the following:" msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.spherical_to_cartesian:6 msgid "r - The distance between the point and the origin." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.spherical_to_cartesian:8 msgid "theta - The azimuthal angle of the point to the positive x-axis." msgstr "" #: ../../../manim/utils/space_ops.py:docstring of manim.utils.space_ops.spherical_to_cartesian:10 msgid "phi - The vertical angle of the point to the positive z-axis." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.strings.pot000066400000000000000000000000011515024150700276270ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.tex.TexTemplate.pot000066400000000000000000000146051515024150700312100ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.tex.TexTemplate.rst:2 msgid "TexTemplate" msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplate.rst:4 msgid "Qualified name: ``manim.utils.tex.TexTemplate``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:1 msgid "TeX templates are used for creating Tex() and MathTex() objects." msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.add_to_document:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.add_to_preamble:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression_in_env:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:3 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:18 msgid "The TeX compiler to be used, e.g. ``latex``, ``pdflatex`` or ``lualatex``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:5 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:24 msgid "The output format resulting from compilation, e.g. ``.dvi`` or ``.pdf``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:7 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:30 msgid "The command defining the documentclass, e.g. ``\\documentclass[preview]{standalone}``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:9 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:36 msgid "The document's preamble, i.e. the part between ``\\documentclass`` and ``\\begin{document}``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:11 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:42 msgid "Text in the document that will be replaced by the expression to be rendered" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:13 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:48 msgid "Text (definitions, commands) to be inserted at right after ``\\begin{document}``, e.g. ``\\boldmath``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate:0 msgid "type" msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplate.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplate.rst:24::1 msgid "Adds txt to the TeX template just after \\begin{document}, e.g." msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplate.rst:24::1 msgid "Adds stuff to the TeX template's preamble (e.g." msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplate.rst:24::1 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression:1 msgid "Inserts expression verbatim into TeX template." msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplate.rst:24::1 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression_in_env:1 msgid "Inserts expression into TeX template wrapped in \\begin{environment} and \\end{environment}" msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplate.rst:26 msgid "Attributes" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.add_to_document:1 msgid "Adds txt to the TeX template just after \\begin{document}, e.g. ``\\boldmath``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.add_to_document:3 msgid "String containing the text to be added." msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.add_to_preamble:1 msgid "Adds stuff to the TeX template's preamble (e.g. definitions, packages). Text can be inserted at the beginning or at the end of the preamble." msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.add_to_preamble:3 msgid "String containing the text to be added, e.g. ``\\usepackage{hyperref}``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.add_to_preamble:5 msgid "Whether the text should be added at the beginning of the preamble, i.e. right after ``\\documentclass``. Default is to add it at the end of the preamble, i.e. right before ``\\begin{document}``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression:3 msgid "The string containing the expression to be typeset, e.g. ``$\\sqrt{2}$``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression_in_env:0 msgid "Returns" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression:6 msgid "LaTeX code based on current template, containing the given ``expression`` and ready for typesetting" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression_in_env:0 msgid "Return type" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression_in_env:3 msgid "The string containing the expression to be typeset, e.g. ``$\\\\sqrt{2}$``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplate.get_texcode_for_expression_in_env:5 msgid "The string containing the environment in which the expression should be typeset, e.g. ``align*``" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.tex.TexTemplateFromFile.pot000066400000000000000000000106021515024150700326250ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.tex.TexTemplateFromFile.rst:2 msgid "TexTemplateFromFile" msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplateFromFile.rst:4 msgid "Qualified name: ``manim.utils.tex.TexTemplateFromFile``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:1 msgid "Bases: :py:class:`manim.utils.tex.TexTemplate`" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:1 msgid "A TexTemplate object created from a template file (default: tex_template.tex)" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile.add_to_document:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile.add_to_preamble:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:3 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:35 msgid "The TeX compiler to be used, e.g. ``latex``, ``pdflatex`` or ``lualatex``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:5 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:41 msgid "The output format resulting from compilation, e.g. ``.dvi`` or ``.pdf``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:7 msgid "The command defining the documentclass, e.g. ``\\documentclass[preview]{standalone}``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:9 msgid "The document's preamble, i.e. the part between ``\\documentclass`` and ``\\begin{document}``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:11 msgid "Text in the document that will be replaced by the expression to be rendered" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:13 msgid "Text (definitions, commands) to be inserted at right after ``\\begin{document}``, e.g. ``\\boldmath``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:15 msgid "The kwargs specified can only be strings." msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:18 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:23 msgid "Path to a valid TeX template file" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:0 #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:0 msgid "type" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile:29 msgid "Content of the TeX template file" msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplateFromFile.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplateFromFile.rst:22::1 msgid "Adds txt to the TeX template just after \\begin{document}, e.g." msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplateFromFile.rst:22::1 msgid "Adds stuff to the TeX template's preamble (e.g." msgstr "" #: ../../source/reference/manim.utils.tex.TexTemplateFromFile.rst:24 msgid "Attributes" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile.add_to_document:1 msgid "Adds txt to the TeX template just after \\begin{document}, e.g. ``\\boldmath``" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile.add_to_document:3 msgid "String containing the text to be added." msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile.add_to_preamble:1 msgid "Adds stuff to the TeX template's preamble (e.g. definitions, packages). Text can be inserted at the beginning or at the end of the preamble." msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex.TexTemplateFromFile.add_to_preamble:3 msgid "String containing the text to be added, e.g. ``\\usepackage{hyperref}``" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.tex.pot000066400000000000000000000010761515024150700267530ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.tex.rst:2 msgid "tex" msgstr "" #: ../../../manim/utils/tex.py:docstring of manim.utils.tex:1 msgid "Utilities for processing LaTeX templates." msgstr "" #: ../../source/reference/manim.utils.tex.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.utils.tex.rst:22::1 msgid "TeX templates are used for creating Tex() and MathTex() objects." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.tex_file_writing.pot000066400000000000000000000143441515024150700315170ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.tex_file_writing.rst:2 msgid "tex\\_file\\_writing" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing:1 msgid "Interface for writing, compiling, and converting ``.tex`` files." msgstr "" #: ../../source/reference/manim.utils.tex_file_writing.rst:20 msgid "Functions" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.compile_tex:1 msgid "Compiles a tex_file into a .dvi or a .xdv or a .pdf" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.compile_tex:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.convert_to_svg:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.generate_tex_file:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_compilation_command:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_to_svg_file:0 msgid "Parameters" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.compile_tex:3 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_compilation_command:7 msgid "File name of TeX file to be typeset." msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.compile_tex:5 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_compilation_command:3 msgid "String containing the compiler to be used, e.g. ``pdflatex`` or ``lualatex``" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.compile_tex:7 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_compilation_command:5 msgid "String containing the output format generated by the compiler, e.g. ``.dvi`` or ``.pdf``" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.compile_tex:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.convert_to_svg:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.generate_tex_file:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_compilation_command:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_to_svg_file:0 msgid "Returns" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.compile_tex:10 msgid "Path to generated output file in desired format (DVI, XDV or PDF)." msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.compile_tex:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.convert_to_svg:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.generate_tex_file:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_compilation_command:0 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_to_svg_file:0 msgid "Return type" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.convert_to_svg:1 msgid "Converts a .dvi, .xdv, or .pdf file into an svg using dvisvgm." msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.convert_to_svg:3 msgid "File name of the input file to be converted." msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.convert_to_svg:5 msgid "String containing the file extension and thus indicating the file type, e.g. ``.dvi`` or ``.pdf``" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.convert_to_svg:7 msgid "Page to be converted if input file is multi-page." msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.convert_to_svg:10 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_to_svg_file:10 msgid "Path to generated SVG file." msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.generate_tex_file:1 msgid "Takes a tex expression (and an optional tex environment), and returns a fully formed tex file ready for compilation." msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.generate_tex_file:4 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_to_svg_file:3 msgid "String containing the TeX expression to be rendered, e.g. ``\\sqrt{2}`` or ``foo``" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.generate_tex_file:6 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_to_svg_file:5 msgid "The string containing the environment in which the expression should be typeset, e.g. ``align*``" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.generate_tex_file:8 #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_to_svg_file:7 msgid "Template class used to typesetting. If not set, use default template set via `config[\"tex_template\"]`" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.generate_tex_file:11 msgid "Path to generated TeX file" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_compilation_command:1 msgid "Prepares the tex compilation command with all necessary cli flags" msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_compilation_command:9 msgid "Path to the directory where compiler output will be stored." msgstr "" #: ../../../manim/utils/tex_file_writing.py:docstring of manim.utils.tex_file_writing.tex_compilation_command:12 msgid "Compilation command according to given parameters" msgstr "" manim.utils.tex_templates.TexFontTemplates.pot000066400000000000000000000375531515024150700342300ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.tex_templates.TexFontTemplates.rst:2 msgid "TexFontTemplates" msgstr "" #: ../../source/reference/manim.utils.tex_templates.TexFontTemplates.rst:4 msgid "Qualified name: ``manim.utils.tex\\_templates.TexFontTemplates``" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates:1 msgid "A collection of TeX templates for the fonts described at http://jf.burnol.free.fr/showcase.html" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates:3 msgid "These templates are specifically designed to allow you to typeset formulae and mathematics using different fonts. They are based on the mathastext LaTeX package." msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates:7 msgid "Examples" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates:8 msgid "Normal usage as a value for the keyword argument tex_template of Tex() and MathTex() mobjects::" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates:13 msgid "Notes" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates:14 msgid "Many of these templates require that specific fonts are installed on your local machine. For example, choosing the template TexFontTemplates.comic_sans will not compile if the Comic Sans Microsoft font is not installed." msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates:20 msgid "To experiment, try to render the TexFontTemplateLibrary example scene:" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates:20 msgid "``manim path/to/manim/example_scenes/advanced_tex_fonts.py TexFontTemplateLibrary -p -ql``" msgstr "" #: ../../source/reference/manim.utils.tex_templates.TexFontTemplates.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.utils.tex_templates.TexFontTemplates.rst:21 msgid "Attributes" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1 msgid "American Typewriter" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.antykwa:1 msgid "Antykwa Pรณล‚tawskiego (TX Fonts for Greek and math symbols)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.apple_chancery:1 msgid "Apple Chancery" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.auriocus_kalligraphicus:1 msgid "Auriocus Kalligraphicus (Symbol Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.baskervald_adf_fourier:1 msgid "Baskervald ADF with Fourier" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.baskerville_it:1 msgid "Baskerville (Italic)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.biolinum:1 msgid "Biolinum" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.brushscriptx:1 msgid "BrushScriptX-Italic (PX math and Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.chalkboard_se:1 msgid "Chalkboard SE" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.chalkduster:1 msgid "Chalkduster" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.comfortaa:1 msgid "Comfortaa" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.comic_sans:1 msgid "Comic Sans MS" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.droid_sans:1 msgid "Droid Sans" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.droid_sans_it:1 msgid "Droid Sans (Italic)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.droid_serif:1 msgid "Droid Serif" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.droid_serif_px_it:1 msgid "Droid Serif (PX math symbols) (Italic)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.ecf_augie:1 msgid "ECF Augie (Euler Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.ecf_jd:1 msgid "ECF JD (with TX fonts)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.ecf_skeetch:1 msgid "ECF Skeetch (CM Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.ecf_tall_paul:1 msgid "ECF Tall Paul (with Symbol font)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.ecf_webster:1 msgid "ECF Webster (with TX fonts)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.electrum_adf:1 msgid "Electrum ADF (CM Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.epigrafica:1 msgid "Epigrafica" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.fourier_utopia:1 msgid "Fourier Utopia (Fourier upright Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.french_cursive:1 msgid "French Cursive (Euler Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.gfs_bodoni:1 msgid "GFS Bodoni" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.gfs_didot:1 msgid "GFS Didot (Italic)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.gfs_neoHellenic:1 msgid "GFS NeoHellenic" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.gnu_freesans_tx:1 msgid "GNU FreeSerif (and TX fonts symbols)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.gnu_freeserif_freesans:1 msgid "GNU FreeSerif and FreeSans" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.helvetica_fourier_it:1 msgid "Helvetica with Fourier (Italic)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.latin_modern_tw:1 msgid "Latin Modern Typewriter Proportional" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.latin_modern_tw_it:1 msgid "Latin Modern Typewriter Proportional (CM Greek) (Italic)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.libertine:1 msgid "Libertine" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.libris_adf_fourier:1 msgid "Libris ADF with Fourier" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.minion_pro_myriad_pro:1 msgid "Minion Pro and Myriad Pro (and TX fonts symbols)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.minion_pro_tx:1 msgid "Minion Pro (and TX fonts symbols)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.new_century_schoolbook:1 msgid "New Century Schoolbook (Symbol Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.new_century_schoolbook_px:1 msgid "New Century Schoolbook (Symbol Greek, PX math symbols)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.noteworthy_light:1 msgid "Noteworthy Light" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.palatino:1 msgid "Palatino (Symbol Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.papyrus:1 msgid "Papyrus" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.romande_adf_fourier_it:1 msgid "Romande ADF with Fourier (Italic)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.slitex:1 msgid "SliTeX (Euler Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.times_fourier_it:1 msgid "Times with Fourier (Italic)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.urw_avant_garde:1 msgid "URW Avant Garde (Symbol Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.urw_zapf_chancery:1 msgid "URW Zapf Chancery (CM Greek)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.venturis_adf_fourier_it:1 msgid "Venturis ADF with Fourier (Italic)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.verdana_it:1 msgid "Verdana (Italic)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.vollkorn:1 msgid "Vollkorn (TX fonts for Greek and math symbols)" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexFontTemplates.american_typewriter:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexFontTemplates.vollkorn_fourier_it:1 msgid "Vollkorn with Fourier (Italic)" msgstr "" manim.utils.tex_templates.TexTemplateLibrary.pot000066400000000000000000000041671515024150700345360ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.tex_templates.TexTemplateLibrary.rst:2 msgid "TexTemplateLibrary" msgstr "" #: ../../source/reference/manim.utils.tex_templates.TexTemplateLibrary.rst:4 msgid "Qualified name: ``manim.utils.tex\\_templates.TexTemplateLibrary``" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexTemplateLibrary:1 msgid "Bases: :py:class:`object`" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexTemplateLibrary:1 msgid "A collection of basic TeX template objects" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexTemplateLibrary:4 msgid "Examples" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexTemplateLibrary:5 msgid "Normal usage as a value for the keyword argument tex_template of Tex() and MathTex() mobjects::" msgstr "" #: ../../source/reference/manim.utils.tex_templates.TexTemplateLibrary.rst:14 msgid "Methods" msgstr "" #: ../../source/reference/manim.utils.tex_templates.TexTemplateLibrary.rst:21 msgid "Attributes" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexTemplateLibrary.ctex:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexTemplateLibrary.ctex:1 msgid "An instance of the TeX template used by 3b1b when using the use_ctex flag" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexTemplateLibrary.ctex:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexTemplateLibrary.default:1 msgid "An instance of the default TeX template in manim" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates.TexTemplateLibrary.ctex:1::1 #: ../../source/docstring of manim.utils.tex_templates.TexTemplateLibrary.simple:1 msgid "An instance of a simple TeX template with only basic AMS packages loaded" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim.utils.tex_templates.pot000066400000000000000000000012171515024150700310260ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference/manim.utils.tex_templates.rst:2 msgid "tex\\_templates" msgstr "" #: ../../../manim/utils/tex_templates.py:docstring of manim.utils.tex_templates:1 msgid "A library of LaTeX templates." msgstr "" #: ../../source/reference/manim.utils.tex_templates.rst:15 msgid "Classes" msgstr "" #: ../../source/reference/manim.utils.tex_templates.rst:22::1 msgid "A collection of TeX templates for the fonts described at http://jf.burnol.free.fr/showcase.html" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim_directive.ManimDirective.pot000066400000000000000000000000011515024150700317350ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim_directive.pot000066400000000000000000000000011515024150700270360ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference/manim_directive.skip_manim_node.pot000066400000000000000000000000011515024150700321710ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/reference_index/000077500000000000000000000000001515024150700243535ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/reference_index/animations.pot000066400000000000000000000036601515024150700272460ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference_index/animations.rst:2 msgid "Animations" msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Animate mobjects." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Animation of a mobject boundary and tracing of points." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Tools for displaying multiple animations at once." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Animate the display or removal of a mobject from a scene." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Fading in and out of view." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Animations that introduce mobjects to scene by growing them from points." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Animations drawing attention to particular mobjects." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Animations related to movement." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Animations for changing numbers." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Animations related to rotation." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Utilities for modifying the speed at which animations are played." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Animations transforming one mobject into another." msgstr "" #: ../../source/reference_index/animations.rst:23::1 msgid "Animations that try to transform Mobjects while keeping track of identical parts." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference_index/cameras.pot000066400000000000000000000013711515024150700265140ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference_index/cameras.rst:2 msgid "Cameras" msgstr "" #: ../../source/reference_index/cameras.rst:13::1 msgid "A camera converts the mobjects contained in a Scene into an array of pixels." msgstr "" #: ../../source/reference_index/cameras.rst:13::1 msgid "A camera that allows mapping between objects." msgstr "" #: ../../source/reference_index/cameras.rst:13::1 msgid "A camera able to move through a scene." msgstr "" #: ../../source/reference_index/cameras.rst:13::1 msgid "A camera supporting multiple perspectives." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference_index/configuration.pot000066400000000000000000000010761515024150700277520ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference_index/configuration.rst:2 msgid "Configuration" msgstr "" #: ../../source/reference_index/configuration.rst:5 msgid "Module Index" msgstr "" #: ../../source/reference_index/configuration.rst:14::1 msgid "Set the global config and logger." msgstr "" #: ../../source/reference_index/configuration.rst:14::1 msgid "Utilities to create and set the config." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference_index/mobjects.pot000066400000000000000000000035071515024150700267120ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference_index/mobjects.rst:2 msgid "Mobjects" msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Special rectangles." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Various geometric Mobjects." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Mobjects used to represent mathematical graphs (think graph theory, not plotting)." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Coordinate systems and function graphing related mobjects." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Utilities for Manim's logo and banner." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Mobjects representing matrices." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Base classes for objects that can be displayed." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Mobjects related to SVG images." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Mobjects representing tables." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Mobjects used to display Text using Pango or LaTeX." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Three-dimensional mobjects." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Specialized mobject base classes." msgstr "" #: ../../source/reference_index/mobjects.rst:22::1 msgid "Simple mobjects that can be used for storing (and updating) a value." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference_index/scenes.pot000066400000000000000000000017141515024150700263620ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference_index/scenes.rst:2 msgid "Scenes" msgstr "" #: ../../source/reference_index/scenes.rst:15::1 msgid "A scene whose camera can be moved around." msgstr "" #: ../../source/reference_index/scenes.rst:15::1 msgid "building blocks of segmented video API" msgstr "" #: ../../source/reference_index/scenes.rst:15::1 msgid "Basic canvas for animations." msgstr "" #: ../../source/reference_index/scenes.rst:15::1 msgid "The interface between scenes and ffmpeg." msgstr "" #: ../../source/reference_index/scenes.rst:15::1 msgid "A scene suitable for rendering three-dimensional objects and animations." msgstr "" #: ../../source/reference_index/scenes.rst:15::1 msgid "A scene suitable for vector spaces." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reference_index/utilities_misc.pot000066400000000000000000000051211515024150700301240ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/reference_index/utilities_misc.rst:2 msgid "Utilities and other modules" msgstr "" #: ../../source/reference_index/utilities_misc.rst:5 msgid "Module Index" msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Constant definitions." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Utility functions related to Bรฉzier curves." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Colors and utility functions for conversion between different color models." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Utilities that might be useful for configuration dictionaries." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Decorators for deprecating classes, functions and function parameters." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Debugging utilities." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Utilities for scene caching." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Utilities for using Manim with IPython (in particular: Jupyter notebooks)" msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Image manipulation utilities." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Operations on iterables." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Functions determining transformation paths between sets of points." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "A selection of rate functions, i.e., *speed curves* for animations." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "A collection of simple functions." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Sound-related utility functions." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Utility functions for two- and three-dimensional vectors." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "Utilities for processing LaTeX templates." msgstr "" #: ../../source/reference_index/utilities_misc.rst:31::1 msgid "A library of LaTeX templates." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/reporting_bugs.pot000066400000000000000000000000011515024150700247720ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/tutorials.pot000066400000000000000000000000011515024150700237670ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/tutorials/000077500000000000000000000000001515024150700232545ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/gettext/tutorials/a_deeper_look.pot000066400000000000000000000000011515024150700265570ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/tutorials/building_blocks.pot000066400000000000000000000354101515024150700271350ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/tutorials/building_blocks.rst:3 msgid "Manim's building blocks" msgstr "" #: ../../source/tutorials/building_blocks.rst:5 msgid "This document explains the building blocks of manim and will give you all the necessary tools to start producing your own videos." msgstr "" #: ../../source/tutorials/building_blocks.rst:8 msgid "Essentially, manim puts at your disposal three different concepts that you can orchestrate together to produce mathematical animations: the **mathematical object** (or **mobject** for short), the **animation**, and the **scene**. As we will see in the following sections, each of these three concepts is implemented in manim as a separate class: the :class:`.Mobject`, :class:`.Animation`, and :class:`.Scene` classes." msgstr "" #: ../../source/tutorials/building_blocks.rst:15 msgid "It is recommended that you read the tutorials :doc:`quickstart` and :doc:`output_and_config` before reading this page." msgstr "" #: ../../source/tutorials/building_blocks.rst:21 msgid "Mobjects" msgstr "" #: ../../source/tutorials/building_blocks.rst:23 msgid "Mobjects are the basic building blocks for all manim animations. Each class that derives from :class:`.Mobject` represents an object that can be displayed on the screen. For example, simple shapes such as :class:`.Circle`, :class:`.Arrow`, and :class:`.Rectangle` are all mobjects. More complicated constructs such as :class:`.Axes`, :class:`.FunctionGraph`, or :class:`.BarChart` are mobjects as well." msgstr "" #: ../../source/tutorials/building_blocks.rst:30 msgid "If you try to display an instance of :class:`.Mobject` on the screen, you will only see an empty frame. The reason is that the :class:`.Mobject` class is an abstract base class of all other mobjects, i.e. it does not have any pre-determined visual shape that can be displayed on the screen. It is only the skeleton of a thing that *could* be displayed. Therefore, you will rarely need to use plain instances of :class:`.Mobject`; instead, you will most likely create instances of its derived classes. One of these derived classes is :class:`.VMobject`. The ``V`` stands for Vectorized Mobject. In essence, a vmobject is a mobject that uses `vector graphics `_ to be displayed. Most of the time, you will be dealing with vmobjects, though we will continue to use the term \"mobject\" to refer to the class of shapes that can be displayed on the screen, as it is more general." msgstr "" #: ../../source/tutorials/building_blocks.rst:44 msgid "Any object that can be displayed on the screen is a ``mobject``, even if it is not necessarily *mathematical* in nature." msgstr "" #: ../../source/tutorials/building_blocks.rst:47 msgid "To see examples of classes derived from :class:`.Mobject`, see the :mod:`.geometry` module. Most of these are in fact derived from :class:`.VMobject` as well." msgstr "" #: ../../source/tutorials/building_blocks.rst:53 msgid "Creating and displaying mobjects" msgstr "" #: ../../source/tutorials/building_blocks.rst:55 msgid "As explained in :doc:`quickstart`, usually all of the code in a manim script is put inside the :meth:`.construct` method of a :class:`.Scene` class. To display a mobject on the screen, call the :meth:`~.Scene.add` method of the containing :class:`.Scene`. This is the principal way of displaying a mobject on the screen when it is not being animated. To remove a mobject from the screen, simply call the :meth:`~.Scene.remove` method from the containing :class:`.Scene`." msgstr "" #: ../../source/tutorials/building_blocks.rst:75 msgid "Placing mobjects" msgstr "" #: ../../source/tutorials/building_blocks.rst:77 msgid "Let's define a new :class:`.Scene` called ``Shapes`` and :meth:`~.Scene.add` some mobjects to it. This script generates a static picture that displays a circle, a square, and a triangle:" msgstr "" #: ../../source/tutorials/building_blocks.rst:96 msgid "By default, mobjects are placed at the center of coordinates, or *origin*, when they are first created. They are also given some default colors. Further, the ``Shapes`` scene places the mobjects by using the :meth:`.shift` method. The square is shifted one unit in the ``UP`` direction from the origin, while the circle and triangle are shifted one unit ``LEFT`` and ``RIGHT``, respectively." msgstr "" #: ../../source/tutorials/building_blocks.rst:102 msgid "Unlike other graphics software, manim places the center of coordinates at the center of the screen. The positive vertical direction is up, and the positive horizontal direction is right. See also the constants ``ORIGIN``, ``UP``, ``DOWN``, ``LEFT``, ``RIGHT``, and others, defined in the :mod:`.constants` module." msgstr "" #: ../../source/tutorials/building_blocks.rst:108 msgid "There are many other possible ways to place mobjects on the screen, for example :meth:`.move_to`, :meth:`.next_to`, and :meth:`.align_to`. The next scene ``MobjectPlacement`` uses all three." msgstr "" #: ../../source/tutorials/building_blocks.rst:130 msgid "The :meth:`.move_to` method uses absolute units (measured relative to the ``ORIGIN``), while :meth:`.next_to` uses relative units (measured from the mobject passed as the first argument). :meth:`align_to` uses ``LEFT`` not as measuring units but as a way to determine the border to use for alignment. The coordinates of the borders of a mobject are determined using an imaginary bounding box around it." msgstr "" #: ../../source/tutorials/building_blocks.rst:137 msgid "Many methods in manim can be chained together. For example the two lines" msgstr "" #: ../../source/tutorials/building_blocks.rst:145 msgid "can be replaced by" msgstr "" #: ../../source/tutorials/building_blocks.rst:151 msgid "Technically, this is possible because most methods calls return the modified mobject." msgstr "" #: ../../source/tutorials/building_blocks.rst:155 msgid "Styling mobjects" msgstr "" #: ../../source/tutorials/building_blocks.rst:157 msgid "The following scene changes the default aesthetics of the mobjects." msgstr "" #: ../../source/tutorials/building_blocks.rst:174 msgid "This scene uses two of the main functions that change the visual style of a mobject: :meth:`.set_stroke` and :meth:`.set_fill`. The former changes the visual style of the mobject's border while the latter changes the style of the interior. By default, most mobjects have a fully transparent interior so you must specify the ``opacity`` parameter to display the color. An opacity of ``1.0`` means fully opaque, while ``0.0`` means fully transparent." msgstr "" #: ../../source/tutorials/building_blocks.rst:181 msgid "Only instances of :class:`.VMobject` implement :meth:`.set_stroke` and :meth:`.set_fill`. Instances of :class:`.Mobject` implement :meth:`.~Mobject.set_color` instead. The vast majority of pre-defined classes are derived from :class:`.VMobject` so it is usually safe to assume that you have access to :meth:`.set_stroke` and :meth:`.set_fill`." msgstr "" #: ../../source/tutorials/building_blocks.rst:189 msgid "Mobject on-screen order" msgstr "" #: ../../source/tutorials/building_blocks.rst:191 msgid "The next scene is exactly the same as the ``MobjectStyling`` scene from the previous section, except for exactly one line." msgstr "" #: ../../source/tutorials/building_blocks.rst:209 msgid "The only difference here (besides the scene name) is the order in which the mobjects are added to the scene. In ``MobjectStyling``, we added them as ``add(circle, square, triangle)``, whereas in ``MobjectZOrder`` we add them as ``add(triangle, square, circle)``." msgstr "" #: ../../source/tutorials/building_blocks.rst:214 msgid "As you can see, the order of the arguments of :meth:`~.Scene.add` determines the order that the mobjects are displayed on the screen, with the left-most arguments being put in the back." msgstr "" #: ../../source/tutorials/building_blocks.rst:221 msgid "Animations" msgstr "" #: ../../source/tutorials/building_blocks.rst:223 msgid "At the heart of manim is animation. Generally, you can add an animation to your scene by calling the :meth:`~.Scene.play` method." msgstr "" #: ../../source/tutorials/building_blocks.rst:243 msgid "Put simply, animations are procedures that interpolate between two mobjects. For example, :code:`FadeIn(square)` starts with a fully transparent version of :code:`square` and ends with a fully opaque version, interpolating between them by gradually increasing the opacity. :class:`.FadeOut` works in the opposite way: it interpolates from fully opaque to fully transparent. As another example, :class:`.Rotate` starts with the mobject passed to it as argument, and ends with the same object but rotated by a certain amount, this time interpolating the mobject's angle instead of its opacity." msgstr "" #: ../../source/tutorials/building_blocks.rst:254 msgid "Animating methods" msgstr "" #: ../../source/tutorials/building_blocks.rst:256 msgid "Any property of a mobject that can be changed can be animated. In fact, any method that changes a mobject's property can be used as an animation, through the use of :meth:`.animate`." msgstr "" #: ../../source/tutorials/building_blocks.rst:276 msgid ":meth:`.animate` is a property of all mobjects that animates the methods that come afterward. For example, :code:`square.set_fill(WHITE)` sets the fill color of the square, while :code:`square.animate.set_fill(WHITE)` animates this action." msgstr "" #: ../../source/tutorials/building_blocks.rst:281 msgid "Animation run time" msgstr "" #: ../../source/tutorials/building_blocks.rst:283 msgid "By default, any animation passed to :meth:`play` lasts for exactly one second. Use the :code:`run_time` argument to control the duration." msgstr "" #: ../../source/tutorials/building_blocks.rst:296 msgid "Creating a custom animation" msgstr "" #: ../../source/tutorials/building_blocks.rst:298 msgid "Even though Manim has many built-in animations, you will find times when you need to smoothly animate from one state of a :class:`~.Mobject` to another. If you find yourself in that situation, then you can define your own custom animation. You start by extending the :class:`~.Animation` class and overriding its :meth:`~.Animation.interpolate_mobject`. The :meth:`~.Animation.interpolate_mobject` method receives alpha as a parameter that starts at 0 and changes throughout the animation. So, you just have to manipulate self.mobject inside Animation according to the alpha value in its interpolate_mobject method. Then you get all the benefits of :class:`~.Animation` such as playing it for different run times or using different rate functions." msgstr "" #: ../../source/tutorials/building_blocks.rst:305 msgid "Let's say you start with a number and want to create a :class:`~.Transform` animation that transforms it to a target number. You can do it using :class:`~.FadeTransform`, which will fade out the starting number and fade in the target number. But when we think about transforming a number from one to another, an intuitive way of doing it is by incrementing or decrementing it smoothly. Manim has a feature that allows you to customize this behavior by defining your own custom animation." msgstr "" #: ../../source/tutorials/building_blocks.rst:310 msgid "You can start by creating your own ``Count`` class that extends :class:`~.Animation`. The class can have a constructor with three arguments, a :class:`~.DecimalNumber` Mobject, start, and end. The constructor will pass the :class:`~.DecimalNumber` Mobject to the super constructor (in this case, the :class:`~.Animation` constructor) and will set start and end." msgstr "" #: ../../source/tutorials/building_blocks.rst:314 msgid "The only thing that you need to do is to define how you want it to look at every step of the animation. Manim provides you with the alpha value in the :meth:`~.Animation.interpolate_mobject` method based on frame rate of video, rate function, and run time of animation played. The alpha parameter holds a value between 0 and 1 representing the step of the currently playing animation. For example, 0 means the beginning of the animation, 0.5 means halfway through the animation, and 1 means the end of the animation." msgstr "" #: ../../source/tutorials/building_blocks.rst:319 msgid "In the case of the ``Count`` animation, you just have to figure out a way to determine the number to display at the given alpha value and then set that value in the :meth:`~.Animation.interpolate_mobject` method of the ``Count`` animation. Suppose you are starting at 50 and incrementing until the :class:`~.DecimalNumber` reaches 100 at the end of the animation." msgstr "" #: ../../source/tutorials/building_blocks.rst:322 msgid "If alpha is 0, you want the value to be 50." msgstr "" #: ../../source/tutorials/building_blocks.rst:323 msgid "If alpha is 0.5, you want the value to be 75." msgstr "" #: ../../source/tutorials/building_blocks.rst:324 msgid "If alpha is 1, you want the value to be 100." msgstr "" #: ../../source/tutorials/building_blocks.rst:326 msgid "Generally, you start with the starting number and add only some part of the value to be increment according to the alpha value. So, the logic of calculating the number to display at each step will be ``50 + alpha * (100 - 50)``. Once you set the calculated value for the :class:`~.DecimalNumber`, you are done." msgstr "" #: ../../source/tutorials/building_blocks.rst:330 msgid "Once you have defined your ``Count`` animation, you can play it in your :class:`~.Scene` for any duration you want for any :class:`~.DecimalNumber` with any rate function." msgstr "" #: ../../source/tutorials/building_blocks.rst:367 msgid "Using coordinates of a mobject" msgstr "" #: ../../source/tutorials/building_blocks.rst:369 msgid "Mobjects contain points that define their boundaries. These points can be used to add other mobjects respectively to each other, e.g. by methods like :meth:`~.Mobject.get_center` , :meth:`~.Mobject.get_top` and :meth:`~.Mobject.get_start`. Here is an example of some important coordinates:" msgstr "" #: ../../source/tutorials/building_blocks.rst:401 msgid "Transforming mobjects into other mobjects" msgstr "" #: ../../source/tutorials/building_blocks.rst:402 msgid "It is also possible to transform a mobject into another mobject like this:" msgstr "" #: ../../source/tutorials/building_blocks.rst:413 msgid "The Transform function maps points of the previous mobject to the points of the next mobject. This might result in strange behaviour, e.g. when the dots of one mobject are arranged clockwise and the other points are arranged counterclockwise. Here it might help to use the `flip` function and reposition the points via the `roll `_ function of numpy:" msgstr "" #: ../../source/tutorials/building_blocks.rst:439 msgid "Scenes" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/tutorials/configuration.pot000066400000000000000000000000011515024150700266360ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/tutorials/index.pot000066400000000000000000000004141515024150700251060ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/tutorials/index.rst:4 #: ../../source/tutorials/index.rst:4 msgid "Table of Contents" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/tutorials/output_and_config.pot000066400000000000000000000155711515024150700275200ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/tutorials/output_and_config.rst:2 msgid "Manim's Output Settings" msgstr "" #: ../../source/tutorials/output_and_config.rst:4 msgid "This document will focus on understanding manim's output files and some of the main command-line flags available." msgstr "" #: ../../source/tutorials/output_and_config.rst:7 msgid "This tutorial picks up where :doc:`quickstart` left off, so please read that document before starting this one." msgstr "" #: ../../source/tutorials/output_and_config.rst:11 msgid "Manim output folders" msgstr "" #: ../../source/tutorials/output_and_config.rst:13 msgid "At this point, you have just executed the following command." msgstr "" #: ../../source/tutorials/output_and_config.rst:19 msgid "Let's dissect what just happened step by step. First, this command executes manim on the file ``scene.py``, which contains our animation code. Further, this command tells manim exactly which ``Scene`` is to be rendered, in this case, it is ``SquareToCircle``. This is necessary because a single scene file may contain more than one scene. Next, the flag `-p` tells manim to play the scene once it's rendered, and the `-ql` flag tells manim to render the scene in low quality." msgstr "" #: ../../source/tutorials/output_and_config.rst:27 msgid "After the video is rendered, you will see that manim has generated some new files and the project folder will look as follows." msgstr "" #: ../../source/tutorials/output_and_config.rst:44 msgid "There are quite a few new files. The main output is in ``media/videos/scene/480p15/SquareToCircle.mp4``. By default, the ``media`` folder will contain all of manim's output files. The ``media/videos`` subfolder contains the rendered videos. Inside of it, you will find one folder for each different video quality. In our case, since we used the ``-l`` flag, the video was generated at 480 resolution at 15 frames per second from the ``scene.py`` file. Therefore, the output can be found inside ``media/videos/scene/480p15``. The additional folders ``media/videos/scene/480p15/partial_movie_files`` as well as ``media/text`` and ``media/Tex`` contain files that are used by manim internally." msgstr "" #: ../../source/tutorials/output_and_config.rst:55 msgid "You can see how manim makes use of the generated folder structure by executing the following command," msgstr "" #: ../../source/tutorials/output_and_config.rst:62 msgid "The ``-ql`` flag (for low quality) has been replaced by the ``-qh`` flag, for high quality. Manim will take considerably longer to render this file, and it will play it once it's done since we are using the ``-p`` flag. The output should look like this:" msgstr "" #: ../../source/tutorials/output_and_config.rst:84 msgid "And the folder structure should look as follows." msgstr "" #: ../../source/tutorials/output_and_config.rst:102 msgid "Manim has created a new folder ``media/videos/1080p60``, which corresponds to the high resolution and the 60 frames per second. Inside of it, you can find the new ``SquareToCircle.mp4``, as well as the corresponding ``partial_movie_files``." msgstr "" #: ../../source/tutorials/output_and_config.rst:107 msgid "When working on a project with multiple scenes, and trying out multiple resolutions, the structure of the output directories will keep all your videos organized." msgstr "" #: ../../source/tutorials/output_and_config.rst:111 msgid "Further, manim has the option to output the last frame of a scene, when adding the flag ``-s``. This is the fastest option to quickly get a preview of a scene. The corresponding folder structure looks like this:" msgstr "" #: ../../source/tutorials/output_and_config.rst:134 msgid "Saving the last frame with ``-s`` can be combined with the flags for different resolutions, e.g. ``-s -ql``, ``-s -qh``" msgstr "" #: ../../source/tutorials/output_and_config.rst:141 msgid "Sections" msgstr "" #: ../../source/tutorials/output_and_config.rst:143 msgid "In addition to the movie output file one can use sections. Each section produces its own output video. The cuts between two sections can be set like this:" msgstr "" #: ../../source/tutorials/output_and_config.rst:157 msgid "All the animations between two of these cuts get concatenated into a single output video file. Be aware that you need at least one animation in each section. For example this wouldn't create an output video:" msgstr "" #: ../../source/tutorials/output_and_config.rst:171 msgid "One way of fixing this is to wait a little:" msgstr "" #: ../../source/tutorials/output_and_config.rst:182 msgid "For videos to be created for each section you have to add the ``--save_sections`` flag to the Manim call like this:" msgstr "" #: ../../source/tutorials/output_and_config.rst:188 msgid "If you do this, the ``media`` folder will look like this:" msgstr "" #: ../../source/tutorials/output_and_config.rst:214 msgid "As you can see each section receives their own output video in the ``sections`` directory. The JSON file in here contains some useful information for each section:" msgstr "" #: ../../source/tutorials/output_and_config.rst:255 msgid "This data can be used by third party applications, like a presentation system or automated video editing tool." msgstr "" #: ../../source/tutorials/output_and_config.rst:257 msgid "You can also skip rendering all animations belonging to a section like this:" msgstr "" #: ../../source/tutorials/output_and_config.rst:271 msgid "Some command line flags" msgstr "" #: ../../source/tutorials/output_and_config.rst:273 msgid "When executing the command" msgstr "" #: ../../source/tutorials/output_and_config.rst:279 msgid "it was necessary to specify which ``Scene`` class to render. This is because a single file can contain more than one ``Scene`` class. If your file contains multiple ``Scene`` classes, and you want to render them all, you can use the ``-a`` flag." msgstr "" #: ../../source/tutorials/output_and_config.rst:284 msgid "As discussed previously, the ``-ql`` specifies low render quality. This does not look very good, but is very useful for rapid prototyping and testing. The other options that specify render quality are ``-qm``, ``-qh``, and ``-qk`` for medium, high, and 4k quality, respectively." msgstr "" #: ../../source/tutorials/output_and_config.rst:289 msgid "The ``-p`` flag plays the animation once it is rendered. If you want to open the file browser at the location of the animation instead of playing it, you can use the ``-f`` flag. You can also omit these two flags." msgstr "" #: ../../source/tutorials/output_and_config.rst:293 msgid "Finally, by default manim will output .mp4 files. If you want your animations in .gif format instead, use the ``-i`` flag. The output files will be in the same folder as the .mp4 files, and with the same name, but a different file extension." msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/tutorials/quickstart.pot000066400000000000000000000244741515024150700262050ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/tutorials/quickstart.rst:3 msgid "Quickstart" msgstr "" #: ../../source/tutorials/quickstart.rst:6 msgid "Before proceeding, install Manim and make sure it's running properly by following the steps in :doc:`../installation`. For information on using Manim with Jupyterlab or Jupyter notebook, go to the documentation for the :meth:`IPython magic command `, ``%%manim``." msgstr "" #: ../../source/tutorials/quickstart.rst:14 msgid "Overview" msgstr "" #: ../../source/tutorials/quickstart.rst:16 msgid "This quickstart guide will lead you through creating a sample project using Manim: an animation engine for precise programmatic animations." msgstr "" #: ../../source/tutorials/quickstart.rst:19 msgid "First, you will use a command line interface to create a ``Scene``, the class through which Manim generates videos. In the ``Scene`` you will animate a circle. Then you will add another ``Scene`` showing a square transforming into a circle. This will be your introduction to Manim's animation ability. Afterwards, you will position multiple mathematical objects (``Mobject``\\s). Finally, you will learn the ``.animate`` syntax, a powerful feature that animates the methods you use to modify ``Mobject``\\s." msgstr "" #: ../../source/tutorials/quickstart.rst:29 msgid "Starting a new project" msgstr "" #: ../../source/tutorials/quickstart.rst:31 msgid "Start by creating a new folder. For the purposes of this guide, name the folder ``project``:" msgstr "" #: ../../source/tutorials/quickstart.rst:37 msgid "This folder is the root folder for your project. It contains all the files that Manim needs to function, as well as any output that your project produces." msgstr "" #: ../../source/tutorials/quickstart.rst:42 msgid "Animating a circle" msgstr "" #: ../../source/tutorials/quickstart.rst:44 msgid "Open a text editor, such as Notepad. Copy the following code snippet into the window:" msgstr "" #: ../../source/tutorials/quickstart.rst:57 msgid "Save the code snippet into your project folder with the name ``scene.py``." msgstr "" #: ../../source/tutorials/quickstart.rst:64 msgid "3. Open the command line, navigate to your project folder, and execute the following command:" msgstr "" #: ../../source/tutorials/quickstart.rst:71 msgid "Manim will output rendering information, then create an MP4 file. Your default movie player will play the MP4 file, displaying the following animation." msgstr "" #: ../../source/tutorials/quickstart.rst:83 msgid "If you see an animation of a pink circle being drawn, congratulations! You just wrote your first Manim scene from scratch." msgstr "" #: ../../source/tutorials/quickstart.rst:86 msgid "If you get an error message instead, you do not see a video, or if the video output does not look like the preceding animation, it is likely that Manim has not been installed correctly. Please refer to our :doc:`FAQ section ` for help with the most common issues." msgstr "" #: ../../source/tutorials/quickstart.rst:95 msgid "Explanation" msgstr "" #: ../../source/tutorials/quickstart.rst:97 msgid "Let's go over the script you just executed line by line to see how Manim was able to draw the circle." msgstr "" #: ../../source/tutorials/quickstart.rst:100 msgid "The first line imports all of the contents of the library:" msgstr "" #: ../../source/tutorials/quickstart.rst:106 msgid "This is the recommended way of using Manim, as a single script often uses multiple names from the Manim namespace. In your script, you imported and used ``Scene``, ``Circle``, ``PINK`` and ``Create``." msgstr "" #: ../../source/tutorials/quickstart.rst:110 msgid "Now let's look at the next two lines:" msgstr "" #: ../../source/tutorials/quickstart.rst:118 msgid "Most of the time, the code for scripting an animation is entirely contained within the :meth:`~.Scene.construct` method of a :class:`.Scene` class. Inside :meth:`~.Scene.construct`, you can create objects, display them on screen, and animate them." msgstr "" #: ../../source/tutorials/quickstart.rst:122 msgid "The next two lines create a circle and set its color and opacity:" msgstr "" #: ../../source/tutorials/quickstart.rst:129 msgid "Finally, the last line uses the animation :class:`.Create` to display the circle on your screen:" msgstr "" #: ../../source/tutorials/quickstart.rst:136 msgid "All animations must reside within the :meth:`~.Scene.construct` method of a class derived from :class:`.Scene`. Other code, such as auxiliary or mathematical functions, may reside outside the class." msgstr "" #: ../../source/tutorials/quickstart.rst:142 msgid "Transforming a square into a circle" msgstr "" #: ../../source/tutorials/quickstart.rst:144 msgid "With our circle animation complete, let's move on to something a little more complicated." msgstr "" #: ../../source/tutorials/quickstart.rst:146 msgid "Open ``scene.py``, and add the following code snippet below the ``CreateCircle`` class:" msgstr "" #: ../../source/tutorials/quickstart.rst:162 msgid "Render ``SquareToCircle`` by running the following command in the command line:" msgstr "" #: ../../source/tutorials/quickstart.rst:168 #: ../../source/tutorials/quickstart.rst:216 #: ../../source/tutorials/quickstart.rst:284 #: ../../source/tutorials/quickstart.rst:326 msgid "The following animation will render:" msgstr "" #: ../../source/tutorials/quickstart.rst:185 msgid "This example shows one of the primary features of Manim: the ability to implement complicated and mathematically intensive animations (such as cleanly interpolating between two geometric shapes) with just a few lines of code." msgstr "" #: ../../source/tutorials/quickstart.rst:191 msgid "Positioning ``Mobject``\\s" msgstr "" #: ../../source/tutorials/quickstart.rst:193 msgid "Next, let's go over some basic techniques for positioning ``Mobject``\\s." msgstr "" #: ../../source/tutorials/quickstart.rst:195 msgid "Open ``scene.py``, and add the following code snippet below the ``SquareToCircle`` method:" msgstr "" #: ../../source/tutorials/quickstart.rst:210 msgid "Render ``SquareAndCircle`` by running the following command in the command line:" msgstr "" #: ../../source/tutorials/quickstart.rst:232 msgid "``next_to`` is a ``Mobject`` method for positioning ``Mobject``\\s." msgstr "" #: ../../source/tutorials/quickstart.rst:234 msgid "We first specified the pink circle as the square's reference point by passing ``circle`` as the method's first argument. The second argument is used to specify the direction the ``Mobject`` is placed relative to the reference point. In this case, we set the direction to ``RIGHT``, telling Manim to position the square to the right of the circle. Finally, ``buff=0.5`` applied a small distance buffer between the two objects." msgstr "" #: ../../source/tutorials/quickstart.rst:240 msgid "Try changing ``RIGHT`` to ``LEFT``, ``UP``, or ``DOWN`` instead, and see how that changes the position of the square." msgstr "" #: ../../source/tutorials/quickstart.rst:242 msgid "Using positioning methods, you can render a scene with multiple ``Mobject``\\s, setting their locations in the scene using coordinates or positioning them relative to each other." msgstr "" #: ../../source/tutorials/quickstart.rst:246 msgid "For more information on ``next_to`` and other positioning methods, check out the list of :class:`.Mobject` methods in our reference manual." msgstr "" #: ../../source/tutorials/quickstart.rst:251 msgid "Using ``.animate`` syntax to animate methods" msgstr "" #: ../../source/tutorials/quickstart.rst:253 msgid "The final lesson in this tutorial is using ``.animate``, a ``Mobject`` method which animates changes you make to a ``Mobject``. When you prepend ``.animate`` to any method call that modifies a ``Mobject``, the method becomes an animation which can be played using ``self.play``. Let's return to ``SquareToCircle`` to see the differences between using methods when creating a ``Mobject``, and animating those method calls with ``.animate``." msgstr "" #: ../../source/tutorials/quickstart.rst:260 msgid "Open ``scene.py``, and add the following code snippet below the ``SquareAndCircle`` class:" msgstr "" #: ../../source/tutorials/quickstart.rst:278 msgid "Render ``AnimatedSquareToCircle`` by running the following command in the command line:" msgstr "" #: ../../source/tutorials/quickstart.rst:299 msgid "The first ``self.play`` creates the square. The second animates rotating it 45 degrees. The third transforms the square into a circle, and the last colors the circle pink. Although the end result is the same as that of ``SquareToCircle``, ``.animate`` shows ``rotate`` and ``set_fill`` being applied to the ``Mobject`` dynamically, instead of creating them with the changes already applied." msgstr "" #: ../../source/tutorials/quickstart.rst:305 msgid "Try other methods, like ``flip`` or ``shift``, and see what happens." msgstr "" #: ../../source/tutorials/quickstart.rst:307 msgid "Open ``scene.py``, and add the following code snippet below the ``AnimatedSquareToCircle`` class:" msgstr "" #: ../../source/tutorials/quickstart.rst:320 msgid "Render ``DifferentRotations`` by running the following command in the command line:" msgstr "" #: ../../source/tutorials/quickstart.rst:338 msgid "This ``Scene`` illustrates the quirks of ``.animate``. When using ``.animate``, Manim actually takes a ``Mobject``'s starting state and its ending state and interpolates the two. In the ``AnimatedSquareToCircle`` class, you can observe this when the square rotates: the corners of the square appear to contract slightly as they move into the positions required for the first square to transform into the second one." msgstr "" #: ../../source/tutorials/quickstart.rst:344 msgid "In ``DifferentRotations``, the difference between ``.animate``'s interpretation of rotation and the ``Rotate`` method is far more apparent. The starting and ending states of a ``Mobject`` rotated 180 degrees are the same, so ``.animate`` tries to interpolate two identical objects and the result is the left square. If you find that your own usage of ``.animate`` is causing similar unwanted behavior, consider using conventional animation methods like the right square, which uses ``Rotate``." msgstr "" #: ../../source/tutorials/quickstart.rst:353 msgid "You're done!" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/gettext/tutorials/using_text.pot000066400000000000000000000000011515024150700261600ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/i18n/gettext/tutorials_guides.pot000066400000000000000000000004161515024150700253410ustar00rootroot00000000000000 msgid "" msgstr "" "Project-Id-Version: Manim \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../../source/tutorials_guides.rst:4 #: ../../source/tutorials_guides.rst:4 msgid "Table of Contents" msgstr "" ManimCommunity-manim-1157b74/docs/i18n/hi/000077500000000000000000000000001515024150700201425ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/hi/LC_MESSAGES/000077500000000000000000000000001515024150700217275ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/hi/LC_MESSAGES/index.po000066400000000000000000000140731515024150700234030ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: hi\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/index.pot\n" "X-Crowdin-File-ID: 5163\n" "Language-Team: Hindi\n" "Language: hi_IN\n" "PO-Revision-Date: 2021-11-06 12:29\n" #: ../../source/index.rst:7 msgid "Manim Community Overview" msgstr "Manim Community เค•เฅ€ เคธเคฎเฅ€เค•เฅเคทเคพ" #: ../../source/index.rst:9 msgid "Animating technical concepts is traditionally pretty tedious since it can be difficult to make the animations precise enough to convey them accurately. ``Manim`` uses Python to generate animations programmatically, making it possible to specify exactly how each one should run." msgstr "เคชเคพเคฐเค‚เคชเคฐเคฟเค• เคคเฅŒเคฐ เคชเคฐ เคคเค•เคจเฅ€เค•เฅ€ เคตเคฟเคทเคฏเฅ‹เค‚ เค•เฅ‹ เค…เคจเฅเคชเฅเคฐเคพเคฃเคฟเคค เค•เคฐเคจเคพ เค…เคคเฅเคฏเค‚เคค เคœเคŸเคฟเคฒ เคนเฅ‹เคคเคพ เคนเฅˆ เค•เฅเคฏเฅ‹เค‚เค•เคฟ เค…เคจเฅเคชเฅเคฐเคพเคฃเคจเฅ‹เค‚ เค•เฅ‹ เค‡เคคเคจเคพ เคธเคŸเฅ€เค• เคฌเคจเคพเคจเคพ เค•เคฟ เค‰เคจเฅเคนเฅ‡เค‚ เคธเคนเฅ€ เคฐเฅ‚เคช เคฎเฅ‡เค‚ เคฆเคฐเฅเคถเคพเคฏเคพ เคœเคพเค, เคฏเคน เค•เค เคฟเคจ เคนเฅ‹ เคธเค•เคคเคพ เคนเฅˆเฅค ``Manim`` Python เค•เคพ เค‰เคชเคฏเฅ‹เค— เค•เคฐเค•เฅ‡ เค…เคจเฅเคชเฅเคฐเคพเคฃเคจ เค•เฅเคฐเคฎเคพเคฆเฅ‡เคถเคฟเคค เคฐเฅ‚เคช เคฎเฅ‡เค‚ เค‰เคคเฅเคชเคพเคฆเคฟเคค เค•เคฐเคคเคพ เคนเฅˆ, เคœเคฟเคธเคธเฅ‡ เคนเคฐ เคเค• เค•เคฟเคธ เคชเฅเคฐเค•เคพเคฐ เคšเคฒเคจเคพ เคšเคพเคนเคฟเค, เคฏเคน เคธเฅเคชเคทเฅเคŸ เค•เคฐเคจเคพ เคธเค‚เคญเคต เคนเฅ‹ เคœเคพเคคเคพ เคนเฅˆเฅค" #: ../../source/index.rst:14 msgid "This project is still very much a work in progress, but we hope that the information here will make it easier for newcomers to get started using ``Manim``." msgstr "เค‡เคธ เคชเคฐเคฟเคฏเฅ‹เคœเคจเคพ เคชเคฐ เค•เคพเคฐเฅเคฏ เค…เคญเฅ€ เคญเฅ€ เค•เคพเคซเคผเฅ€ เคนเคฆ เคคเค• เคชเฅเคฐเค—เคคเคฟ เคชเคฐ เคนเฅˆ, เคชเคฐ เคนเคฎเฅ‡เค‚ เค†เคถเคพ เคนเฅˆ เค•เฅ€ เคฏเคนเคพเค เคฆเฅ€ เค—เคˆ เคœเคพเคจเค•เคพเคฐเฅ€ เคจเค เค‰เคชเคฏเฅ‹เค—เค•เคฐเฅเคคเคพเค“เค‚ เค•เฅ‡ เคฒเคฟเค ``Manim`` เค•เคพ เคชเฅเคฐเคฏเฅ‹เค— เค†เคฐเค‚เคญ เค•เคฐเคจเคพ เคธเคฐเคฒ เคฌเคจเคพเคเค—เฅ€เฅค" #: ../../source/index.rst:20 msgid "All content of the docs is licensed under the MIT license. Especially for the examples you encounter: Feel free to use this code in your own projects!" msgstr "เคชเฅเคฐเคฒเฅ‡เค–เคจ เค•เคพ เคธเคญเฅ€ เคตเคฟเคทเคฏ-เคตเคธเฅเคคเฅ MIT เค…เคจเฅเคœเฅเคžเคพเคชเคคเฅเคฐ เค•เฅ‡ เคคเคนเคค เค…เคจเฅเคœเฅเคžเคพเคชเคฟเคค เค•เคฟเคฏเคพ เค—เคฏเคพ เคนเฅˆเฅค เคตเคฟเคถเฅ‡เคท เคฐเฅ‚เคช เคธเฅ‡ เคตเคน เคธเคญเฅ€ เค‰เคฆเคพเคนเคฐเคฃ เคœเคฟเคจเค•เคพ เค†เคช เคธเคพเคฎเคจเคพ เค•เคฐเฅ‡เค‚เค—เฅ‡: เค…เคชเคจเฅ‡ เค•เคพเคฐเฅเคฏเฅ‹เค‚ เคเคตเค‚ เคชเคฐเคฟเคฏเฅ‹เคœเคจเคพเค“เค‚ เคฎเฅ‡เค‚ เค‡เคธ เค•เฅ‹เคก เค•เคพ เค‰เคชเคฏเฅ‹เค— เคจเคฟเคธเค‚เค•เฅ‹เคš เค•เฅ€เคœเคฟเค!" #: ../../source/index.rst:23 msgid "We are curious to see the awesome projects you build using this library, feel free to share your projects with us `on Twitter `_, `Reddit `_, or via `Discord `_." msgstr "เคนเคฎ เค†เคชเค•เฅ‡ เคฆเฅเคตเคพเคฐเคพ เค‡เคธ เคธเค‚เค—เฅเคฐเคน เค•เคพ เคชเฅเคฐเคฏเฅ‹เค— เค•เคฐเค•เฅ‡ เคฌเคจเคพเค เค—เค เค…เคฆเฅเคญเฅเคค เคชเคฐเคฟเคฏเฅ‹เคœเคจเคพเค“เค‚ เค•เฅ‹ เคฆเฅ‡เค–เคจเฅ‡ เค•เฅ‡ เคฒเคฟเค เค‰เคคเฅเคธเฅเค• เคนเฅˆเค‚, เคจเคฟเคธเค‚เค•เฅ‹เคš เคนเคฎเคพเคฐเฅ‡ เคธเคพเคฅ `Twitter เคชเคฐ `_, `Reddit เคชเคฐ `_, เค…เคจเฅเคฏเคฅเคพ `Discord `_ เคฆเฅเคตเคพเคฐเคพ เค…เคชเคจเฅ€ เคชเคฐเคฟเคฏเฅ‹เคœเคจเคพเคเค เคนเคฎเคพเคฐเฅ‡ เคธเคพเคฅ เคธเคพเคเคพ เค•เคฐเฅ‡เค‚เฅค" #: ../../source/index.rst:27 msgid "In case you publish your work made with Manim, we would appreciate if you add a link to `our homepage `_ or `our GitHub repository `_. If you use Manim in a scientific context, instructions on how to cite a particular release can be found `in our README `_." msgstr "เคฏเคฆเคฟ เค†เคช เค…เคชเคจเคพ Manim เคฆเฅเคตเคพเคฐเคพ เคฌเคจเคพเค เค—เค เค•เคพเคฐเฅเคฏ เค•เฅ‹ เคชเฅเคฐเค•เคพเคถเคฟเคค เค•เคฐเคคเฅ‡ เคนเฅˆเค‚, เคนเคฎเฅ‡เค‚ เคชเฅเคฐเคธเคจเฅเคจเคคเคพ เคนเฅ‹เค—เฅ€ เคฏเคฆเคฟ เค†เคช `เคนเคฎเคพเคฐเฅ‡ เคฎเฅเค–เคชเฅƒเคทเฅเคŸ `_ เคฏเคพ `เคนเคฎเคพเคฐเฅ‡ GitHub เค•เฅ‹เคท (เคฐเคฟเคชเคพเฅ…เคœเคผเคฟเคŸเฅ‹เคฐเฅ€)`_ เค•เฅ€ เค•เคกเคผเฅ€ เคœเฅ‹เคกเคผเฅ‡เค‚เฅค เค…เค—เคฐ เค†เคช Manim เค•เคพ เคชเฅเคฐเคฏเฅ‹เค— เคตเฅˆเคœเฅเคžเคพเคจเคฟเค• เคธเค‚เคฆเคฐเฅเคญ เคฎเฅ‡เค‚ เค•เคฐเคคเฅ‡ เคนเฅˆเค‚, เค•เคฟเคธเฅ€ เคตเคฟเคถเฅ‡เคท เค…เคตเคคเคฐเคฃ เค•เฅ‹ เค‰เคฆเฅเคงเฅƒเคค เค•เคฐเคจเฅ‡ เค•เฅ‡ เคจเคฟเคฐเฅเคฆเฅ‡เคถ `เคนเคฎเคพเคฐเฅ‡ README `_ เคฎเฅ‡เค‚ เคชเคพเค เคœเคพ เคธเค•เคคเฅ‡ เคนเฅˆเค‚เฅค" #: ../../source/index.rst:36 msgid "As a quick reference, here are some often used modules, classes and methods:" msgstr "เคคเคคเฅเค•เคพเคฒ เคธเค‚เค—เคฐเฅเคญ เค•เฅ‡ เคฐเฅ‚เคช เคฎเฅ‡เค‚, เค•เฅเค› เคชเฅเคฐเคพเคฏเคƒ เค‰เคชเคฏเฅ‹เค— เค•เคฟเค เคœเคพเคจเฅ‡ เคตเคพเคฒเฅ‡ เคชเฅเคฐเคคเคฟเคฐเฅ‚เคชเค• (เคฎเคพเฅ…เคกเฅเคฏเฅ‚เคฒ), เคตเคฐเฅเค— (เค•เฅเคฒเคพเคธเฅ‡เคธ) เคเคตเค‚ เคชเฅเคฐเคฃเคพเคฒเคฟเคฏเคพเค เคชเฅเคฐเคธเฅเคคเฅเคค เคนเฅˆเค‚:" #: ../../source/index.rst:38 msgid "Modules: :mod:`~.moving_camera_scene`, :mod:`~.tex_mobject`, :mod:`~.geometry`," msgstr "เคชเฅเคฐเคคเคฟเคฐเฅ‚เคชเค•: :mod:`~.moving_camera_scene`, :mod:`~.tex_mobject`, :mod:`~.geometry`," #: ../../source/index.rst:43 msgid "Classes: :class:`~.Mobject` , :class:`~.VMobject`, :class:`~.ValueTracker`, :class:`~.MathTex`, :class:`~.Angle`, :class:`~.Tex`, :class:`~.Text`," msgstr "เคตเคฐเฅเค—: :class:`~.Mobject` , :class:`~.VMobject`, :class:`~.ValueTracker`, :class:`~.MathTex`, :class:`~.Angle`, :class:`~.Tex`, :class:`~.Text`," ManimCommunity-manim-1157b74/docs/i18n/pt/000077500000000000000000000000001515024150700201655ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/pt/LC_MESSAGES/000077500000000000000000000000001515024150700217525ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/pt/LC_MESSAGES/index.po000066400000000000000000000103151515024150700234210ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: pt-BR\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/index.pot\n" "X-Crowdin-File-ID: 5163\n" "Language-Team: Portuguese, Brazilian\n" "Language: pt_BR\n" "PO-Revision-Date: 2021-11-06 12:29\n" #: ../../source/index.rst:7 msgid "Manim Community Overview" msgstr "Visรฃo geral da comunidade" #: ../../source/index.rst:9 msgid "Animating technical concepts is traditionally pretty tedious since it can be difficult to make the animations precise enough to convey them accurately. ``Manim`` uses Python to generate animations programmatically, making it possible to specify exactly how each one should run." msgstr "Animar conceitos tรฉcnicos รฉ tradicionalmente bastante tedioso, jรก que pode ser difรญcil tornar as animaรงรตes suficientemente precisas para transmiti-las com precisรฃo. ``Manim`` usa Python para gerar animaรงรตes programรกticas, tornando possรญvel especificar exatamente como cada uma deve ser executada." #: ../../source/index.rst:14 msgid "This project is still very much a work in progress, but we hope that the information here will make it easier for newcomers to get started using ``Manim``." msgstr "Este projecto continua a ser, em grande medida, um trabalho em progresso. mas esperamos que a informaรงรฃo aqui torne mais fรกcil para iniciantes comeรงarem a usar ``Manim``." #: ../../source/index.rst:20 msgid "All content of the docs is licensed under the MIT license. Especially for the examples you encounter: Feel free to use this code in your own projects!" msgstr "Todo o conteรบdo da documentaรงรฃo estรก licenciado sob a licenรงa MIT. Especialmente para os exemplos que vocรช encontrou: Sinta-se ร  vontade para usar esse cรณdigo em seus prรณprios projetos!" #: ../../source/index.rst:23 msgid "We are curious to see the awesome projects you build using this library, feel free to share your projects with us `on Twitter `_, `Reddit `_, or via `Discord `_." msgstr "Estamos curiosos para ver os projetos incrรญveis que vocรช cria usando esta biblioteca, sinta-se livre para compartilhar seus projetos conosco `no Twitter `_, `Reddit `_, ou via `Discord `_." #: ../../source/index.rst:27 msgid "In case you publish your work made with Manim, we would appreciate if you add a link to `our homepage `_ or `our GitHub repository `_. If you use Manim in a scientific context, instructions on how to cite a particular release can be found `in our README `_." msgstr "No caso de publicar seu trabalho feito com Manim, Gostarรญamos que vocรช adicionasse um link `nossa pรกgina inicial `_ ou `nosso repositรณrio no GitHub `_. Se vocรช usar Manim em um contexto cientรญfico, instruรงรตes sobre como citar uma versรฃo em particular podem ser encontradas `em nosso README `_." #: ../../source/index.rst:36 msgid "As a quick reference, here are some often used modules, classes and methods:" msgstr "Como referรชncia rรกpida, aqui estรฃo alguns mรณdulos, classes e mรฉtodos frequentemente usados:" #: ../../source/index.rst:38 msgid "Modules: :mod:`~.moving_camera_scene`, :mod:`~.tex_mobject`, :mod:`~.geometry`," msgstr "Mรณdulos: :mod:`~.moving_camera_scene`, :mod:`~.tex_mobject`, :mod:`~.geometry`," #: ../../source/index.rst:43 msgid "Classes: :class:`~.Mobject` , :class:`~.VMobject`, :class:`~.ValueTracker`, :class:`~.MathTex`, :class:`~.Angle`, :class:`~.Tex`, :class:`~.Text`," msgstr "Classe: :class:`~.Mobject` , :class:`~.VMobject`, :class:`~.ValueTracker`, :class:`~.MathTex`, :class:`~.Angle`, :class:`~.Tex`, :class:`~.Text`," ManimCommunity-manim-1157b74/docs/i18n/readyForTranslation000066400000000000000000000005631515024150700234630ustar00rootroot00000000000000changelog.po index.po contributing.po installation/linux.po installation/troubleshooting.po reporting_bugs.po installation.po examples.po reference.po tutorials.po tutorials/building_blocks.po tutorials/quickstart.po guides/output_and_config.po guides/configuration.po guides/deep_dive.po guides/using_text.po faq/general.po faq/help.po faq/installation.po faq/opengl.po ManimCommunity-manim-1157b74/docs/i18n/stripUntranslatable.awk000066400000000000000000000064121515024150700243120ustar00rootroot00000000000000BEGIN { # The current state of the parser: # -1 -> haven't read the first line of the new block # 0 -> reading the pre-comment # 1 -> reading the msgid # 2 -> reading the msgstr state=-1 # The comment preceding the block precomment="" # The same string, but with a space after the sharp to avoid a comment sharpedprecomment="" # The msgid section, containing the string to be translated msgidstr="" # The same string, but with a sharp before every newline (commented out) sharpedmsgidstr="" # The msgstr section, containing the destination string msgstrstr="" # The same string, but with a sharp before every newline (commented out) sharpedmsgstrstr="" # Whether the block being read should be kept # -1 -> should keep, overridable # 0 -> should not keep, overridable # 1 -> should keep, not overridable acceptable=1 # The file location of where to put everything # that has been stripped out untranslatablefile="./untranslatable.po" # Whether we are still reading the licence text licencetext=1 } # Detecting the end of licence $0~/^#, fuzzy$/ {licencetext=0; next; next} # If we are reading the licence, skip text and dont print it. $0~// {if (licencetext==1) {next}} # We pass on the wrong metadata $0~/"Report-Msgid-Bugs-To:/ {next} $0~/"PO-Revision-Date:/ {next} $0~/"Last-Translator:/ {next} $0~/"Language-Team:/ {next} # This pattern matches empty lines # The code flushes the data stored, and save # it only if acceptable!=1 $0~/^$/ { if (state<=0){ if(acceptable!=1){ print precomment }else{ #print "# Detected untranslatable text:" #print sharpedprecomment } precomment="" }else{ if(acceptable==1){ print precomment print msgidstr print msgstrstr print "" }else{ #print "# Detected untranslatable text:" #print sharpedprecomment #print sharpedmsgidstr #print sharpedmsgstrstr print precomment>>untranslatablefile print msgidstr>>untranslatablefile print msgstrstr>>untranslatablefile } # Add the newline currently parsed # Re-initialisation of the variables. state=-1 acceptable=-1 precomment="" msgidstr="" msgstrstr="" } } # If the line is commented out $0~/^#/ { precomment=(state==-1)?$0:precomment"\n"$0 sharpedprecomment=(state==-1)?"# "$0:sharpedprecomment"\n# "$0 state=0 } # If the line starts with "msgid" $0~/^msgid/ { state=1 msgidstr=$0 sharpedmsgidstr="# "$0 } # If the line starts with msgstr $0~/^msgstr/ { state=2 msgstrstr=$0 sharpedmsgstrstr="# "$0 } # If the line starts with a '"' $0~/^\"/ { if(state==1){ msgidstr=msgidstr"\n"$0 sharpedmsgidstr=sharpedmsgidstr"\n# "$0 }else{ msgstrstr=msgstrstr"\n"$0 sharpedmsgstrstr=sharpedmsgstrstr"\n# "$0 } } # ---------------------------------------------------------------- # This code is now the part that actually selects lines to be stripped out. state==1 { acceptable=1 } $0~/^msgid ":ref:`[a-zA-Z]*`"/ { acceptable=0 } $0~/^msgid ":obj:/ { acceptable=0 } $0~/^msgid "manim.([a-z._\\]+)"$/ { acceptable=0 } $0~/^(msgid )?"((:(mod|class|func):`~\.[a-zA-Z0-9.]+)`| )+"/ { acceptable=0 } $0~/^msgid ":py:obj:`[a-zA-Z0-9_.<> ]+`(\\\\)?"/ { acceptable=0 } $0~/^msgid "(:(mod|class|meth|func|attr):`[~A-Za-z_.()]+`(, )?)+"/ { acceptable=0 } # When the parsing is ended, print the last missing endline END { print "" } ManimCommunity-manim-1157b74/docs/i18n/stripUntranslatable.sh000066400000000000000000000005731515024150700241440ustar00rootroot00000000000000#!/bin/bash rm -f translatable.po rm -f untranslatable.po pot_dir_prefix="gettext/" echo "" for srcFile in `find $pot_dir_prefix -name "*.pot" -type f` do printf "\r\033[KCleaning file \e[32m$srcFile\e[0m" dstFile="$srcFile.bld" awk -f stripUntranslatable.awk $srcFile | sed '/POT-Creation-Date/d'> $dstFile cat $dstFile >> translatable.po mv $dstFile $srcFile done echo "" ManimCommunity-manim-1157b74/docs/i18n/sv/000077500000000000000000000000001515024150700201725ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/000077500000000000000000000000001515024150700217575ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/contributing.po000066400000000000000000000060121515024150700250250ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: sv\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/contributing.pot\n" "X-Crowdin-File-ID: 5143\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2021-11-06 12:29\n" #: ../../source/contributing.rst:3 msgid "Contributing" msgstr "Bidragande" #: ../../source/contributing.rst:5 msgid "Thank you for your interest in contributing to Manim! However you have decided to contribute or interact with the community, please always be civil and respect other members of the community. If you haven't read our :doc:`code of conduct`, do so here. Manim is Free and Open Source Software (FOSS) for mathematical animations. As such, **we welcome everyone** who is interested in mathematics, pedagogy, computer animations, open-source, software development, and beyond. Manim accepts many kinds of contributions, some are detailed below:" msgstr "Tack fรถr ditt intresse fรถr att bidra till Manim! Oavsett hur du bestรคmt dig fรถr att bidra eller interagera med communityn, kom ihรฅg att alltid vara civiliserad och respektera andra medlemmar i communityn. Om du inte redan har gjort det, lรคs vรฅr :doc:`uppfรถrandekod`. Manim รคr en gratis programvara med รถppen kรคllkod (FOSS) fรถr matematiska animationer. Pรฅ grund av detta, **vรคlkomnar vi alla** som รคr intresserade av matematik, pedagogik, datoranimationer, รถppen kรคllkod, mjukvaruutveckling och vidare. Manim tar emot mรฅnga typer av bidrag, nรฅgra exempel beskrivs nedan:" #: ../../source/contributing.rst:14 msgid "Code maintenance and development" msgstr "Underhรฅll och utveckling av kod" #: ../../source/contributing.rst:15 msgid "DevOps" msgstr "DevOps" #: ../../source/contributing.rst:16 msgid "Documentation" msgstr "Dokumentation" #: ../../source/contributing.rst:17 msgid "Developing educational content & narrative documentation" msgstr "Utveckla pedagogiskt innehรฅll & berรคttande dokumentation" #: ../../source/contributing.rst:18 msgid "Plugins to extend Manim functionality" msgstr "Plugins fรถr att utรถka Manims funktionalitet" #: ../../source/contributing.rst:19 msgid "Testing (graphical, unit & video)" msgstr "Testning (grafik, enhetstester & video)" #: ../../source/contributing.rst:20 msgid "Website design and development" msgstr "Webbplatsdesign och -utveckling" #: ../../source/contributing.rst:21 msgid "Translating documentation and docstrings" msgstr "ร–versรคtta dokumentation och docstrรคngar" #: ../../source/contributing.rst:24 msgid "Please ensure that you are reading the latest version of this guide by ensuring that \"latest\" is selected in the version switcher." msgstr "Se till att du lรคser den senaste versionen av denna guide genom att se till att \"senaste\" vรคljs i versionshanteraren." ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/examples.po000066400000000000000000000063471515024150700241470ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: sv\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/examples.pot\n" "X-Crowdin-File-ID: 5161\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2021-11-06 12:29\n" #: ../../source/examples.rst:3 msgid "Example Gallery" msgstr "Exempelgalleri" #: ../../source/examples.rst:5 msgid "This gallery contains a collection of best practice code snippets together with their corresponding video/image output, illustrating different functionalities all across the library. These are all under the MIT license, so feel free to copy & paste them to your projects. Enjoy this taste of Manim!" msgstr "Detta galleri innehรฅller en samling av kodstycken och de motsvarande videor/bilder som de producerar. Dessa kodstycken ses som exempel pรฅ bรคsta praxis och illustrerar flera olika funktioner som finns tillgรคngliga inom programbiblioteket. De รคr alla utgivna med MIT licens sรฅ varsรฅgod att kopiera och klistra in dem i olika projekt. Vi hoppas ni njuter av denna fรถrsmak av Manims funktioner!" #: ../../source/examples.rst:13 msgid "This gallery is not the only place in our documentation where you can see explicit code and video examples: there are many more in our :doc:`reference manual ` -- see, for example, our documentation for the modules :mod:`~.tex_mobject`, :mod:`~.geometry`, :mod:`~.moving_camera_scene`, and many more." msgstr "Detta galleri รคr inte den enda platsen i vรฅr dokumentation dรคr du kan se explicit kod och videoexempel. Det finns mรฅnga andra platser i vรฅr :doc:`reference manual ` -- se till exempel vรฅr dokumentation fรถr modulerna :mod:`~.tex_mobject`, :mod:`~.geometry`, :mod:`~.moving_camera_scene` och mรฅnga andra." #: ../../source/examples.rst:19 msgid "Check out our `interactive Jupyter environment `_ which allows running the examples online, without requiring a local installation." msgstr "Kolla in vรฅr `interaktiva Jupyter-miljรถ `_ som gรถr det mรถjligt att kรถra exemplen online utan att det krรคvs en lokal installation." #: ../../source/examples.rst:23 msgid "Also, visit our `Twitter `_ for more *manimations*!" msgstr "Besรถk รคven vรฅr `Twitter `_ fรถr fler *manimationer*!" #: ../../source/examples.rst:29 msgid "Basic Concepts" msgstr "Grundlรคggande Begrepp" #: ../../source/examples.rst:98 msgid "Animations" msgstr "Animationer" #: ../../source/examples.rst:180 msgid "You can use multiple ValueTrackers simultaneously." msgstr "Du kan anvรคnda flera ValueTrackers samtidigt." #: ../../source/examples.rst:274 msgid "Plotting with Manim" msgstr "Plottar med Manim" #: ../../source/examples.rst:402 msgid "Special Camera Settings" msgstr "Speciella kamerainstรคllningar" ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/index.po000066400000000000000000000102461515024150700234310ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: sv\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/index.pot\n" "X-Crowdin-File-ID: 5163\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2021-11-06 12:29\n" #: ../../source/index.rst:7 msgid "Manim Community Overview" msgstr "Manim Community ร–versikt" #: ../../source/index.rst:9 msgid "Animating technical concepts is traditionally pretty tedious since it can be difficult to make the animations precise enough to convey them accurately. ``Manim`` uses Python to generate animations programmatically, making it possible to specify exactly how each one should run." msgstr "Traditionellt sรฅ har det varit jobbigt att animera tekniska begrepp eftersom det รคr svรฅrt att skapa animationer som รคr tillrรคckligt exakta fรถr att fรถrklara dem korrekt. ``Manim`` anvรคnder sig av Python fรถr att generera animationer pรฅ ett programmatiskt sรคtt vilket gรถr det mรถjligt att ange exakt hur varje animation ska kรถras." #: ../../source/index.rst:14 msgid "This project is still very much a work in progress, but we hope that the information here will make it easier for newcomers to get started using ``Manim``." msgstr "Detta projekt รคr fortfarande i hรถg grad ett pรฅgรฅende arbete, men vi hoppas att informationen hรคr kommer att gรถra det lรคttare fรถr nykomlingar att komma igรฅng med ``Manim``." #: ../../source/index.rst:20 msgid "All content of the docs is licensed under the MIT license. Especially for the examples you encounter: Feel free to use this code in your own projects!" msgstr "Allt innehรฅll i dokumentationen รคr licensierat under MIT-licensen. Detta gรคller รคven fรถr alla exempel som du mรถter pรฅ. Anvรคnd gรคrna koden i dina egna projekt!" #: ../../source/index.rst:23 msgid "We are curious to see the awesome projects you build using this library, feel free to share your projects with us `on Twitter `_, `Reddit `_, or via `Discord `_." msgstr "Vi รคr nyfikna pรฅ att se de fantastiska projekt du skapar med hjรคlp av detta bibliotek! Dela gรคrna dina projekt med oss pรฅ Twitter `_, `Reddit `_ eller via `Discord `_." #: ../../source/index.rst:27 msgid "In case you publish your work made with Manim, we would appreciate if you add a link to `our homepage `_ or `our GitHub repository `_. If you use Manim in a scientific context, instructions on how to cite a particular release can be found `in our README `_." msgstr "Om du publicerar ett projekt du skapad med Manim sรฅ skulle vi uppskatta om du lรคgger till en lรคnk till `vรฅr hemsida `_ eller `vรฅrt GitHub-arkiv `_. Om du anvรคnder Manim i ett vetenskapligt sammanhang sรฅ finns instruktioner om hur man citerar en viss version av Manim `i vรฅr README `_." #: ../../source/index.rst:36 msgid "As a quick reference, here are some often used modules, classes and methods:" msgstr "Som snabbreferens ges hรคr nรฅgra av de oftast anvรคnda modulerna, klasserna och metoderna:" #: ../../source/index.rst:38 msgid "Modules: :mod:`~.moving_camera_scene`, :mod:`~.tex_mobject`, :mod:`~.geometry`," msgstr "Moduler: :mod:`~.moving_camera_scene`, :mod:`~.tex_mobject`, :mod:`~.geometry`," #: ../../source/index.rst:43 msgid "Classes: :class:`~.Mobject` , :class:`~.VMobject`, :class:`~.ValueTracker`, :class:`~.MathTex`, :class:`~.Angle`, :class:`~.Tex`, :class:`~.Text`," msgstr "Klasser: :class:`~.Mobject` , :class:`~.VMobject`, :class:`~.ValueTracker`, :class:`~.MathTex`, :class:`~.Angle`, :class:`~.Tex`, :class:`~.Text`," ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/installation.po000066400000000000000000000165051515024150700250270ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: sv\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/installation.pot\n" "X-Crowdin-File-ID: 5165\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2021-11-06 12:29\n" #: ../../source/installation.rst:2 msgid "Installation" msgstr "Installering" #: ../../source/installation.rst:4 msgid "Depending on your use case, different installation options are recommended: if you just want to play around with Manim for a bit, interactive in-browser notebooks are a really simple way of exploring the library as they require no local installation. Head over to https://try.manim.community to give our interactive tutorial a try." msgstr "Beroende pรฅ ditt anvรคndningsfall rekommenderas olika installationsalternativ: om du bara vill testa Manim fรถrst sรฅ รคr interaktiva notebooks lรคtta att utforska biblioteket med. De kan dessutom รถppnas i din webblรคsare utan att installera Manim lokalt vilket gรถr dem enkla att anvรคnda. Ta gรคrna en titt https://try.manim.community fรถr en interaktiv nybรถrjarkurs." #: ../../source/installation.rst:10 msgid "Otherwise, if you intend to use Manim to work on an animation project, we recommend installing the library locally (either to your system's Python, or via Docker)." msgstr "Annars, om du har fรถr avsikt att anvรคnda Manim fรถr att jobba pรฅ ett animationsprojekt, sรฅ rekommenderar vi att du installerar biblioteket lokalt (antingen till ditt systems Python, eller via Docker)." #: ../../source/installation.rst:16 msgid "Note that there are several different versions of Manim. The instructions on this website are **only** for the *community edition*. Find out more about the :doc:`differences between Manim versions ` if you are unsure which version you should install." msgstr "Observera att det finns flera olika versioner av Manim. Instruktionerna pรฅ denna webbsida รคr **endast** fรถr *community-utgรฅvan*. Lรคs mer om :doc:`skillnader mellan Manim versioner ` om du รคr osรคker pรฅ vilken version du bรถr installera." #: ../../source/installation.rst:22 msgid ":ref:`Installing Manim to your system's Python `" msgstr ":ref:`Installera Manim till ditt systems Python `" #: ../../source/installation.rst:23 msgid ":ref:`Using Manim via Docker `" msgstr ":ref:`Anvรคnda Manim via Docker `" #: ../../source/installation.rst:24 msgid ":ref:`Interactive Jupyter notebooks via Binder / Google Colab `" msgstr ":ref:`Interaktiva Jupyter notebooks via Binder / Google Colab `" #: ../../source/installation.rst:31 msgid "Installing Manim locally" msgstr "Installering av Manim lokalt" #: ../../source/installation.rst:33 msgid "Manim is a Python library, and it can be `installed via pip `__. However, in order for Manim to work properly, some additional system dependencies need to be installed first. The following pages have operating system specific instructions for you to follow." msgstr "Manim รคr ett Pythonbibliotek, och det kan `installeras via pip `__. Fรถr att Manim ska fungera ordentligt mรฅste dock ytterligare systemberoenden installeras fรถrst. Fรถljande sidor har operativsystemsspecifika instruktioner fรถr dig att fรถlja." #: ../../source/installation.rst:41 msgid "Depending on your particular setup, the installation process might be slightly different. Make sure that you have tried to follow the steps on the following pages carefully, but in case you hit a wall we are happy to help: either `join our Discord `__, or start a new Discussion `directly on GitHub `__." msgstr "Beroende pรฅ ditt specifika system sรฅ kan installationsprocessen vara nรฅgot annorlunda. Se till att du har fรถrsรถkt att fรถlja stegen pรฅ fรถljande sidor noga, men om du trรคffar en vรคgg sรฅ hjรคlper vi gรคrna till: du kan antingen `gรฅ med i vรฅr Discord `__, eller starta en ny diskussion `direkt pรฅ GitHub `__." #: ../../source/installation.rst:57 msgid "Once Manim is installed locally, you can proceed to our :doc:`quickstart guide ` which walks you through rendering a first simple scene." msgstr "Nรคr Manim vรคl installerats lokalt sรฅ kan du fortsรคtta till vรฅr :doc:`snabbstartsguide ` som visar dig hur du renderar din fรถrsta enkla scen." #: ../../source/installation.rst:61 msgid "As mentioned above, do not worry if there are errors or other problems: consult our :doc:`troubleshooting guide ` for help, or get in touch with the community via `GitHub discussions `__ or `Discord `__." msgstr "Som nรคmnts ovan sรฅ behรถver du inte oroa dig om det finns fel eller andra problem: lรคs vรฅr :doc:`felsรถkningsguide ` fรถr att fรฅ hjรคlp, eller ta kontakt med communityn via `GitHub-diskussioner `__ eller `Discord `__." #: ../../source/installation.rst:73 msgid "Using Manim via Docker" msgstr "Anvรคndning av Manim via Docker" #: ../../source/installation.rst:75 msgid "`Docker `__ is a virtualization tool that allows the distribution of encapsulated software environments (containers)." msgstr "`Docker `__ รคr ett virtualiseringsverktyg som gรถr det mรถjligt att distribuera inkapslade mjukvarumiljรถer (containers)." #: ../../source/installation.rst:78 msgid "The following pages contain more information about the docker image maintained by the community, ``manimcommunity/manim``:" msgstr "Fรถljande sidor innehรฅller mer information om den Docker Image som underhรฅlls av communityn, ``manimcommunity/manim``:" #: ../../source/installation.rst:89 msgid "Interactive Jupyter notebooks for your browser" msgstr "Interaktiva Jupyter notebooks fรถr din webblรคsare" #: ../../source/installation.rst:91 msgid "Manim ships with a built-in ``%%manim`` IPython magic command designed for the use within `Jupyter notebooks `__. Our interactive tutorial over at https://try.manim.community illustrates how Manim can be used from within a Jupyter notebook." msgstr "Manim ges ut med ett inbyggt ``%%manim`` IPython magic command som รคr utformat fรถr anvรคndning inuti `Jupyter notebooks `__. Vรฅr interaktiva nybรถrjarkurs pรฅ https://try.manim.community illustrerar hur Manim kan anvรคndas inuti en Jupyter notebook." #: ../../source/installation.rst:96 msgid "The following pages explain how you can setup interactive environments like that yourself:" msgstr "Fรถljande sidor fรถrklarar hur du kan skapa sรฅdana interaktiva miljรถer sjรคlv:" #: ../../source/installation.rst:105 msgid "Installation for developers" msgstr "Installering fรถr utvecklare" ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/plugins.po000066400000000000000000000156251515024150700240110ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: sv\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/plugins.pot\n" "X-Crowdin-File-ID: 5181\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2021-11-06 12:30\n" #: ../../source/plugins.rst:5 msgid "Plugins" msgstr "Plugins" #: ../../source/plugins.rst:7 msgid "Plugins are features that extend Manim's core functionality. Since Manim is extensible and not everything belongs in its core, we'll go over how to install, use, and create your own plugins." msgstr "Plugins รคr tillรคgg som utรถkar Manims kรคrnfunktionalitet. Eftersom Manim รคr utรถkningsbart, och inte allt hรถr hemma dess kรคrna, sรฅ kommer vi gรฅ รถver hur man kan installera, anvรคnda och skapa egna plugins." #: ../../source/plugins.rst:13 msgid "The standard naming convention for plugins is to prefix the plugin with ``manim-``. This makes them easy for users to find on package repositories such as PyPI." msgstr "Den namnkonvention som anvรคnds som standard fรถr plugins รคr att sรคtta prefixet ``manim-`` i bรถrjan pluginens namn. Detta gรถr det enkelt fรถr andra anvรคndare att hitta plugins via paketarkiv (repositories) som exempel PyPI." #: ../../source/plugins.rst:19 msgid "The plugin feature is new and under active development. Expect updates for the best practices on installing, using, and creating plugins; as well as new subcommands/flags for ``manim plugins``" msgstr "Pluginfunktionen รคr ny och under aktiv utveckling. Rรคkna med att de bรคsta metoderna att installera, anvรคnda och skapa plugins, samt nya underkommandon/flaggor fรถr ``manim-plugins``, kommer uppdateras" #: ../../source/plugins.rst:25 msgid "See https://plugins.manim.community/ for the list of plugins available." msgstr "Se https://plugins.manim.community/ fรถr listan รถver tillgรคngliga plugins." #: ../../source/plugins.rst:28 msgid "Installing Plugins" msgstr "Installering av Plugins" #: ../../source/plugins.rst:29 msgid "Plugins can be easily installed via the ``pip`` command:" msgstr "Plugins kan enkelt installeras via ``pip`` kommandot:" #: ../../source/plugins.rst:36 msgid "After installing a plugin, you may use the ``manim plugins`` command to list your available plugins, see the following help output:" msgstr "Efter att du har installerat en plugin kan du anvรคnda kommandot ``manim plugins`` fรถr att lista dina tillgรคngliga plugins, se fรถljande hjรคlpmeddelande:" #: ../../source/plugins.rst:52 msgid "You can list plugins as such:" msgstr "Du kan fรฅ en lista av plugins pรฅ detta sรคtt:" #: ../../source/plugins.rst:61 msgid "Using Plugins in Projects" msgstr "Anvรคndning av Plugins i Projekt" #: ../../source/plugins.rst:62 msgid "For enabling a plugin ``manim.cfg`` or command line parameters should be used." msgstr "Fรถr att aktivera en plugin bรถr ``manim.cfg`` eller command line parametrar anvรคndas." #: ../../source/plugins.rst:66 msgid "The plugins should be module name of the plugin and not PyPi name." msgstr "Pluginerna bรถr vara namnet pรฅ modulen, inte dess PyPI namn." #: ../../source/plugins.rst:68 msgid "Enabling plugins through ``manim.cfg``" msgstr "Aktivering av plugins via ``manim.cfg``" #: ../../source/plugins.rst:75 msgid "For specifying multiple plugins, command separated values must be used." msgstr "Fรถr att ange flera plugins sรฅ mรฅste kommandoseparerade vรคrden anvรคndas." #: ../../source/plugins.rst:83 msgid "Creating Plugins" msgstr "Skapa Plugins" #: ../../source/plugins.rst:84 msgid "Plugins are intended to extend Manim's core functionality. If you aren't sure whether a feature should be included in Manim's core, feel free to ask over on the `Discord server `_. Visit `manim-plugintemplate `_ on PyPI.org which serves as an in-depth tutorial for creating plugins." msgstr "Plugins รคr avsedda att utรถka Manims kรคrnfunktionalitet. Om du inte รคr sรคker pรฅ om en funktion ska inkluderas i Manims kรคrna, frรฅga gรคrna pรฅ `Discord-servern `_. Besรถk รคven `manim-plugintemplate `_ pรฅ PyPI.org eftersom det fungerar som en fรถrdjupad handledning fรถr att skapa plugins." #: ../../source/plugins.rst:94 msgid "The only requirement of manim plugins is that they specify an entry point with the group, ``\"manim.plugins\"``. This allows Manim to discover plugins available in the user's environment. Everything regarding the plugin's directory structure, build system, and naming are completely up to your discretion as an author. The aforementioned template plugin is only a model using Poetry since this is the build system Manim uses. The plugin's `entry point `_ can be specified in poetry as:" msgstr "Det enda kravet pรฅ manim plugins รคr att de anger en ingรฅngspunkt genom gruppen, ``\"manim.plugins\"``. Detta gรถr det mรถjligt fรถr Manim att upptรคcka plugins som finns i anvรคndarens arbetsmiljรถ. Allt om pluginens katalogstruktur, byggsystem och namngivning รคr helt upp till din dina egna val som fรถrfattare. Den ovannรคmnda mallpluginen รคr bara en modell med Poesi eftersom detta รคr byggsystemet som Manim anvรคnder. Pluginens `ingรฅngspunkt `_ kan anges i poesi som:" #: ../../source/plugins.rst:108 msgid "Here ``name`` is the name of the module of the plugin." msgstr "Hรคr รคr ``name`` namnet pรฅ pluginens modul." #: ../../source/plugins.rst:110 msgid "Here ``object_reference`` can point to either a function in a module or a module itself. For example," msgstr "Hรคr kan ``object_reference`` peka mot antingen en funktion i en modul eller en modul sjรคlv. Till exempel," #: ../../source/plugins.rst:118 msgid "Here a module is used as ``object_reference``, and when this plugin is enabled, Manim will look for ``__all__`` keyword defined in ``manim_plugintemplate`` and everything as a global variable one by one." msgstr "Hรคr anvรคnds en modul som ``object_reference``. Nรคr denna modul aktiveras sรฅ kommer Manim att leta efter nyckelordet ``__all__`` som definierats i ``manim_plugintemplate`` och allt som en global variabel en efter en." #: ../../source/plugins.rst:122 msgid "If ``object_reference`` is a function, Manim calls the function and expects the function to return a list of modules or functions that need to be defined globally." msgstr "Om ``object_reference`` รคr en funktion sรฅ kommer Manim anropa funktionen och fรถrvรคntar sig att funktionen returnerar en lista รถver moduler eller funktioner som behรถver definieras globalt." #: ../../source/plugins.rst:125 msgid "For example," msgstr "Till exempel," ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/reference.po000066400000000000000000000033311515024150700242550ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: sv\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/reference.pot\n" "X-Crowdin-File-ID: 5183\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2021-11-06 12:30\n" #: ../../source/reference.rst:2 msgid "Reference Manual" msgstr "Referensmanual" #: ../../source/reference.rst:4 msgid "This reference manual details modules, functions, and variables included in Manim, describing what they are and what they do. For learning how to use Manim, see :doc:`tutorials`. For a list of changes since the last release, see the :doc:`changelog`." msgstr "Denna referensmanual innehรฅller moduler, funktioner och variabler som inkluderas in Manim och beskriver de รคr och vad de gรถr. For att lรคra dig hur man anvรคnder Manim, se :doc:`tutorials`. For en lista รถver fรถrรคndringar sedan den senaste utgรฅvan, se :doc:`fรถrรคndringsrapporten`." #: ../../source/reference.rst:9 msgid "The pages linked to here are currently a work in progress." msgstr "De sidor som dessa lรคnkar leder till รคr fortfarande under aktiv pรฅbyggnad." #: ../../source/reference.rst:12 msgid "Inheritance Graphs" msgstr "Grafer fรถr arv" #: ../../source/reference.rst:15 msgid "Animations" msgstr "Animationer" #: ../../source/reference.rst:35 msgid "Cameras" msgstr "Kameror" #: ../../source/reference.rst:47 msgid "Mobjects" msgstr "Mobjekt" #: ../../source/reference.rst:84 msgid "Scenes" msgstr "Scener" ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/reporting_bugs.po000066400000000000000000000074101515024150700253520ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: sv\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/reporting_bugs.pot\n" "X-Crowdin-File-ID: 5833\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2021-11-06 12:30\n" #: ../../source/reporting_bugs.rst:2 msgid "Reporting bugs" msgstr "Rapportering av buggar" #: ../../source/reporting_bugs.rst:4 msgid "One of the best ways of contributing to Manim is by reporting bugs. If you have encountered something that you believe is a bug, please follow these steps:" msgstr "Ett av de bรคsta sรคtten att bidra till Manim รคr genom att rapportera buggar. Om du har stรถtt pรฅ nรฅgot som du tror รคr en bugg, fรถlj dessa steg:" #: ../../source/reporting_bugs.rst:8 msgid "First of all, make sure you are running the latest version of manim. If not, update your version and try again." msgstr "Fรถrst och frรคmst, se till att du kรถr den senaste versionen av manim. Om inte, uppdatera din version och fรถrsรถk igen." #: ../../source/reporting_bugs.rst:11 msgid "Search for other users who may have had similar issues in the past. Search the repository's `issues page `_ (don't forget to search closed issues), bring it up on our `Discord server `_, use sites like StackOverflow, and exercise your best Google practices. If you can't find anything helpful, then go to the next step." msgstr "Sรถk efter andra anvรคndare som kan ha haft liknande problem tidigare. Sรถk i arkivets (repository) `issues page `_ (glรถm inte att sรถka รคven bland slutna รคrenden), ta upp det i vรฅr `Discord-server `_, anvรคnd webbplatser som StackOverflow och anvรคnd dig av dina bรคsta Google-metoder. Om du inte kan hitta nรฅgot hjรคlpsamt, gรฅ sedan till nรคsta steg." #: ../../source/reporting_bugs.rst:17 msgid "Can reproduce the issue, i.e. that you have some code that illustrates the bug **every time** (or at least most of the time) it is executed." msgstr "Kan reproducera problemet, dvs att du har en kod som illustrerar felet **varje gรฅng** (eller รฅtminstone de flesta gรฅngerna) det kรถrs." #: ../../source/reporting_bugs.rst:21 msgid "Clarify what behavior you expected, and how the actual behavior differs from your expectation." msgstr "Klargรถr vilket beteende du fรถrvรคntade dig och hur det faktiska beteendet skiljer sig frรฅn dina fรถrvรคntningar." #: ../../source/reporting_bugs.rst:24 msgid "Gather information about your environment, such as your operating system, python version, and any stack traces that the code may have generated (if applicable)." msgstr "Samla information om din miljรถ, sรฅsom ditt operativsystem, python-version, och eventuella stackspรฅr som koden kan ha genererat (om mรถjligt)." #: ../../source/reporting_bugs.rst:28 msgid "Please open an issue only after you have gathered this information. When submitting an issue, make sure to follow the template (this is the default text you are shown when first opening the 'New Issue' page). A community member will (hopefully) respond and start a conversation to address the issue." msgstr "Vรคnligen รถppna ett problem fรถrst efter att du har samlat in denna information. Nรคr du skickar in ett รคrende, se till att fรถlja mallen (detta รคr standardtexten du visas nรคr du fรถrst รถppnar sidan 'Nytt รคrende'. En medlem i communityn kommer (fรถrhoppningsvis) att svara och starta en konversation fรถr att ta itu med problemet." ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/tutorials.po000066400000000000000000000012171515024150700243460ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: sv\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/tutorials.pot\n" "X-Crowdin-File-ID: 5835\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2021-11-06 12:30\n" #: ../../source/tutorials.rst:4 #: ../../source/tutorials.rst:4 msgid "Table of Contents" msgstr "Innehรฅllsfรถrteckning" ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/tutorials/000077500000000000000000000000001515024150700240055ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/tutorials/building_blocks.po000066400000000000000000000652131515024150700275060ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: sv\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/tutorials/building_blocks.pot\n" "X-Crowdin-File-ID: 5839\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2021-11-06 12:29\n" #: ../../source/tutorials/building_blocks.rst:3 msgid "Manim's building blocks" msgstr "Manims byggstenar" #: ../../source/tutorials/building_blocks.rst:5 msgid "This document explains the building blocks of manim and will give you all the necessary tools to start producing your own videos." msgstr "Detta dokument gรฅr igenom Manims byggstenar och ger dig alla verktyg som behรถvs fรถr att bรถrja producera dina egna videor." #: ../../source/tutorials/building_blocks.rst:8 msgid "Essentially, manim puts at your disposal three different concepts that you can orchestrate together to produce mathematical animations: the **mathematical object** (or **mobject** for short) the **animation**, and the **scene**. As we will see in the following sections, each of these three concepts is implemented in manim as a separate class: the :class:`.Mobject`, :class:`.Animation`, and :class:`.Scene` classes." msgstr "I huvudsak stรคller Manim tre olika begrepp till ditt fรถrfogande som du kan anvรคnda tillsammans med varandra fรถr att producera matematiska animationer: det **matematiska objektet** (eller kortfattat **mobject**), **animationen** och **scenen**. Som vi kommer att se i fรถljande avsnitt sรฅ implementeras var och ett av dessa i Manim som enskilda klasser: :class:`.Mobject`, :class:`.Animation`, och :class:`.Scene` klasserna." #: ../../source/tutorials/building_blocks.rst:15 msgid "It is recommended that you read the tutorials :doc:`quickstart` and :doc:`a_deeper_look` before reading this page." msgstr "Det rekommenderas att du fรถrst lรคser fรถljande tutorials, :doc:`quickstart` och :doc:`a_deeper_look`, fรถre du lรคser vidare pรฅ denna sidan." #: ../../source/tutorials/building_blocks.rst:21 msgid "Mobjects" msgstr "Mobjekt" #: ../../source/tutorials/building_blocks.rst:23 msgid "Mobjects are the basic building block for all manim animations. Each class that derives from :class:`.Mobject` represents an object that can be displayed on the screen. For example, simple shapes such as :class:`.Circle`, :class:`.Arrow`, and :class:`.Rectangle` are all mobjects. More complicated constructs such as :class:`.Axes`, :class:`.FunctionGraph`, or :class:`.BarChart` are mobjects as well." msgstr "Mobject รคr den grundlรคggande byggstenen fรถr alla animationer som gรถrs i manim. Varje klass som รคrver frรฅn :class:`.Mobject` representerar ett objekt som kan visas pรฅ skรคrmen. Som exempel รคr :class:`.Circle`, :class:`.Arrow`, och :class:`.Rectangle` allihopa Mobjekt. Andra mer komplicerade exempel รคr exempelvis :class:`.Axes`, :class:`.FunctionGraph`, och :class:`.BarChart`." #: ../../source/tutorials/building_blocks.rst:30 msgid "If you try to display an instance of :class:`.Mobject` on the screen, you will only see an empty frame. The reason is that the :class:`.Mobject` class is an abstract base class of all other mobjects, i.e. it does not have any pre-determined visual shape that can be displayed on the screen. It is only the skeleton of a thing that *could* be displayed. Therefore, you will rarely need to use plain instances of :class:`.Mobject`; instead, you will most likely create instances of its derived classes. One of these derived classes is :class:`.VMobject`. The ``V`` stands for Vectorized Mobject. In essence, a vmobject is a mobject that uses `vector graphics `_ to be displayed. Most of the time, you will be dealing with vmobjects, though we will continue to use the term \"mobject\" to refer to the class of shapes that can be displayed on the screen, as it is more general." msgstr "Om du fรถrsรถker visa en instans av :class:`.Mobject` pรฅ skรคrmen kommer du bara att se en tom ram. Anledningen รคr att klassen :class:`.Mobject` รคr en abstrakt basklass fรถr alla andra mobjects, dvs den har inte nรฅgon fรถrutbestรคmd visuell form som kan visas pรฅ skรคrmen. Den รคr bara en skelettstruktur av en sak som *kunde* ha visats. Dรคrfรถr behรถver du sรคllan anvรคnda vanliga instanser av :class:`.Mobject`; istรคllet kommer du sannolikt att skapa instanser av dess hรคrledda klasser. En av dessa hรคrledda klasser รคr :class:`.VMobject`. ``V`` stรฅr fรถr Vectorized Mobject. I grund och botten รคr ett vmobject ett mobject som anvรคnder `vektorgrafik `_ fรถr att visas. Fรถr det mesta kommer du egentligen att hantera vmobjects men vi kommer att fortsรคtta att anvรคnda termen \"mobject\" fรถr att hรคnvisa till klasser av former som kan visas pรฅ skรคrmen. Det gรถr vi eftersom \"mobject\" รคr mer allmรคnt." #: ../../source/tutorials/building_blocks.rst:44 msgid "Any object that can be displayed on the screen is a ``mobject``, even if it is not necessarily *mathematical* in nature." msgstr "Varje objekt som kan visas pรฅ skรคrmen รคr ett ``mobject`` รคven om det inte nรถdvรคndigtvis har en *matematisk* natur." #: ../../source/tutorials/building_blocks.rst:47 msgid "To see examples of classes derived from :class:`.Mobject`, see the :mod:`.geometry` module. Most of these are in fact derived from :class:`.VMobject` as well." msgstr "Fรถr att se exempel pรฅ klasser hรคrledda frรฅn :class:`.Mobject`, se :mod:`.geometry`-modulen. De flesta av dessa hรคrrรถr i sjรคlva verket frรฅn :class:`.VMobject` ocksรฅ." #: ../../source/tutorials/building_blocks.rst:53 msgid "Creating and displaying mobjects" msgstr "Skapa och visa mobjects" #: ../../source/tutorials/building_blocks.rst:55 msgid "As explained in :doc:`quickstart`, usually all of the code in a manim script is put inside the :meth:`.construct` method of a :class:`.Scene` class. To display a mobject on the screen, call the :meth:`~.Scene.add` method of the containing :class:`.Scene`. This is the principal way of displaying a mobject on the screen when it is not being animated. To remove a mobject from the screen, simply call the :meth:`~.Scene.remove` method from the containing :class:`.Scene`." msgstr "Som det fรถrklaras i :doc:`quickstart` brukar all kod i ett manim-skript placeras i :meth:`.construct` metoden av en :class:`.Scene` klass. Fรถr att visa ett mobject pรฅ skรคrmen, anropa :meth:`~.Scene.add` metoden som finns i klassen :class:`.Scene`. Detta รคr det huvudsakliga sรคttet att visa ett mobject pรฅ skรคrmen nรคr det inte animeras. Fรถr att ta bort ett mobject frรฅn skรคrmen anropa helt enkelt :meth:`~.Scene.remove`-metoden frรฅn klassen :class:`.Scene`." #: ../../source/tutorials/building_blocks.rst:75 msgid "Placing mobjects" msgstr "Placering av mobject" #: ../../source/tutorials/building_blocks.rst:77 msgid "Let's define a new :class:`.Scene` called ``Shapes`` and :meth:`~.Scene.add` some mobjects to it. This script generates a static picture that displays a circle, a square, and a triangle:" msgstr "Vi definierar nu en ny :class:`.Scene` som heter ``Shapes`` och lรคgger till nรฅgra mobject till den med hjรคlp av metoden :meth:`~.Scene.add`. Detta skript genererar en orรถrlig bild som visar en cirkel, en kvadrat, och en triangel:" #: ../../source/tutorials/building_blocks.rst:96 msgid "By default, mobjects are placed at the center of coordinates, or *origin*, when they are first created. They are also given some default colors. Further, the ``Shapes`` scene places the mobjects by using the :meth:`.shift` method. The square is shifted one unit in the ``UP`` direction from the origin, while the circle and triangle are shifted one unit ``LEFT`` and ``RIGHT``, respectively." msgstr "Som standard placeras mobjects i mitten av koordinatsystemet, eller *origin* (sv. origo), nรคr de fรถrst skapas. De fรฅr ocksรฅ nรฅgra standardfรคrger. Vidare placerar scenen ``Shapes`` mobject genom att anvรคnda :meth:`.shift` metoden. Kvadraten flyttas en enhet i ``UP`` riktningen frรฅn origo, medan cirkeln och triangeln respektive skiftas en enhet ``LEFT`` och ``RIGHT``." #: ../../source/tutorials/building_blocks.rst:102 msgid "Unlike other graphics software, manim places the center of coordinates at the center of the screen. The positive vertical direction is up, and the positive horizontal direction is right. See also the constants ``ORIGIN``, ``UP``, ``DOWN``, ``LEFT``, ``RIGHT``, and others, defined in the :mod:`.constants` module." msgstr "Till skillnad frรฅn andra grafikprogram placerar manim centrum av koordinatsystemet i mitten av skรคrmen. Den positiva vertikala riktningen รคr uppรฅt, och den positiva horisontella riktningen รคr รฅt hรถger. Se รคven konstanterna ``ORIGIN``, ``UP``, ``DOWN``, ``LEFT``, ``RIGHT`` och andra konstanter som definieras i :mod:`.constants`-modulen." #: ../../source/tutorials/building_blocks.rst:108 msgid "There are many other possible ways to place mobjects on the screen, for example :meth:`.move_to`, :meth:`.next_to`, and :meth:`.align_to`. The next scene ``MobjectPlacement`` uses all three." msgstr "Det finns mรฅnga andra sรคtt att placera mobjekt pรฅ skรคrmen, till exempel genom metoderna :meth:`. move_to`, :meth:`.next_to` och :meth:`.align_to`. Nรคsta scen ``MobjectPlacement`` anvรคnder sig av alla tre." #: ../../source/tutorials/building_blocks.rst:130 msgid "The :meth:`.move_to` method uses absolute units (measured relative to the ``ORIGIN``), while :meth:`.next_to` uses relative units (measured from the mobject passed as the first argument). :meth:`align_to` uses ``LEFT`` not as measuring units but as a way to determine the border to use for alignment. The coordinates of the borders of a mobject are determined using an imaginary bounding box around it." msgstr "Metoden :meth:`.move_to` anvรคnder sig av absoluta enheter (alltsรฅ, givet i fรถrhรฅllande till ``ORIGIN``), medan :meth:`.next_to` anvรคnder sig av relativa enheter (alltsรฅ, givet i fรถrhรฅllande till det mobject som ges i fรถrsta argumentet). :meth:`align_to` anvรคnder ``LEFT`` inte som en mรคtenhet utan som ett sรคtt att bestรคmma vilket grรคnssnitt som mobjectet ska justeras till. Koordinaterna fรถr ett mobjects grรคnser bestรคms med hjรคlp av en icke-visuell begrรคnsningsruta runt den." #: ../../source/tutorials/building_blocks.rst:137 msgid "Many methods in manim can be chained together. For example the two lines" msgstr "Mรฅnga metoder i manim kan kedjas ihop. Till exempel de tvรฅ raderna" #: ../../source/tutorials/building_blocks.rst:145 msgid "can be replaced by" msgstr "kan ersรคttas med" #: ../../source/tutorials/building_blocks.rst:151 msgid "Technically, this is possible because most methods calls return the modified mobject." msgstr "Tekniskt sett รคr detta mรถjligt eftersom de flesta metodanrop returnerar det modifierade mobjectet." #: ../../source/tutorials/building_blocks.rst:155 msgid "Styling mobjects" msgstr "Styla mobject" #: ../../source/tutorials/building_blocks.rst:157 msgid "The following scene changes the default aesthetics of the mobjects." msgstr "Fรถljande scen รคndrar mobjektens standardutseende." #: ../../source/tutorials/building_blocks.rst:174 msgid "This scene uses two of the main functions that change the visual style of a mobject: :meth:`.set_stroke` and :meth:`.set_fill`. The former changes the visual style of the mobject's border while the latter changes the style of the interior. By default, most mobjects have a fully transparent interior so you must specify the ``opacity`` parameter to display the color. An opacity of ``1.0`` means fully opaque, while ``0.0`` means fully transparent." msgstr "Denna scen anvรคnder tvรฅ huvudfunktioner som รคndrar den visuella stilen pรฅ ett mobject: :meth:`.set_stroke` och :meth:`.set_fill`. Den fรถrsta รคndrar den visuella stilen pรฅ mobjectets rand medan den andra รคndrar stilen pรฅ interiรถren. Som standard har de flesta mobjects en helt genomskinlig interiรถr sรฅ du mรฅste ange parametern ``opacity`` fรถr att visa fรคrgen. Ett opacitetsvรคrde pรฅ ``1.0`` betyder helt ogenomskinlig, medan ``0.0`` betyder helt genomskinlig." #: ../../source/tutorials/building_blocks.rst:181 msgid "Only instances of :class:`.VMobject` implement :meth:`.set_stroke` and :meth:`.set_fill`. Instances of :class:`.Mobject` implement :meth:`.~Mobject.set_color` instead. The vast majority of pre-defined classes are derived from :class:`.VMobject` so it is usually safe to assume that you have access to :meth:`.set_stroke` and :meth:`.set_fill`." msgstr "Endast instanser av :class:`.VMobject` implementerar :meth:`.set_stroke` och :meth:`.set_fill`. Instanser av :class:`.Mobject` implementerar :meth:`.~Mobject.set_color` istรคllet. De allra flesta fรถrdefinierade klasser hรคrstammar frรฅn :class:`.VMobject` sรฅ det รคr vanligtvis sรคkert att anta att du har tillgรฅng till :meth:`.set_stroke` och :meth:`.set_fill`." #: ../../source/tutorials/building_blocks.rst:189 msgid "Mobject on-screen order" msgstr "Ordningen av Mobject pรฅ skรคrmen" #: ../../source/tutorials/building_blocks.rst:191 msgid "The next scene is exactly the same as the ``MobjectStyling`` scene from the previous section, except for exactly one line." msgstr "Nรคsta scen รคr exakt samma som ``MobjectStyling`` scenen frรฅn fรถregรฅende avsnitt, med undantag fรถr exakt en rad." #: ../../source/tutorials/building_blocks.rst:209 msgid "The only difference here (besides the scene name) is the order in which the mobjects are added to the scene. In ``MobjectStyling``, we added them as ``add(circle, square, triangle)``, whereas in ``MobjectZOrder`` we add them as ``add(triangle, square, circle)``." msgstr "Den enda skillnaden hรคr (fรถrutom scennamnet) รคr den ordning i vilken mobjects lรคggs till i scenen. I ``MobjectStyling``, lade vi till dem som ``add(circle, square, triangle)``, medan vi i ``MobjectZOrder`` lรคgger till dem som ``add(triangle, square, circle)``." #: ../../source/tutorials/building_blocks.rst:214 msgid "As you can see, the order of the arguments of :meth:`~.Scene.add` determines the order that the mobjects are displayed on the screen, with the left-most arguments being put in the back." msgstr "Som du kan se sรฅ bestรคmmer ordningen pรฅ argumenten i :meth:`~.Scene.add` den ordning som mobjects visas pรฅ skรคrmen, sรฅ att argumentet lรคngst till vรคnster hamnar lรคngst bak." #: ../../source/tutorials/building_blocks.rst:221 msgid "Animations" msgstr "Animationer" #: ../../source/tutorials/building_blocks.rst:223 msgid "At the heart of manim is animation. Generally, you can add an animation to your scene by calling the :meth:`~.Scene.play` method." msgstr "Manims stรถrsta syfte รคr att animera. Allmรคnt sรฅ kan du lรคgga till en animation till din scen genom att anropa :meth:`~.Scene.play`-metoden." #: ../../source/tutorials/building_blocks.rst:244 msgid "Put simply, animations are procedures that interpolate between two mobjects. For example, :code:`FadeIn(square)` starts with a fully transparent version of :code:`square` and ends with a fully opaque version, interpolating between them by gradually increasing the opacity. :class:`.FadeOut` works in the opposite way: it interpolates from fully opaque to fully transparent. As another example, :class:`.Rotate` starts with the mobject passed to it as argument, and ends with the same object but rotated by a certain amount, this time interpolating the mobject's angle instead of its opacity." msgstr "Enkelt uttryckt รคr animationer procedurer som interpolerar mellan tvรฅ mobjects. Till exempel bรถrjar :code:`FadeIn(square)` med en helt genomskinlig version av :code:`square` och avslutas med en helt ogenomskinlig version, och detta sker genom att interpolera mellan dem genom att gradvis รถka opaciteten. :class:`.FadeOut` fungerar pรฅ motsatt sรคtt: den interpolerar frรฅn helt ogenomskinlig till helt genomskinlig. Som ett annat exempel :class:`.Rotate` bรถrjar med mobjectet som skickats till det som argument, och slutar med samma objekt men roterat med ett visst belopp, genom att denna gรฅngenn interpolera mobjektets vinkel istรคllet fรถr dess opacitet." #: ../../source/tutorials/building_blocks.rst:255 msgid "Animating methods" msgstr "Animeringsmetoder" #: ../../source/tutorials/building_blocks.rst:257 msgid "Any property of a mobject that can be changed can be animated. In fact, any method that changes a mobject's property can be used as an animation, through the use of :meth:`.animate`." msgstr "Varje egenskap hos ett mobject som kan รคndras kan รคven animeras. Faktum รคr att alla metoder som รคndrar ett mobjects egenskaper kan anvรคndas som en animation genom att anvรคnda :meth:`.animate`." #: ../../source/tutorials/building_blocks.rst:277 msgid ":meth:`.animate` is a property of all mobjects that animates the methods that come afterward. For example, :code:`square.set_fill(WHITE)` sets the fill color of the square, while :code:`sqaure.animate.set_fill(WHITE)` animates this action." msgstr ":meth:`.animate` รคr en egenskap hos alla mobjekt som animerar metoderna som kommer efterรฅt. Till exempel anger :code:`square.set_fill(WHITE)` fyllnadsfรคrgen pรฅ fyrkanten, medan :code:`square.animate.set_fill(WHITE)` animerar detta." #: ../../source/tutorials/building_blocks.rst:282 msgid "Animation run time" msgstr "Animationens kรถrtid" #: ../../source/tutorials/building_blocks.rst:284 msgid "By default, any animation passed to :meth:`play` lasts for exactly one second. Use the :code:`run_time` argument to control the duration." msgstr "Som standard varar varje animation som skickats till :meth:`play` i exakt en sekund. Anvรคnd argumentet :code:`run_time` fรถr att kontrollera varaktigheten." #: ../../source/tutorials/building_blocks.rst:297 msgid "Creating a custom animation" msgstr "Skapa en egen animation" #: ../../source/tutorials/building_blocks.rst:299 msgid "Even though Manim has many built-in animations, you will find times when you need to smoothly animate from one state of a :class:`~.Mobject` to another. If you find yourself in that situation, then you can define your own custom animation. You start by extending the :class:`~.Animation` class and overriding its :meth:`~.Animation.interpolate_mobject`. The :meth:`~.Animation.interpolate_mobject` method receives alpha as a parameter that starts at 0 and changes throughout the animation. So, you just have to manipulate self.mobject inside Animation according to the alpha value in its interpolate_mobject method. Then you get all the benefits of :class:`~.Animation` such as playing it for different run times or using different rate functions." msgstr "ร„ven om Manim har mรฅnga inbyggda animationer, kommer det vara stunder nรคr du behรถver animera smidigt frรฅn ett tillstรฅnd av ett :class:`~.Mobject` till ett annat. Om du befinner dig i den situationen kan du definiera en egen animation. Du bรถrjar med att utรถka :class:`~.Animation`-klassen och รฅsidosรคtter dess :meth:`~.Animation.interpolate_mobject`. :meth:`~.Animation.interpolate_mobject` -metoden fรฅr alfa som en parameter som startar vid 0 och รคndras under hela animationen. Sรฅ du behรถver bara manipulera self.mobject inuti Animation enligt alfa vรคrdet i dess interpolate_mobject-metod. Dรฅ fรฅr du alla fรถrdelar med :class:`~.Animation` sรฅsom att spela det under olika kรถrtider eller anvรคnda olika hastighetsfunktioner." #: ../../source/tutorials/building_blocks.rst:306 msgid "Let's say you start with a number and want to create a :class:`~.Transform` animation that transforms it to a target number. You can do it using :class:`~.FadeTransform`, which will fade out the starting number and fade in the target number. But when we think about transforming a number from one to another, an intuitive way of doing it is by incrementing or decrementing it smoothly. Manim has a feature that allows you to customize this behavior by defining your own custom animation." msgstr "Lรฅt oss sรคga att du bรถrjar med ett tal och vill skapa en :class:`~.Transform`-animation som omvandlar talet till ett annat givet tal. Du kan gรถra det med :class:`~.FadeTransform`, vilket kommer att tona bort det fรถrsta talet och tona in det andra talet. Men nรคr vi tรคnker pรฅ att omvandla ett tal till ett annat, รคr ett intuitivt sรคtt att gรถra det genom att inkrementera eller dekrementera det pรฅ ett smidigt sรคtt. Manim har en funktion som gรถr att du kan anpassa detta beteende genom att definiera din egen animation." #: ../../source/tutorials/building_blocks.rst:311 msgid "You can start by creating your own ``Count`` class that extends :class:`~.Animation`. The class can have a constructor with three arguments, a :class:`~.DecimalNumber` Mobject, start, and end. The constructor will pass the :class:`~.DecimalNumber` Mobject to the super constructor (in this case, the :class:`~.Animation` constructor) and will set start and end." msgstr "Du kan bรถrja med att skapa din egen ``Count`` klass som utรถkar klassen :class:`~.Animation`. Klassen kan ha en konstruktor med tre argument, ett :class:`~.DecimalNumber` Mobject, start and end. Konstruktorn kommer att skicka :class:`~.DecimalNumber` Mobject till superkonstruktorn (i detta fall konstruktorn i :class:`~.Animation`) och kommer att stรคlla in start och slut." #: ../../source/tutorials/building_blocks.rst:315 msgid "The only thing that you need to do is to define how you want it to look at every step of the animation. Manim provides you with the alpha value in the :meth:`~.Animation.interpolate_mobject` method based on frame rate of video, rate function, and run time of animation played. The alpha parameter holds a value between 0 and 1 representing the step of the currently playing animation. For example, 0 means the beginning of the animation, 0.5 means halfway through the animation, and 1 means the end of the animation." msgstr "Det enda du behรถver gรถra รคr att definiera hur du vill att det ska se ut fรถr varje steg i animationen. Manim ger dig alfavรคrdet i :meth:`~. nimation.interpolate_mobject' metoden baserat pรฅ bildhastigheten av videon, hastighetsfunktionen och kรถrtiden fรถr den animation som spelas. Alfaparametern har ett vรคrde mellan 0 och 1 som representerar steget i den aktuella animationen. Till exempel betyder 0 bรถrjan av animationen, 0,5 betyder halvvรคgs genom animationen och 1 betyder slutet av animationen." #: ../../source/tutorials/building_blocks.rst:320 msgid "In the case of the ``Count`` animation, you just have to figure out a way to determine the number to display at the given alpha value and then set that value in the :meth:`~.Animation.interpolate_mobject` method of the ``Count`` animation. Suppose you are starting at 50 and incrementing until the :class:`~.DecimalNumber` reaches 100 at the end of the animation." msgstr "I fallet med ``Count`` animationen, behรถver du bara hitta ett sรคtt att bestรคmma talet som ska visas fรถr det givna alfavรคrdet och sedan ange det vรคrdet i :meth:`~.Animation.interpolate_mobject` -metoden fรถr ``Count``-animationen. Antag att du bรถrjar med 50 och inkrementerar vรคrdet tills :class:`~.DecimalNumber` nรฅr 100 i slutet av animationen." #: ../../source/tutorials/building_blocks.rst:323 msgid "If alpha is 0, you want the value to be 50." msgstr "Om alfa รคr 0, vill du att vรคrdet ska vara 50." #: ../../source/tutorials/building_blocks.rst:324 msgid "If alpha is 0.5, you want the value to be 75." msgstr "Om alfa รคr 0,5, vill du att vรคrdet ska vara 75." #: ../../source/tutorials/building_blocks.rst:325 msgid "If alpha is 1, you want the value to be 100." msgstr "Om alfa รคr 1, vill du att vรคrdet ska vara 100." #: ../../source/tutorials/building_blocks.rst:327 msgid "Generally, you start with the starting number and add only some part of the value to be increment according to the alpha value. So, the logic of calculating the number to display at each step will be - 50 + alpha * (100 - 50). Once you set the calculated value for the :class:`~.DecimalNumber`, you are done." msgstr "Allmรคnt sรฅ bรถrjar du med startnumret och adderar bara en del av vรคrdet som ska inkrementeras enligt vad alfavรคrdet รคr. Sรฅ den programlogik som behรถvs fรถr att berรคkna talet som ska visas vid varje steg kommer att vara - 50 + alfa * (100 - 50). Nรคr du satt det berรคknade vรคrdet fรถr :class:`~.DecimalNumber`-klassen รคr du klar." #: ../../source/tutorials/building_blocks.rst:331 msgid "Once you have defined your ``Count`` animation, you can play it in your :class:`~.Scene` for any duration you want for any :class:`~.DecimalNumber` with any rate function." msgstr "Nรคr du vรคl har definierat din ``Count`` animation kan du spela upp den i din :class:`~.Scene` med given varaktighet fรถr vilken klass :class:`~.DecimalNumber` som helst, med valfri hastighetsfunktion." #: ../../source/tutorials/building_blocks.rst:368 msgid "Using coordinates of a mobject" msgstr "Anvรคnda ett mobjects koordinater" #: ../../source/tutorials/building_blocks.rst:370 msgid "Mobjects contain points that define their boundaries. These points can be used to add other mobjects respectively to each other, e.g. by methods like :meth:`~.Mobject.get_center` , :meth:`~.Mobject.get_top` and :meth:`~.Mobject.get_start`. Here is an example of some important coordinates:" msgstr "Mobject innehรฅller punkter som definierar objektets rand. Dessa punkter kan anvรคndas fรถr att lรคgga till andra mobjects gentemot varandra, t.ex. genom metoder som :meth:`~.Mobject.get_center` , :meth:`~.Mobject.get_top` och :meth:`~.Mobject.get_start`. Hรคr รคr ett exempel pรฅ nรฅgra viktiga koordinater:" #: ../../source/tutorials/building_blocks.rst:402 msgid "Transforming mobjects into other mobjects" msgstr "Omvandla mobjects till andra mobjects" #: ../../source/tutorials/building_blocks.rst:403 msgid "It is also possible to transform a mobject into another mobject like this:" msgstr "Det รคr ocksรฅ mรถjligt att fรถrvandla ett mobject till ett annat mobject pรฅ detta vis:" #: ../../source/tutorials/building_blocks.rst:414 msgid "The Transform function maps points of the previous mobject to the points of the next mobject. This might result in strange behaviour, e.g. when the dots of one mobject are arranged clockwise and the other points are arranged counterclockwise. Here it might help to use the `flip` function and reposition the points via the `roll `_ function of numpy:" msgstr "Transform-funktionen avbildar punkter hos det tidigare mobjectet till punkterna i nรคsta mobject. Detta kan resultera i konstigt beteende, t.ex. nรคr punkter av ett mobject arrangeras medsols och det andra mobjectets punkter arrangeras motsols. Hรคr kan det hjรคlpa att anvรคnda `flip`-funktionen och flytta punkterna via `roll `_ funktionen i numpy:" #: ../../source/tutorials/building_blocks.rst:440 msgid "Scenes" msgstr "Scener" ManimCommunity-manim-1157b74/docs/i18n/sv/LC_MESSAGES/tutorials/quickstart.po000066400000000000000000000213731515024150700265450ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: 031f65d9b7a2e83b265c23f1c4450271\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Crowdin-Project: 031f65d9b7a2e83b265c23f1c4450271\n" "X-Crowdin-Project-ID: 1\n" "X-Crowdin-Language: sv\n" "X-Crowdin-File: /[ManimCommunity.manim] main/docs/i18n/gettext/tutorials/quickstart.pot\n" "X-Crowdin-File-ID: 5843\n" "Language-Team: Swedish\n" "Language: sv_SE\n" "PO-Revision-Date: 2021-11-06 12:29\n" #: ../../source/tutorials/quickstart.rst:3 msgid "Quickstart" msgstr "Snabbstart" #: ../../source/tutorials/quickstart.rst:5 msgid "This document will lead you step by step through the necessary procedure to get started with manim for the first time as soon as possible. This tutorial assumes you have already installed manim following the steps in :doc:`../installation`." msgstr "Detta dokument kommer att leda dig steg fรถr steg genom de nรถdvรคndiga stegen fรถr att komma igรฅng med manim fรถr fรถrsta gรฅngen. Den hรคr รถvningen fรถrutsรคtter att du redan har installerat manim efter stegen i :doc:`../installation`." #: ../../source/tutorials/quickstart.rst:12 msgid "Start a new project" msgstr "Starta ett nytt projekt" #: ../../source/tutorials/quickstart.rst:14 msgid "To start a new manim video project, all you need to do is choose a single folder where all of the files related to the video will reside. For this example, this folder will be called ``project``," msgstr "Fรถr att starta ett nytt manimvideoprojekt รคr allt du behรถver gรถra att vรคlja eller skapa en enda mapp dรคr alla filer relaterade till videon kommer sparas. Till exempel kommer den hรคr mappen att heta ``project``," #: ../../source/tutorials/quickstart.rst:22 msgid "Every file containing code that produces a video with manim will be stored here, as well as any output files that manim produces and configuration files that manim needs." msgstr "Varje fil som innehรฅller kod som genererar en video med manim kommer att lagras hรคr, samt alla utdatafiler som manim producerar och konfigurationsfiler som manim behรถver." #: ../../source/tutorials/quickstart.rst:28 msgid "In case you like to work with Jupyterlab / Jupyter notebooks, there is good news: Manim ships with a ``%%manim`` IPython magic command which makes it easy to use in such a setting as well. Find out more in the :meth:`corresponding documentation `." msgstr "Om du fรถredrar att arbeta med Jupyterlab / Jupyter notebooks sรฅ finns goda nyheter: Manim utges med ett ``%%manim`` IPython magic command som gรถr det enkelt att anvรคnda Manim i en sรฅdan miljรถ ocksรฅ. Lรคs mer i :meth:`motsvarande dokumentation `." #: ../../source/tutorials/quickstart.rst:35 msgid "Your first Scene" msgstr "Din fรถrsta scen" #: ../../source/tutorials/quickstart.rst:37 msgid "To produce your first scene, create a new file in your project folder called ``scene.py``," msgstr "Fรถr att producera din fรถrsta scen skapar du en ny fil i din projektmapp som heter ``scene.py``," #: ../../source/tutorials/quickstart.rst:45 msgid "and copy the following code in it." msgstr "och klistra in fรถljande kod in i den." #: ../../source/tutorials/quickstart.rst:58 msgid "Then open your command line, navigate to your project directory, and execute the following command:" msgstr "ร–ppa sedan din command line, navigera till din projectkatalog och kรถr fรถljande kommando:" #: ../../source/tutorials/quickstart.rst:65 msgid "After showing some output, manim should render the scene into a .mp4 file, and open that file with the default movie player application. You should see a video playing the following animation." msgstr "Efter att ha visat lite utdata bรถr manim gรถra scenen till en .mp4 fil, samt รถppna filen med din standard videospelare. Du bรถr se en video som spelar upp fรถljande animation." #: ../../source/tutorials/quickstart.rst:78 msgid "If you see the video and it looks correct, congrats! You just wrote your first manim scene from scratch. If you get an error message instead, or if do not see a video, or if the video output does not look like this, it is likely that manim has not been installed correctly. Please refer to the :doc:`../installation/troubleshooting` page for more information." msgstr "Om du ser videon och den ser korrekt ut, grattis! Du har precis skrivit din fรถrsta manimscen frรฅn grunden. Om du fรฅr ett felmeddelande istรคllet, om du inte kan se en video eller om den producerade videon inte ser ut sรฅ hรคr sรฅ รคr det troligt att manim inte har installerats korrekt. Se sidan :doc:`../installation/troubleshooting` fรถr mer information." #: ../../source/tutorials/quickstart.rst:87 msgid "Explanation" msgstr "Fรถrklaring" #: ../../source/tutorials/quickstart.rst:89 msgid "Let's go line by line over the script we just executed to see how manim was able to generate the video." msgstr "Lรฅt oss gรฅ rad fรถr rad genom skriptet som vi just kรถrde fรถr att se hur manim kunde generera videon." #: ../../source/tutorials/quickstart.rst:92 msgid "The first line" msgstr "Fรถrsta raden" #: ../../source/tutorials/quickstart.rst:98 msgid "imports all of the contents of the library. This is the recommended way of using manim, as usually in a single script you will be using quite a few names from the manim namespace. In particular, this line includes all of the names used in the script: ``Scene``, ``Circle``, ``PINK`` and ``Create``." msgstr "importerar allt innehรฅll i biblioteket. Detta รคr det rekommenderade sรคttet att anvรคnda manim eftersom du vanligtvis kommer att anvรคnda en hel del namn frรฅn manims namespace i ett enda skript. Speciellt innehรฅller den hรคr raden alla namn som anvรคnds i skriptet: ``Scene``, ``Circle``, ``PINK`` och ``Create``." #: ../../source/tutorials/quickstart.rst:103 msgid "Now let's look at the next two lines." msgstr "Nu kan vi titta pรฅ de nรคsta tvรฅ raderna." #: ../../source/tutorials/quickstart.rst:111 msgid "Most of the time, the code for scripting an animation with manim will go inside the :meth:`~.Scene.construct` method of a class that derives from :class:`.Scene`. Inside this method, you will create objects, display them on screen, and animate them." msgstr "Merparten av tiden, kommer koden fรถr att skripta en animation med manim att gรฅ in i :meth:`~.Scene. onstruct` metoden av en klass som hรคrstammar frรฅn :class:`.Scene`. Inuti denna metod kommer du att skapa objekt, visa dem pรฅ skรคrmen och animera dem." #: ../../source/tutorials/quickstart.rst:115 msgid "The next two lines create a circle and set its color and opacity." msgstr "De tvรฅ nรคstkommande tvรฅ raderna skapar en cirkel och anger dess fรคrg och opacitet." #: ../../source/tutorials/quickstart.rst:122 msgid "Finally, the last line uses the animation :class:`.Create` to display the circle on the screen." msgstr "Slutligen anvรคnder den sista raden animationen :class:`.Create` fรถr att visa cirkeln pรฅ skรคrmen." #: ../../source/tutorials/quickstart.rst:129 msgid "Every animation must be contained within the :meth:`~.Scene.construct` method of a class that derives from :class:`.Scene`. Other code, for example auxiliary or mathematical functions, may reside outside the class." msgstr "Varje animation mรฅste finnas i :meth:`~.Scene.construct`-metoden i en klass som hรคrstammar frรฅn :class:`.Scene`. Annan kod, till exempel hjรคlpfunktioner eller matematiska funktioner, fรฅr finnas utanfรถr klassen." #: ../../source/tutorials/quickstart.rst:135 msgid "Some bells and whistles" msgstr "Lite extra fint och glans" #: ../../source/tutorials/quickstart.rst:137 msgid "Our scene is a little basic, so let's add some bells and whistles. Modify the ``scene.py`` file to contain the following:" msgstr "Vรฅr scen รคr lite platt och trรฅkig, sรฅ vi kan lรคgga till lite extra glans. ร„ndra filen ``scene.py`` sรฅ att den innehรฅller fรถljande:" #: ../../source/tutorials/quickstart.rst:157 msgid "And render it using the following command:" msgstr "Och rendera den genom att anvรคnda fรถljande kommando:" #: ../../source/tutorials/quickstart.rst:163 msgid "The output should look as follows." msgstr "Utmatningen frรฅn skriptet bรถr se ut pรฅ fรถljande sรคtt." #: ../../source/tutorials/quickstart.rst:180 msgid "This example shows one of the most basic features of manim: the ability to implement complicated and mathematically intensive animations (such as cleanly interpolating between two geometric shapes) in very few lines of code." msgstr "Detta exempel visar en av de mest grundlรคggande funktionerna hos manim: fรถrmรฅgan att genomfรถra komplicerade och matematiskt intensiva animationer (sรฅsom att snyggt interpolera mellan tvรฅ geometriska former) i mycket fรฅ rader av kod." #: ../../source/tutorials/quickstart.rst:187 msgid "You're done!" msgstr "Du รคr klar!" ManimCommunity-manim-1157b74/docs/make.bat000066400000000000000000000015311515024150700203700ustar00rootroot00000000000000@ECHO OFF pushd %~dp0\source REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) REM The paths are taken from the source directory set SOURCEDIR=. set BUILDDIR=..\build if "%1" == "" goto help %SPHINXBUILD% >NUL 2>NUL if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% goto end :help %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% :end popd ManimCommunity-manim-1157b74/docs/requirements.txt000066400000000000000000000001441515024150700222460ustar00rootroot00000000000000furo myst-parser sphinx>=7.3 sphinx-copybutton sphinxext-opengraph sphinx-design sphinx-reredirects ManimCommunity-manim-1157b74/docs/rtd-requirements.txt000066400000000000000000000000471515024150700230370ustar00rootroot00000000000000jupyterlab sphinxcontrib-programoutput ManimCommunity-manim-1157b74/docs/skip-manim000066400000000000000000000000001515024150700207410ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/source/000077500000000000000000000000001515024150700202635ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/source/_static/000077500000000000000000000000001515024150700217115ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/source/_static/bezier_subdivision_example.png000066400000000000000000003224161515024150700300400ustar00rootroot00000000000000‰PNG  IHDR€8่ำมCIDATxœ์wx๕†๑gKz- ฝ๗*ฝHS้ˆขb๏”bม†€จG@ฐ‹XQQDQšH•&ฝI‘^„า7๛แ Gฬฆ๏nถŸ๋โ:œ™฿ฬ~Qd๏ƒ$ซnฯXฺ์ƒ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ‚ ย\ฺ๗a6dAซU9Vki๘0ศS9?u‰.ฏkฃสฉAxจส๙๛ษh4(5+[ว/ฅj[BขVฦีฆณ็•™“Sฺใ€ื3Hโ๒p•สAzด~M ญUU๒]›cตj{ยอุX_<ฆt‹ลIS ฎrOํjผกช๙ุUqg5zำm9—่€ษ!I’ัจถlฌ‘๊ศP‚๓œIKืฐu[๕ใฑSv› P8` ฃม 74ำc jูๅ|I™Yบ{๕๚๙xฌ]ฮ(0ะˆ†ต๕F›f6๗Y%Ÿ _cฯhาEฅ[,ชเ๏ฏe#ิ-ฆผชู<๎ฤฅT๕YบF&&;npภUภxนFaZป‹"|sํz.Qถฉล'ใ”“๛K†H?_[งบžmRO6ŽๅDœ.[+‹•/7ภŒฅ=(]O4ชc3ฮ9rBฝ—ฎัฯวcmฦ_I:Ÿ‘ฉ7vํือฟญำ๑”ิ\๛๛TŽึMี*ฺ}f€m`ผXฐTญRฎํ+ใโ๕ฺ่-:—žQจ๓ฌ>}VญฌKููน๖=TทฆŒC‰gŒ €๋[%F!>ๆซถฅ[,ณeท’2ณŠtฎeงฮh๚žฟrm๏Pกฌ๊…‡”hN@แ€๐bขห็ฺถไไimˆO(ึ๙f๎?ฌ„Œฬซถ๙™Œ๊Pพlฑฮ(0^*ศlVฝ๐ะ\อตอ์kRฟ':iิ์ิ‡฿ีbฤ‹2๚๘ไZw<%ีf”กQว‚5 k-=uZ๛’.*รbQyต(ก.{–iMตJฺPฝIฎcซืFIอO*{้)'วัฟ€$ƒ$๎ษ€2๛šิoTGต่]ฯๆฦ‡2ิs}ชฬ–ฟTH๗๑ำฬŽ7Œภ’t๐วฏตu๚ๅde•xf@x0^ศ^๑W’ณ2๔ภ๏฿ซํ‘6๗ืpปZŒ+ฃO‰fŒ[@เe Šฟ้โtอƒฬf฿BŸ๓rNฬศิz-sํฏ5เvIโJ`p0n €)(n[|@ \ฃฐถWฏฌHฟ‚C๐ค‹๚ไภ}vโŒ๊Žš *๛ุ\วํ ภฑภx‰ยฦ฿ฌŒ์+ช๊†ŠQ๊UN๕ยC้็'“ม ิ์lJMำ๖„ Zฏ฿ฯœีลฌฟ3ฉ๕3ฏ €๐ล‰ฟf4ไo2ส ƒฒrr”™““๗๋ฉ๕ณฏฉJ7"08g๘[ฌื%€ำ™K{เ8ฦ฿E๛ต`๊๏vฟ’”zIL|N’lFเZn—$"0ุ‘ฑดŽQš๑๗ฒห๘๘๒_l๎ฏ5เvต1VF‡อ„ €r…๘{œ‡ €‡1๛šิwคkฤ฿หˆภเ`<ศๅ๘{Mื‰ฟ—ภ๑ภxWŽฟ—ภฑภxwˆฟ—ภq ’ฌฅ=(>wŠฟd R๋g_S•n}l๎?8ถถN{I9YYNž Wเฦ5J…ธ๘ฦิbไ8ฎ€" เฆ9^F๛"เ†ฑbกอD`ศ็M๑๗ฒฌK)๚cโsD`("0.ฬใ๏eD`(:0.ส›ใ๏eD`(0.ศ์CฝŒ …Gภล˜}L๊;Š๘๛OD`(0.„๘›7"0ฬ\ฺ€ฟท.ฺฏŸฝ4^v9KRๅฎฝsํฏuใm’คญำ^RNV–SgWภภธโoแq%0ไอ ษZฺCเอฬ>&๕ูQื๔%…OPฐZ?๛šอ+%้ะO฿hหิ๑\ ภซp0ฅˆ๘[|] \ณญบfิxฎเUภ”โoษเjๆาoT˜๘ปเอ5สฮด8y2๗s9Kฒy;่šo•$n ภ+p0NFต?ฎ€ฟ€p"โฏใ€ €ำ ภ๑ `œ€๘๋<…&๐Kสษสt๊lเh\ €ƒ๏W/ฒน๏+วษ่ใ๋ไษภฑภ8๑ท๔Ÿ%๐*`„๘[๚ˆภผ  บ"0oBภฮˆฟฎ‡ ภ[€ฐ#โฏ๋"๐`์„๘๋๚ˆภ<; บ"0OF „ˆฟ๎‡ ภS€(โฏ๛"๐DๆาwU`]ธO ฆNua—#ฐ$U๎ฺ+ืšo•$m™๚’rฒ2:WP f“๚Œ์@๕\ ภ“€(ขห๑ทe฿๚6๗€ง Pฤ_ฯ•u)ELzŽ ภญ€($โฏ็หJนHเึภ๑ื{ธ30 z"0wE ฤ_๏u%ฏ\ls?€+"โ/ฒR.๊‰ฯธ 06q€;!๐/ฤ_€ป ๐ฤ_ไ… ภ€๘ฤ_„ ภี€๑…Gเส ’ฌฅ=ฅ‰๘‹โ๐ Q๋g'ชr—ž6๗Z๐ญถผ9^9Y™Nž €7ใ `€W#ขธ ผธ฿]๓ฤxฎเT`€ื"ขคˆภ\ เ•ˆฟฐ"0WBxโ/์ ภU€^…๘ G!pๆาg)(n๙eŸ~žFE๑]Žภ’TนKฯ\๛k๖"Iฺ๒ๆxๅde:u6+€^ม์cRŸฤ_8W(M`€วป๛แD`ฅ… ๐hฤ_”"0€า@x,โ/Jๅ|rี›๛‰ภ์ ๐Hฤ_ธŠฌ”‹ฺ๘ฺ3D`NAxโ/\ €ณ€…๘ WEเ `€ว ยี8เˆฟpD`ŽDธ=โ/ €ฃ$YK{ŠหไcT฿‰ฟpK>ม!j๓$U๊รๆร?ฯัๆ7ฦ)'+ำษ“8F„ŸฏZ•Tซrชฌ0e[st&-C๛“’ต้lขv%^P†%งดGJUๅk๊ซN็ฆŠช]^มแพ2š สLท่ย™K:น๋„ฌฺฆฤcqฅ=&PชLF5ŒS‹2ชค0_eๅXŸ–ฎ}Iต#แ‚_L!€๐J`€"ย€7จข๊ีะอี*ฉrP`ž๋,Vซ๖$&้๋Cว๕๙_Gu6=ร‰Sฅหd6ซ}uM๏บŠป$ฃฒ๒\›e ะ้Xณึฯจ] ึ8qJ ๔E๘๋ฎฺีt[*j*“ม`sฅ์lq๖ผf<ฆนGN(5›๗‡x0ภ-แIˆภภS˜LีจŽF4ชฃ2~E{ผล_ษ)šฐmf:๎ ้ืQ๗บึ๊๙xW• ฟPคใฌ2ุ้18[%>ๅ˜แa4toํjzถi}U *าฑใ4n-;uฦAำ€k!๑žศ78TญŸ›˜o๒ๆxY2น ธ‡สAzท} ๕ฎ]์sไXญzs๗ฝธeทฒrธ-4WžJMำ๎๓I:–.?“Qี‚ƒิ "Tก>>y๓โ–zmoุรsดนปทz฿W#ฯgๆศG)ฉJJฬQvVŽ‚อ ณส฿็ข yผฅ›’ฆO๛Vgsไ่€ำ อุ่2ฯ+ญ’๖&&kKBขโRำไg2ฉFHš—‰Pฅ ›วXฌV=ฒv‹>=pฤqƒ@)#๑„ ู3M๊้ี–m๎u>IS๗ะฯวcu>#๓สvƒคชมARฃฒkP[ันŽMอถจ฿ฏkด*๎ฌฃFœ&ขjด๙๘๚$็ฺ—#ณ๔ั๊W่่†ฒๆ๏ํ[฿ภี๏ูVnoฅ่rI6ฯ}โTˆf>ลaณฮto๊๚จcK›๛VฦลkสฎZฏ หี ˆ๔๓Uฟ*1zชq]ีอul|z†ฎ_ดJ{m>wGธ<โ/ผธฃ!A๚ฝ_w•๗๗หตoๆรza๓.%#ฺา "TดฟFํ+”อตoE\ผz-Yญ์ฮ‚{ป๕ญajุ4;ื๖๔์`-h—ถ|ณ4฿ใ Fƒ๚ŒฝGญปไบ}ดU2๓˜6ฮZdื™g+ใ็ซ฿๛uWํะเซถ[%w๛^ฝถcฏา-๙ฟ ทฺ5ื€ชsํ๛๖๐ ]นมž#€ห0–๖ไงภ๘๛3๑ž)3%Yผ๖ฌNฎZbsพท่š'ฦหไ›๛อU€าrWํj6ใ๏วŽ่ฑ๕[ Œฟ’๔gbฒ๎XตQ.ไฺื%บผฎ‰ฒวจ@ฉ‰จญฺs>ษฒ่ว76%ษšcีฯใ?ีฦ฿.ๅฺgUmnถ}>เN†ิจ’+Jว฿q[w%)65Mฌูคeงฮไฺ7 jEต,i—Yภี€.หไcTŸแ๒ฟำˆฟ๐\D`เNL&\ญRฎํ^Hึ˜อปŠtี๎๑”T=๙ว๖\o๎$ ฉQนคฃฅ๊šAๅkฬn7-;ฏ= ื้\ฟL๘\'N…ไฺ^&โ’ชตmR์าf4ly๛™sšXฤ็ม_ศฬา“์ศ๕!$?“Qƒซ็{ <นดภ–ห๑ทU6๗แ-.G` ชtํ น๖ื่{‹$q;hP๊G†ฉnX๎๕มC:›n๛๋ฃ9๏ทฆึœMิqบญFีซถท‰Rh€ฟRฒr฿>ทคฌVn-m7ฃฬSํึ•%]์฿K™กZ๙๎72š=a0ฎ์3 2ศ*kฮžqš๓ญZญV-เ7๙r•ueฟQูช}3๛c—%n€฿ำ.-ฟ=5C‚ิผLDฎํo๏๙Ki…ธ๒๗฿๖$&้ณG๔dใบWm๏SAfฃG ๐8<เrˆฟ@nพมกj$›Xโ™ภ ๔=\ฏฆm฿โชmI™Yj6oฉN\Jฝj{™Jaบnฺ‡บ˜‘ญ7ƒ}ฬชxี6ซีชฃ)ฉส๘g๐ยศSjฑบ^ทt~ญyฟฆA Œ F๘a๚฿ฯMFำ•ŸŒ†ฟn*˜็ศO W3ัะV™ฦ๖๚ป๛๔ฟkPx๖l•)ƒUซd•ฌ๚฿ZญRŠRd๘G–$ซีOๆ ƒrrฌสษษ๙ว‹r,’“ฃ‹ๅชVซ๕๏Ÿฤ>4ํ๕ฏะ^๓ุๅ,๖;‘]ทื,๖8‘N้๋›๋CE99ฺ‘pAู๙๓:[ Ÿ|Qi็r฿๒นM๙2ZำงซŒ๘€ErV–ฟDงRำJ>4ธฎธโ/`[fJฒ๘๏3’ฤ•ภภ%ี สตํฏไ‹นT/[9Lƒ_์ฎ‹Q ชภ\ว[ฌm~แม€+ณJฒuบYฉ2[r฿9ูPI)2/œฃo•ณž’$eY๕ฏฤ๛?[ ฒ๘oฟ้T@ž ืwาฦถ˜จ๒yฎ฿kzB>2ซธ`ญŸ0JigฏŽภ’.๊\FๆUฯช6›U>ภŸ ภใ๐7=ภe]Žภ'W/ตนŸg€าๆ๋“k™ดŒ+ทช•c๊–sๆh€ห0([๛{Zƒฒ•๛ oฏ้ ๅ๕nๅ›ทQปฑSPฎยUkRณณ•œy๕ว(Œƒ‚ฬ&งอ ฮBธโ/P8D`เชl’ำฯ๘ฟทžˆฟ€๔๗ฑพ^ืj# (ฌฆ‡ฏฤ฿หlE`ฃ 2s_/o๑ยว๐|`@ฉ#ECฎ่LjzฎmUC‚`2ว^G…ืณศW9๒อตO‰ฅ0 เสๆ!ƒrrmw.๋๏ง2~WŸœ•“ฃ ™y\ฯ”*โ/P<…z&ฐม -oŒใ™ภภ)๖\HฮตญFHฺ7ชฌ:]ฃ˜:eฏฺW)gาUV‡ทฦjบcฒฺธฺ๋่rบฉjลซถeXr4i็>%fdๆ1‰ฎไrภีav?ฅ#ฎ`sฤฏป€?พพพ SูฒeUกBEEEฉ|…๒*SฆŒBCCๅ็๋+ฎพ‚ฯึ๓oKชฐ็ดJฒๆไศbฑ(;;[YููสสสRVfฆ2ณฒ”™™ฉฌห๛?O ‘ูrีyB3๖J{ฯ*วjUŽล"ซีzๅว™ศช22eผpNฦ์lษ F FF™ฬ2ีณสlHฝ๊œ–์hEฅ„ศืวGพพ~๒๑๕‘ฏฏฏ|}|นฏ|||d2›d6™e4๓…J๔OนxวZญ9สHฯะ…ค :w๖œโNŸึ้ธ8ล>ญs็ฮ*9)YYY๙‡ป\‚฿%๚ํS‚c ๚=ๆฐื-ษ/ุฦกuรC5ฆYซ๋ษศษั˜อป๗}่oŠl}@Q=–มd๛Jเ๕Fฉ}ˆฏB|ฎ6=Cq<€"J ๑(™#pŸม’DNฑ๕\ข.fe_๕ๆzR˜Yื=Iู1นึYi์ŸดtฦFYsrฟ๛์cึ#ฝปชYสัซถo>w^›,็–nฮl6ซ|๙๒ชYณฆ4h FฉAƒชQฃ†*Tจ €€€R™หbฑ(==])))JJJRbbขฎ๚qy%&&*11Qษษษบx๑ขRRR”––ฆ๔๔๔+ัืbฑ(''๗U‰C฿ฎz๚68ะ|Jsพ๚JG7์,๒ฬFขฎ๕#rm_๒ีfญไ็ซถ ™L&๙๘๘ศววG PPPBBBช๐๐pEDD(22Reส”น๊GDD„ยรรฌ€€๙๘ไ~๖ท3\บtIqqq:x๐ ๓Oํฝ[{๗๎ีแร‡• ‹…๗I?_ฝแฃ˜ภซ,่+r0๗ฟฝฉฺ๛ฯช๙๐12šsGเ๖cง๊–U฿ๆ:lว๙ \ ภ#€ฅ‚๘ ุธŠฃ)—ด๖ฬ9๕ฌ%I:jาkƒ”]ฦ๖Oฟฯ‘g•คQ ๋จY™๐\9Gu3ชTฉ’๊ีซงฆM›ชiำฆช_ฟพ*WฎฌะะP Žธ†๗jVซUJNNVBB‚ฮœ9ฃธธ8ลฦฦ*66Vqqq:sๆŒฮ;w%์ฆฅฅ)++ซdW6ฺฐk๑ีmP_†\๖h2dจ็ศš1trŠ/+ิฏฎถ}ซJบ๚ K๖,ฺ˜kฝีjUvvถฒณณ•––ฆไไW๎็วl6+ @!!! W™2eฎ\ฉฃ˜˜EGG+**Jeห–UXX˜พบุŽ‚‚‚TซV-ีชUK={๖ผ๒kKLLิัฃG๕็ŸjวŽฺนsง๖๏฿ฏธธ8efๆuืธข๓™Zv๊Œ๎ช]ํชํิซฉyGOi[B๎ฆ๕ร,Iฒห5oฃQๅtํชo‘๚ฟ๎:kแภไ๛โ7โ/`พมกj$›X’๒8เ๊•5ปk+๑๗t1ใ๏=ตซ้ฝืศ๗_ั(1#Sํฆฟ’Sl‡า็็็งJ•*ฉaร†jัข…š7oฎ จRฅJ๒๗๗w่kgdd(11QงOŸึ‰'t๘q=zTวืษ“'uๆฬ?^))):ุ‘LfณFฬRมrํฝฌ๏ž๘ P8ฌby๎=*‘”k฿พ๚zุ๖ทXL&“‚‚‚ฎ *(&&FUชTQีชUUญZ5Uฎ\YัััŠŒŒT`` C?p้า%;vL{๖์ัถmดm6๙็ŸŠUvvถร^%ื%บผ–๔ผVฆ๗ฑ้์y ]นA‡/^ฒy\ํwฺŒภ’T?๎ฐ๓๘hส%ต๛้7M็๛dž‡ p*โ/เ8D`Pฺ|Fอป:ลฌœg]๗อN-pƒอ๘ๆ๋ฃ kู๋ฆ๕sล_IšผsŸž฿ผห๎sฃxŒFฃส—/ฏ ่škฎQซVญิธqcUญZีaทpฮศศPBB‚N:ฅร‡๋ะกC:x๐ Ž9ข“'O๊์ูณJIIq๙[ทฟฟฟzsีUภ—?ข_&จุ]6ns๛๊๗hงรฏUธˆœa าฬa?๊๔ร๖ูฎ ƒ‚‚‚TฆLลฤฤจZตjชYณฆjีชฅ5jจJ•**Wฎœs฿>RRRt๘๐aํนS›6mา–-[ด~;wฮ!ฏ‡โ1H๚ฆ[;\ญRฎ}&&k๔ฆZ|๒ดอc _YฑZำ๗e๏ฑภ%€NC JSูสaบ๗ๅž ญns้๒Yt\sะ๚๘%ddศว`T•เ@]]NƒชUR๐P›วn=—จ^KV+!ƒธ–ีจQC-ZดPถmuอ5ืจnบŠˆศู’JMMี้ำงu๘๐aํ฿ฟ_๛๖ํำ_ฅ#GŽ่๔้ำJIIฑ๙|]w๒ภ—OชjeWณgๅ๊่มํub๗QvZฆ‚หGจJ‹Zjpm EGงห([W1ดfแE-๔•c‡wฐภภ@•/_^UซVUญZตTฏ^=ีญ[WตjีRLLŒonตZu๎9ํปW›6mา† ด}๛v;vฌTฏ‡ิ "TKztVt`๎;d็X๕๓‰Xอ>t\[•˜‘)ณัจจuฌPVoน[๋ฎปUฃ)ืฑŽ๎ำ็O>จ gธ4ฯD8๑p"0( e+‡i๐ุ๋SงฌอmwงซหึTจซU้– ’ฟ)๗›๓t:-]7ถNใ์=6๒ช๚๕๋ซM›6j฿พฝš7oฎjีชษืืืnฏ‘™™ฉ๘๘x:tH๙ง๖์ูฃฝ{๗๊๐แร:sๆŒาาา์๖Zฎ&ขr”๎๐n…]ศw]Ž|d•AFYdP฿3uภ__<8ŽSบ•+WNUซVUฝz๕ิฐaC5lุPตkืVLLŒ]ฏ>2€ภฒ๚ํ4ซM_›8~FญŸ0Jigฯ8lv(-`€ร็#g*j-Šำi้บอ&-ษใ6ŸฐŸ๐๐p5jิHํทWวŽีฌY3UฌXQFทใ.ŽK—.้ฤ‰ฺปwฏv์ุก]ปvi฿พ}:qโ„.^ผh—ืp7›ึีm(,๐B‰ฯuไhf=๒ฎฒาผ๏k€€EGGซN:jธฑš4iข† ชz๕๊ ทหkdgg๋๘๑ใฺฒe‹~wญ_ฟ^{๗๎UJ ฯ$w†๛๊Tื›mš)ุว๖ใ๒Cเภ‡"ฅ‡ œก ๘h{Š๚๎ฬ,Vr.Q#6lำฎuˆ5jิH;vิตื^ซ-Z(::ฺ.ทึMMMีฑcวด{๗nmบUทoืพ}๛ซฬLnใOeชลhะkทซRL๑"xŽ|ด{ณE?<๓‘,ููvžฮ}™L&•/_^ตkืVำฆMีผys5mฺT5jิฐKถX,:qโ„6mฺคีซWkํฺตฺทoŸG_ต^ฺzTŠา๋ญ›ชA ศฯฒ๚ํ๔E›พส!๐`€ราGŽTP}๖ๆO=ธฎnฉ^Yๆo๕|ู™ดtอDำ๗ะyž๙k7~~~ช[ทฎ:v์จ.]บจu๋ึช\นr‰ฏ๐อฮฮึฉSงด{๗nmผY[ถlั๎ปu๊ิ)bo!Œu~lฺ๔ญฎ`ฟคBc•Q Bต๒ณฺ1oฅc๔&“I*TPฝz๕ิขE ตlูRM›6Uตjีไ๏Ÿ๛ณE‘ญ#GŽh๚๕Zนrฅึญ[งC‡)›(oW5ผam[งบส๛๛๊˜I๕๎ŸตขA;5~|ŒŒๆWx0ภ!ˆฟ€๋ G(L]:cฃฌ9ฟ๕ิ$2\ƒซWRŠQชฌ]พฮ4;วช„Œ ํ<Ÿค…'โ๔ใฑS:q‰็l–”ม`Pๅส•ีถm[u๏];vTํฺตๅใใSข๓&''๋ภฺฒe‹6lุ mถ้ะกC ืCƒิ๊๖๋ีฐKm•)Ÿ#_SบŒ๚; ZePŽีWi™Š;–กํ?oืฎซฏC๑๘๙๙ฉJ•*jฺดฉฺดiฃVญZฉAƒ*[ถl‰ฎ†OKKำฝ{ตz๕j-_พ\๑‡ฮœ!.ฺK•เ@XฅขzUŽRรˆ0•๑๓•ั(ซUJณXt*5M[ฮื/วใดไิi%efI’j฿t‡šx‘ ภใ€vG\opจZฟ0Y•:]os?EQใ๏?™ E๚+* @!>fe[Žฟqฉ้Jไj฿ Rณfอิญ[7u๋ึMอ›7WXXX‰ฮฏ]ปviร† Zฟ~ฝv๎ฉุุXY,|O็Ha!*[=F!ัed6›”~1U‰วใ•x<Ž[=;Xนrๅิ AตiำFํทWณfอTฉR%™L…ป‹-็ฮำๆอ›ตlู2ญXฑB{๖์QF฿ูCจส๙๛)ะว$KŽU2ณ”‘ก KŽอ๕D`€ ฐซ‚โ๏ๆŸ๗๊—ik‰ฟ@) {(I…cTชTI;vT=ิฉS'Uฏ^ฝุทuถZญ:}๚ดถmฆตkืjบuฺฝ{ทฮ;g็ฉ๗ขบu๋ชmถุ๊ฑฃZถlฉชUซสl# Fvvถ8 •+Wjษ’%ฺฐaƒโใใํ<5๒Cเ้ภป1๙ี็๑ju#๑pUD`Pฤ_ืเใใฃ จ{๗๎ู๊ณงZตjฅ๐๐๐bŸ/>>^[ทnีš5k๔๛๏ฟkืฎ]JLLด฿ภ€‡ Tฝz๕ิฎ];u๎YญZตR•*UŠม‹๘๘xญ_ฟ^‹/ึ๒ๅหu๐เAๅไุพz๖“oบA๋'<กดsD`๎‰ ฐ โ/เ>ˆภ 8ˆฟฅ+((H-[ถTฏ^ฝt๕ืซQฃF๒๕๕-ึน’’’ดs็Nญ^ฝZซVญาถmธย(เเ`5jิH:uR—.]tอ5ืจB… ล:Wjjชถmฆ%K–hษ’%ฺฑcทŠv "0OE”๑p?D`Pฤ฿าก:จo฿พ๊ฝปjึฌ)ƒมPไ๓dee้ภZณf–/_ฎ 6่ไษ“ฒZ๙๗8BูฒeีขE u๋ึM;wVใฦTไ๓X,๙็ŸZบtฉ.\จ?๘C)))˜ุปx"0 Dˆฟ€๛*(๙eฎ6ฟ1– €—#:W๙๒ๅuํตืชฺ๊ตซ*UชTฌ๓œ={V7nิฒeหดjี*ํป—ซR`4Uฝzuu์ุQื_ฝ:t่ ชUซ๙รVซU‡าฒeหด`มญ]ปVIIIšฺ๛x0 ุˆฟ€๛#€”ญฎม/v':X… ิตkWxใ๊าฅ‹ขขขŠ|Ž์์lํ฿ฟ_+VฌะาฅKตqใFลวว;`Z%ขๆอ›๋๚๋ฏW๗๎ีฌY3๙<วŽำฏฟชŸ~๚Ikึฌั… ์?ฌ—!๐$`@ฑฯAถซ\นrฺ๊ตซ  nบ๋yก/^ิ–-[ดdษ-[ถLปvํโ*_ภFีชUK]ปvUฯž=ีพ}{•/_พศ็9~ธ–.]ชQkึฌQrrฒฆ๕D`ž‚ (2โ/เyˆภเŸˆฟŽฎฮ;kเภบ๚๋]ไsฤววkอš5ZธpกVฎ\ฉ#GŽ๐,_ภC”/_^:tP๏ฝีญ[7Uฏ^ฝศทŠ>rไˆ-Zคy๓ๆiบuJMMuะดž‹ ภ€EB<—oH˜Z??‰ €—#ฺW@@€:t่ ชw๏ชZตj‘ฯq์ุ1-_พ\ฟ๒‹ึฌYรญ/ขVญZฉw๏๊ัฃ‡๊ืฏ/“ษT่ใญVซ๖๏฿ฏ hผyฺผyณฒฒฒ8ฑg!pw`@กฯGภปฟูกฅ b2™ิผys 8P7xฃ๊ืฏ_คซ๘ฌVซ:คฅK—jม‚Zฟ~ฝ’’’81Wๆ็็งๆอ›ซOŸ>๊ปทš4i"ณ0™‹ลขmถ้‡~ะ๙๓ตw๏^๎PD`๎Œ (โ/เ=ˆภx'โoษีฌYS๛๗ื AƒิชU+๙๘๘๚Xซีชฟ๚K‹/ึ‚ ดaรฅคค8pZ๎ศววGMš4Q฿พ}ีงO5kึฌHึคฅฅiอš5๚๎ป๏ดpแBลฦฦ:pZ๗W๋ฆกj1b,€! Dผ๏RถJธn]ัต‰ฟEกnธAทzซบu๋ฆะะะ"่ะ!-ZดH๓็ฯื๚๕๋u้า%M ภำ˜อf5mฺT๚๕Sฟ~ิดiำ"&๚์ูณZผxฑพ๙ๆญZตŠ?๒@เŽภ€|๏Eภ;‹ฮl6ซu๋ึ2dˆnผ๑ฦ"?ื๗ฤ‰Zผxฑ~๘แญ]ปV/^tะคผ…ZดhกoผQ๚๕Sร† ‹t๋๙ฝ{๗๊‡~ะw฿}ง;wr‹่!p7`@žˆฟˆภx6โoัTฉRE ะญทชึญ[๙Jปeห–i๎นZฑb…8)oๆ๏๏ฏถmjเภ๊ำงjิจQ่cำำำตfอ}๕ื๚ๅ—_t๖์YN๊^ˆภ `๑ภeD`<๑ทpีฅK :Tฝz๕R™2e }์ฅK—ฎF๕~ผƒZ็์ี/ำ‰ฟr#เˆฟซ]ปถ†ชกC‡ชVญZ…:ฦjตj๋ึญ๚๚๋ฏ๕๗฿ุ๋ฑcž\KDD„๚๔้ฃ;๎ธC]บt‘ŸŸ_กŽพ}ปพ๘โ }๛ํทŠu๐”ฅ ภี€ภ‹”Txแ๗ฺฦX"0ฅค0๑๗ื7*วCใฏัhTวŽu฿}๗iภ€ +ิq‰‰‰๚๙็Ÿ5kึ,ญZตJ™™™ž\›ม`Pณfอ4t่P 4HUซV-ิqงOŸึœ9s๔ูgŸiถmžฒtธ0x)โ/{!เšผ9ซ_ฟ~zเินsg™LฆBท{๗n}๕ีW๚๖ouไศO ๎ฉL™2๊฿ฟฟ๎บ๋.u์ุฑPทาOOOืขE‹4sๆL๚๋ฏสสสrยคฮGเ*ภเ…ˆฟ์ €k๑ึ๘ญoฟ]๗{ฏ6lXจc.?ณ๒ณฯ>ำาฅK•šš๊เ)ภ3FตkืNw฿}ทnบ้&•-k๛๏œฒZญฺธqฃfฮœฉ๏ฟ^.\p NFเ ภเeˆฟ… €k๐ฦ๘ A{๏ฝบ๖SจcNž<ฉ9sๆ่‹/พะŽ;>>บ๎บ๋๔ะCฉWฏ^๒๓๓+๐˜อ›7๋ƒ>ะœ9st๑โE'LiD`ฮDEเ*ˆภ8†งฦ฿Š+๊พ๛๎ำ๗฿ฏชUซธ๒ญB?๐C-^ผXYYYN˜`ญ[ทึƒ>จมƒ+,,ฌภ๕ปw๏ึ‡~จฏพ๚J‰‰‰N˜ะพˆภœ… จ0๑๗็้ฟห’•ใไษx+"0๖UฎJธ{XญVญšxเ{๏ฝЉ‰)pฅK—4o<}๐มZทnฌV๗๙ตฎVทn]w฿}บ๓ฮ;]เ๚่ร?ิ_|กs็ฮ9aB๛!p0xโ/WEภ><-ึจQC?ฐ๎น็•/_พภ๕็ฯŸืื_ญ>๚H;w๎tย„gฉXฑข๎บ๋.ชYณf๋>ฌ3f่ำO?U|ผ๛DS"0G#€!puD`Jฦ“โoอš5๕ศ#่ž{๎Qูฒถ=ซฯ?\ฑ:ไ„ ฅ%22Rทv›~๘a5nธภ๕GีŒ3๔ษ'Ÿ่ฬ™3N˜ฐไˆภ‰ ‚๘ ภ](O‰ฟ5kึิฃ>ช{๎นGeส”)p‘#G๔๑ว๋ณฯ>ำฉSงœ0!ภUkะ A๚ฯฃVญZธุฑc๚๐ร&8 <๑€ป๑ S›&ซbG"0…QฎJธปNัตlSwˆฟีซWืฃ>ช{๏ฝทPW^~พใฌYณt๖์Y'LpU0`€† ฆŽ;ธ่ัฃ๚เƒ๔ษ'Ÿธ฿!D`Ž@7GเฎˆภŽปว฿ส•+๋ัGี๗฿_จg๙็Ÿz๗๕ีW_)11ั …๚๖ํซว\]บt‘ม`ศwแร‡๕{๏้ำO?ี๙๓็4eัๅืiร„'‰ภŠ„ nŒ๘ ภศŸ;ว฿่่h=๔ะCz๘แ‡]เ๚]ปv้ฝ๗ำื_ญไไd'LpWfณYฝz๕า๐แรีฝ{๗C๐๔๖o๋‹/พpูฟcˆภ์‰ nŠ๘ ภS๘††ซอ๓“๒Žภ‹~ะๆ)/^ว]ใo™2e๔ภ่ัGUีชU \ฟs็Nฝ๛๎ปš={ถ.^ผ่„ žยd2ฉgฯž>|ธฎฟ๚C๐๎ป5mฺ4อž=[ฉฉฉNšฒ๐ˆภ์… nจ ๘ป้ง?๕ห[k‰ฟ€ซนc ัw฿ญแร‡ซvํฺฎ฿ตk—y็ย/ ฤ.‡เ#F่บ๋ฎ+0oฺดISงNีนs•••ๅค) ‡ ภภเfLfฃz?^ญ4ดนŸ๘ ภ]๘›ปล_???z๋ญ5j”š6mZเ๚?S๏ผ๓Žพ๒Kย/ภฎL&“z๗๎ญ‘#Gชkืฎ†เUซViส”)Zธpกrr\็ฝ4"0€’"€!๐tD`€ทsง๘k2™ิฟ=๙ไ“๊ะกC๋8 w฿}WŸน’’’œ0!ภ[™อf๕๏฿_#GŽTงN๒]›““ฃ… jส”)Zตj•“&,@I€ภMx "0ภ[นSํฺตซž~๚i๕์ูณภซซŽ=ช๗{OŸ|๒‰œ4!’ฏฏฏจQฃFฉu๋ึ๙ฎอฬฬิœ9s๔ฦoh๛๖ํฮฐD`ลE7@เmˆภoใ.๑ทYณfz๊ฉงtห-ทศวฦ›ัง>๘@3fฬะ้ำง4!น่ึ[oีศ‘#ีคI“|ื^ผxQŸ~๚ฉฆM›ฆ#GŽ8iยผีบ๑6ต9Ž  Hภเโˆฟผเ-!VซVM#GŽิ}๗ง|ืž?^3gฮิป๏พซใว;iB ขป๏พ[ร‡Wํฺต๓]{๚๔iฝ๛๎ปz๗KD`EEFเํˆภO็๊๑722R<๒ˆ{์1EGG็ป๖าฅKš5k–ฆOŸฎ}๛๖9iBŠฎlูฒz๐ม5lุ0UฌX1฿ต๛๗๏ืoผกYณf)=ฝ๔พ๗$( 0ธ(โ/ ๐Tฎ}}}5t่P=๕ิSjะ Aพkณฒฒ๔๗฿kส”)ฺฒe‹“& ไ*Wฎฌว{L>๘ """๒]ปn:Mœ8Q?ณฌึาษ*D`…ED€ซžฆภ๘;gง–พ_:๑ทGz๎น็ินs็|ืYญV-YฒDฏฟบ–/_๎ค้ฐฟ๚๕๋๋‰'žะะกC็บœœ๘ใš8qข6mฺไฤ ‡  0ภเbˆฟ`เ)\56mฺTฯ<๓Œ,ณูœ๏ฺ?๘Cฏฟบๆอ›'‹ลโค pฌถmj๔่ับ๑ฦe4๓\w้า%}๑วz๓อ7u์ุ1'N๘7"0€‚€ภ… D`€ปsล๘ฅ‘#G๊‘GQXXXพk๚๋/M:UŸนRSS4!ฮc0ิปwo=๓ฬ3๊ิฉSพkO:ฅฉSงjฦŒบx๑ข“&@~ภเ"ˆฟP8D`€ปrต๘๋๏๏ฏ{๎นGO?ดjิจ‘๏ฺณgฯ๊ฝ๗ำป๏พซณgฯ:e>J“ŸŸŸnฟv=๕ิSjะ Aพkทlูขื^{M๓ๆอSNŽ๓ป+(ฏ้ ฅŸ็๏mภ€ภ hˆภwใj๑ทGzแ… ผฒ)==]ณfอา”)Stเภงฬ€+‰ŒŒิฃ>ชว\*Tศsีjี๙๓๕๊ซฏj๓ๆอN› ภ0”2โ/ohธฺผ0Y;tทนŸ pฎ๋ืฏฏgŸ}Vท฿~{พฯ๙ตZญZธpก&Nœจ฿แsเ๊jึฌฉ'Ÿ|R๗s๒\—’’ข?Poพ๙ฆbcc2ภฟ€  dˆภW็*๑7<<\=๖˜FŒกฒeหๆปvถmš8qขพ{Y,‡ฮ€ปiืฎž{๎9๕ํWƒ!ฯu‡ึคI“๔ูgŸ)33ำแsๅ7ฏี๚ O/B€RB๛ \•+ฤ_ฃัจ›oพY/ผ๐‚š6mš๏ฺุุXM›6M~๘ก’““6๎๎๒฿ฏฯ=๗œš7ož๏ฺ+V่ๅ—_ึŠ+>ภe`(ฤ_ฐฏ‚"๐ัล๓ด้๕1D`€ำธBmึฌ™ฦŒฃๆ{…Rzzบ>๔Sฝ๚๋:rไˆรๆภำ„††๊‘Gัศ‘#็บŒŒ }๚้งš4i’Ž=๊ะ™ˆภ$08๑ƒ pฅ###5rไH >\aaa๙ฎ]ผxฑ^}๕Už๓ @ ิจQCฃGึ=๗#??ฟ<ื๛ฌjีช•็บŒŒ }๑วš8qขNœ8แYˆภ€๗"€˜ฬF๕zฌฝฺ”Gง~y›๘ ๖B8[iล฿ะะP >\ฃFRdddž๋ฌVซ~๘แฝ๒ส+ฺพ}ป]gนEEE้ษ'Ÿิ#<ขเเเ<ื=zT๏๕ูgŸ)++ห๎sิ์ซฎ5ž x08๑Jเ,ๅชF่–ฑๅไ๘งO?^-[ถฬwฮ;๕ส+ฏh๎นฒZygjำฆ^|๑E๕้ำ'฿u‹/ึ๘๑ใตqใFปฯ@ผˆ๘ ฅ‹ pดาˆฟีซWื /ผ ป๏พ[fณ9ฯu.\ะ๔้ำ5}๚t%&&ฺํ๕@ั˜อf :Tฯ?ผ๊ิฉ“็บ””ฝ๕ึ[zใ7tyปฮ@ผ „๘ ฎ pgว_z๙็Uนrๅ<ืYญVอ›7O&LะŽ;์๒ฺ ไ*Tจ งŸ~Z>๚จ๓\ทs็N?^๓ๆอณ๋๋๏A €k!์อู๑ทUซVš0a‚z๖์™๏บฝ{๗๊ๅ—_ึท฿~ซœพ฿ภตo฿^ใฦำ 7็‹ลขฏพ๚J&LะกC‡์๖ฺGเq2๚๘ๆฺG<์Œ๘ ฎ‰ ฐgฦ฿ฐฐ05JฃFRhhhž๋.]บคw฿}WSฆLัูณผi €ซ๓๑๑ั}๗ง็Ÿ^UชTษsฉSง๔๊ซฏjๆฬ™สสสฒหkฯG;"€k#Jช ๘ปnฮN-ฑSํูณง^~๙eตlู2฿uฟ๚ซฦฏu๋ึ•๘5€sUญZUฯ?ผ๎ฝ๗^๙ุธ5๓e‹-า‹/พจ-[ถุๅu‰ภ€g#€ภ=ลๅฌ๘ญ^xA=๔PพoŸ:uJ๏5sๆLeff–่5@้๊ีซ—^z้%ตjี*ฯ5IIIš2eŠฆM›ฆ”””ฟ&๐\`ฐโ/ธ"0 จœ ƒ† ข—^zIu๊ิษsลbั—_~ฉ &่๐แรล~=เZBCC5bฤ=๑ฤ ฯs๚๕๋5fฬ-_พผฤฏI<Jˆ๘ ๎ษ/,\ญŸ' ๆŒ๘[ณfM?^C‡•ม`ศsฮ;5~xอ›7ฏุฏ\[‹-๔าK/ฉo฿พyฎIOOื;๏ผฃ‰'*!!กDฏG<J€๘ ๎อ/,\m^x]1ํปูO8:šL&{๏ฝ;vฌ*Wฎœ็บิิTฝ๓ฮ;š๚่#egg้5€w่ัฃ‡^yๅตlู2ฯ5ะ˜1c๔w฿๋5ˆภ€{#@!ภ;ภ{9*6jิH๏ ผ๊wฮœ9;vฌ๖๏฿_ค๓๏ฎัฃGkฤˆ ดนๆ๒ีภใวWlll‘_ƒ ธ/0๑ผ ผ#โ๏ๅgŽ;6฿ซ~?ฎ๑ใว๋๓ฯ?WN฿S€ย๋นณ๛฿ช}๛๖yฎูฟฟžy๐รE>ม๘IฅŸ?Wไ๓p,0€๘ ‰ ร๑ท^ฝzzํตื4`ภ€<ืXญV}๕ื;vฌ>\ิฑ$Iมมมz๊ฉง๔ไ“O*88ุๆ‹ลข3f่ฅ—^า™3gŠt~"0เ~ภโ/x7"0x>{ว_ฃัจ๛๎ปO/ฝ๔’bbb๒\w๔่Q;V_~๙ฅฌVš%ืกCฝ๖ฺk๊ิฉSžkv๏ญ็ž{N?s‘ฮM ๒PPcŸZHGฯe๏๘[ฝzuฝ๚๊ซบํถ๒\cตZ๕ีW_i์ุฑ:rไHฑๆศKPPžz๊)=๕ิSy^ œ™™ฉwyGฏผ๒Š }n"0เ>ภ`ƒษlTฏaํิf`#›๛‰ฟเ]ˆภเy์oปํ6ฝ๚๊ซช^ฝzžkŽ?ฎ_|Qณfอโช_เP;vิฤ‰ีกC‡<ืlผYฃGึŠ+ }^"0เภ๐/ฤ_€-D`๐๖ŒฟQQQš0a‚๎ฟ~ฦ<ื}๓อ73fŒ:T์นŠ"$$DO?ดž|๒Iฺ\“ššชื_]“'OVjjjกฮK\๘ ศŸ=ใo๏ฝ5iา$5jd๛๛IŠีธqใ๔ษ'Ÿ('‡๏#€๓uํฺU'NT๋ึญ๓\ณbล =๔ำฺฒeKกฮI\๑PD`p_ๅซEh๐‹%ฟกกกz๙็5rไH๙๙๙ๅน๎วิsฯ=ง}๛๖•hn€’ ื /ผ แร‡หื7wด•ค„„M˜0A๏ฝ๗žฒณณ <'p]`๑P4D`p?๖Šฟmถี๋ฏฟฎŽ;ๆนฆจož8K๏ฝ5qโD5n8ฯ5s็ฮีณฯ>[จGWืDเ๕ˆฟ๐$FฃQ>>>๒๕๕•ŸŸŸๅ๏๏ฏ€€(00PWถ๙๛๛หฯฯO~~~๒๕๕•ฏฏฏ|||d6›e6›e2™d2™d4e0d0$IVซUVซU999สษษ‘ลbQvvถฒฒฒ”ญฬฬLeff*##CJOOWZZฺ•๗๔๔tฅงง+33SูููฒX,ฅO(G๙j<ถปขjๆฟฅ%๏ญฯ7๚๘๘่๑วื‹/พจ๐๐๐<ื-[ถLฯ<๓ŒถnZาฑขB… ?~ผ|๐A™L&›kŽ=ช็ž{N฿|๓M็#ฎ‡ ภซแสL&“ฌะะPEDD(22Reส”น๊#""ฎฐฐ0…„„(88๘J๐gะฝq]มๅxlฑX”••ฅฬฬLฅงง+55U—.]าล‹•œœฌ .(11Q็ฯŸWBBย•็ฯŸWbbข’““u๑โEฅงงsu J\Ÿ=โoญZต4y๒dtำMyฎนt้’&Mšค)Sฆ(-?๗€๋2dˆ^{ํ5Uฏ^ๆ~‹ลข>๘@ใฦSBBBพ็"ฎ… ภkQZ ƒชฒeหชB… ŠŠŠRLLŒbbbฅ *จlูฒŠˆˆPHHศ•˜๋*ทดYญVegg+--M/^Tbbขฏธธ8ลลล)66Vqqq:sๆŒฮ;งคค$ฅฅฅ)'‡฿ำฐฏฟ#๐ลด๏js?J=โ๏ญทช‰'ชjีชyฎูผyณž~๚iญ\นฒค#8U๕๊ี๕ฺkฏiศ!yฎูผyณžz๊)ญZต*฿sืAเ•ˆฟp$ƒม €€EFF***J•+WVีชUUตjUUฉRE111ชPก‚""",ณู\ฺ#{4‹ลขK—.้ย… ŠWllฌŽ?ฎcวŽุ้ฑc:qโ„โโโ” K—.ษjๅK#\OIใoddคฦฏ็?y1;;[๏ฝ๗ž^z้%?nณ8“ษdาร?ฌ—^zIeห–ตน&%%Eฏผ๒ŠฆNชฬฬฬ<ฯ•oc6ผ๒p0ฏSจ๘๛ึZYฒ‰ฟศ_`` ส•+ง*Uชจz๕๊ชUซ–jึฌฉjีช)&&Feห–U`` ŒFciŠ|XญVฅฅฅ)!!Aqqq:v์˜:คƒ๊๐แร:~ธโใใ•’’BFพ Žภ?jำ๋cˆภเ%ฟ:tะ›oพฉึญ[็๙‡าณฯ>ซนs็ฺef€าึผysฝ๚๋๊ฝ{žk~๚้'=๕ิS๚๋ฏฟ๒\CJ€W!ขจ ƒยยยTฑbEีชUKu๋ึUบuUซV-UฉREๅห—W```iiำๅ็์fgg_yฮ๎ๅสศศธj[ffฆฒฒฒ”••ฅ์์lY,–+?ฌV๋•า฿\ ƒŒFฃŒFฃฬfณL&“ฬfณ|||ไใใ#__฿+?r๏ๅu&“)ฯซj\Azzบฮ;ง'N่เมƒฺฟฟ๖๏฿ฏƒ๊ไษ“JLL”ลb)ํ1แ"ˆภP๚Jอfณ†ฎฑcว*,,,ฯื๘๖o๕์ณฯ๊่ัฃ๖ภ%ู๊gŸีำO?-›kŽ;ฆgžyF฿~๛mž็!ฅ‹ ภkQเเ`UฌXQตkืVร† ีฐaCีญ[WUชTQ™2eไใใS*sYญVeff*55U)))JJJา… tแย?^‰‰‰JLLผฒ-99YษษษJIIQjjชRSS•žž~%๘fgg+;;[999สษษน*์ฺ?C๑?๑ๅ์๏๏ฏภภ@)88Xกกก SXX˜"""rWhhจ‚ƒƒๅ๏๏/ŸR{.ฒลbQbbขNœ8กhฯž=ฺณg8 'N(99™+†ฝJOIโoตjี4y๒d <8ฯ๓Ÿ?^ใวื{๏ฝวภ€G๋ัฃ‡ฆL™ขFlฟ—jฑX๔๖ok๘๑JJJฒน† ”0ฏ@ล?FEFFชfอšjุฐกš6mชFฉVญZชPก‚œ2‡ีjUzzบ’““• ๘๘x>}ZงOŸV\\œฮœ9ฃ๘๘x;wN‰‰‰JNNึฅK—”‘‘ก์์lงฬ่J ƒฬfณฏฤโศศH•+WNๅห—WTT”ขขขญ *จ\นrŠŒŒTHHˆำJRVV–ฮž=ซร‡kฯž=ฺฑc‡v๏ญƒ*>>ž7‹ฝœฏ$๑ทš2eŠjืฎ็๙ืฌYฃ'Ÿ|R›6mฒฬฎ,::Zฏพ๚ช๎น็ž|ุฎ3ธซ   +wO๑๕อr%i๛๖ํ9rคVญZ•kp0D๕LชYณฆZถlฉ๖ํซeห–ช]ปถBBB์๖ููู:{๖ฌŽ9ขฝ{๗jฯž=ฺทoŸ:คธธ8ฅคคp%ฏ—3 SฅJ•TซV-5hะ@ 6TบuUตjUEDDุ๕ึโiii:|๘ฐถlูข๕๋ื๋?ะ”’’bทื€ใ&o~Eeงง:y2p_ล‰ฟ!!!z้ฅ—4|๘๐=฿[>oุฐA#GŽิฦ12€ืˆŽŽึคI“t็wๆนๆซฏพาำO?ญธธธ+ˆภ€c€ธ=โฏk TใฦีตkWu๏]-ZดPdddฑฯgฑXt๒ไIm฿พ]6lะฦตgฯ={– b2™TฑbE5mฺTmถUถmีจQ#•+WNƒกุ็ฝx๑ขv๎ฉ+V่ท฿~ำถmx~p)!@แ5vmš2eŠbbblฎทZญ๚๐ร๕ย /่๙๓›ภ›F=๖ุcš0a‚ยยยlฎูฑc‡FŒกUซV]ูV`~๙Iฅ'&8jlภ#€ธ5โฏkชXฑข:t่ nธAื^{ญjิจQ์ฺfgg๋่ัฃฺดi“ึฎ]ซ7j<฿^ฉlูฒjุฐกฺตkง:จy๓ๆЉ‰)vถZญ:qโ„ึฎ]ซฅK—j๕๊ี:rไฆp""0ฌ(๑700PใฦำO<‘็cEฮž=ซ็ž{Nฑ#ว๐Z:uาดiำิขE ›๛“’’4fฬฝ๛๎ปWƒ ๖EเถˆฟฎรววG๕๋ืW๗๎ีฃGตnZล:—ลbััฃG๕วh๕๊ีZฟ~ฝ8ภํœยรรีฐaCu่ะA:uา5ื\ฃจจจbแ””mถMK—.ีฏฟช;v๐์`' @Š๋ิฉฃ้ำงซgฯžyžo๚๕1b„6mฺไจ‘ ฉB… š4i’๎พ๛๎<ื|๑วzๆ™g”๐wุ%๖Cเ–ˆฟฅ/88X-[ถTฯž=u๕ืซQฃF๒๕อลYAฌVซbcc๕วhีชU๚๗฿ตw๏^ฅฆ:€ขŠˆˆPำฆMีฉS'u๎Yอ›7/๖-ื-‹8 ๅห—kแย…ฺฐaทศt "0ไVP]?w—ฟ๗wํ฿ฟฟฆM›ฆ๊ีซ\ห-Ÿœ๏๒-ก_~๙e…††ฺ\ณaร=๘ใฺผyณ$"0`/`n‡๘[zส”)ฃ:จo฿พ๊ึญ›jิจQฌ+ “’’ด}๛vญXฑB+WฎิŽ;tแย๛ xน่่hตlูRบuำตื^ซ ศ฿฿ฟX็:u๊”VญZฅ_~๙E+WฎTllฌง…_X„ฺŒ™ข˜v]l๎?ถtพ6MCเ MF“Fญ1cฦไ๙w๙๓็๕sฯ้ฃ>โ1ฅ s็ฮz๋ญทิคI›๛ใใใ๕๔ำO๋‹/พ”ŽธZ_yŠ € ภญ/**J]บtQฟ~ิฅKลฤฤ๙‹E๕—Vฏ^ญeห–iร† :y๒$oภNd6›UซV-u๊ิIื]wฺตkงส•+๋\ ๚๗฿๕๓ฯ?kูฒe:z๔จ}‡๕bD`(|ชฅ7฿|SC† ษ๓\›7oึ๐แรต~zG €Bˆ‰‰ั”)StmทูoฑX4u๊T7NฉฉฉD` „ภ๑ืybbbิฝ{wxใบ๖ฺkUฎ\น"Ÿใย… ฺผyณ~๕W-_พ\ปw๏ๆYข€ ำ5ื\ฃ๋ฎปNปwW“&MŠuuprrฒึญ[งŸ~๚IK—.ีกC‡0ญw!๐f…ฟํตื;๏ผฃฆM›ๆyฎฯ?\ฃGV||ผฃฦ@˜อf=๑ฤ7nœmฎYดh‘FŒกฟ๚‹ ”€[ :^ttดฎป๎: 0@;wV™2ถ฿tห‹ีjีฑcวดz๕j-^ผXฟปNœ8แ iุ“ษdR:uิฅK๕์ูSํฺต+ึ?.^ผจu๋ึi๙ZผxฑŽ9โ€iฝ€7*_=Bƒ_,8฿š4i’"""lฎKIIัุฑc5}๚tๅไ๐€ซ้ีซ—ฆOŸฎฺตk๐เA >\‹-"ลDเ๒ˆฟŽSฎ\9u๋ึMTืฎ]‹|ฒณณตgฯ๚๋ฏZผxฑ6mฺคไไdM ภY*Tจ :จw๏ฺ๊ตซชWฏ^ไ็}'''๋๗฿ืผy๓ดdษ>R D`ค0๑๗๗/v้ๅ ฏ่๑วฯ๓๏ฅ}๛๖i๘๐แ๚๕ื_9.JจFš>}บ๚๖ํksjjชฦŽซฉSงชZ๏Aบๆ‰๑2๙๚ๅZGl#piฤ_๛ U็ฮu๓อ7๋†nPttt‘ŽOKKำ–-[ดhั"-YฒDปvํRffฆƒฆPฺBBBิชU+๕๎[7pƒ4h “ษTคsœ?^+Vฌะ๗฿ฏeห–้์ูณšึ๓xƒ๒ี#tหุ๋TกFคอ๋็๎าก_๔๖[o๋๚๋ฏฯ๓<๓็ฯืศ‘#y6=€›ะุฑc๕ิSOษl6\๓ษ'Ÿh๔่ั kื €ห"ฺŸŸŸฺดiฃ›oพY}๛๖U5Št|JJŠ6lุ ŸYK—.ี๛นเ…ิฌY3๕๎[ฝ{๗VำฆMๅใใSคsฤลลi๑โลš;wฎVฏ^ญ””M๋9ˆภ}ิฟ5oผHWgggk๓ๆอ๚๎ป๏4|>p’"0ORPบเ€zีฝU>๐Pž็Xฟ~ฝ{์1mบีQcภ‰ส–-ซษ“'๋{๏ตน?##C/ฟฒๆ์>คf#ฦ|€ธโo๑จs็ฮบ๕ึ[ีซW/•/_พะวฆฅฅiร† š7ož-Zคƒ:pRžฮl6ซiำฆ๊ืฏŸ๚๗๏ฏ&Mš้™มษษษZถl™พ๙ๆ๚๋ฏบpแ‚ใ†uCD`ž  ๘ป๙)ืๅ uํา5ฯs|๖ูgz๚้งu๎9G €R`4๕ฤO่ฅ—^R`` อ5_~๙ฅฆ,\ฉ:>I๒@เ2ˆฟEื A 4HƒVร† e0 u\vvถถlูขy๓ๆiม‚ฺปwฏฌV:`_พพพjูฒฅnบ้&๕๋ืOu๋ึ-า๑GŽัผy๓๔อ7฿hห–-<{ธณ‚โ๏้-)z๒ฆ ช^ญ†อiii7nœ|๓MY,GŽ €RิงOฝ๕ึ[ชQร๖ื…6lะsณพWนA๗ภ\๑ท๐ยรรีณgO :Tบuห๓“pfตZตo฿>อŸ?_?๐ƒถmฦ๓68MPP:v์จAƒฉWฏ^ชXฑbกอสสาบu๋๔๕ื_๋งŸ~า้ำง8ฉ{ pGล฿๔Cf={หD๔่Q >\ ,pไ˜p๕๊ีำ;๏ผฃ๎ป๊ิ)๚่+ฉs?"0๐/`ฅŽ๘[0ƒม fอš้ถnำอ7฿œ็'฿l‰ีขE‹4gฮ๛๏JM%(]eห–ี๕ื_ฏ[nนEบuShhhก=}๚ดๆฯŸฏฏพ๚J๋ืฏ๗๊ฒธ“‚โฏBY=1`‚Œฃอ+Wฎิฐaร๔็Ÿ:rLธ˜ะะPMœ8Q<๒ˆอปfdd่ฉOf๋Lฝ6D`เภJ•ัdTฯaํิ๎f๑wใผ=Z๔Ž๗ฦ฿๐๐p๕้ำGwyงบt้"?ฟ_ฤุr้า%ญ\นR฿~๛ญ/^ฌณgฯ:xR(žš5k๊ฦoิเมƒีชUซB?/ุbฑhใฦ๚๒ห/๕ใ?*..ฮม“บ&"0wPPฒิา}]žศ3ฮ˜1Cฯ<๓ ฯ…๐RƒA?ธ^}๕Uพ[ฬห฿/า๎ศ๊2๚๚ๆฺG†7"(5ฤ฿ผ5jิHท฿~ป† R่ซ}ญVซv์ุกนs็๊๛๏ฟืพ}๛<%ุูlVซVญ4dศxใชVญZก=}๚ดๆอ›งYณfiใฦ^๗ฌ`"0WVPญุBƒฏyภfMMMี‹/พจiำฆyŸํศญgฯžz็wTณfM›๛?XฝY+r‚e๔!`ฅ‚๘›[@@€z๔่กป๏พ[7pCกŸํฏŸYณgฯึš5k”‘‘แเIภฑ"""ิฃG~๛ํ๊ึญ›‚‚‚ u\vvถVฏ^ญฯ?\ ,Pbbขƒ'uD`ฎจ ๘ดl๕ฉ?ิf=v์˜qž๗ €ซิญ[W๏ฝ๗žบu๋fsœ‡๔CBถ fŸ\๛ˆภ๐&`NGฝZ•*U4dศqวjาคIกŽษฮฮึ๚๕๋5{๖lอŸ?_ฑฑฑžJG๚๕uห-ท่–[nQƒ }แร‡5{๖l}๕ีWฺปwฏ'tD`ฎค ๘*ฆซฎฏ9ุf]ณf๓Ÿh๗๎Žn(,,L“'OึC=dsขcg5๋Xขฌ&sฎ}D`x 0ง"อ`0จM›6บ็ž{t๓อ7ซlูฒ…:.66V๓ๆอำื_ญ7สbฑ8xRp ๊ฝป๎ผ๓N๕่ัCกกก…:.%%Eฟ๒‹>๙ไญXฑBYYYžดt๙…Eจํ‹o(บmg›๛๚“6Mz ภก Œฟป้๚ƒlฦ฿ฯ?\O>๙คxCy3zโ‰'4aยไฺฟtฒ>๋ŒrŒฆ\๛ˆภ๐`NC•‚‚‚ิปwo๊ึญ›||r฿Šไ฿,‹ึญ[งYณfi๙Šwยคเบjืฎญ!C†่ึ[oUร† uŒีjี† ๔้งŸ๊‡~๐่ฐ@PšŠ3335aยMœ8‘9 ะ  ท฿~[•*Uสตoล™‹๚๘ฏ3ฒุ๘เ!žŽ ภ)ผ=ฦฤฤ่ถnำw฿ญฦ๊˜ณgฯjผyš5k–ึฏ_ฯa๐/AAAบแ†tื]wู้้Gี—_~ฉ/พ๘B๕—ƒง,D`ฅกธ๑7>>^#FŒะ7฿|ใŒ1เaš5kฆ>๘@mฺดษตoล™‹๚ไ`ผฒeศต OFเp7nฌ{๏ฝWทv›ขขข uฬึญ[5kึ,อ;W'Ožt๐„เ7nฌกC‡jศ!ชVญZกŽIJJาผy๓4sๆLญ[ทNVซg}Y์ฉถcฆ8Eqใ๏Ž;๔ศ#hร† ฮชB… š>}บ† ’k฿Š3๕ษกณสถ๑m?žŠ ภกผ1Fu๎Y=๔๚๕๋ง   IMMีขE‹๔้งŸjูฒeสศศpยคเy"##5`ภsฯ=๊ะกƒŒฦทy๚ทฌฌ,๖oš1c†.\่Q8Cqใ๏‚ 4lุ08qยcภร๙๚๚j๘๑=zดLฆซŸป๒ฬE}r๘œฒrr'1"0<€รx[ Pฟ~๔ะCฉK—.นพศฐๅฤ‰๚ๆ›o4kึ,ํฺตห S€w0™Lบ๖ฺku๏ฝ๗ช +ิq›7oึG}ค๏พ๛N‰‰‰žา9ˆภฉ8๑ืjต๊ํท฿ึsฯ=งิT์€}=๐ภš2eJฎ๗ Šภ^~Rฮ;kLภกภย›โoddค† ข|Pอ›7/ิ1›7oึงŸ~ชนs็*>>ม€wซSงŽ๎ธใ :T5jิ(ิ1ิงŸ~ช/พ๘ย#nวOเล‰ฟฉฉฉz๙็๕ึ[oyญ๗เ:ฎป๎:ฝ๛ชUซึU‰ภ๐`v็-๑ทbลŠบ๛๎ปu฿}๗ฉfอšฎฯศศะ’%K4sๆL-]บิฃn1 ๎ 22Rิ๗฿ฏ6mฺศ`0xฬ้ำง๕ๅ—_jๆฬ™ฺฟฟฆt"0{*N=u๊”{์1๘ใNšฌ~๚๚เƒtํตื^ต o@`Wkืฎญ๛๏ฟ_wu—ขฃฃ \Ÿ ๏พ๛NŸ|๒‰6mฺไ„ ๙๑๑๑ั๕ื_ฏ‡zH={๖”ŸŸ_ว$%%iฮœ9๚เƒดu๋V'L้D`๖Pœ๘ปu๋V=๔ะCฺฒe‹ณฦTฆLM›6MwqวU‰ภ๐t`vใ้๑ทI“&z๘แ‡umท)""ขภ๕GŽั็Ÿฎ/พ๘BGŽqย„€ขjีช•xเ <ธPถงฅฅ้วิ{๏ฝงตkืบๅํK‰ภJข8๑๗งŸ~า๓:uสYcW๘๘๘hธqz๖ูge2™ฎl'ร“€ุ…'ว฿VญZ้?๙ คเเเืoถM3gฮิท฿~ซ„„'L(ฉš5k๊ž{๎ั]wฅ*Uชธ>++K .ิป๏พซ฿~๛M99๎๕๗[ก"๐ไ”F๐?ล‰ฟ๏ผ๓Žžyๆฅฆ๒็ Jืƒ>จ)Sฆ(44๔ส6"0<@‰yjํะกƒ{์1 0@๙ฎอษษัชUซ๔แ‡๊งŸ~RZZš“ฆุS๙๒ๅu๛ํท๋Pร† \oฑXดlู2ฝ๖Zผxฑ,‹ฆด"0€ขจP=Rƒวv/tอศศะ‹/พจ)Sฆธๅเ™z๖์ฉ>๘@UซVฝฒ ODP"ž ƒฎฝ๖Z=๘ใ๊ืฏŸ|}}๓]Ÿ™™ฉE‹้๗฿ืฒeห๊@BBB4pเ@=๒ศ#jถm๋ญVซVฌXกท฿~[?ณฒณณ0eษF…๊‘<ฎป*T/\={๖ฌ†ฎoพ๙ฦ™c…าดiSอ˜1Cญ[ทพฒ OCPlž ƒบt้ขแร‡ซo฿พ2›อ๙ฎOMMี? ๗฿_๋ึญsา”g๓๕๕U฿พ}๕่ฃช[ทn2๙ฎทZญZฝzตz๋--Xฐ@YYYNšด๘ˆภ๒Sิ๘ปo฿>=๔ะCZณf3วŠ$&&F๏พ๛ฎ pež„  X<%^ฟ#FŒPŸ>} ฟIIIš={ถ>๐Cm฿พ9CJษdR๗๎5lุ0๕๊ีK>>>s9๔ำO.‚‰ภl)j]ตj•z่!8pภ™cลจษ“'kุฐaWถแ)ภŠฌภ๘๛รn-zwฝหว฿หแท0Wž;wNณfอาŒ3ดo฿>'Mp5ƒA:uาฐaรtใ7สฯฯฏภcVญZฅ้ำงkม‚.}kh"0€*j={ถq%$$8sL DŒFฃFญ &\๙ฐ7ž€  HŒ&ฃzงญฺ jlsฟ;ฤ฿Ž;jไศ‘๊฿ฟWp9sFŸ}๖™fฬ˜กร‡;iB€;hำฆ† ฆAƒ) ฿ต—Ÿาษ“'4!ภ4o\ร† ำญทZ`ถX,Zธpก|๓Mญ\นา9_xคฺพ๘†ข\ks?๐Lว฿ฎบพฦ` F;wN=๖˜พ๖['O 8Nใฦ๕๑วซUซV’ˆภp_`rื๘[ทn] >\wu—‚ƒƒ๓]K๘ุKณfอ๔๘ใkศ!†เฌฌ,๐รš:uช6n่ค ‡ x—ขฤ฿ƒ๊มtษฐ%UฑbE}๐ม๊ทฏ$"0@พ1VฉREร† ำ< ศHo`]v๚๔iอœ9S3fฬะ‰'œ4!ภ4o\ร‡/ิ(าาา4{๖lM:Uปw๏vา„#ก(๑wร† zเดgฯ'O 8OHHˆ|๓M=๐ภ’ค•๑๕ษ!"0@ž-–-[V?ฐ๓Ÿ(&&&฿ตgฯžี'Ÿ|ข๗฿_วŽsา„oิชU+1Bƒ ’ŸŸ_พk“’’๔้งŸ๊ญทา‘#Gœ4aˆภ€g+J]ฐ`~๘aลลล9yJภ๙ฬfณฦง็Ÿ^Fฃ‘ ทB`“;ล฿   }๗9rคjืฎ๏ฺ .่ำO?ีป๏พซC‡9iBค๖ํkิจQ0`€ฬfsพkฯœ9ฃ๗฿_๏ฟพโใใ4aˆภ€g*J9sฆFฅ””'O ”ฎaร†้๕ื_W@@nƒ w‰ฟfณYƒ าSO=ฅkฎน&฿ต)))๚๒ห/๕ึ[oi๏ฝNš€บvํช'žxBฝ{๗–ัhฬwํกC‡4mฺ4}๖ูgฅ]ˆภ€g)l•Uzํตื4~xegg;yJภ5 ๚H=z๔ รe€ธt ำC=ค#FจbลŠ๙ฎฒe‹ฆL™ข๏ฟ^YYYNš€c๏พรฃฌ๒6Ž฿Sา{)๔{AAlฌ‹QEQฅ‰HQภภถ๋ปป6,ซฎD้ฝCBBBHฏS?\ฒฦ™„$L&ษไ๛นฎYยiฯo.™น็9วuยยยt็w๊พ๛๎SBBB…cณฒฒ๔๒ห/k๙๒ๅJJJrS…C ิ/• ทoฎoฟใS€ „††๊น็žำจQฃQ' \] อfณฎป๎:=๒ศ#๊าฅK…c8 gžyFซWฏV^^ž›* ๆ$$$่พ๛๎ำ๘๑ใZแุฃGjูฒezํตื๏ !0P?T6]๛Z7N‡rs…@ใใใฃงžzJ๗฿?!0๊` ซซแ๏ภ5mฺ4 >ผยqiiiz๙็๕๓ฯ๋ิฉSnช๗้ะกƒ|๐A5J>>>Žดi“,X ?ะญG u[eร฿?๘Pw฿}ทาาา\!PFอ˜1Cณgฯึง๓ Qg Teย฿ฯžI6ซ๛ย฿–-[๊แ‡ึ˜1c*|“ป  @oผ๑†–-[ฆ๛๗ปญ>jห€๔่ฃ๊ฒห.“ม`(wœnื‡~จ hำฆMnซจ›*พ๖๊kš™.E xฐฺcbb๔๐ร๋๎ป๏V@@@นใ’““ตt้Rฝ๒หสออญ‘ZhH7nฌ‡~Xใฦ“ŸŸ_นใฌVซ๖ทฟi๙ฺปwoิB ิฌ˜ๆแบe ‰๓wฺ฿+nยฮ4ำmcnื๎ป\€€€-_พ\-ฏบ^ฏ—งo^ง›D —!>พq'Nœะย… ๕๊ซฏฒ3uPllฌ~๘a}๗๒๗๗/w\NNŽžyๆ-[ถL™™™.น6!0P51อรu๗3ืหโ%|ฯFƒด๎ญš?oพ์v^ๆ๕มW\กปž~IJ/v—ุฉO&!F•๕œปร฿ฝ{k๎น6lXนc,‹xใ อŸ?_‡vษu@อน๐ย ๕๘ใkศ!Ž๛๕ื_5{๖l}๒ษ'.น.!0P91อรuฯŠd r3}๗ุ๚ฯK›๔ฬฒg[€๓6hะ ๗*}”ew๏ึGo!F•๕˜;ร฿M™2E“'OVPPPนใ6mฺคว\Ÿ}๖ูy_ธ๎ธใM›6ญย>,‹^uอ›7Oว?๏๋V*~jบ,๙y็}- >Šmก{V(C€๓-ปEะšgพืห/ฝโๆสธJ๏ฝ5ๅๅท๕Yพูil8บO๏฿3Š•F ิS๎ ‡ฎนs็ชgฯžๅŽ9sๆŒ–-[ฆ+V(;;๛ผฏ jG๓ๆอ5sๆLz๋ญ2™LๅŽ;t่žxโ ฝ๕ึ[ฒูฮ๏็ B`ภนธVQบgล ฒ๛—8ํ๏yoมz็ํฟนน2ฎึฉS'M}]งฤฯil:qPบ๋B`T 0Pน+ีŒ34~xy{{—;nอš5š={ถถlูr^ืuวˆ#4gฮuํฺตยq๚ืฟ๔ุci๗๎็u=B` ฌ๘ึับgๅฒ๙9ํ๏WoฮHผก{ PcZตjฅG฿๘‡พWˆำุ;๙ฐ๏ฮ๋qNภ@=ใฎ๐๗๚๋ฏืœ9sิถmrว>|X๓ๆอำoผ!ซีz^ืuOXX˜|๐AMš4IๅŽKMMี“O>ฉ_|Qลลลีพ!0๐ปฦํiย๒๋e๑)tฺ฿>ดท^y๔Ÿ๚฿Ÿปน25ญqใฦšึฟด+าi์›rTw !0*D ิ#๎›6mชว\ทr‹ŒFฃำ1‹EซVญาผy๓t์ุฑj_ ิ}๛๖ีนsuษ%—T8๎๓ฯ?ืฬ™3ตy๓ๆj_‹ ]ำ๑บ๛™๋Tโ]เดฟMP=ะ฿๔7฿นท0nซoฝงMœ†ภiว๕ฮm%Fน€zขฆร_ฃัจ[nนE?ธš6mZ๎ธ-[ถ่ฑวำว\ญ๋€๚ษววGw฿}ทฆM›ฆ˜˜˜rวeffjัขEZพ|น œX็rฮ๘๋Oตqั4B`xœkฒkU์ๅ๏vซ€nzๆีฺฐ~ƒ›+เnแแแš๙๖๛ฺฺุix:IoนZ…™ตP๊:` จ้๐ทUซVš;wฎฎฟz งc๒๓๓ตbล -^ผXƒ@Cีฎ];อ™3Gื^{mน?7Hาw฿}ง้ำง๋งŸ~ชึuัะดฺ๊Tw.ปFEฆ\งอ};k้=ฏ๊ือฟนน2ต%88X3zO;ฃZ8 ƒฯœิcฎV~Fz-T‡บŒจใj25™L;vฌfฯžญ๘๘๘rว๐รš9sฆึฎ][ๅkฯsv็ูณgซYณfๅŽหษษั’%Kดt้RๅๅU=จ%FCัถG [๒Wsœ๖7๑๊ ง๎zI;ถ๏tsej›ฟฟฟฆฟ๙/ํ‹k๋4อLี[cขผำiตP๊*` ซษ๐ทM›6š7ožฎฝ๖ฺrวdff๊ฉงžา๒ๅห•ŸŸ_ๅkฯึธqcอž=[cฦŒ‘ษd*w? iำฆiบuUพ†oX„๚ฮZชุœ๖ฃฎ๑๖5+(2@มพ2š*.(Q™ๅž)p๚s{‡ญu๛ขฟจภ˜ํtฝDS;=9๎9ํปฟฆKPG๙๘๘่ั7กร;9 รณำ๔ๆ˜ฟ(7-ต5Lพ~๒๒๓—มd–ตธH–\ู,–š,ตˆจฃฮ๔}\ีร฿ณw>๘ใŠ‹‹+w_|ก3fh๓ๆอUZ4<ื\sๆฮซvํฺ•;&77WK–,ั’%Kช|70!0๊:o_ณZ๗mฌ๖›)ฑCŒ#e2›d0Hv›]ล%:s2GGถิฮ๏ุ้ถูlvu๊Vท-ก|C–ำuใิZ๓n_ฉร‡Žธ๗ จsผผผ4uีป:ผ›ำ8"']ovตฒSO–ถ…ถhฃธCญ‚šส+(XFฃIึโ"ž9ญฌƒ{•บyฝ’7|ง‚ ยcิ?ภ@TSแoซVญ4|]wuๅŽIOOื๙๓๕๓ฯซธธธJ๋€†+66Vณfอา๘๑ใe6›หทvํZM›6M๋ืฏฏา๚„ภจ‹ Fƒ:_าRะEฑ-#*5วnณ๋ะฏIJฺ’ฉแw๔Wพœ‡ฟฑถ–zbฬr?vย•%จวL&“z๕lำi•wZoŽนZฆpตฝ้NลธD&฿sฎ[xๆดŽ~๑ก๖ใuๅŸJฉ‰าแfภ@c4t้„พบเ๚ฮN๛ซF3FO<๑„ส๗๑วkๆฬ™ฺถm[•๋คซฎบJ๓็ฯWงNฮ?ศ&~6๐ขE‹ดlู2TzmB`ิ%A‘~O_uาฒš+”r<ชค™ๆบ\'“O:ํะpFM~้-ฅu่็4()P–ล&ณ_@•ืฮM>ฎญฯ/ิ๑๏>wEฉจEภ@RแoำฆM5o<5Jƒม้˜SงNi๎นz้ฅ—TRRRญฺฮŠŠŠาฬ™35aยyyy•;๎›oพั#<ข_~๙ฅาkฃ.ˆlชkg\ฌ๘ถQ._;ขจ‰f~Ziงา\พ6ฯ`04้…ีส่<ภi|>l%ลฺ๒"ํ๛็j—ฎ ๗"๊ˆšoบ้&อŸ?_อš5+wฬš5k4cฦ ํุฑฃส5TไŠ+ฎะ“O>ฉฮ|#Igฮœัผy๓๔์ณฯV๚๘ ฿๐H๕น„ต"(2@ฃๆ SBป่ วูํฟม่C˜ฮ„&jึจeส8qžUh๎{๎ueuTฉุnณฉ$/G6‹Ef??™}หkตj๓ฒู:๐ั฿]X-‰จ\6jิHsๆฬัธqใd4ŽIKKำนs๕โ‹/rื/จ1QQQš5k–๎พ๛๎ ๏ไ“O๔่ฃj็ฮ•Z—ตม`4ฺ่ซ๓%ฮท}.)ฒh฿Oวดwร1ฅอ”ฅุ"ฟ_ลตŠTฏห;(ผIPนk๛‡j /)3#ณ†ชเ‰๎Y๑Šฒz ‘ี๎<๎+HMึOก”Ÿื*๏ไ ูJJdTHำ–Šปpˆ_|ฅ|BBๆ•ไๅjํ#w*mหฦ~จ ภ@-su๘{ๅ•WjัขEj฿พ}นc>๔SMŸ>ณ~€Œ1BO>๙ค:t่P๎˜””อž=[ฏพ๚ชlถs์C w๋tq ]๗ุ%rvฒสม_N่ซื6้ฤฎS} ํฅ๋g_ขk๙w๖ๆe๊•{?ิ้Yฎ,€‡ mูN—ฝ๖ก์&ณำ˜โถซuุ๊งมM[ชห+ยK๚าทชo'฿*ka+K†8ฟ5€[ธ2 ีโล‹๕{๏•fdd่มิศ‘# €[ญYณF—\r‰^|๑EYญVงcbcc๕าK/้ญทRำฆMฯนfaFบ6ฬ{H)pฺ฿xศ๊ศ™ฮงt@’d๒2๊‚๋:; 7บG›๑…ำ๐ทะ็ %) ิW}ฏ้่ชr4mฎปญ๐W’Rฝƒ4z๕‡Šiโจศ์#ด๑tไ๓๚";uWำก#\V+‡จ%ฎ /ผ๐B๛฿ึC=$oooงcพ๚k 6Lห–-ซ๔๙zฎ”’’ข &่ฆ›nาส7jิ(}๕ีWบ๎บ๋ฮน&!0ฅYื8ล;9๗๗ะๆ$}ถbŠ -}‡๕ึuณ‡œ3=ซำเ Š(.๘ฃ€F‰Šฟhุ9ว%{้ๆี”[ ๔๋3O(}๛ฏ}อฎธN“้ผk…{ตภUแฏ}๔Q}๖ูg๊ทฏำ1นนนš5k–ฎบ๊*mผ๙ผk8_็?5dศฝ๙ๆ›ฒ—sFQ‹-๔๗ฟ]+WฎTDDD…๋รฺ]ุิแ๎_k‰M฿ฌ๚ลi๘{แฅ}tcๅ‡ฟ^ma~jึ5ฮ%๕๐|๚ w`p™6CqกผŒŽ[%{~'plำๆNื*ฮอึŽU+dท•ต+ผm'…6oใบขแภ€›น*m฿พฝ{๏=-Xฐ@AAANวlุฐA—_~นๆอ›ง‚๖่uวฑcวtmทi์ุฑJJJr:ฦd2iโฤ‰๚โ‹/4hะ  ื#FM2šŒj1ึกศึd‘โะ>`x]7๋be—๚‰า’qซ”›‘๏ะืคณใuภ™่nŽ7†ํ่]™ึ~,o'!p’W n^๕Aน!p๊/๋uz็–2mFณYํปธค^ธ0เFฎ ƒnปํ6็?ัW\แtLqqฑ/^ฌแร‡๋‡œฟ P์vปVฏ^ญ!C†่ร?,w\=๔ษ'ŸhฦŒ๒๑๑)w!0jŠฐBc?ty`ำ ๙&๖vัต3ห}3"5sิฅ'e่ฤž4‡ศฦกฎ(€‡3M nฺยกไฯkต๚ัIา๗k* รc9๔ูmV๚uƒC{pำVฎ)nC ธ‰+ย฿ุุXฝ๒ส+z๕ื็|kธ]ปv้škฎัิฉS•••ๅ’ฺjาฝ{u๕ืkส”):sๆŒำ1š7ož>๘เu่ะกตQ‚|ไๅkvh?uฤ๑๏๋u๗_Va๘;๋ๆฅ*ฬ/”$e$e;Œ๑๑•ัษ›4๐G&๙‡•iณ•+๗ฤQIา›ำส ๚ศง๋ๆœ8โะๆV๑ัLจ{€7pE๘;t่P}๑ล7nœ >|Lฟ฿A๓๚๋ฏ๋’K.ั'Ÿ|โฒฺกคคDO?ด†ฎตkื–;๎ฒห.ำ—_~ฉ1cฦ”;ฆR!๐ฃ„ภจ<ฃษ(ƒ“7MJŠฯ}๔๚… QดCปoF„fŽZRJ’ฅุ๊0ฮh2สแฐa๘ƒษ$ƒษTฆอnตสZR\๚๛ทfL–ํBเXC‰^›<้บœ_z-ณใbQท5์|ร____=๖ุc๚่ฃินณ๓5’’’t๛ํท๋Ž;๎ะษ“']V;€ปmธQW\q…,X ขข"งcโโโดjี*ฝ๔าKŠŽv ฺคJ„ภฃ๒Š‹,ฒY^ ๗w:‹ๆ– }NGhๆจฅ**(๛w: ฤืanIกEv[๙ Iฒ•”ศZTPฆอ่ํ-Ÿเะ2moฯ˜R&Ž5”่™mห]ื'$กอRรญ€tพแo๛๖ํ๕๛๏kฮœ9๒๓๓s:ๆ“O>ัะกC๕ฦoศ็ศ๊ก\MŸ>]#GŽิฎ]ปœŽ1 ?~ผ>s <ุ้B`ธJ~Vก๒ณ ฺ:ฤ”;็llL ัฌ›ร_ฃั ˜Žoฌdฅๅ:œ+ f-*Tฉ”2mฃIแm;9Œ}{ฦฌyS๑ึ ร_I oํx์R~Jา๙ ท#jศ๙†ฟฃGึ—_~ฉห.ปฬinnฎฆM›ฆkฎนFปw๏vYuลgŸ}ฆกC‡j๕๊ีๅ~ะญ[ทnZณfyไyyy9๔รŠ๒Š•ๆไผ฿6}ๅ่]๎ผ๛/šซฃžr%)พmดตŠth?น?Šะ`d์ู๎ะ–pัฅN•๙็ยวต๔"วp๘|BรำซฟC๛™};ซ_$j0Pฮ' ำส•+๕ฦo(>>้อ›7๋ส+ฏิย… U\์ธ?€งHNNึุฑc5~xฅฆฆ:จ… ๊๘‡Zดhแะ_o๚ั้|B`TฦM'ฺยใCิ๒Š?=๏ŒมhP:หd.๛’nณ๋๐ฏษีฎ@รโ์รฮฑฝ.Tlฏ ซต^หฟ$่FeฺŠ23tzืึjญ‡ฺC ธุ๙„ฟ}๛๖ีgŸ}ฆ‰'สhtฯำfณ้…^ะ๐แร๕๗฿ปผv€บศnท๋ีW_ีฅ—^ชฏพ๚ชqW_}ตพ๒K9ากฏ0#]ๆ>HŒjใๆ9~๘rะ-ีดK#'3สwมuิaPs‡๖คฝi:ฑ็TตkะฐœฺบIY‡๖•i3˜L๊r๗ร๒‹*ศgb{]จv7฿ๅะžผ[œๆuJ}C ธPuร_ฃัจ{๏ฝWŸ}๖™๚๖ํ๋tnRR’ฦŒฃ{๎นG้้l žญ[ท๊/๙‹ๆฯŸฏข"ว-u%ฉy๓ๆz๗wต`ม” s q>NŸศาŽo:ด๛๛ฺ่ซu฿ฦ็\รh4จ๕5t|ง?ฺ%k‰๓#bเฯฌ…:๐ั฿ฺรZwP฿™K˜ะคR๋ฤ๖บPฝง-rx=l-,ะ฿qIญp/ƒ$็‡iจ’s†ฟฺฎฯŸ฿เฦฦฦjัขEบ๕ึ[ห]๛฿ทz่!ํฺตหฅ5ิWW^yฅ–,Yข6mฺ”;ๆซฏพาไษ“ตcวŽ2ํพแ‘๊;kiน[b๛ๆSm\8M–<—ึŒ๚/21DใVŒP`ธฟCŸฅฤช_?ฃMkv+๕p†์ถฝิ๖๒1+ฑCŒ๚^ำQํ.l๊tํ›N่ํi&P%f_ z๚ Ev๊๎ะ——’คoฟจฃ_}ฌ’‡~่Fj1โFตนaฌฬ~Žฏs๖ผ๛ชถ<ป F๊Fอ"\ภh4hุ„พ๊_ล๐w๐เมz๚้งีฅKง๓ ตhั"-\ธP……….ฏ >kธฑ-Zคoผฑ1ษษษš:uชyง์'– Q]=ฎhซฟ<4Pฃมiฟฅุช”ƒงu๚D–,EV๙‡๚*ชI˜"โƒห“žงท๙ทRœฎษาxจศŽ4`ั+๒ sฺŸ›|\i[6*๋ศ~Y‹Šไกะ–mูฉGนsNm๙Y?>zทŠsณkฒtิ`เฎผ๔ณRฒํ3ื JlฆNwLVโเแ2+UK~ž๖๐Žvฝ๕ผำ๓‚QฟีPี๐ืd2iาคIš3gŽoฟฐeห=๐ภ๚๛๏kฌnOg0tวw่ษ'ŸTddคำ16›M+Vฌะc=ฆœœ฿_ิV&ดhบJ๒rkฌvิOพ๊~y[uฟฌข›…ซœฯH’,%V฿™ชMkvk็w‡ส|X\ฦ`Plฯj1โล๔์/๏ ็G&ษnW^jฒ’ื}ญƒC™vปทNิ` Šชฦฦฦj๑โล=ztนkฎ^ฝZ>๚จRSSkคf€†ฆWฏ^zๆ™gtม”;ๆoฟีคI“ด}๛vI„ภ8?^>f%ด‹V“.ฑŠiฎภ0อF็+๓TฎN๎Kืัํ):uไŒ์6^†p่X…ท้คเๆญๅ%ฃูK%๙นส;™คฬป•ypwz `  ช0@+VฌPืฎ]ŽฯฬฬิฌYณ๔๓ฯหfใำฎฆy๓ๆiย„ ๅn ””ค‡zH๏พ๛ฎ$B`P•T•๐ื`0hย„ š?พBCCŽ๕ื_5iา$๘ใ5X5ฦŽซ… ***สiฟลbั’%K๔ฤOจ  €ิkภ@%T% ำย… u็w–{งษoผกGy„-ŸคgฯžZฑb…๚๕๋W๎˜ฯ>๛L“&Mา@ฝeฌํ€บฎ*แoทn๔๑วk๘๑Nร฿์์lMš4IcวŽ%pฃ_~๙EW^yฅ^z้%ูํฮ?{๙ๅ—๋฿ทฎธโ fคkร‡”ฒษ๙n-/พBฝ] ฏ€ภš, สธจ@Uย฿QฃFiษ’%jิจ‘ำฑทoื๗฿ฏ๏พ๛ฎ+@E ƒฦฏ (,,ฬ้˜‚‚อ™3GK–,‘WHธ๚ฮZR๎ภวฟLNใN`Pgๅจl๘๋ํๅญว{L?ฐฬfณำฑ๏พ๛ฎz่!%%%ีdษจค๛kลŠ๊ฝ{นcy็=๘เƒส*ฑ€zƒpขฒแoใฤฦZพ|นFŒแt\AAๆฮซล‹หbฑิdษจข˜˜-YฒDฃG.wฬๆอ›5qโDmูwิ ภภŸT6\+VฌPซVญœ๖[ญV-[ถLO._ฉnฯ'u0๐_• zg—ๆฯ{Rw฿}ท ƒรซีชงŸ~ZณgฯV~~~M— jัข…–/_ฎ+ฎธข1Ÿ|๒‰œ๕ธโo›D ๊$`@• |“ฉ•+V๊โ‹/v:&--M?ฐxใš,5ศฯฯO?ธ|๐A™L&งc๖์ูฃ๛™.๋ล%u0ผส„ฟฦ#aZฑ|ฅš5kๆtฬ/ฟข‰'๊็ŸฎษRเ&ทzซ–,Yขจจ(งูููš:gฎ๖5๎L ๊`4h็wจญwอ}bฎŽ๙฿ฆ)Sฆ(55ต&K€›๕้ำGฯ=๗œz๔่แด฿nทkู‹/๋sk"ป๕u:†ธ0,ฃั aw๗Uœ‡ฟ›ื์ำemnะ๘;๏rฺ_TTคนs็jัขEฒX,5Y*jIllฌ–-[ฆ›nบฉ1|๑•^=šฉเ๖w"Fƒtฎ๐wฯื'4vะ]<ุ๙yฟ'NœะคI“๔๛๏ืd™จฬfณฆM›ฆ™3gส้˜อป๗๊ษMไขำ~B`เ.ภhpฮ&oสึƒ}B-šทtฺใ?๊{๏ีถmjฒLิ1ื^{ญ–/_ฎธธ8งวOŸั๔o“ฅQS็„ภภ €ั œ+อ฿oิฃื/TpPฐำUซV้แ‡ึ้ำงkฒLิQบuำ๓ฯ?ฏพ}Ÿ๙›QTขi_oVvHดำ~B`Pำ€ั`œ+๕N ืƒ+“ัไะWXXจว\K–,‘ีjญ้RP‡EEEiูฒe=zดำฬbซ_ทSฉN๛ @M"Fƒpฎ๐7บธน๎๒ ฃC฿‰'t๗๋ƒ>จ้2PO˜อf=๚่ฃš5k–ำs3‹ญZ๔๋Aฑšฮ'5…๏\แo Ÿ.บฑ๗]Nร฿Ÿ~๚I&Lะึญ[kบLิC7pƒžyๆลฦฦ:๔e[๕๔ฮฺ—๏|™ใ฿[>J \Šํ\แoง๐ 4ขรhงแ๏;๏ผฃษ“'+--ญฆห@=ึซW/ฝ๐ย ๊ัฃ‡C_fฑUฯ๎Mัฮ์"งs €ซ9ฆ^€‡8W๘ณั`งแoII‰q~๛ํ„ฟ8งM›6้ชซฎาฟ๕/‡พPo“&ถ‰UงP?งs_ฆ.”W€๓๓‚ชŠ;€แ‘ฮ๖Žขกอฏqำำำ5y๒dฝ๖๎(ฤววGsๆฬัร?,ฃฑ์ฯ™™ลV=ฟ”ถg8หภภU€แqช๎ุฑCw฿}ทึญ[็Ž2เก๎ผ๓N-^ผX!!!eฺ €;รฃT7์ณฯtฯ=๗่่ัฃ๎(nศ!zแ…ิชUซ2ํ„ภ ฆq0>พJs322๔ฦoh้าฅJJJชก hุ€QoT5ปwฏฦฏตkืบณL J๎น็=๕ิS D ๊ถธธ8=๛์ณ๚๋_๊ด์]ฟvปฝ๔Cn–ŸŸฏคค$M:U~๘aM• @ƒEŒzกชแ๏ฺตk5~xํปืeี2bฤฝ๐ย Š‹‹“D ๊ฆฤฤDํoำ…^Xฆ}ใฦZณf6oฌ๔๔ty{{ซYณf2dˆฎพ๚j………9]ฏฐฐPSงNีส•+Q> 0๊ผช†ฟ๏พ๛ฎ๎ป๏>ฅงงปณLเผ๔๊ีKฏพ๚ช:w๎,‰ิ-AAA๚็?ฉK/ฝดดํ่ัฃš5k–๏OลลลN็ตkืN ,ะ•W^)“ษไะoฑXt๗๋…^จฑฺhh€QงU%ตํZถl™fฬ˜กขข"7W œฟฆM›๊ฅ—^าฐaร$U"๎sm\๘(!0จqO=๕”ฆL™Rโ๒ห/3fŒvํฺuฮนz๙ๅ—5jิ(งนนน1b„พ๖[—ึ @CEŒ:ซ*แoQQ‘ฆM›ฆgžyฆ๔œ > ี3ฯ<ฃ1cฦH"ตฏ_ฟ~๚๚๋ฏๅ็็'I:rไˆฎธโŠJ…ฟgEGG๋?๙O้n'ถaร 2D๙๙๙.ฉ€†ฬXฮT%MOOืmทฆงŸ~š๐๕^ffฆ๎ผ๓N-Xฐ@6›Mก&*ZCœŽO4\ฝ](ฏภ 7W Š๛๎ปฏ4•ค™3gV)•คSงNiผyๅ๖๗ํW7tSตkCŒ:วP…๐๗ภบ๎บ๋๔๎ป๏บนJ ๆ”””h๚๔้zเTPP@ jMำฆMu๙ๅ——ุฑcЉ‰QงNชผึš5k๔oฟ•mทษhไ-kฮšขN1 Vษ๐wร† บ๚๊ซ๕w฿นทHภMVฎ\ฉ[oฝUiii„ภ V๔๏฿_AA๛๙ขqใฦZบtฉึฏ_ฏฉSงViญขข"}๒ษ'ๅ๖๗์ูSmฺดฉvญเwภจ3ชฎYณF#GŽิฮ;\%เ^๚ืฟtํตืj„ภภํบu๋ๆ๔ฎภภ@-Zดจส6ฏ[ทฎ>///u๏ฝส5€ฒ€Q'T%}๕ีWu๓อ7๋ไษ“nฎจkืฎีีW_ญ 6ทJLLฌฐ๚๔้UZ๏ะกC***rฺg2™ิถm*ญฃึU6ตฅy๓ๆiย„ สออus•@ํฺตk—FŽฉ?ธ4๎B j–ฟฟ9ว˜อๆJฏ—••ฅ‚‚‚r๛ฃฃฃ+ฝpŽตชฒแoQQฑ&MšคYณfษbฑธนJ n8y๒คnพ๙fฝ๖ฺk ๕6ibkB`PปrsseตZ+=bฑT8eะ UฃY€‹U6อศ8ฃ{๏ฝW๗็ๆ €บ'''Gw฿}ทN:ฅG}T[Gู๋}งด3ห๑NšฤAร%I>ช’w— €˜อf๙๘๘( @ Uhhจ"""๔ฯำ้œ   ตhัB PII‰าำำu์ุ1?~ผJกฆ'๛เƒtูe—ษd29ํๆ›odท+ฝžฏฏo…!o^^^•keฃVT6=z๔˜ฦงoพ๙ฦอu—ลbั๔้ำ•––ฆ คUซV)""Bแแแ Uppฐๅ็็'oooฟo~xื]w้ๅ—_.ืณgOqวบ๔าK•˜˜(ฃั(ƒม ป.ƒม ผผ<ํฝ[|๐|๓M8qขถžb๐๗฿๋?๙†๎ะทiำ&ญ\นฒJ๋ลฦฦ–ปญtnnฎŽ;Vญ:ภรํ*nบMท฿~ปถlูโ€zโ้งŸVZZšVฎ\I hPž}๖YvmUšจว{L๗{ฏำา`0H’ิณgO๕์ูSwu—ฆOŸฎwyวeืKิฝ๗ซ;๏ผSื\sbbb$I๏ฟพ}ฅคคTiฝN:•{7q`` ถmv5ะะรญ*~๛ํwบใŽ;t๘๐a7Wิ/oฟถาำำ๕ส+ฏhb๋F„ภ8ญื_]W\qEi[AAถo฿ฎ#GŽจธธX’4jิจา;‡%ฉqใฦzํตื4dศ;ึํuื‡าดiำ๔ฤO($$D’ชžu๑ล——’’ขอ›7Wk]๐?I•? 8• ฿{๏}M˜0A้้้nฎจฟ๚๔้ฃื_]q-”Kา๑๏>'x„SงN•~U๎ธ๛๏ฟ_C‡ีUW]%I*..ึห/ฟฌ_|Qปw๏–อf“$™L&9Rฏผ๒JiศyVNNŽ๚๕๋ง;wึภ3i8"##ตeหลวว;ํ_ฝzตnฟv7W€็!†[T6}๙ๅW4eสๅ็็ปนB kำฆVญZฅv=z<^XXX้ื={๖ิใ?ฎ .ธภa็Ÿ^z~mZZš๎พ๛nฝ๛ๅฎ;}๚tอŸ?฿ก}็ฮุ๊ฑcฅj;6ํuญื&Mš่ฃ>rหYวcวŽีkฏฝๆดฏธธXC† ั?Xใuเ้€Qใ*i6R .าc=&ซี๊ๆ ฯงW^yE\r)!0 A™4i’žyๆ‡๖’’yyy)77W7xฃ>๔ำ ืiัข…ถlูขภภภ2ํYYYjืฎNžƒั aใ+.ัE‰#4u๊#š1cแ/pž’““5jิ(}๚ฯw5ฑuด:„๘9—8hธz?บP^Anฎ€šฑvํZงํ^^^ฒํš7o9ร_I:z๔จ:ไะฌ&Mšœs7จศศศzJฟo}ฉ#Fิ่unผ๑ฦrร฿'Nh๎น5z}`ิ˜า๐๗ฆ๒ร฿พQรt๗ดt้R7Wxฎฌฌ,7Noฟย9Cเ>ำ๘เ7Wxพขข"Mš4Iš8ušž?๎t;่„‹.•$ผเถƒxฌwyG99•w.++หi๛ฯ.ฯฌYณ”‘‘ก(**ชาืฌMkืฎีŠ+jlG}Tํฺตsฺ7gฮ๏ฏฑkะรๅ*ถ4๖ะ7คoฟึอี ‡อfำ์ูณ•™™ฉG็ฮืห‡Unl0ดแษฉ„ภcตZ๕ๅ—_ViŽลbqฺpฮน)))zไ‘Gd0ไํํ]ฅ๋ึ–ขขข[๛ชซฎาฤ‰๖-^ผXO>๙d]€†Š.U™๐ทQA[]7ๆ:mผูอี ำำO?ญฬฬL=ฑ๔ญ–๓8~เ0๕3๕ำผ‡ๅิฉS:x๐ Kึ๒๑๑ฉ๔Xป^ฃมj}ะขE -[ถฬi๔ำOkฺดiฒํตPž3€แ2ฃA—ีทย๐7๐TผฎฝๆZย_ภอVญZฅ๛วฆ›"อๅž wแ%๊?k)gกŸ๚฿ุูiŸ„Kd?ฌ๋ฏป^{๗๎usu$้ƒ>ะ]ฃoา_Kส c๛ั€วŸ!xŒ‚‚ูl6—ฌe4๒vje˜อf-]บTร‡/ำnท๕ไ“Oj๊ิฉ„ฟิ ~bมy3 บบเ๚NN๛๛$\ข์฿คQ7า‰'\€?๚๚๋ฏ5๎ฦ๋uฉ1ป8บ๏ zb!0จ–9sๆ่ฮ;๏,ำfตZ5sๆLอœ9ำe<pŽ็ล`4่ส๛จ๏ตœ๖๗IธDIkstmท๋๔้ำnฎ€3?ณnฟ ,J-7Ž่=PCๆ?G ชdส”)š6mZ™ถขข"Mž๙$gเภจ6ƒั ซค#9ํ๏“p‰všฌป๎บe็ฌp;w๊ถ๋FชGฦกrCเะ5tแ‹„ภ RฦŒฃ ศ`0”ถegg๋ฮ;๏ิส•+kฑ2`T‹มhะศ‡จ๛_Z;ํ๏‰6พปW“˜ฌโโb7W 2>ฌฑ7\ซv'v”wํซแ‹_!บ๒ส+ตbล y{{—ถฅคค่ๆ›oึ[oฝU‹•ะ๐˜kปิ?ฃAืMฆN—5uฺ฿;nˆพymณ.X่ยTYJJŠ๎uƒ–ฟ๚บิบvf8Œ ่ิKW,{]ŸMงโ์Zจ€๚ๅโ‹/ฎํ*อnท+00Pqตื่฿ฟฟ^~๙e—ถํทOcวŽีบu๋*ตฦศ‘#%I๏ฟ~ต๋ฟ#F•Œ4rตšเดฟgฃม๚xลZ=ป๒Y7W บฮœ9ฃ ทŽึ’^R‡n; }wืUฯฌาวN @†ชUซV)>>พถKฉปฎคค$%%%้ื_ญ๒:่๕ื_WฃFJ6mฺคnปMปvํชิ+Wฎิฤ‰%ฉฬ๖ั zุ•f04zึUๅ†ฟ=b.า-๘œ๐จ‡๒๒๒4้Žฑ๒_๗iนA{ตํชซWพ)๏ภ`ง@=ztฝ ฅ฿ื„„;ถสsตjี*ตnฟcโ~๚้'xใ•%ฉ]ปvฅ_O:ตสu€ฒ€Q)ฃAทอ๙ซZ_ศiืจzc๖‡Zฝjต{ เ2ลลลšz๏าYnllีIื<!0ๅ(..ฎํช%;ปj;|„……้ีW_Uฏ^ฝJึฎ]ซoผQ‡ช๔:jีชU้๏๗๎[ฅ:€#ถ€ฦ9Œ›wญš๔wฺ฿9ฝศป๚๘ใO\WณZญz์ม4m^ฺธEปฒ ฦุ›ทื๕/ฝซu#A๐'?ธ 5pเ@…‡;?ญฎYทnVฎ\Y้๑พพพz๙็5lุฐาถฏฟZcฦŒQRRR•ฎฌYณาํฃ-‹svmJMMญ๒ต{๕๊%ฃ๑๗*OŸ>]ๅ8"Fน Fƒ๎Y|ณb{8ํoุSK'พฆu?ฎsseแ้ystwAฺzฟv็9๔'ถาอฏฟงwฦ^C ภŸX,Y,–ฺ.รๅ{์1{๏ฝฅฟไ“O4v์Xฅงงห`0”;ฯnท—~m0ไํํญภภ@ >\&“I’t๘qeeeี\๑4ภpส`4่พฅท*ชปฏำV~ต๐ฎต๙—อnฎ €;ฝธ๔)VXจถw>ฌ=นŽgฤ5ื-ซ?ิ[ท]M €‡ป๏พ๛4kึฌา฿gdd(&&F}๔ั9็๓ฯŠŠŠRddค"""ชะะPEDD”Ž9pเ€l6[ิ@CB ฃA3—่@ก๓3๚ย3Sด๚–ส?sบด-(ฑ™โ๚ RTท> Nl&ฏ `Œ&Y Tp:M™๛w)๕ืŸ”บ๙'ggบ้™๊ซgŸ}V๗{oต็็ไไจmถJOOื๖ํีบu๋jฏ๕ีW_i่ะกีž_ืฝ๚๋บ๖k:jืฎN:Uใืภำqฐ๑ ๒Q๗หจ๛ๅmี$LๅํjำCme)ถ๊่ถ“ฺ๘ั.ํYwTำ^บGพญฯ๒’ค˜’–š>๚)ฅฆคึ`๕๊‹|๘ž,–]0๛,rLqFhฌฦพ๓‰V฿r•ผ"ขีๆ†ฑJ0Lfง๋4JPdวnj๙ื›•w๒„๛=ํmUp1p /ผะ-ืIJJRF๖เ ์!ฺ^ะDC๎่ฅุUšgทK๖|ฃŒฮ?นYุLณF/QzZบ+สเA๚ปLอ{V‡Š๗ๅ)ำj——`•ืฮ:ผ_[_Xคไ๕฿žg•Oตgฯ•””จธธXลลลฅ_ฉธธX&“I๒๑๑‘ทททผผผJํะกC™ตvํฺU:kž}x{{;}xyyฉ]ปrฮS๓ {๗๎ญ๑kดiำฆฦฏ@CA\ฯ า…7uีลc{ส์erฺ้แ๙M4๓ๆล:“qฦฅ๋๐}.พD/xQ‡Kสู‚่*b0d4e0dฑXส๔™อfูํ๖า๕ฮตฮู‡ัhTI‰๓]๕<‰ททw_ฃธธœO”€*#ฎ็้ฎ‹o๏U๎vฯีš› ฃ+;+ต ๐8=ึะง^ึ‹ัๅk,m^6[ืผ๋๒ต๐Dภ๕X—กญ4rฺ MŽoฒXJฌ:ด9I6Wฺ๑,Y‹ญ ๓S\๋Hต๊“XแVั91šuำ2ๅๆไึd๙พ็]+žŒธjี;Aแeฺ ฒ‹๔๕k›d-ฑ9Œ7™Lzโํe‹ฯrบž97ภกญeฯ…Dบฆ`/แขKe0V|๏YIพก๓ึEล':ํ?๒ล:๏๗ฺC›ทVD๛.็U'žŽธjัร๑“๒;ืRฺฑL‡๖า๐7ฮy๘๋}*BO๚ฒ2Sสnฑๆ่ญ๘ถQ.ฉ€g3MŠ๎ึืก=๗๐>ลฉศ้œ$Ÿ๚ๆGๅ†ภ๛๕ฆl%ลบAั๚œwฝx2เzฦh4(ฆyธC๛žuGŽ๛๖Cๅ†ฟ^ฉแšy๓bๅœฮีแ-'๚c[Dœม<žoX„ใƒC๙X{ณโํ‡ภแฑ๚2๎ั™ปฺCšท9‚๐`ภ๕Œ—Ÿ—รสด•Yt๊ศ‡ฑใฝYึธL็๋ค†iึอ‹UR\"I:u8รaLpคใึะ๐g>กแ2๛๛;ดŸูปCทฆ๎ฅธ Bเๆ?ํะnทู”s์Cป_D๔๙ €#ฎgLfฃLๆฒ็jYKl*.(q๛ส“oหฯ์xŽฏ9%Lณn^ข’Ki[a^ฑร8/_ณ *เ้L>>2๔๒าnWq๎๏GอฺถE–‡˜ zaNื=;฿แZF^สP^5ื36‹MV‹ตL›ษl”—๓ฐ๖กKห„ภๆ”0=6บl๘+I>~^s-ล‡6๘3kqฑ์v[ูFƒA^{-rh}pฯ(ลู KBLฝิฏyน๋z๙;๎J๔๛ต์็_4Šธž).ด(/ณฐL›—ฏYัMBหs66œqJRTำ0‡ถ์ด๓ฎ€็+สฬฅ ภก=ฌUป2ฟ?ผ}‹>ธ็fล[๓ฯŒF5v์/ฬH“€(p=cณฺ”๊ไผ64ฉpC—jๆอO9 }ผีฌk#‡๖ิCงซ_(€ฃ๐Lบ๒RN8ดว๕,ƒฑ์6‡ทoัณร{WJRp“ kูึก=๋ะพ๓+G\ฺœไะึaP …วWkฝฮ—ดTx|H™ถขผbุ“Vญ๕4,vซUi[6:ดGv๎ฉุ:ด9น[๘ฯZŽ-“ฏŸC๛)'ืC\ํ฿xa่€P_ พฝ‡ŒFC•ึŠiฎAทvwh?๔kฒ2SrฮซN ว๑๏ฟV๖`ƒัจฮใ”oxT•ึJ|™Z\uฃC{๖‘:ฝใท๓ชOG\eงๅi๛7ฺปkญKฦ๗–ษซr฿ึˆ„]ศE Ž (ำnทู๕หวป\R+€†!m๋&ฅmไะึบƒ๚ฬxJัŽวฮ8wม`๕|๐ อf‡พCŸK–ย๓ฎOF\O๔ฯํสIฯshpSW0{จตŒ(wฎัdT‡‹šk๔ยห”ะ.ฺกวw‡ดใq—ึ ภณูญVํ๙หฒ[ญ}๚ ิ ง฿P“ก#d๒๖q:฿/"ZวNาOฌOhธCๆ:๔๑นผn<A’ฝถ‹@๕๔ธฒญ๒เ@œl๛\\Pขฝ?ำŸ้๔‰,YJl ๑U\๋Hต๎ืD‰bdpฒ[tFR–x่3e$gปแ๐4=&ฯVซkn-ท?๓เฅฒ^ูGศZ\,฿๐H…ท้จ่๎}ส*ฺZTจงOะษŸืึTูx เzn่๘>xsื วุํฟณ ๘๒ณ ๕9_้เๆ$ื A๑ Tฟว—+ฎ฿ —ฌgทู๔ส๙ฺ๗ฯี.YOวะ๕Wฏnิwo*›ญ฿`ะ9ร฿์ด<ฝ7ย_็ฅ$/WŸœชคฟ:๏ตl‹ถพ๘แ/Uภภขำ–บd\O…ว‡Ty๎ว๕ล‹?+ๅเ้จ @Cd๒๕Sว&ช๕uทษไใ[ๅ๙y'k๋ ‹u์›Ok :<ฐ ๗W๏ซซฅญTแX›อฎคงด๑ฃ]ฺอYKlnช@Cีนงฺt‡โ๚^$ฃ—๗9วž9ญฃ_|จฝXฅS'P!ž…ุ๙๙จiืFjฺ%N1อย๊'ƒษ โ‚eฅๆ*y_บoIV๒tูฌฟj^X๋๖Š๋?Dั]{+0พ‰ผƒd0e-.RaFบฒํU๊/๋urใZคฅึvนิ[ภ €ัh ูm6ู๙nจe&_?y๙๙ห`4ษZ\ค’\ูญึฺ. @ ยX\ƒ<0x`๐ภเ!€ภC€‡ A ‚<0x`๐ภเ!€ภC€‡ A ‚<0x`๐ภเ!€ภC€‡ A ‚<0x`๐ภ A้าฅ‹บu๋Ve@  ยภu๘๐a๒ห/z๑ล]%€หf6›5~xฝ๛jฺดฉฬfณz๖์ฉธธธฺ. \ฮ\ิ 2D๗฿ฟ.ฝ๔าฺ.‚ิkfณY&“IŠŠŠR›6m4`ภ 6L;w–ม`จํภm€@ฝถeห๙๚๚*((H!!!๒๑๑ฉํ’ ึ€zฉu๋ึฺพ}ปผฝฝkปจ3Œต]€+ูํvhใฦz๛ํทkปp+๎๕าพ}๛ไใใฃ/ฟฒดmํฺตฺฝ{ทถmฆC‡้ชซฎา่ัฃkฑJp/`Pฏ 6ฌถK€:ƒ- ภC€‡ A ‚<„นถ ภำ™L&๙๘๘ศฯฯOAAA:rไHนc&Y,ๅไไ(;;[6›อ}๊-`\ไ๖oWDD„"##ฉˆˆ…‡‡+,,Lมมม ’ŸŸŸหฬ ีีW_ญ#FจkืฎŠŒŒ”———ฌVซrssu์ุ1ญ_ฟ^|๐~๘แย`@น€pื^{McวŽญิุ[oฝUoพ๙ฆ$้ๆ›oึŒ3ิถm[ ‡ฑЉ‰Qฏ^ฝ4qโD}๚้งš>}บv๎้า๚ž€Z`6›ต`มM™2EFฃฑด=''G้้้ฒX,’คVญZ•๖™L&1B:tะ๊ีซ5o<ทื จŒ็ฮeธq•k0ดx๑b=๔ะC2ฒํZทnnฝ๕Vu่ะA:tPวŽ5|๘p-[ถฬa~‹-4v์XEFFบ๒)<wเ"ƒ *zศ!บ๓ฮ;๋0n๐เมบ๕ึ[%I‹Es็ฮีโล‹UPPPfกC‡๔ะC)""BcฦŒ)ำืฌY35J+VฌจTmqqq’$ป^•งT+bccตeห–zQ+ิ5Iผป @ Xดh‘ฆN๊ะž••ฅูํvMž}Zฉฉฉต]ธ05$!!มiปŸŸŸฬๆสŸย`0ิจQ#ง}%%%ีชญ!0 ๊าฅ‹ำพจจ( 2ฤอ@อ3Hฒืvx‚|PfณYŠีเมƒีฒeK‡q๚์ณฯt๐เAeeeฉธธXK–,qXห[มมมjฺดฉฎป๎:™L&‡ต๖๎ซu๋ึ)))IyyyฒX,Zบti=วบ่ม”$mุฐAMš4QำฆMีฌY3ตmV}๚๔‘———ำyููู๚๙็Ÿ๕ล_8ํohŽ<0.๐ฺkฏi์ุฑีžๆฬตiำFนนนฺฝ{ทš4iRํต>๔S]yๅ•ีž_Ÿ|๚้งบ๒หkdํ•+W๊๛๏ฏ‘ต ฆฐ4x๎ภEŠ‹‹eณูdตZK‹ฅ๔a4e6›K&“I&“IFฃQ>>>eึ***ชp-ณู,///™L&‡ตผฝฝk้O v*??_ูููสฬฬTFF†ฺดi#Iฒํฒํฅ_KฟŸ |๖ืณ_F‡GXXX-<8?ๆฺ.Oันsg•””ศbฑ”jฑXJร[ฃัXุž pฯ๚g:urX็์รfณ•พ^วlnxดw่ะAูููสหหSQQ‘ฌVซ‚‚‚$ษ!=๋!ฐ๔{l0Jร฿ณํP฿p0xฮA ‚<0x`๐ภเ!€ภC€‡ A ‚<0x`๐ภเ!€ภC€‡ A ‚<0x`๐ภเ!€ภC€‡ A ‚<0xsm๊oฃQf“LƒŠl6ๅ[ฌฒูํต]เ€@นฺ…๋๒ฤFฅVม ๕๑–ษ`Pลช”‚mหศาืษฉ๚:๙”า ‹jป\h๐ ’ธu”ั-"LS:ถึˆ&q 0Ÿ๛๓bว๓๒๕ฦ#za๗AฅบกB€3ภ ”ทัจ‡;ทัƒฺ(ุหซส๓wgf๋ัM๔้๑“5Pเ\€€$)ฤKฯ]ะ]76o|^๋Xญšบqซ^ุ}ะE•*‹ศฯdาชฝumณ—ฌWbณiโ๚_๕ฺพร.YP9็>ิxผ™ฺ—ฺ์vญ?uZ_žHัžฌZญŠ๑๓U๗ˆ0 Qหเ@‡9^Fฃž๊E๛ฒs๕CJZM—๘/๎ ฅฯ. _“ษกocZ†ž๘mง“”*ซ๑G†o/iีT3บถW„ทC†Sงu้็k•gฑิHํ€ฒŒต]จ=Ivjใ4}๗ะ1]๙ๅ๚DŠำ๐W’ฒŠKดb็~jŽๆๆ;๔๗Žะ่–M\]6 ภ4`=ฃย5,>ฦกป“งtฯบ_•QT\ฉuึฅฆ๋ฎuฟ8ฝำw\๋f๒6๒#ธ๏ฦะ€h'ฏ?…ณEV›๛uงฒKJชดึWIฉZน๓€C{ืˆPu ;ฏ:•C @e4จQดC๛’Rด>5กd6ช๙Eฝี|@/œl-Iฏ๎=คฬโฒมฑั`ะ…1‘.ฉP1smjG˜ทZ:ดzd้ื&ณQฑ-#ิๆ‚&jำฏ‰rฮT‰ิrฯN%ญF'ืซ3vหnตJ’ŽไๆiSZ††i[้Ža!5๛dT[€ูฌมj o e๋hnžf็:|ศ5ฯd6+ถC ลulฆุPฝL*ส)T๚‘T%๏8จ3GOž{ธ\คฏš(ฮ฿Of“ ญ6ฬ/ะ‘<ฅไส^๐_ภ4Pแ> ๑๒*ำf—ด#;G๑mฃJC฿ุแ2š~฿4dง!๘๗นํ:+ผ]gu3Q™๛w• ƒ๗de;ภฑ~พnyN*ฏwTธFทlขKbี$ @fฃกLฟอnืษ‚B˜’ฎwำ'RTlณีRต Cl‡๊๛Pต่ฌ฿|๕ว๐=PRค,๖สฬ๒ี๎๕'ด~๕ฟ•›šQ[ๅ6fณF4‰ำ๕อี':BQพ>๚ใ)vIYล%ฺ–‘ฉ5G“๕ฯรว•”_P[ๅ ้๗๙` P๛ะ`z๕0™ูŒRjธY๛โฝ๔IPB›†–†พg%‡๋Œกsนู๋,e๎฿ฅถGv่พ’ำjœqRฆพ9๔CJš๖]M>•ิ*8Pำปถื๕อๅcช q?คคi–๚:9ตซk˜#Buๅฬ›ิถ›ผ • J‚ต๑‹๚z้ปฒx›ืีฎm– G;ทSืˆะJฯIฮ/ะsปhๅฎสทXkฎ8*@ @ี2,H_ŒฝLวš๘๊@‚—N…›e3”?~Ÿ้n•(ธRk›lV5ฮ8ฉnว๗จ๑ฺฟ}‹.๗wฎ)@ต]ื,QO๕๎ฌฤjอ/ดZต`๋n-ุบG6;o+บBซA=๔—ฉ—($ ณฺk;ค›ฒZูฉ้ฎ+ฌ ๑๖า‚žuG›f2*xก\ฏ“Su฿Oฟi_VŽ‹ซเ€h@Lfฃb[~ฆo๛MิจEคl•ภฒ๑2eฺศ&๏ช]ำfU@๒Qญ๒c%ฏ๛ฆฬ™มgBปZาปk•๎๚-ฯŠ๛๕๐ฦญฒŸ—NจฟL๊%S๎yฏ•žช7๎]ฅฬง\PYร้๋ฃU{้ฒ„F็ฝึฎฬlmฯศrAeT0๎กo›~2ยa{็s)ส+ึัฉ:ธฃHyฆf ๋tก";๕ูฏjw ุ,eุญไ๕฿nt}ณDญุปย๐7฿bUFQฑค฿๏€ ๒2Wธๆฟํิฟํri Iำพu๓ก๒5—ฺeR‰อGvปQ&ฃEfC‘*z;7%-D/฿ฒ\%E5Pฑ็๓1๕ึE}4ฒiBนcJl6*,Rn‰Ef“ข|}ไk2•;~ห้L]ี:‘วนภ๗!ภMF5j้šะwฯGt`ำq9Yvชภ„&jิ{ โ\ขศŽ ƒ€:ชuHพ~‘œ๖w๒”ุD?ฆฆ+ญฐHvป๎ใญ.กบฎY‚ฎišเ4เ*ถูt7?้“cษ5<Ž—Ÿ๎y๗E†f:ํฯ+ึฎŸOk'ฟ่ิพ#ฒ[ไจฤnmิ๙ฒฎjฮ,ocพำน6๕ฯ)/ิ`๕žkFืvšำฝฃำพyz}฿a}t4I‡rrUhตษhTB€Ÿ5ŠึmญšชWTธำนw่ธn๙gถMธ 0ยกฏO‰] ฉy๏ฮิดwึjแส˜ะD—]6B/นBฃ›จะซjD5็๕ฝtkซฆํง‹Š5ใ—ํzc•ุlๅฮิ(Zฯ๔ํชŽa!}[Ngj๐g฿*งฤโส’=๐iทจpวัฺeิž&ญyโoสMอ(w~|—6๚หฌฟจQ”ใึยVปy|๖ทูฅ5{บ๖aม๚๒ม ๓q|=๛ฮมฃzl๓อuบK’ฟูคษ[kfื๖๒2–}-n—tหw?๋Cว\]6NPMFลถŒP›~ีๆ‚&jTะืXhUณt›Z/Vณไ…ไฦฯ็'Rtฯ๚อ:Vม ณฎHlคW๔R”ฏRƒ#ด-พต67nฏ„ม@ญ๊ฆตW–฿Ÿ๎เ=]Tฌ›ฟ ฏ’R+ตNหเ@฿ลิ%<ิก๏ž๕›๕๒žCฎ(ทA๐ าบ[ู๊1่็o‹๔ษใซ*ตŽO ฟฦผ|ใs๚Žิซฃ—บ ฺ†ceฟ๎šะฎ…C๛sป่ก[+ฤMhืBห๛v“ั`(ำพ)-Cƒ>๛VEึสญภ๙  ž๙s่"B&sีB฿ยผbžข?‘ม\}ิฃงำ๓ฝ๖fๅ่ษ-ป๕มัสท8†ฐ ~บณM M๎ุZfว-แ>(ดkV‘ฟb/ย6ั@-Xิซณ์ิฦกฎัk๛Wiญ~ั๚๔า ๖๒*ำพ>5]ƒ?๛NVถทญ”~cฏิๅcโฺ๒ืชŸฎาZมขt๗๊ไ[๖N`‹W/NXฃิU๛7T1~พฺ|๕Pล๚๙–i_›’ฆซพQy–ชแL฿nšุพe™6ปคหพX[้]p>฿้uŽซC฿›N(3ๅŸ_ไ y=:9ฬiค7.๊ญGฮดี7'OiOfถŠl6ล๘๙จ[D˜ฤF)ฺืว้๕R ๕ไ—?jฯ้3ฺ๓›ี:3ุh6+ผm'…ทํค๖ท๛ฟ0xท:ณa0PoฃQรbฺืฅฆ๋อGซผOงN๋•=‡ๅ๎‘ajจ=YŽwขยQ๛Aญ%ๅ•iณุ}๕ลฒซผV๖ษ4ญ๛ื^ ]๖๛l6ชร๐ภ•taLคC๘k—ดhž*‡ฟ’ดxlฏ8ปmtyB#`€[p0uTM‡พd6๔lฟ๎บฃMsW”ฎ<‹Eใ~ุค>แด?0ก‰๕นH๑ีผ3ุnต๊ฬ]„ม@Z‡้ทซ‡ษ็OวฤปWฝด็`™6ฃั žท฿ „ƒtl๛ฉrื ๗๕ึ5Md๚ำ๖ถ_%ฅ๊@vฎ์5๑VcMY์ย5 ฃŒFƒŒFฃL&“L&ณฬf“ฬ&ณฬ^f™อf™Mf™ฬ&™อ&5oท[พ†๔2kd[(?ญŒฃ Fƒ ƒ 2ศ`wศจb๙ๅห\\(ป์ฒ%ปอ&›.›&{œU&Ca™5 ”ฝ;M‹ลแaตZKตูl}œ็Ÿษy™žื•ฯcฒฟ5nญ๎‘ae๚า ‹๔ฮฃๅู๎ืๅ๛๑{๚ฮGNŸปณ-ฅ7œ:ญŸ|ร๒€G @R๚๖mฌ6k6๔3_“I‹{wqzๆQUd๋Ÿ~ำป‡ŽUjผ๋ยเo•ผย`เฟ.Mˆีงร”i+ถูิ๓รhWๆ๏็ฯต๊Xฎํ$sฏ”khVฅ6&จ•๕U™TPฆ=ษx…2 œฮ้`}สฅก ’—๊Œก‹dท)๙ง๏ต๏Ÿซ•๒หบ2A๐๕อ๕ทม}หฬ;‘W Ž๏ฎ’ช฿U @Uฐ4ตฌL่{Aลถฌ^่{t[Š๖xD~ฉ|่[f ซU๗๔ซvœษาฬฎํีศ฿๗“dรฉำšบi›ึงฆŸ{๐ๅž8ช'ิณDW1 6˜LฅDws/a0๐_>mYล%:YPX&๘m=^ƒT๕MกQUFห ‡๖b…บฟT[–ก๏_ŒŠป`ฐ๕จ“พืพพQฯหw˜่e–ฟษD จqภิฃษจุแjำฏIญ†พf—๔าžƒ๚ORŠ&ถoฅš'*ฦฏโ ุ.i็™,ฝบ๗V๏?r^/d…ม .QD‡nี ƒ์V๒บo”ผeุ-[5ฮn๊+ใŸถi–$ซ์jึ'Aฏn_ย} }™i+๊ขdใฅฒฉ์‡+ F“โ.ธX๚^TŽํ‘]Ž฿oั€- p—‡พ›N(3๕C฿Š4๒๗ีธ ŒRปะ`E๘xหl4*฿bั๑ผ|v:S฿<ฅŸROซ ฆ๎ด5฿Dฑ}V) #ปีJ €็ŠฤF๚h่…’$ปA:๏ฅŸ๙่X#oง)ไQใul]รฬสWK๋ซ2ฉ์yฝวQถกำ9l]ท4ฎBCT…c์6ซl[ึŒิ]๊|P†พ2ฟP๛\ู%ŽwเJภิ ๚๚–ว ษหh”ั`P‰อ&ซฝ~„ *ญCXˆ6]}‰Ž%๚hS{_iไUแ๘ Cweซน๒2‹t&%GEyลcอ&๕Š(swฑAฟ๏ ”œ_เ0พช์vป ƒผผผไ๋๋+???( @๒๕๕•ทททŒฦsฟฎrๅ–U_ษ.ป๗็cณูdทeทdตYeห{]๖ฒวๆไบI†’๛X้๗ฏ%๙พ”ษ^$?ปE~vซ$ƒ †฿Ÿ฿ูGบ=]•ญูฌDฟXŒ FŒ ฦ๕mจๆ๓ช€ซผํ’อfUQQ‘ ”››ง\ๅๆๅ*?/O………*)ฑจฒokWๆฅk็๐P5 *๛ฺ๒LQ‰~LM๛}ื๐‹–=๑ูczJฆŠwฬ2ฺm๊rbฏ.นN’๊ท๔ ๕๘kูjใ๕4 A!ภลฮ†พญ๛5V šžW่ป๛วร:ธ)ฉึB฿:0(—ัhPว šjโ•šXqH%Iึ›vฏ;ข ฺฎฃSส7ฝK;=ัฃc™6‹อฎ>kพาึŒฬ*ืฌฤฤDตnZ:tP๛๖ํีบuk5nXแแแ2™LU^ำU์vปJJJTXXจ\ๅไไ(++K™™™:sๆŒฮœ9ฃฬฬLeff*++KูููสษษQNNŽ๒๓๓•ŸŸฏ‚‚ฉจจH%%%ฒX,ฺลวf—นV‘5@ฯw9zฒสuvปvˆz_kd+ำ๓ืล๚a๙๛๒๒๒’ททท|||ไ็็Wช*((Hมมม QHHˆยยยZ๚kHHˆ‚ƒƒ(yyyU*|ฏ)%%%JOOืัฃGตw๏^ํนSปvํา๛•””คผผผjญ{Kห&Z5ฐwูkูlบ๘ณ๏๔ำฉำN็„ถhซVืข&—\%ณ@…๋Ÿ ‚ญ_Kำ฿xฃrฉ4็๘c่ฆ_5jY๕ะ7ทXGทิ๎uG}ซ๊ฟapฃพแ%Šุ่Mf_ย`4yซZต.t่ณหค๗–๏ึึ๗ฟuiอฎเๅๅฅเเ`EEE)!!AMš4Q‹-ิผys5mฺT๑๑๑ŠŒŒ”ฏ๏นท-ฏปฎ๔๔tํ฿ฟ_ฟ๖›~๙ๅmูฒETG?o็ฒ‹ไ๛ง;—mvปžฺถW ทํVnI๙฿ƒค[Z5ีC—]ฆ ]j}๓.*๔๒ฉธ›Uษ?}ง}|ƒ เRภœCi่ฏฑฺ\@่[oน0 >น[%ญF™๛w VT5๘5ฺ์j}ฌDฝv*แิ~†-ถู๔๗ƒวดj฿amษศT._“I-C5ฒi‚๎lำ\ฑ~ฮนฝ+สฟ*::บFฮ†อออUJJŠ>ฌ๛๗k๏ฝฺฟฟŽ9ข””eggหjตบบ5อ?"T6^AพYN๛ำ3Cต๑ฃ]ฺ๙้OสI;-ปอ.“ูฌศV‰๊๚—๊zqœ}œฯ=xภ_ซว=]“ๅืƒม ภภ@EGGซqใฦjูฒฅฺดiฃึญ[ซy๓ๆŠWppฐหžY,%''k็ฮ bz็8?๓๗—๔ =ท๋€พ8‘ขดย"ู๕๛›๋ม^๊ฎ;ฺ4ืศฆ :๛Ÿโ๑ฐXง]?ญoั• เvภ8a4ำ"โผC฿#NjฯGtเ—สJอ=๗คj22›อ๒๖๖–ฏฏฏไ็็'”๙๕l๛ูq>>>๒๑๑‘ทททผฝฝๅๅๅ%ณู,ณู,“ษ$ฃั(ฃั(ƒมPfซ6›อ&ป.ซีZ๚ฐX,*))QqqฑŠ‹‹UTTคขข"ช  @สฯฯ/}ไๅๅ•๙}AA U\\ฌ’’ู*8C์ผ1 0Tบ ^จj๐{๖Œ฿๘อ™ZูTๅ ทูํ:žW ”ู%E๙๙(1ภ_„m†มรdผyœฮYD%(99Yิฎ]ปดkื.ํปWGŽัฉSงTX่xงk}ื้/5rr7™ ๅ?ท›ฟ Šผdณไๅm“ฏWกL†โrวgๆ†๊•ฑฏ);5ฝ&Jฎ5^^^ Wใฦีบukตo฿^ํทW๋ึญ•    ืl-žŸ'สงd฿Wูษi…E:”ซฌ’yyฉq ฟโสฟั'TGดR๐ภแ็<#ธ4วjฅ๚A0 ฺ€๘ฏ2ก๏ูํฝj'๔5›อ๒๓๓SPPBCCฎˆˆEDD(22R‘‘‘ WxxธBCCฌ   ”†บgƒš๘พ+ูl6YญV•””จจจจ4$ฮษษQvvถ233uๆฬ>}ZงOŸVzzz้ืงOŸVffฆrrrชva0๊๊ฟตฝ๔Œ฿9;jzืvๅ†ภUa่ีOฦ๏‘|*พณ๑ฯ์vป222t่ะ!ํฺตKถmำŽ;tเภRRR”žžฎฬฬLศ^‹gย`ิ1ฎ~ฯ2Hz ckอ๎ึA^ีฦ$ษ`aเ%2p‹ไS๑9ญ6›ญ๔ผีญ[ทjห–-ฺพ}ป<จำงOืŽ?๕Lฏั—iุํํๅkฎฎQูก๚วฬ•ดuฏ +ซฟBBBิดiSu่ะA]ปvUืฎ]ีถm[ลฦฦV๎๕uzšl๏ผ&๛ถ_ซ]รฎ3ูบgf๘งปฑ ‚๎@ hpฮ†พญ๛5Q \๚๚๘๘(,,LฑฑฑJLLT“&MิดiS5nX Љ‰Qxxธซ๗idT™ีjU^^žฮœ9ฃSงN)))IวŽำ‘#Gt๔่Q?~\'Ožิ้ำงwวม  „ฆ;3ธšapๆม=J^๗ a0ชฤ•ม๏๙๘๘่ฆž]๕Hปjeซโ:ัฑ2^๑W๚rบํsffฆ8 ฿~๛Mฟ๒‹ถnช(##ฃaB’ก…ฎš~ต dPๅฯ4ถุ}ต{K‰ึฬ~K…Y95XaคฆM›ชs็ฮ๊ัฃ‡บw๏ฎถm*::ฺ๙๖ั%%ฒ๓นl_~"ežฉ๔uŠ%}˜rZธIวฒหž„4oญVืJ จภ€ม•ก๏๎Ž่๘ถT™ญพJHHPณfอิฒeKตhัBอ›7WBB‚ขขข(“ษTCฯฎdณู”——ง๔๔t%%%้ศ‘#:pเ€8 C‡้DR’ ผญa0jTu‚฿=๋Ž่งr‚_ƒม ฦซ_ฟ~บ๘โ‹ีฟตjีJ^ƒ์[6ษพ๎;ู๗๏‘สzูหK†ฤฆ2๔้/CŸ ฅ `IRII‰Ž?ฎญ[ทjใฦฺดi“v๏ญ””๎์=ฏ พ7๖Vฃx›ผ๙NวุeTAI Ž์)ะซพnP[>ปZxxธZทnญ=zจOŸ>๊ึญ›š7o.?ผหH—}๗ฒฒA๖ไ’ีI@o4J‘Q2t์&C‹Tงปwkํฺต๚๖oตqใFฅค8`FH๓ึj5๒5๖—สม๋ฟีพพA จ0ภcน*๔=ต?Kวํ UฌZ5nซึญ[ซYณfŠUPPP=cืjต–žญ[\\ฌขข"งณ}gวY,–า‡ีj•อf“อf“n/ิพม`ม`ัh”ษd*}xyy•>ผฝฝๅํํ-งณ^^^2™Lu๖ฯัnท+//Oฉฉฉ:z๔จ๖ํงI):n๐“%ฑ•›ท‘ษืฏjkเOฮฟฎํคf็ฉ[ทnบ๘โ‹u๑ลซK—. .ฑำiฒ;"ฅž”=7Gฒe ’ขbdHh,Eว*7?_๛๖ํำฆM›๔ำO?้ื_ีมƒ•Ÿ๏<คฤ๙ nฅ;+ฎ}‚‚ฃe4U”_ขŒ:พๅ Žnฅโ†u^ฒ;xyyฉqใฦฺ๊ตซ๚๖ํซ>}๚จ}๛๖Šˆˆ,ูS’ฅคใฟ‡ยลล2x{KกแR\ผ ฑqๅn‹~๚๔imผY_ตพ๖[ํุฑรแผ๋ณAp“ก#ไXaม€s!x”?†พm.hฌธVQU}mล’OaดQ็ฤ^jืช์งฬbฑจจจHyyyสฮฮVffฆฮœ9ฃ3gฮ(##ฃ๔๋3gฮ(++KูููสษษQ^^ž๒๓๓UPPP๔–””” vต ›ัh, ‹อfsi@์๋๋+???๙๛๛+00PAAA QHHˆยยยJแแแฅ_‡„„(((H๒๑๑ฉีเธฐจHป’S๕ำ‰tํ,ฐ)ำ'Hvsีฮk& hุชZlฺ๓ใ๔vRา๏ะlฺดฉ  aร†ฉjาค‰๓mm+)++K;w๎ิO?คu๋ึ้ท฿~ำ๑ใวeuv๗#เก ƒขฃฃีฉS']pมบเ‚ ิตkื๒ทฎซีช่๛๏ฟื—_~ฉ๕๋ื๋ไษ“ฅมW ิ{ฎ}ฝ >J nก๖1=ี<ฌ‚}ยjจฺ9{.mffฆาำำ•ššช“'O*%%E'OžTjjชาาาt๚๔ieff*''G*..nฐ็gF๙๘๘ศ฿฿_AAA SDD„ขฃฃซุุX5jิHฑฑฑЉ‰QDD„BBBไ็็WใAฑ]RJA‰ถfๆkcZŽๆซธŠ฿&ย`€†ใ|ƒ_u๎YC‡ีฐaริฝ{wUปž์์lํุฑC๋ึญำ? _Uษษษ ๖ตPžˆˆu๊ิI๛๗ื€ิตkWลฤฤT{ฝำงOkใฦ๚โ‹/๔๕ื_kฯž=ฒX,ี ‚W+๕ื ม`@d4<\m๚6V›Mช๚๚šี8คฅZGtญ‘ะทคคDููู:u๊”’““u์ุฑาว‰'”’’ขดด4eggซ  €sฒ\ฬd2ษ฿฿_aaaŠŠŠRฃF”˜˜จฦซqใฦJLLT\\œ"##]~^๓รเ_N็๋@nกŠฌU๛‘‹0ภ3O๐›uฌ@}๛๖ีe—]ฆ!C†จmถี9ถ  @ปw๏ึ?จ๏พ๛Nฟ๒‹Nœ8Aเ TQddคบvํชjเภ๊าฅ‹BCCซตVQQ‘ถo฿ฎ/ฟR_|๑…6o,sL|ๅƒ`ซUษ??{wลีจq™•l\!!Xฐ„ มŠป(^(—เดwืw)V=ธป„@ w]y ๐v6ษF–ศ๓๋9gfฯฯ-I๖ทs†ˆˆ€‰ˆ(Iห่[ิฎ ฆA๔‹‹CPP>|๘€7oเีซWx๕๊ผyƒw๏มฯฯกกกˆOี๋P๚066†ตต5rๅส…๙๓ฃ`ม‚(\ธ0 . '''8::ยสส*Uq8Mc๐•ณx๙4c0Q&”า๐๛œ/œํK Yณfจ]ป6๒ๅห—ขืWซี๐๒๒ย•+Wpๆฬ\นrฏ_ฟ†’ฟWฅA;wnTชT u๊ิAญZตเ๊๊ …Bก๗ต4 ^พ|‰ำงOใ๐แรธ็๓๕[1Qฒ0Q†–vัืEํR}###๑๑ใGxyyแ๙๓็x๚๔)^ผx7oเใว ใผYŒL&ƒ r็ฮ‚ ยลลฎฎฎpvv†““์ํํ๕#K พ…[AฉมฎœA๐๓GŒมDDDDXJย๏~PฺกAฅๆจYณ&rไศ‘ขืฦญ[ทp๚๔iœ={>DdddŠฎED๚“หๅpvvFญZตPฟ~}TฉRy๒ไIัต|||p๖์Y{ๅ:|s8มพfC†`""า‰˜ˆˆสdPXšB"•">:ฑQ_C‚่[อ น] }cbb๐๑ใGผ|๙Ož<มฃG๐๔้Sxyyมฯฯ111)yK”ล˜››รัั… FฑbลPขD ธบบขPกBศ™3'd2Y’ืศJ1ุุา &VศฅˆŒFt`TŒาDDD”อ้~ี* b pหQชดHัฒjต/_พฤ๙๓็qโฤ \ฝz๏฿ฟOู ข4gccƒ * ~๚จ[ท.J•*•ขปƒ?}๚„CWฎใŒ_$โ —€ฬฤ,ั๙ีฯรLD”]0๒–)Š2ญซ!ษœฐดา@.SB€*ฑ12|Œร ฯืธwเ"">ฅหพD_—*๙แj ่‚7oเ๑ใวธ>>|ˆ็ฯŸใ๛๗ˆŠ2|๘ฆฬMXZZ"(Zด(J—.าฅKรีีy๓ๆ…™™๎?ศ5|ฃใq๏K Aฌ:cว`็ฺๅQฆE%ไqฑ„น™2ษ็mฮี .^ސ@ ^zป{/!เ๕ปt[QFฃo๘ีจ[unิ+ึ ฎŽnzฟ^dd$n฿พ“'Oโไษ“ธw๏ขฃฃSธz"2™LิฉS7F•*URtท๗Ÿฐ๓ัผ–[F‰วd†`"ข์ƒ˜ˆ(+X ๕๚ืGผ๑ ฑIฮQšใ้Hœœฟaพฉ~}‰D€}A[ธT/๚อ ฉLฟ่k"3C>ซ"(šฃ Zป๊Œพมมมx๕๊๎฿ฟ;w๎เ๛x๑โ RฉR^ˆtQ(ptt„ซซ+Pฎ\9”(Q ย=—l^?๕ฌ ๛‘ ้kฦซM๐๚™ว€s๏4YQF$‘pฉ๊„ช?—LV๘  ฐUIT+ะ๙ญŠ่๕Z~~~ธ|๙2Ž=ŠณgฯโีซWะ0ไejนrๅB5ะคIิฉS €ิ?$฿๐‰ŠรืŸp-8J‰4ัน มDDY0Q6$•ษะbjธU3ƒLะKใˆX+œZwทvœะ๛oฃo‰š…ซˆ$ฒไA$}###แๅๅ…{๗๎แๆอ›ธs็ž={???>ง—2น\Ž]ป€๛wแใƒ_cp๗ตCแ์ข๛ฟทฐh+๘ผˆยว—Ÿ>ปaoG—ศ•[…TรJ5ไ8ด๚nn;ฎื:‰ˆˆˆ~ค๔ ฟฯŸ?ว‘#Gp๐เA\ปv ัััiผz"สjคR)J–,‰ๆอ›ฃE‹(Wฎ\ขw๋‚฿_9ƒ็ป70eR ภDDูD‰ฆีัaLYัgw†DZใฬ๚›ธป๗ 4"แศฤฺตตFลzถKด?ˆถDะw(Xฮ0‡*ฝึ๖%๚อแ†3˜!˜ˆ({`&"ส&๎\9ตทp}๋cญCBT`H’ื(ึจ*ฺŽฎcY๊ท}mKAaŽ๛7แ์ูณธz๕*^ผxมเK”ๆๆๆ(Qขjิจฺตk#ฟ[9ผ—šฅ0kเค sอญ‘OVุ>b ฿|H๒*ๅ:ิGณฅ`$ั@๓ฦE%N๘[5Nz„฿>เ๘๑ใุปw/.^ผˆฐ0๑–ˆˆRJ.—ฃB… hำฆ ZดhขE‹B๙Œ!˜ˆ(kc&"สœk—Gื?ช@‚„ฯ๗ ฑฦ๊๎+štะ•H%(_ณ4๊๔ฉ‹V๛ฮ^1Uz4C“žด ŠŒณฤขŸW &ŒQฦ‘ึแ7$$gฮœม๎ปq๊ิ)คำส‰ˆ255E๕๊ีัฎ];4mฺy๓ๆีšรLD”51eํ๔G้๒ ‰WCŽำoโษ O็IฅRTฉ[?ตญ ๛b–ˆ’„@ฅQ๊œ/ฦDn†ผๆ…ac‡ื฿แฬฑ๓ธ~:R๔^ˆ(e$ œœœPญZuTmฺ%หร[b‚Wแฑข1ุA}94ืำ@oIฤH๒รJ(_=ฦ;qใศฤ&๑œบnk†ยฅจ๖ณ„๗.yป{ฯค๎อฅฏแท]I,›บ๐‡ซWฏbฯž=๘๗฿๑ๆอ›๔[8Q2ุููก~๚่ะก๊ีซ++ซใ>Qq8๙1 —๔ มปึร๏๎u†`"ข ˆ˜ˆ(๏ุX„$8ๆ๋o…ํๆhอ•ษeจูฎ ช6,Ž\…ไˆ‚S}Œ๓Cๅg„งแฬั๓x๖์โใตŸJD?†™™JปนกVหถศ[ญ,sโM”๒ฟฌA!๕˜h|œ!„ทค}‚cRศ!จ ๑น†็gOเ์ๆก}Goพ๒ละkA}H‘p{๗๛ท$ุ=|ešฟ?"""ขไJห๐๛ไษ๓ฯ?ุปw/๎ปตZ“ˆˆา[ม‚ัฒeKดo฿•+W†L&๛:ฦLD”50eqฆvึฑงงึ๓7ฯ รฉ๙R™ e๊6Dลv]‘ำ๕#ไš— า๛ตม ๆ>Vธ|๘ฮŸผฤป|‰2 AP `Aิjู.๕›!ยŠ่5"แปพ’๚ส‰^รEต 2D‚๏X\:p็_AL๔ท‰~x lฬC^ำฯ+ฺฯM๓๗DDDD”‰T—*๙S~p๔่Q์ุฑ็ฮCTTT"W!"ส8คR)*Tจ€: u๋ึ(Tจะื1†`"ขฬ˜ˆ(‹s(VV5ƒฟ๛VฆBi…JฟtƒY‰ ( ิhเฌZ#„ค่ตBฌฑธี์4Z9(%TC‡ nพ{ึท—คข„|ข็”P%QŠ้๐๚คษIDAT@$ฐl*๖]วลฃž่ืpJxwpH„5ๆ7ใฟDDDd8฿†฿Be๓|t,ฑ๙"แWฉTโ๊ีซุฑc<ฌœˆ(XYYกaร†่ิฉ๊ืฏ ภ๛่xœ๐ M~พ|๚๓3‚‚‰ˆ~(`"ข,.o™ข่ณธ^‚;z5"@่Š i.(ฟ๛eQ}ถš;:ฏg,3…iœ |"caj`,(ฬ [0ไevฮu* ” š( Dฺ’<ˆ๛๎™มนีว`ฃนฏ๓z‚ ฌฃ‚Bš`,,ฺ ๓šฮ…Fไ9ฤDDDDi)%แืลฎ4*ๅฉ๗5พ{๗๛๖ํร๖ํqใฦ จT๚๏œDD”ันธธ ]ปv๘ๅ—_PชT)‚ภLD”ษศ’žBDD™Y|L4$ภิ4Z๑|% `ซJ€ฅฆPฤXโี๕8ต๛(yŠnk†ยฅhยs•JBO”ฤEล ถ‚ืเ๒iฅจ๐sg˜/ฉ1โิ˜k$z=FAกะSฉฦ_"""JW_ยoต๖ฅPฐl๎ค็~ใโโp๊ิ)lูฒ๛/ ฐj"ข็๙๓็˜1c,X€:u๊ kืฎhฺด)zส†ŽVI†`A*EZ ‘งF=ผฟฤLD๔#๐`"ข,HHรฅ8*w่Ž<5~‚ƒbไK0็ƒค1‚…าข็;ซึ@ŠXj{๘_z‰“ป.เูƒ— ๆ =09ฌC๓zc†uฟ.Hำ๗BD†gืCทt‚LH๘ เ[Wิุ?n-@"•ขtญบจิพ+JAฎyแ›ญๆ“KฃQภ๗z N๏บŒW๗BŸ๘7ษ‰ˆˆˆ’๋K๘ญูฑ,๒—ถOzwแ๗ํทุปw/ถm†[ทnAรpADูXกB…ะพ}{t๊ิ nnnx“พกธ่(eวฉี๐ฝzOvอLDd ภDDY„ ‘ภช 3สด๊€‚u›"ฺสฦœิปaฎ๑J0?\(‚ท’ถ Ž™IุD…ภๆ)\฿ท O]=‹K;6แี}ฯขหส!p-ž0j ลฦ W๑๊bา็Qฦืy๙ +๙ฝŽl๔มีu๊ร‹sทโื "สฌ€‰ˆ2™/ั7oz(ฺธ5Œ๓†Z$zŽA(คฺ F˜(ต#Žอธˆ;'O'๛๕+ฺM+ษื๛‹? Žฐฦ"‘;‰(s*ึจ*:y”M๐pˆŒณฤบAปเ๗ฬ;ษkศdRTฏ_ติ…‘UR๖kง€(ฟ8=๓ฮฟd &""สคJท๚ 5บV‚}ฮH…ฤฟง6ลืœ[u7%ym‰T‚5 กqฏฐฬฏHz7แ7ฤ;›7oฦฮ;๑๎ปdฟ""๚?+++ดhั=z๔€sฅj8ใ™์๘6ฎฎ^€Oท=“zช”ฦOฟืEBŒ$Q:็i *ฮ/๎„โฬ๒C๖๖M๖kev ภDD™ภ—่๋Xต6 ีkซ"ลก‘J๕บF>อQXชhh…ํ#ท"๐๕๛$ฏQพcC4ํ[B๔—๋Sปq~ูฝึDDเ}ฃaoชu<8ป&์‡ฯgI^ฃf6จ๗K>ญ-ใSD๛Dเน็xzล›1˜ˆˆ(ฐฮkึSป PแXญ/–%Eฉ1ฦฝ+‘84iTJฅึธD*Aูzฎh๔[ ˜8j๏„ค5ฟ๐[ึพ&žxพฦบu๋p์ุ1DG๓ฮ0"ขด ‘HPตjU๔่ัี›ทยต(!Y!X ”/โ๒สyx’ฮy sSดœ๚+Š—3‚Lˆัkm1J \=๔gํา๋<"ขฬŠ˜ˆ(ƒ๚}ซิFพZ `[ฌ4™\ฏkXศฅp’ช๓๔.<Ž2ญMDAŽŒณฤๅ^ยsรฤGkG'Gิ %+ศEฟญ๏l…ๅํˆ~(CD™WฉVตะnxiH๐Vะ@Œส7O|ยล5ฆ5žปTิุ.ล”ข๖Fว"Oด Œี๐‹๖Rญ‰ัhฏ`<น์…gWโร ฦ`""ข ฆpอฒh;พ,MดฟPฆw๏-ฐe๐_ˆ ๐9Vi๊††=ซAj—๔฿ _ยฏณiY\:|๋ืฏวญ[ทRต&""J\ม‚ันsg4้/Œํpั?<!x?ร••๓๑๚Rย๊์‹:กใ์_ำ&ๅ?S4๐์ฑv ] Uœ~ƒe6 ภDDศทั7Ozฐ+๎‰HฏkXศฅ(b"…ิ๛<๗lลฉ๛h9ํ7Tฌฉ;"GฤZแ๋๘ฝ@|l<,rZ"wไtP้R'Nm†-Nร๋๒=ฝึID™ร/‹ขdฌF+-๐้ฝoC ŒUย"‡9์๓›มึ&V็7ฒ•c์™{ _B|yับSsTiโฅu|#ผ๕มj >พย๓ซŒมDDDDม๊n่๔GC˜ศตฟ(–พ~–ุะg%ชิ/…บ*Ac•๔__ยฏ}|!v ทo็6ฯDDfii‰VญZก]๏~สใ‚‹I฿, ๐๕ยีU๓๑ไ๔Qไ,’ฟ.้+ณ4Yำห—&ุg)cFDY0ั&H$ฐศ_นซึAž๕`[ฌ4คFI?ท๊[r)ŠY(`์‹ป๎ลกเๅๅ%๒Z~]๋ŽยEt?E*ว7yแ๊บCir="สxไฦF๘mไอž&ืำ@Š๓‚pzมŽว% สธก}ทึ(๙“3BคพxๆลLDD” Y:ไ@Ÿ ฝ`eขsNŒา!มRD†ลC*“ภาFK‹Xศ1ซีฆHข‘ิGY_ยฏ‘ฟ-vญ=€ """…๏†ˆˆา‚T*Eํฺตัฑ` Te\ ŽI: €น[˜ƒญูGั9Hcฟ๗๑ˆІT.…ƒ)์rj`,ำw์ํซ์ป&U๏‰ˆ(#c&"๚D฿๊ua[-Eัทธฅ1 "ฏฮŸภ?›7โฺตkP&ฑ ณิHŽฮKภล5ฉ๙ฏ1ม้m^ธผๆ@ŠฏAD™ƒฑ•บ.๏ง|ฉ๛เTฅ1ย•#81g[ข๓ฬออQทn]ด๋๙rโ]ิ๓ล`ตZƒOŒมDDDืuี-ฆhฑ‚็—ธนใ”ึc$์ ๅAี_ขLM(ค‘zฟฎDขฐuIฤพ–a๓ฒ]8{๖,Tผป‹ˆ(ร)]บ4: ซ q3B•hถำD.๕ั1`+œ฿t^ิz,™‰ต%*vฎชญ‹ภ\กฝmดr์™w]L›!"ส €‰ˆ ไk๔o{gbฅ!U๋u/ัือาก๎`฿–8|๘0๕^OQPฅ‰cŠ>X Žฐฦัล็๑ไ„ง็Qๆ$‘Jั_Qถ†eขwๆ่c…ยง“žB… กmถhก1ŽjผzภLDD”๙ฉบNญ)โดฦ^ฝ4ลฎั๋ฟ>หWงŠลัeF3˜%o๛h‰ E W‹ม†ลq็ฮ”,ˆˆ ,_พ|่ิ0r7n‹๛qRญ,G8 ช6CŽ„_Fึ@ภภ>ฟ“|–ฏu^{tZ๐+r;hL ฑฦาถ๓ธ4eI ภDD้(-ขฏฅ\Šb–ฦจ`g‹P?gถo฿Ž{๗๎AฃI?แล ขเๆ(TL#IR!X@xŒ%๎Ÿ๓ล™ล{ฅ"ขฬฯฉr)ิะ๙œT:Ÿ๑๛ญhฅž\ลษ{แœโื522BญZตะตkWToPj<ผ๗แฉˆมžo๑์ฒ7c0Q๊๑๗0ัGฮผ~mŠฝ—$๚!ปL.C‡~-QฉM1„K‘œญž๓™8ร๋J6, e|666h๗{8ทํŠง0๙‚sh<แ พ 5฿_R’(ูฐ็ทoL๒๚ฆถ–่ฝพrZ'ผX๛–ฝะ๛‹สDD™0QZX:Nu๔-neŒ๒ถfp6‘เ๎ๅ‹ุผy3>Œ4_ฒu^{ธตช‰B๒รฦ #5AฅJ‚จเำ›p<ฝ๐OO\C|ด๘VnD”ฝไ*VeZWG7XูH —ซ จTDวH๐>ฯ/ฟภƒ/im๏˜Z๙๓็วฯ?Œ.]บ ฟknผ~ฤLDD”˜;ุย}{ญ]†ขโ,ฑผ๛„๙๚‹ž'7’ฃใ€Vจะสa’$Q•€<Šยxrส—l‡ŸŸ_ฺผ""๚กLLLะ๒ื^(ีน7ผŒ,+n#Œ5Ÿฬ‰๒ร[าH!8Dแ๎ฦ8ณe]ขืvช\ =fืำฺัส๋ึบ อ฿ ัฦLD”พ‰พนkิ…]1ทTE฿’V&ˆ๐๓ล๎ปฑu๋Vพ};ีw๛๊C*“jฅ5LQโ$R)ไ& R)Tฑฑˆั๒1=( ิฎ]ปwGณfM/มซ ‡ฉŠม~ฏƒ๐Œ1˜ˆˆ(Eสถฏ‡ถƒŠh๗<ƒรSต๏ะ22V ำ๖(฿ด B$๗#*•ฦkzภ‡—oRนb""สˆคR)ฺsG‰ัp็ˆw’ึ\ฮไŠฦญซprZื{F}tผ%ๆถXยˆ(ห‘่eZE_ว*?!Ozi}-eฎ^ฝŠั7b๐๗†|zS)•?ไu‰(sRซTˆะ๊1ฝลฦฦโ๘๑ใ8~8œัฑcGt๎๊! ๊“1X"ซˆrฑCอฮeƒ‰ˆˆ๔ไTถ ึ1•F[ปO&8&W(๐หwฎe| ๎เ• ฑฐ(เ0eI*• ‘>`เx<,)8iฯืh๐ุUzๆ@ี๎ณ๑p฿}ณdซึผปAัb%๐ํŽ๒(ไtฮ๗_ค๕ "๚ก€‰ˆ๔‘†ัท‚ญJX™ภฺHŠะะPน ๋ืฏวล‹กd€%"าห‹/๐็ŸbัขEhึฌz๔่บu๋ขr^ฦ`"""Cฑฮe แ—ยขcแ๗ 32B๓A#Qจugศ๑/dšฤŸู+ค0UๅD˜ฤ’w€i`›฿>WODD‰]>[ ๎Ї-RDฉดหฅ> #M BูŸ-Qซ๙Dœt ‡ถœ๘:็gPjสA&ฤ|=&6๙€‰(หa&"JJ:E_เsฐXดu+ถnŠ—/_ฆว๊‰ˆฒ•๐๐p์ุฑ;w๎DฅJ•ะฃGดkื•๓ึg &""Jg ฉึฑุ8‚D‚–ƒFขpn๘(5ม@{”Pอ…ุถฯA ห8{\ุqgN๎วเํ!แ ฦ๚MFDD™‹ยT แถฬมพAxฐn ~8 A๖NˆRgˆตๆแ73ีW๘กJŸ"จญNnธŠ#O#&4*ต ฒ๏~\)ฬ๘3…ˆฒ`""1้}ีj5.\ธ€u๋ึa Mw@D”ญi4\ปv ืฎ]รฬ™3ัฉS'๚๋ฏ(Vฌr˜ๆb &""J*ฅvฬ56Q`ะษ๐“™ย๗ปฑกฬฟน X"Ha›็ทยพ +กัhำล ดฏซŠWi#"ขฌCฅิJ*—เฦ‰#ธqโสึm€ฺƒว"4WAXฦŸัZ๓ี"ŒQฝQิ๋^gv‚ h_Wฯ๘ˆ(๋a&"๚B`™ฟะัท>์Šง]๔€ศศH‡฿/์๓A ํŸหaŸBาv๑DD”ก„๙GP$8faฉิHU\<๎œ9‰;gNยญv}4ีjscH#z-ตF…(ำ@T๋UjMยPฌa~ม้๕6ˆˆ~b{ํei}+ฺšก๘wั|}}ฑm็็๛>z๔(-WODD) ‘H๐ำO?กw๏hูฒ%ฬออฟีค(Kญึ0Qถ๔ำเvจ฿ฮN๋๘ษ/ˆœดŽKNqื๐๔ศ3wญ่5/่าๅUCŽ•ŽโใฃWiณp""สpสถซ‡ถƒ‹$8ฆ[ธ็gnhอฏฆ!Vฦ6ˆUi฿ ฌKผฺ‹:nFุง€Tฏ™ˆ(#a&ข์็๛่[ฌ4คฦ&z]ยR.E +Tฐ5พ๐๘๑cฌ_ฟถmร‡าj๕DD”†J–,‰฿~๛ :uBฎ\นพMใ|ลž3Qึ#Hฅจก;สึF{ A\‚๑Pม>’–_wฉ ภ1&๗7ฏย‰ kt^ื&_. ุะฦฒ๐วรcฌ0ฟูจ”ฒ“ˆ(ซฒtฬ‰กบยH•เ๘ซWฆุ๐B็U๚ฉฺ i 8D%+ซิ&๘wฺi< ีk&"สH€‰({Hใ่[ยฺVrํ่ซัhpๅสฌYณ๛๖ํCxxธศ•ˆˆ(ฃษ›7/บvํŠž={ยลลEdc0ั๗ฉn-; b๏กˆฐส €๊ฝฐะ$ผ3W>’–ˆ”ธ"O\๎o^…ใ๋W'ุ๊Yฬฏนฃˆณ๖‡๗๗oIฐ{๘สด|+DD”พu$๒็M๘ูšr์_๖wvŸN๔*u* ฦP็ŒH2K โ>H๑ฯฒxp้yชืMD”0Qึ๕%๚Vฎ๕ํ๕Œพ&rXขข™ฮ่ ๑๑๑8qโVญZ…ใว#>^ฟ(@DDƒตต5ฺทo>}๚ B… :f%Œม>กฏก‚~w 1Qf&Hฅ(ฺจช๖Ž;ว,Yjž#Ÿzฟึ9J˜แ๕=+lujuา?๓ฺฬ๊ƒrUํ๋hŒ๑ท๛1๘}–Šw@DD™[:๘yจ+$นญดภ™๐์ิ๕$ฏQฃAe40๒KrฎDผUc๏โcx~ำ;ล๋&"ส€‰(kXไ+ˆ฿>ำWฯ่‹จ6‘ iั‰F_ˆŠŠย๛ฑrๅJ\พ|9ษoฐQๆ`llŒ-Z _ฟ~จ]ป6$‰Ž™Ÿc๐ห ธ๓๖*b?@ะcCิ—๓-ž2Q&Hฅ(Xง1ช๕ Uฎข( PรIฝfํฮU#๓Œลษ๙ปแ,๚นŠBำฑญQฐ@ค่๘ใ๛rlผ,5oƒˆˆ2‘ปF!ทC˜ึ๑8ตฎ๋‹๓ห๗">&NไLภมMวuDษฒ€Uฒ_S ‚^ฦเŸฅ'เu๗}ŠืND๔#1Qๆ—ั768F>hไœm+—I4๚@HHv์ุีซWใ๎ปฉX<edRฉ๕๋ืว€ะคIศๅ๒DfŽม—Ÿฤญ7—!ตVA&๒Œ๘ฤ0QF$Hฅศ[ฃ>ช๕!_แ$็›รyUป Eฌ่xtผ%ผžDใ๕ื๙™ย๖EQจ|~ไษง‚\"พUgXดV๚">ฅ๊QๆแTฑบฯi#‰๘ƒB#ญ๑๔†^]~‚P฿Hไฐwฮ ็j.(T&r]g“IDa|zŠƒ+ฯภ๛มวิฝ""c&ขฬ) ขoLP๎^Gžธ0๔j\ ชWM๒???lผkึฌม๓็|&Qv!ชWฏŽ M›6066Nโ ฎป„ฮmC˜r9Bฎ้๕šŒมDD๔ฃ R)rWซƒสฟƒQ!ื$็K.rฺ?‰*ึUhm)๒*HฮGSqj3์š~)Y}QึRฝO+4์’$๖ศ5jH!@“ไพ‘q–x{๊6sCˆั{D+ลใ๒ื+kผฝ€ใ_b&ขLƒ˜ˆ2ขฏcๅZศ[ณAŠฃฏ฿mO|ผzๅฌ1๔๗^จQฃF’็ฝ๋ืฏว_oo>„ˆ(;ซPก €๖ํร<ษ๙>ฤชMK๑ไำฌเˆ<ฎ9ƒ‰ˆ(C๛~ห๖๓ขฅ“œ/7>อณDp๐็ํ[N๋… 5zmป)&Ve†ร+๎แฮžำฉบe^u†ถวOm!ฤw—HฎˆX+์™zฏ.…L&C็^ํQฟ{U๘แM’!ฏฎภูอื‚‰(รc&ขŒํ›่›งF}ไ(Q&ลัื็โ ป†5ชม?๔S’็z{{ใฏฟยบu๋๐แร‡”พ ""ส‚J—.๛ฃs็ฮฐดดLrฝ{๗ฐdษœบr๙rยตzฦ`""สPพ„฿R]๚ยบdน$็KฅฬeฟtfLม๛๗ฺฯIฌ5 -jต+…4"Ek ‰ดฦมนง๑โ์อODDY‡[:hิท",ŒCStG+์ธŸผNpิิ=tCอ_สม'๎Yา!X <ฝ๒—va&ข ‹˜ˆ2A€Epo{็”F฿Oทฏโล“๐ปํ‰ธะ`4nร† Cฝz๕ Bข็{yya๕๊ีุฐa>}๚”šwCDDY\๑โลัฟtํฺึึึIฮฟu๋-Z„{vร*—)œ+็K] ๖ ย๓ซŸcฐ๏๓(ใSw—e?_ยoฑ_z!G™JIฮ— สX) พs๋ฆMฤณgฯŸซX!4ู  ซ’}็Vฌส oDเ่ฬˆ Kึ9DD”๕™;ุข๑จp-g …4‰P๛ŸˆX+:g๏†Jฉิ9ฯฮฮ†๕F…ฎx๑ ษฌQ.พฦี=๐–!˜ˆ2`"สพ‹พv% 36ี๋฿G฿˜เ@@บu1|๘p4iา‰$ัkผ~ซVญย† เ๏๏ŸโทCDDูซซ+๚๗๏nบมฦฦ&ษ๙Wฎ\มย… ฑ~จTJไtฒa &""ƒ๚~‹ถ๏ ๛r•๑๙c"ค‚€๒ถ&0}yฆO†งงง^ฏ—ทœ+*wฌง6ฐ0‹…Tˆ๛๚Œ`5คˆW#8XŠื|pc๛ฟใ‡้DD$ฮ&_.”๏X.•๒มฦV น4A จ5rDวมC<Ÿ}†ปœClDTฒฏ] @ E๋ไลำ [I†`ตJƒว^ใ๊‡ มD”a0eS#ฉ(5j(ี?เŸ‚ฏัท๒ิhย่๋Oท=๑ยI๘๙๔€*Uช`๘๐แhำฆ dฒฤ?D~ืฏ_€€€ฝ"""(Zด( €๎ป'๋ŽเำงOcม‚8z๔(4 ‰€œ๙ญณD 6•Ia.“A"ˆQฉกT˜฿9ˆˆ(แทle ‰’>‡_Sไ ๐ฦๆูโ๐แระhR๗๏นU{X็u€ฉ•TJ"ƒไํ‹˜ฐไอEDD๔…‘ฉ ,rูยุย*ฅQAaˆ๐ ‚Z•บฟส”)ƒaƒแPึฎ%‚•j<พ่ลLD0Q6โhjŒ๚น๐“ฃ=ŠYYภฮXฉ Jฉ„Od4๎†เฌฏฎ| @t*Aา)A๔ญปeา4๚ŸŸษ8lุ0t์ุฦฦฦ‰^๋อ›7Xตjึญ[ว;~‰ˆ(Mนบบbะ A่ึญ[’ฯVซี๘๗฿1|\ธpแ๋๑ฬƒlญั"nิฬ•…-อamd‰ฤจิ๘ƒมก8๓แNผ„Qั้ถ""า–า๐[<>ปฯล–-[›ผ-œ‰ˆˆฒŠ ภ} ศ๓วโ'ฯ$CฐJฉฦ†`"๚ม€‰ฒ‚fT ๅƒƒIโATเQp(ึ>{ ฯ฿ 2‘็b$[ZE฿[W๑โ)ั่ … ย!Cะณgฯ$?h๗๑๑ม๊ีซฑvํZ>ใ—ˆˆาU‰%0x๐`t้าๆๆๆ‰ฮ‹‹ร๎ป1|นs'มXFมUํํ0ขTQ4ษ๋…4๑G.ภง่ly้ฅ_ภ'’!˜ˆ(=ฅ4V5ีเ่฿+ฑ|๙rj FDD”]ศๅrt๊ิ F๔A˜ู๗๓Dt|!8^'—‚‰่ว`&สยฝŠยฤฒล‘วิD๏๓ฏ๚bิ๕{๐๔Kม๚i}?พŠุ ัy่฿ฟ?๚๕๋‡Dฏ๙้ำ'ฌYณซWฏฦ๛๗๏๕ZQj”)SC‡Mึุธq#-Z„—/_jgคl"•ยฃL1 -แS™T๏๓_‡Gยใๆ}์๑๒ั๛\""J\Jรoฝ&ธถo'ๆฮ‹/^hตDDDŸ ๚๗๏_๛uwct•!˜ˆ2$`ข,สH"มฌŠฅ1ธ„3?q1ฑt๕v๒>”Xไq๚}k6HU๔๕๙o{g]ัฬออัณgOธปปฃPกB‰^7((๋ึญร๒ๅห๑ๆอฝึDDD”–*WฎŒaร†กmถหๅ‰ฮ๕๗๗วส•+ฑbล ;Vคu ~vีž%/็4V`U๕๒hๅ”Gฏื๛^œZ 7`มร็ฉบ}–า๐8ท^=3f$x$%TคHŒ5 -i†W“‚_๔‚็x๛;Q๚b&ส‚$‚€EUส`@ฑ"IฮีIโ๐x%~= ฿~ะ6๚ึจป’eำ5๚€L&C๛๖ํ1rไH”+W.ันุผy3–,Y‚งOŸ๊ต.""ข๔TปvmŒ1M›6…D’๘–ษฏ_ฟฦขE‹ฐ~zDDD่œ—ฆ1ุ๓ž]yฃ3[ศeุRป šๅsิ๋๚:_Wฃม๐kwฑ์ฑ๖ฯDD”<ฉ ฟชท/1kึ,์นสดxQ6PซV-xxx bญrธๅ{ž!˜ˆ2 `ข,hh gฬฏ\Ft,ZฅยqŸ8๎๓ฯBรซVรXฒv6hš/*ไฐ=๏}T4šฟˆGมกi}ฃเw๋*|{ฆoRั๗‹z๕๊a์ุฑจ_ฟ~ข๓โโโฐkื.,Xฐ@๋ŠDDD…D"A“&M0rไHิฎ];ษ๙ทnยนsฑgฯจT‰฿ก๛%ปTษขีœา</จ\CJ8‹žงp+ '฿ยำpฤชUp01F9;ิอm|fโฟ7D*•hw๚ Nพ็‡ DD๚HM๘อ%K–`ูฒe6ะЉˆˆฒ™L†N:a์ุฑศU0'C0e ภDYL +œmZถ #ญฑฃ>พ๘ใ๖c ญF ~.˜Sห•DA ณcุฉยŸ*3ไ6p๔€าฅKc๔่ั่ะกCขeชีj>|๓ๆอใ–eDD”iศๅrดkื#FŒ@๙๒ๅ“œ์ุ1ฬž=็ฮKึ๕ำ:[ฝว†Bลaฌั ‚B1๕๎#๛ึ๑jตึxcz-ˆัฅ]a)๒3n`๊=‡ะธxฝึGD”ฅ&:›สฐm6ฬš5 Ož<1ะЉˆˆฒ.;;; 2ƒ LT มD๔C1e1ีฌˆฮดŽ/y๔7 &‰ป… ธต%6ืฎŒาถ6๘di‡y]p+qผฬ™1rํฐœ˜G฿“๐ปsMฏ่ y๒ไมะกCังOXYY%:๗โล‹˜;w.> ตศฮDDD™™~๕WธปปรูY๎ฺ/โโโฐm6ฬ™3Gฏ๎ฟมy‹ูCf$ีk‚ศขBaŸx๑‰ƒc Rp๐ํ ธ| ฃc’ผF<X_ณMตฦF^ป‡E๘<`""]ฉyชี…K๛z‡฿b–ฦธ|๙2ฆM›†cวŽhลDDDูGษ’%แแแ: 4.(ู!Xฏย“‹o‚‰(M0e!E,อqฝU}ญปi๖x๙ ๙kขwแˆ1ฯ๋„JuฃF“ึx›ซ€มฃ/๐๙๐^ฝza๘๐แprrJt๎ƒ0|l฿พqqqzฟQF“3gN๔๋ื„ƒƒCขsƒ‚‚ฐbล ,]บ~~~zฝNZฦ`“็a˜ปใ*ž<๘ ๚ฬ`1อ๓็ฦฮ:Uก&|๒ใเ0T9t Qสไ]‡ˆ(ปHq๘uดB1+c๘๘๘`๎นXปv-ขฃฃ ดj""ข์Gดhั&L@ลŠํพp๏ำ•ไ…เ ^๐็!C0ฅ0Q2ค„3|๗์฿เุ8ิ:|OBย=ื<ฏ+„<5๊!Gษr™่ฟฝ๓ง›W๐า)๘๖Dlhสž%Zตj…qใฦกRฅJ‰ฮ}๗๎/^Œฟ๚ กกก)z=""ขŒฌPกBpwwGฯž=annž่/^`๎นุดibcc๕~ญดˆม‰=3X—๙•ห`่wฯึhp๔<ฮ๙๊ด‰ˆฒชิ†฿ธธ8ฌ[ทณgฯฦ›7o ณh"""‚นน9 €#Fภ>E!๘๊‡x๗ˆ!˜ˆ๔รL”…์ซ_-๒็Npls/~้ฆ่|๓ผNpฌT yjึกั๗‹๒ๅหรรรญ[ท†D"ั9/44kึฌม’%Kเใใ“ชื$""ส ส—/ัฃGใ็Ÿ†Tšx”=ม1นB†V๋ึBžฟ 4‚~;D…Axr‡๖ํ๚ผฝs*ฃ/ไฮร‡GŸ>}`aaกs^|||6ีk&"สLา"ฦววcใฦ˜1cผผผ ฑl"""าƒ…… „แร‡#GŽ‚‰(ํ1eนMM๐่็ฦฐ๘f๛ฤˆx%Js >‘ัห6vฏค>‚„r:ฏ๐ Ÿn]›G˜eกEฬŸIฑ฿๛=ฺพ’ช๕ึฏ_'NL๒ฆวcฮœ9ุถmโใตท$""สฎ์์์0hะ 4่๋‡บ<|๘3fฬภฎ]ป R%Lฤ”ตณมต–๕ h ะJŠ—yไุc ซยถZDฟ‹ภ๓*ปมฝ„K‚y7ƒPํะiฑBDูBZ„_ธvํฆL™‚cวŽฅ๗’‰ˆˆ(•J”(I“&ก}๛๖๛ูฏo~|ม ž มD$‚˜(‹ศ๑฿ภถ฿ฏVฃ“x– ~๑H::ม5พD฿๗O}yRูโ˜TถD‚y_ฝEท๓)ปธH‘";v,บw๏น\ฎs^@@–.]Šeห–!((H็<""ข์ฎhัข=z4บvํ ##vะh48t่ฆM›†7nค่ตŠ[[โV๋K$ Ž7>~๗bแR9?\ซ;!ซ=‚5แ'ฉ!z๏#๐ฺะำ%แn ?๚ฃฮ‘s)Z'Qf‘Vแ700๓ๆอรฒeห‘๘‡ลDDD”q‚€๖ํc๒ไษ(^ผ๘ืใ มD”Z ภDY„‘D‚;mขจUยg่v:๋‰|ตโ/ผ ไˆx}7ืm/๚†$˜ณฃNUด+˜7มฑนža žมkff†~๚aไศ‘ศ•+—ฮy๑๑๑ุฒe fฯžgฯž้๕DDDูYบuแแแz๕๊%:/""+Wฎฤ๙๓๑้“~ุ+๐๐ป/œภธ๗1๗ม็Ÿ‚D@N'kธึtEc ด.%zญ/8>4šีA{ปใ;_ฟC—sžzญˆ(ณHซ๐ซัhฐw๏^๑วx๘๐az/›ˆˆˆาIฮœ91rไH 4ฆฆ฿E)E!xฯCผ{ฬL”1e!ป๊VE cํถท>ุ_ัX+€ \}'Vœ‡FญOA.clนLŒ๏~ถฝz›์u5mฺ“&MBๅส•w๎9L›6 งOŸN๖ต‰ˆˆ่ŒŒŒะตkWŒ3..ฺ?๛ฟ๕๙sฬ˜1[ทn…RฉLึ๕%‚€หอ๋ขbNว/} @ฝ#็ า$}ยศา 5ฆฬƒ}ฅบขื๓ฝvaหภ…Zๅ`"Mธ}๔„[0๋ำdญ‹ˆ(ณHซ๐ |w|๊ิฉุพ};ิjuz.›ˆˆˆ คz๕๊˜:u*๊ึM๘7C0้‹˜( ้๋ZหซนพJฉ€+™เ‰‹ฑ่‹๎โไฺ๋ข๑ฦ—)†?ส•Lp,"^‰๒๛OโUxาŠ9;;รรร]ปv…L&ำ9๏ีซW˜={66nˆธธธ$ฏKDDD‰ณทท‡ปป; ++ซD็>|SงNล๕๋ื“uํJatiืวิ ~>}‡~ะšodn‰Jณ‘ทVCัู๋>ป‹iทม2&2ม๕j9‡+Ÿ’ต&"ขŒ.-รoll,ึฌYƒ™3gยืื7=—MDDD?€Bก@฿พ}1n8ญƒcp๋รy†`"J0Q’฿7Z5€ยJฉ€ใULqฟˆBt๎…ญwq๊/๑ทVฎœุWฟ:ฌŒ>ง๗฿ทะ๚ิๅDืabb‚~๚a๔่ั‰n๗UซVaม‚เ‚ˆˆ(”-[ใวGถm!$"""ฐ|๙rฬŸ?‰^ณbN[\hVG๋9ภƒCัโฤ%ผ‹Œา:'ฉ\ฺ็9๚]ุ๙5฿Fฯ ŽwดQ&—–แ<==1qโDœ:u*ฝ–LDDDDัขE1y๒dt์ุQ๋๏นเ˜pw?]A4C0‰`&สb–T-‹>%SซุaใO•Pุย<มqตFƒV'/ใจ๎X[ฏ^=L™25jิHt‡ยดiำ’}ทฅŒ hถ-&L˜€2eส$:๗ษ“'๘๓ฯ?ฑs็N‰ ๖ีฏŽๆ๙sk๗๕G฿ห7๑2L๛}"๐€+ทฐๆ้๋$฿QFฅ๘สš้ ฟ!!!˜?>-Z„ˆˆคwc"""ขฌAt์ุSฆL}ฬฯ—|๛ร%ฤชตฟŒ๛-eผ ฯ{มs/C0QvภL”ลธุYแ-๑าีTtม๘{ั9จTฺ๊Zษัญˆฦ—)Žœฦฺ๑x็๋w่zฮS๔ผy๓bธq่ป7ŒŒŒtฎ๏ษ“'˜>}:v์ุ•J•์๗EDDDฉcmmAƒมvvv:็i4์ปSงNลƒD็ิpศฃki=ทDDbึฝงุ๕๚ยโใŒ™[ขฮคyฐฉVO๔บฅ}žฃ•hป๏0ข”=ˆ2}รฏTฐ3ื~เ่ัฃ˜8q"nบ•K&""ขLภััใวGŸ>} —หตฦฟl }๛ิาx‘+C0Q๖ภL”…ศ2ดVe›ฏ๚ 5nGโ๊วœ๚๐ OCยซVรXr9lP?ทŠXš‹ž๛<4อN\„Wxd‚ใ2™ ปwว„ Pฐ`Ak วฒeหฐ`ม๐y~DDD?J‰%0aยt่ะ’๏ถqV`` ๆฯŸฅK—Šm6ฅ\ L(S\็๙/ร"pฃ?ž…„!Fฅ†ฝ‰ๅ์lP&_^์ชื7Jˆž}็*ŽM‚ุ ฿ัขo๘ิjธY+ะ2Nแ๗ใว˜6mึฌYƒ๘๘ฤ?ศ%""ข์กI“&๘๓ฯ?Qพ|yั๑เ˜œ}z"""สzฌญญ1z๔h :ฆฆโป@G๛cห™ี๘„ื0ถะฝ[#(ใ>?#8-CฐภL.ƒ้ปFEซTˆˆW2F0Qž๑๗MD$๚^บ…ำฟˆ……1|๘pX[[๋<๗ล‹˜6mถnสํž‰ˆˆ2 kkkธปปc่ะก‰L‹‹ร_…3fเ๛๗_›หeXTฅ,z8ะ๛ต‰(ฝ•หaƒถNyQ7ท=ŠXšรB.ƒT ึJ%FDโŠ_ zภ9_?ฤ้x๖น}รฏZฉ„น;๔ซ๊†Šyr่œ็ํํ)Sฆ`ำฆM:ŸลNDDDตjีย๔้ำQฃF sฝบ‡uG—ย(ฟfึบฟ|ค>KUํํะ,nTณทƒ“นฬๅ2@คR‰๗‘ัธŒ๏?โฌฏ"โ•zฟ%0Q&—T๔๏+๔y-Eq+Kฝฏ}๘/ฦธ'!a_5jิSงNEฅJ•tžUซVaฮœ9๘๘๑ฃฏKDDD†UถlYLž<ญZตJtห—/1u๊Tlบ๕k˜ †”pฦ˜าฎศaฌะ๋uฃŒL0ทr+ผp.#:ฮLD)Q.‡ F—rE‹นก๊๊ €๋~˜๐9๖ฝ๑I๔C’”„฿จวท๑Kัผ่ZW๗‡ณjต[ถlมไษ“๑ๆอ›$ืLDDDfff>|8FŽ KK๑ฯ5 6๎G๎์Fแ๊Žษ มฮฟ†็?“‚›ๅsฤ๐’EQ#WH“๘ž„„a๕ำW๘๛™ขyใQบ`&สฤ’Šฟถลฉฟฎรฮศฝ‹D๗"เbe‘่5ใิjx๚bี“W๘ว็๋–hŽŽŽ?~<~w้6ไ์ูณ˜2e .\ธ๒7FDDD'•JัฅKL˜0ฮฮฮ:็i4์ป“'Oฦใวฟ/fm‰!%œัฎ@^ุ(฿b ž‡†cs/lx€ข#ง!oญ†ข๓‰(นค‚€a%]0ฮญฌŒไzŸฏึhฐลŒปqAฑq ฦR~?^=‹าˆฤิพ=accฃs๎ห—/1iา$์ุฑ ?ข!"""UฉR3fฬ@:utฮ๑๒๒ยณ'แฃ๐e›M“loฌภด ฅ๐ซsd…฿๏๗๕ว๐kwq/(D๏s‰(q ภD™”\!C๓a5PNWrงพอ7ฯดฒหPอ!j:ไDIKุ›C&WโmdnใยG<…๚ฟA@วŽ1eสธธธ่\ฏฏ/fฯžีซW#&&&m฿,Œฃฃ#ฦŽ‹พ}๛Bกะ}GฏŸŸfอš…+V 66๖๋๑ๆfhวตrๅ„ซตl HQJ%>DEใnPฮ|๐รลoห/#sKT๒˜อLD)ฆJฐ r๔u-œ๊k๙เ‡ฎใCTtŠย๏‡หงกผ}“zuC“&MtฯUซฑaรL™2๏ฝK๕บ‰ˆˆ({311มะกC1fฬ๘๙๒๛วฅณฟŠ-ส5qMqvฑฒภบšQล.U๋~…฿/ฤฉ๗Ÿ’žLDษฦL” ษŒคh1ผฆ^๑WŒ€ฯWญใ[ๆฮฮฮ˜2e :u๊AวjตทoวิฉS๑๙sฝe\u๋ึลิฉSQฝz๕D็:u 'N„งงงึ˜D`,•@"ˆSฉ}พ�ฅ”`Q•ฒXผH’s5อOส _ธวš o๋ฎz…฿—lฦฯUสa๒ไษศ™3งฮ๙/_พฤ„ ฐs็ฮdฌ†ˆˆˆ(๙*Vฌˆ™3gข^ฝz:็<{๖ 8{๕$*ถ*ฎ_๛xŽฝ๕ชฃ|ปœhD+Uะ@ฉ’D~Ÿ๒ŠA‡3Wpี/0ษ๗GDษรL”ษคUM๔5d2๔๎&L@ž,X€๐๐๐ฟ#0ฅDืBXQญผฮ๑k~8๘๖n#4.rŠ[[ขAž\จ—ฦR้ืน*‰w๓ร๑โี๐8Wกd‡฿็ป7ย*23gฮฤฯ?ฌ{พZ7bาคI๐๑๑ัอ%ƒ‰‰ 1fฬXYY‰ฮQ*•Xตj๘ใจไฑจุฒ8ส5) 3“DฏญŒSม๖Y8ฺผ• w€Rkqpถฟ~‹sพ~x ฐ7Q b[ด-ur‹~!๏~Pšฟˆั]’(-0e"†ˆฟฅK—ฦŸ‰–-[๊œ+V`๖์ู๐๗๗O๑kQๆPชT)L:ญ[ทNtžงง'ฦ3gฮค๘ต‰Hฬอpกyไ6ี ๒ux$&฿~ˆ=^>ˆืฑA{;L+_5๓ไ๚~Ÿ8‚&‰๛„ฟ ฟ๗ฎฃ[ทn˜6m๒ๅหง๓œืฏ_cย„ ุพ}ป~o’ˆˆˆ(…*WฎŒYณfกvํฺ:็ฝ{ฃGฦษ“'aใh‘์,Siเ๊๒Ob;@‰(ฅ ณ๎=ม๒'//zŽDะถ@ฬชXฬอดฦ—?~‰กžw๔zD$Ž˜(“HV๋:Rz#ฎBกภ€เแแ9r่œw้า%Lœ8็ฮKู Qฆ$•Jัฝ{wLš4  ะ9/&&K—.ลฌYณ”ฒHหLDษ5ซbiŒ,ฅ7าอ€ z:ž…&พ+ •ย๙ง†hุc ำ+๚ฝ†นscฺดi่ัฃ‡ฮวๆh4lบ&L€ททw๒฿Q055ลศ‘#1jิ(˜››‹ฮ‰‰‰ม๙๓1kึ,DDD่‚ {ลโเึ[ุrๆaฒึTฺึ๋TAQ+‹วฃ”*t๘,๎'๏อ‘N ภD™@zว฿๒ๅหcฦŒhุPCVฦนsฑdษDFFฆ์…ˆˆˆ(ำsrrยคI“๐๋ฏฟB๚อถฉ฿ปs็<<`ข ,=ใoลŠ1sๆLิซWO็œ?bฺดiXณf โใลŸ@DDDู—ฝฝ=ฦ‡$A๎฿ฟ>|X๏ื`&"]U)‹Aล‹$8๖):œ„oTL‚ใR™ eบถƒUนษฟe฿=EฃG—๑เ&ช{jUซVลผy๓PญZ5็เ?ภชUซพ~hJDDD”‘4jิณgฯ†›››ฮ9๓ฦŒƒ—/_ฬๅ2\้ ~eญqฯูQฦ’D_ใKพw9 /ฮSิสื[ี‡™์QYฅั สมำš(•€‰2(™‘-†ี@นฆฎขใ็ทม้ฤ_ccc :cวŽ…ตตตฮy{๖์มฤ‰๑๔้S^€ˆˆˆฒFa๚๔้(_พผฮ9๑๑๑XฑbฆM›ฆ๗ภŒภD$ๆd“ŸPวั>มฑƒo? ํฉห Žษehณq$ytow๘… Rขผฯ34ztล>พ๘ลฤยํภ)t๏ื'N„•••๎5<‰ัฃGใ๎ป๚ฟ!""""ส™3'ฆL™‚พ}๛๊|ผทท7ฦ‡ํทฃจ•๎ดi#‰กๆq1ฦ"Fˆ6ั‚$5 TDิร#88`4ju‚q‰ เR๓บจ”ำ6ม๑.็<ฑ๓๕ปิฟIขl,๑ฏhั‘^๑ท|๙๒8x๐ fอšฅ3พ{๗ฝz๕ย/ฟย๘KDDDษr๘qิฏ_ณfอBttด่น\ŽกC‡โิฉShาค‰^ื‹ร๕cเsแ„่ธc•ŸPeย<(ฌmEว‰(๋‘I8ˆl[๘่ป็สeh9ข&ฬs็O๔zjฅ>N zฦ0ธŸ5€ฅ‘›ึฌฦผy๓tฦ฿ศศHLœ8ญZตb%""ขLม฿฿D็ฮ๑๚๕kั9NNNุผy3–-[†ย๖0’|NJVjิพ…ฺ;}qy]Dk่'ฉ ก*4มคdK”๎3‚$a’Rk4๐ ิ:ืมD|{j"J>`ข &=โฏ‘‘FŒ'N Aƒขs4 ถm†:u๊`บuP๗m,"""ขฤ„„„`ธqhฺด)<==uฮsssร๛1o<ุุุ$๛๚ŒภD๔- ศ$ฺ8G)U_็/๑ทLCToฝŽFฅ‚ฯ…8็—<๚#โแ-ญ9 ##4ึ๑wธqอ›7วดiำt~ †ˆˆˆ(ฃฺตk๊ืฏ;wŠŽKฅR 8๓็ฬั Žรษ5ืฑช฿>\ุ๚%~ซXื~ข8Zฅย๗ไฆ+ขิโEDHzฤ฿RฅJa฿พ}˜7olmล?๕๖๖F=ะตkWผz๕*%K'"""œ;w5ยดiำ%:็/งีซW/ูืf&ข/”M‚ุ๛…ฝ‰@ย๘๛…ฉๆ'jิ๐นpg‡vร%๐ป{ `+๒งึqu|n.˜‚WwˆพF๑nQ{๐8ญg฿ ม›ˆศิฟ ขlŽ˜่Jห๘๋่่ˆตkืbใฦศŸ?ฟ่œ>เ๗฿G—.]๘ฌ_"""2จณgฯขQฃF˜3gbccE็XYYa๖์ูุทoJ–ิ`แ{ŒภDูอ€` ๐9ซbЇ…ขsฝ๏๛b๗ŸgDใo“&Mpa_(๗A$๊š˜@([Wฎ\AำฆMฑx๑bจTฺฯ&"""สŠŽ=І bใฦกBีฯ!๘–๑ฑ8;ด*”+งuพ:>ทก3?ฎัปห5„ๆ›g ๏๖z—เK~D”2 ภD?ˆฬHŠๆ๎‰ฤ฿อท“›7oŽSงNกWฏ^พ๙a๙ญ๛๗ฃ^ฝz๘๋ฏฟ VซSณt"""ข ม˜1cะชU+ปwO็ผฆM›โไษ“่ป7$’ฤda&สพโีjฌ}๖:ล๑WกP`๒ไษุ7{๒:„‡iŸ\ก*nฆM›ยำำ3=Q†๖แร๔์ู๚๕C€…5„าฺกืแีSœ๋๔๚M๋๓้ค"๐Aท:Ÿ#0ผ ภ๖Woำๅ}e7~•‚ศภพฤ฿๒อ‰ฟ฿H2ZZZb๘๑pwwืนUb@@ฆNŠ•+WBฉิฮŒˆˆˆ่Gศ™3'&Mš„~๚A&“้œทy๓fŒ?๏ฝK๔zFๆ–จไ1yk5๗๕<ฯi#ขฬP"สผ,L˜;ท-KZŠŽ{Gโะฬsธ๔}‚;IŠบธ`ลิ)จm$@s๚(ญuฎสยฃ>…cษŽ]้ต|"""ขLฅ\นrX;n ฮbด‚ณ+ŽIŒั{B|๔H0$•กุ้ฐiิV๔ฺ-๏ล้%3๐๗ณื้ฑtขl‡˜ศภา*VฉRs็ฮE5tฮ9y๒$ฦŒƒ;w๎คfษDDDD้ฆmถ˜5kœuฮy๖์ฦŒƒ$z-F`ข์En,Cห5Qฆก‹่xพOJดผ“p%๎†เAp(‚cใเVิ5‹†ย฿W4€Fเ๑ฬs/]Kฯท@DDD”้XXXเเ€จ้๏#>A™ร‡Ÿฝฤๅ็/ ัyอLP1ง-ส็rภžmpฆh%ัSŸl^…{kๆ!YbQข€‰ (-โฏL&ร Aƒ0y๒dX[[‹ฮ‰ˆˆภ์ูณ1|D๋๘@ƒˆˆˆ(ฃศ—/ฆOŸŽฎ]ป๊|œE||</^Œ?aa"ด‡˜({HnตŒLูใoฆ{Š)ทคf‰DDDDY–Dp หฯhb$๗[bโฅ2lฎาRg~ผy%๎ฏ™ฯL”J ภD’๑ทpแย˜={6~๙gsฎ_ฟŽQฃFแย… ฉ]2‘ม‚€ž={bฺดipttิ9๏๒ๅห1bฎ]ำ}W#0Qึ–ž๑Wฉฆ~ˆ™๗ž๐ร"""ขDศ$ืญ‰>Nน ่k‰าŸไG/€(;H‹๘ฎ];œ|X็ผ๊ีซใ่ัฃ2dคRฉ่œธˆ0\Ÿ1>NˆŽ;V๙ U&ฬƒยฺ6MึND†“T x์๋^)Šฟฏ"ฃั๙์Uฬ`%"""J’RญมภSะๅu๘ษz+W)ั์์.˜_:*:^ผ[”}8 c‡("J๏&Jg2นอ‡ฅnิจQ8pเ€่8#0Qึ๘๊pqqมโ… ัจXQเู#hzมA@\ —V6๐•ส0็Ÿ๘๛๔yD*•†|;DDDDYR‘ฐาc ๊t‚ๆใ{ "s27‡`Ÿ งBุt๎FN˜ˆภภ@€D.g&J ภD้D&o็ๆโ๑๗ฆ8ณNวลa๙˜>}:"##ตฦ‰27}ใoซVญฐpแB,XP{ฒF6lุ€1cฦภฯฯ/=—NDDD”ํศd2 >“&M‚™™™่OOO 27n๐9—sŸŒ"ญ:‰ฮg&า0Q:HMอ“'fอš…ฎ]ป๊ผนs็0rไHบu+ญ–LDDD”กu่ะณgฯFtฮ9}๚4†Ž๛๗๏k1eN๚ฤ_###Œ3ใว‡B!บLœ8+Vฌเi‰ˆˆˆาQƒ ฐhั"/^\t฿฿cฦŒม๚๕๋0ฅ5`ข4–š๘ฐaC,Xฐ%J”=7.. ,ภ๔้ำ‘–ห&"""ส๐ .Œนs็ขM›6:็|๘ใฦร† ดฦ‰2}โo๙ฑ`ม๓ฯ:ฏw็ฮ :/^Lฏ%ั7๒ๅห‡y๓ๆกC‡ขใjตK—.ลฤ‰ฮL”†€‰าPJใฏ‘‘F˜ššŠž๛๙sŒ5 L๋eerน๎๎๎˜8q",,,D็จีjฌ^ฝ&L@PPย˜หL”9่๋ึญ‹%K–่"-lฺด ฃGฦงOŸาkษDDDD$B&“aไศ‘˜8qขฮฯพOŸ>!C†เ๑ใวŒภDi„˜(ค4.\๓็ฯGซVญt^{็ฮ3f ผฝฝำrษDDDD™VญZตฐ`ม”/_^็œkืฎมžžž Ž3elษฟa‘4hฆM›KKKันแแแ˜|8ฝ{—^ห%"""ขP(?~<ฦŽ น\.:gืฎ]6l>๚๛'~'๐ฦๅธืB L$‚˜(RฑpแB4kึL๔Fƒ5kึ`ย„ Hee9eส”มย… Qปvmsnบww๗_ฐc&ส’Šฟo๎๙bฯด3hTป).\ˆนs‹ฮ‹ล๔้ำ1{๖lฤลลฅ็’‰ˆˆˆ(ฺตk‡  _พ|ขใw๏ล Aƒp๕๚uF`ข`&Jก$ใ๏ฦ8ณ>amบ5,X€‚ Šžใ็็ฌ[ทN็V†DDDD$ฮยย“&M‚ปป;d2™่œL˜0+Wฎบ%,#0ั•œ๘{`๖E ๚}(<<กP\yŒ2RฉTtฮƒ0hะ \ธp!=—JDDDD–/_>,Zดmถ รX๑ธaโภL”`ขdะ'ๆฮ๓็ฯGวŽE็~ู๒yาคI Kฯeั\]]ฑhัขDท„พpแ† ‚{๗๎1ฅ“คโฏ๏ำ ิฒo_t|˜๛๖ํระกC๑๎ป๔Z&@ …&Lภุฑc!“ษดฦ5 /]†]#แิฌƒ่5m\ŽŒภ”1%AŸ๘[ณfM,]บnnnขs0z๔hlธ1=—LDDDD"LMM1iา$Œ1B๔C๘๐แ†Ž;w&?\=‡kำF2%SR๑7ศ+ํK๕Eีr5Dว•J%ๆฬ™ƒฉSง"666=—JDDDD@็ฮฑ`ม888ˆŽ{ไ(z๛บ-Dว);c&JDrใ/๔C๊ฏ\น‚!C†เึญ[้ท`""""JRวŽ1o<ไษ“Gt<>>sๆฬมดiำ –1ฅคโoดฏ ฝkŽAมEDว1|๘plูฒ%=—IDDDDLลŠฑbล TจPAtแ“'์*L+ีgฆ์Š˜H‡คโ๏ูทpvMXZZaฦŒ่฿ฟ?Aะšงัhฐfอxxx (((ฝ—MDDDDษPบti,Yฒ?๔“ฮ9€ปป;>1ฅBR๑!FPo"lอrŠ฿พ} ภตkืาq•DDDD”Q988`แย…่ิฉ“่ธP0†๏;ฅkyัqF`สŽ€‰DศไR4ZZ$‹/ฅK—ขN:ข๓BBBเแแUซVAร.DDDDŠ••ฆM›†Š~‘ž›6mJ๏eQ&TฉR%ฌ\นR๔๏7ฅFƒyžOpOm,z.#0e ภDIN}x๘-ฬ_€.]บˆฮ‰ลŸ‰9sๆ >>>=—KDDDDi,Wฎ\˜?>:w๎ฌsฮนs็0tิhXถ้ษLคCR๑7ฏEaด-[4>x๐๛๗วๅห—ำ{™DDDD”‰ๅฮK–,มฯ?ฌ5ฆิhฐ๒ม[\ W‰žหLู0ฉ\‚ๆCk$รห—-GฅJ•D็x{{ร๛๗๏Oว•Qz’ษd5j&Mšcc๑oŒ{{{c่จั,S›˜่;Iล฿Vฮhํ๚›h=t่ „ทo฿ฆ๗2‰ˆˆˆ( P(˜2e F ‰D’`Lฅัเ๏Ÿpึ?J๔G–แม฿‹)หbฆl/9๑ื>ช.\ˆ\นr‰ฯ9{ƒ ยใวำsฉDDDDd ญZตยโล‹แไไ$:‰ำฆใšy^ไญีPt#0e7)ฟ‹/ฦ๘๑ใ%‘.ฝz๕ยผy๓`mmเธJฃมฦื8๙1L๔g‘Phh(ฦŒƒีซWงB‰ˆˆˆ(C377วŒ30hะ ั็Gฉิ๘๓๒#ผ‘š‰žฯL™]JโoXXFމตkืj™DDDDDจ^ฝ:Vฏ^%J|=ฦLู0e Iล฿BItฏ5b๑๗้ำง8p ฮœ9“ %"""ขL!ฉ็Gฉิ˜w๛5žฤIDฯgฆฬ*%๑ืหห ๛๗ว๑ใว ตL""""ขฏ *„UซVกAƒ_%ื/ลƒu‹)ำbฆ,/ั๘  คE5ด. b๑๗๘๑ใ8p ^ฝz•ฮซ$"""ขฬจQฃFXพ|9 .ฌ5ฅRcูใธ&พี-#0e6)‰ฟWฏ^EŸ>}๐๐แCC-“ˆˆˆˆH‹••ๆฯŸ^ฝz}=ฦLY™๘ืั‰ฒˆคโoๅ\ DใฏFฃม๒ๅหัฎ];ฦ_""""า้๘๑ใhึฌฮž=ซ5f*•`P๑จhk*zn๎ชตQyย<(ฌlDว‰2’”ฤ฿={๖ M›6ŒฟDDDD๔ร…††ขo฿พ˜~mถe%"""ขLใแร‡hำฆ ๖ํเ๓3ปดCC>˜ฒ`ส2ฟ‚hUฉT˜6mz๔่ƒญ•ˆˆˆˆฒถ7n eห–ุฟ‚ใŒภ”่ฯ;‡VญZแส•+†\&Qช}๘]ปvลฒeห0SึมLYBา๑ทj95วท๑7$$}๚๔มฤ‰oฐตQ๖๐{t๎ .L๐,TF`สศ๔ฟทoGปvํ๐๒ๅKC.“ˆˆˆˆ(อDEEaศ!7nโใใ“Žภ=กdฯ!Œภ”ก๑ภ”้%?฿‹/ะฟœ>}ฺ0‹$"""ขlm๐เม˜5kLMMฟใ3)ฃั'j4,XฐใวGllฌWJDDDD”>บw๏Žล‹รฺฺ:๑gk4xธ~)ฎ_ยgS†ฤL™ZJโ๏๙๓็ัฏ_?<}๚ิ0‹$""""ะฒeK,_พy๓ๆzŒ˜2 }โoll,<<<ด๎n'""""ส 4h€5kึ @Œภ”i1Sฆ•’๘ปeหธปป#00ะ0‹$""""๚Fนrๅฐfอ”/_๋1F`๚ั๔‰ฟAAA4hถo฿nเUN™2e๐ื_ก|๙๒Œภ”)๑ภ”)%rjž ชีjLŸ>ฟ๖ใ/0ทo฿FซVญp๐เมฏว๘L`๚‘๔‰ฟฏ_ฟF๛๖ํ‰ˆˆˆ(หป{๗.ฺดiƒcวŽ}}&p#ฑg J๖ฬgS†รL™ŽT.Aำ$โoMงf_„‡‡ฃ˜0aโใใ ทP"""""๏฿ฟGงNฐlูฒฏว้Gะ'ผymฺดม™3g ผJ""""ขใปwุ่ฑ#6nฉ  #0e" ภ”ฉ|‰ฟ•’฿พ}‹_~๙kึฌ1"‰ˆˆˆˆ’…!C†`๔่ัˆ‹‹ภL†ฅO=v์ฺถm‹๛๗๏x•DDDDD?Vhh(~wฬ™3€˜2 >˜2 }ใ๏อ›7๑๛๏ฟใ๎ป[#‘พ:u๊„%K– GŽ๘L`Jr… -G$/nฺด C† AhhจWIDDDD”ฑ >3gฮ„T.วfฏ@็3)cฆLA*“ ้ไว฿ƒbภ€xฝแIDDDD”Bตjียš5kPดhQŒภ”~’-Œฌ1|Œ?๋]๊DDDDDู]ืฎ]ฑt้RXXY%—เแ๚ฅŒภ๔รp hส๐๔ฟ+WฎD็ฮ‰ˆˆˆ(ำธpแZตj…‹/เvะ”>’M$ๆ;vl‚-ส‰ˆˆˆˆุฒe :u๊„>>Il=%{ๆvะ๔ร๐`สะ๔‰ฟJฅSฆLมฬ™3กVซ ปP""""ข43gN,[ถ :tภ;)ํศ2ด^e'…8†Š๕๋ืx…DDDDD™GลŠฑn:+Q‚wS†ฤL–>๑744๎๎๎ุฐaƒAืHDDDD”ึŒ1cฦ 6 #0ฅ^rใodP ๚๖ํ‹C‡x…DDDDD™ณณ3๛oTซQƒ˜2`ส’Œฟšฃfฯ๑ื}๛๖ล๑ใว ปH""""ขt"FŒ้ำงรศศˆ˜R,ฉ๘๋dๅ‚Vฎ=๑ัฟ๖._พlเe^Xฝz5šทl‰อ^A8๎ช=้K^ทฤ๐ คl‹˜2ฉL‚ฆƒซกR๋"ฃ ใ๏ํทัปwoนsวฐ‹$""""2€.]บ`ษ’%ฐตตe&ฝ%7>ป={๖ฤฃG ผB""""ขฬฯยย‹/F๗=)ร่}KŸ๘{๘qดiำ†๑—ˆˆˆˆฒฌญ[ทขC‡๐๒๒‚ฉT‚พฮ9QษฮLtn๎ชตQyย<(ฌl ผJสˆ’=ฯ฿ภฯ?ฬ๘KDDDD”Bแแแ่ท/ฮŸnmัศัJ{’  dฯ!(๙ร/ฒ%`ส0๔‰ฟ›6mย/ฟ‚ทo฿v‘DDDDDv๚๔iดn7odฆdIn=บ:u๊„w๏x…DDDDDYK||žƒวˆ‰P*•^ฅฅN]บ ๎ฤน8-:๎๏vœž5มภซขฬŠ˜าTr๎•๘XกGx๑โ…มืGDDDD”]ตlูKVฏม?!ะ?]ฟ€+ gฮไ /้ W…่x~+gx ลำ ั๐ฯz""""ขฌ U›6h2m ฮวi ๎ย‰้ใ ฟ0สt€)อHe4\•Z# ่ีซ>|๘`๐๕ewตkืฦสฟืใhœ‰ฮ์๓.Mvgไ — Kg™่x~+g<็#fOgเ•Qzkุธ1ZอY…‹a*ญ1@่ษpไQ†_e* ภ”&ค2 šญ‰ -]EF?ว฿žแ่ืฏ‚ƒ๙AัRพ|yฌูฐ ็ev:#pะํซ8?q0#๐ Wศ0|ๅo0/,ˆŽ็ณ,‚;ฝฑxฮ2ฏŒˆˆˆˆˆ ฅๆOตัa๑:\ŽะNx€ˆ3phาpร/Œ2 `J5ฉL‚–ร~Bนๆ."ฃŸใ๏“ใ>pwwGTT”มืGDDDDD -Zk6nย-+'8ไ๎5œ?ุ€ไ Fญ้ “โฆ็ต( ฯ ฯฑzษ_^ZฅสUะyลfxFKดฦั็ล๑C ฟ0ส€)Uค2 ฺŒจทฆEDF?ว฿kปcธqˆ7๘๚ˆˆˆˆˆH\พ|๙ฐzF<อS\gpงฦ๖c6นB†ฑ๗…Q>ฅ่x๓B8ฟ๚6ฎูbเ•ัโVฆ,บฏูŽqrญ1@ฅฃุ;vแF0ฅ˜D*A๛1๕QฒQA‘Q?9ตภ้๕ื1u๊Th43""""ขŒ&GŽX๑ื:๘ญค3G>พฃ๚0ง#นB๕!ห':žฌ N.ฝ…wxeDDDDD๔ฃ+^=…*cญ1€๊๊ ์ี฿๐ ฃ ˜RD"• ใ๘ฦ(V/Ÿศจ€Z๙›ใภา3Xฐ`มืFDDDDDษgaa%ซV#ธ\]8ๆ้=ั‹8™ศ$j•j•Z็\#c9ฦo‰cด่ธฃiYเ‰ถHฏๅQWุูฝืƒ{0ีเ๚ilวเ๋ขŒ‹˜๔&‘JะebSธิษ#2* Fฆุ6๋ึฎ]k๐ต‘Œ1wษRฤืlก3วฟxˆ{0๋`nkŠยๅ๓ `™ศYภฆVฦJฤล*ๆ ฿๐บ๓o|D\ฬ็mžŒๅ˜ธiเ%zอ\&N80๛"{ิo…ˆˆˆˆˆ2   ๏ฆx ฑะHoร–กฝ—Ja]ุ9*ภชPQ˜ุๅ„ •A‰ศ>~๏ า๗ 0้E"• ๛”–(\หAdT@Uว†๘{๒nl฿พเk#""""ข”“ษd˜6gŒštิีฏŸเภเnŒภ฿ฐฮe*mKขt"ฐฐำ6๗ฝƒq๋฿งxp๚ฦฌ๎uฮัyฦ๙ฑgฺœ8t:ญ—LDDDDD™”cž<ฐๅ ษญตฦ๒;ฐipOHศ_ฟ9 ท่bฅ!‘ษt^3>2Ÿn]มห๐๑๚ล๔[<0%›D*AฯimP Z‘Q•rึร๒ฑ›q๐เAƒฏˆˆˆˆˆROL˜: 6ํz้Œภ๐~†}บd๛,@นfฎจฃ,sš้พR L%:fฏศ‡œฤ™ฃ็SปL"""""สb์sๅย€ญ‡๐Taซ5&ฟผŸˆhุ—ฉฌืu5jผOฤ5 ๕้Cญ–~`J‰T‚฿gถGสึ"ฃสูึฦยaแิฉS†^ฅฑแใ<ง`฿šX๚๎%๖๔๛ฑก!†]X!•Kะจ_T๙น!mฏำ(/ถM<Š งฎคํ…‰ˆˆˆˆ(หฐตณร ํ‡๑4gš_;ิ๋ฎฯ‹ภวwำฺd8 ภ”$‰T‚~s:ยฑ‚๖พ๒€€า–50gะJ\พ|ูเk#""""ข๔ั่0๎3 7ƒฃEวๅ^cื๏ํณ]$šญŽJญKค๙ตsศ๓`๓๘รธr๖Zš_›ˆˆˆˆˆฒ+kk q/อลู™:‘฿ใ๒ฤAzr?อฏM†มL‰’H%ธ  ์หˆ=หJ@ ำ*˜ึw n฿พm๐ตQ๚๊ัง/J ™ˆ[!ฑขใฦฝฑฝWlซRTี9๒)o๎๙ยM0โcU0ณ1c;ไ/™ ฦๆF:ฯณ’ๆภ–qวpโญ๔X6eA––ดใผ,uฮัจT๐ป{ฏ_@ุ›WPฦฦภฺุ6.%ซR X)&z^๐‹วธ0ฒขาk๙”Ž€I'‰T‚!‹ปรฎ”BdT@Qฃ ˜าk?~l๐ต‘atฺ่FOวํฐ8ัqSฟwฺุณuถˆภŽE์๐โ–ข!7< ทล“/–0˜›Yšb๒ถมˆตัyํ ๏p,๏ณ q1สด^6ea6ŽyะbวiฤIๅขใfoŸb]ืะจีZcR#๒ีiŠRฝ‡ยฬ1Ÿึ๘ซC;qcถGšฏ™าŸไG/€2&‰T‚aหz๊Œฟ…ฅe1ฎ๋Lฦ_""""ข,nื–Mธ็”ฑ0!ส>บm<…ตWfxี;บ‰ฦ_Ÿว~ุ8๒ฎ๎}จอญฬ๐วึa‰ฦ_ฐuฒ@™ฦEำrนDDDDD” ไชืBg€จฎ่ปf›่˜*.oŽ๏ร๙Qฝ๔๔ึxม&?รพlๅ4[+0i‘H%นข7ฌ‹หDFะ”ย˜Nำ๐๊ี+ƒฏˆˆˆˆˆ ๏ภ๎]8;a0ฬคขใ9๒เืM‡`lmkเ•Ž}ซYP๋x O(vO;ƒO^AZcŸใฏ;ข-’๕[ƒฬHฦDDDDDD฿“›™ฃP๓๖‰ฮัuญˆ๏ิ9'์อK\›1Q~พ ŽKd2i%-–JฦL HคŒ^ีฎ‚ึ˜yโ‹aTว?๑๎ปฐ:"""""๚QŽ:€ใc๚ข”‰๖฿ f๋ˆ[…ฉmฏฬ0\k€‘ฑ๖—dOฏป‰ ๗กZว-ฌฬ๑วึaˆฒฟ ˜js(l‡|ลRฟX"""""ส์หVE Ž ํญž5BŠVภ€uปt^+๔๕syก^/3ฒฐ‚m1ทTฏ• Kl_สไŒอPภ-7 ”q„C˜ู˜@"• 6*กŸย๑แEผ๎|€๏‹@จUŸฟ "‘J0๏ตw๏aV–๕ภkญ™aภpฦ”๓ADEA%ูžำฬญฅyH-ำvšถSห,I3;จ•ีถืืj‚[“ิส4SS1@T@ฮgๆผึzp;iอภใฌ๙|ฎ๋นd๗๓ึ๏มซ+gพฯs฿็Gั ฺœz‰HDฯƒใ›ง]๋ึๅ>ูt›๑—จ๚ใS?ฝ-^ซอ}ฆxMื>๑…;Š)g~*6ฌXึ0mศศุuยัgฬันภ(๊%"™ŒLmMTญZ๋ๆฯ‰ฅ&–ฮ|:ชW7œถ•NeEัk@ทœ๑นฯพ้บฦOืw๎๚ฒฯ›š ฃO๔ตฉ๑๚?ๆฦŸ่ƒว6–wาณี๚๒[๗a{ไŒฝ๛ไŸโ…k/ ๎y8๋;ธั‡Cเ›พ๔นœk๋ซ+c้ OG๙ aฦป ‹žSซ๖ฮŽ%ฮ#ป—ฤŸ๛3<บ๏ฺต้“F๗ฝŽ™t&ฝพ"f๎ีxํษqูอ็Gม€๊œำ‘ˆnkฤ%Ÿฟ*6nธƒ๏hฬำQw็ใฤ_oิ็XนชKฏ๘ย]ลg~: zํ#O9;v=่๐Hu*nฒ^qั}ุจxฬ‰Qตjy,|ไ˜๛฿wDีสeMžฟณ•t๎%;ๅŒ/ž“๒~๕๊/4–GŸ๘ฏฏM7๙๕หฌฮ €ป๔*D""๔Kึ‘*๊%ฝo!“ฉซ‹ต๓็D]mM๒ิใ6Ÿpแฅ1g?สฉปnœœฑาพV*joภyb๔แCโศณ๗^ป•ท่d*ป๎ป๎๑TDqำแo—Uโ’ฯ_UUUญ2ะŽใ…™QiqาMwลtQฮสฒž๑ูฉล๚Lขูเท)%=๛ฤŸJ๔?๔๑_๘#๑”yAงT$ r฿vฎฺP“3๖ใฏ฿ื?}qTฅ75/>๑_sfอkซ˜ปSAQAH€€-IคR‘*j jฆฎ6๊7ฝ2_]mMโ” ฆ>K๛it^i*๗4FDิmฺ3Vะฉค•บfgฑp;—H&โ๐/Ž‰—ัโ๐7Gq:ทn$ขtyE|๋ิk„ฟ@“^}๙ล˜๚ๅ“cX"7ˆุTXฒUแ๏‡u้?0บ๒g1โsgmO‹ญ"]—Žl&7ํTRุไ๙฿ทŸDIชฌแsSแoDDaq๎3ู้บด๐ุขl&™๚ฦ•& "Uฟ?ƒีืีฦ/O9.vY:ฟaฌ,•ˆ[>ึ๘ญเK็†ฝฺ้ฆๆใฃKฮqึธ8โฌq‘L5ฏ2›ษ6์๕‰HDง๗๚ฤฅง]55G 4o๎์ฦoพ<1†D๋?8š,,Š1|'†xzซืUjขzS๎บ›ฏ๗ƒธ<ำ'~yมorย฿ˆˆปwหธฆJ lQบถ&ชWฏl4–*๊]4~ทพฎ6~y๊qัw๑œ-†ฟๅ‡ๆŒUญZพ ณSYบ๗˜แq่้๛69Wตก&^jAผ๙ปฑjับHืgขดผ8*†๕Š=& ˆA๛๕k๒บˆˆ‚ฅใ;ง_๕๕๕;ชu ฬํีธ๛K'ลi๏พx+Yฺ‰ูlฌzํ•X๚ย3ฑ~แผHืึDq^ั}ฤุ่e„(ซ่ŸsI"™Š}พziฌ็ญX๖โ฿vเ]4ฏfSmฌZด.:wo$๐๑ปวำำัไม—GUe๎–;]{—ลn{๖อ_พ`M๋4 ไทl6ึฮŸ=๗lœํ๚ฑรcษ฿žh4V_W7ž|์K& ข๏ุƒrฦืฝ5w๛zeงทSv้Gžฝ$’‰œนy^ฬธใลX๑ฮฺœนลฏฏŒใ'~2าฑฎฺู/ฮš)ถสยนsโก๋ฏŠั฿๚a4๗k๗tu<๑รKcู‚๙9sE]ปลเใ&ฦจ3ฟEป6š+()}ฮ๛V<๑๕ำฃ๎๖ณฺ™ฒูˆ//‰{ําh|๗ฝw‰!c๛ลผ5{mSแoDฤุcGFiy๎๒ุocษ๖5 tห^z6†|๊”Fc;&ธ็ๆุธไญฎท๋AGD‘{5ซฏชŒUฏฝฒ=mา,N?it”๗้œ3—๗OK“แoaQa\uืล‘ฅ๙๐7"b๔‘Cbศุๆ฿๘W‰d2z๖๏อ†ฟk Jโ๓ท} ส™ซ]ฟ6๘ออ๑๔e็Eๅ๒ฅ9๓=F๎ƒŽl+vผuxzaค๋oญ“L&โศ/ํ฿dป9๗ฉˆƒN;g|๕โu๑๖์eี'ะq,๛๛฿ขjEใŸ!Šป๗Œ=ฟ๘ตH$ท.,้7FŸ}aDข๑‹‡ห_™ฟณฝญฒ“ €ก.=KcŸ็ฎม๗‡^wผ™&–+,*Œซ๏Fิ๗]ปล๚ษd"๖ิจึh่ z๎นo๔—ปTุฟZRิ%>M†ภห_z.~คHืไพ9;๘ธ‰‘*๊ดฝn‹%sWฤผrŸ ๏?ชOœpษก9หC7ง}โฤKโฒขœน—87jšุk )5kWวยG—3>ุ่“b๔ูF"™jQNzฤ—LŽnCF4žศfc๏๎iVูษภํะqฃsฦ๛jญ_น)fLy)ฒM=*>ƒcขGฟ๒œ๙ๅ ืฤ พึ๊}๙ํอ๛งฤฆฅ‹sฦ๗ย๙1Šข๋€!›ฝพ๗˜โเ฿ุ๕ รsๆ=๕X,๙_ZญWv{ทCM-ฯ<๋๑๙ฑny๎^X„ฟตฝW็ฬ%"๕๓สb๒๙7ฦน็3ัg`๗†น’.ข฿ศฑ~ลฆึmศ;‰d2๚Œ90g|ี?_ˆ}F w;ๅž‹ ;ว็o{ ๎>๋ฤXบ๐ญœ๙yฟป'†|๊ิ(,๛ะึ7‰D๔gX๑สฬVํฟฅพ๒^<{ฌ8๘ิ19sรzลi“?๏พบ,œ๙NฌXธ6๊j๊ฃฌ{I์:ผW ื?z๏ญษบ๕u้๘๓อ3ฃr]ำ๛4งr๙{1๋ๆŸฦ“~”๓P๎€๏ฮx${vFlXด0าต5ัฉkท่6dd์:แˆจ8๐HๆฎPดi้โ๘็น>ฒ™Lฮ}เv&™LD฿ม=rฦ็<๛vฮX*•ฺl๘[๗fi|œ""bแ+Kภ}๕ˆืŸZุ:yซจkท่o๗œ๑…๙Cผtอ7โ‹w>‹6O9ธXฑธ๑๒สฝkๆฬŽ>๛o4mะ๐ึm~+=q๛‹ัณ_yŒ:$w ๋D"b๗ั}c๗ั}[\/›๘ห-ืŸ^ุŠ]ษย?=]v{~๑‚œนข.ๅ1ไ๘“cศ๑'G6Žl&ษ‚ยœฝ~?ฌvใ๚x๑†+b๓wd์@–€ng :Dูฟ์-USYซ]—s๎—.=ตู๐ทvnI|œŸ4Œ-_˜ปฏzoIv๚qqึํDuy๏อ†ฟ‘HDืCs†ซV.kตพ[รปฏ-‹ฉW<C{ฦˆ bะ>ปF]ฃธsงH$‘ฎKวฦ5Uฑ|แšx๋ลล1๗๙wb2?k;N๕๊•1๛ึc๎฿}๖=0๚์;>สโ๎=#‘JE}uUT.[kๆพห_~>Vฝ๖ศิีถuด"p;“อdc้Uัodใ}ฏF4 ๆอ|ทู๋.œ๐รf็ŠหŠb๐พปๆŒ/{+w`€Uณ~]lxwaNoย‘1๗"›๙฿ทƒW/}/n8fk–=†๏™3พf๋฿๐๐ผU๑ผU1#^Šขโ‚(*)ŒD*ฺ้tิTึFบ>ณๅ"ญจvรบX๔ืGcั_ˆˆD2‰d"ฒ™LฃŸำศ?–€n‡ๆ=๗•ั‡‰žห›8{ห๖9zX๔่ื๘ฺMkซc๑œ•T่`ฒูXโ฿r†{๏ณTŒ?t›J;้ฬH—4šL:Vใ๏TogชญฎkชbรสMQนพZ๘ |$d3้ศิื ;p;4ลล9K†•u+Ž#พ4.R[๗ฏดbhฯ8๔Œrฦ฿œ๙Nl\]น]}วขง‹L]]ฃฑD2{}๙โ(้wซjํ~ไฟวใOฮ_ฦ์X3gึv๕ ๙NUฎซŽ—47g|๏#‡ฦ'ฮEฉี้3จ{œ๘รฃKฯาFใ๕u้xแมๆฒjภGำ๊9ณcษs3rฦปใฟ{}tuที้ศั1๎WE"•๛sองFฆพ~{[€ผ&nงžเีX๙๎บœ๑}vฏ8m๒'bทQอ?a_P˜Š1G3~๘ษจฺ3gฅ?ฬ‰wf-mี~€<—อฦฟ๙ฟQ_ป’P฿ฑลa?ƒ}b””6qqDู.bŸ๓พป๒gQิต[ฮ๒Wžท]kw y'ูถn‚m3๊A1๑Š#ฃ 0๗ษ๘๚ฺtฬ๛๛ข˜7๓X๙ฮฺจฏหD็๎%Q1ผW ?pทจึซษšKๆฌˆ)—16ญฉฺัํyhฯณพ{}aณ๓y+–ฝ|ฌ_8/2ต5ัฉGฏ่1|t๔ฺ{\t*๏ึไ55๋ึฤ_/9'Vฝ๖ส้๒‰ธ›p๒๑‰sวG"™ุ๎ZkSฏx4–ฬ]ู Qฒ  ๖ฟ๔1่“Ÿi•z้š๊˜๙ร๏ฤ=ุ*๕ ฿ €๓ภ๘ฯŒŽฃพr`lse Vว๔=‹^_ŠQชธ$๖๛ฯ๏ฦOฒ]u๊6nˆ๖X๘ศญิไ?pž<ถ_uฮัTŸญบ.“ษฦ?f๙ๆb๒;จ; ฃI$“1์ค3bิ™็Gq๗ž[}๊7fล+๕ƒX๒๓; ;ศ_เ$ŠสปG2•Š๚ชสจ\ฑ4ึพ๙z,{๑oฑโŸ๚ชสถnฺ-0;U"™ŒdAaD2ู๚บศิืทuK7ภy"ูึ ะ:ภyB 'ภyB 'ภyB 'ภyB 'ภyB 'ภyB 'ภyB 'ภyB 'ภ์ร† ‹ŠŠŠถn๒š€ุ๊cว๋ืฏoใฮ๒ร Aƒโส+ฏl๘|๗wG6›ภNf h ]+--‹/พ8^xแ…˜2eJœ|๒ษ1t่ะ(++k#"RฉTt้า%๖ุc๘ยพ฿3gฮŒฏ๋QZZฺ†wะ%‰ธ๒ส+cภ€๑๖oว๗พ๗ฝ6๎ :&0ะnํตื^๑๐รว๕ื_ƒŽD"ั0W__ซWฏŽ%K–ฤชUซ"“ษไ\?bฤˆ๘้O<๒H์ฟ;ณu€ผr๒ษ'ว้งŸ๐๙ส+ฏŒ ดaGะq €€v้ ƒŠ้ำงวแ‡nุฐ!๎ป๏พ8๋ฌณbฟ๖‹#Fฤศ‘#cไศ‘qศ!‡ฤอ7฿้tบQD"|p<๘เƒq๑วทลญดk๛๗ซฎบชaฆ{๏ฝ7ฆL™าฦ]@วe` 4hPz๋ญ1x๐เˆˆศfณq๛ํทว๕ื_ฏฝ๖Zฮ๙6lˆ•+Wฦ3ฯ<ฯ?|๚ืฟŽ‚‚ฦดห.ปฤญท'žxb<๔ำ;ๅ>€ํ—H$ขฐฐ0Š‹‹ฃฌฌ,บvํบu‹๎ปว#<าไ5ฉT*v฿}๗ุmทข[ทn‘ษdbบuฑx๑โXดhQิึึ๎ไปh฿ฎธโŠ6lXDD,Yฒ$.ฟ๒&Wav0ะ๎\yๅ•1bฤˆˆˆHงำqใ7ฦๅ—_•••[ผ๖–[n‰1cฦฤ\3ืซWฏธ๚๋ใศ#ŒM›6ตz฿@๋๘๙ฯฝz๕Š=zD๗๎ฃ[ทnัฅK—(++‹โโโ(,,ŒD"ำฆM‹SN9ฅแบŠŠŠ8๓ฬ3ใค“NŠQฃFEYYYDผPi"‘ˆชชช˜?~๑Œ)Sฆฤ์ูณ๊O<1พ๔ฅ/5|พ๚๊ซc๎นmุ‘u8‡รแh/ว˜1cฒUUUูd2™l&“ษฎ_ฟ>{ย 'ดจฦ{๏ญฎฎฮ6%“ษdฯ:๋ฌ6ฟO‡รแp8‡รั๔qาI'5๙฿๒M™:ujรugœqF๖ญทj๑ตkืฎอ^~๙ๅูT*ีๆ๗Q=๚๖ํ›}๕ีWฮฆOŸž-((htฮwัไ฿๏wูๆ;‡ร‘ฏ‡=€€vๅ“Ÿdฃ}|‰D$‰่าฅKL›6-๖w฿-ึx๕ืใอ7฿lr.‘Hฤg?๛ูV๋h[‰D"ฎพ๚๊ธ๖cะ A‘อfc๙๑ศ#ฤ}๗๗w_TUU5บฎผผ<ฎบ๊ชx้ฅ—ฆฑI“&ลจQฃ""bลŠq๙ๅ—G}}}w€€veฬ˜1อ๒ฅจจจษฅU]]],\ธฐู๙ฝ๖ฺ+:w๎ผญ-;ะ๗฿kืฎm8ถไฒห.‹๏~๗ป‘L&#›อฦŸ็8๖ุcc๏ฝ๗ŽO~๒“1qโฤ˜8qbqฤ๑๊ซฏๆ\ฟ๗{วg>๓™p'ํฑว็ž{nร็kฏฝ6fอšี†ฐ0ะฎ๔่ัฃU๊lุฐกูนฎ]ปFYYYlธฑUพ h]#FŒh๘๓{์งvZวGฮyป๎บkœxโ‰๑[ฟ“'OŽkฎน&jjjrฮ}๎น็โข‹.Š?๑‘Jฅอ{๎น1sๆฬ˜3gฮ{+-- &lํ-ต‰8 ๎ป๏พื‡๕่ั#&Ož………๑ง?)nบ้ฆั"ฐ ภ@^)))ู๎™L&2™L+t์ห—/o๔็ชชช8๛์ณs‚ฝ๖ฺ+ŠŠŠ""โ๊ซฏŽ๏}๏{›ญ๛ฤOฤห/ฟใฦk4~ะAละกCท”4(~๛฿ว{์ฑ5ทำfชชชโ๛฿~pร q้ฅ—ถ๘บo๛1fฬ˜ˆˆXณfMLš4)jkkwP—ภึฒ4ะฎ๖ทฟmv.“ษดส[ปkืฎ๕๖/ด#ณgฯŽ ไŒw๋ึ-""z่กธๆškถXงพพ>^|๑ล&็Z๊qฤํ&xฺT*ว|รผ[rไ‘Gฦืพ๖ต†ฯ?๑›;ฺ†hWฆL™<๒HฮxMMMqว๑Ÿ๙Ÿsๆฬ‰ชชชํฎ์ฝ{๗Ž~๚59WSSื^{mิีีตจVSArDฤเมƒทxmeeeิืืท่{>J–/_้tz‹็uํฺ5&Ožลลล1cฦŒธ๑ฦwt{ภVฒ4ะฎlฺด)ฮ8ใŒธํถbศ! ฟx๘๕ฏ๗฿TWWoฑฦฐaรโ„Nhvฯskต ดฑ'žx"ž{๎นŸฟfอš&ว{๔่ฑลk๏น็ž(--ำO?= ‰Dขล฿–.ป์ฒmƒsษ%—ฤ6lˆห.ปฬรณ๐$€ค   Š‹‹ฃดด4บvํ๓ๆอ์นฝ{๗Ž=zDAAATWWว๊ีซc๕๊ี-z ปฃYนre๑QVV้t:‰ฤVาa๘๑ัฉSง&็ึฎ]ำงOoฅN€ถึิ B›ำผeee-บ–[n‰[oฝ5JJJถ๊{Reeๅฯ๙ท๛ทธ่ข‹>฿pร ๑์ณฯ๎ศถ€m$€Vpูe—Eฏ^ฝขgฯžัณgฯ่ฝ{t๋ึ-สหหฃฌฌ,JJJTฐ1cฦฤiง๘วc๐เมQVV‰D"2™Llุฐ!,XO>๙d{๏ฝ๑๓ฯทม}ดmฺดi›ฎ;๑ฤ#™lz'Œ;๎ธ#ๆฯŸฟ=m!/ฟrซิ)**j๑นูlถEกj{QVVื^{mC์ณฯฦO~๒“6๎ hŽถCงNb๖์ู1t่ะ-ž[YY{๎นg,Xฐ z๖์—_~yœsฮ9M>EžJฅขGัฃG;vlœ๙q๗wวe—]ห–-ทาaŒ7.Ž9ๆ˜&็ๆฮื]wN๎ุQjjjโฝ๗k•Z๗Wฉ^xa|๐มQUU—]vYlุฐกปšำqซฺศ๐แรใึ[o &4Œฅำ้XดhQฌZต*2™L์ฑว‚แN:ล—พ๔ฅชซซ[ฅV{ูฯทตpภqษ%—4|๙ฯ3fฬhป†€-jzํC Ejjjbุฐa‘Nง[ดWoEEEๆ7ฟiซชชโฆ›nŠƒ:(๖sฯุใ€ˆqใฦลดiำrฎ?์ฐรโผ๓ฮk๕๛่ŠŠŠโŒ3ฮˆO๚ำ9s555qแ…ฦ๏๛6่ h:bฉSง˜็œ•+WฦE]wuWซ|'@พธเ‚ โใxDDิึึฦwฟ๛XณfMwl‰Zม?๑†?ฯš5+?๐8่ ƒSPPŸ๘ฤ'""โํท฿Ž“O>9^|๑ลfkฎ]ป6๎ผ๓ฮœธจจ(Fีขพฮ>๛์๘ีฏ~ียปh[ตตต๑ญo}+xเ๘สWพ7nฆ:wyg”——Gฯž=ฃ[ทnัณgฯ่ำงO“O๋?๘ใ๑๏|'^xแ…ํm ฏ์ณฯ>๑๏|งแ๓ฏ~๕ซxไ‘Gฺฐ# ฅภะส2™L<๑ฤMภ๏๏Auแ…n6ภ3ฯ<ูl6'ผ:thF]]]ณื–••ล%—\………p;฿}žz๊ฉ1mฺดx๐มท๊๚ฑcวฦSO=ีไพjํฺต๑๐รว๗พ๗ฝx๋ญทถฉ_€|6y๒ไู่ณgDDlฺด)ฦO<๑ฤVื9rd“ใGuTณ๕?๐ญเ €`4hPฮุ!๎ฝ๗ำงOoQE‹ลฦฃK—.ฦ+**ขผผ—••ล„ Z๕ป๛๖ํ}๛๖mr๎Œ3ฮˆ;๏ผณUฟ:0์D™L&nพ๙ๆŸฟiำฆจฌฌฬ €KKKฃs็ฮ› €ซชชโิSOซฏพ:ฦEEE๗ฮ๔๛฿>fฬ˜ฑีือš5+พ๘ล/ฦ๘๑ใฝี›H$ขขข"ฦ‡vXC(^PP}๚๔‰o~๓›๑™ฯ|&&MšSงNmญ: ~๚ลƒ>๛ํท_[ทาbuuuฑhัขธ๋ฎปฺบ •€`'š7o^<๓->?NG:ฮ/((hั›ฎฯ=๗\}๔ััทo฿vฟ๓ฮ;|ํ๔้ำ7๛v๕„ โบ๋ฎ‹}์cฦwyg 6,ฎนๆšศfณะquิQํ*x;ž‹/พ8๎น็ž†Ÿ?+++cเภ-ฺบhKตGฉT*gn๕๊ีฑpแย&ฏ๓๖/l0์DณfอŠชชชํฎ“L&[ผทo6›ฅK—n๗wๆƒgžy&&Nœ๗฿xเๆ โชซฎŠd2฿๗จC =ซฉฉ‰L&ษdฒญ[ู*•••MŽ๏ฟUทขข"^{ํตฺ่ตkฮ๘ว8๓ฬ3ทซ>ะ40์Dอ=ผต‰D๘ฟ๑mฑx๑โ๘ๆ7ฟ=๖X็ฬ_~๙ๅฑpแยธใŽ;ฺ ; =ป็ž{ขWฏ^qฦgฤ๎ป๏‰Dขญ[j‘+ฎธขษีง2™ฬvี๕ูlvป๋M๓›cุ‰ึฏ_฿*u‰Dป{ขฃไ้งŸŽ฿๖ทqฺiงๅฬฅRฉ˜ทC๎ฏ=š6mZDDผ๖1lุฐ<Š‹‹›<์ุฑ1kึฌ๘๋_ฺhรn€m#€=nปํถญช5lุฐ6lXร็UซVล๐แรท๘piพ๛้OบMa๘.ป์’sg?๛ู;vlผ๒ส+ญิt<`ศSฅฅฅ1iาคvตDYฟ~โ+_๙J{๏ฝ๑ฤO4š;ๆ˜cโCi๖ฺO๚ำq๐มวŒ3Z}ผEœt:ูlถล๕ฺš๒T6›mWแ๏‰D”••ๅŒ;vณื%“ษุw฿}ท*๎น๓f็WญZ•๓&2ะถ๎ฟXธpaิีีE]]]ิึึๆ3›อFQQQรQXXุ๐ฯยยย˜>}zDDœuึYqศ!‡4ิ๚ื:ตตต‘Jฅrj}p|๘mเŽ์ข‹.ŠใŽ;.ึฏ_kืฎ5kึฤ๊ีซcเภ‘อf‰DขแH&“‘L&ฃ   RฉTฤ๘๑ใ๚v @žชชชŠณฮ:+&Ož๛๎ปoคRฉถnฉE{์ฑ&C–„ู………[๕]}๚๔ู์๋ฏฟพU๕€cิจQ‘Nง#“ษD&“i›๒ฏaใฟlด็ž{6ิiIญ๊liEกŽf๔่ัQWWท]ั&‰V์:.0ไฑ3fฤก‡๛๗ขขขถnงEๆฮไ๘ชUซbบuQ^^์ตฏฝ๖Z‹ฟงจจ(ธูsžz๊ฉืvžชชชŸ๛A \0Y]]ฝUตา้tคำ้_ำQิิิlw [๐@๋@žซฏฏ… ถum๖์ู› Ÿ{๎น๘ห_าโzŒ4;ฟhัขœ}ˆ>๊ฌSด ฯ?|,[ถ,g<›อฦ /ผ_๙สWขฒฒฒล๕Ž:๊จ())irฎบบ:ฆL™+Vฌุๆ~ฺ‚vขีซWทu ํึาฅKใ{๏m46w๎๘๒—ฟ๘วใŸg‹k•””ฤพ๐…f็฿}๗๘ๅ/นอฝด0์๛๗orผขขbซ๊๔๊ี+บu๋–3žNงฃธธx[Zkื~๒“Ÿ4Zฮz๘๐แqุa‡m๕฿ลy็๛๏ฟ“s555๑ํo;{๏ฝํi M$""ึM@{wํตืFQQQt้า%v฿}๗8๚่ฃ#™ฬ}ฮjํฺต๑ไ“Oฦ{๏ฝ7nŒบบบธ์ฒห๓ƒ Š‹‹ฃ{๗๎1bฤˆ?~|“฿๙ฦoฤK/ฝ+WฎŒชชชHงำ1iาคr%'œpBuื]QVVึ06kึฌธ๖ฺkc๚๔้Q]]ฝู๋O;ํดธ๙ๆ›ฃดด4g.“ษฤฅ—^ื_}ซ๗ ฐ3€`;t๊ิ)fฯžC‡ๆ=๖X}๔ัqเฦณฯ>‰Db›k}๋_Ÿ็|}{q๚้งว/๙ห(//o4ส+ฏฤ<?xฬ;7ึญ[้t: c๘๐แq๖ูgวน็žEEE95๋๊๊bาคIquืํฌhumภึบ๋ฎปbษ’%๑“Ÿ$๖ุc†@wฬ˜11fฬ˜ธ๒ส+cอš5ฑrๅสจฎฎŽฒฒฒุmทš ~ืฎ]6lˆo}๋[1u๊ิ}+ญสภะ ึฏ_๕๕๕9G]]]ิีีEaaaFAAAร? "•JEืฎ]ีZทn]ณuฒูl“u>จีฅK—6๚hฝz๕Š‹.บ(พๅ/Gyyy“๏ๆTUUลิฉSใฺkฏy๓ๆํ .v0ด‚ŠŠŠ†ฐ6N7™L&2™L$“ษH&“‘Jฅ"•J5 n—,Yาจึ.ป์าlญl6จฮฟึZผxq ดญฤ็>๗น8แ„b๏ฝ๗Žฮ;Guuu7œณaร†(++‹t:๓็ฯ?แq๗wวK/ฝิ†ด.07’ษd์ถn1rไศAR#Z๔cghpfœyํ98HH†NQบO/U€MฅUIYSB$M‹7%BT)m3๚ฝ#…=๕Gไฮ๔ฝิ๕ใษฦคำผHล;ถtบžดyณๅต†ฐ\นแฐขฟ&ดPษใปvีๆวใˆึ๔ๆหๆ๖๑;:!ศ-V%ซ8‹1)Aม:ุEAœF;E[DG?F‚6ฦAw+ี9šศ-ฝ"}๓Aๆ็๎7ฺแไฯีวยหBย„ล๏ฟ฿มภขภ˜ฤย"หฦดำyฬmิq๊พs๗๊7I๗ลฏ8)ฑ!p1f-!7Y6X:๒;ุ:‹=K8=;‰2ภ5’*ง.!!ง&Ÿ ๖ € ๒b๊ๆb๓+z่ทึ;ชะะีKอˆฯ๏ห[หษฬ<ษpะ๕ษfึฮ˜ฤีž่๘฿5๓k๋บ๖b๚ฐ ณฐ*$!B) #Œ,j'7.ฌ*.๊,ป*ฆ-% +ต3'i`!Z $Rเ4๒ำ๘ั่ฦ๎Tแๆ฿ทุผฺืึDุmืุณูLู˜฿ณใ2฿›้วใ!๐A้๘b๏ล๖ O:‡ญ7ฒ!6!#F%J#'ึ"'7!?%3] cน AP ๏๗pำ๑6๙|์๓๓็~์Nไทๅuแแ2เ๎(เJ{แi้ไ?เe้๑ไ<๎O์ ๔ ๔ล๛น๚๏@ h g๋เh ฺฆ #‡NI ]•› .าF พ๛&๗ใ๚ห๔Q๖n๒ต๑.๏F๎”๊’ํžๅษ์กใt๋๔ไำ๋i่B๎"ํ{๑๓ู๔๏๚๘˜ใ๛๙Œ! )ๅ„‹8… ่1 ;_ ูต)7ด — ศ R a {ฎ๚ ค๘ํิ๓;ะ๐.•๏ุ๚s๏M๘H๐๔๓ท๑5๖๎๐M๙ํ๒ฦ๛ธ๕!ž๗ญ™๚์[kม๎ๅŽย6Š qP ภโ ้ S ‡๋dฦBj^ใ๛2x๚~c๚ิุ๙h3๙ฝ๛ำ๗๚€๖‡๘$๗e๙R๗b๚;๖๛๗๚ไฃะฦนŠŒ‰ L ษ๛ Rc Œ$ .@–`ข?zbฦ็ฝ„๛๘W๙'๕๊๕๓ี๕\๐๊๙ ๎j๏๋˜๓H๙^Vจ}“Q ไฒ ู˜ะพ หป +– œSqฯท ลf ฟ๚๛ะ๚๖๋๑็๘๏๐ผ๓1๓b๏t๕Yํ0๗*ํ๖๘w๎‡๚ ๑‰๓Y*๔U#๖(๘ˆC๚๒y4ฑbN ( 9ล ^qฅiๆ คr r๏. ผU ;๘๋ ๖๚e๕ร ๕ไM๔ฝ๛๛๒ž๗แ๑๗๒B๒้๎๓ร๋๑๒ฃ๊๓๋ฒ๔A์ศ๘ว๎[T๓žI๙; ] 3ฟ-฿„= ƒ/ ์ ‘ ๅ  ีv ๗ค๕เVฒL oน+๘๚ื๓ฌง๐/๛d๎•๖ๅ์6๒)๋J๏๋˜๎W๐๏ธ๕บ๏ฺ๚8๐[ๆ๐ J๒„A๔zก๗C๛๎๙L P 3 Bะ gืƒy์ :‹že sz p3๗ค๒–M๑“๒มฦ๒—๚๒ร๗{๒L๕8๓(๓]๔k๑Q๖ึ๐ี๗Z๐p๚t๐!๒[๔‰๖"E๙˜5| ~ฆ LZ h ษ N } ๊ €9’™0ฏ  "n ข ฿๏่๙Bฌ๕ีh๒z๑๒m๚K๕๗a๖ุ๔ค๖ฐ๒ท๗n๑“๙w๐ไ๚๐Š๛`๑?,๔๕G๘a“ณ ฐ๏ ำn ฟq๏ Z ู1 H  r ป ๛wJ๗$`wธ๛sฏ๚โL๙,˜๗3J๖ ๛!๕พ๘๔"๖๘๓c๔๔๐๓ฟ๓p๔๔ท๕j๘(๗ฌ๘๓3๚`ฉ &ฯ I4 Qใ ัฌ ฐDŒ qฺ ซณ 15 =Œ ฉบ๚ซไไžw#ท๙6๕ฯ๐๑ศ๚‚๑ิ๘ฬ๒ญ๖ผ๔8๕๘๗๔ง๛โ๓์๕๘P๘i๚{8`XนcพEผๆั0;ฒ–ฝ˜xโ โโ B m ๏เ๚ั๙w]๘ล๛y๗X๚l๖z๙ ๕b๙Œ๔$๙‚๔l๘}๖ป๘U๙h๙[๚Mฮ๚โ๚ฤl๛๎๙<(‹ Qฐ 38ฉ,N M ฐ \ๆบ^ภ*—ืT๓๛FF๙ ๖aฟ๒4๑G๑ไ๎๒ณ-๕•ฮ๗ณ{๚ษ.ผ6amq9๚B๚ะ๛ํฏ't S 61*Uอ 23 ?ช๑lฆ v๛ ด๙ฅ๙…๚Sš๛#ค๛ํ’๚Q๙๖]๗ใ๖ˆพ๕Eน๖&บ๘ถู๛2น*า'ฬc๏m t๛ฑ ๙ฆo๙ดQ๙๔!๙โ-๙T็๙์W๛ฃ3)๓52X๒‘๚H๘‡๖‰0๖Lบ๗›ฤ๙‹๛ฃ'VŽ„sKึๆฆƒ:ไๆyผ;ฯจ—t๑๛&d๚^๙ธž๘k๘ƒร๗U)๘๛แ๘็๚k๙_๙%๚?๘J๛5๘๑ ๙๚ๅ๛]t฿ฦ ”Eบ &  Nฃ ฆwฦ'๓Zq~,๒ืาัไ๒^~๛v ๚aส๘จ๛๖๑๚’๕'๚H๕๙น๕๛๗ฆ๖%๘๒๗i๘พ๙ซ๘9ศ๙ฆ\๛‹&ู,ฤpๅ฿ฏ‰อ^‹@หlลŠ— ฆโ F— o# …ุทผG๛ชภ๘2๙†๖d๖๕E๕ฌ๕๕ฑ๖ฒ๕“๗y๖ธ๗x๖ฯ๗K๗=๘X๙ุ๘F๛ู๙๒M๛ใญ9๐ภิฦธต I K 4 ” w F a š ‡ wEb‡SXoฬ๛Cฑ๚.๙ฌ๛ี๗n๙Š๖5๗&๕„๔4๔ๅ๑ฒ๓>๐ ๔๐’๕=๑’๗ฆ๓ว๙้๖น๛<๚„าป$‡‚5lœ๓ฤ ` ส ู \ ,   ง Z 5 ๕ – ] >Fiyฦ pr๙๗ห๖๔๑๔*๒3๔จ๑ฬ๓๑U๓4๑F๓D๒๔๔e๕ศ๕&๗๗<๙๙R๛Ž๛งฃั„y4/ร  s ๕ mO :| + %ไ ๘ ๆ 4 pฅrH$ฒ4;˜ƒ๚ส๙ฤ๗๗๕ ๕๖๒๓๑‚๓แ๐ึ๓$๑„๔D๒=๕๔$๖$๖เ๗œ๘I๚ƒ๛‚ฤ๑แM*U 3k ส D †โ ƒต r ส ห $ ;ฌ้้ิ:rJ๐W๚๛•๗่๙M๕(๘ ๔บ๖\๓c๕;๒๓.๑ํ๒Š๑ ๓m๓ฆ๔ุ๕d๗>๘๙ั๚ฆ†™4์ค๛xณ ค: ˆผ _ : 1 ฌ t T 1  2 } ด ทK U]ัTJ‰t๛ ๛!๘๙๗W๕ฯ๕c๓ร๔_๒o๔Œ๑s๔‡๑›๔a๒๕Ÿ๓E๖†๕๓๗๐๗ช๙s๚*๛ฯ#า:x๕šzš ŒŽ Ÿ ้ X ฃ ข7 ๎ ฝ 6 P z ชˆฅง\Ž2ฑZ ๛~‚๘‹๛ ๖ซ๙ั๓„๗๒˜๕ƒ๒่๔ฝ๒฿๔F๓๕ญ๔—๕œ๖ ๖ฦ๘พ๘ฅ๚c๛ฒใƒ^{WL‡xง `๘ ณ›Y ธช ๔ ๕ ๊ jW@๘๛ทัซ:…y๚ศฯ๘๊๙ฺ๖1๘…๕5๘3๕7๙๒๔็๙J๔ ๙‹๓ต๗ฃ๓๗2๕q๗฿๗ซ๘ฦ๚๚™ู๚ทg'๑em็ ิ| E ค h B _ a z& y ม wa7BGฮ‘ใ?‹๛F/๙ˆฉ๗๗F๖อ๚a๕ฎ๗`๕๖฿๕z๕T๖h๕ฬ๖L๖Z๗น๘ฌ๘™๛I๛mู็ฺ ๋\เ9 yถ ้บ ๏ Œ ˜ ] ้ U’ a jเm†Cณฐ™น๛๛#๚ี๚h๘0๙ผ๖ถ๗ํ๕๗๖-๗์๖ฟ๗๘6๗j๙พ๕๚?๕๛ี๖แ฿๙Zฮ"ะเภึ^ฮแ) rb U ร ใ ด ฺ}0ฏศุxฯ‚Xฬg“Jo+๛๙r๙F๖ฮ๗๓’๖๐๒[๖๔‰๖๖ฑ๖ุ๗d๗๋๘ำ๘l๙๛๚ ๛šิ๖sีˆ`ไึ์๗ ˆ $ % B  z I $ ถ L ุ ฅฅ…๙ŠXึ ร๚ม๙เ๘D๘|๗!๗๙๔q๖k๒๖๐&๖&๐$๗R๐]๘฿๑ ๙-๔`๙Ÿ๖๙๙ˆ๙&๛ห8ซฦหอP5 :ก ๗ Z& Wท ำ๖ ด }K ฅ ฑฎ Tอ‹ƒEpUV๚่๛๏๖๚O๓(๚ฌ๐์๘อ๏๗ส๏ื๔‘๏ ๔j๏8๕ž๏>๗ใ๐ไ๘๔8๚ส๗:๛V๐ศxpt๏ฺ o>ใ๒}๋ ๑S–X๖˜K ๋3 1‹ฺnˆ‡นŒ๛5๛ข๘E๙ผ๔๚๗f๐T๗๋์แ๖=๋ษ๖F๋Z๗ ์๘ฮํ5๙“๐2๛ ๓๗7S๛๕ี]<ฑ‘ %ถ ็e๓v ๐ฆ"_†๎ฌ๊อ “๗Š๊o^ฯ๚{๛ำ๖ั๚^๔ุ๚๒e๛Y๏.๛|ํ๚ฦ์I๙โ์C๙พ์h๚ณ์m๛ึ๎ย๛๓ฺD๘=ŒญI*nIk ด๘ อ<GฉCm•5t8[Q„ผอ๛ 5 ็ยยT# น๘‘m๓=๛#๏&๚์3๙๋Q๘ฑ๊ั๗B๋e๘ ํ๐๙ๅ๏ ฝ๒:ฯ๕$9๙z—Q<[๑พ3฿ C2[๔†ฯŒฯ–๕NHำ ศƒฎ๛ษ ๘๛ๅ๔ฆ๙๒œ๘[๑y๘๐ว๘พ๏4๙I๏#๚*๏๛ๆ๏ ’๑[๔6๘2y๗‹‹Mชq" 3‘ QZQอ˜[+๕šๆD‚i ๚z D‹ุ๚๙ฅ๙œ๖c๙5๔ส๙ ๒M๚ิ๐s๛}๐ุ๐๐˜๑“3๒ฃa๓ŠX๕ูJ๘ ๎๛™^™’ˆ๚ ๑้ผLสP•7pwX เฟ ฅ< ๚}ข๛,D๛ ๚}๛š๖y๛[๓๛“๐๛ิ๎N๎ึW๎ปฺ๏„๒P๑๕_ๅ๘‡๛ลž๗ู6฿ ณ๐ ๐ ๐.ารว~ /๒๛แ๏๛\Gโ๛=๚/๗ฦd๔ฎ๑ร3๐eแ๏0ุ๏r๐ ๒uP๔2๗›)๚@b๘vl";™jŒ˜Z  38O๛มBMฯ‹ข r๘ aE ฑ๛ญ๚”ู๙n๓๘D๚I๘ศ๖Y๘B๔_๙๒o๛๒R๑ง ๑้ป๑พ๓r๔๓W๗q5๚ฎ1้ช@:IG"‰ Iฃ ม>UX่๚: ฒ๘- S๖z‚๔*ƒ๓vP๔[๗๛๛๙O๘b๖l๖พ๖Ÿ"๕๔๔|๓w•๓œ๔ฬ˜๖r4๙ตๅฮ ฏŒทIฬ๚๙ ?ค >[ ž๛e ๘๋ อ๕๕ โ๔% -๕$ 4๖็๖‘:๗ฦ๗—Q๙ชษ๚พ๙|n๗ฯป๕ต‘๔h๔Š๔- m๖z ช๗_ ๅ๘“ t๚๊ Lซ &f Šm|พ Ž ญฒ๚d ™๘ู ก๖ฯ ๕ ๔}u๓Ž็๓รD๕_`๗‘@๚~_๚ Jฏ๛@U๛๒†๚xฏ๙% š๙m ม๙b ื๙ }๚ ศ๛9 zื R|cRฎ5ตN'๛cF๙๙๗ํ๖ฬก๕๐ฌ๔œบ๔"W๕ว๖ํy๖o๘๖.9๘r๚hึvœฎ•@~ ใˆ Dี~น พ ๆL ”ฃ#ณเ‚ทั—&‰๎#เ8๛ตช๘xy๖8๘๓‡s๑œ-๐4๒๐†g๓‹า๖t&๚3.ำrEu฿ุšฎtฌmฮฆล@I W< B ฑ6 9• ดท‚้ขพ  J‚ˆ๙พr๗1+๖ใั๕ ๕y8๖r๊๖Fฃ๗OA๘&p๙๓๛Fq;ไพ๔เห@บฐแ ล, ฏฏ ณ9 ย f^1rกภ5y๊๘ธ+bbT€๚๖d๘ศ‰๖YŠ๕ม+๕๕›๕(น๖)F๘žค๚[<ฝ*ํ บ฿Kูทc๕= eฑ .~ <X ฝฅ ๖C ๑้๔N”ผใK,”ธ๚fฌ๘9๖ก่๕๒ข๕ฐั๕จศ๕{๔๕Kพ๖K๘T ๚ฏ\vา@_๓ุpj๘ ฌ๒ O_ มฟ ีย ซ ‡x้O"๙ฤฦ]4ชTธฬ๛x๑๘#๖,B๔ธ๓่๛:๔K๛\๕ร๚a๖;๛ƒ๗E}๙๒Voไ๗ภWRฺฟA'ดo–qV ป. ฎผ ˜ึ #ท ™€๙‹\‚ไ<กื^๛ฯ:๙|ฐ๗f๘๖(ถ๖ฺ๖๑E๗|ƒ๗ศ๗#ข๘ฝ๛ๆ๙ƒ๛o๛r๛0$Z;ๅ0@z.‚ lแ ;โ ‚ซ C. ึOฤี่“ อ3ฒ๘‚ฝw๘Š๛o*๚๔{๘3x๗U๗™<๗n ๗;<๗ิ๛^๘‰๛๚ะ๛ฬF่nาsjฃ๓ๅRˆิF : ฦฒž”ณ^†า"่‡„ภ†๖๊P+/ƒ&๚vG๘! ๗ะฃ๖ึ๛ˆ๖?๛ส๖ž๚=๗^๚า๗m๚๙ก๚™๚ิ๚G?๛Oี7žด +น็ผ GG -@ OL -”สญ%tz1ย&™ใd™๚๎$๙ชU๘๖๛ม๗ก๛๚๖Ÿ๛b๖p๛เ๖ื๚+๘๚w๙ฺ๚๚Ÿ๛ใ„๊#๑ื`3xข@%ฬํ>.…uศร~ช…MhธmPO่žVฑ!M=4๛แ๙๋๛ฎ๘8๛>๘-๛Ž๘ฯ๛=๙{๚.๓๚ว05‹ลฺo๕๖"nbตhฺHZ ำ’@ Kณ'ฯฉฑ์BตA๘=:*qyจ‘<~๛๛r่๚ธ๕๚า:๛u~๛อใ๛l”ƒpawpฬๅา %nฃธL๔มƒ6ฎฃmญ9y„ผลCห”๙ืP์=ิฆเๆO./ฟP”„Ž…ูง=1ฑlŠุ๋“Š,|4IพวRPZ1ฒP๕๛๛ถ๔๋ฌ๘ฏ฿็ ๊- กdฎ์ฬˆ€‡|Oฎค~ซ็(žสงโโขK<:ภlช–,นhคฆู{ภฮŠC‹ซ฿ฒqช็ฃ%ด๊G‡ uน#uเฟ EวําจG&พkย๖`:"ฦN์๋ี“อ๚Gฦคฝmื…(hศฒDj=ฎIแEรdส„เš‚ั‹*Ylผ:†ถx3่7าบณB^!t"V ฅ=T$งv็Gย~‚ฎ]ƒ9{ัต’ฐฤฟ OBeZป/ำแŽช /๚"#ช j6็ž B 8“๛จb#€เ›2๙่nใr’Dเัะœdฃฏก๘nงใช๛๙b๛q๛k๛๕ฉ๛–ˆ็)|-`‚=k#œ๔?L๔ก}†“Rัสล8!Ÿ4ษuิƒkcงะ๔lอ)m๑_ๆศ๔บไ„P๘ะ๛@ต๛็โ๛ํSyฎ๙H jRขœo–ึS}Qว-XBt2-๑ขซ)ะจAอ๒ใง๓0!=๛ZE๛€=๛.๛ฬC๛ฎz๛#5฿e4‘‘ณ!เ฿ฉM“+‚rUmhย~zq6็q๕U}2™–๑ำ ป1x,Aิฎ' x|๐#e๙$ืCต2p8]ค๙ )บ(,&ฌ„Š]6ๅƒ9ัเA#ซ๓ภ“ภ1ใส ˆ๊rV6฿ฟ๋ฐ.F้ žถฏฎoด aรไxํ,ัTz‘ร|‹‡<‡ฃ๚๕T~เฅ#q!๙๗?‹‚%Nฎ˜e<๙- ฺ'€.2๖žบิP2ุE™ภป.0|ย;ด_`fฃ”A็˜Š@6a —ˆบ‡5๚ฌธ„>ฒ% !~Kู|ฦพ”0ห$Ži†ˆƒ* ืฑฝํอŠœ หแ’ƒ๛ห„ฑž‘^ดZ๊h้์เƒzTaศฯ.†ำ:ถ์”ฉ&Lอ•ๅzpงฬ๛y๛5p๛z สQMุ๑#๓๗4“&%ฮ‚ึ๓ZU๊ฬ|ฮ@‡$ถ๎){ž8S—!)ฑลLชQ_็Yf ฎ๖$ฐ™3€Œแ•p#_ั†cง28ษxcงQfซ๔ึ‘๒J“?นซ= {vฬ-Z +&A=Lk4๗พk8๋ž/หL๙$R8JQ$7P*‰)p\ั 03)ฬม'5V†“ม้ kึฤขฉu๛v๚p๒๙o๚๙.o๚๖๛@ป-๎ UUศ“ฝ3{๊~.ว‹ฃ๘<^ืํ`คฒ^ึผwƒ%บZžธ๛๘๛‹[:ะur๐๖q๋@๙=ฒ๑น฿ธ พ 2‹Ke‰2œแmล•อf=SŒ ?oฆฺ]6Ÿฟฤ๎tฮศiBkพ1๏<.n9E—ŽZอ†๔์คร /zฌ,$j[J่ƒธษd๊7ดLe๗O๎๛JD๛o๛ช4๛ ™ื?์ํ€[๓lB8ฎo3D"‚0d>ฅ‹Œ1วŒ“๑&jBฎ๛i๚0ท๙ฯz๙wย๙1“๚ู้๛v2๚[Cr2.}a ฎ๏กLฬoฬ'yวCNด๛1V๛ไ#ze.าx๛u8๛ ๎๚™ผ๚ๅฃ๚Xภ๚ํ๛ฬ‰๛ๅw๘๑ฒY5~๏ม@-ฑ˜฿ฮะu‘W‚๑”‡ูงฝ๔kAสธ๛DQ๛3๙๚-ส๚ ำ๚/๛๛b๚้๛๙E<๚ ต๚]๛…q๓ไฑ๔้๊ํ%อUYHทำLฅH™OG ฎX Bs"๋๚ฑจ๙ืษ๘K๘ื๛}๘T๛n๙Q๛ฅ๚”๛๑๛ศ๛๚๛(aYภฅ์Aโ7ฯc~rJ#ฤMีก`}j,๒ว๘%ƒ9ƒฬqก฿๛n›๛ป๛r$๚h๙‡๙๊๛4๙?๛ฒ๙–๚e๚.๚m๛"๚ข๚๚ส๛6ธ๋Dำ๒kŠู อ<๚ฉ‹0ฺŸc7ๆ๐mมภ61‡๔๛}ฤ๚‹ ๚ภ๚๙{๙้๙ๅ๘1๚ว๘ํ๚๗๘๙๛p๙j๚ ฆ๋9z9„kTˆ‹กฯฮ_ž 1ฐี ตL3ักศ uWš,š๛•x๚Uๅ๙ะ๙Œ๛๚๙๛ึ๙ว๚†๙6๛ญ๙Z…๚๒ฺ๛ŸS!Y๖F฿ lิvณ๛v&";ฯ`h๊[^Œัตo2K|…ฯรfEj๛ึ๚=ฅ๚่t๚ึ2๚‚)๚K๚h๚ฎU๛ QqeญžJ1ฑถV฿๏ภ4t^EPไcŽD9GชO๘NPp xT}ผ`บ?{๛bC๚ส๙*o๘”๘D๙๕๒๙…c๛ฌณ™ๆ6+ ‹ืว๘˜๏Nจ'Yฐ‹ sPŽๅt๎๎่#๕V4’ZU๚IH๚7ุ๙3ต๙_อ๙ž๚ฺ€๚๛yม๛]oYษ>0(ฮ๖`?@CWe]ฃ*มฝ•ฯZœm{lู Yฆ>ส9„๛™„๚๑๔๙=๙‡ ๚ฺY๚๛:K~—ขŽฤ<C0ห{Il' PšŸง9`ถฝ&ตแmไํ \C(2W๔ฬ„m8š๛ึE๛6๛7๛ฬไ๛zูจZuX›pL„์Y–U]Tกฆž^(} p+ร’๕ฺ`ฯไ ‘Isq‚ฟ๔-6] ศ ‡ฦ๘ฏnู Mำiฬชovล ก&?วิw’Bไภ=nฏ,Jวีcฉฬ9<,—R๑B~ฤP๖42<^"{ตซ€พ,sฤฺ(84฿๙VบๅU์ฝŒ_1=Žฤก“w๊Fจ-f)^"Y\2|„˜ฏ—O›ฃญ๏“<:ธ ภญะ”๓Z6ว๒ฐxูถ4hcป‘็Q@ฉย+J๋y‹iูjสฤ™Y}ห1๚€"ฏV๐ค`น>นR_• ฐพ™;“R'คJ;›ื่”W&—š๓รั_“G&Lำ†lฆ:ชcŒโVทๅ๋ี=Cttฆฯ™;K‹โ#Uา$‚|_%L9w@๊ .๑@2$หษํ[ร๒›N:zvฐ>ึิลLฟั๎8"uพ—\๛ฉz๛ัI๛>๛iU๛ยฑ๛”‡๛ม๛,“\Iƒˆ–Q๎š`r69&[ๆฺŒ7H๖ฟ๋น™ฎุ‚ฤ๛๛…"๛p๛'โ๛Dp/ ฏm2ห,‰5ฏšฦ^ปห)eโ  –๎๒ิ๊`1ฐqศz'ƒ …:C ถ 1DืDG†dโkaยคเ๐sGบp ™306มnชeโ{bในฃ=5ƒx}‡&ญธ>jqกฃ๎ˆPญฤbซFN#ฯ๑S[ผ™q๗=>ะL‹MklEคฐ1žimœๅฉHlbp๑eZัฝŠ$aTh?u'ชgํ/K4#‘ึฉNป€๕†อู— ๘l6/@E:O(# ขˆ#ม๙ฺู €(๓ค}T4:๘„ฮ๔ซLt–3า2่‹๋А๛๔t๛ี๛Od๓…žE>–๗๚๑™$}จฐ•ฤวศ๓ูภๆฝd๐*|พCณŒŠฏ•0hUˆtู๎ ›๛vf๚n&๚}(๚ร˜๚4i๛xฏ Qwงš(™มt?Š—7ำo>ž{จ-{~ฎกฃ…n™ ฒkงิต๛จ3๛ล๛‚๛ย๚Pบ๚ž#๛7ื๛u์๔ณOึส K(ช8๋K f๛Mคอ„๘{Œๅ๏)(JEFs˜ฆ†g€คŸัe iG๛–๚”๛Tp๛บ๛ูฉ~3/œR sดhฯh,Z”O๗@?ๅm4Ž2”า”/ฃ}ตห๘œ-h%.oฏึะ-ุdชฌ!Tฏ๛•F๛๚ส๙๚Ÿp๛‰VwˆWไ&ทE^V๛w๖ก+ชšฌ+ฟทใ{z!ใšYbบz[DRVฦฉ๊kฦx9ฒ]๘…Kปz๓–^ๅ๋z‘ yv8n ‚ไŽฮrฒŽ?Hฬ์šcSษ๚Dฐษ^L้ห2L๒ฮsฺ˜[:ฏ๎ˆš๛t๛„ฎ๛๗ๆส‰ฌFAUŠฯีP%‘Oไ1pRถณFผไWŽt:qู<Y๏ั |B๊่Qซำ‘7~€R )ๆ*๕9'I>P<ƒd๙นตฆX‚`vR๐fงHะ ๛49ขBฑ•aว ง|h VฏF|'qฌ๓1๏าzงบภœะฯ ][ŒRะยU๚ rเnเๅฦุvศฌจ›;ฬฯ!2)๎Fวร‰y<6๛๐ะรรษEbzุs†J"p ธ[ฃผ Nšk b\]—Wžmณ:.‘ป๊aZ๛ษบฎ‹ž>‡ๅnฐRฉ(—๏^ฃCpw”๓สjd๕}ษ๗๛ฟ1#๘ไฦยp4Z๊์๛ฏ%gKb`;—๊”›”Iด๚ึอ๛ ๓๛nsม"จWญ–ำJฒ~^๗G…D"#อูpฎฯห๓๐Cฐ-฿ $wIjlrม}G}ๅƒ€ท ๕ฤลศฏม0*\ฯ‹งงžซƒฤB์ำ๎Oฟฑvโุปส—น™tˆ0„๙ ฤฤxห ง†wฯR๏2"›.raJท!๛.5|yโด\ภหฌ)woJชU5t๑ฌŸๅ,i๑Rย,išร'eฬ๎ฐkฤ๛ช[“กศ<ีูฤƒดNญ>#{๕ึgๅ”:ูD+ฝbbŒณฺ๊่ Hoiก›ฏืกีk~ ”–(ห TWแ|้Ÿป“`˜าๆog์*ฌG.XŒ\ืUFK n‘ีวS=ธf๋aOแ„œั‰๛Ÿ!ฉ„กยฮงจ๙นPั ็๘a1๊wgสe็av”%’R|็๊‘ Zฤj_ึ๏X}ํ๖คvj>ซ+x๗ๆm;$P#RNvlไg่฿}h'นŒ#a›ฉ˜-q‚>น์ฒ P๖ต}lXฆ๔o0ฆl;฿ ”2R9ุJ=Uยhgง๛ร‚7F‰สา‡IZ„Tๅ(3 <๓ฎฌ-7€ฤฬZ*๊›^@ฃ Kฏ๐ภ™Jxั)Z{ฅรํEgธ Yป๚ำ|๑{S๚ฉE"ฐฑ.LZ0ฉน)ฅ๓ข9„g|ท–?ดฬ๐ไฝ๔ฺRิI๐V5f’’ ฟศOฅœ€น6จำyaVั(๋ž๛[อ3’,2ง ขa2Š๙๙ฟ€ŠƒœษB.…ฮAvOซWKGJe›ีสb็ฯ$$`<ณฒถ.ย8vบK7'ฮ b ร8%mข‰R–ค๊จตจ•นฌ์๐I1ฃO fyk๊hUvอ~Goค`Mุ<ภ+ฟี:บWV>ำ๗jป+ญ๔นฅฌ9xLนEว\nะvฎƒ›ญฉ๚F,o}nฟo๚‰;ดxยฝฤฝ,งAFp=?5๓อu˜,g=ฃ e2H๑}ํจํ์๗T#ƒ|œ๏หcฝ%๗5+_ุnษCมˆใ(ัะซ“^k๑+๕[ฯร๊พวนภฯ&ำsโพ'ŠL†ม6๛rร0$-`$i^ํeตhl4ณไิฏภŠ…]R ?ข8SJไv๙ช;ำe Y]Oถlณ7'Œฮ)d ยุฝœ˜Eฃ ™ู‰›n>Uฮ[]f๐:‡้}ฒ Žำฝž›qฝ์^(ๆoSฌคาํ่4t$ชUธˆซฌธนๅฺา+P<ฒ7เฤฒ;{ผDYล™x๋Q:๘.3Œตš ,ภพ(6•›ฤ๘ศ%โ$๑pฦจตผžฮWํ์ Š,?7๔5‰/์ Fีุ™ดVธ&ะ๖ฒ=FŸ๋ท„‰ำZ3Y7ตvา{'นf๏ƒ#ฑC<~&"MPจ€ทธeBFภv“=o๘๙ืชษD๏า9y‹JCDF"ุ็8{ พQ๗ ๅkู ฦดทQ€ฐ฿๗๕ทM ืyอ9f @ณ€Yฝย๊*#ม\xŒ'ะฺ9ฝชแ :dˆงณฮพย็vD งฦ๚ฅIŽ™Z๛ …าอBอH- ฒแ’ฏขQฌาšU ๐่กra [อ†q6ชฏถใายม*;‚@5ฃ%ำฟn^ํหo ฬCทUศ<ํ๙ ฎk 0๘ xM๋ฒK#ฟงv{xฏฺื2็คฦ‰ƒBว๖จ]฿ -ฟci— ฦฑ๎d๒๒๕ฆFOศค<ฃจ*ž•O๔1K5ŠXณœฮแ๛ๆเ๓ภ†5,sษพ["ฦฐ@–ฆGๅฺูฃฬ_์ ฒuLใRส๘D๏ฑํ ฝ`Sถ๏๕›Gำ8‘‹J ๔ฌฆ+Mcแz`าย]ฺ๎ๅา,[…kกสฅxu›K ลF}™`ไx’‰–oCl๐จ•&Bฎ‚8ใKฤรป4ž‡uด\ฤtทญ๓X/_ู”ŽๆOOผำƒO*s฿Žฏขšซข‘ฟWๅ๚ศ€8:xฺนW๕ะBd‘)ึ'RHlยWD“ฮ่(TT)่ธง๚{6bef}W}-m๘Dฟ๑ฉ„ย๕ย@‘ฅxX_/“ฑํฟใว฿ศโสฬ%าcฃๆเอMช‚kฌ ฦญมSณ  แš฿ธ๖ำภE•[o\UJ=Nkีž“ฺY3^$ต๛&.6I2f˜๏ยถำpั)ฮH}ๆงฑฝrะ=ํ๛ํฤ)FJxฝ้ฮ:ฃc€‚p›^Or=`!Z ]Acuiฌr็u h3RjFŒ1Ž„{ๅtปr‰lnfxggฆUป2ฬวฏœขcฏQฝnย—ผณฤภ๐ี(๙])ญ)ธ'ญ%…H(้?I <808'0 ๔ะำต ฒ|วj฿w๋˜์ผ๎า๔๑F C, *๑4ฤ5•ˆ๖ฃ้ึ!ๅ'ษ:นOร\โj๗h`NKNYc\; ๔"ิ5›7Q(" G„ใชัลฤุพสู๊๖D ด"ะ5฿;ะ6ฌ7‹Lh^>N ต่ธR>”;Š:w/pŽ(ยH์p Ÿา% 0C6p8ฃ*เ%?5_9|•๙ŸืŠญYrษศ’‚gS:!,่Qพ•งำฉ๗ว ๕8|%ป!FƒซMฝ|ะŽ์zZ,83#ๆณํ‰ฐ}Y› สศํ‘Y#๙๋ฬฮชฑฑ—อฃ๔า=SnuกuqcaAงๅ ุ0T๗g^1F06้1ฆRฦฌ}k›3ต ฬๆ๒อม;ม>สึๆ๒ะ!ีRไ† ฯ.7CขP๋N F 3@Z๐Yฯ4มฯิ๎ฌ1YQRณ)g่บ฿Ÿผš˜ †ย—ๆฟ๙.G7ฃ-๛ B็ƒวธฎี ่ค๕ศ-:?}/’wีL”)6ล[๙๗๔ึห7ีM๖K01h๚มฤ๘†$x2~9คYฺœ แเอ#ฦรมฯG๑ิŒIcqH†.| m f6VM9^lw๊๗ฉฤ๖๒Oเฏึ็ิวณ๑จงฒค…ตhH่ ท f*CK$UJ3".<([ “ ิ">R๏^ไvีœถสซ๔ฏ ดฟ๙ปอด‚ส0๗๏(ผERkWQ]Ai!iQ= -'M๙|ใทึหMบš™แsd)_\่fฃrk“TอPQPDs!…๖ฅิำ๔Q๓ลวธญมŽ฿g2…๔๑ศGŸuลT/า ภ๔ณไซฌ้ฎ๔›xR\ษี<›ค_๗::(kŽกFŸƒฎ^ษ?๑หbA๚dž€Nก๎ฦŽึGุำ๛ต…=F์Šฏฺ….c“G .…๗&]9ด@ 7F@Zf8ซ ใ^ถeำ่๖Tม@ ั๙r฿!ย้ รธTฬํัˆRL•๘๒vหป‚ว๓็iเ5OY‘ตใŸ!^B]พ›_๔ๆTVœฤน?ตี’|K"๒ำ‘Ž%[ภXyCท ำ`ค|€c%TนO>aถ‡'ำˆJผถk‹้XL!•ฺฤxื๖ุpฦ็ก[rาER โผˆWGแ+h9ํrzศ8าซตอฅL€โ๊]@ษ~+ฝˆฤoิฦถtx฿ฏ?'l˜S zห๛i๎7RํฝนDŒ๊lฆ{eป4„ ๗z"ฑ^-ภˆ,วฏ๐Aๅ!z$ฺ์ถ+i7๖(e๓ฺ™Y)฿ฟ€]4๑๙oำ่E฿>ค„€ฯm'‚‡ห9/ธ4ฯช"y“ฝ฿Žู๏ป4\V}—›‚:8๋ฟม'œ‘c’าขƒ nซrj’Fร; U\œฉ ๋œ&8]สTมๅ๔|!๖IGdv{คnฌ=‘๋J‡ฺdพp?6˜ ๅํ:นัYษต๒ฎ๚ผ-ใRGฆต@~ฬy๙!า~ฎž*Z,๓h็ภฃ๏X๘L~— ฏ—…)xท‘hปSไd ‘&ุ7]I&`#y-ฃ$๋TผหE1œ‚ลถมฬฌบ†|;2ผํณXwƒ8ซฯไ๊ท v\ ๕๛ษา๛‡๊๛[*M‰] ฅีO"nทปqFF%…๋ม™่ F7;j”˜จ™?jg#‘ฯพv๗ >›?๘ธำdท1š"…L‰จฆ)ววŽ๕Z%"qใฦœ$N|ใษL ‰Gฏwผ•žœL”ษ…%bm"ฅีฯx:ดŸW+ฯๅ‡ผbŸe˜ˆ๖—{ฏภละ|๑33๕–ย†aฟz—b‰“\ชคฑŽwfGทห‘๕OF๚”š;ฏ่‡ฃŠuฒb`}t(จ๕แภ"vZ†หjbถงโ๕%๔oุช—ภ4ตค˜๐j!"[ฬพiT๚•ฃD[@ฯ[ญ”•วy๑e9kจ‘3สฯdF๖›ˆ๛]wฑฆงKЇ\ญฦฟวPฆอqG2ว๏W ้Aˆิ=k ๆลฮ‡ศTไ0,u?aO‰ษฦCฐŠ๚qkวิ ,oกะฝŽมMทžฎ{GV๊$ฅgƒฬซ‡=RฯMje}์จ็๊8#™yาX*—}ทอฦฺh๖ภ%‚ฬ ๗7ไLบCz/ฎ์#ผ‰“๒cp;8ตJxVQ]4db d๗q๛‡)ง~ึ๕qE์xi™ไT‡ตh์J5 &้พ/{L3^ๅQ†4ฃ &ฒๆVฮภ๗น๎ภฯ)สaภกรๆอ4พ‰ๆ‰M”ภฑ4ษ า๕ั':๔/CพXhs Ÿฆม;าะำiภ ฏด˜auU๐6ึาฤ์•2wŽg[y5ใUฺหื5๎…ธ4ิt๒ฝ :โwจดP์็t#‹"!ทX๖ษ”\@ีl„ฆ>๖W๖นุม‰ฟ๙ฤk็ะB2m1Ÿ์C‰,ปพ์Oแ1xKTย=n#์คัeั๋ำ*‘ŒgKx.์]ฮรฌชgสฆ๚ี)๖W อๅข]L฿ำk)—M"XฆRG<ๆฐs8%kฮฐx9dภ%ๅ”พก^ฅฆมโ๎!Y็›ท๊zF*กภ่Nเ+w8KฺZฃPp&N๎@ยB“T[xฎร๗xY=อ D้ฎฮภGยwฬ‘เš—†Cc4ฮ+ป|rถแฝ\1Fภ>—*{q{็•บภ{๗56ํwฏมs2Z˜อหตฑ,ลOhp)_YAŒ สฦnaŸืำ’R2S๖\็@ๅ์ๅ๓ภ—\/ฦf“ฃtแS,/vล฿ ย9ฝHืC+- ^์™ม฿†(Oo#ฐใแป{2๚ืใฤะฦณื‹๗R&_า›žo?R…๙ฏ๙ั๏ *S Œ๚สี—.NQpถ—‚ปSี0฿เ ใฺ ว ;jb>”!ว ๖้$ฑVsƒDช-ว4ู?เCะ@ทE“bpŠLฐ#ะ๚ูดBŒWe`Ei4u3‡Lpฐšดภฌแœ“-ƒQfeAinฺ|ฌ”ˆงpตlญ{ŽdŠ3uSฤDˆO]pHMภ]ๆfk>yf‘„ฐ˜ักๆฃ๏ฌฏ"ดNญšฉƒฤjึIุหํชญtp6A๕สบญ—-{M`lN‰BฉFิLN;\`‚†ผฐ่;nฉปใลฏภmช €ชw‚p]V;. ำฑ’qฯCH๋>๚$์ H๎ •F$ 0๎5฿/า)อ'ำ$๖J๛}๔บๅีGอ™ส็ิ+โN์W๒I๎.้ใิโ›็dํ=๒๗้ถ†%O3<ํBฮ?พ8ฝ*าM๛ฃ๕ / V |ฏ ื์ไ๗ฮฤลํสาษญว{ฮCใัoK 5 * 1DX p‡ครๅ8[xœ œ‘xS) ๙๘๐ๅใิสสฑฤฌภถผผธบธทธปฟษะึ็แ๏๚*6D$O*W)Y*V-R7M:D/6#๙๎๙์๏ๆ฿ฯึพฺซแํ“ํŽ๎–๔Ÿฑฬๆ  4J!V*W%WVY[[แNอBฦ=ฬ2ัฮ๘าูยๆฎ๎ข๗™’‘ŒŽ”(ข=ณLฦSโOD,0Z †ค ธ๘ปฺจม‘ปuปYพ<พบธ฿ถมตฆบมyฯic^'XJ`bzc›bลc๗e%\PGs.Œ!ž ง!ฅ– ๗pๆ^ีEภ/ฉ™Ž฿ฟ—ฉกณzฯj๎epˆฆฝศ.ุE๔Sb(s@ƒSahpL„4’˜Ž๎rWุ8๔ฯฯรธฏช›ค‹ž‚š…•Šš—กถจๆณพ<อOแX๘\_7_RVfMyQƒc‚prpZb?A.!๕๚ฦๅซาฟzฉzœˆ‘—™™˜ฉœผคฬฏฝไี์๛)X+v8€E€O~\}nwsnheO_-SD๛2๎้๊ใ๔ภ๘›๐zใ^าWยaธtดŒณชทลลิโํ๊๗ -"6:/L\l€Š‰…(ƒ7|@p<Y$4 ๋่฿หญูุnืXPXnึ‡หžมฉภทออไ้/(DNXz\กSด>ฎ,ฃ$œ!"s"J ๙โฺ๋ียอขผ‡ญsซjฐhธmมsวƒำ เษํ๗๗7 MDrNtLrJpEj<j3j+a#G"ฺฟ๊ญะŸบ™ฅ–”—™—คŸซชฌผชาฐ์ร ๙6'O9bKn^mrd}U~Gt;Z19'ํึฮส์ฟฺฐอฎฟฑทชน—ผƒม€ส“ีดเา็๐ํํ@๔av€.‚6z;j=Y=Q7R,J> + ๑์่ศไขืnูjwูŠำ›ำญูฤ฿้๎๗ !.-6@6O4c5|2…"|fN๙:๏*เื๏ิำุใเ้ฬ๘ฑ›™งตฯ๒ 3 HM?6๗9๑?๏>๏6๐0๎)ํ๑๓!)ส ฤภ ย ฮ ์๕๖๙๊ๅ๘เ๖เ๗ไๅ ำ ส+ฮ4ี7เ3ํ+ %+๘0๑5๊>็C์>์3ใ'ิร พฤ๛ษ๑อู่๐อต)ค:ขEชHดKบBษ=ไ?IO6OGDS3ZRCแ6พ/›3~3q)qvƒ ก๏ภำฺบ๎ช "žKฆoบŠีžํชฒฒขˆh!F2'99ใ2ฤ3จ5ˆ7j1N$; -๚,๐8ๅTwิฆหุฬำ,ฺQัrม’ธญภฦีุ์ ฬญ4‹LcT0M๙Cฟ;…8]4I(?4,)0AW์tีวัฟฎDž€šถžฐ๕ฦ๚๕๎า$ฑ4’:p<F:?ึB˜E`<12 +๏&โ!๋ :๋nฃืุฮร3ฝ\ฟƒยฆลสษ๊ิํ๙!ฮ$’"P( -ฬ)”%e$A+&.0($16๘=๒M๋oฃำ฿ำฺ]ๆœ๒ื๕้ิ ึ๔฿ี๊ซ๘wB /ช2y H ๙๑๊๒ๆ๕๚ K})ฒ4้2 $Uƒฌ๖ั๒๏๖๗๑๐๖๒ไ๒ร๑Ž้Pเฺะื“ูU฿ไ๘๊เ๑ู๙฿๑ 4 dŸ#2?RKŠMปGใ<4))"๖เ๘ีฯัอcร!ฒุฅขMงฎํณิตษลหู๙๔8QQˆ_ฦp }HƒxฒcๅQG6?G5J>๗%๚ัฟฦvท&Ÿื…Œ|HŠไ›ษฎบฟผฺว๖๚$"4\CœHไC*CnEฌK๊O#RPSfRdMM8*๔ยส~จ2–้’ช•qœ>จธใษยืญๅญ์ผ๒เR.G๋\4humญh฿U <->A๗7ๅ'ุ ฯหขศYร ทผถrณ.ธ๖ฦอท๒ฒป$ฮ3ไ?G8Gw=บ'R•า๙/๕K๐T็Fแ$ู๓ฺฤฺโW๋๛ฺ Ÿh)2'ึภพ ะ๏R‹ย๙๗0่fฺšัยหเอ๚ี"็๗ ฒ#€A๙ฏ#t*L076(>B: ((๙Dใhะยฝป๖ป3ฟkฟžมวฦๆห๔ฯ๔ึๅโั๕นก#†Aj[Eko็dฒT†C]1?) *๗<ๆPีpฤ“ฏบๅއ7‡`ฆฃฦร้เ ์$ๆ<ัJปPŸR|PO\j๔sหuคhyWRC9','ิ/ช?S…k‚‹…ตˆ่Œ™Fชgปƒัค่ยำ#ืAห^ณt”}ny@l_โUทJ—8$iZP๑PSล\ซo•ˆƒค€ว‡๏˜ฏCฦk๚ชผ4ฤDภPณTW[b]A^[๔WฬJง6Šq๘[IยAซHšQ‘c“z™™ฃฝฑ่ฤำ;โ\๐|–ฌบ8ฟUผnฌš†„ƒhuHb"K๓4ศข ๐`ืCภ2ช.“4~Em^nzužว๑ บIm&ซ@ฦSูe฿uำ„ปžœyขSœ%Š๓qลMŸ(~aKป8™13l;_IZbWƒ\ฉlั{2ฅaสˆ๙ง*ผVว}ฮŸอตลปฒน™ฑ|งX›.†fา@งz๋Vพ7’#gE$22,O0vAฃ]อ}๔ŸฦG๒lŒ>ฃZฐsปŽมญยวปึฉึŽษmซEƒVใ)ญ๖€ยa˜M}Bk?_@SLL`QuYeฌnหy๑ถB้h#ˆXช‚วฆฺฤฺะแถี‘ธj–=sPแ)บ™ๅyษ^ฑL—AzA^GIU@8\1v%ˆ” žš‘๛}๗e๋K฿(าวรธศ•อuึ_โT๎Q๚U]j ƒ ฆ สํ (%E*b.€,˜'ฆญญจ๖šํ๊\้3้ ๅไแมž~fฺWฺTเV๋_๖m€œม่ '1)R)q#‹šŸ›’‡ v_๕D็( ื๎ัาะถะœำ…ุqโc๎d๗o„ กพ๙(;JZjx€{๘n๎^ๆGไ*ไ็เ็ฟ็ฆๆ•๎…๗~‡”ฃฒภำ๏! (?Vo€๛‰†wd๚T๗@๕(๑๑๕๎๋ว้ทํฆ๎’๐…๗}|‡—ฎฤ฿ 6๙JZjz„…}o _Q=#฿ฟช –‡€||๔„้“แฆปฯ฿้ไ๊#๒?๗Vj }ˆ‰ƒ!w%j+Z-H3263+฿ลญœ๊‹ฺ~ฯ{ส€ฦŠฤ•ยฅมนศะาฺ๋ใ๋.๕D[n$~7‡E†O}SlPXLBE': ,๑!ฺฦด๑งเŸั—มดŽง’žžžฏฃมฑืม๎ัใ๗- AR,c9jBmOhXcc]nQk?^,G.แฦไฑฮฃนšญ˜ค— ™˜“ฆ–ตศฑฦ๙๖(;+MI\cerjxfr`iV]KQ=D(1 ์๚่ฤาฑนกฃ˜•–Ž˜Ÿ•ฉœธงฯผไา๚๋ ,-9@FOSYY_ZdYdV^OUDG47 $๛์ฺ่ีศฤทฒฎคฉŸจŸฆกจฌฏธปษสุ๑้๚ $$72G@TI\I]HYETEMAA60! ๚๚๐๋โูึวศทผฌถจทจบชผฐฝฝฤอาๆ๎๖๛#)47>>F>H?F?E;A89/+& ๛๗๑๋็เูฯะศฬลหวหฬฮฯาีืูเใไํ้๘๐$2;(D-H.E/?/6+,%"๔ ๋ใู๕หํฟๆธทุนำปสมวหษฺฮฺ๋๛ๅ ๏๘%1: BFJK)I6B>9?'<1๚#ๆำ รถ๒ญใฉชึชุฌฒูปำอฮโฯ๔ำ ึ5ๆH๖W af*e2a7Y8M5;4&0/๙*ๆ!ีภฏข๛™์™ฯฃลฐยฟมะรโล๖ฮ&่<๒LZdj!k0g:[?J;76#1 +๑&ู ฦทซŸš๔™ๆŸืชัทหฦวุม๋ยวฯ*ฺ=่N๗\fjf`(W0I667;>ํ=ี7ย+ตฉ  ›๐ใคุฏฯฝษหวศํษฬฮ.า>ฺKโX๎e๛j h[!H)1021ๆ0ฮ.ธ,ซ(ค"คงฌดพ๘ฬ๏่ํไแ(>ุRึ^ิeึeaโX่L๑:๚" ๑",ส3ป7ซ7ž5š0™+'ค$ฏมู๖๖็)ู>ฯOว\ยcมbร\ษVำOJ้=๔+๛ ้ึ"ภ,ญ4›:Ž?Š>7–-ข!ตฯ ๊๐ๅ0ฺ>าKฬWส_หfะiำeูcแZ๊N๕<& ์$ฬ)ฒ,Ÿ.‘,‹*‡)‹'—$ชพั เ๐๔่฿0BึSาcอkฮoำmฺfแX็Fํ-๔ ๕ใฯ(ผ-ฎ/ฆ/ข1ž1ก/ฆ(ฑ ฟาํ๛ ๏1แAืMฯVสWลTลMหHาA9ๆ0๎#๗ ๖ ใฯภ%ด0ช7ง;ซ;ณ9พ4ฬ(ู่๚๓ ๆ%ื3ำ<ำCาFัHาEิ>4โ(๊๖๗$็0ื7ฬ;ล9ภ2บ'ทปษ ุๆ๕๑ํ๚็ ใ$ี)ะ.ฮ5ฮ<าCืC฿?๋8๙- !&๛0็5ำ9ฦ8ม2ม+ม$ยรศั๒ใ๊๊เ๓ุำฮ&ษ8วHษRาZ]่U๔G4 &+๑/เ/ฮ/ผ.ฐ*ฆ% !ž งต๘ฦ็เ๙ัส%ฤ9ภMม\วeะhh๋h๙bZG.*6๙?เBศAฑ?Ÿ8‘/…!ƒ‰”๒ แฒีสศๆภปบ5ผMยaสqีyแzํupeT*>5%?F๗JIวDฏ:š/Š#„ƒ ˆ๚’๊ ฺตอฬภ็บตณ.ตEผVศeีoแs๏rlb Q0?;(G O๓QQษLปAฌ0ข™—๕šใคิฒษฟภัผ็บธป*ม:หFูR้[๚] [U'K.B446%765๊3ิ,ฟ"ฏฃ ›๛™์›฿ขำญหฟฤิย๊ฤสิ-@็N๒[๚ek jcX(I188#:8๗5฿.ว$ฑ …๑‚ๅ‡•ีฆฯพษีว๏ฦ ส&ฬ?ำT฿d๋o๚v yw$n+`1O9;>%><๊7อ0ฐ&š‰๗‡ใˆีŒษ—ภฉปมผฟ๔ฦฯ*ฺBๅS๎a๘hno n-e7WADG/JIA๊4ั(พฌ  š๐™ใ›ฺคฯฐฦผฝอต฿ด๔ต ฝษ3ีBไM๗T UP*K3D7=<1@%BB?๕<ๆ6ึ.วผ ด๗ฏโฌฯฑฝทฐวฆืค่ฉ๗ฒฝสื(ๅ1๔:@B*A9BG?W7a-gi `๚R๊?*ฮฦรๆยิรฤฦทสญอŸาšฺ–ๆ˜๑ ฎ รุ$๐- 4#897J5T4]1b+e$d_VK:๚&ํไ๓ฺูามสญลžล•ห’ฯ˜ีกซไป๋ห๓๛๎-'B/R6]7e5d4_0W-I&9(๐๕๎อ็พเฒุฉำขฯขฮฆะฐีฟฯ็โ๐๗๖ ,9B J$N'P+M,G+@&8!/ ๙้๛ฺ๖ฬ๑ฟ๊ถไฑ฿ณทูปุยึหุุ็ใ๖๏)6@HLKHA6,๒ๆูฬ๘ย๏น่ตใธแบใม็ส่ื๋็๋๘๎๐๔!๛,3:==>=93( ์แ๛ื๗ะ๏ห๊วๆลใศแอแำแูไ่ใ๏๊๖๖ "*/#0$/!*&!   ๖๒๖๐๐์่่ไๅเใโแ฿โโ็่๐์๚๑๒ ๔๖๘๛ !  ๙๖ ๐์ๅโ฿เ฿เ๘ๆ๑๎๊๘ไ฿ใ!ๆ ๊๑๗   ๔้"เ#"ู ฺูแ ์๗๛๖ ๑๎้ๅแ"%)*($แ็๏๘๕์ ใฺูีึ$ึ%ู(+เ-่+๓# ๕)้/2ิ1ั0ฮ-ฬ)ห"อะา ุแ๐๊เ๔ำศ ภฝ"ฝ*ร0ส1ำ6โ5๑41+#)5=๗E์HโGุCั6อ(ฬฯฯ๘ั้ีึ่ฯ๓ษลมฟฟ&ย-ส0ึ1๊220$,/$7:==๗;ํ7โ0ื*ะ สษส๘ห๋ะุฯโล์พ๕ปฟวฯ%ๆ.๑8< <:#4.,:$CFE?๘6๋(เืะ๘ฬ๋ศลาลสสระฟูปๅธ๒นพ ศาไ$๗. 5!628@6I1L,L%KG?6๛(๏โ ืฮ้ศืฦยฦตสฌฮฉีญ฿ต์พ๘หฺ๋" (/*596B6K4N0P*M F;+๘์เ๒ฺิฮอฤอฟอบัธีธฟไฦ๋ะ๕ํ ๚ %(*7+A+G&G"E?6' ๙๗๐๊่ใัแษโฤใพไปไปๅย๊ห๏ุ๔็๛๗ +9FMOOJ>1 #๒฿ฬ๘ฝ๔ฒ๎จ้ขๆคๆซ่ถ์ว๐ื๓๊๘*<I Q Y`daXJ9$ ๑ึฝ๘ซ๓š๎‘๎๋๋“๊Ÿ๊ฌ่พ่า้่่์๑3๘J_ ny}!{!t!fR;! ๋ ะธฃ๛’๖†๐๋็€โŠเšแฐๅส้ๅ์๐๖4๛J\ju { |yp_G*๐า ธ Ž๛…๘€๗€๔ˆ๒”๑ฅ๏ธ๐ฮ๐ไ๒๒๓/๔G๗]๚oz~ | viT<!๐ ย ฎ‘ˆƒ๛†๙๘ ๕ท๕ั๓๊๔๔๓5๔G๔W๘c๘krqp g \I 1  ๙฿ ฦ ฐ œ ‘‹“š๛ฆ๖ต๕ฦ๓๒๓๒ ๔#๗9๘L๙[๗g๙m๚m๚h^SB. ๎ุฤณฅ œ˜˜œง๛ธ๙ส๘๖๔๒๎๊.ๆ=ไJใSไY่]๎\๖WL> / ๙่ึฦผณฎซซฎถ๗ม๎ฯ่เโ๑฿)7ใAๅK๋R๑W๘[WO D6"๚ๅะฟฑง ฃฃง๛ฐ๔บ๎ฦ๊ีๅไโ๕แใๅ*้9๏F๔Q๘UYY SK@1#๊ึ ลดงก๗ž๔ก๑ช๎ถ๎ย๏าํใํ๔ํํ๐&๔7๗FR[ ab\RD3! ๙็ื๘ศ๓ฝ๑ฒ๏ฌ๐ช๐ช๐ญ๓ต๔ม๔ั๔โ๕๔๛ + 7 @FJNO NIB7*๙๗๗๐๖฿๓ะ๐ม๎น์ณ์ฒํถ๑ผ๓ฤ๘หิเํ๛ '5?E G F?8/%๔๎้ๆๅ๑ไ่ๆ็ั์ษ๐ม๔ฟ๚มฦะ ้๖! "!&.37๗7๔4๑.๐$๎ํ ้็๕็้็แ๋๏๖฿฿แเไ๋ ๕ !๛$๙#๔!๏์์๏๓๙  ๘๑็฿ฺ เ ไ๋๏๕๛๕๐๊ ็ ็็้๎"๓$๚%!  ๚๒๎์๊่ๅ ไๅๅ๘็๕๊๐๐๏๕๎๛ํํ๎๎๏๑!๓#๖! ๙๔๐๎ํ ็ ไแ฿แโ๙ๅ๓๊๎๐้๚ๆๆ ๆ๋๏๕!๛$$"  ๛๒์ๆ แฺีึ๘ื๔ู๓๑ไ๑ํ๒๕๒๔๓ ๒๓๖๛$'( & "   ๓ ์ๅเฺุ๚ฺ๗๓฿๑ใ๓ๆ๕๊๘๓๚  "   ๚๙๙๗๔๑๐ํ๏๊๎่ํ้๏๊๒๊๕๎๚๓๘    ๚ ๒ ์ ๆแแๆํ๕๙๖๑๏ํ#๎'๏(๐(๒$๗๚ ๖์ไ฿ ูึำำำืใํ ๘๘#๔,๐0๋2้1ๆ-ๅ(็"้์๐ ๓๗๗ํๅ ุิำำ ึ!ูเ่๑ ๘๒์!๊%็&ๅ&ๅ$ๅ ๅๆ้ํ๓๕๘์ๅ฿ฺฺ฿โๅ๊๑๘  ๛$๔&์(ๆ&แ#แโใ่ ํ๓๙๕๏่ไ฿ ฿โ๊๐๗ ๚๗ ๔"๒"๓!๔๕๑๐ ๐๓๛๖๔๖ํ๘์้็ๅโแแไ้๎๕ ๚๙๙๘๘ ๗ ๙ ๚๚๛๙๙๔๙๏๚์๊้๋๏ ๓๗ ๛ ๛๛๛๛ ๚  ๛๛๗๕๓๓ ๖ ๘ ๙ ๚ ๛๚๘๗๙๙๚๙๗๗๕๓๒ ๑ ๑๑๓๘   ๛๛๙๚๚๛๘๙๛๖๔๏๋๋ํ๎๓๗ ๛   ๙๖๔ ๑๑๒๓๚๕๕๘๑๙ํ๚้ๆไแใๅ ๋ ๑๖๛ "$๛%๗$๕#๖๕๔๓ ๔๔๙๔๏๔ๆ๖฿๚ุุืู ฿ โ ่ ๐ ๚    '06895๚.๘(๘๗๖ ๖๔๕๓๊๒แ๓ุ๖ฮ๖ฦ๙ม๚ฟยวะ ๋ ๚!+4:=> ><8๚0๓%๐ํ๊๔้ไ็ื็ส่ภ๊บํธ๑น๕พ๚ฤหึ ใ๓ /:EKMJ C:/๗ ๒๎๋๐้แ็ำๆศๆพ่ธ์ด๐ต๒น๗ยฬืๆ ๕'3?IMPL D 9,๛๖๕ํ๓๑ะ๐ล๎ฝ๏ต๐ฑ๐ด๑น๑ฟ๔ห๘๋ 1=FJLLG>3$  ๛้๛ฺ๖ฬ๏ภ๋น่ต็ด่ถ้ผ์ว๏า๒โ๖๑๙ +4<?BC@90%๛๙์๖฿๓ำ๑ษ๐ฤ๏ฟํพ๎ฟ๎ฤ๐ห๓ึ๗โ๎๚ +3;<< ; 5+#๚๏๗ไ๕ฺ๒ำ๓อ๓ษ๔ฦ๖ว๘ห๘ะุใํ๘ "'. 2 5 6 3 ,#๙๎ไฺิ๛า๚ั๘ั๕ิ๓ู๔฿๕ๆ๕๏๗๙๙๛!'*+,)$    ๚ ๑๋ไ฿๚ู๗ู๔ู๓๓ไ๑๊๐๓๐๚๑๒ ๕๗๙      ๖๏็ไ๛โ๙฿๕เ๕แ๑ไ๏้ํํํ๓์๙๎๑๔๘   ๛๔๎๊๚็๖ใ๑แํเ่เ่แ่ๅ้็ํํ๐๔๕๚๙    ๛๕๗๏๓้๎ๅ้แๆใไๆแ้ๅํ๋๒๒๗๙   ๚๓๚์๓่๏ไ๊แ่้เ้ไ๋๋ํ๒๑๚๒๕ ๗๚   ๛๓์ไุูแๆ๚๋๘๓๙๛๘๙ ๙๛๛!%'(($ ๙๏่โฺฺฺโ้๐๙ %)++)# ๖๐้โุึึู๚๗โ๗๊๖๔๘๛"%&%&$  ๖ ํไึ๚ำ๖า๔ำ๓ึ๔๖โ๖๊๗๔๖๕๕๘๙๛#((( &# ๗ํๅเูุ๙ุ๗๕เ๑ไ๐๊๎๐ํ๙๏๐๔๗๚"')) & !   ๕ ๏ ๊ๅแ฿๛๘฿๕โ๒ๅ๎๊ํ๐์๗์์๎ ๑๔๙๛  ๘ ๓ ๏๋็ๆ๕ๆ๒็๏้์์๋๏์๓๋๙๋ํ๏๓ ๗๛ ๚๔ ๏๊็ๅ๗ๅ๓ๆํ็่๋็๏็๕็๚็้๏ ๔๚  ๛๔๐ ํ๊่๙็๓็๎๊๋ํๆ๏ๅ๒ไ๗ใ๛ไ่๋ ๐๕๛   ๛๘ ๗๕๑๖๐๏๐๋๏่๑ๆ๓ไ๔ๅ๕ๆ๗็๘่๛๊ํ๑๘         ๘๚๓๙ํ๖่๔ใ๓แ๑฿๐฿๑แ๒ๆ๓้๕๏๔๔๗๛๙   !!  ๛ ๖๏๊๛ๅ๖฿๑๎ฺฺ๊่็โ็่็๐้๗๋ํ ๑๗" %&%!๔ ์ๆแ฿๘๐๊ไเเไ๊฿๒โ๚ๆ๋ ๒๚$' )*($ #$% "๙๐่ เู๚ึ๔ึ๏ืู่ๅ฿โไ์๔โ ็ํ๖#')+*(!#$&% "๘๑๋ไเ๙ฺ๓ูํู็โโ฿่๐๗เไ ่๎๓๚#% $#""$" ๙๓์ ็โ฿๕฿๏้เใโเๅ๋๒๘แไ๊ ๓๚ !##"!"! ๔ ํๆแ๕฿ํ่เไใโ็แ๋ใ๏ไ๓ๆ๙่์๐ ๖๛ !#"! ๙๔๐๎๛้๗ๆ๔ๅ๎ใ๋ไๆๆไ๋ใ๒ไ๙็์๓ ๘    ๘๒๋๗็๐ๅ์ไ่ๆๅ็ไ้ๆํ็๐่๒๊๘ํ๓๘    ๚๔๚๏๕์๐่๊็็็ไ้แ๋แ๎โ๓ๆ๗๋๐๗    ๙๓๐๖๎๐์์๋็๋ๅ๋ไ๎ใ๐ๅ๒ๅ๓่๗ํ๛๒๙    ๛๚๗๔๓์๏ๆ์แ๋้๊์ใ๑่๖ํ๚๓๙     ๗๙๓๗๏๖์๓๊๓้๔้๕๋๗๋๙๎๚๓๛๘   ๛๘๓๏๎ํ๏๑๚๔๙๗๚๛๚    ๙๗๓๓๒๒๛๔๔๗๙๚   ๛๗๛๔๚๓๚๒๚๑๚๏๚๏๚๑๒๕๙    ๙๖๑๚๎๘๊๖่๕่๔่๓์๔๐๖๕๘๛๙    ๘๎้๘ไ๔เ๎฿์฿๋฿้โ๊็๊๊๋๑๎๖๑๔๙ $&'%! ๘๏็๖฿๐ฺ๋ึ็ิไิแึโไเ็็๋๐๏๙๒๘  &(,,*& ๒้๙เ๔ฺ๐ีํั๊ฮๆฯใาโืใๆ็้๑๎๓๙# )/12/,& ๕๊เ๛ื๕ั๎ฬ๋ษ็หๆฬไำไูๅโ็์๋๘๏๓๗"*.232-'  ๗ํ ใูำ๗ฯ๑อํฯ้ัๅุไ฿ๅ้็๒่๊ํ๑๖ ๚&*. ..*%"" ๙๐่ แุ๘ึ๒ี์ืๆโแ่๐๙฿โ ๆ์๔!$&'&% $&' '#๕ํๆ แ๙ู๏ฺ่ใ฿ไู๊๐ู๗฿ไ้๑๗!#$##''&$ ๗๏้ ๅแ฿๖๐฿๊เๅไแ่฿๐๗แ ็์๓๚   ๗๏๊ไ โแ฿๘โ๑ๅํ้้๎ๆ๓ไ๙ไใไ ๆ็๊๏๕๚  ๛๖๒ํ๋้ ้่้๛๋๓๏๎๒้๖ไ๛เ฿฿โ ไ่์๒๖ !๘๔๑๎์์ ํํ๐๘๑๒๕์๘็แ โ็๎๕ !๛"๘#๖"๓๓๓๒ ๓๔๕๔๖ํ๙็๛โเ฿เ โ ๅ ้ ๏ ๖   #"!๚๙๗๖๔ ๕๖๖๗๘๑๚๋๛ๆแแๅ ๋ ๔ ๛   !#!๚๙๘๗๖ ๘๘๙๗๙๏๚้๛ๅเ฿ไ๊ ๐ ๖  !#%#๛"๚๚๙๘๗๘๘๚๐๛้ใ฿เแไ๊๐๗ ""  ๗๐๊ๅ๛แ๛๛๛เใ้๎๗ ๙๔๏๋๚็๙ๆ๘ไ๖ๅ๗ๆ๗็๘๋๚๐๚๕๛        ๗๓๚๏๗์๖้๔่๓้๒๋๓ํ๔๐๕๔๘๘๙      ๛๗๒๑๙๏๖ํ๓๊๑๊๏๋๏ํ๐๏๑๓๔๗๘๛     ๗๔๙๎๕้๒็๏ๅ๎็๎้๏๋๏๐๐๓๓๗๖๙   ๘๓๚๏๗์๔้๑่๏่๎่ํ้ํ์ํ๎๏๒๒๖๖๘   ๚๖๚๑๖๎๔๋๑้๏็์่๋้๊๋์๐๎๓๒๘๔๘   ๘๙๔๕๑๒๎๏ํ๎๋ํ๋ํ์๎๎๐๒๒๕๔๗๗๛    ๛๚๗๖๔๓๓๐๓๎๓ํ๓ํ๓์๔๎๕๑๘๔๚๘๛       ๚๛๘๙๕๗๒๗๑๖๐๖๏๗๏๘๏๚๑๓๗๚    ๙๕๒๐๎๏๏๐๓๕๙ ๚๘๘ ๗ ๘๙๛๛๘๖๖๕๕๖ ๖ ๙ ๙ ๛ ๛๘๖ ๔ ๓๓๓๓๓๔๕๗๛๛๚ ๙ ๙๙๙๚๛ ๙๔๐ํ๋๊๋ํ๐๓๗๙  ๛๘๓๑๐๎๎๎ํ๐๑๔๗  ๙๖๓๏๏๎ํ๎๐๒๔๗๛  ๚๖๑๏์๊้๊์๏๔๗  ๛๗๒๏์๋๋๋์๏๑๔๘ ๛๛ ๛๛๛๚๛๗๛๔๑๎๎์ํ๎๏๑๕๙  ๛๙ ๗ ๖๖๖๖๙๗๖๘๔๚๑๑๐๏๏๑๓ ๕ ๘     ๚ ๗ ๖๔๒๒๒๓๙๕๕๖๒๙๏๏๐๐๑๔๙   ๛๘ ๕๕๒๒๙๒๕๓๓๔๑๕๐๗๑๚๐๒๓๖๗๚       ๘๗๔๓๛๒๚๓๘๒๖๔๖๕๕๖๔๙๕๛๕๗๚     ๛๘๖๕๕๛๔๙๔๚๖๙๖๙๙๚๛๚๛๛๚๙๙๙๚๚๚๚๚๛๛๚๙๗๖๗๖๖๗๙๚ ๚๘๗๖๕๕๔๕๖๘๛ ๛ ๛ ๚๘๗๕๔๔๔๖๖๘๙ ๚๚๚๚๚๛๛๚๗๕๔๔๖๗๘๙๛ ๛ ๘๘๗๘๗๘๙๚๛๙๘๗๖๖๕๖๕ ๘ ๙     ๛ ๘ ๖ ๕๔๔๔๔๛๕๙๗๖๚๓๑๒๑๑๔ ๗ ๙      ๛ ๗ ๕๓๒๓๒๛๔๘๖๕๗๓๙๒๑๑๑๓๔๖ ๚     ๚ ๗๖๔๒๒๛๒๘๒๕๔๔๕๒๗๒๚๒๔๔๗๚      ๙๖๓๒๐๛๏๘๐๖๐๕๒๔๕๓๘๔๔๕๗๙ ๛     ๚๖๔๒๑๒๚๑๘๓๖๕๔๘๕๚๓๔๕๗๚     ๛๘๗๕๔๔๔๛๕๘๗๗๘๗๗๖๗๗๚๚    ๚๙๖๕๕๔๔๛๔๙๖๘๘๗๚๖๗๗๘๙ ๚      ๛๙๖๔๒๒๑๒๛๔๚๖๙๘๘๚๘๗๘๙๙๛     ๛๙๖๖๕๔๔๕๕๚๖๙๘๘๙๘๙๗๙๚    ๚๘๕๕๓๓๓๔๛๖๚๗๚๙๚๛๛     ๚๘๗๕๔๕๔๛๔๖๘๛๚    ๙๗๖๔๕๕๕๗๙๛  ๛๘๘๗๛๖๛๖๚๗๛๗๛๙๛๚๛๛๛๚๚๚๙๘๙๙๚๙๛๘๚๚๛๛๛๚๚๛๙๛๙๗๘๘๚๛๚๛๙๘๛๗๗๗๘๙๛๛๚๙๙๗๘๗๘๙๚๛๚๘๗๚๗๙๗๚๖๚๘๛๘๛๚๛      ๛๙๛๘๚๕๙๔๗๔๘๔๘๔๘๕๙๘๚       ๚๘๗๖๕๛๖๙๕๘๘๘๙๙๚๙๛๙๙๛          ๛๙๙๘๘๚๙๙๚๗๛๗๕๖๖๖๗๙     ๛๚๙๙๙๚๛๛๘๛๗๖๔๔๔๗๗๚  ๛๙๙๙๙๚๛๚๚๛๙๗๗๕๖๖๗๙๛๛ ๚๚๚๚๙๚๛๚๚๚๘๗๗๘๙๙๚๛๛๛๚๚๙๚๚๛๛๚๙๘๘๘๙๛๛๛๙๚๘๙๘๘๘๙๚๛๛๛๛๚๚๚๚๛๚๚๙๙๙๙๙๛๛๚๛๚๚๛๛๛๚๚๛๛๚๙๘๘๙๚๛๚๚๚๚๚๛๛๚๙๚๛๛๛๚๙๙๙๘๚๛๛๛๙๚๛๚๛๛๛๛๛๚๚๙๙๚๛๛๛๚๚๚๛๛๛๛๛๛๛๛๛๛๛๚๛๚๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๚๚๚๙๙๚๛๛๙๙๘๚๗๚๖๚๖๚๗๚๘๚๚๚๚๛    ๚๘๚๗๙๖๘๕๖๕๖๕๖๖๗๗๘๘๚๛๛  ๚๘๚๖๙๔๗๓๖๒๔๓๔๓๔๕๕๖๖๘๘๙๙  ๛๚๛๘๚๖๗๕๖๔๔๒๕๓๕๔๖๕๖๗๙๚๛  ๚๚๘๙๗๘๖๗๕๗๕๖๖๘๗๘๗๚๙๚๚    ๛๚๛๙๚๘๘๘๘๗๗๗๗๗๘๘๙๙๚๛    ๛๚๚๙๙๘๙๘๗๘๗๖๗๗๘๙๚๙๛๛ ๛๛๛๘๚๘๙๘๘๘๗๗๘๙๘๚๙๛๛๚๚๛๚๙๙๛๘๙๙๙๙๙๚๚๛๙๛๛๛๛๛๛๚๛๚๚๚๛๛๛๛๛๛๛๚๚๚๚๚๚๙๙๚๙๛๚๛๚๛๛๛๛๚๚๙๙๙๛๛๛๙๙๘๗๗๗๗๚๛๛๚๙๘๗๗๗๗๗๘๚  ๘๘๘๕๗๖๘๘๚๛๛๚๙๘๘๘๘๘๚๛๛๛๚๛๛๛๛๚๚๚๚๛๛๛๛๚๛๛๚๚๛๚๛๛๚๛๛๛๛๚๚๙๙๛๚๚๚๙๙๚๚๛๚๙๙๙๙๙๙๚๛๚๙๘๘๘๙๛๛๛๚๙๙๚๛๛๛๛๛๙๙๚๚๛๛๛๚๚๚๛๛๛๚๚๚๚๛๛๛๛๛๛๛๚๛๛๛๛๛๛๚๛๚๛๛๛๛๚๛๚๛๛๛๚๚๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๛๚๙๛๛๛๚๛๛๛๛๚๛๛๚๛๛๛๛๛๛๛๚๚๛๛๛๛๛๛๛๛๛๛๛ManimCommunity-manim-1157b74/docs/source/_static/command.png000066400000000000000000001354551515024150700240520ustar00rootroot00000000000000‰PNG  IHDRJ+Fด๑๏sRGBฎฮ้gAMAฑ a pHYsรรวoจdบยIDATx^์xGวq—bลJก@ E ฅ๘ฐEK(ดHRผ)PŠKก@qw‰"@B $!$@๓น™๎อž&!rผฟgž{n™Y฿™๗ฟ;3[$‹ ‚ ‚ ย, yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7๑Š’‘™‘™&q)1YY™<AADaƒไ AผŠ8ุฏt๙}ัๅ_•aฑใ˜Cwึงfค๐ฌAA…’7๑ส•พ่๒hAีแV ฯM…ศศ7ทˆƒ๙ว{ูฒ‹๛๏Gปw๛นธ„ววง๑LF™๙bQพพ๑๒๐ybZฝแ|UศHฯHŠKŽ BR|r&ฎ—OrbJlD‚ฐ๖๘จฤิdฎไ|้/๐ฺIฯs{ฏx๙๘สณ–kฮใฯ…nทฮ{๙฿JKM็Yีธ;ณX}๎ไ†KO๎<็&‚0’7๑ส๑$๊ก f”แาž› 66ฯGพ๑๎ปEŠีJ•:ูg—,,žed๐MจS็คPœ…ขE~๘แน€€ž•0S\Oz๎šiฝu๒qญa๛4ห3;ฏ$ฦ%๓นKfึ]'Ÿ๓l…•ฆท^wส‡็/x=;ฝ๓ส๖ฉโ–k†3ฌฯํน๖ไn ๋ํ็๙\JยNŒ}9‡—0wHZˆ๘ฺภ6ตj!\92%"‚'fAtrฤ_†œ๑9สsDม&66mฮœปบคˆฎะฅห…  $พKฏฝf%ย”)ทynย ˆ”l=ม๊๏๓/ใ5ŽวลGยŠด†K‡y‚D\d‚ํฟ—…M5,VŸ ๖  >๖xฦJฆ@๒†I …ช‘7ใvoฝ•ร“ ณภ=๐๒บk3I#$oˆBมมƒฆ )4ibฏซฏZHHฒYพ๛๎ ฯM˜#พทŸสl=ม๗ึS^&—HIJ=๋„ฐญแไฦหผLมฯ๓น‘ฏ ฆXlขa๑บๆว—Kฆ@๒†น9nœุŒ)r{สžL˜)้ษIi ฯcH…ŽI“n)๊*ำยš5๙ฒ4IKหฌVอZศ,„๎ œgIไ"แฯขไ~ถž`๕๗y^&—ธใ่-ฌBWpPTT…J•ฌZท>๓ษ'—พ๙ฦeธ›‹ํ7-ZจW/Gพ8งN5mj/ไ—’7fฯญ๓^๛ๆnญ!่q/“c233/ถ–ฏ งYฺouJˆัูม2๏ ๖ วV ‰ฃํฟ—l๏s๑๕นเๅ๊็y้„ูฑg„œส@๒†ศ$oญ๒ฦฑGžL˜#$oˆย…ทw\ฉRวีั† ํๆฯฟw็Nดrๆ€ปwc„ฬ;x๎ž™ยB๑โวไeIผ"ค$ฅ&'ฆ ๘฿œo)œ}•็ฮ1O๎7ถ^gv^a[‚`pnŒ<&#=C)WvNทrทฟงgz€ˆภ่K‡ฎ าไไ ‘=H"^+Vื€ซƒ๏ึญ<™0GH…‹ษ“o ตTๅสV›6๙่™ฒ9..ญL กิ/ฟ˜02›ไอ+N o˜เ|KaT‹ุ๐xž/gœจsPนฝืxฆ‚ว}_akeห“๕๐ Xื u$oˆ์A๒†ษLKs์ี๋ฟ6ผH็พ}332x2aސผ! ๏ฟFVEฝ—/‡๒4,^|_^คJ๋งOyšผyลไอฮ๙ี<_-_ๆŽ?ฌไั‚,oฌื]o๊๎?Oฤ„ล๑4#๔ ี:h‡ไ ‘=Hฺศฬ|ฒgฯต]๖?p€ดูC๒†(\ิจqBฎ4š5sเ zษฬฬฺฑใqงNš4ฑ<ุีืืดวํ$o^qysaฟžู6RtืL๋”คTž5ปผ่ฉ%[ลๅ#๎๒h•7‰qษB3w๛{<อh\m๏ศ—ภษ"{ผ!ˆBCBjœG๐ี‹~ึ6^ปY๘ฮG๛ฎ?ฟ›ลsจ@๔ดฯัƒž๋Ž฿฿z?ฬจyu ณผษ Ž ภnu—ฏ๐[Oc|225พ‡‘™๑,ๆฑ๋ณsถ๗ฝทiฟ็Z:๘นไLw*LTชค๑QƒChr’7ฏ8‚ผq3#oœพ/- แ๊ ˆ@พjV<น(฿N„ศ ์|+๏>Wa9$oˆ์‘Ÿ๒&%""ะฮ๎้ัฃBฒทOx๒„gR“hk๋9sฆะกN_|€?๑๔ุ1_œLOJ >{๖๎นื‡w๒Kวž=ฏ x{สLหัLŽ™iiAž3f8๕้ใะฌ™]ร†'ชW?Qฃ†}ำฆ:ur๙๖Gํแ๑ข?„)$?ทฑŽ Bศ๙๓ษ!!<“รgำฆนโิป7ถไฺ Aw็อรลŽ๓LFr๎œฐF„ะห—•+ศ๓x๔จ๓˜‘œ’ฮc็Q„็ๆ๋ พธ๖p์ๆ˜ไHx๊rใ?kพ,Ry๓,ๆฑฐูสp+ศล๑‰ํRง๑‚]W8่น.,!ˆฏ ฯ Nฒฑyฎธ™žž=น8J$<<ลสู๊ดiƒปโ๎๏ื๙็Ÿ๓Žต๕๓ฤDืV๑๑ivv3gz"?๎B”4ฺ่๔้ž'N<Ž6ถwMrr†ฃc˜ฐBภฑGผ€ŠดดL—p!›ฐSk้6ๆแ}8ฯSถฌฦ$MšุKล วŽ=ฝ|944T็„NZษ-yƒณƒ:ิญM›ณu๊œฌRลบ^=๖ํฯyเA]_อ-๎‘ฃ,,žแl —MFFๆ‘6x๚ซ๛w฿]้ึํ๒W_9sc๓f฿GLVq~Œฅๅ3a๒€ำq๛v”ะT๚๘ฤแJr แส•๐๔๔ผ›@L)o`„ไŸyฮ2›JFzฦyถาrุ\ู“7XT๐ใp฿O๕aRiณ!›<ŸGkQ๓;Tพ>7xš)xน๚ หy่&zฦ€K'หแ™]Wญ8spัฉ=ณl๖อ;yhฑ๑•gO๏pqณป๐ (=-;๏“Rฐ็๖\ร’ฑL,ฒ๖ไฦหWฌn2fF;จb\'ยฑE๔ MŠOแ™ิ$ฦ%๛zzอฦใโ7๛ญฮ].์wปqๆณ‡!8ัศ—จ›B*oผ#๎›ญ ‹ว ƒa™๓ฤGแน0JุTv๎๔hy(Y๒๘,็นs!%ลŠ้ฬ\ฑขๅŒžqqขฃฬ –.ญeJe*Tฐ?&„/ ƒ‡ckีฒสj ุฃป๙wว#"R~๛”AW˜=๛ฟ7i๐ %„ 9eสXเ€๐uAฮๅMHH2คB๙๒–๒ๅ็nม‚{II๚jถ๙แ‡ซย๊ไกfM›€€o;ƒ‚’ฐ oพi+d‡ถmฯ> ๑Rฟ๙ฦE(จ+๔่แ(-อ๘ถ6o๎๛rก„Vy์.7ยอe™M~ผ|9lฆ้lศ›ธศ„ ์ไฅt…mS,๎ป๘ฒRฉษiฦ|…†…+ึทY) (%!ีฺ ูx‘+,?O3hธ้rกจ'@œ:๏evF‡ฤžูyE๋ท}คฐพ-ฤOฆ๎รใโC=a๏œa ญˆlX$จํฟ—๕dฦn<๛ G"'3หศRaษBฐ์˜ฝืq๙Hพษ›‹}$ึRšมฎAxบ๐kปฎpฒnจ[ทุย“CCแI-ZTศฃ5œจQ#ไ‚inปฐƒ"'๊ๆM^^7ง~[((ทุ‡/vํ*ุu‡fอโธoก ืมƒ…RBp๚โ žUมล?2 มถ~็งC‘ค5ผ8๊…‚ื4แ<žฯ‹๗yCjFสฯต‚ฝp๊ัพPRy—ck“ย_Žc๓บ๋Q“&๚>"‰ะกรyxŸ๐ปฎ๐ฮ;๖า่y„ฝ„ บฺ7"YAญ๏}"Hใ7o๖’๔h”l_น.คๆV่ื๏ […1ไDภYป๖Qๅส}๊๔„ทฒร^๓ยน„Ÿ_ผฐeXพ๋๏ฟ }๔„Žฯ_ฟฎ๓Rนy3Jศฏ?ฐEAฎ”(กSบ+ƒ$๛_6Zๅ & ฆ1าHฌ>/_๛Nh6ไอ๕SwๅE๔‡ƒ‹NฑR7…$=a๛T ศ!VPยzญฦA@p>~S—ฏ ๙ฐ\4แ๓>™/&ง3๋ฟษŒ งถ8T้i้WOx่6๒uษ kฒwށ-<ณ๋*ฮปp=่ ศฉ็หBzภZ„KWOภIwณฝƒƒ\Xศ7ys๚ฝ๗ฤ*J3+^ฤ๋ฏ FnB@@๘•+6ตk I๚ƒUฅJ1๗๏๓-3D˜ณณPศ`Qถ์ำใว๙Rtpขzuก”ฐมจ?8ผ๛nj”พฺึนo_กˆฮถiรณ*8ำช•Y865k F!ม฿?๊ี“u๊I๚ƒeลŠ1๗Lžญฅ’™•y๔&มแfแฏหฃw\๊เ}ศษ฿๎๒““Vvฌt๙]ศ#3–7เI๔รc๗6oq_ธมuยฺkำ…Q„ัศlฏ:€Žถ88ˆ*๒ผ8ิ>w๙j๒„ื_ื˜ Lส—ท4?fกAปศศ”Sง‚ชTฑ’๔‡Zตlž=ำ๙๎wุ07!ฟžPณฆ +ตdษ!Iภ–ณ‚ถถBRn“ํd[คฅe๒‹ปผฌ1ก\9‹3g‚๙"rHVaสPฒคฮ7{บBฉRวฅt็ฯ‡™๕‡ำง_์/.<มฎ?ฌ[๗ˆญ๎eฃK๘z*ท_:tู'ะGฃs—ๅšsฬž yใlqK^Dุ5“w]พ๋ไ#$้๑ัbๅ๐เ๊c!‚&G“ล^fVุำ(?ฯgมรฏ’–š~v๗Uaํฦ‡๘ศUญ$'ฆœpI(b0Xhง์ศฝทMื๒€“bผŽbj*-ลด๗ฝฯ…์๓„ฐƒแย~Wgพ’o๒ๆๆธqb•ถž^Lzย๙๘–ยc๊Tกฌ๑มขLxํ|Aฺp๒KกHฎ„ฟฮW ‡kึ๙…เะฌฯชเๆ๘๑Bๆ\ Pฟู;็ฺท็[V˜9๗ุBpต–:?ใ{L˜$ คeคบ=ปฐฬyข_ ๆ-oใ…‘…ั6๗hWš๐ศŠฟฎr™•”w#ปพ๛๎ŠโŠฮ…ะถํY“ž…Kแซฏœ๙–)ุณ็‰YOภ~ฑRNNaฦฝ‹}Zด8อJภภ$ๅ9s%|๐มYพ#ศžผIMอ่ีหุnBภ^฿พWZIHHฏVอ4•kdภi]ธPหฃฅ่่ิื^3VCฝณัP๐Ÿ76ถcฑbว๔ผ>ส]tษl๐มEง$๛Ž?,bM๛ ฮ์บ"G๐พม฿GeC<๖x&/ข?ุoๅ๗8ลถ)n)Zlฏ|-“ž–~dูi!'{f็๏‰qูyร` ะ6ู๒`๕ทฮฎIqษG—kู/cยvษ bG฿๋/ ูr%<๛€ฏภ ศMUPRpฑไค 8๙&oา๎ฮ{พcG๛&M์6Dฐ,_^ฌท4ƒe… Nฝ{{ฮ˜๑`ูฒ{ \0!ึQq้ณฯ<ฆMCม๛‹นl]ตชมศ.jnC‡ nŒํฟ ]๐ูณ๘๕็ŸkZVฌ(dCฐ}๓M=ƒ“รย Eฮตkw๊ํทูa9^ช”ฐ!XWซๆ๒อ7w็ฬมแB )‹X”-ซg†€ฬ๔t(œ‹]ป:ผ๛.[ฉ0าIผัr dp์ี๋%žวBE-(ฮ/อนu›žจ๏9.๔ีŠQ7,ผA€P๑‹๒โ™tเ|M9Pฒ‡'ฟ|"#SฆM๓h฿oŸRLv}๚*Uฌฟาy๖์;ห–=˜7๏๎ื_ป)*Tฐ„ฯ=c†' .Xpoภ€ซฐyเณฝซณฟ๕ึญพบ]n๙ึ[vBูบuOยCmื๎ไษท#"kเ}Š๕Bบ T๕๊oซเฒฝ†ไ9๒บ๐Qš‹Cฟึๅฝ๗^Dฦaฏ™`$Jศ]๙Zถ<#om์ู`Kหgำง{พ๑ฦI!B๋ึg ๘ฒrฬ‘^ร2ูัะ?บ†…ฆMํGrวฆ.Zt๘›~xNศ …ฝ{ตŒว๚ษ๕๗๙…qG•+[มุชี™๏ฟฟ๕หหdey{วแภูAjƒโี ์ธŠp-แะ๑2/]๒พ๐Pžไ๎`B?‚ธศ๙๓mฅพRู7เก“S[œŽญ8‚ _–xฑ=z๘ฉrษ๑ไn รv—ใ+ฯขศน'ๅEvNทb‹ฒ\s๎าa๗hcอƒ|รด~šS ็๖\๓ธ๐0ะ'Tูฝ-(็[ca๏œ“^ฟ็์p?ู่ร)(งŸ†แหา$3#ำn“ฃ™…“/{^~ไ/ ๔นเtๆ๎YZ^†\ุ๏ส—ฅ&>:ัูโ&Žแ%์จ|ŸณoIœz\Tทฯ{]?uขTyœ๗ฬฒ1๒โขR„]3ญ/vt ๖่ฉW๐GoปอŽZFL9ฮFp๒M(ั3ฬๆD>›6ฅล‰ฏ๙เฒŸ๛๐C!ณทะ*o๚๖uึ๏์fffUญชeˆE‡็๕ผ๛ฎƒผศ›oฺ๒C@n ’รีU฿gหฯž –g~3<ม8 …ผYฟ[žกfMฺdddv์x^(hmRœ ญ๒ฆdษใŽŽF 9sr +UJœŠเฤ ›:tจฦผใว๋›Sณ ๏‰ๆiyŽ~y—Z>|Nถ1ำLq๔–Š หฬyYpO๕w. y!ฯ|rศDขCb_ฬh,[ˆ๑แฤ?CตฝัŠปร=ก๘vสi B๎\๖>ฒฤa็ k๋ตh๏๘ํxไ†ฐpซฟฯ|)—’”*LKซ"6\ห‡ผ$ดส›ห‡๕_?I๑)B‘ำ;\xš’S”=่p๒d('ึณlยCร|ก@ห‹ฒec๊›ฮ‚qน[7กเฑbลยฏž๎S9!ฒฒ[ฎเ9sฆฐขภ“'yš!”๒ๆD๕๊ษก†ŸpำŽA<๐#ศ]ycQฆLฌ—แทแ—?\(๘โ<บธ]๋!BAeทBAff†0 ฺบk322M๋vo๕`‡| ฏธผ9zwO3—a!๗ร4|Ž๔ OR‘+๒\;้)_Žr@ˆœk6™ํMธไ„D^<เฆ|ปb0lŸj•œT:C๓Cจ,˜๚G‰ฑษยซDฃCr•oH๎9๛๐4m(ๅอมEงŒHณใ!4'ึ_ไ :Fˆ!ผP)Fˆpœ แ…ฮQZŠ ฯ ๓ž-oฎ๘#Oำ‹๒›*๚{‹I(?_“๘,7)B,%>}ํ้yw๗_ž)วuM2ฦzp){Iๅ–ผะN๒E้๊’๖4Ržํ่rƒ่L%.2ม็fภ๋ึ๋.@eษืฅ ๚…๒ ?๑ฯน=โ$i<อ๖ฬึ๘v็แ%๚O(ๅฎO‚ oT๔Ÿฌค๘aŠถใ+Mจ”b๒ถsTไ#Z9@E)oŒ้ัrEค„‡{ญXqฑkWa2e!๛๒ฆhQƒƒ‘Gฤ๛ีจ+ๅM˜“๘(K+๙(o…{ศ`ใรฺซ๐Eศธ’ํyฌQƒSๅว )h๒ๆnˆ‚ฐ:#รFทน|):ศ-yณฦb๙BvZฮ๒ฅผัำGŽR๓,๋"‡๒f฿>๏แ่๒•'Lธ)ฯถfQ*ๅ|yำทฏณ<3ย๗฿_5สศะดฉ8ทw๎๗Vส›oพ1ช๕”ž"™๕} (Gjiี-๓๒<ญ[›6@+ื1F<ิ๐ญ็#!‘A1๒Yw,;ญ์Ž•‹๒ฦฯ๓น|Q/†iรอNใ!อ3ฆ๕5‰Œ๔ŒP-๛ญNบคŽ๗ ^ผsyฮฝslrq:ฏ ํไ ฿6ลง๘ ฮฌ=ƒ>U+‚ผ‘พตj“ไอSฏ`yf–_ุl=A๙ีิ+VFu%ศ/ ฐผ1ฺWส›x?ฃœยสฌลื_ณ๗๕ษlห๋jีx‚! Žผ18ฉC)oŒิE๙(onนศ`ใรbว1/บ]krํู9!›ohฅเหทg็„ีVธLโKัAnษ›=ทWสฒ้๚|žท๒ฆJc›=ฅผ18ฉ#‡๒&99CะสฏR ƒล‹=๊๏oิฃJ9_ดmซั*็แฺ5cป‘RH฿`5‰๗ำ๋eฬ้FjM›ฆeาง3<ๅy–.}‰ฎถ1#oาำ4„์œaฅuพ]p๙ฐป” แ-ํ].ส›ŒŒฬ 4\๖'Zฎ(a,‘ฃMrNBL’ำ๑›สฏฌ์Ÿoซ๋{‚"‚Fโ 9'3K9gZƒž9ะysdฉฑ=QM’7‚๐ฮyธxภ/บ@Rpๅอฑ%x‚!”๒ฦ˜‘๗ ๛๒&3ำwห#?Fฉ5d[ุพ๙&O0D‘7วŠ็ †Pส›ค`ฃœ๛|”7!๑ฯ”ŸI1&์บต‚/Bฦ@G![@Œพ๑ˆZ *๐๒ๆiŒ/‚ฐ:#รฯu|):ศ•ฑ7`ฃl๙Bv\ฦ๒Aผ๑†ฑS’๒~9O0Dๅ €Ÿ*/>qข๘๔ฺลEcฐx—.ฦ*9_(ง„ฮa8sฦไ‡ษ-yำปท“|! jHขœ{๗bไณWฏ~ฺ˜งฉพเ๔2_™„1๒#ห=.jy9™—,พgถึฺน(o€ฐa—ˆ}}…ีYฎ1นืh๑ป๓|็ qRiญ่R’R…lฮF๕7ๅคd98ใ|้ ycฑฺุรn’ผนuKž9็มเDm๙ ษ‚ฦศ›Œไd—oฟ j วŠณฎZ๕ลื•C“ผQRๅ ธโบฯcอืYF†ฏฯ;แต;:Iหc3๏OนK uˆŽ~|"๎ )˜S rูs{•pp๔„Mื็>›b`–pฅผฑธo์4iฉKฦk.ฤจแ|นNa”7พพ๑ลŠ'^{อJxq4yฒฦ`qƒใ4ดR๐ๅMตjZๆๆฮI0๘}˜l[๒ๆ๛๏ฏศญย๔านณฦHญcว4ฆ„น}[cn†vํ๒ฺีVbคผค |Pๅ๙g4”†›]ž I๎ส›„˜$๙K  ˆžฆB˜gูศ๎Œิไ4Ÿ›ทฯ{=บ$%ั„ู)”Ÿ้<๑–กY8ศBถ\์+•(,<‡‡๘ท7/Iธ‹“h็0ผ˜บบC๒Fฃ 1๒ฦ๕งŸ„RRฐoาฤํ็Ÿ}ทl ฝxvfฟšŸ์+ไ$yฃคส›\$:9B๎R#X>ุฮำŒฦษ”ฐ‚)o^Jy=ษำŒๆกbHŽ*Oห[ ฃผยฺะธ฿z๋ฟมโBฯŸีyU เห› 4ฦฤ็0ดhq๚e|ู3Wฦ๙Bฐ๏฿tัข†'›ฮŒ—7ยดย๛‡G๎Iผฐ_็†\—7ย๘rซฟ›#:$Vždฝฮ„^ฃย—@‚‡๓4ำ๑ึ<>Z'งฆEถ\c๒คz>นgถอํ๓^ู O๎Bะ๒ๅj#oไ 4ถ<3ยฉ-Nยฆ๎8z็pบ๐<€ไFAƒ๒ๆ\ปvB‘KŸ~jะ 'yc $oภ…วV‚c}ัฯจnŒ‡แท…โ$oL๚jM@ดทPื™™ฦ|๙์%PHๅMZZ&6UZ|ำG๘จ‰้ำ5‹›4Wฒœ‚/o&Nผ%ฯŒ`e•›฿Uห”๒ฆZ5kSŸป Ÿ้D˜0มุQยHญนs๙SB/ฏXนฝsg\ํ—‡๑๒ุmr”g‘}`ขBžค็#น.o^|Htฉƒ|™แฯxงGกฟห&๔๕ปฃ1-$O3arjญ๋ฆี†žLˆ1j>*c ฉe™๔จั๒F๒แล7=อ’7๕ห,๖EC-หบE‹Œํ“ขศ!yc $o@hยsaฎ‚%ŽใŒœ:1-Ÿk3ๅeY yƒcoิW_Rใ6ธฮŠ_}šoำัRyๆฯฟ'_ศŒžฬธ๑)ษXขฤฑะPรm๕S๐ๅ ฤŒ<3‚ะ๙สp|  œ <(ๅ ‚“SO6Ž_u–`mmิํ„‘ZธยYผ 4ฎŸ๕๋ณ3@+ื1I๘฿’g–>์คน›๕๚^`ๆพผQtR’ฆฎถX๕฿<หฆX่๊/ง•วฯคฒ,\?ฅณ?‹A„ฏฃ"h}W ์mu๋œis๋ฅงeD‡ล%ฤjEย0$W;<อhp ฑ|ƒฯ ๒Fa๊ผํS-๔—I‰ž#Vะ yฃQPฟผ ฟrEศoคJ!yc $oึ^;๗zตgˆNอHู๏นV(ศษ„-๎ “า tnIHukนPpฝ๋ฌ๔Œœข‘^y˜Tฒไqi!5kฺ`9ย‡{๖ฬณร‚/oำ+WึุH„ำงชำ'bฯำส–ต^kไ.Zๅมฏึศy๐ 2U^{mไ,ไ จ>yq[@ๅ3Mg{€Vฎc’ผษสฬ‚ป)e~1ภ&๊ล^฿0`ูต๒2ไMR|Š|ๆƒžHKI —,6L๋5ช”7๒noฆr๓์ฅM9ฎuฎ‚(ล๋ˆณN`๏xฒ!B#๖ฮแบ[+ศนศเiฑ,์œneไื6AFz†๔ี=ณl๔|ฝไ™ผนjํ!ฯpzง S‰„ผ8bsฅVk/˜$€๓’7๕ห›WW!ใ;xš^|6n ’ผQB๒†™ถฤiœเdฏพ2ล;B็ฃฃจคฐ]ทVEค@๒†…7—F'๋์โๅฅ๕ืะœฆ๐ส๐อ7.๒ๅXZ>›=๛Žฒk—ษ_ญ•(๘๒๑‡Fฯ+„ฺตm xฒ^ฎ\ั˜>มหหด็ฌฦ U@N\พlTŸึบ๕ก๘ิฉZพ`ฃแ5ืื_ป๒nvwเหฤร=ีheศpแ€›|ฑ…Yƒฑๅ<ซq(ๅ B๖†žCk ^ปฅdณ^ณ ูไใ๖œ•_GีBftyAๅผา’>‘Š่™Mฮ=_yม]3๕๕๙ฬ3yงžฑ็GLณSฅžOึHhิ/o’…Nฝ{๓4ฝ8๙ฅPไ’7ท‚œ'›…Cwึ? ฟ–๑฿s,ศ’๓ญ–9Orสƒ.y“œž zแAุMก”ีƒ, !&9’—)๐`k…‘‡•.ฟ;๙ŸŠK‰ๆนUแ^จ๛AฯuBNฒ๗Iะ\คPห›ำงƒๅห้I>XผTฉใ‘‘ฦ>gUR(ไ vฐJqz่fอ *xคงgb„‚z๚ŒฅคdฌZ๕ฐOงoฟu9tH_+& U 4h`g๐…IllZฯž/^ชUณ6๕ดbg฿|๓ฟo•(qlย„›Raห–™ุC‰ฉ๒žบ๔ดaฯ,›_ฎ”-ม๓า#žU/I?—/๖ไ†KrฯuT‹ฤXำzj•7๛ๆžŒ3๙SE8ชยr ฝxšแŒฐ€%์ๆ}#@(unxlรžFษ็‡`ม~ซณึ/ษINLฆ=ภrR“u–ส3yœ-nษ‹ @o?t{ย“uฃœ๏!งช{ผั(hpj‡w฿Š<\ตŠงi##%ๅฮ์ูB’7JHศ9ๅ}Ppตฅฐุq์?ืfnv_ฐยe’ค5h•7ง}Žb9BN=a‹๛ยB!r๔ห)ฌน2{๔๗ี?๔|•š'#3›ž}nQจๅMfฆฦHอq‹G๛๖uๆ๙ฒEก7ชC^„…ฺตm,-uvIJKห5Jอ๒ฺkVบFเภŽฝg2ฤXทC—ผA€}๐@็๛"7ทนX•B๖ษ#ตไ— ิNXX6hๅ:ฆสเj{G^Dvอด6๘}˜—$oภ๑•ดyแฤหx _ุZๅ ย๎?Oผ่—eฤž–๎lก!  ๕๗7sุ๎"Aฐ์จgV๋`ฟ๐3๋žว‚0G6ใขๆk.p่Btถ†)Iฉโœชื>{–๔๔L‹ื˜์F*จ๔งํ์xAิ-Cู,Y"Aภ„^ผ˜™๖Ÿ4ว,แ_z๛m!3 ._x๒d่ๅหXWโsQ˜™้้ฑฐอ@ฐ{๋-yA›Zตคค˜{๗2Rป…ใi฿ดฉผ uีชR’P ฃ”มฆvmyYlณฟ8žฑbƒ๗bฝRY๑<+&%ฝ8‰O5ฮใ_ศ "Ÿ9ร ๊?ร† mmyA็ฑเ“™™แเ}Hpธณ”๒&"1DศcL8๗ุ‚—/ภ)o ‹๛[Sำ๓มฉJOฯ„Oฉพด#฿_ฃ็\s)้ฝน๐ศศศ๔๖Ž“R;t8//Xฌุ1)้๎˜ค$ Gูื7^Jโ ฯฯ#\ปม’<=ฃใใM†ดrฅ—ฐ4)ร1HrrvYฺฮ๒ๅ-ๅKkี๊Œ”ไๅ+v ตpซVีx]JBAแ28P8\R๙ xd) _klษื_ktา“ยw~฿พ'!!]fqqi‡ดmซกUX˜3G็ุa2:Žื๘ะŠ.๔ศ„rๅ,๓Ž|ฒfH)k๋็฿~๋"ˆU๚๕ปbLท %ยH-yศษญ\!91%ytุำH„ืหป3ปฎ0;‚ฎiตโฃ•Xะีท^&T [ฌฯM— ๐ฺ[cxŽ&๒zOษC6V]๒†ธž—E๋l‹3า3ผ‘M(ˆpวั€`NŠKผ|va้lq ~yฆฌ6ˆ ‹ปfใฉ<#๛็j}'“šœ&žถMฑ8ฝรๅษ@๙;™ฤธไ๛.พZ7ฦฯSใq๖GC:•{f๗ŠแศฒำRRTHฌ|๛๑)UxGt่/{)I(('เA๐6อOฑฐwŽ›๐gQ๒}r8Œส#v`มทX๙Kพษ›๐ซWOึฉ#ึdบƒEนrพ›7ฃ \S ฉzย๑าฅ๏/Z„‚Pง฿{OHีŽ•(qsยีฦGzB‚๐fC –ๅห;ผ๛๎™Vญ+R๕‡ณ|๘b<%๔•uตjBชž`Uน๒3KK นpสGHีฌ*U 8ฬgห}faๅt…ใ%K?žืฎฌ[Wศฃ'เ<๚lฺ„‚ฑ^^ฆžว{ ข Tฮฯcaม๕ู9“ฑฌน2๕๚๓‹‚Q)ožD=๒ฒ๑ัผG)o๖zฌ^ๅ2Y0๊ 8เWNฃแKฬC์ํƒL๚ิ}ๅสV์C๏P u๋7ณมmฐy๓‹?p่ๅ/X †าฅ/\xOตฑFžRฆŒ…ฐcb <ท–ณ{ท_… zFจYำฦั๑EWฎฃGŸ*ป‡้ 5jœ8ž๘๗_๘๗B=งภอMหเ.ˆ––-(/่„ฺตm ฯzหฎT)ํ.>4˜ Hๅ4jคๅ `ิ๔๚ๅpYพ๗i์ 0‹€<ดkwฮค ™„ฒ“Z9%3๋าก๋ZAญแ๐b{ญ๙}ฎBN๘วpตy‰ฬ,งใ7uษ!e8„5f๗๓#๐หwฉxŠฏšม๘ั๙๚ๅ๖ฮ9yrรฅK‡]m๏<๓เฦ™๛WฌnŸฺโค|3ภ‚ร6g]>บx๓;ง‹ocคฐใ+จใ+ฯ๎›ซ๑’D #๙ฒ@Fส{ a๛T‹ ํ,VŸƒปฏ๋R ๆหRui=๒บฺณG/*ฅ'wžู๋e@ๆ€AlฅP›Bfyภ้€ฤ‚ฎ3Kว๊ฆ๗ฟ๗ยe-ศไ›ผq์ูSฌฦ หŠ3ำา~Yฐ วŠO ฟ3k–`7&ฤฟฯทXM˜ฃฃEูฒBถœฯ้ำฑp“w P๐‡ vƒแไoจv(๋TฃFB’มy:+ุ๋ซ—d0เข==•]ัŒ มgด|๒"ะึ>บ3‡แฺ AXฒuีช‚`8^บ4 š๔ …‡ขE33^tn1๕]ยำใว_œว–-…$cBrhจc‚ั˜ํแก์ŠfL>mธOjAๆY์ใำ>Gqี2ตืFทู>G$งy๎„ธnu_ดฬi‚Y „ึ^›n๛p_jFพ๙ฦฃUฐค'Qญ์X้๒ป‡ูBโ๓๙ซ‹5jh 1&”(๑bPž—zBhhฒ0'ฏ‘มำ๓ฟน โ์&G`/Œ$11](nLhิ่Tzzฆึ>T๚Cบ/8แเvcย{๏้ฌg —ฦŽฝa๊๖เฬ๊ื6 ซB)„+tŽฦ–ฃ”7PwZ๕’ฎPฌุฑ้ำ=…N}ู"๖w์……๙eŽhๅๅW ]๓) “A๏šiญuŠa฿[&ฏ๑ไF“วษH{X0f”น?OQึKk8ท๗š๑ฺ†/t‘มอ๎ฎ1ฏ๊“R์ทŠฉ ะŠษ‰ํfffฆ|˜“‘a|[”•O็mdุ3†ญW+ฯ…˜ช กˆ๎น”ฉ>๔“o๒ๆ๊?hTcF›ฺตแŽ฿๚ํ7มn0X–/Ÿ็ต|น`7Ž/ž๘T{3๗่ั๙Ž…บย™ึญŸYZ3F]+ ๗/ฦb/t๎,ุ †ณmฺ `6ิ‚4aภ™๗฿’ „ขEc๐g]8PL5ljียyผ๛๏‚`ฐ(W.-6ึkล มn0เ<œ4ข‘๊แ qr7๔บ๔ฃจ$q2%#ๅนขG0223Bž๛F๗พz/ิ/ส+.ฅ Œฮ๚๘c‰Œ ญZฝx2`€WจUห&##๓๗฿o vƒก|yหธ8ำa–`๊ž ์ไK0&0ฯธY3-ร฿๕6a๕š5M~๓3p ‘฿nnŸ|bิkœrๅ, Œ9P~~๑ยvš7ืื™MŽR๒‹{PPา๗฿_1F‰๕๎ํt๛6ๆ}ฮQŽิ2u€V๎cช'ชœ\˜‘’˜๊ฐƒ€?ฐะ.ศW๛$xนธF#ฑ^ง19๒Ž?,๕Œ/ืƒ๐!NซฟฯG…ฤBิeCไภ•ฯ๖˜uิi๗ฏ๘ #๕u…cหฯ่๊ปฅ‹'wตลQศ†ปN>Zงจึ:ฤHฐbš0/ณ1มเ๗‹pบฏŸบปs†๖ฮB€–ึ3งBA#฿ไMR`เ•๏ฟ?๑๚๋z<~)XVจ-ๆ๘โงDF^๛๑GธศวŠฒ) žm๖นอ šž˜่>jิษ:uเ์ ู”ž๔™Vญ๐ ƒฯžu๙๖[ซื^Š#/Yฒแ๖”)R?.UpoหปŸjิศบJ•ใฅKc m๋ื‡๒IOx๑, TŒ|‡cUน๒ฅฯ>‹๖|๑9๐8ooวž=ฑL!ึ๐ขเ'ŸDไีbิํ—>ิ˜แ7eส8ผ๛.ลศฦy ฝย{ภyt้'ำฮใ‰~jvฮใช}% y#์พ o 2q๐์ˆ๖ำO/1็๒ูณฤoฟuฉQใ„1.iลŠ–:]`CS"#S~๑xc Vจ`ูฎ9;;“ป\ "ส Pr๕jxืฎ…ูาtภพ}Ÿ€ญ 0๖รํฆฒ`ฦ๔ะ฿}gย-"{ฝน๔Œฐ7ผ๖K‡ฎŸูyEk๗ถ๔ดŒ`ฟ๐G๎7N฿‡68ท็šรv(4W;๎ฆ~iวาRำรŸE๙y>ร&aื บ"ƒc2าsgบฬฬฬ่ฐ8๛AX๒ฃ๋OฐhWศ<ž\8* ˆ|์มXภƒ -`H„YA๒Fุ}’7๙‹›[„gญTษสศ~SD`Pไ%BOB่=ž@ผขBbๅฺf็ +S‡ปD…ไ A˜$o„'y“ฟ=ำ† หDODฎSpไะ3-ดSzฆ)?O…’7aVผvŸไM>’‘‘)|วดฑผฤKฅเศ›iำ<ไ›‘Z„ฉYโ —7=๒y๊H‚ศEH„YA๒Fุ}’7๙ศ้ำ3ฉVอ:55w:พนB‘7ธ*xCC[Y‘ซrพฑณkฆuZ*๕%ฬ’7aVผvŸไอK"88iฯž'ซV=<{6˜›t๊tA๎ณNœhเ๓yD“๒&##ำฮ.ืษฝOtM้ถyณฏ|jึดII!œ}’โ“ฝo๘{\|๐ XืG]์6;สๅอๅ#๙6ๆŠ ^$oยฌ y#์>ษ›—“SXีชM`ทฏณ๒รއHŠ?ๆๅeิ,ฅDž๑ฒๅMRRz็ฮIZตl๎ฟ žRปถฦ'†ๆฬนหำำ ˆ”ซ2F9Wุ“ปR†aส๑๐gน๖"‚(ผ!ˆยMlr”ฃฟญๅƒํว๏oE8tgƒเ฿op›อ’lํ๓ 3ซ'่‰มฌ-ิ;ธ฿sญฐ๛›ฎฯ“v฿๛ oไ=^’ศอ›‹Ÿหธั‡งฉ๐๐ˆพ5๙๓ฯ4ฉ@ใeห›+ฤ/uถkwŽงฉHIษ๘๓ห๒ ีชYGEe็ห’รzญฦ—:n_xศำTD‡ฤ๎ฃ๑อ–s{iคanผ!ˆBLzfฺzื?‡`๐พสหr’ำ“V]™,์มเq‡—'ฒผOน?สย7฿๗AภฃGŸVฉข๑qRDไ%‘—ผly๓ีWฮย๒bbธz๑๑‰“ฟaa๓f_–Jdƒ๔ดŒํS-ไา}๓ž๑ไn  mvอดŽˆ็ษa.ผ!ˆBŒฒ/–1แ๘ญผ|!ว7๒žฐkฦ„Syy"[DDค.)BวŽ็ ˜?^๋ึg„$๚†I! ็่‡ฎ๖๋wแ‹/œ„3ีฐกKB5สา2GC๛๖ี"o๐_ฟzธdษใBถ'3;Ÿ’'87[ง']XฐX}ฮ๗ึำ›gX}^HBะ๚N‚(์ผ!ˆBLhยsมw7&X=ุมหrขผ„]3&œ๖9ยหูๅํทO Žฉž๐็Ÿ๔บฌ@––๙ึ[vยู1vํ๒ใๅM็ฏฟ๎ KำZถ<™ยKูbF0zยซผA˜$oขP“น๋ึ ม}ื;Žy๕€—.ไคgคmบ>_ุAa™ำ„ ธ^žศ.7๚พฉฎ0aยMz_@๐๐ˆฮŽ1แo๋vh*I+Z ิ}ืบ/ๆ ฎ?4Œฎp๙ˆ{&œ„™B๒† 7iฉยn:ุŸlฉ?\๔;แ๖์BDb/iคค'฿ ฝ๎ไo'์ฌ2\~r๒F cLr$/Iไ€๔๔ฬ/ฟิา๏HJ—>๏ฟ๓ ๙ห๛1ย92&๐Cކ๊>Pฌุ1a™B่ืYCไ”ฬฌ๓๛\%#„ํำ,=/=โ๙ ย!yCA˜LrrฦคIทJ”ะโน-z๔๋ฏ]ผฝใxVข`™™ฅสฏ?”,yนœ>9y2ฐV-ฉŸฅะจัฉใวi\V.“‘‘้f{FP5,8lsŽ ก)ฺ 3‡ไ A‘M||โ,ธืณงcซVgเ:xmอš‡ <™(`@”ZX<[ผ๘๔้ž๚รœ9wืฏ๗ฦ๙ๅ%sFbb๚ฮ~?pตC‡๓mฺœํืyฺ4g็08โ<‘ฤE&:๗ภ~›ณลชณ'ึ_<ฟฯีใยรุบ7‰W’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o"๗y๘๐abb"9&55๕มƒdศooาำำ๏฿ฟ้าฅณgฯzzz&%%๑B)))ฟ๚+l๓ๆอŸ?ฮญAA ๒M >ผz๕๊ULกnบ๖๖๖(ฅKfy๓อ7ฏ_ฟฮHœ9sฦยย‚Gˆ<.x๛๖ํแ‚/Yฒ„›ดq๓ๆอฑjีชศ)Qฎ\น/พ๘ggz๙„††.Xฐภลล…ว งOŸ.]บ4; อš5ใV๓’ZทnฯMๆล“'Oy็Vนค~๚ธ–xษฌฌgฯžmูฒ%$$„EcccกดYฮฦ๛๛๛3;!€cŽใ–๓ท‚VVV|8ซaีล‹y,ธs็v ปฦใ9 gฯžXิฤ‰y<[ธปป—,Yฒlูฒ>>>D˜มมม5*Vฌุ๚๕๋นIจฦWฏ^ฃGd~ํตืP™ทo฿~๚๔้nnn‡กK๘๚๚๖้ำGชpภ‡ชU'่™w\จl Œ7฿|5!ฯกโิฉSl:A.ƒ>}๚”'geM›6งฉF5@บฐ):ธฐž5+k๘๑<อ_๔ห›๔๔๔ฆM›ขŠ iˆœS่ๅMๅส•๑‹ๆsึฌYจ\บvํŠ(šmžIอญ[ท˜๖ีW_๛๏ฟ๋ืฏ‡ว‰่gŸ}ฆA€c7u๊T8…l hlะ~๓อ7XVสๆB€RBต…ๆpศ!ห—/G~4Eจ๏๙RTlผ™ัzํปwK–,iาค ,=z๔ชEฟˆีตhั‚ญฟํฺต›;w.์l†|hcTT๔z[Uปยลุ“…?๘ƒeฌuภ ัยญ&๎”D‘‡<}๚tึบีฏ_วญK—.X}6๏9qโฮยเมƒy\.?d ึ…ปป;dฎ[นBฮๅAp#๓lื$###uฝฟe่—7€๙Hธyœ ฒKก—7~•ค  Uเก-‘?ฯNMM}๛ํท‘sืฎ]คสษBห‡็๊งy๓ๆศทเฦค๒&_lD‘"M›6•}a‘๗๑๛hhกFx\ีšBบ งฝjฮk9ฟ๖์pะHs“ช#ิผeทข ศๅ ๙_lœj:]๙ปlV‰x๒Gถl๚/x*๊ซฏ`๗๔๔ไ๑ฌฌภฏ‹วี0eO‚ว ม‹;v๐ธ 4œฌฆ^ิxyyมุณgOื j:ไ„‹ฬใj˜ผQ๖๗Eํปฒถ~y#xEnnn0ขI๚3U6kึ,'Œ•5ฺ‰'x\;;;คส;ฯd๚๕(ฒ|๙rW& ํ‡ŸŸซA‹๕๎ป๏"I>˜-๒ญฺ0๘RZŸ๊1w๖ย… <ฎ–75ื-Zดv๙ฃ]ฐ7Erอร0(opฏก r–0ณษญไ\ภQƒ๕$ซ3 ;qือ๛๗qฝ5lุP8๕๐АM๋ณว(ถmใqต[ƒ๓.๔Kฑฐฐ€]‹œฉเ–กศ˜1cx\~yฃœ็ช ;ฅq=๒ฦศš9s&ŒB๛๒อ7฿ภ˜ว๓nrZถl‰S ” ึ ๘‚ะ!ppkฐ(Zy ดXปด h;v์๘๕ื_ืฏ_ฦ๊ีซใjg™Q3รแA~A|๑วฌ๓04pŸ>}`aoqGณ‚Œ˜˜(ุกjเW f`A*Vฌ(}ฒ ›‡KจTฉ’}พ๚๋จ‘ œp‘#*<ศ{๚๔)6vฌbฉ์อp—.]”ฝใ ส€ใ€CT{ึ…‹B/oึฎ]หใj ปห!C`Yณfป&ฎฎฎล‹ฏSงฯg&o”#(J•*… Bแq#`ฝไ_5hาชVญส#š,]บ๙ๅo{ฒ!oุ[&แ}Ž„ตต5Rๅr˜ผม หใjุั{ฎ Xฎs4ฦะcฌใ K&†Ays๘๐a”f_0?˜ผม‘๑•๑w฿มx็ฮžIใๅ N1,K–,แ๕  ธVpŒx>0—N฿‘‘‘๐Qฺถmหใš@ a _~๙%ซ•๊CWร.3T†<ฎยyw๔ฬ_|wฯ6lOVฃ_/!{๑ฅ|2ญGนSSงN…Qxฟฤ…šูg‹ h ๕ฌกqชAะRWจPGT์ป ={๖”บ,fdd๓ฯ?ฌฏฏ๐4ำ`็4๖W๊ษ`F๒žร6hYส—/[’›T๔่ั™ก[เhI๓'ฑŒ:ubQFtt4ถGI๊2ƒๅณโจ”˜Eยyƒƒ€<4 ,‘C ฝผQN ญ”7L่๗6ฯg&o„~;๒ฆ~๚<ขFซผIOOŸ3gN9ีศQดh;t่ภž ่’7ส‰Vฒ!oะ$๓ธ&oพ๙ๆWC๒&ฐW^บZZZช~๘๋F๖-A~\ธ<„ฎ๙ธPฑั„M›.˜ yร^rj ุ๋>นCษ\4ๅใmญ๒ๆมƒlดจWฏt5ลพ‘— yณx๑b”Oof0y#Œฝมว๙า๕Pำxyw]”.]š็ำอ„ ๓ไษ“<ฎ Vร่šฟR[ตjลใj%๐ฉโCLู7าธ+ชๆ€Vทnvํฺu์ุQSๅ๒3ู7F๎”••Œฝ{๗ๆqีT4UซVล’Mš๒ศEp-A`ศ็์`F๛๚๚๒ธฐ‘`๒—ไL4kึL์e๘๘๑ใy\E6ไ ๋ะ ๅ <‡์j๚๋ฏy\ำ'#GŽไq5•+WฎVญจž๙รCqๅ๓Scไา…#ˆl๐Jศ›oฟ่‡-ฺ0f]ŒœหTR0ย{ตk—ไ์ยK`›วขy opdx\ ษ›l/ชiำฆ<ฎ€Jeวญ๓ฯ?ศฌ์u ySฆLˆ—ม:ณญZตŠวณ%oX':]=พ˜‚’ทฒฦห8gา ๒วœฃTsธeCฐq๐ํปuนˆVyฃใๅ T,8•ผิDžSlฐ™r‹???ไ๔J๘๘๘ฉL  rใq5ู7lx.9์Ž4เะููฦ|‘7F๎N6ŸœW{{{^ฆu=q ๒(L๘๔<ข€ฝ^C}หใ†ภYFM^ฎ\9WมไrKๅ€ฬฏฟบ\–dCฐDสส–ซฮƒ\E3yฃฏบu๋ /a๕๊ีP/า$๒^"V๕ฉั ›K €วeH5jFFฎ(ญsผฒ‹dฺดi<ž3yaส™m9ึ[กB,pถX*ฃเห6*7 ’hY $ณNผ$XปฏตVK–,Aช๑ฃUูฅ‹๖‚วU0yรพ0ก„5.๒Qฒู7ฌn ึลN๎51yฃฌ‚ดส›Gม—@ฅ" ๖i์ษ6”Ty‹„Iผ๒&44ดbลŠฅK—Fวววฟ๖Jeข‹สTOฐ4mฺTx; Gv’7…ึ?mศ!<ฎrW Nะฺตk•–––lDŠrเ `๒ฆSงNยคyซWฏ†ฝK—.<ฎ‚๕%“P6…ผTสภž๐ :T๐จเมฐaC๙ลoผผa๓8+ๅ ๋ืaชผa=ฃ„ุfฦK•7UซVลฅx๖์YnRU\5x\7ธ pŽเ‹ oฝI“&๕๊ีcQVE๑ลย+ว‡โ:วศ฿ฟ™คnบฃิ๓นbฌJฤQผx๑ฺตk ฃ?Ž<Y\ฝzFTp[ัฎ>|X9ฮ“ศ{†Ž๓‚Sฦใšเ&…/^ณfMแฉฅ.ุkฟ›วU0yฃk0!๋ึ+8• yำU๕อ ]Zพ๒Ka์žRvบSสŒlิZทoวMภzŸfC<{๖ วณu๋ึ8CCฦต|ซŒ—7lLaษู–7์2๊%'ˆ์R ไผ\ำJ”ƒ2œ6žฌž%!ด <ฎF๙K4๐Uี฿Gำศเฮ4ุ~ฐoา ,_พ|ใฦ<"รสสj’๊›ŒrPฃฑnKhAY๏jฯ€ฉ_ฟพ4‹*24ŠจhXTญฒ‡‡–รใj ๑ุ€T9ศ7‘=D8w๎ี‡>ๅเเรนaOwไTจPม\ศ—NqลŠแบ Sะศม0jิ(œev„q  ฉ`qึเ_ SyสA „+ผyยuฅKๆก ฬŸ?Ÿ็P}Vš™ต[rไสะšB๓๐5อ›7—?ฦfฮท\Bhฯค๛Kพ +r๙๒eแถล^`KคฟSงN์kŒ๐;ูผU4๓8hบ&G.์เสBๆ{.C–Zyใ7x>5ฃG†ฏ,]f๒ฉD,--™ฬา…zFpผ๔น‡ž”jTิุ๒)t!$˜+ค<จXค๏~๖ Jซมุห=9จฅg.๐`มแBf,Y๘: {วคjถvํฺาโชƒ฿&=/˜:u*๎Pe;2x๐เณgฯ๒ˆ ิฑ›ี“ภฦ@๙dcงpุWžะd`รุ“"๏INNฦลSฉR%]=ป B฿z๋-œ)4zZL\ขจํqyภฃเ&5LเยS~ถ• P>s)๏ข๒่ั#f Rส›kืฎแ ฤvส?›ฦ`_aพ[jผผa๗š๔P•cฃฉ๒&##ฃUซV8&ฝธ&ญyƒ๊ํฤt3fฬPvอถmใ9ิ?~<%%…}้Ybๆฬ™ยภ8[ทn>|xงL™ข์ฃTj๐๙BU :€Šjeฮœ9คฎgPPซซ๋ฌYณธIลโล‹%ง!!!…m@mˆ-G…๘ไษˆ%_ทnข๘ๅ%Uฐใ€%`9คkqss DAnR๑ื_!3ช6l'7ฉXฐ`~''ง?“›Tเเใœ8q‚วีศฟ๚GNฉš5k BCC๗๏฿?aย„~๚ก;v์–-[ุ“f=ภc3งกษYตj.œhŽ/ฎpœGd†๘็&ี—ณUcศCูR ฅ~๛ํ7\๙p์คท  \แผค ุแ๏๒ธyŸ(4ซธsฑู๐ีเโš‡อุกC‡W2nฯ;wฒ‚ŒํทK3ขขyFหŠ–๏ุฑcฬb~ rXฒd ป๛$.\จ๔Hไ์ฝ›gUปลลŽย๊ีซนIชมฏ‚?ฝcวŽ#F .‚;ฎ๔บ ‡Sฦ–€ซๅิฉSZ;^Bcซ8lุฐ 6Hณช0p๊… “ี`ธ›ฐอค#/ฃข =|ศ^ถkื&{}*ZW>ิE™2ep)rซ &o@ณfอค›จู'››6m*dุโฌ'*{ซ‘%1”๒ฐ~ช~๘ก——ณ$%%A8aรุ‹Pfd/o~UM4?fฬSฬรถ\9BRฟผa} ฬ๘ƒfD^RเฦDกๆนsUซV…;‚zœ›r Iผ‚@งA7VฌXQืทS ขP วNWวTww๗ฒeห ฯื‰<#--}ฟAซ8aDFFโฑทฏ5kึ์ท๏ศ‘#กฎู]ะถm[ฅg0yำกC‡RฅJ/^ผ}๛๖;v„‚๑๗฿Wสฺทo—,YU"Š ญฉVญ{นิชUซ† ฒNoผ๑คš$V*%%* vld๋ึญปvํสพYฟ~}iรฐฎ–-[b ฌ Iฝz๕7nผvํZ(|, vฌrš4iยฦ#aวYŸ4O}๔๒ ส~Qiฃ ณณ๓๘๑ใQŠฝ๏ญ\น2cกู๊z.๒๒ๅหC>…k~jœ ฒษ‚ศež={6}๚t๙0อ\แU–7^^^SงNe/|ย€+ ืVi&งgฯžp"y„ศsž?ฯขโะกCค๛๗๏ฃ๒oำฆ ย์xลๅ Aผ HD&<<|๗๎ช‰ฤ8ˆF๑iy‚ w๏]ฝz๕ˆ#๚๕๋๗ำO?อŸ?ยF˜‰‹03HDฎC๒† ‚ "ฏ8p`ตjีุ<eห–ญRฅJืฎ]yA9€ไ AAD^3o<6˜ฤ่ัฃyA9€ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒ฆะใํํ=v์ุQ*Vฎ\ษญD^aaaัณgOอMพ๖฿~๛ํเมƒัััขUHdddL™2~๙gnส'๒KŸ๛๗'%%๑8A˜ศ™3g๙็Ÿ|ฟ„† ‚›่ส•+<ฎภลล,66–ว‰BKซVญpฎ%6mฺฤิ4lุงฉ™0aO{ุธq#๓ŒŠ+f๛^jj*{~มฐตตๅ ‘-H˜$o๒๒คฅฅUจPกfอš<ฎ˜˜˜ภภภ๔๔tื ฯX ดLƒ๒&***((zŒว๕‚โrฌฺศ#@๙‚AyC˜ ฯŸ??Ÿ‰3๗฿WฉR%,,Œงฉx๚๔้นs็&Mš„ ‡บ|๙๒ซ#k‹+VซV-kkk__฿jีชA๊„††๒dœFyํฺตํทเƒ:t่ฐ~TISงNmูฒeีชU7n<~๘ศศHd{๔่ัฏฟฺคI“5j 3๊ฌฤฤDถ€<=z๔€`“PI8qขo฿พu๋ึ}๕ืปt้‚ME6ธ_{๖์ม6ิฎ]ปAƒฝz๕า๚ฮdณfอุำ๘ต]ปvทoŸ0ฎฦVืฉS'WWWแร‡cƒูๆ๕ื_)))<ซ&^^^cวŽ}๗wฑƒ-Zด˜6mZpp0ษ›|ฤ ผAํซื$หภUฑcวŽๆอ›c  RฅJฃF’Q{{๛wy๗@ฝวผ๕ึ[ศYฆL\๖gฮœa9 Tๆอ›‡ซ๋-Zด่๛๏ฟฟu๋ึ๕๋ืฃ R@Q@๙ผ๖ชM(‚๋๊ท฿~“fD8z๔(’ุ6`ฑ%ธุJ•*5qโD–GุปO>๙„•ลฒฬŽ– Qfoืฎคส•+q1ckK–,‰ค;wฒœฏ8;ฌc :Šˆˆ€ฺ์ึญ7}๐2lถศสz๘๑่ัฃq๏ใWฌXฑ{๗๎666lnŠƒ๒45จ‡ูZฐ๐7nผysุฐa5BMถmฅK—สี{\\\Ÿ>}X/ฟRชฑูจ–™}ฬ˜1ฐ๛๏ฟฐภ฿ชSงชnธ_ฌ8๘แ‡ข^mฺด้ Aƒะฐ%H$%%ก6F}ฮฎดG_}๕•ฃฃ#OVM๚๚๋ฏฑ.ธqศƒEฑU๚้ง๐q‘M<`fฤ‰`Ž ธ•ญฎ๓๚๕๋ฃฑ“Uœnฉ Bห‚6Žใ_|๓‹=ย‘ŸA"ฯภŒ3Ž Nฎ4n•ฑeหd0๒1ะพ`ฏฑ๏,ยnฬž=ฅŽ9ยใ ฆOŸŽ $oˆ’Ÿ๒ญ\วp’ ะผก/]บ4,๒ภN:…6F(Ÿ~๚ฉw๏์ehฅvnัขEpฟ C`‡c๔ฺkฏแ;ธจ๐ <.|ศ!Gหอ&y“_่—7—.]‚๋† ธค.{\ฅJ8^“&Mbup๕2๗่๊ีซlf6œ๔rๅสีซWฉธ†‡  ฎjcถ4‰{๗๎มyBNธz?๐nxHˆฒ๋J7pjแทมŽซ—(„ SDq)ฒ ็ฮร5Œm€—+„=.{Dˆƒญ๙ๅ”eท็ล‹™G ๗;์าŠ_๖oู=_e~EXถlค,›”'ีKpp04N;›8Vศฐfอ–฿าา’อou#ฎVฯเŠ’^ฌอš5 U๘iสŒW…T๙HSM FEต;›*๑‹ธŠ๐g๒ไษ,›ฎ\น‚œ:Uผ|Vsข*“W}ธ ฑv5ข๊รeŒห›U}l๗ๅN$ค/j`ไg{'นPจu›7o;ŠC๊ใ ;1ศoeeลž !@+รๆท@a6&๛ฑฉจ“q  ๒‡\ฤEอฯsจี@;auhzึๅ๋๋‹ ้้้ธžฅ ’hd ๘w฿};Rั.เ|ตlูัJ•*>}šๅมVษ ๏,?ฺ gG๒๐แร,3‘g0ysฝ{๗โbSึทฏฆผa๏ฌLํE†IeL๒†ศ๒SŒ?1๔   nสส‚sใž={X๔๖ํhข %˜„……1o์ื_ๅ&ฎฎฎ0ธ’—/_fฦิิTๆ–๖ํ{zz2{ll,๓จ”O๒X#&L˜ u$ฝvํ<Qป-]บTzํณ~ๅ2 x{{ฃ)‚C)9pSZดhœส›๖฿}ฑ2•s์ๅๅลŒแแแpัพ ฏยQ)`3ะ<หง:{๖,Sk$o๒ &o ญแ‘3ะ"BEเ‚ณ‚$\๓ฯ-Jฉธ2™^เดiำ`;v,ณ0˜ €๓'oNXg3กทwTTS๕sๆฬ‘เฯิฉSa‚ผa]/เแชc8jะ$0ข)b€ S•~๑<‚9dh‡เถูE-P๙ชณkืฎฐ—,YrำฆMRท4ฟ0๊’‹ๆ ฤ$๖}๗๎<ฎโิฉS0Bฯ๐ธชบรE…_~HQฯ@๔"ง0…T%Œ8<ฎื$์kืฎๅq5ฬqฑธœP@u๓dภฤๅั Aฉ#.l&*Nž<ษ,X/[ ฎ=ฉ ญYณ&ิึห,LQC๏๑ธ( ุฑ^า/-ท ๎Gi{ฦใŠ+X”qไศๅีธปป;„.Kฅz7ุ9mะ Aศเๆๆฦใ*pงภ๘๗฿ห'เ˜`๓ f๎ฝหM* ๐‘Lœ8Qz ไ่่ T‹y†$oPB๚โ:ไ jtษ›วO™2ฮJม็^ ›จHธจpกž8qb๔่ั_}๕ฎดฐ็๐dเl๓ฯp~Pแ+๏&‰`ฅXG}„œทnโ F™ '";ฏ_ฟ;vQ!`kถm‹ฝฦ%hD„kXษถm“‰v์‹ž>”0‹:ŒศO W๚๕๋๑Gุฃ7n๐ œœœFีฅK—๎ปcK”U๑ ’o๒พ; `Uw๏ฝy\“7h‰x\Mํฺตฉ’ฯ{$yƒWฏ^ลฉดถถfI ญ๒72{ูŽชปaร†์ต$9rค$ถ ณT†ํทgqขู๘๗w๎‘zK๖3f๐EศXตj<คBœณ‡žจ ”7ธ จXพ๕ึ[ฅTŸhิจ‘ื๊ท/Œง4d/๐•Rษ›aร†ฑ&ญ'์ 7Ž็‹ฅจzฐืฮh:ๅฤ‰W“|“7‹/ฦUธt้RืFpp0ฎl4 <ฎษฑcวฐ <ฎ–7;wๆq5๛๖ํƒw ซ™;w.์ธ™y\ “7Bv๐{๏มฎ‡๊ๆ7เM"##ํ์์ึฏ_?gฮึฏWฏ^Ef์ฝฉ ,เ๑์ส›~๘วM'""^ ซ๚˜ณีW_๑45L(•-๓Wค~Œ๚ๅpมวววรˆKH๎JSฐ๗๋ืว5ม …;†–M r.\ธงฉษ†ผ™ะฒรw฿ธqcLL ์XNญZตpอkพ};2ืฏ_nปHœœœ…ฅ|kค่ดVธกpญฒw้qqq+Wฎ,]บ4*d– ๗ถy๔่ัXแร‡๑฿˜OWงฆฆ"'ปv์ุ@x˜ผMš4ฑดดฤqฦ–@Ob/ y&5ฌPปvํXA์๕กC‡ o s่ำบฏ8๙&oX'4ทฅK—ทk‚; ฉ_|๑ซๅฒIf๒ญ,ซaใtษๅ+]&o”tำ*oP~๓อ7l ƒื%oไรฌ…\@ ย‚*Œว5ม6ผษ/˜ผัี™ŠIˆž={๒ธึตLr1yƒ†Gิ(ๅMZZšธA<ฎ [ฃ\,ZดHต*H7“7h}ณ็]้—7สฆ่U–7QQQpŒคiXw5yT&Œu †AKิ๛๓xvๅ|ไ‰๑@•Aษภ๗ยฌ๊ำ%o”™e—ŠI๒—%จa๒F9™‡.yƒš–u›‘`›-W‰Œlศ๛ฐ่ฅฦ๖W"Žษๅs’7๙‚ oPร–7ูบ:งนปป ฏ&pw g๋ึญy\ ป,ะ„ก%K–’ &™!0XGว{๗๎q“ V{๔้ำ‡วu[ฃF IฦHฐงษ‚๗๒Rวเฆ–wใ~๘!์มมม<ฎ:hcšBGVึๅ{๖์ูB]ฎย€d€ซ nidฃ.๖์ูƒ%่R;wฦ}-;๐Rๅอ๙๓y\ U(,อฦ(?F„„]Wวโ!Ÿ;ง้๏ฌษ:ง5hะ@๋m  KภภใIฐqAh&y\Eฮๅฅฅ%,J07—ไM~ก_ธงะŸ<ขๆฦ(ีถm[ื‹‘๒ดjีJh‡$XIนผaฯ๖>sื “7สafFB๒ฦ$˜DรฝZปvํ‘#G๒ฌsZำฆMตzบ๕R้œฦjQ]๒ฦTวเฺCฅ-๔ย*เ๒† 3รล&ิ๙Fส›™3g ๓5๋๊œฆ๕mXZZšญำH”๒n@๚๕ฅJ—ผม™:t่๊g6zD•9ฯก†]–ส{„[Svเd๗๘ฎ]ปx\}5kึฌ›6•Ÿมqtฌฃื๙๓็y\“9sๆ U>๚ๅฅสe†>}๚ภ.Rศฆฑ…Œแ๛ฉๆณฯ>ƒีบIHไ็ิ%J”ภ๕'t˜F[ฮfeั=zเ2U๎ G“†vTyƒสซRฅJB#ฤ๊ฏœศ›ธธ8ดมๅส•Sพ;๕ื_‘™ไM~aPเ Aรร>|๘ฃGp…ฐi …iฒภชUซpฎๅ{—7( ฃ๒Fธ~:๋2$—7ฉฉฉ5Rบค`๖์ูฏฟ:VมขุZ”%y“gเฺ่าฅ‹““Ž๒๋FH‚]yๅAHฃv•?ๆdoย•ƒ๛ู(—\”7จ”gีฬVภm…ฅ{๗๎<ฎ†ีฬJy3lุ0ุY_26PV)onธQดhQ8ฤB/ภฆผ yS Pส#ชM๖m%ญ๒ฎ{k‡›ขo฿พkึฌ9z๔(ngิไ€gRฃผ,Lศgฐd(ๅ ฌ‹VฆŠ6>๘เaฆดJX๊ ืd๙H•ฯm๓Rๅ๒ีฑRฐค•+Wๆ;)ต๕5๑ ’o๒ฐijัH]Eกmุฅ/Ÿนs็ฺญRฅJmฺด ฉฬ่ๅๅีฆMdๆ†*8๒† _นrฅิA™๔ำO0*`/oซFแข6d–๔๔๔ฅK—ขํ„ไM~aPฐrฐฉ3Yซภ^๎]ฝzตt้าธย-Z$]Z'Nœ€uด2^`9์Z…๓ฉžUบ^ Œ@.o\gศดมะEฌฎ[0ึฎ][jIไ1›7oฦ} U‘ฉ|ƒ ฟชŒ ธ8R=ƒ “E–ฟึl†=T›า5†"๐0ุCๅ\”7ธQpบuา&ลฤฤฐ™ะพ๒Kf‘( ๒&99wŽค|ŠNฌ…อ{ซ”7ฌ‘b›…‰a”๒Œ5 ฦ๖ํKงpNq  D+Vฌ(๔[#yS ะ*opบt้าฉS'ั*o˜้ัฃ‡๐ฺห7์ฉ–rŒฑ๑,\ธKภrx\ฆ.ไใฅsEœ?^ค`ผผaฝ:•“฿ศOy“––ฦž+V ฎ]๖ฑส}s็ฮมัโ‹/พ@๓€ˆ๓ฯา<žห–-ƒ๛ศพฎ€ฬ๘V6:: ูgเจแ?|TFhh๑Ÿ}๊ฉ๘?~๘ฐฐ0xZ๘ท๖fอšแ?Aธค:tภˆุ฿}l-๎=‡?vlผมถฑ [tึ๕ฟนpVvฐ]ปvศ3lุ0”b{ฝรขญํฆš&ฟFฐร›ฤywXิ_l9ฐใ€ฐษQฯขาฤ–ภˆญา๕%{"ื.eร1qเฉเผืซWO๙1%ึีชUซw๏ศ†?’tม…ฤฎ๐’%K6oœ]pื˜ฒตฑฑฉYณ&หN: ์ฉSง žqฦuญ -{™ฉรๆ4‡Z`Sz@ษ 'Ÿ|ย2\ฯl2Pไoูฒ%ปจะปธธ u฿พ}๐ฐQF\c๘pใfลฦฦย'C~,ลฑ์ื<์ุxุฑ#8ŒธNž<ฉ_๙จ๚W‡ธธธJ•*แเ ใ&Mpฐ  ~๚จ pใณบqฬ˜1J9ฤd$ๆgŸ}†ส–ี~lY\9จ7~๚้'ิจปwว6ฅlใฦ๑••R”๊ยหห‹m3*.T}จ9ู*ุูฤvข’|๒ไ ,™M›หึ>t่Pว… ;.‡หๅ๏๏฿ฑcGg—(ฎO,๊'ถ vฌB^๕=z'๛ฒ'.uุฑ๐Mqซโ?๛d-ฎ+ว1aร—q—ฑC‡ป›[†m0,Xxร† แคJ‡Fศ!I4 ธU?~ ;๎่>๚‹eท3ฺ#lžTงคคฐน‹/Ž็‹=nภฮJฯหัก&วp๋!‰ตA@7nภ.ใ?V ;`O•s{/ ญ๒เผเฒ9~ธVyƒชF้้ญn—!oผฝฝqiกRFไ€ษ“'+๋\๓๐ˆp'r“šทocแจ=ไ3›็D:tˆEq4pณ ใๅ ๒ภ‚›NพUŒตkืJŸ?&^M๒S0์ํํฟ๚kT๔hoะnอ˜1C๘ ๓ฯ?[ตj…<ธ{ฟ{hžฆํฺ3T๚P111ธx\ สย'๛๖oy\อ๏ฟŽ๕ฒฦUห\ฟ~=ชงN:q“ ด4VVVgฯžeฒG–๔ฤฮืื ฎ**2ดŽ?๐ฺ0x ุ, ๊หฯฯ๏—_~แ%ี 2ญ`ฏ^ฝx\๐ํzแƒย#ฤJ7mฺ„{โฤ‰,3ถJ8>ฤหNช]U_ฮ€ด๖r†›‚+กB… ๐Š„/ EFF.]บzฃI“&8กSงNลๅม’ะ‚โแ‹V(ƒ๋ล%ฑs็N4ฑ๐็:w๎ัี_E+ะุะ*ุฌจQฃFƒ ย๕ƒฺ๒ป๏พรu…‹้ำง์ษŽœ‘#G&&&BE๐ธš%K–ฐOุfWฏ^ล^p“ l๊๙๓็แn21 ๕Bwa…fwข๔z“]ไึุlฅฑcวขศŽ;ุ35\„r๏ขFF\ŸาWศขฃฃๅ‹Vํ>ฺๆเเ€ึU7$ุœ9sไํึ6hร† ธ฿ฅำฤภฺณ๑nศบไ ภฅ=€K y3fฬ…ฏ_ฐ  _†ผฌ:ฒ|KpฃัฉXฑขมฮi€๕1ม ŸฏŠ72์ธธIE๖ไ TJญTอ;‡บ…พฦห›ŒŒ b0โ,ศ7๘ไษ“ะi~๘!ฏ$๙/o‚ ญ@ึฉSG๊—KD^ฒ{๗๎QฃFฑก๊๛๗‡bzF<โuไ d<{ูซWฏ… ฮŸ?~<{™Yผxqๆ๑ใวCธฺูู=šu‰oุฐ!V7cฦ H‘ฝ{๗โ?3์Pย๘ฉลฎZต แปร๑วใฟ๔ญ”bร•ห—/?x๐`H l0{›*!]ฤววณฅตjีš8q"ด{g(Mo™™‰}มz[ถl {ฯž=๑ย„ ะQ,ƒ~๎ปWฌXฑjีชAณฑWฌP,iัขEX๛4ะ็ŸŽ๛๗๏‡n™:u*ณ~  ภNIpqู๛ฺุตk#6xะ A%J”(]บด‰y ณ‡ไ ADA$$$ฮะ๏ฟฮใAไ-}๔\g9“&Mโij ส–-๛šzw9P/]บtaฝAๅส•ว5๒๖oณ•[ทneว”Sฎ\9(%6าLƒวบtส้ ›ึฏ_ฯ^ถ0 Bt}OV+ฉฉฉซWฏf™6พ]ปv๒žQUT•ๅ`_$•b-[ถ0ัย4HKKcjPกทท7ำWrไŸŠ‰‰™9s&๋O ฐ%Phยศ7โ„ไ ADเฦ{๖์‘:Aอš5 Mตึ.1Aไ ััั/พฎฏB9(…‘™™ฉ็kXXุอ›7„<าวW BฒหW คฑŽ<ฎy˜Qเ๙๓็W๒`š $–‡‡‡rฐภ–๐ีซ1ฆ็›HAิlาGียbก[˜ส‡›Th= 8ถ8ยžžžศภMฤซ ษ‚ ˆA๚๕‹จฟ,qเภRฅJ Ÿป!‚ ย $o‚ ฌ฿|๓ๆอูไฮ:uRNCOA„~HAž?>`ภ€:u๊@,YฒฤิAA’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o"๛„‡‡ฏ_ฟ~™ [[[n%ิ>><ฎF็ดูณgcงผฝฝy\ลฆM›ฐ(www'‚ศ "##=บt้า… ข๓๒๒ZทnฒFฅmkk๛๗฿๙็ŸP 666‰‰‰6†m-ธx๑";ฐศผu๋V๖จจ(–M+แแแ–––8’ศฯŽyƒำฝ~lรฺตk…%์,nnn8,ยค Dไ AไJys๐เAT ฿}๗r"{#๏๖ํท฿พ๑ฦ<’•uyd@ˆ฿}๛๖qkV๒๔๏฿ŸG zผrๅสIw๎แ&ะ]6XrNไ v Mฏ dfฮœ‰œh™x\M๎สฌดx๑โ๐!x\Eทnไ๏‚ rฮแร‡+VฌˆjJ€y๊;w๎doฐๅผ๓ฮ;qqq}x&จ๐7oฬ“๕าขE ^FแMN||ศ‘#Yฟ‰.]บG@hฟx™"Ejิจaaa!ํW•*UBBBx>ี1”ฟี1vฅถlู’[‹™3gฮฐaรไ›„–๎๔้ำ,ง(7yง4ำ3fฬx๛ํท๑_)o๙็ึูA‡—uตhนตH‘UซV๕่ัƒGŠYฐ`หCHD. ”7hขP๋)}w๐์ู34W๛฿x\๒B‚EQ-Z400ต6ด3ปwyถmฦขูฐa๒cQ<.รสส I9‘7ะ9>ผx๑โ๛‡Šœ“'OๆijrWlLญZตคฦ)<<[>{๖l%‚ศ9จจK—.ๆ›o๎ูณวำำำรรcอš5ฬซพ{๗.ฯ”•ตbล X^uธผnnnพพพฌ‚าGฝP2 e'NœIs๋ึ-8ฤh2เLณ ต=ึ‚ๅฃ*พ๗{จํ/_พ {บuaนrๅ [#&&†ฝ…่ีซ—ฝฝ=ˆ;vฐœวŽใ™ts๓ๆอํท4๙๛๕๋ทEล"""xŽฌฌฤฤฤ๖ํ#ร็ŸnccIƒํ3f vคjีชRƒฅ‡ุุุC‡aษ.h๕PQฃz—ถ๓๚๕๋,ฦล2ืญ[w๛๖mข๛ราฎ]ปดด4d`[หบUใ๘€oพ๙ๆ๘๑ใ—.]Zดhฺ‹š5k&''ณฅ1ฐ๊6mฺ ซVญถn๊่่ˆFŠตห A๕ื_0ขe>ฤ้พpแย_|Kทnุ3JWWWœ๖ƒRฅJap(X๋๖ํท฿ฒ…’7‘ (ๅอkฏฝVงNQะธqc4œา‹วฃŠ็ŸX๔ƒ>@ป…?จตYถฟyUY ๓๓ฯ?#?Z#—€คส›งOŸN˜0:Rๅ๛๏<‡š\—7X ZXXฐ(KD…—TA9ฉ๙๛sGFฉs,t ชM8๋จ™…_yส”)ฬ5Gฅ๖๎หRฌโ2dgeAZภ :ุ€Cผs…'8ใว‡๑—_~แq9จ<5j$/ฎcoP™#’Ljช–––ะ*ญ[ท6r-€ฝ๚จVญ๋“ฅ$MWƒๆj-ฆะๅ๘๛๏ฟGจ#ฯส‚>@๒q“ Hูฌ9L 8P1cวŽU-CCเœ›T'ฺ9ธ)+k๚๕ฌ๘ผy๓MIIมuขผ‘๏ผ!ˆ\@)oี/oP™ฒฦ้‹/พภŸฐฐ0$3ู๓$6XŸ>}š6m๚"ซqฐ16Z๛IณF4'๒ช‰๕ูhัขลŒ3Ž9โไไฤAๅผA›Šํ์ัฃ‹๖๎ค#Ca[ทnก‚๚๘ใๅu|่ฅK—Jco˜ญฟ?ุล‹‘Ž2ซ{]นreธ๕’H`53|๐๐pfaฐ๎สr%_ถlY”UŽ๐aฆŒœ@Rผ‰E+†ฺX จ2Tฮจฉ &oดพcใ?ดnรฅK—`GCฦใjyำฉS'W3u๊Tุ!บx\๕6ฌx๑โoพ๙ฆ|€‡G๙ๅ๛…c หฮ;y\ “ธฃGๆqตผฉTฉ’ึAJDมไ AไJyรบ h}ู # T *THII9|๘0 ฒ)ศฎ^ฝŠ+Vฌ€ฉ'Nd™a๚๔้(ป{๗n—แโโ‚$#ๅอ๛๗‘Y.oะืฏ_‡ะœ๛์3$กแY๕ขG@บ ต7kbccƒT่ 7“7ZEื๗?$อŸ?Ÿ๏€š•+WยŽ}ไ๙ิ๒FนR6์S%๏ภฐเ๔๑ธ&M›6Eช\0 ึศืญfม‚ฐ๒ษ'<ŸZเbเqข B๒† rฅผ™3g*A๖F€น๛ำฆMใq0^บti๘๐แPฌtzzz•*U>s๖K๘fŽ~˜4๚เƒไ๏ˆฌฟตVyiม#jN:…ฬryyKปvํx\อ๑ใวaฯนผว€-aญญญ‘G๙ŸRฅJอš5‹5x^^^< "๗pwwŸ0aย{๏ฝWR5Bฟจโค๗-*TจYณ&๛ฏ‹I“&ก .PK#์™ผ‘ฆ์—Pสึ^่A*Czไอฝ{‘ค๋ษั•+W:x๐`7“7๑๑๑<.ฃI“&Hา…ผbต=๋&G)oX_๎7๒ธ&ส™ำ”ฝฌๅt๏็Sหด๏ห$›RZโใ?ๆ&ฃ8iถ-Šฃi3fฬิฉSY๔ฝ๗รฏRŒ=๖† "๓Œ3 คI๔‰'ุlงUซVสฏๅ๘๙๙ษ‡ญ/o ต*Wฎ\บti๙‡ั๐ลญฌฌŒ"ศดAu๋ึeก+Pb-hG˜Eฺ#„โqC @+ฦ#šฐ`BwฦีซWๅูŒ—7Ož>>UซVๅ&‡๒!ชะEะ?X&’[ทn๑ะhรเ"๐ธKถ๊UซVqA„) ŠCRซV-้ห'>1€4บำำ5*ฦ{๗๎1 cถm(+คg๓O˜0AR%))ฉYณfจมXWd`ผผ๓็ฯ‡‚Dxซฯฤ๋…ฝๅ`‚JmMฝz๕X`N—_~ 5ลM*–/_ปฉ3ง้’7กกกQ8Œย6ใุข5Dหยใฆศ๐w฿ม( ฟมฉ”พ>$—7hDะvcu.\เ&...ุฐ^ฝz๑8ษ›ยษ‚x้ IƒฏUcฐ1HPม#jะ ๙(NมมมุึธFEEก‚Vสน็ฯŸCV)็œQๆ๏๏ฏฟoF๖ภ. ำ)iูฒฅผ๑“รFพnบ•ว ‚ Lษะถm[KKห[ทnY[[๔ัGฐศŸ›ฐa3NNNpˆ.\WพB… พพพ,ฯำงO! ต๎ฝ{Nž<ูนsgX† † จHฑ๐;wย๒๖o=zิU1n ๖~ v้K ๐ฮYO9ศ-xฮฮฮ—.]ยา`iัข…‘MT๔Uร† แึฯ˜1eๅ๓ณกbG ใ๛๏ฟฃq๓ๆM;;;6 s๕๊ี๑ˆ%ฺฺุbณกK•*…?๒]@u]ฒdIlษO?dee…AฒพlŽฌ ๊eโฤ‰ฐ๔๋ื qww‡ีีฟ๚kุ'OžŒ<า๗FCBB4h{Ÿ>}ฐ|,sืฎ]7ฦZ c`?t่•ิ5;%pฦ6lภf+VŒ=}ปs็ึ5|๘p”ลqฦœ2œ8Vœ(hผ!ˆW๒ฆฐเ้้‰ฝ€oมใ2าาา>๙ไดฆฦ&ˆ BWิ0ญ[ทฦฏœฑcว ]ž8ภบฺJ@ฬœ?ž'ซ ๊ซฏxฒ , พ2{64mฺ4n•ษัซW/‘!MEœœ}ห–-(ลฒฒpไqูZpภ™‡tีชU๛/๖Z8์AAไ $o"งt๋ึ nดœ๒ๅหoธ‘'ซ:t(O+Rคš•๕มpk‘" š•Uฏ^=nีDx“าทo_žฆฆ}๛๖^^^iาคโล‹WญZUR8>ฤ* l”,Ybใฬ™3๐ั5jใฐaรXf ญ๒‹…qีชUุSˆ={๖ผ๙ๆ›ฐ`9|ื„ฅฮ›7วี๒FW~x๖K+<ฎ[ภั_ฐ`ด2Hศห2FŽ ว&3ุ˜%J„„„ฐจ‘„‡‡cรคอ7n\๑โลฃขข ำส—/ฯ˜]ปv !ฤ๒H0yำญ[7Ws๔่Qุ๓OWฎ:เ€ ฐW[๒ oJ—.-กเเ`d๋น3A‘Oผ!ˆœฒdษ’’%Kยปญ^ฝ:TมคI“Vฎ\ ๏ฅส› 6 I่a%แเเ€Tˆ7$oบvํŠิภภ@ื!oึฏ_‚{๗อ7฿๖oห—/ฏSง,JyƒฒฐKฏkZดhัณgO๖฿$ฺถm+ฝYz็w>๘เมbฑpฆ:-Z คœญŽษๅฤะJyณiำ&X๔เ๊๊สณชไอkฏฝฦ#jHADไ Aไ๖เอ7฿&;ฎWฏ^ฎหx๐์?๓ัวŒรข=H…฿ฯใjy3v์Xื[ …&๏ฤฅ”7๖๖๖ฐิชUหาาR บvฅผ~๘aซVญ๐็ัฃGศณkื.f7 ่%JDGG?y๒ ™2e Œ>ฤvฤ อฐ"U^ Œ—7ฌฯื_ํซ A8‘ผ!‚ ˆ‚ ษ‚ศ๛๗‡_๋ไไฤใj๊ึญkผผูบu+์ๅอ;*ุฐฐ0’jีชIฝฟ$ ฒZถl‰‚๒wL4nX9y๑้ำง‘ิฝ{wWก”7ฃF‚ๅไษ“<ฎ†M<ญU์นIืฏ__ฒdIฉRฅไ๖1ž‹/b!ะT์(IS#4hะเƒ>`“ ฬž=›ๅ/oฐaฅK—ฎ\นrdd$7ฉ ณg|๏HADA†ไ Aไˆ#Fภฏฝ{7ซ€ณ[ผxqฅผ๑๗๗Gๆ>๚ˆวU@ot๊ิ vฅผูธq#์+Wฎฤ„„,๓ฝ๗cI€}Lๆ๋ฏฟ–Oแ•™™9qโDุ?snRมไ >๙โํํฦo-Z๔๒ๅหคB)oุ์ีBwธ่่่๒ๅหรฎU$&&VญZuย„ mฺดQส #มUจPaฬ˜1๚๕+[ถ,–ษ์ร‡/VฌุŽ;ฐvaใฦหภ๖๎“O>‘8ุฉsAAHDŽ€€Œ‹?oผs็ฮ988,Xฐ€} jdูฒeP>๐}Yๆ๔๔th 8ๅP2ถถถpส!`ค/{๖์ูsห–-็ฯŸg™ม7`oธ๑ษ“'๙g—K ž:ภุฒeหญ[ท^บt ฆK—.ฐผ๕ึ[๒4€ษl~‡ r๊ิฉณgฯNŸ>ฝbลŠฐH"gddXYYa3ุ.gฯžฝs็NH $=|๘2ฃt้า3fฬ8ฃJ้ํท฿F6ฐpแย]ปvษgcLš4ฉRฅJO๛๗๏็&ำ้ำง๖จZตj๒ั;ฌ[`ฝz๕ฐ ย+)l๖๙๓‘กUซVุKKK์Ž็ถmุkจ^ฝzษ6ไ;tu๋ึ]พ|9๖ฮยย–๎ปฃ,„vEฐบrๅสแiddd@@v9qฆ`?rไˆ\pA‘—ผ!ˆœ?X๘€=\๊_•i ืŸgอส‚?]ฝzufgิฉSg๘๐แ<ข๚์ฆ| ไดK๊ึญ›ณž 11๑๗฿‡ไ`ดำO?ฦsจa๒f๊ิฉƒ ’๊ืฏL๖ลž cเภ,ีž}ฑTโw฿7n›YLž<™ๅ”x๐เV= ZŽฉHCๅ฿บม>–*U ฦ๏ฟž›ิ :”ๅ—s}IIJ` าัNNNž6m›;-วพณ>uทo็Vุ0‘ก์ฌHAD@๒† r๖I๛-[ถ์฿ฟ฿รรƒอ๎๎๎๎์์,h’””ˆœmถํน๓โล‹IIIืฎ];ซz€็Ss๋ึญ]ปv9::*ฟสยˆŽŽถฑฑมฺ!Tค7ELฐ™ำ?~|เภ,&—R ๖~‰ .ศลถ๖๔้ำ์rbหaŒŒŒผy๓&|๚ุุX–M"--ญrๅสJbXˆญญญฅฅฅ๐Vฤออํ๘๑ใJ-อๆ; '๖gฯž๑ธๅัމ‰9y๒ไึญ[>์๏๏ฯญชณ†Sภ‹ฉ@Š๙/]บฤM*p*u)‚ ‚ ^6$oโ•@.o๒’SงNaฝ๒DAA/’7๑J_๒ๆ๛๏ฟฏRฅŠ4AAฤK…ไ Aผไผy๘qํฺต๛๔้รขE‹อ{MEAฤ+ ษ‚0s\\\ถlูยf/่ท/KŸŽษuุ7jŠ/~๊ิฉy๓ๆ•*Uช}๛๖ษษษ<™ ‚ โ%C๒† ฬœ-Z@rศฉPกยK๛ž––ึฃGพีTืสqAA/’7aๆษง;w๎“'OxฺKย้าฅK{๗๎•” ‚ "o yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒† rŸ;v4jิจกŠI“&q+a4?๘#;zภฦฦ†[s›“'Ož9s†G‚ ‚0 HD๎ckkฃG?ธH‘"mถๅVยhๆฮญ[ท-Zเ.Xฐ€[s•ำงOcแเ๚๕๋DADแ‡ไ Aผ,ขฃฃแ=“ผษ6๛๖ํรœ?>็*๎๎๎%J”(SฆฬฃGธ‰ ‚ ˆยษ‚xYผษ!/U€ว?}๚”G‚ ‚0 HDฎ‘™™ ๙ๆอ›ˆ”7Ož<นx๑ขณณsdd$7ษˆ‡ แ๑ฌ,,๖๖ํ๐ศฑ"nาFJJŠซซ๋๙๓็ฝฝฝนษ8ฐ:˜˜ศข w๎a๛"””t๕๊Uฌยืื—›ิ ‰-Gฺศธธ8,9SSS™E({}dNNNFTฟผมๆนธธ\ธp‡‘›ิ`ุ6๐xV–ฟฟƒ222Xห20ฐฉ0ฦฤฤ๐xVVXXุญ[ทž?ฎ˜cหฑู8เ,ข—.]ฒถถf‚ ‚ศHD.zแย…ตkื†;Š+๖ูgŸ]พ|ตส๘พํทg™Aษ’%  wำ-ZฤำŠ้฿ฟฟ““Sืฎ]ฑXfฉ[ท๎‰'xViii๕ืkฏฝฦฒึญ[_ปv'๋… ta;vlม‚+VฤRฅJ:tˆgRiงูณgWชT‰ๅ~๘!Kตตต•6ฒqใฦp๗ฟ๛๎;,YPjีชU,ง€ŸŸ฿O?Tฎ\9–ฦŒณ~zWส›ษ“'K™ิ Kฟ?ท)าฎ];ˆl!‹v๊ิ ๆฬi#๗ฟฑR`ๆฬ™ฬ~๙gˆทŽ;-Z”Y๊ืฏ๚๔ižU4Œ3*Tจภฒ5hะ`๊ิฉUซVeัส•+?{๖Œg%‚ โๅC๒† rJTTs ๋ิฉ3iาค%K– 2คlูฒ%J”€Q)oถmVผxqx็ฃFฺนs็† ๚๔้7บFทo฿fyฎ^ฝ:n8,K€*ภขส—/?bฤˆฅK—๚๋ฏ ภวว‡efddd|๓อ7ศๆ›oฮ;k9r$„Vtใฦ žI7›7oฦ๖t๎KจUซ~ดiำฃG้ป7หWžY5jƒU :๛‚-ผ>2๘๛๛ใ`9p๗!!เ# ขkฺดiีชUCYkkkถ4‰+Wฎ0=€รˆ-Ÿ7o็ŸŽ(;€‚ผ’„๊€ฝYณfX์ึญ[๘แฝ๊ีซcํศเๅๅ5qโDlฮถ‰ฅาฅKฃ”‡‡ว๓็ฯกސห‡Pd‹ฃ8ๆƒ B6”ย๖Cเ๒ห/ห–-ร‘Gf,GฉUˆอ›7วy‡ฐAADก…๙็L”bG† ‚ ˆผไ Aไ”/ฟ-\ฉ[€๖xใ7`ไ››\^ธฟยˆvKKKH‘ $$$pSVVxx8–ฺตk'๏ๆOFHWฑrๅJปvํหMYY6660v๊ิ‰ว ฑqใฦ๋+RไoฟMOO >}บซซ+K…๐@Rฯž=ๅ มŒ<ฎ;#๔žงง'7ee988ภุฏ_?W]ฑฤM*Ž9ยฑ๒า…-$%%…›ฒฒ–/_#tซ`ฏ˜ p˜บ;t่ไิ? @ฎศๅ  ฅ@—.]ฐmš•5kึ,!Zx\…ฃฃ#Œญ[ทNJJb–ปw๏BGA&''รฤ์AAไ $o"G\นrn›6m”K,,,$ศ›>}๚ภ่ไไฤใ2ๆฬ™ƒคu๋ึ๑ธZ-Z๔แร‡ค‚Mj}:|ูปw๓ธŒ$ษๅ œoธเM›6ๅqM˜cญ[7Wห›wy‡วี\บt ๖‘#G๒xVึตkื`้ะกƒป‚~๚!ษสสŠgี “7ยซฦนs็๔้งŸ๒ๅส่ป7’gUหA„ฤฦฦย)ศใ*  %ไ๏I$v์ุrys์ุ1Xพ๚kพb]บtA๐ฌjys๋ึ-W Gผ๛<ฎฦฮฮ๖฿~๛วU@ํภx๐เAWมบทแ๑8AAyษ‚ศ €/+๗ช%”3ง=~ญโdffยัoธ1ซๅ๐บ(ๅ {Sค‡๐ฌza๒fฺดi<.cฯž=lQบฐฑฑแYU๒BŽGิh•7Z5C9sฺฺตkUซา‰ตไMฑbล๔LืฆG@ล๑ธญ๒ขฦ>}๚๐ธ๊ U๕๊ีห”)#Ÿ~ ‚ ˆ<ƒไ Aไˆแร‡รมฝx๑"ห`Žฒ\ฐ๗9ญ[ทๆqM”ฉLt่ะวี(ๅอูณga๙เƒถhc๏ฝย‹]0yณrๅJ—ม\๙Ž;๒…j)"๏fผผจ\นฒึi—7lุ€ryณs็NXบu๋ฦืชษมƒำาาxV•ผมยyDzไอgŸ}ฦใjดส›ŒŒŒ† ยฟ3gฮ9r„M@7w๎\žƒ ‚ ˆผ…ไ Aไˆ๎์มใ2v๏$a์ ผแbลŠi" “๒5ฦห›จจจ’%KVฉR…}1F\pๅ€]ฐmXณf ห ฤ–ืฉS'==›ิภ‚TQaผผ้ีซŒZ#}๗H’ห›ภาดiSฅ‚ฐฦ AิฌY“Gด‘syƒฝ.^ผธ4 4ภYภล Ÿภ€ ‚ ˆผ„ไ Aไˆˆˆˆส•+—/_๎ปค"::บ^ฝz๐wyณjี*ปu๋&tš‚W]ฃF ่n2E€กC‡ย8|๘pWรฆYณตตๅqฝ่‘7เป๏พC๊ฤ‰y\อŸ ๛ๅห—yyร^ ตkืNš|Œ}d฿œ‘ห๐้งŸย8o<WYˆ๒ฃ—๒ๆ๊ีซ0ZXXธqcืฎ] ฏADB๒† r ”qฒw๏ฤฤฤฬฬLGGวVญZมZทn)๕ KIIฺ้ต+์๘eLNN>|๘0lๅ^{TT”ŒHXB||<Œ้้้๘๒ไIุŒR—ฐะะะ ภซW/,+Bาๆอ›K—.]ฝz๕–M[X›]z๑โล๘xš๘๎์ำฅlp?Š`ซึฎ][ขD‰:u๊@ั!4 BฺAเ3์N@@สพ๗{ฐK‡‹ฝฅŠsqqA›ฝ}๛v๖0cฦ ไ—Jy{{WญZJfะ Ažžžiii111ุ`X7nฬ4,(RฑbEœ‚vยVมXถlY์HวฑLฌgๅวศ‘#ฐ๚๋ฏ๘/- โ๛ๅ—_>x๐วI@ฯh‚ ‚ ^6$o"ุฑc๛n=œl๖๙ศ๒ๅหณก#๐Yfx๖์[™ูื]เjCZH}ฎๆฮห2H`ษ-์รrฐธิฌ๔CงN˜ฝdษ’lษะ6[,ƒy็VPฮ์ูณyฒ(.ศ-– รV‘เๆๆ†T๖*F`ำฆM .ไR‡4H—Ÿ;ฃt@ฐ=์ฅฃZตjามน{๗n๓ๆอ™miว^ ฑ๑98’&a๊‘ƒc๕๙๓)Sฆ๐ธlิN๗๎y\Mนrๅุ—p*›6mสญjP ?}๚t๙LูAAไ $o"w ZตjีO?๔ใ?._พœ w๙็Ÿเๆ‚๙๓็K"„qใฦ ธ๏ ๙คx๑โu๋ึ…เไk%‚ "O yC‘ุk"AwIธนน•-[vศ!๚ˆว ‚ ‚ศHAd‡บu๋–(Qbย„ ฎฎฎl๐OZZšทท๗๒ๅหkิจQฒdIญ฿{%‚ โๅA๒† "›๘๙๙}๖ูgช๙า^Pนrๅโล‹ณ๏ผ๓ฮ… x>‚ ‚ ๒ ’7A9ยำำsลŠC‡๎ป๏8gฮœ๓็ฯงงง๓d‚ ‚ ๒’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ยL yCAA„™@๒† ‚ ‚ 3ไ AAAfษ‚ ‚ ‚ ฬ’7AAA˜ $o‚ ‚ ‚0HAAa&ผ!‚ ‚ ˆท_4ƒ๚งึด€ฝ"๔ˆะ Bo€ฝ"๔ˆะ Bo€ฝ"๔ˆะ a;3y ห ป่ฑIENDฎB`‚ManimCommunity-manim-1157b74/docs/source/_static/crowdin-badge.svg000066400000000000000000000475051515024150700251520ustar00rootroot00000000000000 ManimCommunity-manim-1157b74/docs/source/_static/custom.css000066400000000000000000000034221515024150700237360ustar00rootroot00000000000000@media (prefers-color-scheme: dark) { span.nc { text-decoration: none !important; } } .admonition-manim-example { padding: 0; display: flex; flex-direction: column; } .admonition-manim-example p.admonition-title { font-weight: 600; font-size: 0.925rem; margin: 0; } .admonition-manim-example .highlight-python { margin: 0; } .admonition-manim-example .highlight { border-radius: 0; } .admonition-manim-example .highlight pre { font-size: 15px; } .manim-video { width: 100%; padding: 8px 0; outline: 0; } .admonition-manim-example .manim-video { padding: 0; } .admonition-manim-example img { margin-bottom: 0; } .admonition-manim-example p:last-child { margin-top: 0; padding-left: 0.5rem; padding-bottom: 0.15rem; font-size: 15px; } .admonition-manim-example .copybtn { margin-right: 6px; font-size: 18px; } .admonition-manim-example .copybtn:hover { cursor: pointer; } p.rubric{ text-transform: capitalize; font-size: 1.25rem; font-weight: bold; } .sig-param{ color: var(--color-content-foreground); } dl.c .field-list dt, dl.cpp .field-list dt, dl.js .field-list dt, dl.py .field-list dt { text-transform: capitalize; font-weight: bold; font-size: var(--font-size--normal); } h4, h5, h6{ text-transform: none; } /* yikes-ish attempt at bugfix for navbar on some browsers */ .sidebar-tree a.internal.reference { display: table-cell; } .manim-binder-button { text-transform: capitalize; padding: 10px 20px; margin: 10px 0; } .manim-binder-wrapper { background-color: var(--color-code-background); color: var(--color-code-foreground); } .manim-binder-title { margin-top: 0; } .manim-binder-button-wrapper { margin: 0px 10px; } ManimCommunity-manim-1157b74/docs/source/_static/favicon.ico000066400000000000000000000353561515024150700240460ustar00rootroot0000000000000000 จ%6  จ% h†6(0` $ Lงๆํด[/ฆ๑๖ธ@O้hL็๓h)ึ้A˜ท:่๖[‹ณส์ํ๖๗๕แีรฯททฦฉทลจยฮถูเา๔๖๓ใุฎฟ›ฒƒ˜ฑ˜ฑ˜ฑ˜ฑ›ฒƒฌฝšฺเำาฺสŸด‰™ฑšฒšฒšฒšฒšฒšฒ™ฑณ‡ฮืฤ฿ไูŸต‰™ฒ€šฒšฒšฒšฒšฒšฒšฒšฒ™ฒ€ณ‡ฺเำ๚๚๛๚๚๛๚๚๛๚๚๛๚๚๛๚๚๛๚๚๛๚๚๛๚๚๛๚๚๛๚๚๛๚๚๛๗๘๖ฐภŸ™ฑšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒ™ฑฌฝš๖๗๔ๆ้๓“ขŠœเ‹œ฿‹œ฿‹œ฿‹œ฿‹œ฿‹œ฿‹œ฿‹œ฿‹œเŒาุ์฿ไูœณ…šฒšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒ›ฒƒฺเำ๛๛–ฆแ[v฿\xเ\xเ\xเ\xเ\xเ\xเ\xเ]xเ[wเ~’๎๐๗ศาฝ™ฑšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒ˜ฑยฮถใ๒p‡฿^yแ_zแ_zแ_zแ_zแ_zเ_zเ^zแd}ฦอ๋ฝสฐ˜ฑšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒ™ฑณภฃํ๋๋๎์๋Ÿฉิ_tั_uา_uา_vำ_y_zแ_zเ]xเ‘ขแ๘๘๛พสฐ˜ฑšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒšฒ›ณ‚Ž”t|da}dbu^_eP^eP_eP^dSi`rศ_zโ^yเkƒื๐ษำฟ™ฑ€›ณ‚›ณ‚›ณ‚›ณ‚›ณ‚›ณ‚›ณ‚›ณ‚›ณ‚šฒšฒšฒ›ด‚ddECdFCeFCfGCfGCfGBfKO`pร_{โ^y฿คฑไหหห’’’’’’ฺฺฺืืืวววแๆ—ฌmz_cnWdpXdpXdoXdpXdoXbmWo}`–ญ~šณšฒ˜ฏugVeFDfHEfHEfHEfHEfHDeLQ`pร]yโvŒๆ้๔ิิิŒŒŒGGG000YYY———เเเ๚๚๚xxx[[[๏๏๏๙๙๘ฎฝŸq€aQXJ@B=ht[o|`alV<>:V^Nu„e—ฎšฒ›ด‚Œ—qiOIfGEfHEfHEfHEfHEfHDeLQ`pร`{เธย่ฅฅฅHHHึึึีีี___^^^นนนโ็ฃธ‘จzRYKƒ•ožธ„p~aZcQ—ฏœด‚šฒ›ณ‚–ฉ|teUeGDfHEfHEfHEfHEfHEfHDeLQ^oร„˜แ๑๓๘มมม\\\๎๎๎”””’’’ฐฐฐzzz๙๙๙ืะ ต‹YbPz‹iถƒfrZgt[œด‚šณ›ด‚•ฉ|yo[fHEfHEfHEfHEfHEfHEfHEfHDeKQguภสา๎ยยย\\\๎๎๎่่่fffำำำ๋๋๋fffัััเๅhmczŠiœด‚erYhu[œตƒ˜ญ~‹”ptdUfHEfHEfHEfHEfHEfHEfHEfHEfHDdJP˜œฤ๙๚มมม\\\๎๎๎ฏฏฏyyy๛๛๛ะะะDDD}}}ฅฉกฮุฤyr[\M€{btdUiMHeGDfHEfHEfHEfHEfHEfHEfHEfHEfGDlQPิะิมมม\\\๎๎๎๖๖๖sssนนนˆˆˆaaaZZZๆๆๆ}}}พพพ—˜˜K;:fGDeFDfGEfHEfHEfHEfHEfHEfHEfHEfHEfHEeGDoTQ฿ฺูมมม\\\๎๎๎ษษษjjj๐๐๐hhhฮฮฮ```ชชช}}}พพพ˜˜˜K<:gHEfHEfHEfHEfHEfHEfHEfHEfHEfHEfHEfHEeGDoTQฺูมมม\\\๎๎๎ˆˆˆžžžžžž‹‹‹›››hhh๔๔๔}}}พพพ˜˜˜K<:gHEfHEfHEfHEfHEfHEfHEfHEfHEfHEfHEfHEeGDoTQฺูมมม\\\๎๎๎เเเfff๏๏๏kkkฬฬฬTTTลลล}}}พพพ˜˜˜K<:gHEfHEfHEfHEfHEfHEfHEfHEfHEfHEfHEfHEeGDoTQฺูมมม\\\๎๎๎ขขข………ธธธwww๗๗๗€€€}}}พพพ˜˜˜K<:gHEfHEfHEfHEfHEfHEfHEfHEfHEfHEfHEfHEeGDoTQฺูมมม\\\๏๏๏๑๑๑mmmววว๛๛๛yyyดดดวววTTT}}}พพพ˜˜˜K;:fGDeGDeGDeGDeGDeGDeGDeGDeGDeGDeGDeGDdFCnSPููมมม\\\๑๑๑พพพrrr๗๗๗ะะะjjj๋๋๋๕๕๕jjjššš}}}พพพ˜˜˜RDCtZWsYWsYWsYWsYWsYWsYWsYWsYWsYWsYWsYWsXV|dbแมมม]]]๊๊๊ญญญŽŽŽšššญญญ^^^๊๊๊~~~พพพ–––‹‰‰่ไไๆโโๆโโๆโโๆโโๆโโๆโโๆโโๆโโๆโโๆโโๆโโๅโโ็ไไ๚๚๚มมม^^^ลลลiii่่่ๅๅๅhhhฺฺฺ่่่ZZZณณณ€€€พพพ–––˜˜˜ยยย]]]………“““จจจƒƒƒ’’’ooovvvพพพ–––˜˜˜รรรHHHZZZึึึ๔๔๔pppฤฤฤีีีQQQPPPภภภššš‘‘‘๛๘๘๘้้้ฆฆฆ444uuu้้้ทททrrr๔๔๔๛๛๛yyy444ฒฒฒ๐๐๐ฏฏฏ___หหห๒๒๒้มมมhhhVVVKKK```mmm___ดดดฤฤฤRRRaaammmhhhNNNWWW˜˜˜ย๔๔๔โโโใใใไไไโโโแแแไไไ๙๙๙๛๛๛็็็โโโแแแโโโใใใโโโ์์์ๅง.เ๐L†ฆ ล07ื็O7ฦืL†แ้™(-ร้๛ํหŒ9๘๐เภ€€€€€ภเ๐๘( @ /™ๆ๋ค9XใhVํ๔i(ีโ9‰คี๊๖๖๗๔๊๎ๆ๊๎ๆ๕๗๔๗๘๖อืรซฝ— ถ‰ ต‰ชฝ–หีภ๖๗๔๗๙๖ปสญšฑ™ฑ€šฒ€šฒ™ฑ€™ฑ€ธวฉ๖๗๔ฮุฤšฑšฒšฒšฒšฒšฒšฒ™ฑ€ฬึภ๑๒๙ดฟ่ฌน่ญน่ญน่ญน่ญน่ญน่ฐป่้์๖๗๘๖ญฟš™ฑšฒšฒšฒšฒšฒšฒ™ฑ€ชฝ–๐๒๑–งๆ[wเ]xเ]xเ]xเ]x฿[v฿„—แ๒๔๚ํ๐๊ขท‹šฒ€šฒšฒšฒšฒšฒšฒšฒŸตˆ฿เืฮะโj}ะ_tั_uา_y^zแf฿อิ๐๎๑๊ขทŒ›ดœด‚œด‚œด‚œด‚œด‚šฒšณ—ซ~ndy`^iS\eO[dSh`sห]yแ˜จๅ๚๛ๆๆๆณณณฑฑฑฐฐฐุุุ๓๓๓๙๚๘ชป˜yŠgtƒdv†fv†fs‚d{Œj—ฎ›ด‚uiNHdFCfGCfGBeLQ_qวn‡แใ๔๋๋๋œœœFFF๐๐๐lllทททอึลy‰iQXJq€bkx]RYK|j˜ฏšฒ}x`fGDfHEfHEfHDeLS_qฦฌน๊๑๑๑{{{็็็ฟฟฟŽŽŽ”””๗๗๗๙๚๘มฯฒp}b…˜pz‹hv†fžท„šฒ†ŠjiNHfGDfHEfHEfHDdKR|ˆว๋๏๙๓๓๓๊๊๊๙๙๙’’’‹‹‹อออ๚๛๙–š’Ž~Œpt€cu}v_iNHfGDfHEfHEfHEfGDhNRภภำ๓๓๓๊๊๊ิิิ›››เเเggg‘‘‘ชชชษสศฏฑญZKEjOIeGDfGEfHEfHEfHEfHEeGDqVTใ฿๓๓๓๊๊๊   ฬฬฬฏฏฏฏฏฏโโโชชชััับนนUA@fHEfHEfHEfHEfHEfHEfHEeGDrWTไเ฿๓๓๓๋๋๋่่่‘‘‘ไไไ๑๑๑ฅฅฅจจจชชชััันนนVB@gHEfHEfHEfHEfHEfHEfHEeGDrWTไ฿฿๓๓๓์์์ตตตธธธยยยฌฌฌ฿฿฿~~~๔๔๔ซซซััันนนUA?fGDeGDeGDeGDeGDeGDeGDdFCqUSไ฿฿๓๓๓฿฿฿’’’แแแ–––เเเยยยญญญััับนน_NLv[XuZXuZXuZXuZXuZXuZXtZWheๆใโ๓๓๓ƒƒƒดดดฆฆฆิิิœœœสสส‹‹‹ฅฅฅััับบบชงง๋่็่ๅไ่ๅไ่ๅไ่ๅไ่ๅไ่ๅไ่ๅไ๊็็๛๛๛๔๔๔~~~„„„ืืืฃฃฃอออ๖๖๖………ำำำบบบนนน๒๒๒eee†††เเเ’’’๖๖๖ถถถNNNัััภภภจจจ๔แแแ‘‘‘XXX}}}ŠŠŠพพพ์์์lll‡‡‡ŒŒŒgggฌฌฌ๛๛๛ฯ๗๗๗โโโไไไใใใไไไ๚๚๚ํํํโโโโโโใใใ้้้ๅ™ หฺ/GๅํYGฬึUะ๔๖ี‰(๐เภ€€€ภเ๘(  iแๅqe๐๓qูใ์๐่ฬืภหืฟ๋๏็ํ๐้ฉฝ•˜ฑ˜ฑจผ“ๆ๊ๅื๖ะุ๔ะื๓ิ๔๖๘อุย™ฒ€›ด‚›ณ‚™ฒฟสด›ึavะ`z‘ฃๆ๗๘๖๖๖ีีีแแแ๛๛๛๑๐๑หึม‡›r†šr‰t™ฑ€ˆ†loVZcRgi{ฮี๖๘๘๘ขขขฮฮฮไไไจจฉใๆ฿Š–~p~`{j‘ŸvoZOeEBdKSกจำลลล่่่หหหคคคำำำัิฯ™ vs^o[OfGEeGDpVVแฦฦฦุุุผผผทททนนนืืืถตตeMKdEBeFCdEBtYV้ๅไฦฦฦฝฝฝนนนแแแฦฦฦฝฝฝธททs_]w\Yv\Yv[X„lj๋่็ฝฝฝจจจภภภ๚๚๚่่่›››ฝผผฮหหํ้้๋็็๋็็ํ๊้๗๗๗   šššืืืจจจฃฃฃพพพ๙๙๙ี่่่้้้๚๚๚๕๕๕็็็๋๋๋เ^์๐i^ึฺeภ€€ภManimCommunity-manim-1157b74/docs/source/_static/logo.png000066400000000000000000000266051515024150700233700ustar00rootroot00000000000000‰PNG  IHDRzz “ pHYsรรวoจdtEXtSoftwarewww.inkscape.org›๎< IDATxœํyœๅ™๐฿Ssย  ‚*๑ gบgl1ฤ3 0 ^f5QˆYœQtณฦlL4บ5 $ูฌk0F ™้ิdLŒ๏P‘Cๆ่z๖™dํช๎ฎ้๎ช~็๗|๒Gxซzd†฿๔Tฝ๕ผขช ""sY~@DD…ล '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ว '"2ƒžˆศp z""ร1่‰ˆ ๖ป€\Lnh8ฦถํ/@ไX{๙]‹nY/ภฯึดดด๚]L)hll<8คz‰ช%@•฿๕dะ เฺ*jj–ฏ\นฒร๏‚ˆˆช๚]CVbั่i@ศ๏Zrห:eus๓ฟ ฒษั่X๘=€A~ื’+yb๘พ๛F—/_ž๒ป"'%s๋F€kPZ!!ตํ&ฟ‹:๘6J0ไ@TOฺบiSƒ฿uน)™ 0ย๏<Šฤ๊๋๕ปˆ šเฟ๋่ ูื๏ˆ”Rะฟ๊w^Y"W๘]CPu‹\‰า๛Mํt[ึ๓~ื@ไฆd‚^Uoฐำ๏:ผP‘Yัhtˆ฿uอิฉSˆ๊~ืัG๗677?็wDnJfีM<™l;%9ฌ[ไ\ว`€ุ'—yภ}8@'ฆ๙๓๊2`€๚0ทqบv๏ž `pงy๚aฏภ@>Ÿใi„ศข๚ชชฎY“L>œzˆ ฉdVdrฦ๘๑ี;+*ฦŠeเx๔๎๑ศํท–.ˆ|~MKหj/5444ŒซnP–f๘๕ฦdr์"Uห&šภ1ูoใV%ฏ๔๕บM"VK$๒KฮสtฌฯูภฯCถฝfฏํŸ^๓}ฝ>Qฑ๔้Lž0a-+›ฆภล๊ฒ”ํฅถํห฿Eccใฎw9ค ภk“ษF†<™ย่ ๏ƒทl/^N\•L&9ํ ๊ฉ“๊๋G๗ฅ0œ‰ŒpถืฅR7จt๎ี3ื$?R“ีฅ~‡A๏D๕๚ฉ๕๕{{<๛Gnฉe]๎ต$St๓‘9FAMชฏ ว๛๒ข๚ฯซ“ษG‹YQ10่ีt‰ธŠ๏จฌบz €mร๓ฮ?พฺ{YฅmฦQG•Cไ?ฎญ"ณเผfkZ[oป•0ฝ‘‹ผฌ์ฑวvA๕'รCvVWฯ๊ce%๋ƒฝ๖๚"zหYไ NC*๒=ฎ!S1่U—ซ^ไๅฤT(t'€ดม!ช๖กฌจ~ี๋N›6ญภqร;†oบผ˜๕ƒพวR๔ฌถ๘๙J“HฮOอออฏxฬa๘ุX4ษuฮRื๓ง๕ ‘ qํ]ปvP๎0{ฎ'“1่ั๓R zZ งsHs4š๋”๏๙Z@ฟ๛TŸฉ็๔๔3ZVˆk‡TGบ\๗้B\“((๔ฝิyฅ ิใญ–“{^Žzรแz็Lชซฯหผฅ(‹ ๎}๊ศ~(ฉTA๎“‹jญำ˜› qMข `ะ๗Z›L6x!˜Sฝฌ_คjCไ.‡แ2;บ8ื9KVw๗EVํB8\6 .ห9UdkกฎK ๚^ฺณไยq;,๋+^ๆต::๎ะžnL€Kว_๔๕ไลึ$b ้๏oi<wZ’ฺg*โtฐํดฯgˆLม ;U]]?…CwDๆีีีๅผ—้ชงž๚ภCร#k++}yCด˜š๋๋Oเ๚‘ฺถใญณ|ฐTลqL„ๆศh ๚ฟณ๒ษ'wp๊‹ณWe(4ำหผ)ห๚หฐ๑eU$ำ’สdผต๕™ขCิ1่?มน๋฿\้eฮๆๆๆ?x2ํ Hรไ††ฌ[๕–šI๕๕ฃ˜๊vŒŠ๐Tขbะยช–– šp>6‰L๐2ฏ[˜ูฟ@ฅ=K*พฯ6฿บ๕Wลช‡จ?bะงแถิา๋๚๗7/฿s>ิบบฝผฬdgŒ_ ‘นฎ‰ร—•ˆ ‹AŸฦฮ={~‡ตี*2c๒„ 9o[ธ๙็;กzฏรpug8์ˆ%่ใชช๓ธ๋ึP่๎bีCิ_1่ำhkk๋‚ˆS(—แ๐…^ๆM…Bw่N;จz…—V 7฿uT๕โ๑๘Eช…จ฿2-X๒&lwมก D.๓ฒUss๓[ ฏร๐่ต‘ศ)นฮT“#‘(z๖์udนดˆ ขaะ;๘]2น ฮก|เ–อ›O๓2ฏธ<”5ฉaD^\ฺบถHๅ๕k z ้8ๆqฅฬš––ีžwธด)ั่!^ๆ ’†††Pข16๐C๖'*ฝ‹x"ฑ ภ_า 0yb$2ฮหผข๚c‡!ซ[ฤSซ… )SอดUเฮท‰จ๔(pรˆวP๎ฐ#ํคช•๒Vƒใว/S Sณถ{฿B&ข"`ะgฎฌผภฎtc \0u๊ินฮ™L&wp๚D;dgeฅงV APS]}ื๖หฺ๓ ›ˆŠ„AŸมใ?พภ‡แA]ปwฯ๖2oสฒ~งญ3๗† ฌL$*ทถฆ}FAD…ม ฯŽ[gEOe›››_„ja๘ุIu^ๆ๕Sฌพ(ฎ[$บญ:"ขย`ะgaM"๑g๋†้รฏŽกงถ]rK-ลฒฎสpศฆปw?\”bˆ่o๔YRีผ๗ฟ6rไุเ0<”HฤqŸำ ‰ลbƒธnีปฺฺฺธษQ‘1่ณ4|ถphJฆภ9^By๙๒ๅ)หaธฌธ(ื9"p{0œฺJQ1่ณด๙็;!rŸรpYJฤS›.‘่H;(rY)l5("‚ }m๘e๏ฦDTd ๚„T๏J7ฆภWผ„rKKห๙…ร๐ศš๊๊3sณุ&๖l8ึํ›}mˆ|ร ฯมใ‰ฤFˆฦaxdmeๅ้^ๆตR)วฬด\1z7q๓—x"‘,J1D๔)aฟ (A?p†รุr-iUk๋ฃั6ใำ Ÿ<นกแ˜U--ฯๆ:o1Lชฏ ห๚|†รณ(ลxT5ไ„9wๆ_๒ป๚ฟ|่ซ็ช:n้I9bะ็(žH.‰ผ‚tท*D&ฦ๊๋๒๘BะpxX™พ‚že}๎ฟn/ซฎvzแ,,ซโD&JฐpC“‹๘eษบษQoวEงฆd@(ไพู†ƒ=ฉิ2ˆ|˜nLT็Dฃั!^ๆ-คบบบ*ๆน#ภ=๖XฺDT z4พภ๎tcข:wฺ„ ตนฮนnบv~โ0\ๆไ:gกU„รณแพU ชชcซg"*ฝ๑x|€‡†k:สห=๕ฟฑRฉ;เฐชGDพดญE๕2๗ไ๑5ษไหE*‡ˆ*8J‰ฺ๖วTฟฺปถ<'ซ[[7๘ญรค‡ถิีMฮuฮB™ุะPเืƒl›K*‰€A๏Qผต๕O9 ‹Fผฬ+ชฮoBกเ,ตฬผ์sใฐ‘#–ขQ1่๛ฦนซฅืญ[[ เ‡9Okll<ุหผ๙‹ล๖pŽ1น|๙๒ดทกˆจธ๔}PYS๓s๏; Ÿ=ฉฎฮuŽt2ฌ๊ฑBถํ~_ผ$•บ@นห!avjADEฦ ๏ƒ•+Wvธ฿a8ŒP่/๓๖ฎ๊qZ’x‰Ÿ[ ฦbฑ0T3w-ฌตี้ ƒพฤถ็7—z้วท‰๊2‡แ!ปชชฮหuฮ|‘ฎฎ/ุ?รa|K ๚>r])Œจญฌ<หผ*r‡๓ ^้eฮVทด@[บ1ฦฤขั‰ž&q๎S„ญณx๐๛FcO๋" }9๖_๗สkZZšคJP€Xccใั^ๆอฦค๚๚Q ธn(ชw.Rต U๕ ƒ>ฯ\wŠฮ˜T_?สหผโฒG!๛฿๔nr9ค]บบœ6L!ข`ะ็ูบuฺ๋E๕~‡แ,หSปฌ์gถ; ฯ๑ฒช'“บบบ*Xึ…[ถ๊ฉงา`#ข``ะ‚m฿ ํญ .6mZEฎSฦใ๑<เ0์yU›สPh&T‡บรญ‰‚A_ซ[[_๐ธร๐๐=;wบ๖rw’ฒฌ;hฺAซz2ศ๔ขื“๑d2ํรg" }ก Mss๓ซ ฌJ{9`ฬษ‘ศ$/๓ฆ3นพ$ใŽQ—ี@D ๚ilm}ภ›รuฃQ๗VˆKธๆณyย-…~‘ฏ๋Qแ0่ d‘ช ี{œฦEีำJ™a๛๎๋๘Dำ๓ฑี`CCรpจž๋zศ=๑x;ำ‰๊i&|jEอดiำ*˜็6ฏฟŽวใo{ฉ‰ˆ‚A๏q”D๕Š3fธ}ยN+™L๎T‘%ร5ํee_ไถ๑L{ปอkณฏ Qษcะ๛`U2™๐ฌร๐จ-›7Ÿ๊e๐8ฌีท€+าl5่๚L@€ื&“อ^j!ขเ`ะ๛คoVตดผ %ํœภแbฃัEีu•w๔'ขRฦ ๗‰ ภ๖tcœ:9๋e^q[ji$ำ“•]]?๓R ƒ'๑xc๙ฉรฐ(เiง(;oNOฯŒลb๕ฎ์™žaชW>๙ไ/5Qฐ0่}d๗lJโุๆŒ๑ใซs3wCฤi9dHบบ. ฉ^ ภตทŽฺถใญ%"*- z577ฟภ้a็เซชพไenเ8ฌี‡ศล’๙ท…ต๑ึึ็ฝ\›ˆ‚‡A๏ณ oฎ๔2gKKหป.k๕๗p {Qr‡—๋Q01่}ึ{O‡แcc‘ศO๓z_พiว๎{<—ˆˆA๏ณx<ํึฦ๒ุี2žH$แผWญ3ีปฺฺฺบผ\“ˆ‚)cฏr*ผ๊" ”}rLEฆ744sKKหนฮซ"฿Uง•=้tv[–ใR๒ƒGญุ=`๋X[0N€aิ3iใบ๔๏จ 9ค๗ฎDwงขc‡Žm)t๎โถธd}.™4)ฮM3\ถํ‹œ๋ผ''K›#‘ฏ8&›ใ๘UKKหปน^วoทถW“าŠFKฅัŽถ€ฑ:ฃฑ๚*pํˆกŽ็๏uh9๖9๚8ฅ:{ถฅฐg[ ปKaว;]ุ๓Q |}ฌ8ฆc6๛]‡)๔!ช?R‘tAˆ\6cฦŒ[—/_ž~')‹Tํ‰ั่…ZTd:พT๚ฺ4กษชHŽn€†Nj R9^€ฐขgg๓|dqจ\0`๏0์ฦะWืบvุ๑N7vn๊ยถ7ปะต›Ÿ๚ ฅชSฟ เฟ๋0๏ัฤ๊ึึต^p>pหๆองy™wM"๑ด“dZ.๙l๏}ภ:่ไใYฒ๔†สฤ˜ื VะL@‘>ฐ”U[:ฆ5ภฑsc้5vXฌ๐'[Q_ pแ[ืฯ๏wฆ`ะ„ชชจ:๗”ฯะ€ฬM<‘HฎI$ŽUท–4?๒๘qBฐHƒฎิP†ƒ'ภฑ ฦมฑจฺ+็ฆฃไฬฒUพO7โ#๔า< }ี)#‘q^็ฎซซซRห๚ผร๐ถฒ๊jงว”Aจ\0์๐ y Œ™Vƒ๛๐Žh~Hฦ…s3ต๊ ,0่คทงR‡aQหบฬ๋•กะ—กš๖‰คŠุcํ๒:w>U ชฬ๘,!จD€ม•แˆsj1๖ด —Ÿ฿}ทi~ฮญ@่1่ฦญงผจ^0u๊ิงvZฏพ6ท$—~๘Yุถpะe8์์Z2i สชx๗ม+่๊่ธฦ๏:Jƒ>`Vตดผ €ำCัมํํณr3N†ำK‘วื$“N‹ลญk—์Kbู U}ุ ‡๗๑ณ–|†Ž+วัณcŸc*มปอจเบ7ฏฟx”฿u”2}๕tตLหหฆ$๐5วA๖๓!ฌ,N,ฝฺษ+ Mฟดิกrม‘jvv-*๑ญU–vไwฅŒA@;w๏%€MรŸ™ุะPŸํ\“๊๋G+0อaxใฐ‘#“sypหชƒnI,[เ6U~ิPl๗ ใˆ้ต:ฆ๏RJฬ|kแผจ฿U”*}ตตตu)pŸใน|ชทฌ+แ๐uเฮ\_ยส‡ลอK>‹Šฎ?™)Iจ\pศ”8dา@XŸjxA.ฤฝMMฬ,๘—Pe=k๊š‹{J$22ำ‘HคF †;ยถํรค@niYr,i ฤZx WŽรฯ„๒'˜ƒใืwผ9ื๏"Jฟห๊wษไ&q.K‰\˜iŽr‘y9 /ฌต๕}ฯzฐ8น๔Zํ้uฯฯฒช‡‡p๘kQ9„๗ํณ%‚›฿ธnพำ๗49`ะ›๓CYเ+ใวw L้yฃะํmฺข=„]ฑbE่ๆไ’ป X\ฌk–Š๒ ‡Ÿ]ƒ|ษ*[๛Xกฮ~Qj๔ถ6™\ ภi้ใศฺสสำฮEฃำ8ฝI๛๔šDโฉพึ—<๚hล๋๛tฏ•๙ลธ^) WZwF jเ/:ู่ีo|kฟ๋(%"่mUืN ไ฿ƒชชnoส^ๅ2ๆถ}a4กษ๚ธf๋ƒ=;sิฅฐ๖a!บนnื,ซL0ๆ๓Q3‚Ÿ์ณPฒ๕Vฟ‹(% ธ|ณT3}T ๎ฟฎp๘้ˆฤไ766ี)3n“J-หc…Ž*’cn•นœฃ)็ึฟVศ๛ทซeนฝŒvรVX0ๆ 5จฦ{๖Y8k7็L๕ปˆRั/‚qu€S˜ ˆวใ8๖ฟฑT?u>d_COk๖OSฝwบuํ๙ซ0ฝล-Ko€บผจๅ k๗ว1+ไ=ฮํtนfฑ…สcงีขผฆ_ำ์uำ๓็๓~W๚ลw“ฅบฏ๋ช๛ฉOิถoตˆ๊œH$R๓ืF‡8฿แp[Tœ๏๚>iqbูล,๒r๎žปำนˆ \้EฃP…st์D?ทฟ)({Z Bๅ์™มร†๏แณŸ,๔‹ p‚๋จศg‹T‡'๑ึึgฌsฎญฐฌฟ{™ศลา7>๙ํ๊ึึื๓_แปฅeษั€งื๓wผ“~ลg๙€*„สผ฿aซฌu๎ทใํขฎ2อJีŽyํ_ืจ; ็๖7๒ 0>่งL™2HE2ํ™z`ฌฎ๎ะขไ‘ชบ๕ฟนfฬ˜ส๐ึlAย6ญ]1P-Y- T6ค฿&ดzX฿–NW์xฦ๗๊๊๎ำ…0dt9๖>ชdป6หnฟ=๖'ฦ}jฯžน2•pxNส๑ฌชถ๖œ>z5ฑกกqหฆMgp๊๒๗Fc"๑haช๋Q๊ผŠรผžม ๋ั๙q๚ว๖โน.ฐย!ิŒ–vฬ๎Nแฝ็ ๚‹ŽgิWฃz8ฮบ“ห฿ืyG๛]E๔ฑX, ‘+ณ:X๕kฑXฬ^พVฎ\ู‘{ฦE๕Ÿ rตห๘‹T ถผdqrษ…€8=ศส๚ไ3Žcรฦะ—ฉ{ๆw ใุ๋kฺ`wฝํOFVH0๚๖ลษ ”๊ถo๗ปˆ 3:่ญ๎๎๋ šํ-™Ztw?8cฦŒภ~|’T๊วาฆ‘gˆ8œฺ.]]?)T]7ฏ~p(T๚ดฎ๙ํ฿ฟเx&\YŽกcC:[#>3pXfูพu^฿DŸฏQ•ƒBy7Yr%2q๕sฯ๔ปŒ 26่c ็*ะ”ห9Lูฒy๓’Gศ>ฒซ[[7(ฐารฉญz๊ฉ๓^P/)/๛žˆmy๕-ผ๘ˆำ^+ภศใว๕้A์_UŒแใœ๗ฏx็/โ•GŸฤ TŸด๏g*Pลž8ฎDๅถืฎบŠ5า0.่›DฌI‘ศ5ข๚ผ๗ฉžทeศึ‰‘ศ‘๙ฏฎ๏DฤKš‚๕ตนฅuYPOฯ7To=๑žyp%ิแถIจผ 7฿ง˜S'@ยฮน>๑ ๔เJ์ูqฎ™Œjภ]ชR>pGฮ๏n๔ฤO/^MŽDbถศ๊๒0]7€,‘\ีา๒lๆห‹&ซ9}9‡[ROญI$&ข–ปŸพปlk{อกzTฎ็n}ใผพ๊๘hปฎว=๕$ิpฌ็ำymี๐ฦš6ืcBea์?แ(xโ‘จฺซ6ฏื๏‹7พฺ้w๗‡ด9ผ๑—ัN 5nิw~๊ีฯ๗ี,ฤbฑฐ•Jฏภdจฮ„Hฮใ" เ"[๕ขI‘ศŸl‘฿ˆศZ …ž๎}[ี‹TํX4z—฿อๆx)เง๙kฮ—,CNฅฐใ๐แkoc๓ณฏaื๛e๒`”(ฬ—ทปฝ›Ÿ{-็๓D•CjP5x *‡ิb๐จ}ฑ฿๑ใ V๑๎‚พนfถผ”๗/i ๔แ=ุถ่I฿๘ภ๏๓WQi+™ Ÿ เฟ๋p๐็=ฉิIล่!๓Wฃั๛ฬs;Fล๑Dข$ฮฒๆ IDAT ฝปท,9"}๊š)๑ม•๘๐ตท qู@6nŽ›๓yH‘n ๏ู–ยsหถฅ๑Oื“>=<1๊ฆ๊๙d%๑0vr}Inศภg*รแหŠyAท7e{ฅ,พซ@—๙FบMฯพึฏBถผผ[^ฺPด๋Uaฏั\$'ญๆ/๙]DP”DะกPA&ๆ•๊๘b^.žLถ ๐kวD~ฑบตต ้sK๋’SHปf๛ฦ๔kแMทฝศrF็วหา"Š[฿๛๚6 B‰=l๛ฟKศย–b_ฐฒฎn`*%๒‚]ุถ๗ซญpifฒฒ•Eฝ^๕๐๛ึgถ{y่๋~%๔ZV๖ฐฯ๙]‡‹ีถ๏)๖E›››฿‚๊l๔,{w777ไ๏kqr้…:naธ฿๘รQQำฟโฌจ€วgปกใ๘nP&ฦ๚๓๒ปฟ•ฤ๒สx<พg๊ิฉ'uถทฯี๑ Œภ๏ลอผฅชฯ†D–<ฺ๚†EฌI&žุะ0ช_0ชซ*kko*ุUฯฤ1a*kเคฏ‡อz;6ˆ๖ทฒ3d_I(„๊!5จ9 #‡๒ลฟ•2tL9~ขj๓yฃ‹*Kฐ@ฟพ__2ซn('–ฎp’฿uPWู‰ํป.#๏๒ฐ๊ๆุ‚ฦƒoผฟ%S–”’ธuCม๐uKGƒ๑~d่พษ†Ž7,,4=eอ๊ฦd8ํEKพจูฟ$๎พ๚Oq†1Uฎ๏˜ŒAOYAฬ๏่•ฐP9ธ฿~Pอสwธn~฿ถ*+Q zสžสษ~—@ŸVป?ีgEฐwศ๊ธ๏2ภ งฌผvูaฯ๏:่ำj๖็๖SY\๕ฦยนc.ฃุ๔” 9๎^E>ซมO๔9(ทDฒ๊j=eI๐ปJฏฌฺBธ’”ณ%ภ้๋ฬ;ี๏:Љ฿”ญOต#ฆเจฬสนKo{z~sฯ‹฿”eะZล Sฮัแร‡ํน๏"Š…฿”Qำ +สpU›|W5„๗้sฅE๏6อๆwลภ งŒชถุฃQ"}‘๚+บ๑dHggE“฿Eฟ;(# ูCฎ…+๘Oูๆ7็ใw…ฦ๏สHฎYpสซน๏" AOYะฟ+ wก2ถ ๊ƒุ†…๓พ่w…ฤ ง,0่ƒ.Tฮ ๏ั๏ฎošWmยŠˆุ(#ฑฅF™#ฎ”="๊ธลฃWฑA๏Ÿถ_๙ฎY๙ž7พFง^ เๆโ_บ๐ธ๑etsbษ? ไ{~ืAฎv_•ื {_ošณwธำz@้๘๘ฑีwภ-๗n๒ป|ใญสH`ฅ€œ‚Dฑ3฿S†ปฌ›ะBj™]ธm8}ฤ งฬิฮ{ˆPžI~ƒ~ร‚นวAั๏6๊Pี9๋ฮ9ั๏:๒AO)„A|y‰%ทฃๆƒˆXทCฤจงR๑ Iนโ'๚Rฐ#_ญๆผ/)ะฏ๙Jะ„ ็ฬ๖ปˆ|bะSFช๚‘฿5PF๒1ษ<ฃJ`/ฮว\ฅL!‹?hšaฬ‹‚ zสจชข๒uถ฿u3^อวiz;€ทฎƒœ)ไๅพฮ๑ฮต็๏/ะk๒Qืl๘ึœƒ.#๔”๔9HจpิN๕๙๋ำ;€ผฎล/q•ฐญ[."๔”Q}••iŸพ>ฮ= ภyy*ว$็ฎึผ“.ขฏ๔”Q}ษ๏ศัGืิ}๙}ฯg75Y*๒}๘าy ๘Dํ1cFศ๏:๚‚AOYI…ฅี๏ศ"ู—ำ7tผ9O€ฯๆซใจ|fกU๛]F_0่)+ ๋fภฟ๋ 4qฏงพ|ํE5|;Ÿๅ˜HDnzป้โฝฎร+=eK4๛]}šˆฝฦ๋น•แ๎o‘วrLตWชณ๛zฟ‹๐ŠAOYUฯŸฉ`>y9/'พ๕ญ FrUพ 2ุ•๕‚#.ย =eอถญี~ื@HEW/ย"O/ณฅl "ฯ%™,lงP’ํบ๔”ต'ฯ| ภณ~ืAOิZ๎ๅผ฿ผ`’gไปำ 0eรยyำฎ#W zส‰*~๊w ๔7+ยแ•9Ÿี ZšŸLA๔๛ฏ]uUI&ฤ งœ„BึR)ฟ๋ @E๊mO‘“]ฃ.มั…จฉŸ84\ณใrฟ‹ศƒžr๒๚/mR`•฿uฟ]m\0{ˆ*ตๅ๔'ฐ๓๖๕ปŽl1่)gpฟ฿5^]ฝ.ื“ิ*๛6€กจงฟฉตสpƒ฿Ed‹AO9;dsู ฏ๙]GฆะGฯป Yธ๐ย#ฬ/LEB/ูธเ‚ฎ# zสู๔้ำSข๒]ฟ๋่ว๎Z@ฮgY๖๗„๓_Nฟeฉ…๏—ยถƒ z๒dฯฐ๐Ol๔ปŽH ท.:bzg.็ฌ_8๏,UœRจš๚ฑ๚ ๆœใw™0่ษ“EGL๏T(—่›โฝ=ี;๏อๅ”šf”Cิˆพ๊$rปM๓ซ.ร #ฯ:ซw]ฑ{เ?เึsล"ธqั —๎ฮๅ”ฺิ€qภฏrบกOYSc<ใw-ND•_~๒๎ๆฤฒณ๚฿~ืัO<ื‘yข“O๎๖ป*-ผuC}ฒ :๓ื๑ปŽ~ภV[ๆ3ไษ =๕Y*„ฏุๅw&ศฝ g>แwTš๔ิg฿ฌ›ตATn๔ปc)ณ;ป๘]•.=ๅลž†WnUมใ~ืa R๙๒‚Is>๔ป*] zส‹EXd—Yฉ๓ผ๋w-&Q่฿hœษ ิ' zส›k๊พ>ฤžvทฬ—ๆC7—›฿EP้cะS^]9-€&ฟ๋0ภ&๖ฬ้ำง๓‡&๕ืัS!ศโฤาป\์w!%j‡BใยบY}‡J ?ัS!่่อe—๘ฅ฿…” NฮaศS>1่ฉ ฆOŸž๊Huž ล๏ZJHJกณฏ‹ฬโฦ.”W z*˜E'_ฐง#ีy&O๚]K ่Vี‹Dgย๏Bศ<ผGOื๔๔ีปฎ0อ๏ZชูืEg๒VƒžŠขiํฺp…๕๎!zก฿ตฬGjg.h{var __webpack_modules__={5067:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ActivityMonitor=void 0;const n=i(6424);t.ActivityMonitor=class{constructor(e){this._timer=-1,this._timeout=-1,this._isDisposed=!1,this._activityStopped=new n.Signal(this),e.signal.connect(this._onSignalFired,this),this._timeout=e.timeout||1e3}get activityStopped(){return this._activityStopped}get timeout(){return this._timeout}set timeout(e){this._timeout=e}get isDisposed(){return this._isDisposed}dispose(){this._isDisposed||(this._isDisposed=!0,n.Signal.clearData(this))}_onSignalFired(e,t){clearTimeout(this._timer),this._sender=e,this._args=t,this._timer=setTimeout((()=>{this._activityStopped.emit({sender:this._sender,args:this._args})}),this._timeout)}}},4251:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),s(i(5067),t),s(i(6742),t),s(i(5366),t),s(i(6470),t),s(i(5675),t),s(i(5571),t),s(i(1735),t),s(i(1152),t),s(i(5248),t)},6742:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},5366:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.MarkdownCodeBlocks=void 0,function(e){e.CODE_BLOCK_MARKER="```";const t=[".markdown",".mdown",".mkdn",".md",".mkd",".mdwn",".mdtxt",".mdtext",".text",".txt",".Rmd"];class i{constructor(e){this.startLine=e,this.code="",this.endLine=-1}}e.MarkdownCodeBlock=i,e.isMarkdown=function(e){return t.indexOf(e)>-1},e.findMarkdownCodeBlocks=function(t){if(!t||""===t)return[];const n=t.split("\n"),s=[];let r=null;for(let t=0;te===t||n&&e===n))},e.isDisabled=function(t){const i=t.indexOf(":");let n="";return-1!==i&&(n=t.slice(0,i)),e.disabled.some((e=>e===t||n&&e===n))}}(Extension=PageConfig.Extension||(PageConfig.Extension={}))})(PageConfig=exports.PageConfig||(exports.PageConfig={}))},5675:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PathExt=void 0;const n=i(2005);!function(e){function t(e){return 0===e.indexOf("/")&&(e=e.slice(1)),e}e.join=function(...e){const i=n.posix.join(...e);return"."===i?"":t(i)},e.basename=function(e,t){return n.posix.basename(e,t)},e.dirname=function(e){const i=t(n.posix.dirname(e));return"."===i?"":i},e.extname=function(e){return n.posix.extname(e)},e.normalize=function(e){return""===e?"":t(n.posix.normalize(e))},e.resolve=function(...e){return t(n.posix.resolve(...e))},e.relative=function(e,i){return t(n.posix.relative(e,i))},e.normalizeExtension=function(e){return e.length>0&&0!==e.indexOf(".")&&(e=`.${e}`),e},e.removeSlash=t}(t.PathExt||(t.PathExt={}))},5571:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.signalToPromise=void 0;const n=i(3911);t.signalToPromise=function(e,t){const i=new n.PromiseDelegate;function s(){e.disconnect(r)}function r(e,t){s(),i.resolve([e,t])}return e.connect(r),(null!=t?t:0)>0&&setTimeout((()=>{s(),i.reject(`Signal not emitted within ${t} ms.`)}),t),i.promise}},1735:(e,t)=>{"use strict";var i;Object.defineProperty(t,"__esModule",{value:!0}),t.Text=void 0,(i=t.Text||(t.Text={})).jsIndexToCharIndex=function(e,t){return e},i.charIndexToJsIndex=function(e,t){return e},i.camelCase=function(e,t=!1){return e.replace(/^(\w)|[\s-_:]+(\w)/g,(function(e,i,n){return n?n.toUpperCase():t?i.toUpperCase():i.toLowerCase()}))},i.titleCase=function(e){return(e||"").toLowerCase().split(" ").map((e=>e.charAt(0).toUpperCase()+e.slice(1))).join(" ")}},1152:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Time=void 0;const i=[{name:"years",milliseconds:31536e6},{name:"months",milliseconds:2592e6},{name:"days",milliseconds:864e5},{name:"hours",milliseconds:36e5},{name:"minutes",milliseconds:6e4},{name:"seconds",milliseconds:1e3}];var n;(n=t.Time||(t.Time={})).formatHuman=function(e){const t=document.documentElement.lang||"en",n=new Intl.RelativeTimeFormat(t,{numeric:"auto"}),s=new Date(e).getTime()-Date.now();for(let e of i){const t=Math.ceil(s/e.milliseconds);if(0!==t)return n.format(t,e.name)}return n.format(0,"seconds")},n.format=function(e){const t=document.documentElement.lang||"en";return new Intl.DateTimeFormat(t,{dateStyle:"short",timeStyle:"short"}).format(new Date(e))}},5248:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.URLExt=void 0;const s=i(2005),r=n(i(2296));!function(e){function t(e){if("undefined"!=typeof document&&document){const t=document.createElement("a");return t.href=e,t}return(0,r.default)(e)}function i(...e){let t=(0,r.default)(e[0],{});const i=""===t.protocol&&t.slashes;i&&(t=(0,r.default)(e[0],"https:"+e[0]));const n=`${i?"":t.protocol}${t.slashes?"//":""}${t.auth}${t.auth?"@":""}${t.host}`,o=s.posix.join(`${n&&"/"!==t.pathname[0]?"/":""}${t.pathname}`,...e.slice(1));return`${n}${"."===o?"":o}`}e.parse=t,e.getHostName=function(e){return(0,r.default)(e).hostname},e.normalize=function(e){return e&&t(e).toString()},e.join=i,e.encodeParts=function(e){return i(...e.split("/").map(encodeURIComponent))},e.objectToQueryString=function(e){const t=Object.keys(e).filter((e=>e.length>0));return t.length?"?"+t.map((t=>{const i=encodeURIComponent(String(e[t]));return t+(i?"="+i:"")})).join("&"):""},e.queryStringToObject=function(e){return e.replace(/^\?/,"").split("&").reduce(((e,t)=>{const[i,n]=t.split("=");return i.length>0&&(e[i]=decodeURIComponent(n||"")),e}),{})},e.isLocal=function(e){const{protocol:i}=t(e);return(!i||0!==e.toLowerCase().indexOf(i))&&0!==e.indexOf("/")}}(t.URLExt||(t.URLExt={}))},7524:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BaseManager=void 0;const n=i(6424),s=i(538);t.BaseManager=class{constructor(e){var t;this._isDisposed=!1,this._disposed=new n.Signal(this),this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:s.ServerConnection.makeSettings()}get disposed(){return this._disposed}get isDisposed(){return this._isDisposed}get isActive(){return!0}dispose(){this.isDisposed||(this._disposed.emit(void 0),n.Signal.clearData(this))}}},4011:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.BuildManager=void 0;const n=i(4251),s=i(538);t.BuildManager=class{constructor(e={}){var t;this._url="",this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:s.ServerConnection.makeSettings();const{baseUrl:i,appUrl:r}=this.serverSettings;this._url=n.URLExt.join(i,r,"api/build")}get isAvailable(){return"true"===n.PageConfig.getOption("buildAvailable").toLowerCase()}get shouldCheck(){return"true"===n.PageConfig.getOption("buildCheck").toLowerCase()}getStatus(){const{_url:e,serverSettings:t}=this;return s.ServerConnection.makeRequest(e,{},t).then((e=>{if(200!==e.status)throw new s.ServerConnection.ResponseError(e);return e.json()})).then((e=>{if("string"!=typeof e.status)throw new Error("Invalid data");if("string"!=typeof e.message)throw new Error("Invalid data");return e}))}build(){const{_url:e,serverSettings:t}=this;return s.ServerConnection.makeRequest(e,{method:"POST"},t).then((e=>{if(400===e.status)throw new s.ServerConnection.ResponseError(e,"Build aborted");if(200!==e.status){const t=`Build failed with ${e.status}.\n\n If you are experiencing the build failure after installing an extension (or trying to include previously installed extension after updating JupyterLab) please check the extension repository for new installation instructions as many extensions migrated to the prebuilt extensions system which no longer requires rebuilding JupyterLab (but uses a different installation procedure, typically involving a package manager such as 'pip' or 'conda').\n\n If you specifically intended to install a source extension, please run 'jupyter lab build' on the server for full output.`;throw new s.ServerConnection.ResponseError(e,t)}}))}cancel(){const{_url:e,serverSettings:t}=this;return s.ServerConnection.makeRequest(e,{method:"DELETE"},t).then((e=>{if(204!==e.status)throw new s.ServerConnection.ResponseError(e)}))}}},7302:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConfigWithDefaults=t.ConfigSection=void 0;const n=i(4251),s=i(5247);(t.ConfigSection||(t.ConfigSection={})).create=function(e){const t=new r(e);return t.load().then((()=>t))};class r{constructor(e){var t;this._url="unknown";const i=this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:s.ServerConnection.makeSettings();this._url=n.URLExt.join(i.baseUrl,"api/config",encodeURIComponent(e.name))}get data(){return this._data}async load(){const e=await s.ServerConnection.makeRequest(this._url,{},this.serverSettings);if(200!==e.status)throw await s.ServerConnection.ResponseError.create(e);this._data=await e.json()}async update(e){this._data={...this._data,...e};const t={method:"PATCH",body:JSON.stringify(e)},i=await s.ServerConnection.makeRequest(this._url,t,this.serverSettings);if(200!==i.status)throw await s.ServerConnection.ResponseError.create(i);return this._data=await i.json(),this._data}}t.ConfigWithDefaults=class{constructor(e){var t,i;this._className="",this._section=e.section,this._defaults=null!==(t=e.defaults)&&void 0!==t?t:{},this._className=null!==(i=e.className)&&void 0!==i?i:""}get(e){const t=this._classData();return e in t?t[e]:this._defaults[e]}set(e,t){const i={};if(i[e]=t,this._className){const e={};return e[this._className]=i,this._section.update(e)}return this._section.update(i)}_classData(){const e=this._section.data;return this._className&&this._className in e?e[this._className]:e}}},1708:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Drive=t.ContentsManager=t.Contents=void 0;const o=i(4251),a=i(6424),l=i(5247),h=r(i(3394));var c,d;(d=t.Contents||(t.Contents={})).validateContentsModel=function(e){h.validateContentsModel(e)},d.validateCheckpointModel=function(e){h.validateCheckpointModel(e)},t.ContentsManager=class{constructor(e={}){var t,i;this._isDisposed=!1,this._additionalDrives=new Map,this._fileChanged=new a.Signal(this);const n=this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:l.ServerConnection.makeSettings();this._defaultDrive=null!==(i=e.defaultDrive)&&void 0!==i?i:new u({serverSettings:n}),this._defaultDrive.fileChanged.connect(this._onFileChanged,this)}get fileChanged(){return this._fileChanged}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,a.Signal.clearData(this))}addDrive(e){this._additionalDrives.set(e.name,e),e.fileChanged.connect(this._onFileChanged,this)}getSharedModelFactory(e){var t;const[i]=this._driveForPath(e);return null!==(t=null==i?void 0:i.sharedModelFactory)&&void 0!==t?t:null}localPath(e){const t=e.split("/"),i=t[0].split(":");return 1!==i.length&&this._additionalDrives.has(i[0])?o.PathExt.join(i.slice(1).join(":"),...t.slice(1)):o.PathExt.removeSlash(e)}normalize(e){const t=e.split(":");return 1===t.length?o.PathExt.normalize(e):`${t[0]}:${o.PathExt.normalize(t.slice(1).join(":"))}`}resolvePath(e,t){const i=this.driveName(e),n=this.localPath(e),s=o.PathExt.resolve("/",n,t);return i?`${i}:${s}`:s}driveName(e){const t=e.split("/")[0].split(":");return 1===t.length?"":this._additionalDrives.has(t[0])?t[0]:""}get(e,t){const[i,n]=this._driveForPath(e);return i.get(n,t).then((e=>{const t=[];if("directory"===e.type&&e.content){for(const n of e.content)t.push({...n,path:this._toGlobalPath(i,n.path)});return{...e,path:this._toGlobalPath(i,n),content:t,serverPath:e.path}}return{...e,path:this._toGlobalPath(i,n),serverPath:e.path}}))}getDownloadUrl(e){const[t,i]=this._driveForPath(e);return t.getDownloadUrl(i)}newUntitled(e={}){if(e.path){const t=this.normalize(e.path),[i,n]=this._driveForPath(t);return i.newUntitled({...e,path:n}).then((e=>({...e,path:o.PathExt.join(t,e.name),serverPath:e.path})))}return this._defaultDrive.newUntitled(e)}delete(e){const[t,i]=this._driveForPath(e);return t.delete(i)}rename(e,t){const[i,n]=this._driveForPath(e),[s,r]=this._driveForPath(t);if(i!==s)throw Error("ContentsManager: renaming files must occur within a Drive");return i.rename(n,r).then((e=>({...e,path:this._toGlobalPath(i,r),serverPath:e.path})))}save(e,t={}){const i=this.normalize(e),[n,s]=this._driveForPath(e);return n.save(s,{...t,path:s}).then((e=>({...e,path:i,serverPath:e.path})))}copy(e,t){const[i,n]=this._driveForPath(e),[s,r]=this._driveForPath(t);if(i===s)return i.copy(n,r).then((e=>({...e,path:this._toGlobalPath(i,e.path),serverPath:e.path})));throw Error("Copying files between drives is not currently implemented")}createCheckpoint(e){const[t,i]=this._driveForPath(e);return t.createCheckpoint(i)}listCheckpoints(e){const[t,i]=this._driveForPath(e);return t.listCheckpoints(i)}restoreCheckpoint(e,t){const[i,n]=this._driveForPath(e);return i.restoreCheckpoint(n,t)}deleteCheckpoint(e,t){const[i,n]=this._driveForPath(e);return i.deleteCheckpoint(n,t)}_toGlobalPath(e,t){return e===this._defaultDrive?o.PathExt.removeSlash(t):`${e.name}:${o.PathExt.removeSlash(t)}`}_driveForPath(e){const t=this.driveName(e),i=this.localPath(e);return t?[this._additionalDrives.get(t),i]:[this._defaultDrive,i]}_onFileChanged(e,t){var i,n;if(e===this._defaultDrive)this._fileChanged.emit(t);else{let s=null,r=null;(null===(i=t.newValue)||void 0===i?void 0:i.path)&&(s={...t.newValue,path:this._toGlobalPath(e,t.newValue.path)}),(null===(n=t.oldValue)||void 0===n?void 0:n.path)&&(r={...t.oldValue,path:this._toGlobalPath(e,t.oldValue.path)}),this._fileChanged.emit({type:t.type,newValue:s,oldValue:r})}}};class u{constructor(e={}){var t,i,n;this._isDisposed=!1,this._fileChanged=new a.Signal(this),this.name=null!==(t=e.name)&&void 0!==t?t:"Default",this._apiEndpoint=null!==(i=e.apiEndpoint)&&void 0!==i?i:"api/contents",this.serverSettings=null!==(n=e.serverSettings)&&void 0!==n?n:l.ServerConnection.makeSettings()}get fileChanged(){return this._fileChanged}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,a.Signal.clearData(this))}async get(e,t){let i=this._getUrl(e);if(t){"notebook"===t.type&&delete t.format;const e=t.content?"1":"0",n={...t,content:e};i+=o.URLExt.objectToQueryString(n)}const n=this.serverSettings,s=await l.ServerConnection.makeRequest(i,{},n);if(200!==s.status)throw await l.ServerConnection.ResponseError.create(s);const r=await s.json();return h.validateContentsModel(r),r}getDownloadUrl(e){const t=this.serverSettings.baseUrl;let i=o.URLExt.join(t,"files",o.URLExt.encodeParts(e));const n=document.cookie.match("\\b_xsrf=([^;]*)\\b");if(n){const e=new URL(i);e.searchParams.append("_xsrf",n[1]),i=e.toString()}return Promise.resolve(i)}async newUntitled(e={}){var t;let i="{}";e&&(e.ext&&(e.ext=c.normalizeExtension(e.ext)),i=JSON.stringify(e));const n=this.serverSettings,s=this._getUrl(null!==(t=e.path)&&void 0!==t?t:""),r={method:"POST",body:i},o=await l.ServerConnection.makeRequest(s,r,n);if(201!==o.status)throw await l.ServerConnection.ResponseError.create(o);const a=await o.json();return h.validateContentsModel(a),this._fileChanged.emit({type:"new",oldValue:null,newValue:a}),a}async delete(e){const t=this._getUrl(e),i=this.serverSettings,n=await l.ServerConnection.makeRequest(t,{method:"DELETE"},i);if(204!==n.status)throw await l.ServerConnection.ResponseError.create(n);this._fileChanged.emit({type:"delete",oldValue:{path:e},newValue:null})}async rename(e,t){const i=this.serverSettings,n=this._getUrl(e),s={method:"PATCH",body:JSON.stringify({path:t})},r=await l.ServerConnection.makeRequest(n,s,i);if(200!==r.status)throw await l.ServerConnection.ResponseError.create(r);const o=await r.json();return h.validateContentsModel(o),this._fileChanged.emit({type:"rename",oldValue:{path:e},newValue:o}),o}async save(e,t={}){const i=this.serverSettings,n=this._getUrl(e),s={method:"PUT",body:JSON.stringify(t)},r=await l.ServerConnection.makeRequest(n,s,i);if(200!==r.status&&201!==r.status)throw await l.ServerConnection.ResponseError.create(r);const o=await r.json();return h.validateContentsModel(o),this._fileChanged.emit({type:"save",oldValue:null,newValue:o}),o}async copy(e,t){const i=this.serverSettings,n=this._getUrl(t),s={method:"POST",body:JSON.stringify({copy_from:e})},r=await l.ServerConnection.makeRequest(n,s,i);if(201!==r.status)throw await l.ServerConnection.ResponseError.create(r);const o=await r.json();return h.validateContentsModel(o),this._fileChanged.emit({type:"new",oldValue:null,newValue:o}),o}async createCheckpoint(e){const t=this._getUrl(e,"checkpoints"),i=await l.ServerConnection.makeRequest(t,{method:"POST"},this.serverSettings);if(201!==i.status)throw await l.ServerConnection.ResponseError.create(i);const n=await i.json();return h.validateCheckpointModel(n),n}async listCheckpoints(e){const t=this._getUrl(e,"checkpoints"),i=await l.ServerConnection.makeRequest(t,{},this.serverSettings);if(200!==i.status)throw await l.ServerConnection.ResponseError.create(i);const n=await i.json();if(!Array.isArray(n))throw new Error("Invalid Checkpoint list");for(let e=0;eo.URLExt.encodeParts(e))),i=this.serverSettings.baseUrl;return o.URLExt.join(i,this._apiEndpoint,...t)}}t.Drive=u,function(e){e.normalizeExtension=function(e){return e.length>0&&0!==e.indexOf(".")&&(e=`.${e}`),e}}(c||(c={}))},3394:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateCheckpointModel=t.validateContentsModel=void 0;const n=i(3247);t.validateContentsModel=function(e){(0,n.validateProperty)(e,"name","string"),(0,n.validateProperty)(e,"path","string"),(0,n.validateProperty)(e,"type","string"),(0,n.validateProperty)(e,"created","string"),(0,n.validateProperty)(e,"last_modified","string"),(0,n.validateProperty)(e,"mimetype","object"),(0,n.validateProperty)(e,"content","object"),(0,n.validateProperty)(e,"format","object")},t.validateCheckpointModel=function(e){(0,n.validateProperty)(e,"id","string"),(0,n.validateProperty)(e,"last_modified","string")}},5657:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EventManager=void 0;const n=i(4251),s=i(9044),r=i(6424),o=i(538),a="api/events";t.EventManager=class{constructor(e={}){var t;this._socket=null,this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:o.ServerConnection.makeSettings(),this._poll=new s.Poll({factory:()=>this._subscribe()}),this._stream=new r.Stream(this),this._poll.start()}get isDisposed(){return this._poll.isDisposed}get stream(){return this._stream}dispose(){if(this.isDisposed)return;this._poll.dispose();const e=this._socket;e&&(this._socket=null,e.onopen=()=>{},e.onerror=()=>{},e.onmessage=()=>{},e.onclose=()=>{},e.close()),r.Signal.clearData(this),this._stream.stop()}async emit(e){const{serverSettings:t}=this,{baseUrl:i,token:s}=t,{makeRequest:r,ResponseError:l}=o.ServerConnection,h=n.URLExt.join(i,a)+(s?`?token=${s}`:""),c={body:JSON.stringify(e),method:"POST"},d=await r(h,c,t);if(204!==d.status)throw new l(d)}_subscribe(){return new Promise(((e,t)=>{if(this.isDisposed)return;const{token:i,WebSocket:s,wsUrl:r}=this.serverSettings,o=n.URLExt.join(r,a,"subscribe")+(i?`?token=${encodeURIComponent(i)}`:""),l=this._socket=new s(o),h=this._stream;l.onclose=()=>t(new Error("EventManager socket closed")),l.onmessage=e=>e.data&&h.emit(JSON.parse(e.data))}))}}},5247:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),s(i(7524),t),s(i(7302),t),s(i(1708),t),s(i(5657),t),s(i(5674),t),s(i(3490),t),s(i(7797),t),s(i(538),t),s(i(3561),t),s(i(9188),t),s(i(3185),t),s(i(1014),t),s(i(9090),t),s(i(6624),t)},8341:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.CommHandler=void 0;const o=i(1122),a=r(i(1736));class l extends o.DisposableDelegate{constructor(e,t,i,n){super(n),this._target="",this._id="",this._id=t,this._target=e,this._kernel=i}get commId(){return this._id}get targetName(){return this._target}get onClose(){return this._onClose}set onClose(e){this._onClose=e}get onMsg(){return this._onMsg}set onMsg(e){this._onMsg=e}open(e,t,i=[]){if(this.isDisposed||this._kernel.isDisposed)throw new Error("Cannot open");const n=a.createMessage({msgType:"comm_open",channel:"shell",username:this._kernel.username,session:this._kernel.clientId,content:{comm_id:this._id,target_name:this._target,data:null!=e?e:{}},metadata:t,buffers:i});return this._kernel.sendShellMessage(n,!1,!0)}send(e,t,i=[],n=!0){if(this.isDisposed||this._kernel.isDisposed)throw new Error("Cannot send");const s=a.createMessage({msgType:"comm_msg",channel:"shell",username:this._kernel.username,session:this._kernel.clientId,content:{comm_id:this._id,data:e},metadata:t,buffers:i});return this._kernel.sendShellMessage(s,!1,n)}close(e,t,i=[]){if(this.isDisposed||this._kernel.isDisposed)throw new Error("Cannot close");const n=a.createMessage({msgType:"comm_close",channel:"shell",username:this._kernel.username,session:this._kernel.clientId,content:{comm_id:this._id,data:null!=e?e:{}},metadata:t,buffers:i}),s=this._kernel.sendShellMessage(n,!1,!0),r=this._onClose;return r&&r(a.createMessage({msgType:"comm_close",channel:"iopub",username:this._kernel.username,session:this._kernel.clientId,content:{comm_id:this._id,data:null!=e?e:{}},metadata:t,buffers:i})),this.dispose(),s}}t.CommHandler=l},5306:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.KernelConnection=void 0;const o=i(4251),a=i(3911),l=i(6424),h=i(5247),c=i(8341),d=r(i(1736)),u=i(217),p=i(8206),f=r(i(776)),m=i(3490),g=r(i(9753)),v="_RESTARTING_";class O{constructor(e){var t,i,n,s;this._createSocket=(e=!0)=>{this._errorIfDisposed(),this._clearSocket(),this._updateConnectionStatus("connecting");const t=this.serverSettings,i=o.URLExt.join(t.wsUrl,g.KERNEL_SERVICE_URL,encodeURIComponent(this._id)),n=i.replace(/^((?:\w+:)?\/\/)(?:[^@\/]+@)/,"$1");console.debug(`Starting WebSocket: ${n}`);let s=o.URLExt.join(i,"channels?session_id="+encodeURIComponent(this._clientId));const r=t.token;t.appendToken&&""!==r&&(s+=`&token=${encodeURIComponent(r)}`);const a=e?this._supportedProtocols:[];this._ws=new t.WebSocket(s,a),this._ws.binaryType="arraybuffer";let l=!1;const c=async e=>{var i,n;if(!this._isDisposed){this._reason="",this._model=void 0;try{const i=await g.getKernelModel(this._id,t);this._model=i,"dead"===(null==i?void 0:i.execution_state)?this._updateStatus("dead"):this._onWSClose(e)}catch(t){if(t instanceof h.ServerConnection.NetworkError||503===(null===(i=t.response)||void 0===i?void 0:i.status)||424===(null===(n=t.response)||void 0===n?void 0:n.status)){const t=1e3*b.getRandomIntInclusive(10,30);setTimeout(c,t,e)}else this._reason="Kernel died unexpectedly",this._updateStatus("dead")}}},d=async e=>{l||(l=!0,await c(e))};this._ws.onmessage=this._onWSMessage,this._ws.onopen=this._onWSOpen,this._ws.onclose=d,this._ws.onerror=d},this._onWSOpen=e=>{if(""!==this._ws.protocol&&!this._supportedProtocols.includes(this._ws.protocol))throw console.log("Server selected unknown kernel wire protocol:",this._ws.protocol),this._updateStatus("dead"),new Error(`Unknown kernel wire protocol: ${this._ws.protocol}`);this._selectedProtocol=this._ws.protocol,this._ws.onclose=this._onWSClose,this._ws.onerror=this._onWSClose,this._updateConnectionStatus("connected")},this._onWSMessage=e=>{let t;try{t=(0,p.deserialize)(e.data,this._ws.protocol),f.validateMessage(t)}catch(e){throw e.message=`Kernel message validation error: ${e.message}`,e}this._kernelSession=t.header.session,this._msgChain=this._msgChain.then((()=>this._handleMessage(t))).catch((e=>{e.message.startsWith("Canceled future for ")&&console.error(e)})),this._anyMessage.emit({msg:t,direction:"recv"})},this._onWSClose=e=>{this.isDisposed||this._reconnect()},this._id="",this._name="",this._status="unknown",this._connectionStatus="connecting",this._kernelSession="",this._isDisposed=!1,this._ws=null,this._username="",this._reconnectLimit=7,this._reconnectAttempt=0,this._reconnectTimeout=null,this._supportedProtocols=Object.values(d.supportedKernelWebSocketProtocols),this._selectedProtocol="",this._futures=new Map,this._comms=new Map,this._targetRegistry=Object.create(null),this._info=new a.PromiseDelegate,this._pendingMessages=[],this._statusChanged=new l.Signal(this),this._connectionStatusChanged=new l.Signal(this),this._disposed=new l.Signal(this),this._iopubMessage=new l.Signal(this),this._anyMessage=new l.Signal(this),this._pendingInput=new l.Signal(this),this._unhandledMessage=new l.Signal(this),this._displayIdToParentIds=new Map,this._msgIdToDisplayIds=new Map,this._msgChain=Promise.resolve(),this._hasPendingInput=!1,this._reason="",this._noOp=()=>{},this._name=e.model.name,this._id=e.model.id,this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:h.ServerConnection.makeSettings(),this._clientId=null!==(i=e.clientId)&&void 0!==i?i:a.UUID.uuid4(),this._username=null!==(n=e.username)&&void 0!==n?n:"",this.handleComms=null===(s=e.handleComms)||void 0===s||s,this._createSocket()}get disposed(){return this._disposed}get statusChanged(){return this._statusChanged}get connectionStatusChanged(){return this._connectionStatusChanged}get iopubMessage(){return this._iopubMessage}get unhandledMessage(){return this._unhandledMessage}get model(){return this._model||{id:this.id,name:this.name,reason:this._reason}}get anyMessage(){return this._anyMessage}get pendingInput(){return this._pendingInput}get id(){return this._id}get name(){return this._name}get username(){return this._username}get clientId(){return this._clientId}get status(){return this._status}get connectionStatus(){return this._connectionStatus}get isDisposed(){return this._isDisposed}get info(){return this._info.promise}get spec(){return this._specPromise||(this._specPromise=m.KernelSpecAPI.getSpecs(this.serverSettings).then((e=>e.kernelspecs[this._name]))),this._specPromise}clone(e={}){return new O({model:this.model,username:this.username,serverSettings:this.serverSettings,handleComms:!1,...e})}dispose(){this.isDisposed||(this._isDisposed=!0,this._disposed.emit(),this._updateConnectionStatus("disconnected"),this._clearKernelState(),this._pendingMessages=[],this._clearSocket(),l.Signal.clearData(this))}sendShellMessage(e,t=!1,i=!0){return this._sendKernelShellControl(u.KernelShellFutureHandler,e,t,i)}sendControlMessage(e,t=!1,i=!0){return this._sendKernelShellControl(u.KernelControlFutureHandler,e,t,i)}_sendKernelShellControl(e,t,i=!1,n=!0){this._sendMessage(t),this._anyMessage.emit({msg:t,direction:"send"});const s=new e((()=>{const e=t.header.msg_id;this._futures.delete(e);const i=this._msgIdToDisplayIds.get(e);i&&(i.forEach((t=>{const i=this._displayIdToParentIds.get(t);if(i){const n=i.indexOf(e);if(-1===n)return;1===i.length?this._displayIdToParentIds.delete(t):(i.splice(n,1),this._displayIdToParentIds.set(t,i))}})),this._msgIdToDisplayIds.delete(e))}),t,i,n,this);return this._futures.set(t.header.msg_id,s),s}_sendMessage(e,t=!0){if("dead"===this.status)throw new Error("Kernel is dead");if((""===this._kernelSession||this._kernelSession===v)&&d.isInfoRequestMsg(e)){if("connected"===this.connectionStatus)return void this._ws.send((0,p.serialize)(e,this._ws.protocol));throw new Error("Could not send message: status is not connected")}if(t&&this._pendingMessages.length>0)this._pendingMessages.push(e);else if("connected"===this.connectionStatus&&this._kernelSession!==v)this._ws.send((0,p.serialize)(e,this._ws.protocol));else{if(!t)throw new Error("Could not send message");this._pendingMessages.push(e)}}async interrupt(){if(this.hasPendingInput=!1,"dead"===this.status)throw new Error("Kernel is dead");return g.interruptKernel(this.id,this.serverSettings)}async restart(){if("dead"===this.status)throw new Error("Kernel is dead");this._updateStatus("restarting"),this._clearKernelState(),this._kernelSession=v,await g.restartKernel(this.id,this.serverSettings),await this.reconnect(),this.hasPendingInput=!1}reconnect(){this._errorIfDisposed();const e=new a.PromiseDelegate,t=(i,n)=>{"connected"===n?(e.resolve(),this.connectionStatusChanged.disconnect(t,this)):"disconnected"===n&&(e.reject(new Error("Kernel connection disconnected")),this.connectionStatusChanged.disconnect(t,this))};return this.connectionStatusChanged.connect(t,this),this._reconnectAttempt=0,this._reconnect(),e.promise}async shutdown(){"dead"!==this.status&&await g.shutdownKernel(this.id,this.serverSettings),this.handleShutdown()}handleShutdown(){this._updateStatus("dead"),this.dispose()}async requestKernelInfo(){const e=d.createMessage({msgType:"kernel_info_request",channel:"shell",username:this._username,session:this._clientId,content:{}});let t;try{t=await b.handleShellMessage(this,e)}catch(e){if(this.isDisposed)return;throw e}if(this._errorIfDisposed(),t)return void 0===t.content.status&&(t.content.status="ok"),"ok"!==t.content.status?(this._info.reject("Kernel info reply errored"),t):(this._info.resolve(t.content),this._kernelSession=t.header.session,t)}requestComplete(e){const t=d.createMessage({msgType:"complete_request",channel:"shell",username:this._username,session:this._clientId,content:e});return b.handleShellMessage(this,t)}requestInspect(e){const t=d.createMessage({msgType:"inspect_request",channel:"shell",username:this._username,session:this._clientId,content:e});return b.handleShellMessage(this,t)}requestHistory(e){const t=d.createMessage({msgType:"history_request",channel:"shell",username:this._username,session:this._clientId,content:e});return b.handleShellMessage(this,t)}requestExecute(e,t=!0,i){const n=d.createMessage({msgType:"execute_request",channel:"shell",username:this._username,session:this._clientId,content:{silent:!1,store_history:!0,user_expressions:{},allow_stdin:!0,stop_on_error:!1,...e},metadata:i});return this.sendShellMessage(n,!0,t)}requestDebug(e,t=!0){const i=d.createMessage({msgType:"debug_request",channel:"control",username:this._username,session:this._clientId,content:e});return this.sendControlMessage(i,!0,t)}requestIsComplete(e){const t=d.createMessage({msgType:"is_complete_request",channel:"shell",username:this._username,session:this._clientId,content:e});return b.handleShellMessage(this,t)}requestCommInfo(e){const t=d.createMessage({msgType:"comm_info_request",channel:"shell",username:this._username,session:this._clientId,content:e});return b.handleShellMessage(this,t)}sendInputReply(e,t){const i=d.createMessage({msgType:"input_reply",channel:"stdin",username:this._username,session:this._clientId,content:e});i.parent_header=t,this._sendMessage(i),this._anyMessage.emit({msg:i,direction:"send"}),this.hasPendingInput=!1}createComm(e,t=a.UUID.uuid4()){if(!this.handleComms)throw new Error("Comms are disabled on this kernel connection");if(this._comms.has(t))throw new Error("Comm is already created");const i=new c.CommHandler(e,t,this,(()=>{this._unregisterComm(t)}));return this._comms.set(t,i),i}hasComm(e){return this._comms.has(e)}registerCommTarget(e,t){this.handleComms&&(this._targetRegistry[e]=t)}removeCommTarget(e,t){this.handleComms&&(this.isDisposed||this._targetRegistry[e]!==t||delete this._targetRegistry[e])}registerMessageHook(e,t){var i;const n=null===(i=this._futures)||void 0===i?void 0:i.get(e);n&&n.registerMessageHook(t)}removeMessageHook(e,t){var i;const n=null===(i=this._futures)||void 0===i?void 0:i.get(e);n&&n.removeMessageHook(t)}removeInputGuard(){this.hasPendingInput=!1}async _handleDisplayId(e,t){var i,n;const s=t.parent_header.msg_id;let r=this._displayIdToParentIds.get(e);if(r){const e={header:a.JSONExt.deepCopy(t.header),parent_header:a.JSONExt.deepCopy(t.parent_header),metadata:a.JSONExt.deepCopy(t.metadata),content:a.JSONExt.deepCopy(t.content),channel:t.channel,buffers:t.buffers?t.buffers.slice():[]};e.header.msg_type="update_display_data",await Promise.all(r.map((async t=>{const i=this._futures&&this._futures.get(t);i&&await i.handleMsg(e)})))}if("update_display_data"===t.header.msg_type)return!0;r=null!==(i=this._displayIdToParentIds.get(e))&&void 0!==i?i:[],-1===r.indexOf(s)&&r.push(s),this._displayIdToParentIds.set(e,r);const o=null!==(n=this._msgIdToDisplayIds.get(s))&&void 0!==n?n:[];return-1===o.indexOf(s)&&o.push(s),this._msgIdToDisplayIds.set(s,o),!1}_clearSocket(){null!==this._ws&&(this._ws.onopen=this._noOp,this._ws.onclose=this._noOp,this._ws.onerror=this._noOp,this._ws.onmessage=this._noOp,this._ws.close(),this._ws=null)}_updateStatus(e){this._status!==e&&"dead"!==this._status&&(this._status=e,b.logKernelStatus(this),this._statusChanged.emit(e),"dead"===e&&this.dispose())}_sendPending(){for(;"connected"===this.connectionStatus&&this._kernelSession!==v&&this._pendingMessages.length>0;)this._sendMessage(this._pendingMessages[0],!1),this._pendingMessages.shift()}_clearKernelState(){this._kernelSession="",this._pendingMessages=[],this._futures.forEach((e=>{e.dispose()})),this._comms.forEach((e=>{e.dispose()})),this._msgChain=Promise.resolve(),this._futures=new Map,this._comms=new Map,this._displayIdToParentIds.clear(),this._msgIdToDisplayIds.clear()}_assertCurrentMessage(e){if(this._errorIfDisposed(),e.header.session!==this._kernelSession)throw new Error(`Canceling handling of old message: ${e.header.msg_type}`)}async _handleCommOpen(e){this._assertCurrentMessage(e);const t=e.content,i=new c.CommHandler(t.target_name,t.comm_id,this,(()=>{this._unregisterComm(t.comm_id)}));this._comms.set(t.comm_id,i);try{const n=await b.loadObject(t.target_name,t.target_module,this._targetRegistry);await n(i,e)}catch(e){throw i.close(),console.error("Exception opening new comm"),e}}async _handleCommClose(e){this._assertCurrentMessage(e);const t=e.content,i=this._comms.get(t.comm_id);if(!i)return void console.error("Comm not found for comm id "+t.comm_id);this._unregisterComm(i.commId);const n=i.onClose;n&&await n(e),i.dispose()}async _handleCommMsg(e){this._assertCurrentMessage(e);const t=e.content,i=this._comms.get(t.comm_id);if(!i)return;const n=i.onMsg;n&&await n(e)}_unregisterComm(e){this._comms.delete(e)}_updateConnectionStatus(e){if(this._connectionStatus!==e){if(this._connectionStatus=e,"connecting"!==e&&(this._reconnectAttempt=0,clearTimeout(this._reconnectTimeout)),"dead"!==this.status)if("connected"===e){let e=this._kernelSession===v,t=this.requestKernelInfo(),i=!1,n=()=>{i||(i=!0,e&&this._kernelSession===v&&(this._kernelSession=""),clearTimeout(s),this._pendingMessages.length>0&&this._sendPending())};t.then(n);let s=setTimeout(n,3e3)}else this._updateStatus("unknown");this._connectionStatusChanged.emit(e)}}async _handleMessage(e){var t,i;let n=!1;if(e.parent_header&&"iopub"===e.channel&&(d.isDisplayDataMsg(e)||d.isUpdateDisplayDataMsg(e)||d.isExecuteResultMsg(e))){const i=(null!==(t=e.content.transient)&&void 0!==t?t:{}).display_id;i&&(n=await this._handleDisplayId(i,e),this._assertCurrentMessage(e))}if(!n&&e.parent_header){const t=e.parent_header,n=null===(i=this._futures)||void 0===i?void 0:i.get(t.msg_id);if(n)await n.handleMsg(e),this._assertCurrentMessage(e);else{const i=t.session===this.clientId;"iopub"!==e.channel&&i&&this._unhandledMessage.emit(e)}}if("iopub"===e.channel){switch(e.header.msg_type){case"status":{const t=e.content.execution_state;"restarting"===t&&Promise.resolve().then((async()=>{this._updateStatus("autorestarting"),this._clearKernelState(),await this.reconnect()})),this._updateStatus(t);break}case"comm_open":this.handleComms&&await this._handleCommOpen(e);break;case"comm_msg":this.handleComms&&await this._handleCommMsg(e);break;case"comm_close":this.handleComms&&await this._handleCommClose(e)}this.isDisposed||(this._assertCurrentMessage(e),this._iopubMessage.emit(e))}}_reconnect(){if(this._errorIfDisposed(),clearTimeout(this._reconnectTimeout),this._reconnectAttempt{if(t){if("undefined"==typeof requirejs)throw new Error("requirejs not found");requirejs([t],(i=>{void 0===i[e]?s(new Error(`Object '${e}' not found in module '${t}'`)):n(i[e])}),s)}else(null==i?void 0:i[e])?n(i[e]):s(new Error(`Object '${e}' not found in registry`))}))},e.getRandomIntInclusive=function(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e+1))+e}}(b||(b={}))},217:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.KernelShellFutureHandler=t.KernelControlFutureHandler=t.KernelFutureHandler=void 0;const o=i(3911),a=i(1122),l=r(i(1736));class h extends a.DisposableDelegate{constructor(e,t,i,n,s){super(e),this._status=0,this._stdin=c.noOp,this._iopub=c.noOp,this._reply=c.noOp,this._done=new o.PromiseDelegate,this._hooks=new c.HookList,this._disposeOnDone=!0,this._msg=t,i||this._setFlag(c.KernelFutureFlag.GotReply),this._disposeOnDone=n,this._kernel=s}get msg(){return this._msg}get done(){return this._done.promise}get onReply(){return this._reply}set onReply(e){this._reply=e}get onIOPub(){return this._iopub}set onIOPub(e){this._iopub=e}get onStdin(){return this._stdin}set onStdin(e){this._stdin=e}registerMessageHook(e){if(this.isDisposed)throw new Error("Kernel future is disposed");this._hooks.add(e)}removeMessageHook(e){this.isDisposed||this._hooks.remove(e)}sendInputReply(e,t){this._kernel.sendInputReply(e,t)}dispose(){this._stdin=c.noOp,this._iopub=c.noOp,this._reply=c.noOp,this._hooks=null,this._testFlag(c.KernelFutureFlag.IsDone)||(this._done.promise.catch((()=>{})),this._done.reject(new Error(`Canceled future for ${this.msg.header.msg_type} message before replies were done`))),super.dispose()}async handleMsg(e){switch(e.channel){case"control":case"shell":e.channel===this.msg.channel&&e.parent_header.msg_id===this.msg.header.msg_id&&await this._handleReply(e);break;case"stdin":await this._handleStdin(e);break;case"iopub":await this._handleIOPub(e)}}async _handleReply(e){const t=this._reply;t&&await t(e),this._replyMsg=e,this._setFlag(c.KernelFutureFlag.GotReply),this._testFlag(c.KernelFutureFlag.GotIdle)&&this._handleDone()}async _handleStdin(e){this._kernel.hasPendingInput=!0;const t=this._stdin;t&&await t(e)}async _handleIOPub(e){const t=await this._hooks.process(e),i=this._iopub;t&&i&&await i(e),l.isStatusMsg(e)&&"idle"===e.content.execution_state&&(this._setFlag(c.KernelFutureFlag.GotIdle),this._testFlag(c.KernelFutureFlag.GotReply)&&this._handleDone())}_handleDone(){this._testFlag(c.KernelFutureFlag.IsDone)||(this._setFlag(c.KernelFutureFlag.IsDone),this._done.resolve(this._replyMsg),this._disposeOnDone&&this.dispose())}_testFlag(e){return 0!=(this._status&e)}_setFlag(e){this._status|=e}}var c;t.KernelFutureHandler=h,t.KernelControlFutureHandler=class extends h{},t.KernelShellFutureHandler=class extends h{},function(e){e.noOp=()=>{};const t="function"==typeof requestAnimationFrame?requestAnimationFrame:setImmediate;let i;e.HookList=class{constructor(){this._hooks=[]}add(e){this.remove(e),this._hooks.push(e)}remove(e){const t=this._hooks.indexOf(e);t>=0&&(this._hooks[t]=null,this._scheduleCompact())}async process(e){await this._processing;const t=new o.PromiseDelegate;let i;this._processing=t.promise;for(let n=this._hooks.length-1;n>=0;n--){const s=this._hooks[n];if(null!==s){try{i=await s(e)}catch(e){i=!0,console.error(e)}if(!1===i)return t.resolve(void 0),!1}}return t.resolve(void 0),!0}_scheduleCompact(){this._compactScheduled||(this._compactScheduled=!0,t((()=>{this._processing=this._processing.then((()=>{this._compactScheduled=!1,this._compact()}))})))}_compact(){let e=0;for(let t=0,i=this._hooks.length;t{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},2298:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.KernelManager=void 0;const n=i(9044),s=i(6424),r=i(5247),o=i(7524),a=i(9753),l=i(5306);class h extends o.BaseManager{constructor(e={}){var t;super(e),this._isReady=!1,this._kernelConnections=new Set,this._models=new Map,this._runningChanged=new s.Signal(this),this._connectionFailure=new s.Signal(this),this._pollModels=new n.Poll({auto:!1,factory:()=>this.requestRunning(),frequency:{interval:1e4,backoff:!0,max:3e5},name:"@jupyterlab/services:KernelManager#models",standby:null!==(t=e.standby)&&void 0!==t?t:"when-hidden"}),this._ready=(async()=>{await this._pollModels.start(),await this._pollModels.tick,this._isReady=!0})()}get isReady(){return this._isReady}get ready(){return this._ready}get runningChanged(){return this._runningChanged}get connectionFailure(){return this._connectionFailure}dispose(){this.isDisposed||(this._models.clear(),this._kernelConnections.forEach((e=>e.dispose())),this._pollModels.dispose(),super.dispose())}connectTo(e){var t;const{id:i}=e.model;let n=null===(t=e.handleComms)||void 0===t||t;if(void 0===e.handleComms)for(const e of this._kernelConnections)if(e.id===i&&e.handleComms){n=!1;break}const s=new l.KernelConnection({handleComms:n,...e,serverSettings:this.serverSettings});return this._onStarted(s),this._models.has(i)||this.refreshRunning().catch((()=>{})),s}running(){return this._models.values()}async refreshRunning(){await this._pollModels.refresh(),await this._pollModels.tick}async startNew(e={},t={}){const i=await(0,a.startNew)(e,this.serverSettings);return this.connectTo({...t,model:i})}async shutdown(e){await(0,a.shutdownKernel)(e,this.serverSettings),await this.refreshRunning()}async shutdownAll(){await this.refreshRunning(),await Promise.all([...this._models.keys()].map((e=>(0,a.shutdownKernel)(e,this.serverSettings)))),await this.refreshRunning()}async findById(e){return this._models.has(e)||await this.refreshRunning(),this._models.get(e)}async requestRunning(){var e,t;let i;try{i=await(0,a.listRunning)(this.serverSettings)}catch(i){throw(i instanceof r.ServerConnection.NetworkError||503===(null===(e=i.response)||void 0===e?void 0:e.status)||424===(null===(t=i.response)||void 0===t?void 0:t.status))&&this._connectionFailure.emit(i),i}this.isDisposed||this._models.size===i.length&&i.every((e=>{const t=this._models.get(e.id);return!!t&&t.connections===e.connections&&t.execution_state===e.execution_state&&t.last_activity===e.last_activity&&t.name===e.name&&t.reason===e.reason&&t.traceback===e.traceback}))||(this._models=new Map(i.map((e=>[e.id,e]))),this._kernelConnections.forEach((e=>{this._models.has(e.id)||e.handleShutdown()})),this._runningChanged.emit(i))}_onStarted(e){this._kernelConnections.add(e),e.statusChanged.connect(this._onStatusChanged,this),e.disposed.connect(this._onDisposed,this)}_onDisposed(e){this._kernelConnections.delete(e),this.refreshRunning().catch((()=>{}))}_onStatusChanged(e,t){"dead"===t&&this.refreshRunning().catch((()=>{}))}}t.KernelManager=h,function(e){e.NoopManager=class extends e{constructor(){super(...arguments),this._readyPromise=new Promise((()=>{}))}get isActive(){return!1}get parentReady(){return super.ready}async startNew(e={},t={}){return Promise.reject(new Error("Not implemented in no-op Kernel Manager"))}connectTo(e){throw new Error("Not implemented in no-op Kernel Manager")}async shutdown(e){return Promise.reject(new Error("Not implemented in no-op Kernel Manager"))}get ready(){return this.parentReady.then((()=>this._readyPromise))}async requestRunning(){return Promise.resolve()}}}(h=t.KernelManager||(t.KernelManager={}))},1736:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.supportedKernelWebSocketProtocols=t.isInputReplyMsg=t.isInputRequestMsg=t.isDebugReplyMsg=t.isDebugRequestMsg=t.isExecuteReplyMsg=t.isInfoRequestMsg=t.isCommMsgMsg=t.isCommCloseMsg=t.isCommOpenMsg=t.isDebugEventMsg=t.isClearOutputMsg=t.isStatusMsg=t.isErrorMsg=t.isExecuteResultMsg=t.isExecuteInputMsg=t.isUpdateDisplayDataMsg=t.isDisplayDataMsg=t.isStreamMsg=t.createMessage=void 0;const n=i(3911);t.createMessage=function(e){var t,i,s,r,o;return{buffers:null!==(t=e.buffers)&&void 0!==t?t:[],channel:e.channel,content:e.content,header:{date:(new Date).toISOString(),msg_id:null!==(i=e.msgId)&&void 0!==i?i:n.UUID.uuid4(),msg_type:e.msgType,session:e.session,username:null!==(s=e.username)&&void 0!==s?s:"",version:"5.2"},metadata:null!==(r=e.metadata)&&void 0!==r?r:{},parent_header:null!==(o=e.parentHeader)&&void 0!==o?o:{}}},t.isStreamMsg=function(e){return"stream"===e.header.msg_type},t.isDisplayDataMsg=function(e){return"display_data"===e.header.msg_type},t.isUpdateDisplayDataMsg=function(e){return"update_display_data"===e.header.msg_type},t.isExecuteInputMsg=function(e){return"execute_input"===e.header.msg_type},t.isExecuteResultMsg=function(e){return"execute_result"===e.header.msg_type},t.isErrorMsg=function(e){return"error"===e.header.msg_type},t.isStatusMsg=function(e){return"status"===e.header.msg_type},t.isClearOutputMsg=function(e){return"clear_output"===e.header.msg_type},t.isDebugEventMsg=function(e){return"debug_event"===e.header.msg_type},t.isCommOpenMsg=function(e){return"comm_open"===e.header.msg_type},t.isCommCloseMsg=function(e){return"comm_close"===e.header.msg_type},t.isCommMsgMsg=function(e){return"comm_msg"===e.header.msg_type},t.isInfoRequestMsg=function(e){return"kernel_info_request"===e.header.msg_type},t.isExecuteReplyMsg=function(e){return"execute_reply"===e.header.msg_type},t.isDebugRequestMsg=function(e){return"debug_request"===e.header.msg_type},t.isDebugReplyMsg=function(e){return"debug_reply"===e.header.msg_type},t.isInputRequestMsg=function(e){return"input_request"===e.header.msg_type},t.isInputReplyMsg=function(e){return"input_reply"===e.header.msg_type},(t.supportedKernelWebSocketProtocols||(t.supportedKernelWebSocketProtocols={})).v1KernelWebsocketJupyterOrg="v1.kernel.websocket.jupyter.org"},9753:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getKernelModel=t.shutdownKernel=t.interruptKernel=t.restartKernel=t.startNew=t.listRunning=t.KERNEL_SERVICE_URL=void 0;const n=i(538),s=i(4251),r=i(776);t.KERNEL_SERVICE_URL="api/kernels",t.listRunning=async function(e=n.ServerConnection.makeSettings()){const i=s.URLExt.join(e.baseUrl,t.KERNEL_SERVICE_URL),o=await n.ServerConnection.makeRequest(i,{},e);if(200!==o.status)throw await n.ServerConnection.ResponseError.create(o);const a=await o.json();return(0,r.validateModels)(a),a},t.startNew=async function(e={},i=n.ServerConnection.makeSettings()){const o=s.URLExt.join(i.baseUrl,t.KERNEL_SERVICE_URL),a={method:"POST",body:JSON.stringify(e)},l=await n.ServerConnection.makeRequest(o,a,i);if(201!==l.status)throw await n.ServerConnection.ResponseError.create(l);const h=await l.json();return(0,r.validateModel)(h),h},t.restartKernel=async function(e,i=n.ServerConnection.makeSettings()){const o=s.URLExt.join(i.baseUrl,t.KERNEL_SERVICE_URL,encodeURIComponent(e),"restart"),a=await n.ServerConnection.makeRequest(o,{method:"POST"},i);if(200!==a.status)throw await n.ServerConnection.ResponseError.create(a);const l=await a.json();(0,r.validateModel)(l)},t.interruptKernel=async function(e,i=n.ServerConnection.makeSettings()){const r=s.URLExt.join(i.baseUrl,t.KERNEL_SERVICE_URL,encodeURIComponent(e),"interrupt"),o=await n.ServerConnection.makeRequest(r,{method:"POST"},i);if(204!==o.status)throw await n.ServerConnection.ResponseError.create(o)},t.shutdownKernel=async function(e,i=n.ServerConnection.makeSettings()){const r=s.URLExt.join(i.baseUrl,t.KERNEL_SERVICE_URL,encodeURIComponent(e)),o=await n.ServerConnection.makeRequest(r,{method:"DELETE"},i);if(404===o.status){const t=`The kernel "${e}" does not exist on the server`;console.warn(t)}else if(204!==o.status)throw await n.ServerConnection.ResponseError.create(o)},t.getKernelModel=async function(e,i=n.ServerConnection.makeSettings()){const o=s.URLExt.join(i.baseUrl,t.KERNEL_SERVICE_URL,encodeURIComponent(e)),a=await n.ServerConnection.makeRequest(o,{},i);if(404===a.status)return;if(200!==a.status)throw await n.ServerConnection.ResponseError.create(a);const l=await a.json();return(0,r.validateModel)(l),l}},8206:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.deserialize=t.serialize=void 0;const o=r(i(1736));var a;t.serialize=function(e,t=""){return t===o.supportedKernelWebSocketProtocols.v1KernelWebsocketJupyterOrg?a.serializeV1KernelWebsocketJupyterOrg(e):a.serializeDefault(e)},t.deserialize=function(e,t=""){return t===o.supportedKernelWebSocketProtocols.v1KernelWebsocketJupyterOrg?a.deserializeV1KernelWebsocketJupyterOrg(e):a.deserializeDefault(e)},function(e){e.deserializeV1KernelWebsocketJupyterOrg=function(e){let t;const i=new DataView(e),n=Number(i.getBigUint64(0,!0));let s=[];for(let e=0;e{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateModels=t.validateModel=t.validateMessage=void 0;const n=i(3247),s=["username","version","session","msg_id","msg_type"],r={stream:{name:"string",text:"string"},display_data:{data:"object",metadata:"object"},execute_input:{code:"string",execution_count:"number"},execute_result:{execution_count:"number",data:"object",metadata:"object"},error:{ename:"string",evalue:"string",traceback:"object"},status:{execution_state:["string",["starting","idle","busy","restarting","dead"]]},clear_output:{wait:"boolean"},comm_open:{comm_id:"string",target_name:"string",data:"object"},comm_msg:{comm_id:"string",data:"object"},comm_close:{comm_id:"string"},shutdown_reply:{restart:"boolean"}};function o(e){(0,n.validateProperty)(e,"name","string"),(0,n.validateProperty)(e,"id","string")}t.validateMessage=function(e){(0,n.validateProperty)(e,"metadata","object"),(0,n.validateProperty)(e,"content","object"),(0,n.validateProperty)(e,"channel","string"),function(e){for(let t=0;to(e)))}},3490:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t},o=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),t.KernelSpecAPI=t.KernelSpec=void 0;const a=r(i(6060));t.KernelSpec=a;const l=r(i(1598));t.KernelSpecAPI=l,o(i(7307),t)},6060:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},7307:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.KernelSpecManager=void 0;const o=i(3911),a=i(9044),l=i(6424),h=r(i(1598)),c=i(7524);class d extends c.BaseManager{constructor(e={}){var t;super(e),this._isReady=!1,this._connectionFailure=new l.Signal(this),this._specs=null,this._specsChanged=new l.Signal(this),this._ready=Promise.all([this.requestSpecs()]).then((e=>{})).catch((e=>{})).then((()=>{this.isDisposed||(this._isReady=!0)})),this._pollSpecs=new a.Poll({auto:!1,factory:()=>this.requestSpecs(),frequency:{interval:61e3,backoff:!0,max:3e5},name:"@jupyterlab/services:KernelSpecManager#specs",standby:null!==(t=e.standby)&&void 0!==t?t:"when-hidden"}),this.ready.then((()=>{this._pollSpecs.start()}))}get isReady(){return this._isReady}get ready(){return this._ready}get specs(){return this._specs}get specsChanged(){return this._specsChanged}get connectionFailure(){return this._connectionFailure}dispose(){this._pollSpecs.dispose(),super.dispose()}async refreshSpecs(){await this._pollSpecs.refresh(),await this._pollSpecs.tick}async requestSpecs(){const e=await h.getSpecs(this.serverSettings);this.isDisposed||o.JSONExt.deepEqual(e,this._specs)||(this._specs=e,this._specsChanged.emit(e))}}t.KernelSpecManager=d},1598:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getSpecs=void 0;const n=i(538),s=i(4286),r=i(4251);t.getSpecs=async function(e=n.ServerConnection.makeSettings()){const t=r.URLExt.join(e.baseUrl,"api/kernelspecs"),i=await n.ServerConnection.makeRequest(t,{},e);if(200!==i.status)throw await n.ServerConnection.ResponseError.create(i);const o=await i.json();return(0,s.validateSpecModels)(o)}},4286:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateSpecModels=t.validateSpecModel=void 0;const n=i(3247);function s(e){const t=e.spec;if(!t)throw new Error("Invalid kernel spec");(0,n.validateProperty)(e,"name","string"),(0,n.validateProperty)(e,"resources","object"),(0,n.validateProperty)(t,"language","string"),(0,n.validateProperty)(t,"display_name","string"),(0,n.validateProperty)(t,"argv","array");let i=null;t.hasOwnProperty("metadata")&&((0,n.validateProperty)(t,"metadata","object"),i=t.metadata);let s=null;return t.hasOwnProperty("env")&&((0,n.validateProperty)(t,"env","object"),s=t.env),{name:e.name,resources:e.resources,language:t.language,display_name:t.display_name,argv:t.argv,metadata:i,env:s}}t.validateSpecModel=s,t.validateSpecModels=function(e){if(!e.hasOwnProperty("kernelspecs"))throw new Error("No kernelspecs found");let t=Object.keys(e.kernelspecs);const i=Object.create(null);let n=e.default;for(let n=0;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ServiceManager=void 0;const n=i(6424),s=i(4011),r=i(1708),o=i(5657),a=i(5674),l=i(3490),h=i(6624),c=i(538),d=i(3561),u=i(9188),p=i(3185),f=i(1014),m=i(9090);t.ServiceManager=class{constructor(e={}){var t,i;this._isDisposed=!1,this._connectionFailure=new n.Signal(this),this._isReady=!1;const g=e.defaultDrive,v=null!==(t=e.serverSettings)&&void 0!==t?t:c.ServerConnection.makeSettings(),O={defaultDrive:g,serverSettings:v,standby:null!==(i=e.standby)&&void 0!==i?i:"when-hidden"};this.serverSettings=v,this.contents=e.contents||new r.ContentsManager(O),this.events=e.events||new o.EventManager(O),this.kernels=e.kernels||new a.KernelManager(O),this.sessions=e.sessions||new d.SessionManager({...O,kernelManager:this.kernels}),this.settings=e.settings||new u.SettingManager(O),this.terminals=e.terminals||new p.TerminalManager(O),this.builder=e.builder||new s.BuildManager(O),this.workspaces=e.workspaces||new m.WorkspaceManager(O),this.nbconvert=e.nbconvert||new h.NbConvertManager(O),this.kernelspecs=e.kernelspecs||new l.KernelSpecManager(O),this.user=e.user||new f.UserManager(O),this.kernelspecs.connectionFailure.connect(this._onConnectionFailure,this),this.sessions.connectionFailure.connect(this._onConnectionFailure,this),this.terminals.connectionFailure.connect(this._onConnectionFailure,this);const b=[this.sessions.ready,this.kernelspecs.ready];this.terminals.isAvailable()&&b.push(this.terminals.ready),this._readyPromise=Promise.all(b).then((()=>{this._isReady=!0}))}get connectionFailure(){return this._connectionFailure}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,n.Signal.clearData(this),this.contents.dispose(),this.events.dispose(),this.sessions.dispose(),this.terminals.dispose())}get isReady(){return this._isReady}get ready(){return this._readyPromise}_onConnectionFailure(e,t){this._connectionFailure.emit(t)}}},6624:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NbConvertManager=void 0;const n=i(4251),s=i(538),r=i(3911);t.NbConvertManager=class{constructor(e={}){var t;this._exportFormats=null,this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:s.ServerConnection.makeSettings()}async fetchExportFormats(){this._requestingFormats=new r.PromiseDelegate,this._exportFormats=null;const e=this.serverSettings.baseUrl,t=n.URLExt.join(e,"api/nbconvert"),{serverSettings:i}=this,o=await s.ServerConnection.makeRequest(t,{},i);if(200!==o.status)throw await s.ServerConnection.ResponseError.create(o);const a=await o.json(),l={};return Object.keys(a).forEach((function(e){const t=a[e].output_mimetype;l[e]={output_mimetype:t}})),this._exportFormats=l,this._requestingFormats.resolve(l),l}async getExportFormats(e=!0){return this._requestingFormats?this._requestingFormats.promise:e||!this._exportFormats?await this.fetchExportFormats():this._exportFormats}}},538:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ServerConnection=void 0;const n=i(4251);let s;var r,o;s="undefined"==typeof window?i(8354):WebSocket,function(e){e.makeSettings=function(e){return o.makeSettings(e)},e.makeRequest=function(e,t,i){return o.handleRequest(e,t,i)};class t extends Error{static async create(e){try{const i=await e.json(),{message:n,traceback:s}=i;return s&&console.error(s),new t(e,null!=n?n:t._defaultMessage(e),null!=s?s:"")}catch(i){return console.debug(i),new t(e)}}constructor(e,i=t._defaultMessage(e),n=""){super(i),this.response=e,this.traceback=n}static _defaultMessage(e){return`Invalid response: ${e.status} ${e.statusText}`}}e.ResponseError=t;class i extends TypeError{constructor(e){super(e.message),this.stack=e.stack}}e.NetworkError=i}(r=t.ServerConnection||(t.ServerConnection={})),function(e){e.makeSettings=function(e={}){var t;const i=n.PageConfig.getBaseUrl(),r=n.PageConfig.getWsUrl(),o=n.URLExt.normalize(e.baseUrl)||i;let a=e.wsUrl;return a||o!==i||(a=r),a||0!==o.indexOf("http")||(a="ws"+o.slice(4)),a=null!=a?a:r,{init:{cache:"no-store",credentials:"same-origin"},fetch,Headers,Request,WebSocket:s,token:n.PageConfig.getToken(),appUrl:n.PageConfig.getOption("appUrl"),appendToken:"undefined"==typeof window||"undefined"!=typeof process&&void 0!==(null===(t=null===process||void 0===process?void 0:{})||void 0===t?void 0:t.JEST_WORKER_ID)||n.URLExt.getHostName(i)!==n.URLExt.getHostName(a),...e,baseUrl:o,wsUrl:a}},e.handleRequest=function(e,t,i){var n;if(0!==e.indexOf(i.baseUrl))throw new Error("Can only be used for notebook server requests");"no-store"===(null!==(n=t.cache)&&void 0!==n?n:i.init.cache)&&(e+=(/\?/.test(e)?"&":"?")+(new Date).getTime());const s=new i.Request(e,{...i.init,...t});let o=!1;if(i.token&&(o=!0,s.headers.append("Authorization",`token ${i.token}`)),"undefined"!=typeof document&&(null===document||void 0===document?void 0:document.cookie)){const e=function(e){const t=document.cookie.match("\\b_xsrf=([^;]*)\\b");return null==t?void 0:t[1]}();void 0!==e&&(o=!0,s.headers.append("X-XSRFToken",e))}return!s.headers.has("Content-Type")&&o&&s.headers.set("Content-Type","application/json"),i.fetch.call(null,s).catch((e=>{throw new r.NetworkError(e)}))}}(o||(o={}))},6512:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SessionConnection=void 0;const n=i(6424),s=i(5247),r=i(1975),o=i(3911);t.SessionConnection=class{constructor(e){var t,i,r,a;this._id="",this._path="",this._name="",this._type="",this._kernel=null,this._isDisposed=!1,this._disposed=new n.Signal(this),this._kernelChanged=new n.Signal(this),this._statusChanged=new n.Signal(this),this._connectionStatusChanged=new n.Signal(this),this._pendingInput=new n.Signal(this),this._iopubMessage=new n.Signal(this),this._unhandledMessage=new n.Signal(this),this._anyMessage=new n.Signal(this),this._propertyChanged=new n.Signal(this),this._id=e.model.id,this._name=e.model.name,this._path=e.model.path,this._type=e.model.type,this._username=null!==(t=e.username)&&void 0!==t?t:"",this._clientId=null!==(i=e.clientId)&&void 0!==i?i:o.UUID.uuid4(),this._connectToKernel=e.connectToKernel,this._kernelConnectionOptions=null!==(r=e.kernelConnectionOptions)&&void 0!==r?r:{},this.serverSettings=null!==(a=e.serverSettings)&&void 0!==a?a:s.ServerConnection.makeSettings(),this.setupKernel(e.model.kernel)}get disposed(){return this._disposed}get kernelChanged(){return this._kernelChanged}get statusChanged(){return this._statusChanged}get connectionStatusChanged(){return this._connectionStatusChanged}get pendingInput(){return this._pendingInput}get iopubMessage(){return this._iopubMessage}get unhandledMessage(){return this._unhandledMessage}get anyMessage(){return this._anyMessage}get propertyChanged(){return this._propertyChanged}get id(){return this._id}get kernel(){return this._kernel}get path(){return this._path}get type(){return this._type}get name(){return this._name}get model(){return{id:this.id,kernel:this.kernel&&{id:this.kernel.id,name:this.kernel.name},path:this._path,type:this._type,name:this._name}}get isDisposed(){return this._isDisposed}update(e){const t=this.model;if(this._path=e.path,this._name=e.name,this._type=e.type,null===this._kernel&&null!==e.kernel||null!==this._kernel&&null===e.kernel||null!==this._kernel&&null!==e.kernel&&this._kernel.id!==e.kernel.id){null!==this._kernel&&this._kernel.dispose();const t=this._kernel||null;this.setupKernel(e.kernel);const i=this._kernel||null;this._kernelChanged.emit({name:"kernel",oldValue:t,newValue:i})}this._handleModelChange(t)}dispose(){if(!this.isDisposed){if(this._isDisposed=!0,this._disposed.emit(),this._kernel){this._kernel.dispose();const e=this._kernel;this._kernel=null;const t=this._kernel;this._kernelChanged.emit({name:"kernel",oldValue:e,newValue:t})}n.Signal.clearData(this)}}async setPath(e){if(this.isDisposed)throw new Error("Session is disposed");await this._patch({path:e})}async setName(e){if(this.isDisposed)throw new Error("Session is disposed");await this._patch({name:e})}async setType(e){if(this.isDisposed)throw new Error("Session is disposed");await this._patch({type:e})}async changeKernel(e){if(this.isDisposed)throw new Error("Session is disposed");return await this._patch({kernel:e}),this.kernel}async shutdown(){if(this.isDisposed)throw new Error("Session is disposed");await(0,r.shutdownSession)(this.id,this.serverSettings),this.dispose()}setupKernel(e){if(null===e)return void(this._kernel=null);const t=this._connectToKernel({...this._kernelConnectionOptions,model:e,username:this._username,clientId:this._clientId,serverSettings:this.serverSettings});this._kernel=t,t.statusChanged.connect(this.onKernelStatus,this),t.connectionStatusChanged.connect(this.onKernelConnectionStatus,this),t.pendingInput.connect(this.onPendingInput,this),t.unhandledMessage.connect(this.onUnhandledMessage,this),t.iopubMessage.connect(this.onIOPubMessage,this),t.anyMessage.connect(this.onAnyMessage,this)}onKernelStatus(e,t){this._statusChanged.emit(t)}onKernelConnectionStatus(e,t){this._connectionStatusChanged.emit(t)}onPendingInput(e,t){this._pendingInput.emit(t)}onIOPubMessage(e,t){this._iopubMessage.emit(t)}onUnhandledMessage(e,t){this._unhandledMessage.emit(t)}onAnyMessage(e,t){this._anyMessage.emit(t)}async _patch(e){const t=await(0,r.updateSession)({...e,id:this._id},this.serverSettings);return this.update(t),t}_handleModelChange(e){e.name!==this._name&&this._propertyChanged.emit("name"),e.type!==this._type&&this._propertyChanged.emit("type"),e.path!==this._path&&this._propertyChanged.emit("path")}}},3561:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&n(t,e,i);return s(t,e),t},o=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),t.SessionAPI=t.Session=void 0;const a=r(i(7993));t.Session=a;const l=r(i(1975));t.SessionAPI=l,o(i(8137),t)},8137:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SessionManager=void 0;const n=i(9044),s=i(6424),r=i(538),o=i(7524),a=i(6512),l=i(1975);class h extends o.BaseManager{constructor(e){var t;super(e),this._isReady=!1,this._sessionConnections=new Set,this._models=new Map,this._runningChanged=new s.Signal(this),this._connectionFailure=new s.Signal(this),this._connectToKernel=e=>this._kernelManager.connectTo(e),this._kernelManager=e.kernelManager,this._pollModels=new n.Poll({auto:!1,factory:()=>this.requestRunning(),frequency:{interval:1e4,backoff:!0,max:3e5},name:"@jupyterlab/services:SessionManager#models",standby:null!==(t=e.standby)&&void 0!==t?t:"when-hidden"}),this._ready=(async()=>{await this._pollModels.start(),await this._pollModels.tick,this._kernelManager.isActive&&await this._kernelManager.ready,this._isReady=!0})()}get isReady(){return this._isReady}get ready(){return this._ready}get runningChanged(){return this._runningChanged}get connectionFailure(){return this._connectionFailure}dispose(){this.isDisposed||(this._models.clear(),this._sessionConnections.forEach((e=>e.dispose())),this._pollModels.dispose(),super.dispose())}connectTo(e){const t=new a.SessionConnection({...e,connectToKernel:this._connectToKernel,serverSettings:this.serverSettings});return this._onStarted(t),this._models.has(e.model.id)||this.refreshRunning().catch((()=>{})),t}running(){return this._models.values()}async refreshRunning(){await this._pollModels.refresh(),await this._pollModels.tick}async startNew(e,t={}){const i=await(0,l.startSession)(e,this.serverSettings);return await this.refreshRunning(),this.connectTo({...t,model:i})}async shutdown(e){await(0,l.shutdownSession)(e,this.serverSettings),await this.refreshRunning()}async shutdownAll(){await this.refreshRunning(),await Promise.all([...this._models.keys()].map((e=>(0,l.shutdownSession)(e,this.serverSettings)))),await this.refreshRunning()}async stopIfNeeded(e){try{const t=(await(0,l.listRunning)(this.serverSettings)).filter((t=>t.path===e));if(1===t.length){const e=t[0].id;await this.shutdown(e)}}catch(e){}}async findById(e){return this._models.has(e)||await this.refreshRunning(),this._models.get(e)}async findByPath(e){for(const t of this._models.values())if(t.path===e)return t;await this.refreshRunning();for(const t of this._models.values())if(t.path===e)return t}async requestRunning(){var e,t;let i;try{i=await(0,l.listRunning)(this.serverSettings)}catch(i){throw(i instanceof r.ServerConnection.NetworkError||503===(null===(e=i.response)||void 0===e?void 0:e.status)||424===(null===(t=i.response)||void 0===t?void 0:t.status))&&this._connectionFailure.emit(i),i}this.isDisposed||this._models.size===i.length&&i.every((e=>{var t,i,n,s;const r=this._models.get(e.id);return!!r&&(null===(t=r.kernel)||void 0===t?void 0:t.id)===(null===(i=e.kernel)||void 0===i?void 0:i.id)&&(null===(n=r.kernel)||void 0===n?void 0:n.name)===(null===(s=e.kernel)||void 0===s?void 0:s.name)&&r.name===e.name&&r.path===e.path&&r.type===e.type}))||(this._models=new Map(i.map((e=>[e.id,e]))),this._sessionConnections.forEach((e=>{this._models.has(e.id)?e.update(this._models.get(e.id)):e.dispose()})),this._runningChanged.emit(i))}_onStarted(e){this._sessionConnections.add(e),e.disposed.connect(this._onDisposed,this),e.propertyChanged.connect(this._onChanged,this),e.kernelChanged.connect(this._onChanged,this)}_onDisposed(e){this._sessionConnections.delete(e),this.refreshRunning().catch((()=>{}))}_onChanged(){this.refreshRunning().catch((()=>{}))}}t.SessionManager=h,function(e){e.NoopManager=class extends e{constructor(){super(...arguments),this._readyPromise=new Promise((()=>{}))}get isActive(){return!1}get parentReady(){return super.ready}async startNew(e,t={}){return Promise.reject(new Error("Not implemented in no-op Session Manager"))}connectTo(e){throw Error("Not implemented in no-op Session Manager")}get ready(){return this.parentReady.then((()=>this._readyPromise))}async shutdown(e){return Promise.reject(new Error("Not implemented in no-op Session Manager"))}async requestRunning(){return Promise.resolve()}}}(h=t.SessionManager||(t.SessionManager={}))},1975:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.updateSession=t.startSession=t.getSessionModel=t.shutdownSession=t.getSessionUrl=t.listRunning=t.SESSION_SERVICE_URL=void 0;const n=i(538),s=i(4251),r=i(9590);function o(e,i){return s.URLExt.join(e,t.SESSION_SERVICE_URL,i)}t.SESSION_SERVICE_URL="api/sessions",t.listRunning=async function(e=n.ServerConnection.makeSettings()){const i=s.URLExt.join(e.baseUrl,t.SESSION_SERVICE_URL),o=await n.ServerConnection.makeRequest(i,{},e);if(200!==o.status)throw await n.ServerConnection.ResponseError.create(o);const a=await o.json();if(!Array.isArray(a))throw new Error("Invalid Session list");return a.forEach((e=>{(0,r.updateLegacySessionModel)(e),(0,r.validateModel)(e)})),a},t.getSessionUrl=o,t.shutdownSession=async function(e,t=n.ServerConnection.makeSettings()){var i;const s=o(t.baseUrl,e),r=await n.ServerConnection.makeRequest(s,{method:"DELETE"},t);if(404===r.status){const t=null!==(i=(await r.json()).message)&&void 0!==i?i:`The session "${e}"" does not exist on the server`;console.warn(t)}else{if(410===r.status)throw new n.ServerConnection.ResponseError(r,"The kernel was deleted but the session was not");if(204!==r.status)throw await n.ServerConnection.ResponseError.create(r)}},t.getSessionModel=async function(e,t=n.ServerConnection.makeSettings()){const i=o(t.baseUrl,e),s=await n.ServerConnection.makeRequest(i,{},t);if(200!==s.status)throw await n.ServerConnection.ResponseError.create(s);const a=await s.json();return(0,r.updateLegacySessionModel)(a),(0,r.validateModel)(a),a},t.startSession=async function(e,i=n.ServerConnection.makeSettings()){const o=s.URLExt.join(i.baseUrl,t.SESSION_SERVICE_URL),a={method:"POST",body:JSON.stringify(e)},l=await n.ServerConnection.makeRequest(o,a,i);if(201!==l.status)throw await n.ServerConnection.ResponseError.create(l);const h=await l.json();return(0,r.updateLegacySessionModel)(h),(0,r.validateModel)(h),h},t.updateSession=async function(e,t=n.ServerConnection.makeSettings()){const i=o(t.baseUrl,e.id),s={method:"PATCH",body:JSON.stringify(e)},a=await n.ServerConnection.makeRequest(i,s,t);if(200!==a.status)throw await n.ServerConnection.ResponseError.create(a);const l=await a.json();return(0,r.updateLegacySessionModel)(l),(0,r.validateModel)(l),l}},7993:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},9590:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateModels=t.updateLegacySessionModel=t.validateModel=void 0;const n=i(776),s=i(3247);function r(e){(0,s.validateProperty)(e,"id","string"),(0,s.validateProperty)(e,"type","string"),(0,s.validateProperty)(e,"name","string"),(0,s.validateProperty)(e,"path","string"),(0,s.validateProperty)(e,"kernel","object"),(0,n.validateModel)(e.kernel)}t.validateModel=r,t.updateLegacySessionModel=function(e){void 0===e.path&&void 0!==e.notebook&&(e.path=e.notebook.path,e.type="notebook",e.name="")},t.validateModels=function(e){if(!Array.isArray(e))throw new Error("Invalid session list");e.forEach((e=>r(e)))}},9188:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SettingManager=void 0;const n=i(4251),s=i(5895),r=i(538);class o extends s.DataConnector{constructor(e={}){var t;super(),this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:r.ServerConnection.makeSettings()}async fetch(e){if(!e)throw new Error("Plugin `id` parameter is required for settings fetch.");const{serverSettings:t}=this,{baseUrl:i,appUrl:n}=t,{makeRequest:s,ResponseError:o}=r.ServerConnection,l=i+n,h=a.url(l,e),c=await s(h,{},t);if(200!==c.status)throw await o.create(c);return c.json()}async list(e){var t,i,n,s;const{serverSettings:o}=this,{baseUrl:l,appUrl:h}=o,{makeRequest:c,ResponseError:d}=r.ServerConnection,u=l+h,p=a.url(u,"","ids"===e),f=await c(p,{},o);if(200!==f.status)throw new d(f);const m=await f.json(),g=null!==(i=null===(t=null==m?void 0:m.settings)||void 0===t?void 0:t.map((e=>e.id)))&&void 0!==i?i:[];let v=[];return e||(v=null!==(s=null===(n=null==m?void 0:m.settings)||void 0===n?void 0:n.map((e=>(e.data={composite:{},user:{}},e))))&&void 0!==s?s:[]),{ids:g,values:v}}async save(e,t){const{serverSettings:i}=this,{baseUrl:n,appUrl:s}=i,{makeRequest:o,ResponseError:l}=r.ServerConnection,h=n+s,c=a.url(h,e),d={body:JSON.stringify({raw:t}),method:"PUT"},u=await o(c,d,i);if(204!==u.status)throw new l(u)}}var a;t.SettingManager=o,function(e){e.url=function(e,t,i){const s=i?n.URLExt.objectToQueryString({ids_only:!0}):"";return`${n.URLExt.join(e,"api/settings",t)}${s}`}}(a||(a={}))},8354:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=WebSocket},7685:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TerminalConnection=void 0;const n=i(4251),s=i(3911),r=i(6424),o=i(5247),a=i(7384);class l{constructor(e){var t;this._createSocket=()=>{this._errorIfDisposed(),this._clearSocket(),this._updateConnectionStatus("connecting");const e=this._name,t=this.serverSettings;let i=n.URLExt.join(t.wsUrl,"terminals","websocket",encodeURIComponent(e));const s=t.token;t.appendToken&&""!==s&&(i+=`?token=${encodeURIComponent(s)}`),this._ws=new t.WebSocket(i),this._ws.onmessage=this._onWSMessage,this._ws.onclose=this._onWSClose,this._ws.onerror=this._onWSClose},this._onWSMessage=e=>{if(this._isDisposed)return;const t=JSON.parse(e.data);"disconnect"===t[0]&&this.dispose(),"connecting"!==this._connectionStatus?this._messageReceived.emit({type:t[0],content:t.slice(1)}):"setup"===t[0]&&this._updateConnectionStatus("connected")},this._onWSClose=e=>{console.warn(`Terminal websocket closed: ${e.code}`),this.isDisposed||this._reconnect()},this._connectionStatus="connecting",this._connectionStatusChanged=new r.Signal(this),this._isDisposed=!1,this._disposed=new r.Signal(this),this._messageReceived=new r.Signal(this),this._reconnectTimeout=null,this._ws=null,this._noOp=()=>{},this._reconnectLimit=7,this._reconnectAttempt=0,this._pendingMessages=[],this._name=e.model.name,this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:o.ServerConnection.makeSettings(),this._createSocket()}get disposed(){return this._disposed}get messageReceived(){return this._messageReceived}get name(){return this._name}get model(){return{name:this._name}}get isDisposed(){return this._isDisposed}dispose(){this._isDisposed||(this._isDisposed=!0,this._disposed.emit(),this._updateConnectionStatus("disconnected"),this._clearSocket(),r.Signal.clearData(this))}send(e){this._sendMessage(e)}_sendMessage(e,t=!0){if(!this._isDisposed&&e.content)if("connected"===this.connectionStatus&&this._ws){const t=[e.type,...e.content];this._ws.send(JSON.stringify(t))}else{if(!t)throw new Error(`Could not send message: ${JSON.stringify(e)}`);this._pendingMessages.push(e)}}_sendPending(){for(;"connected"===this.connectionStatus&&this._pendingMessages.length>0;)this._sendMessage(this._pendingMessages[0],!1),this._pendingMessages.shift()}reconnect(){this._errorIfDisposed();const e=new s.PromiseDelegate,t=(i,n)=>{"connected"===n?(e.resolve(),this.connectionStatusChanged.disconnect(t,this)):"disconnected"===n&&(e.reject(new Error("Terminal connection disconnected")),this.connectionStatusChanged.disconnect(t,this))};return this.connectionStatusChanged.connect(t,this),this._reconnectAttempt=0,this._reconnect(),e.promise}_reconnect(){if(this._errorIfDisposed(),clearTimeout(this._reconnectTimeout),this._reconnectAttempt{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TerminalManager=void 0;const n=i(9044),s=i(6424),r=i(5247),o=i(7524),a=i(7384),l=i(7685);class h extends o.BaseManager{constructor(e={}){var t;if(super(e),this._isReady=!1,this._names=[],this._terminalConnections=new Set,this._runningChanged=new s.Signal(this),this._connectionFailure=new s.Signal(this),!this.isAvailable())return this._ready=Promise.reject("Terminals unavailable"),void this._ready.catch((e=>{}));this._pollModels=new n.Poll({auto:!1,factory:()=>this.requestRunning(),frequency:{interval:1e4,backoff:!0,max:3e5},name:"@jupyterlab/services:TerminalManager#models",standby:null!==(t=e.standby)&&void 0!==t?t:"when-hidden"}),this._ready=(async()=>{await this._pollModels.start(),await this._pollModels.tick,this._isReady=!0})()}get isReady(){return this._isReady}get ready(){return this._ready}get runningChanged(){return this._runningChanged}get connectionFailure(){return this._connectionFailure}dispose(){this.isDisposed||(this._names.length=0,this._terminalConnections.forEach((e=>e.dispose())),this._pollModels.dispose(),super.dispose())}isAvailable(){return(0,a.isAvailable)()}connectTo(e){const t=new l.TerminalConnection({...e,serverSettings:this.serverSettings});return this._onStarted(t),this._names.includes(e.model.name)||this.refreshRunning().catch((()=>{})),t}running(){return this._models[Symbol.iterator]()}async refreshRunning(){await this._pollModels.refresh(),await this._pollModels.tick}async startNew(e){const t=await(0,a.startNew)(this.serverSettings,null==e?void 0:e.name,null==e?void 0:e.cwd);return await this.refreshRunning(),this.connectTo({model:t})}async shutdown(e){await(0,a.shutdownTerminal)(e,this.serverSettings),await this.refreshRunning()}async shutdownAll(){await this.refreshRunning(),await Promise.all(this._names.map((e=>(0,a.shutdownTerminal)(e,this.serverSettings)))),await this.refreshRunning()}async requestRunning(){var e,t;let i;try{i=await(0,a.listRunning)(this.serverSettings)}catch(i){throw(i instanceof r.ServerConnection.NetworkError||503===(null===(e=i.response)||void 0===e?void 0:e.status)||424===(null===(t=i.response)||void 0===t?void 0:t.status))&&this._connectionFailure.emit(i),i}if(this.isDisposed)return;const n=i.map((({name:e})=>e)).sort();n!==this._names&&(this._names=n,this._terminalConnections.forEach((e=>{n.includes(e.name)||e.dispose()})),this._runningChanged.emit(this._models))}_onStarted(e){this._terminalConnections.add(e),e.disposed.connect(this._onDisposed,this)}_onDisposed(e){this._terminalConnections.delete(e),this.refreshRunning().catch((()=>{}))}get _models(){return this._names.map((e=>({name:e})))}}t.TerminalManager=h,function(e){e.NoopManager=class extends e{constructor(){super(...arguments),this._readyPromise=new Promise((()=>{}))}get isActive(){return!1}get parentReady(){return super.ready}get ready(){return this.parentReady.then((()=>this._readyPromise))}async startNew(e){return Promise.reject(new Error("Not implemented in no-op Terminal Manager"))}connectTo(e){throw Error("Not implemented in no-op Terminal Manager")}async shutdown(e){return Promise.reject(new Error("Not implemented in no-op Terminal Manager"))}async requestRunning(){return Promise.resolve()}}}(h=t.TerminalManager||(t.TerminalManager={}))},7384:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.shutdownTerminal=t.listRunning=t.startNew=t.isAvailable=t.TERMINAL_SERVICE_URL=void 0;const n=i(4251),s=i(538);function r(){return"true"===String(n.PageConfig.getOption("terminalsAvailable")).toLowerCase()}var o;t.TERMINAL_SERVICE_URL="api/terminals",t.isAvailable=r,t.startNew=async function(e=s.ServerConnection.makeSettings(),i,r){o.errorIfNotAvailable();const a=n.URLExt.join(e.baseUrl,t.TERMINAL_SERVICE_URL),l={method:"POST",body:JSON.stringify({name:i,cwd:r})},h=await s.ServerConnection.makeRequest(a,l,e);if(200!==h.status)throw await s.ServerConnection.ResponseError.create(h);return await h.json()},t.listRunning=async function(e=s.ServerConnection.makeSettings()){o.errorIfNotAvailable();const i=n.URLExt.join(e.baseUrl,t.TERMINAL_SERVICE_URL),r=await s.ServerConnection.makeRequest(i,{},e);if(200!==r.status)throw await s.ServerConnection.ResponseError.create(r);const a=await r.json();if(!Array.isArray(a))throw new Error("Invalid terminal list");return a},t.shutdownTerminal=async function(e,i=s.ServerConnection.makeSettings()){var r;o.errorIfNotAvailable();const a=n.URLExt.join(i.baseUrl,t.TERMINAL_SERVICE_URL,e),l=await s.ServerConnection.makeRequest(a,{method:"DELETE"},i);if(404===l.status){const t=null!==(r=(await l.json()).message)&&void 0!==r?r:`The terminal session "${e}"" does not exist on the server`;console.warn(t)}else if(204!==l.status)throw await s.ServerConnection.ResponseError.create(l)},function(e){e.errorIfNotAvailable=function(){if(!r())throw new Error("Terminals Unavailable")}}(o||(o={}))},3828:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isAvailable=void 0;const n=i(7384);Object.defineProperty(t,"isAvailable",{enumerable:!0,get:function(){return n.isAvailable}})},1014:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UserManager=void 0;const n=i(4251),s=i(3911),r=i(9044),o=i(6424),a=i(538),l=i(7524),h="@jupyterlab/services:UserManager#user";class c extends l.BaseManager{constructor(e={}){var t;super(e),this._isReady=!1,this._userChanged=new o.Signal(this),this._connectionFailure=new o.Signal(this),this._ready=this.requestUser().then((()=>{this.isDisposed||(this._isReady=!0)})).catch((e=>new Promise((()=>{})))),this._pollSpecs=new r.Poll({auto:!1,factory:()=>this.requestUser(),frequency:{interval:61e3,backoff:!0,max:3e5},name:h,standby:null!==(t=e.standby)&&void 0!==t?t:"when-hidden"}),this.ready.then((()=>{this._pollSpecs.start()}))}get isReady(){return this._isReady}get ready(){return this._ready}get identity(){return this._identity}get permissions(){return this._permissions}get userChanged(){return this._userChanged}get connectionFailure(){return this._connectionFailure}dispose(){this._pollSpecs.dispose(),super.dispose()}async refreshUser(){await this._pollSpecs.refresh(),await this._pollSpecs.tick}async requestUser(){if(this.isDisposed)return;const{baseUrl:e}=this.serverSettings,{makeRequest:t,ResponseError:i}=a.ServerConnection,r=n.URLExt.join(e,"api/me"),o=await t(r,{},this.serverSettings);if(200!==o.status)throw await i.create(o);const l={identity:this._identity,permissions:this._permissions},c=await o.json(),u=c.identity,{localStorage:p}=window,f=p.getItem(h);if(f&&(!u.initials||!u.color)){const e=JSON.parse(f);u.initials=u.initials||e.initials||u.name.substring(0,1),u.color=u.color||e.color||d.getRandomColor()}s.JSONExt.deepEqual(c,l)||(this._identity=u,this._permissions=c.permissions,p.setItem(h,JSON.stringify(u)),this._userChanged.emit(c))}}var d;t.UserManager=c,function(e){const t=["var(--jp-collaborator-color1)","var(--jp-collaborator-color2)","var(--jp-collaborator-color3)","var(--jp-collaborator-color4)","var(--jp-collaborator-color5)","var(--jp-collaborator-color6)","var(--jp-collaborator-color7)"];e.getRandomColor=()=>t[Math.floor(Math.random()*t.length)]}(d||(d={}))},3247:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.validateProperty=void 0,t.validateProperty=function(e,t,i,n=[]){if(!e.hasOwnProperty(t))throw Error(`Missing property '${t}'`);const s=e[t];if(void 0!==i){let e=!0;switch(i){case"array":e=Array.isArray(s);break;case"object":e=void 0!==s;break;default:e=typeof s===i}if(!e)throw new Error(`Property '${t}' is not of type '${i}'`);if(n.length>0){let e=!0;switch(i){case"string":case"number":case"boolean":e=n.includes(s);break;default:e=n.findIndex((e=>e===s))>=0}if(!e)throw new Error(`Property '${t}' is not one of the valid values ${JSON.stringify(n)}`)}}}},9090:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkspaceManager=void 0;const n=i(4251),s=i(5895),r=i(538);class o extends s.DataConnector{constructor(e={}){var t;super(),this.serverSettings=null!==(t=e.serverSettings)&&void 0!==t?t:r.ServerConnection.makeSettings()}async fetch(e){const{serverSettings:t}=this,{baseUrl:i,appUrl:n}=t,{makeRequest:s,ResponseError:o}=r.ServerConnection,l=i+n,h=a.url(l,e),c=await s(h,{},t);if(200!==c.status)throw await o.create(c);return c.json()}async list(){const{serverSettings:e}=this,{baseUrl:t,appUrl:i}=e,{makeRequest:n,ResponseError:s}=r.ServerConnection,o=t+i,l=a.url(o,""),h=await n(l,{},e);if(200!==h.status)throw await s.create(h);return(await h.json()).workspaces}async remove(e){const{serverSettings:t}=this,{baseUrl:i,appUrl:n}=t,{makeRequest:s,ResponseError:o}=r.ServerConnection,l=i+n,h=a.url(l,e),c=await s(h,{method:"DELETE"},t);if(204!==c.status)throw await o.create(c)}async save(e,t){const{serverSettings:i}=this,{baseUrl:n,appUrl:s}=i,{makeRequest:o,ResponseError:l}=r.ServerConnection,h=n+s,c=a.url(h,e),d={body:JSON.stringify(t),method:"PUT"},u=await o(c,d,i);if(204!==u.status)throw await l.create(u)}}var a;t.WorkspaceManager=o,function(e){e.url=function(e,t){return n.URLExt.join(e,"api/workspaces",t)}}(a||(a={}))},1150:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataConnector=void 0,t.DataConnector=class{async list(e){throw new Error("DataConnector#list method has not been implemented.")}async remove(e){throw new Error("DataConnector#remove method has not been implemented.")}async save(e,t){throw new Error("DataConnector#save method has not been implemented.")}}},5895:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),s(i(1150),t),s(i(4995),t),s(i(2763),t),s(i(4611),t),s(i(2594),t)},4995:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},2763:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RestorablePool=void 0;const n=i(3911),s=i(4050),r=i(6424);var o;t.RestorablePool=class{constructor(e){this._added=new r.Signal(this),this._current=null,this._currentChanged=new r.Signal(this),this._hasRestored=!1,this._isDisposed=!1,this._objects=new Set,this._restore=null,this._restored=new n.PromiseDelegate,this._updated=new r.Signal(this),this.namespace=e.namespace}get added(){return this._added}get current(){return this._current}set current(e){this._current!==e&&null!==e&&this._objects.has(e)&&(this._current=e,this._currentChanged.emit(this._current))}get currentChanged(){return this._currentChanged}get isDisposed(){return this._isDisposed}get restored(){return this._restored.promise}get size(){return this._objects.size}get updated(){return this._updated}async add(e){var t,i;if(e.isDisposed){const t="A disposed object cannot be added.";throw console.warn(t,e),new Error(t)}if(this._objects.has(e)){const t="This object already exists in the pool.";throw console.warn(t,e),new Error(t)}if(this._objects.add(e),e.disposed.connect(this._onInstanceDisposed,this),!o.injectedProperty.get(e)){if(this._restore){const{connector:n}=this._restore,s=this._restore.name(e);if(s){const r=`${this.namespace}:${s}`,a=null===(i=(t=this._restore).args)||void 0===i?void 0:i.call(t,e);o.nameProperty.set(e,r),await n.save(r,{data:a})}}this._added.emit(e)}}dispose(){this.isDisposed||(this._current=null,this._isDisposed=!0,this._objects.clear(),r.Signal.clearData(this))}find(e){const t=this._objects.values();for(const i of t)if(e(i))return i}forEach(e){this._objects.forEach(e)}filter(e){const t=[];return this.forEach((i=>{e(i)&&t.push(i)})),t}inject(e){return o.injectedProperty.set(e,!0),this.add(e)}has(e){return this._objects.has(e)}async restore(e){if(this._hasRestored)throw new Error("This pool has already been restored.");this._hasRestored=!0;const{command:t,connector:i,registry:n,when:s}=e,r=this.namespace,o=s?[i.list(r)].concat(s):[i.list(r)];this._restore=e;const[a]=await Promise.all(o),l=await Promise.all(a.ids.map((async(e,s)=>{const r=a.values[s],o=r&&r.data;return void 0===o?i.remove(e):n.execute(t,o).catch((()=>i.remove(e)))})));return this._restored.resolve(),l}async save(e){var t,i;const n=o.injectedProperty.get(e);if(!this._restore||!this.has(e)||n)return;const{connector:s}=this._restore,r=this._restore.name(e),a=o.nameProperty.get(e),l=r?`${this.namespace}:${r}`:"";if(a&&a!==l&&await s.remove(a),o.nameProperty.set(e,l),l){const n=null===(i=(t=this._restore).args)||void 0===i?void 0:i.call(t,e);await s.save(l,{data:n})}a!==l&&this._updated.emit(e)}_onInstanceDisposed(e){if(this._objects.delete(e),e===this._current&&(this._current=null,this._currentChanged.emit(this._current)),o.injectedProperty.get(e))return;if(!this._restore)return;const{connector:t}=this._restore,i=o.nameProperty.get(e);i&&t.remove(i)}},function(e){e.injectedProperty=new s.AttachedProperty({name:"injected",create:()=>!1}),e.nameProperty=new s.AttachedProperty({name:"name",create:()=>""})}(o||(o={}))},4611:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StateDB=void 0;const n=i(6424);class s{constructor(e={}){this._changed=new n.Signal(this);const{connector:t,transform:i}=e;this._connector=t||new s.Connector,this._ready=i?i.then((e=>{const{contents:t,type:i}=e;switch(i){case"cancel":default:return;case"clear":return this._clear();case"merge":return this._merge(t||{});case"overwrite":return this._overwrite(t||{})}})):Promise.resolve(void 0)}get changed(){return this._changed}async clear(){await this._ready,await this._clear()}async fetch(e){return await this._ready,this._fetch(e)}async list(e){return await this._ready,this._list(e)}async remove(e){await this._ready,await this._remove(e),this._changed.emit({id:e,type:"remove"})}async save(e,t){await this._ready,await this._save(e,t),this._changed.emit({id:e,type:"save"})}async toJSON(){await this._ready;const{ids:e,values:t}=await this._list();return t.reduce(((t,i,n)=>(t[e[n]]=i,t)),{})}async _clear(){await Promise.all((await this._list()).ids.map((e=>this._remove(e))))}async _fetch(e){const t=await this._connector.fetch(e);if(t)return JSON.parse(t).v}async _list(e=""){const{ids:t,values:i}=await this._connector.list(e);return{ids:t,values:i.map((e=>JSON.parse(e).v))}}async _merge(e){await Promise.all(Object.keys(e).map((t=>e[t]&&this._save(t,e[t]))))}async _overwrite(e){await this._clear(),await this._merge(e)}async _remove(e){return this._connector.remove(e)}async _save(e,t){return this._connector.save(e,JSON.stringify({v:t}))}}t.StateDB=s,function(e){e.Connector=class{constructor(){this._storage={}}async fetch(e){return this._storage[e]}async list(e=""){return Object.keys(this._storage).reduce(((t,i)=>(""!==e&&e!==i.split(":")[0]||(t.ids.push(i),t.values.push(this._storage[i])),t)),{ids:[],values:[]})}async remove(e){delete this._storage[e]}async save(e,t){this._storage[e]=t}}}(s=t.StateDB||(t.StateDB={}))},2594:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IStateDB=void 0;const n=i(3911);t.IStateDB=new n.Token("@jupyterlab/coreutils:IStateDB",'A service for the JupyterLab state database.\n Use this if you want to store data that will persist across page loads.\n See "state database" for more information.')},7564:(e,t,i)=>{"use strict";var n,s,r;function*o(){}function a(e,t){let i=0;for(const n of e)if(t(n,i++))return n}function l(e,t){let i;for(const n of e)void 0!==i?t(n,i)>0&&(i=n):i=n;return i}function h(e,t){let i=0;for(const n of e)if(!1===t(n,i++))return!1;return!0}function c(e,t){let i=0;for(const n of e)if(t(n,i++))return!0;return!1}function*d(e,t){let i=0;for(const n of e)yield t(n,i++)}function*u(e){if("function"==typeof e.retro)yield*e.retro();else for(let t=e.length-1;t>-1;t--)yield e[t]}i.d(t,{Fp:()=>l,G:()=>c,RO:()=>n,UI:()=>d,cS:()=>o,kf:()=>r,kh:()=>u,sE:()=>a,yW:()=>h}),function(e){function t(e,t,i=0,n=-1){let s,r=e.length;if(0===r)return-1;i=i<0?Math.max(0,i+r):Math.min(i,r-1),s=(n=n<0?Math.max(0,n+r):Math.min(n,r-1))=i)return;let n=e[t];for(let n=t+1;n0;){let n=a>>1,s=o+n;i(e[s],t)<0?(o=s+1,a-=n+1):a=n}return o},e.upperBound=function(e,t,i,n=0,s=-1){let r=e.length;if(0===r)return 0;let o=n=n<0?Math.max(0,n+r):Math.min(n,r-1),a=(s=s<0?Math.max(0,s+r):Math.min(s,r-1))-n+1;for(;a>0;){let n=a>>1,s=o+n;i(e[s],t)>0?a=n:(o=s+1,a-=n+1)}return o},e.shallowEqual=function(e,t,i){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0,s=e.length;n=o&&(i=s<0?o-1:o),void 0===n?n=s<0?-1:o:n<0?n=Math.max(n+o,s<0?-1:0):n>=o&&(n=s<0?o-1:o),r=s<0&&n>=i||s>0&&i>=n?0:s<0?Math.floor((n-i+1)/s+1):Math.floor((n-i-1)/s+1);let a=[];for(let t=0;t=(n=n<0?Math.max(0,n+s):Math.min(n,s-1)))return;let o=n-i+1;if(t>0?t%=o:t<0&&(t=(t%o+o)%o),0===t)return;let a=i+t;r(e,i,a-1),r(e,a,n),r(e,i,n)},e.fill=function(e,t,i=0,n=-1){let s,r=e.length;if(0!==r){i=i<0?Math.max(0,i+r):Math.min(i,r-1),s=(n=n<0?Math.max(0,n+r):Math.min(n,r-1))t;--i)e[i]=e[i-1];e[t]=i},e.removeAt=o,e.removeFirstOf=function(e,i,n=0,s=-1){let r=t(e,i,n,s);return-1!==r&&o(e,r),r},e.removeLastOf=function(e,t,n=-1,s=0){let r=i(e,t,n,s);return-1!==r&&o(e,r),r},e.removeAllOf=function(e,t,i=0,n=-1){let s=e.length;if(0===s)return 0;i=i<0?Math.max(0,i+s):Math.min(i,s-1),n=n<0?Math.max(0,n+s):Math.min(n,s-1);let r=0;for(let o=0;o=i&&o<=n&&e[o]===t||n=i)&&e[o]===t?r++:r>0&&(e[o-r]=e[o]);return r>0&&(e.length=s-r),r},e.removeFirstWhere=function(e,t,i=0,s=-1){let r,a=n(e,t,i,s);return-1!==a&&(r=o(e,a)),{index:a,value:r}},e.removeLastWhere=function(e,t,i=-1,n=0){let r,a=s(e,t,i,n);return-1!==a&&(r=o(e,a)),{index:a,value:r}},e.removeAllWhere=function(e,t,i=0,n=-1){let s=e.length;if(0===s)return 0;i=i<0?Math.max(0,i+s):Math.min(i,s-1),n=n<0?Math.max(0,n+s):Math.min(n,s-1);let r=0;for(let o=0;o=i&&o<=n&&t(e[o],o)||n=i)&&t(e[o],o)?r++:r>0&&(e[o-r]=e[o]);return r>0&&(e.length=s-r),r}}(n||(n={})),function(e){e.rangeLength=function(e,t,i){return 0===i?1/0:e>t&&i>0||et?1:0}}(r||(r={}))},3911:function(e,t){!function(e){"use strict";e.JSONExt=void 0,function(e){function t(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e}function i(e){return Array.isArray(e)}function n(e,s){if(e===s)return!0;if(t(e)||t(s))return!1;let r=i(e),o=i(s);return r===o&&(r&&o?function(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let i=0,s=e.length;i>>0),e[i]=255&t,t>>>=8}e.Random=void 0,(e.Random||(e.Random={})).getRandomValues=(()=>{const e="undefined"!=typeof window&&(window.crypto||window.msCrypto)||null;return e&&"function"==typeof e.getRandomValues?function(t){return e.getRandomValues(t)}:t})(),e.UUID=void 0,(e.UUID||(e.UUID={})).uuid4=function(e){const t=new Uint8Array(16),i=new Array(256);for(let e=0;e<16;++e)i[e]="0"+e.toString(16);for(let e=16;e<256;++e)i[e]=e.toString(16);return function(){return e(t),t[6]=64|15&t[6],t[8]=128|63&t[8],i[t[0]]+i[t[1]]+i[t[2]]+i[t[3]]+"-"+i[t[4]]+i[t[5]]+"-"+i[t[6]]+i[t[7]]+"-"+i[t[8]]+i[t[9]]+"-"+i[t[10]]+i[t[11]]+i[t[12]]+i[t[13]]+i[t[14]]+i[t[15]]}}(e.Random.getRandomValues),e.MimeData=class{constructor(){this._types=[],this._values=[]}types(){return this._types.slice()}hasData(e){return-1!==this._types.indexOf(e)}getData(e){let t=this._types.indexOf(e);return-1!==t?this._values[t]:void 0}setData(e,t){this.clearData(e),this._types.push(e),this._values.push(t)}clearData(e){let t=this._types.indexOf(e);-1!==t&&(this._types.splice(t,1),this._values.splice(t,1))}clear(){this._types.length=0,this._values.length=0}},e.PromiseDelegate=class{constructor(){this.promise=new Promise(((e,t)=>{this._resolve=e,this._reject=t}))}resolve(e){(0,this._resolve)(e)}reject(e){(0,this._reject)(e)}},e.Token=class{constructor(e,t){this.name=e,this.description=null!=t?t:"",this._tokenStructuralPropertyT=null}}}(t)},1122:(e,t,i)=>{"use strict";i.r(t),i.d(t,{DisposableDelegate:()=>s,DisposableSet:()=>o,ObservableDisposableDelegate:()=>r,ObservableDisposableSet:()=>a});var n=i(6424);class s{constructor(e){this._fn=e}get isDisposed(){return!this._fn}dispose(){if(!this._fn)return;let e=this._fn;this._fn=null,e()}}class r extends s{constructor(){super(...arguments),this._disposed=new n.Signal(this)}get disposed(){return this._disposed}dispose(){this.isDisposed||(super.dispose(),this._disposed.emit(void 0),n.Signal.clearData(this))}}class o{constructor(){this._isDisposed=!1,this._items=new Set}get isDisposed(){return this._isDisposed}dispose(){this._isDisposed||(this._isDisposed=!0,this._items.forEach((e=>{e.dispose()})),this._items.clear())}contains(e){return this._items.has(e)}add(e){this._items.add(e)}remove(e){this._items.delete(e)}clear(){this._items.clear()}}!function(e){e.from=function(t){let i=new e;for(const e of t)i.add(e);return i}}(o||(o={}));class a extends o{constructor(){super(...arguments),this._disposed=new n.Signal(this)}get disposed(){return this._disposed}dispose(){this.isDisposed||(super.dispose(),this._disposed.emit(void 0),n.Signal.clearData(this))}}!function(e){e.from=function(t){let i=new e;for(const e of t)i.add(e);return i}}(a||(a={}))},9044:(e,t,i)=>{"use strict";i.r(t),i.d(t,{Debouncer:()=>l,Poll:()=>o,RateLimiter:()=>a,Throttler:()=>h});var n,s=i(3911),r=i(6424);class o{constructor(e){var t;this._disposed=new r.Signal(this),this._lingered=0,this._tick=new s.PromiseDelegate,this._ticked=new r.Signal(this),this._factory=e.factory,this._linger=null!==(t=e.linger)&&void 0!==t?t:n.DEFAULT_LINGER,this._standby=e.standby||n.DEFAULT_STANDBY,this._state={...n.DEFAULT_STATE,timestamp:(new Date).getTime()};const i=e.frequency||{},o=Math.max(i.interval||0,i.max||0,n.DEFAULT_FREQUENCY.max);this.frequency={...n.DEFAULT_FREQUENCY,...i,max:o},this.name=e.name||n.DEFAULT_NAME,"auto"in e&&!e.auto||setTimeout((()=>this.start()))}get disposed(){return this._disposed}get frequency(){return this._frequency}set frequency(e){if(this.isDisposed||s.JSONExt.deepEqual(e,this.frequency||{}))return;let{backoff:t,interval:i,max:n}=e;if(i=Math.round(i),n=Math.round(n),"number"==typeof t&&t<1)throw new Error("Poll backoff growth factor must be at least 1");if((i<0||i>n)&&i!==o.NEVER)throw new Error("Poll interval must be between 0 and max");if(n>o.MAX_INTERVAL&&n!==o.NEVER)throw new Error(`Max interval must be less than ${o.MAX_INTERVAL}`);this._frequency={backoff:t,interval:i,max:n}}get isDisposed(){return"disposed"===this.state.phase}get standby(){return this._standby}set standby(e){this.isDisposed||this.standby===e||(this._standby=e)}get state(){return this._state}get tick(){return this._tick.promise}get ticked(){return this._ticked}async*[Symbol.asyncIterator](){for(;!this.isDisposed;)yield this.state,await this.tick.catch((()=>{}))}dispose(){this.isDisposed||(this._state={...n.DISPOSED_STATE,timestamp:(new Date).getTime()},this._tick.promise.catch((e=>{})),this._tick.reject(new Error(`Poll (${this.name}) is disposed.`)),this._disposed.emit(void 0),r.Signal.clearData(this))}refresh(){return this.schedule({cancel:({phase:e})=>"refreshed"===e,interval:o.IMMEDIATE,phase:"refreshed"})}async schedule(e={}){if(this.isDisposed)return;if(e.cancel&&e.cancel(this.state))return;const t=this._tick,i=new s.PromiseDelegate,n={interval:this.frequency.interval,payload:null,phase:"standby",timestamp:(new Date).getTime(),...e};this._state=n,this._tick=i,clearTimeout(this._timeout),this._ticked.emit(this.state),t.resolve(this),await t.promise,n.interval!==o.NEVER?this._timeout=setTimeout((()=>{this.isDisposed||this.tick!==i.promise||this._execute()}),n.interval):this._timeout=void 0}start(){return this.schedule({cancel:({phase:e})=>"constructed"!==e&&"standby"!==e&&"stopped"!==e,interval:o.IMMEDIATE,phase:"started"})}stop(){return this.schedule({cancel:({phase:e})=>"stopped"===e,interval:o.NEVER,phase:"stopped"})}get hidden(){return n.hidden}_execute(){let e="function"==typeof this.standby?this.standby():this.standby;if("never"===e?e=!1:"when-hidden"===e&&(this.hidden?e=++this._lingered>this._linger:(this._lingered=0,e=!1)),e)return void this.schedule();const t=this.tick;this._factory(this.state).then((e=>{this.isDisposed||this.tick!==t||this.schedule({payload:e,phase:"rejected"===this.state.phase?"reconnected":"resolved"})})).catch((e=>{this.isDisposed||this.tick!==t||this.schedule({interval:n.sleep(this.frequency,this.state),payload:e,phase:"rejected"})}))}}!function(e){e.IMMEDIATE=0,e.MAX_INTERVAL=2147483647,e.NEVER=1/0}(o||(o={})),function(e){e.DEFAULT_BACKOFF=3,e.DEFAULT_FREQUENCY={backoff:!0,interval:1e3,max:3e4},e.DEFAULT_LINGER=1,e.DEFAULT_NAME="unknown",e.DEFAULT_STANDBY="when-hidden",e.DEFAULT_STATE={interval:o.NEVER,payload:null,phase:"constructed",timestamp:new Date(0).getTime()},e.DISPOSED_STATE={interval:o.NEVER,payload:null,phase:"disposed",timestamp:new Date(0).getTime()},e.sleep=function(t,i){const{backoff:n,interval:s,max:r}=t;if(s===o.NEVER)return s;const a=!0===n?e.DEFAULT_BACKOFF:!1===n?1:n,l=function(e,t){return e=Math.ceil(e),t=Math.floor(t),Math.floor(Math.random()*(t-e+1))+e}(s,i.interval*a);return Math.min(r,l)},e.hidden="undefined"!=typeof document&&(document.addEventListener("visibilitychange",(()=>{e.hidden="hidden"===document.visibilityState})),document.addEventListener("pagehide",(()=>{e.hidden="hidden"===document.visibilityState})),"hidden"===document.visibilityState)}(n||(n={}));class a{constructor(e,t=500){this.args=void 0,this.payload=null,this.limit=t,this.poll=new o({auto:!1,factory:async()=>{const{args:t}=this;return this.args=void 0,e(...t)},frequency:{backoff:!1,interval:o.NEVER,max:o.NEVER},standby:"never"}),this.payload=new s.PromiseDelegate,this.poll.ticked.connect(((e,t)=>{const{payload:i}=this;return"resolved"===t.phase?(this.payload=new s.PromiseDelegate,void i.resolve(t.payload)):"rejected"===t.phase||"stopped"===t.phase?(this.payload=new s.PromiseDelegate,i.promise.catch((e=>{})),void i.reject(t.payload)):void 0}),this)}get isDisposed(){return null===this.payload}dispose(){this.isDisposed||(this.args=void 0,this.payload=null,this.poll.dispose())}async stop(){return this.poll.stop()}}class l extends a{invoke(...e){return this.args=e,this.poll.schedule({interval:this.limit,phase:"invoked"}),this.payload.promise}}class h extends a{constructor(e,t){super(e,"number"==typeof t?t:t&&t.limit),this._trailing=!1,"number"!=typeof t&&t&&"trailing"===t.edge&&(this._trailing=!0),this._interval=this._trailing?this.limit:o.IMMEDIATE}invoke(...e){const t="invoked"!==this.poll.state.phase;return(t||this._trailing)&&(this.args=e),t&&this.poll.schedule({interval:this._interval,phase:"invoked"}),this.payload.promise}}},4050:(e,t,i)=>{"use strict";i.r(t),i.d(t,{AttachedProperty:()=>n});class n{constructor(e){this._pid=s.nextPID(),this.name=e.name,this._create=e.create,this._coerce=e.coerce||null,this._compare=e.compare||null,this._changed=e.changed||null}get(e){let t,i=s.ensureMap(e);return t=this._pid in i?i[this._pid]:i[this._pid]=this._createValue(e),t}set(e,t){let i,n=s.ensureMap(e);i=this._pid in n?n[this._pid]:n[this._pid]=this._createValue(e);let r=this._coerceValue(e,t);this._maybeNotify(e,i,n[this._pid]=r)}coerce(e){let t,i=s.ensureMap(e);t=this._pid in i?i[this._pid]:i[this._pid]=this._createValue(e);let n=this._coerceValue(e,t);this._maybeNotify(e,t,i[this._pid]=n)}_createValue(e){return(0,this._create)(e)}_coerceValue(e,t){let i=this._coerce;return i?i(e,t):t}_compareValue(e,t){let i=this._compare;return i?i(e,t):e===t}_maybeNotify(e,t,i){let n=this._changed;n&&!this._compareValue(t,i)&&n(e,t,i)}}var s;!function(e){e.clearData=function(e){s.ownerData.delete(e)}}(n||(n={})),function(e){e.ownerData=new WeakMap,e.nextPID=(()=>{let e=0;return()=>`pid-${`${Math.random()}`.slice(2)}-${e++}`})(),e.ensureMap=function(t){let i=e.ownerData.get(t);return i||(i=Object.create(null),e.ownerData.set(t,i),i)}}(s||(s={}))},6424:(e,t,i)=>{"use strict";i.r(t),i.d(t,{Signal:()=>o,Stream:()=>a});var n,s=i(7564),r=i(3911);class o{constructor(e){this.sender=e}connect(e,t){return n.connect(this,e,t)}disconnect(e,t){return n.disconnect(this,e,t)}emit(e){n.emit(this,e)}}!function(e){e.disconnectBetween=function(e,t){n.disconnectBetween(e,t)},e.disconnectSender=function(e){n.disconnectSender(e)},e.disconnectReceiver=function(e){n.disconnectReceiver(e)},e.disconnectAll=function(e){n.disconnectAll(e)},e.clearData=function(e){n.disconnectAll(e)},e.getExceptionHandler=function(){return n.exceptionHandler},e.setExceptionHandler=function(e){let t=n.exceptionHandler;return n.exceptionHandler=e,t}}(o||(o={}));class a extends o{constructor(){super(...arguments),this._pending=new r.PromiseDelegate}async*[Symbol.asyncIterator](){let e=this._pending;for(;;)try{const{args:t,next:i}=await e.promise;e=i,yield t}catch(e){return}}emit(e){const t=this._pending,i=this._pending=new r.PromiseDelegate;t.resolve({args:e,next:i}),super.emit(e)}stop(){this._pending.promise.catch((()=>{})),this._pending.reject("stop"),this._pending=new r.PromiseDelegate}}!function(e){function t(e){let t=n.get(e);if(t&&0!==t.length){for(const e of t){if(!e.signal)continue;let t=e.thisArg||e.slot;e.signal=null,c(r.get(t))}c(t)}}function i(e){let t=r.get(e);if(t&&0!==t.length){for(const e of t){if(!e.signal)continue;let t=e.signal.sender;e.signal=null,c(n.get(t))}c(t)}}e.exceptionHandler=e=>{console.error(e)},e.connect=function(e,t,i){i=i||void 0;let s=n.get(e.sender);if(s||(s=[],n.set(e.sender,s)),l(s,e,t,i))return!1;let o=i||t,a=r.get(o);a||(a=[],r.set(o,a));let h={signal:e,slot:t,thisArg:i};return s.push(h),a.push(h),!0},e.disconnect=function(e,t,i){i=i||void 0;let s=n.get(e.sender);if(!s||0===s.length)return!1;let o=l(s,e,t,i);if(!o)return!1;let a=i||t,h=r.get(a);return o.signal=null,c(s),c(h),!0},e.disconnectBetween=function(e,t){let i=n.get(e);if(!i||0===i.length)return;let s=r.get(t);if(s&&0!==s.length){for(const t of s)t.signal&&t.signal.sender===e&&(t.signal=null);c(i),c(s)}},e.disconnectSender=t,e.disconnectReceiver=i,e.disconnectAll=function(e){t(e),i(e)},e.emit=function(e,t){let i=n.get(e.sender);if(i&&0!==i.length)for(let n=0,s=i.length;ne.signal===t&&e.slot===i&&e.thisArg===n))}function h(t,i){let{signal:n,slot:s,thisArg:r}=t;try{s.call(r,n.sender,i)}catch(t){e.exceptionHandler(t)}}function c(e){0===o.size&&a(d),o.add(e)}function d(){o.forEach(u),o.clear()}function u(e){s.RO.removeAllWhere(e,p)}function p(e){return null===e.signal}}(n||(n={}))},2454:e=>{"use strict";var t=function(e){return function(e){return!!e&&"object"==typeof e}(e)&&!function(e){var t=Object.prototype.toString.call(e);return"[object RegExp]"===t||"[object Date]"===t||function(e){return e.$$typeof===i}(e)}(e)},i="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function n(e,t){return!1!==t.clone&&t.isMergeableObject(e)?a((i=e,Array.isArray(i)?[]:{}),e,t):e;var i}function s(e,t,i){return e.concat(t).map((function(e){return n(e,i)}))}function r(e){return Object.keys(e).concat(function(e){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(e).filter((function(t){return Object.propertyIsEnumerable.call(e,t)})):[]}(e))}function o(e,t){try{return t in e}catch(e){return!1}}function a(e,i,l){(l=l||{}).arrayMerge=l.arrayMerge||s,l.isMergeableObject=l.isMergeableObject||t,l.cloneUnlessOtherwiseSpecified=n;var h=Array.isArray(i);return h===Array.isArray(e)?h?l.arrayMerge(e,i,l):function(e,t,i){var s={};return i.isMergeableObject(e)&&r(e).forEach((function(t){s[t]=n(e[t],i)})),r(t).forEach((function(r){(function(e,t){return o(e,t)&&!(Object.hasOwnProperty.call(e,t)&&Object.propertyIsEnumerable.call(e,t))})(e,r)||(o(e,r)&&i.isMergeableObject(t[r])?s[r]=function(e,t){if(!t.customMerge)return a;var i=t.customMerge(e);return"function"==typeof i?i:a}(r,i)(e[r],t[r],i):s[r]=n(t[r],i))})),s}(e,i,l):n(i,l)}a.all=function(e,t){if(!Array.isArray(e))throw new Error("first argument should be an array");return e.reduce((function(e,i){return a(e,i,t)}),{})};var l=a;e.exports=l},8002:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.attributeNames=t.elementNames=void 0,t.elementNames=new Map([["altglyph","altGlyph"],["altglyphdef","altGlyphDef"],["altglyphitem","altGlyphItem"],["animatecolor","animateColor"],["animatemotion","animateMotion"],["animatetransform","animateTransform"],["clippath","clipPath"],["feblend","feBlend"],["fecolormatrix","feColorMatrix"],["fecomponenttransfer","feComponentTransfer"],["fecomposite","feComposite"],["feconvolvematrix","feConvolveMatrix"],["fediffuselighting","feDiffuseLighting"],["fedisplacementmap","feDisplacementMap"],["fedistantlight","feDistantLight"],["fedropshadow","feDropShadow"],["feflood","feFlood"],["fefunca","feFuncA"],["fefuncb","feFuncB"],["fefuncg","feFuncG"],["fefuncr","feFuncR"],["fegaussianblur","feGaussianBlur"],["feimage","feImage"],["femerge","feMerge"],["femergenode","feMergeNode"],["femorphology","feMorphology"],["feoffset","feOffset"],["fepointlight","fePointLight"],["fespecularlighting","feSpecularLighting"],["fespotlight","feSpotLight"],["fetile","feTile"],["feturbulence","feTurbulence"],["foreignobject","foreignObject"],["glyphref","glyphRef"],["lineargradient","linearGradient"],["radialgradient","radialGradient"],["textpath","textPath"]]),t.attributeNames=new Map([["definitionurl","definitionURL"],["attributename","attributeName"],["attributetype","attributeType"],["basefrequency","baseFrequency"],["baseprofile","baseProfile"],["calcmode","calcMode"],["clippathunits","clipPathUnits"],["diffuseconstant","diffuseConstant"],["edgemode","edgeMode"],["filterunits","filterUnits"],["glyphref","glyphRef"],["gradienttransform","gradientTransform"],["gradientunits","gradientUnits"],["kernelmatrix","kernelMatrix"],["kernelunitlength","kernelUnitLength"],["keypoints","keyPoints"],["keysplines","keySplines"],["keytimes","keyTimes"],["lengthadjust","lengthAdjust"],["limitingconeangle","limitingConeAngle"],["markerheight","markerHeight"],["markerunits","markerUnits"],["markerwidth","markerWidth"],["maskcontentunits","maskContentUnits"],["maskunits","maskUnits"],["numoctaves","numOctaves"],["pathlength","pathLength"],["patterncontentunits","patternContentUnits"],["patterntransform","patternTransform"],["patternunits","patternUnits"],["pointsatx","pointsAtX"],["pointsaty","pointsAtY"],["pointsatz","pointsAtZ"],["preservealpha","preserveAlpha"],["preserveaspectratio","preserveAspectRatio"],["primitiveunits","primitiveUnits"],["refx","refX"],["refy","refY"],["repeatcount","repeatCount"],["repeatdur","repeatDur"],["requiredextensions","requiredExtensions"],["requiredfeatures","requiredFeatures"],["specularconstant","specularConstant"],["specularexponent","specularExponent"],["spreadmethod","spreadMethod"],["startoffset","startOffset"],["stddeviation","stdDeviation"],["stitchtiles","stitchTiles"],["surfacescale","surfaceScale"],["systemlanguage","systemLanguage"],["tablevalues","tableValues"],["targetx","targetX"],["targety","targetY"],["textlength","textLength"],["viewbox","viewBox"],["viewtarget","viewTarget"],["xchannelselector","xChannelSelector"],["ychannelselector","yChannelSelector"],["zoomandpan","zoomAndPan"]])},2721:function(e,t,i){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,i=1,n=arguments.length;i";case a.Comment:return"\x3c!--"+e.data+"--\x3e";case a.CDATA:return function(e){return""}(e);case a.Script:case a.Style:case a.Tag:return function(e,t){var i;"foreign"===t.xmlMode&&(e.name=null!==(i=h.elementNames.get(e.name))&&void 0!==i?i:e.name,e.parent&&f.has(e.parent.name)&&(t=n(n({},t),{xmlMode:!1}))),!t.xmlMode&&m.has(e.name)&&(t=n(n({},t),{xmlMode:"foreign"}));var s="<"+e.name,r=function(e,t){if(e)return Object.keys(e).map((function(i){var n,s,r=null!==(n=e[i])&&void 0!==n?n:"";return"foreign"===t.xmlMode&&(i=null!==(s=h.attributeNames.get(i))&&void 0!==s?s:i),t.emptyAttrs||t.xmlMode||""!==r?i+'="'+(!1!==t.decodeEntities?l.encodeXML(r):r.replace(/"/g,"""))+'"':i})).join(" ")}(e.attribs,t);return r&&(s+=" "+r),0===e.children.length&&(t.xmlMode?!1!==t.selfClosingTags:t.selfClosingTags&&d.has(e.name))?(t.xmlMode||(s+=" "),s+="/>"):(s+=">",e.children.length>0&&(s+=u(e.children,t)),!t.xmlMode&&d.has(e.name)||(s+="")),s}(e,t);case a.Text:return function(e,t){var i=e.data||"";return!1===t.decodeEntities||!t.xmlMode&&e.parent&&c.has(e.parent.name)||(i=l.encodeXML(i)),i}(e,t)}}t.default=u;var f=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignObject","desc","title"]),m=new Set(["svg","math"])},3706:(e,t)=>{"use strict";var i;Object.defineProperty(t,"__esModule",{value:!0}),t.Doctype=t.CDATA=t.Tag=t.Style=t.Script=t.Comment=t.Directive=t.Text=t.Root=t.isTag=t.ElementType=void 0,function(e){e.Root="root",e.Text="text",e.Directive="directive",e.Comment="comment",e.Script="script",e.Style="style",e.Tag="tag",e.CDATA="cdata",e.Doctype="doctype"}(i=t.ElementType||(t.ElementType={})),t.isTag=function(e){return e.type===i.Tag||e.type===i.Script||e.type===i.Style},t.Root=i.Root,t.Text=i.Text,t.Directive=i.Directive,t.Comment=i.Comment,t.Script=i.Script,t.Style=i.Style,t.Tag=i.Tag,t.CDATA=i.CDATA,t.Doctype=i.Doctype},9425:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i);var s=Object.getOwnPropertyDescriptor(t,i);s&&!("get"in s?!t.__esModule:s.writable||s.configurable)||(s={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,n,s)}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),t.DomHandler=void 0;var r=i(3706),o=i(4862);s(i(4862),t);var a=/\s+/g,l={normalizeWhitespace:!1,withStartIndices:!1,withEndIndices:!1,xmlMode:!1},h=function(){function e(e,t,i){this.dom=[],this.root=new o.Document(this.dom),this.done=!1,this.tagStack=[this.root],this.lastNode=null,this.parser=null,"function"==typeof t&&(i=t,t=l),"object"==typeof e&&(t=e,e=void 0),this.callback=null!=e?e:null,this.options=null!=t?t:l,this.elementCB=null!=i?i:null}return e.prototype.onparserinit=function(e){this.parser=e},e.prototype.onreset=function(){this.dom=[],this.root=new o.Document(this.dom),this.done=!1,this.tagStack=[this.root],this.lastNode=null,this.parser=null},e.prototype.onend=function(){this.done||(this.done=!0,this.parser=null,this.handleCallback(null))},e.prototype.onerror=function(e){this.handleCallback(e)},e.prototype.onclosetag=function(){this.lastNode=null;var e=this.tagStack.pop();this.options.withEndIndices&&(e.endIndex=this.parser.endIndex),this.elementCB&&this.elementCB(e)},e.prototype.onopentag=function(e,t){var i=this.options.xmlMode?r.ElementType.Tag:void 0,n=new o.Element(e,t,void 0,i);this.addNode(n),this.tagStack.push(n)},e.prototype.ontext=function(e){var t=this.options.normalizeWhitespace,i=this.lastNode;if(i&&i.type===r.ElementType.Text)t?i.data=(i.data+e).replace(a," "):i.data+=e,this.options.withEndIndices&&(i.endIndex=this.parser.endIndex);else{t&&(e=e.replace(a," "));var n=new o.Text(e);this.addNode(n),this.lastNode=n}},e.prototype.oncomment=function(e){if(this.lastNode&&this.lastNode.type===r.ElementType.Comment)this.lastNode.data+=e;else{var t=new o.Comment(e);this.addNode(t),this.lastNode=t}},e.prototype.oncommentend=function(){this.lastNode=null},e.prototype.oncdatastart=function(){var e=new o.Text(""),t=new o.NodeWithChildren(r.ElementType.CDATA,[e]);this.addNode(t),e.parent=t,this.lastNode=e},e.prototype.oncdataend=function(){this.lastNode=null},e.prototype.onprocessinginstruction=function(e,t){var i=new o.ProcessingInstruction(e,t);this.addNode(i)},e.prototype.handleCallback=function(e){if("function"==typeof this.callback)this.callback(e,this.dom);else if(e)throw e},e.prototype.addNode=function(e){var t=this.tagStack[this.tagStack.length-1],i=t.children[t.children.length-1];this.options.withStartIndices&&(e.startIndex=this.parser.startIndex),this.options.withEndIndices&&(e.endIndex=this.parser.endIndex),t.children.push(e),i&&(e.prev=i,i.next=e),e.parent=t,this.lastNode=null},e}();t.DomHandler=h,t.default=h},4862:function(e,t,i){"use strict";var n,s=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},n(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),r=this&&this.__assign||function(){return r=Object.assign||function(e){for(var t,i=1,n=arguments.length;i0?this.children[this.children.length-1]:null},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"childNodes",{get:function(){return this.children},set:function(e){this.children=e},enumerable:!1,configurable:!0}),t}(l);t.NodeWithChildren=p;var f=function(e){function t(t){return e.call(this,o.ElementType.Root,t)||this}return s(t,e),t}(p);t.Document=f;var m=function(e){function t(t,i,n,s){void 0===n&&(n=[]),void 0===s&&(s="script"===t?o.ElementType.Script:"style"===t?o.ElementType.Style:o.ElementType.Tag);var r=e.call(this,s,n)||this;return r.name=t,r.attribs=i,r}return s(t,e),Object.defineProperty(t.prototype,"tagName",{get:function(){return this.name},set:function(e){this.name=e},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"attributes",{get:function(){var e=this;return Object.keys(this.attribs).map((function(t){var i,n;return{name:t,value:e.attribs[t],namespace:null===(i=e["x-attribsNamespace"])||void 0===i?void 0:i[t],prefix:null===(n=e["x-attribsPrefix"])||void 0===n?void 0:n[t]}}))},enumerable:!1,configurable:!0}),t}(p);function g(e){return(0,o.isTag)(e)}function v(e){return e.type===o.ElementType.CDATA}function O(e){return e.type===o.ElementType.Text}function b(e){return e.type===o.ElementType.Comment}function _(e){return e.type===o.ElementType.Directive}function y(e){return e.type===o.ElementType.Root}function w(e,t){var i;if(void 0===t&&(t=!1),O(e))i=new c(e.data);else if(b(e))i=new d(e.data);else if(g(e)){var n=t?x(e.children):[],s=new m(e.name,r({},e.attribs),n);n.forEach((function(e){return e.parent=s})),null!=e.namespace&&(s.namespace=e.namespace),e["x-attribsNamespace"]&&(s["x-attribsNamespace"]=r({},e["x-attribsNamespace"])),e["x-attribsPrefix"]&&(s["x-attribsPrefix"]=r({},e["x-attribsPrefix"])),i=s}else if(v(e)){n=t?x(e.children):[];var a=new p(o.ElementType.CDATA,n);n.forEach((function(e){return e.parent=a})),i=a}else if(y(e)){n=t?x(e.children):[];var l=new f(n);n.forEach((function(e){return e.parent=l})),e["x-mode"]&&(l["x-mode"]=e["x-mode"]),i=l}else{if(!_(e))throw new Error("Not implemented yet: ".concat(e.type));var h=new u(e.name,e.data);null!=e["x-name"]&&(h["x-name"]=e["x-name"],h["x-publicId"]=e["x-publicId"],h["x-systemId"]=e["x-systemId"]),i=h}return i.startIndex=e.startIndex,i.endIndex=e.endIndex,null!=e.sourceCodeLocation&&(i.sourceCodeLocation=e.sourceCodeLocation),i}function x(e){for(var t=e.map((function(e){return w(e,!0)})),i=1;i{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getFeed=void 0;var n=i(3017),s=i(9319);t.getFeed=function(e){var t=l(d,e);return t?"feed"===t.name?function(e){var t,i=e.children,n={type:"atom",items:(0,s.getElementsByTagName)("entry",i).map((function(e){var t,i=e.children,n={media:a(i)};c(n,"id","id",i),c(n,"title","title",i);var s=null===(t=l("link",i))||void 0===t?void 0:t.attribs.href;s&&(n.link=s);var r=h("summary",i)||h("content",i);r&&(n.description=r);var o=h("updated",i);return o&&(n.pubDate=new Date(o)),n}))};c(n,"id","id",i),c(n,"title","title",i);var r=null===(t=l("link",i))||void 0===t?void 0:t.attribs.href;r&&(n.link=r),c(n,"description","subtitle",i);var o=h("updated",i);return o&&(n.updated=new Date(o)),c(n,"author","email",i,!0),n}(t):function(e){var t,i,n=null!==(i=null===(t=l("channel",e.children))||void 0===t?void 0:t.children)&&void 0!==i?i:[],r={type:e.name.substr(0,3),id:"",items:(0,s.getElementsByTagName)("item",e.children).map((function(e){var t=e.children,i={media:a(t)};c(i,"id","guid",t),c(i,"title","title",t),c(i,"link","link",t),c(i,"description","description",t);var n=h("pubDate",t);return n&&(i.pubDate=new Date(n)),i}))};c(r,"title","title",n),c(r,"link","link",n),c(r,"description","description",n);var o=h("lastBuildDate",n);return o&&(r.updated=new Date(o)),c(r,"author","managingEditor",n,!0),r}(t):null};var r=["url","type","lang"],o=["fileSize","bitrate","framerate","samplingrate","channels","duration","height","width"];function a(e){return(0,s.getElementsByTagName)("media:content",e).map((function(e){for(var t=e.attribs,i={medium:t.medium,isDefault:!!t.isDefault},n=0,s=r;n{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.uniqueSort=t.compareDocumentPosition=t.removeSubsets=void 0;var n=i(9425);function s(e,t){var i=[],s=[];if(e===t)return 0;for(var r=(0,n.hasChildren)(e)?e:e.parent;r;)i.unshift(r),r=r.parent;for(r=(0,n.hasChildren)(t)?t:t.parent;r;)s.unshift(r),r=r.parent;for(var o=Math.min(i.length,s.length),a=0;ah.indexOf(d)?l===t?20:4:l===e?10:2}t.removeSubsets=function(e){for(var t=e.length;--t>=0;){var i=e[t];if(t>0&&e.lastIndexOf(i,t-1)>=0)e.splice(t,1);else for(var n=i.parent;n;n=n.parent)if(e.includes(n)){e.splice(t,1);break}}return e},t.compareDocumentPosition=s,t.uniqueSort=function(e){return(e=e.filter((function(e,t,i){return!i.includes(e,t+1)}))).sort((function(e,t){var i=s(e,t);return 2&i?-1:4&i?1:0})),e}},5030:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[i]}})}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),s=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||n(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),t.hasChildren=t.isDocument=t.isComment=t.isText=t.isCDATA=t.isTag=void 0,s(i(3017),t),s(i(8563),t),s(i(378),t),s(i(1446),t),s(i(9319),t),s(i(6850),t),s(i(9904),t);var r=i(9425);Object.defineProperty(t,"isTag",{enumerable:!0,get:function(){return r.isTag}}),Object.defineProperty(t,"isCDATA",{enumerable:!0,get:function(){return r.isCDATA}}),Object.defineProperty(t,"isText",{enumerable:!0,get:function(){return r.isText}}),Object.defineProperty(t,"isComment",{enumerable:!0,get:function(){return r.isComment}}),Object.defineProperty(t,"isDocument",{enumerable:!0,get:function(){return r.isDocument}}),Object.defineProperty(t,"hasChildren",{enumerable:!0,get:function(){return r.hasChildren}})},9319:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getElementsByTagType=t.getElementsByTagName=t.getElementById=t.getElements=t.testElement=void 0;var n=i(9425),s=i(1446),r={tag_name:function(e){return"function"==typeof e?function(t){return(0,n.isTag)(t)&&e(t.name)}:"*"===e?n.isTag:function(t){return(0,n.isTag)(t)&&t.name===e}},tag_type:function(e){return"function"==typeof e?function(t){return e(t.type)}:function(t){return t.type===e}},tag_contains:function(e){return"function"==typeof e?function(t){return(0,n.isText)(t)&&e(t.data)}:function(t){return(0,n.isText)(t)&&t.data===e}}};function o(e,t){return"function"==typeof t?function(i){return(0,n.isTag)(i)&&t(i.attribs[e])}:function(i){return(0,n.isTag)(i)&&i.attribs[e]===t}}function a(e,t){return function(i){return e(i)||t(i)}}function l(e){var t=Object.keys(e).map((function(t){var i=e[t];return Object.prototype.hasOwnProperty.call(r,t)?r[t](i):o(t,i)}));return 0===t.length?null:t.reduce(a)}t.testElement=function(e,t){var i=l(e);return!i||i(t)},t.getElements=function(e,t,i,n){void 0===n&&(n=1/0);var r=l(e);return r?(0,s.filter)(r,t,i,n):[]},t.getElementById=function(e,t,i){return void 0===i&&(i=!0),Array.isArray(t)||(t=[t]),(0,s.findOne)(o("id",e),t,i)},t.getElementsByTagName=function(e,t,i,n){return void 0===i&&(i=!0),void 0===n&&(n=1/0),(0,s.filter)(r.tag_name(e),t,i,n)},t.getElementsByTagType=function(e,t,i,n){return void 0===i&&(i=!0),void 0===n&&(n=1/0),(0,s.filter)(r.tag_type(e),t,i,n)}},378:(e,t)=>{"use strict";function i(e){if(e.prev&&(e.prev.next=e.next),e.next&&(e.next.prev=e.prev),e.parent){var t=e.parent.children;t.splice(t.lastIndexOf(e),1)}}Object.defineProperty(t,"__esModule",{value:!0}),t.prepend=t.prependChild=t.append=t.appendChild=t.replaceElement=t.removeElement=void 0,t.removeElement=i,t.replaceElement=function(e,t){var i=t.prev=e.prev;i&&(i.next=t);var n=t.next=e.next;n&&(n.prev=t);var s=t.parent=e.parent;if(s){var r=s.children;r[r.lastIndexOf(e)]=t}},t.appendChild=function(e,t){if(i(t),t.next=null,t.parent=e,e.children.push(t)>1){var n=e.children[e.children.length-2];n.next=t,t.prev=n}else t.prev=null},t.append=function(e,t){i(t);var n=e.parent,s=e.next;if(t.next=s,t.prev=e,e.next=t,t.parent=n,s){if(s.prev=t,n){var r=n.children;r.splice(r.lastIndexOf(s),0,t)}}else n&&n.children.push(t)},t.prependChild=function(e,t){if(i(t),t.parent=e,t.prev=null,1!==e.children.unshift(t)){var n=e.children[1];n.prev=t,t.next=n}else t.next=null},t.prepend=function(e,t){i(t);var n=e.parent;if(n){var s=n.children;s.splice(s.indexOf(e),0,t)}e.prev&&(e.prev.next=t),t.parent=n,t.prev=e.prev,t.next=e,e.prev=t}},1446:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.findAll=t.existsOne=t.findOne=t.findOneChild=t.find=t.filter=void 0;var n=i(9425);function s(e,t,i,r){for(var o=[],a=0,l=t;a0){var c=s(e,h.children,i,r);if(o.push.apply(o,c),(r-=c.length)<=0)break}}return o}t.filter=function(e,t,i,n){return void 0===i&&(i=!0),void 0===n&&(n=1/0),Array.isArray(t)||(t=[t]),s(e,t,i,n)},t.find=s,t.findOneChild=function(e,t){return t.find(e)},t.findOne=function e(t,i,s){void 0===s&&(s=!0);for(var r=null,o=0;o0&&(r=e(t,a.children)))}return r},t.existsOne=function e(t,i){return i.some((function(i){return(0,n.isTag)(i)&&(t(i)||i.children.length>0&&e(t,i.children))}))},t.findAll=function(e,t){for(var i,s,r=[],o=t.filter(n.isTag);s=o.shift();){var a=null===(i=s.children)||void 0===i?void 0:i.filter(n.isTag);a&&a.length>0&&o.unshift.apply(o,a),e(s)&&r.push(s)}return r}},3017:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.innerText=t.textContent=t.getText=t.getInnerHTML=t.getOuterHTML=void 0;var s=i(9425),r=n(i(2721)),o=i(3706);function a(e,t){return(0,r.default)(e,t)}t.getOuterHTML=a,t.getInnerHTML=function(e,t){return(0,s.hasChildren)(e)?e.children.map((function(e){return a(e,t)})).join(""):""},t.getText=function e(t){return Array.isArray(t)?t.map(e).join(""):(0,s.isTag)(t)?"br"===t.name?"\n":e(t.children):(0,s.isCDATA)(t)?e(t.children):(0,s.isText)(t)?t.data:""},t.textContent=function e(t){return Array.isArray(t)?t.map(e).join(""):(0,s.hasChildren)(t)&&!(0,s.isComment)(t)?e(t.children):(0,s.isText)(t)?t.data:""},t.innerText=function e(t){return Array.isArray(t)?t.map(e).join(""):(0,s.hasChildren)(t)&&(t.type===o.ElementType.Tag||(0,s.isCDATA)(t))?e(t.children):(0,s.isText)(t)?t.data:""}},8563:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.prevElementSibling=t.nextElementSibling=t.getName=t.hasAttrib=t.getAttributeValue=t.getSiblings=t.getParent=t.getChildren=void 0;var n=i(9425),s=[];function r(e){var t;return null!==(t=e.children)&&void 0!==t?t:s}function o(e){return e.parent||null}t.getChildren=r,t.getParent=o,t.getSiblings=function(e){var t=o(e);if(null!=t)return r(t);for(var i=[e],n=e.prev,s=e.next;null!=n;)i.unshift(n),n=n.prev;for(;null!=s;)i.push(s),s=s.next;return i},t.getAttributeValue=function(e,t){var i;return null===(i=e.attribs)||void 0===i?void 0:i[t]},t.hasAttrib=function(e,t){return null!=e.attribs&&Object.prototype.hasOwnProperty.call(e.attribs,t)&&null!=e.attribs[t]},t.getName=function(e){return e.name},t.nextElementSibling=function(e){for(var t=e.next;null!==t&&!(0,n.isTag)(t);)t=t.next;return t},t.prevElementSibling=function(e){for(var t=e.prev;null!==t&&!(0,n.isTag)(t);)t=t.prev;return t}},4080:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.decodeHTML=t.decodeHTMLStrict=t.decodeXML=void 0;var s=n(i(2810)),r=n(i(2836)),o=n(i(8689)),a=n(i(7826)),l=/&(?:[a-zA-Z0-9]+|#[xX][\da-fA-F]+|#\d+);/g;function h(e){var t=d(e);return function(e){return String(e).replace(l,t)}}t.decodeXML=h(o.default),t.decodeHTMLStrict=h(s.default);var c=function(e,t){return e65535&&(e-=65536,t+=String.fromCharCode(e>>>10&1023|55296),e=56320|1023&e),t+String.fromCharCode(e)};t.default=function(e){return e>=55296&&e<=57343||e>1114111?"๏ฟฝ":(e in s.default&&(e=s.default[e]),r(e))}},956:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.escapeUTF8=t.escape=t.encodeNonAsciiHTML=t.encodeHTML=t.encodeXML=void 0;var s=c(n(i(8689)).default),r=d(s);t.encodeXML=g(s);var o,a,l=c(n(i(2810)).default),h=d(l);function c(e){return Object.keys(e).sort().reduce((function(t,i){return t[e[i]]="&"+i+";",t}),{})}function d(e){for(var t=[],i=[],n=0,s=Object.keys(e);n1?p(e):e.charCodeAt(0)).toString(16).toUpperCase()+";"}var m=new RegExp(r.source+"|"+u.source,"g");function g(e){return function(t){return t.replace(m,(function(t){return e[t]||f(t)}))}}t.escape=function(e){return e.replace(m,f)},t.escapeUTF8=function(e){return e.replace(r,f)}},2593:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.decodeXMLStrict=t.decodeHTML5Strict=t.decodeHTML4Strict=t.decodeHTML5=t.decodeHTML4=t.decodeHTMLStrict=t.decodeHTML=t.decodeXML=t.encodeHTML5=t.encodeHTML4=t.escapeUTF8=t.escape=t.encodeNonAsciiHTML=t.encodeHTML=t.encodeXML=t.encode=t.decodeStrict=t.decode=void 0;var n=i(4080),s=i(956);t.decode=function(e,t){return(!t||t<=0?n.decodeXML:n.decodeHTML)(e)},t.decodeStrict=function(e,t){return(!t||t<=0?n.decodeXML:n.decodeHTMLStrict)(e)},t.encode=function(e,t){return(!t||t<=0?s.encodeXML:s.encodeHTML)(e)};var r=i(956);Object.defineProperty(t,"encodeXML",{enumerable:!0,get:function(){return r.encodeXML}}),Object.defineProperty(t,"encodeHTML",{enumerable:!0,get:function(){return r.encodeHTML}}),Object.defineProperty(t,"encodeNonAsciiHTML",{enumerable:!0,get:function(){return r.encodeNonAsciiHTML}}),Object.defineProperty(t,"escape",{enumerable:!0,get:function(){return r.escape}}),Object.defineProperty(t,"escapeUTF8",{enumerable:!0,get:function(){return r.escapeUTF8}}),Object.defineProperty(t,"encodeHTML4",{enumerable:!0,get:function(){return r.encodeHTML}}),Object.defineProperty(t,"encodeHTML5",{enumerable:!0,get:function(){return r.encodeHTML}});var o=i(4080);Object.defineProperty(t,"decodeXML",{enumerable:!0,get:function(){return o.decodeXML}}),Object.defineProperty(t,"decodeHTML",{enumerable:!0,get:function(){return o.decodeHTML}}),Object.defineProperty(t,"decodeHTMLStrict",{enumerable:!0,get:function(){return o.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML4",{enumerable:!0,get:function(){return o.decodeHTML}}),Object.defineProperty(t,"decodeHTML5",{enumerable:!0,get:function(){return o.decodeHTML}}),Object.defineProperty(t,"decodeHTML4Strict",{enumerable:!0,get:function(){return o.decodeHTMLStrict}}),Object.defineProperty(t,"decodeHTML5Strict",{enumerable:!0,get:function(){return o.decodeHTMLStrict}}),Object.defineProperty(t,"decodeXMLStrict",{enumerable:!0,get:function(){return o.decodeXML}})},3419:e=>{"use strict";e.exports=e=>{if("string"!=typeof e)throw new TypeError("Expected a string");return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}},995:function(e,t,i){"use strict";var n,s=this&&this.__extends||(n=function(e,t){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},n(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)}),r=this&&this.__createBinding||(Object.create?function(e,t,i,n){void 0===n&&(n=i),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[i]}})}:function(e,t,i,n){void 0===n&&(n=i),e[n]=t[i]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),a=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&r(t,e,i);return o(t,e),t},l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.parseFeed=t.FeedHandler=void 0;var h,c,d=l(i(9425)),u=a(i(5030)),p=i(7361);!function(e){e[e.image=0]="image",e[e.audio=1]="audio",e[e.video=2]="video",e[e.document=3]="document",e[e.executable=4]="executable"}(h||(h={})),function(e){e[e.sample=0]="sample",e[e.full=1]="full",e[e.nonstop=2]="nonstop"}(c||(c={}));var f=function(e){function t(t,i){return"object"==typeof t&&(i=t=void 0),e.call(this,t,i)||this}return s(t,e),t.prototype.onend=function(){var e,t,i=v(y,this.dom);if(i){var n={};if("feed"===i.name){var s=i.children;n.type="atom",_(n,"id","id",s),_(n,"title","title",s);var r=b("href",v("link",s));r&&(n.link=r),_(n,"description","subtitle",s),(o=O("updated",s))&&(n.updated=new Date(o)),_(n,"author","email",s,!0),n.items=g("entry",s).map((function(e){var t={},i=e.children;_(t,"id","id",i),_(t,"title","title",i);var n=b("href",v("link",i));n&&(t.link=n);var s=O("summary",i)||O("content",i);s&&(t.description=s);var r=O("updated",i);return r&&(t.pubDate=new Date(r)),t.media=m(i),t}))}else{var o;s=null!==(t=null===(e=v("channel",i.children))||void 0===e?void 0:e.children)&&void 0!==t?t:[],n.type=i.name.substr(0,3),n.id="",_(n,"title","title",s),_(n,"link","link",s),_(n,"description","description",s),(o=O("lastBuildDate",s))&&(n.updated=new Date(o)),_(n,"author","managingEditor",s,!0),n.items=g("item",i.children).map((function(e){var t={},i=e.children;_(t,"id","guid",i),_(t,"title","title",i),_(t,"link","link",i),_(t,"description","description",i);var n=O("pubDate",i);return n&&(t.pubDate=new Date(n)),t.media=m(i),t}))}this.feed=n,this.handleCallback(null)}else this.handleCallback(new Error("couldn't find root of feed"))},t}(d.default);function m(e){return g("media:content",e).map((function(e){var t={medium:e.attribs.medium,isDefault:!!e.attribs.isDefault};return e.attribs.url&&(t.url=e.attribs.url),e.attribs.fileSize&&(t.fileSize=parseInt(e.attribs.fileSize,10)),e.attribs.type&&(t.type=e.attribs.type),e.attribs.expression&&(t.expression=e.attribs.expression),e.attribs.bitrate&&(t.bitrate=parseInt(e.attribs.bitrate,10)),e.attribs.framerate&&(t.framerate=parseInt(e.attribs.framerate,10)),e.attribs.samplingrate&&(t.samplingrate=parseInt(e.attribs.samplingrate,10)),e.attribs.channels&&(t.channels=parseInt(e.attribs.channels,10)),e.attribs.duration&&(t.duration=parseInt(e.attribs.duration,10)),e.attribs.height&&(t.height=parseInt(e.attribs.height,10)),e.attribs.width&&(t.width=parseInt(e.attribs.width,10)),e.attribs.lang&&(t.lang=e.attribs.lang),t}))}function g(e,t){return u.getElementsByTagName(e,t,!0)}function v(e,t){return u.getElementsByTagName(e,t,!0,1)[0]}function O(e,t,i){return void 0===i&&(i=!1),u.getText(u.getElementsByTagName(e,t,i,1)).trim()}function b(e,t){return t?t.attribs[e]:null}function _(e,t,i,n,s){void 0===s&&(s=!1);var r=O(i,n,s);r&&(e[t]=r)}function y(e){return"rss"===e||"feed"===e||"rdf:RDF"===e}t.FeedHandler=f,t.parseFeed=function(e,t){void 0===t&&(t={xmlMode:!0});var i=new f(t);return new p.Parser(i,t).end(e),i.feed}},7361:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.Parser=void 0;var s=n(i(1941)),r=new Set(["input","option","optgroup","select","button","datalist","textarea"]),o=new Set(["p"]),a={tr:new Set(["tr","th","td"]),th:new Set(["th"]),td:new Set(["thead","th","td"]),body:new Set(["head","link","script"]),li:new Set(["li"]),p:o,h1:o,h2:o,h3:o,h4:o,h5:o,h6:o,select:r,input:r,output:r,button:r,datalist:r,textarea:r,option:new Set(["option"]),optgroup:new Set(["optgroup","option"]),dd:new Set(["dt","dd"]),dt:new Set(["dt","dd"]),address:o,article:o,aside:o,blockquote:o,details:o,div:o,dl:o,fieldset:o,figcaption:o,figure:o,footer:o,form:o,header:o,hr:o,main:o,nav:o,ol:o,pre:o,section:o,table:o,ul:o,rt:new Set(["rt","rp"]),rp:new Set(["rt","rp"]),tbody:new Set(["thead","tbody"]),tfoot:new Set(["thead","tbody"])},l=new Set(["area","base","basefont","br","col","command","embed","frame","hr","img","input","isindex","keygen","link","meta","param","source","track","wbr"]),h=new Set(["math","svg"]),c=new Set(["mi","mo","mn","ms","mtext","annotation-xml","foreignObject","desc","title"]),d=/\s|\//,u=function(){function e(e,t){var i,n,r,o,a;void 0===t&&(t={}),this.startIndex=0,this.endIndex=null,this.tagname="",this.attribname="",this.attribvalue="",this.attribs=null,this.stack=[],this.foreignContext=[],this.options=t,this.cbs=null!=e?e:{},this.lowerCaseTagNames=null!==(i=t.lowerCaseTags)&&void 0!==i?i:!t.xmlMode,this.lowerCaseAttributeNames=null!==(n=t.lowerCaseAttributeNames)&&void 0!==n?n:!t.xmlMode,this.tokenizer=new(null!==(r=t.Tokenizer)&&void 0!==r?r:s.default)(this.options,this),null===(a=(o=this.cbs).onparserinit)||void 0===a||a.call(o,this)}return e.prototype.updatePosition=function(e){null===this.endIndex?this.tokenizer.sectionStart<=e?this.startIndex=0:this.startIndex=this.tokenizer.sectionStart-e:this.startIndex=this.endIndex+1,this.endIndex=this.tokenizer.getAbsoluteIndex()},e.prototype.ontext=function(e){var t,i;this.updatePosition(1),this.endIndex--,null===(i=(t=this.cbs).ontext)||void 0===i||i.call(t,e)},e.prototype.onopentagname=function(e){var t,i;if(this.lowerCaseTagNames&&(e=e.toLowerCase()),this.tagname=e,!this.options.xmlMode&&Object.prototype.hasOwnProperty.call(a,e))for(var n=void 0;this.stack.length>0&&a[e].has(n=this.stack[this.stack.length-1]);)this.onclosetag(n);!this.options.xmlMode&&l.has(e)||(this.stack.push(e),h.has(e)?this.foreignContext.push(!0):c.has(e)&&this.foreignContext.push(!1)),null===(i=(t=this.cbs).onopentagname)||void 0===i||i.call(t,e),this.cbs.onopentag&&(this.attribs={})},e.prototype.onopentagend=function(){var e,t;this.updatePosition(1),this.attribs&&(null===(t=(e=this.cbs).onopentag)||void 0===t||t.call(e,this.tagname,this.attribs),this.attribs=null),!this.options.xmlMode&&this.cbs.onclosetag&&l.has(this.tagname)&&this.cbs.onclosetag(this.tagname),this.tagname=""},e.prototype.onclosetag=function(e){if(this.updatePosition(1),this.lowerCaseTagNames&&(e=e.toLowerCase()),(h.has(e)||c.has(e))&&this.foreignContext.pop(),!this.stack.length||!this.options.xmlMode&&l.has(e))this.options.xmlMode||"br"!==e&&"p"!==e||(this.onopentagname(e),this.closeCurrentTag());else{var t=this.stack.lastIndexOf(e);if(-1!==t)if(this.cbs.onclosetag)for(t=this.stack.length-t;t--;)this.cbs.onclosetag(this.stack.pop());else this.stack.length=t;else"p"!==e||this.options.xmlMode||(this.onopentagname(e),this.closeCurrentTag())}},e.prototype.onselfclosingtag=function(){this.options.xmlMode||this.options.recognizeSelfClosing||this.foreignContext[this.foreignContext.length-1]?this.closeCurrentTag():this.onopentagend()},e.prototype.closeCurrentTag=function(){var e,t,i=this.tagname;this.onopentagend(),this.stack[this.stack.length-1]===i&&(null===(t=(e=this.cbs).onclosetag)||void 0===t||t.call(e,i),this.stack.pop())},e.prototype.onattribname=function(e){this.lowerCaseAttributeNames&&(e=e.toLowerCase()),this.attribname=e},e.prototype.onattribdata=function(e){this.attribvalue+=e},e.prototype.onattribend=function(e){var t,i;null===(i=(t=this.cbs).onattribute)||void 0===i||i.call(t,this.attribname,this.attribvalue,e),this.attribs&&!Object.prototype.hasOwnProperty.call(this.attribs,this.attribname)&&(this.attribs[this.attribname]=this.attribvalue),this.attribname="",this.attribvalue=""},e.prototype.getInstructionName=function(e){var t=e.search(d),i=t<0?e:e.substr(0,t);return this.lowerCaseTagNames&&(i=i.toLowerCase()),i},e.prototype.ondeclaration=function(e){if(this.cbs.onprocessinginstruction){var t=this.getInstructionName(e);this.cbs.onprocessinginstruction("!"+t,"!"+e)}},e.prototype.onprocessinginstruction=function(e){if(this.cbs.onprocessinginstruction){var t=this.getInstructionName(e);this.cbs.onprocessinginstruction("?"+t,"?"+e)}},e.prototype.oncomment=function(e){var t,i,n,s;this.updatePosition(4),null===(i=(t=this.cbs).oncomment)||void 0===i||i.call(t,e),null===(s=(n=this.cbs).oncommentend)||void 0===s||s.call(n)},e.prototype.oncdata=function(e){var t,i,n,s,r,o;this.updatePosition(1),this.options.xmlMode||this.options.recognizeCDATA?(null===(i=(t=this.cbs).oncdatastart)||void 0===i||i.call(t),null===(s=(n=this.cbs).ontext)||void 0===s||s.call(n,e),null===(o=(r=this.cbs).oncdataend)||void 0===o||o.call(r)):this.oncomment("[CDATA["+e+"]]")},e.prototype.onerror=function(e){var t,i;null===(i=(t=this.cbs).onerror)||void 0===i||i.call(t,e)},e.prototype.onend=function(){var e,t;if(this.cbs.onclosetag)for(var i=this.stack.length;i>0;this.cbs.onclosetag(this.stack[--i]));null===(t=(e=this.cbs).onend)||void 0===t||t.call(e)},e.prototype.reset=function(){var e,t,i,n;null===(t=(e=this.cbs).onreset)||void 0===t||t.call(e),this.tokenizer.reset(),this.tagname="",this.attribname="",this.attribs=null,this.stack=[],null===(n=(i=this.cbs).onparserinit)||void 0===n||n.call(i,this)},e.prototype.parseComplete=function(e){this.reset(),this.end(e)},e.prototype.write=function(e){this.tokenizer.write(e)},e.prototype.end=function(e){this.tokenizer.end(e)},e.prototype.pause=function(){this.tokenizer.pause()},e.prototype.resume=function(){this.tokenizer.resume()},e.prototype.parseChunk=function(e){this.write(e)},e.prototype.done=function(e){this.end(e)},e}();t.Parser=u},1941:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});var s=n(i(7826)),r=n(i(2810)),o=n(i(2836)),a=n(i(8689));function l(e){return" "===e||"\n"===e||"\t"===e||"\f"===e||"\r"===e}function h(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"}function c(e,t,i){var n=e.toLowerCase();return e===n?function(e,s){s===n?e._state=t:(e._state=i,e._index--)}:function(s,r){r===n||r===e?s._state=t:(s._state=i,s._index--)}}function d(e,t){var i=e.toLowerCase();return function(n,s){s===i||s===e?n._state=t:(n._state=3,n._index--)}}var u=c("C",24,16),p=c("D",25,16),f=c("A",26,16),m=c("T",27,16),g=c("A",28,16),v=d("R",35),O=d("I",36),b=d("P",37),_=d("T",38),y=c("R",40,1),w=c("I",41,1),x=c("P",42,1),S=c("T",43,1),k=d("Y",45),T=d("L",46),C=d("E",47),P=c("Y",49,1),M=c("L",50,1),E=c("E",51,1),A=d("I",54),R=d("T",55),D=d("L",56),I=d("E",57),q=c("I",58,1),L=c("T",59,1),N=c("L",60,1),B=c("E",61,1),$=c("#",63,64),Q=c("X",66,65),z=function(){function e(e,t){var i;this._state=1,this.buffer="",this.sectionStart=0,this._index=0,this.bufferOffset=0,this.baseState=1,this.special=1,this.running=!0,this.ended=!1,this.cbs=t,this.xmlMode=!!(null==e?void 0:e.xmlMode),this.decodeEntities=null===(i=null==e?void 0:e.decodeEntities)||void 0===i||i}return e.prototype.reset=function(){this._state=1,this.buffer="",this.sectionStart=0,this._index=0,this.bufferOffset=0,this.baseState=1,this.special=1,this.running=!0,this.ended=!1},e.prototype.write=function(e){this.ended&&this.cbs.onerror(Error(".write() after done!")),this.buffer+=e,this.parse()},e.prototype.end=function(e){this.ended&&this.cbs.onerror(Error(".end() after done!")),e&&this.write(e),this.ended=!0,this.running&&this.finish()},e.prototype.pause=function(){this.running=!1},e.prototype.resume=function(){this.running=!0,this._indexthis.sectionStart&&this.cbs.ontext(this.getSection()),this._state=2,this.sectionStart=this._index):!this.decodeEntities||"&"!==e||1!==this.special&&4!==this.special||(this._index>this.sectionStart&&this.cbs.ontext(this.getSection()),this.baseState=1,this._state=62,this.sectionStart=this._index)},e.prototype.isTagStartChar=function(e){return h(e)||this.xmlMode&&!l(e)&&"/"!==e&&">"!==e},e.prototype.stateBeforeTagName=function(e){"/"===e?this._state=5:"<"===e?(this.cbs.ontext(this.getSection()),this.sectionStart=this._index):">"===e||1!==this.special||l(e)?this._state=1:"!"===e?(this._state=15,this.sectionStart=this._index+1):"?"===e?(this._state=17,this.sectionStart=this._index+1):this.isTagStartChar(e)?(this._state=this.xmlMode||"s"!==e&&"S"!==e?this.xmlMode||"t"!==e&&"T"!==e?3:52:32,this.sectionStart=this._index):this._state=1},e.prototype.stateInTagName=function(e){("/"===e||">"===e||l(e))&&(this.emitToken("onopentagname"),this._state=8,this._index--)},e.prototype.stateBeforeClosingTagName=function(e){l(e)||(">"===e?this._state=1:1!==this.special?4===this.special||"s"!==e&&"S"!==e?4!==this.special||"t"!==e&&"T"!==e?(this._state=1,this._index--):this._state=53:this._state=33:this.isTagStartChar(e)?(this._state=6,this.sectionStart=this._index):(this._state=20,this.sectionStart=this._index))},e.prototype.stateInClosingTagName=function(e){(">"===e||l(e))&&(this.emitToken("onclosetag"),this._state=7,this._index--)},e.prototype.stateAfterClosingTagName=function(e){">"===e&&(this._state=1,this.sectionStart=this._index+1)},e.prototype.stateBeforeAttributeName=function(e){">"===e?(this.cbs.onopentagend(),this._state=1,this.sectionStart=this._index+1):"/"===e?this._state=4:l(e)||(this._state=9,this.sectionStart=this._index)},e.prototype.stateInSelfClosingTag=function(e){">"===e?(this.cbs.onselfclosingtag(),this._state=1,this.sectionStart=this._index+1,this.special=1):l(e)||(this._state=8,this._index--)},e.prototype.stateInAttributeName=function(e){("="===e||"/"===e||">"===e||l(e))&&(this.cbs.onattribname(this.getSection()),this.sectionStart=-1,this._state=10,this._index--)},e.prototype.stateAfterAttributeName=function(e){"="===e?this._state=11:"/"===e||">"===e?(this.cbs.onattribend(void 0),this._state=8,this._index--):l(e)||(this.cbs.onattribend(void 0),this._state=9,this.sectionStart=this._index)},e.prototype.stateBeforeAttributeValue=function(e){'"'===e?(this._state=12,this.sectionStart=this._index+1):"'"===e?(this._state=13,this.sectionStart=this._index+1):l(e)||(this._state=14,this.sectionStart=this._index,this._index--)},e.prototype.handleInAttributeValue=function(e,t){e===t?(this.emitToken("onattribdata"),this.cbs.onattribend(t),this._state=8):this.decodeEntities&&"&"===e&&(this.emitToken("onattribdata"),this.baseState=this._state,this._state=62,this.sectionStart=this._index)},e.prototype.stateInAttributeValueDoubleQuotes=function(e){this.handleInAttributeValue(e,'"')},e.prototype.stateInAttributeValueSingleQuotes=function(e){this.handleInAttributeValue(e,"'")},e.prototype.stateInAttributeValueNoQuotes=function(e){l(e)||">"===e?(this.emitToken("onattribdata"),this.cbs.onattribend(null),this._state=8,this._index--):this.decodeEntities&&"&"===e&&(this.emitToken("onattribdata"),this.baseState=this._state,this._state=62,this.sectionStart=this._index)},e.prototype.stateBeforeDeclaration=function(e){this._state="["===e?23:"-"===e?18:16},e.prototype.stateInDeclaration=function(e){">"===e&&(this.cbs.ondeclaration(this.getSection()),this._state=1,this.sectionStart=this._index+1)},e.prototype.stateInProcessingInstruction=function(e){">"===e&&(this.cbs.onprocessinginstruction(this.getSection()),this._state=1,this.sectionStart=this._index+1)},e.prototype.stateBeforeComment=function(e){"-"===e?(this._state=19,this.sectionStart=this._index+1):this._state=16},e.prototype.stateInComment=function(e){"-"===e&&(this._state=21)},e.prototype.stateInSpecialComment=function(e){">"===e&&(this.cbs.oncomment(this.buffer.substring(this.sectionStart,this._index)),this._state=1,this.sectionStart=this._index+1)},e.prototype.stateAfterComment1=function(e){this._state="-"===e?22:19},e.prototype.stateAfterComment2=function(e){">"===e?(this.cbs.oncomment(this.buffer.substring(this.sectionStart,this._index-2)),this._state=1,this.sectionStart=this._index+1):"-"!==e&&(this._state=19)},e.prototype.stateBeforeCdata6=function(e){"["===e?(this._state=29,this.sectionStart=this._index+1):(this._state=16,this._index--)},e.prototype.stateInCdata=function(e){"]"===e&&(this._state=30)},e.prototype.stateAfterCdata1=function(e){this._state="]"===e?31:29},e.prototype.stateAfterCdata2=function(e){">"===e?(this.cbs.oncdata(this.buffer.substring(this.sectionStart,this._index-2)),this._state=1,this.sectionStart=this._index+1):"]"!==e&&(this._state=29)},e.prototype.stateBeforeSpecialS=function(e){"c"===e||"C"===e?this._state=34:"t"===e||"T"===e?this._state=44:(this._state=3,this._index--)},e.prototype.stateBeforeSpecialSEnd=function(e){2!==this.special||"c"!==e&&"C"!==e?3!==this.special||"t"!==e&&"T"!==e?this._state=1:this._state=48:this._state=39},e.prototype.stateBeforeSpecialLast=function(e,t){("/"===e||">"===e||l(e))&&(this.special=t),this._state=3,this._index--},e.prototype.stateAfterSpecialLast=function(e,t){">"===e||l(e)?(this.special=1,this._state=6,this.sectionStart=this._index-t,this._index--):this._state=1},e.prototype.parseFixedEntity=function(e){if(void 0===e&&(e=this.xmlMode?a.default:r.default),this.sectionStart+1=2;){var i=this.buffer.substr(e,t);if(Object.prototype.hasOwnProperty.call(o.default,i))return this.emitPartial(o.default[i]),void(this.sectionStart+=t+1);t--}},e.prototype.stateInNamedEntity=function(e){";"===e?(this.parseFixedEntity(),1===this.baseState&&this.sectionStart+1"9")&&!h(e)&&(this.xmlMode||this.sectionStart+1===this._index||(1!==this.baseState?"="!==e&&this.parseFixedEntity(o.default):this.parseLegacyEntity()),this._state=this.baseState,this._index--)},e.prototype.decodeNumericEntity=function(e,t,i){var n=this.sectionStart+e;if(n!==this._index){var r=this.buffer.substring(n,this._index),o=parseInt(r,t);this.emitPartial(s.default(o)),this.sectionStart=i?this._index+1:this._index}this._state=this.baseState},e.prototype.stateInNumericEntity=function(e){";"===e?this.decodeNumericEntity(2,10,!0):(e<"0"||e>"9")&&(this.xmlMode?this._state=this.baseState:this.decodeNumericEntity(2,10,!1),this._index--)},e.prototype.stateInHexEntity=function(e){";"===e?this.decodeNumericEntity(3,16,!0):(e<"a"||e>"f")&&(e<"A"||e>"F")&&(e<"0"||e>"9")&&(this.xmlMode?this._state=this.baseState:this.decodeNumericEntity(3,16,!1),this._index--)},e.prototype.cleanup=function(){this.sectionStart<0?(this.buffer="",this.bufferOffset+=this._index,this._index=0):this.running&&(1===this._state?(this.sectionStart!==this._index&&this.cbs.ontext(this.buffer.substr(this.sectionStart)),this.buffer="",this.bufferOffset+=this._index,this._index=0):this.sectionStart===this._index?(this.buffer="",this.bufferOffset+=this._index,this._index=0):(this.buffer=this.buffer.substr(this.sectionStart),this._index-=this.sectionStart,this.bufferOffset+=this.sectionStart),this.sectionStart=0)},e.prototype.parse=function(){for(;this._index{"use strict";function i(e){return"[object Object]"===Object.prototype.toString.call(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.isPlainObject=function(e){var t,n;return!1!==i(e)&&(void 0===(t=e.constructor)||!1!==i(n=t.prototype)&&!1!==n.hasOwnProperty("isPrototypeOf"))}},6145:(e,t,i)=>{var n,s=/[&<>"'`]/g,r=RegExp(s.source),o="object"==typeof i.g&&i.g&&i.g.Object===Object&&i.g,a="object"==typeof self&&self&&self.Object===Object&&self,l=o||a||Function("return this")(),h=(n={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},function(e){return null==n?void 0:n[e]}),c=Object.prototype.toString,d=l.Symbol,u=d?d.prototype:void 0,p=u?u.toString:void 0;e.exports=function(e){var t;return(e=null==(t=e)?"":function(e){if("string"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&"[object Symbol]"==c.call(e)}(e))return p?p.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}(t))&&r.test(e)?e.replace(s,h):e}},6965:e=>{"use strict";function t(e){return"number"==typeof e||!!/^0x[0-9a-f]+$/i.test(e)||/^[-+]?(?:\d+(?:\.\d*)?|\.\d+)(e[-+]?\d+)?$/.test(e)}function i(e,t){return"constructor"===t&&"function"==typeof e[t]||"__proto__"===t}e.exports=function(e,n){n||(n={});var s={bools:{},strings:{},unknownFn:null};"function"==typeof n.unknown&&(s.unknownFn=n.unknown),"boolean"==typeof n.boolean&&n.boolean?s.allBools=!0:[].concat(n.boolean).filter(Boolean).forEach((function(e){s.bools[e]=!0}));var r={};function o(e){return r[e].some((function(e){return s.bools[e]}))}Object.keys(n.alias||{}).forEach((function(e){r[e]=[].concat(n.alias[e]),r[e].forEach((function(t){r[t]=[e].concat(r[e].filter((function(e){return t!==e})))}))})),[].concat(n.string).filter(Boolean).forEach((function(e){s.strings[e]=!0,r[e]&&[].concat(r[e]).forEach((function(e){s.strings[e]=!0}))}));var a=n.default||{},l={_:[]};function h(e,t,n){for(var r=e,o=0;o=l)return g;n=i(d),s=[],","===n.slice(-1)?(n=n.replace(u,""),O()):v()}function v(){for(i(h),r="",o="in descriptor";;){if(a=e.charAt(m),"in descriptor"===o)if(t(a))r&&(s.push(r),r="",o="after descriptor");else{if(","===a)return m+=1,r&&s.push(r),void O();if("("===a)r+=a,o="in parens";else{if(""===a)return r&&s.push(r),void O();r+=a}}else if("in parens"===o)if(")"===a)r+=a,o="in descriptor";else{if(""===a)return s.push(r),void O();r+=a}else if("after descriptor"===o)if(t(a));else{if(""===a)return void O();o="in descriptor",m-=1}m+=1}}function O(){var t,i,r,o,a,l,h,c,d,u=!1,m={};for(o=0;o{"use strict";function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function i(e,t){for(var i,n="",s=0,r=-1,o=0,a=0;a<=e.length;++a){if(a2){var l=n.lastIndexOf("/");if(l!==n.length-1){-1===l?(n="",s=0):s=(n=n.slice(0,l)).length-1-n.lastIndexOf("/"),r=a,o=0;continue}}else if(2===n.length||1===n.length){n="",s=0,r=a,o=0;continue}t&&(n.length>0?n+="/..":n="..",s=2)}else n.length>0?n+="/"+e.slice(r+1,a):n=e.slice(r+1,a),s=a-r-1;r=a,o=0}else 46===i&&-1!==o?++o:o=-1}return n}var n={resolve:function(){for(var e,n="",s=!1,r=arguments.length-1;r>=-1&&!s;r--){var o;r>=0?o=arguments[r]:(void 0===e&&(e=process.cwd()),o=e),t(o),0!==o.length&&(n=o+"/"+n,s=47===o.charCodeAt(0))}return n=i(n,!s),s?n.length>0?"/"+n:"/":n.length>0?n:"."},normalize:function(e){if(t(e),0===e.length)return".";var n=47===e.charCodeAt(0),s=47===e.charCodeAt(e.length-1);return 0!==(e=i(e,!n)).length||n||(e="."),e.length>0&&s&&(e+="/"),n?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,i=0;i0&&(void 0===e?e=s:e+="/"+s)}return void 0===e?".":n.normalize(e)},relative:function(e,i){if(t(e),t(i),e===i)return"";if((e=n.resolve(e))===(i=n.resolve(i)))return"";for(var s=1;sh){if(47===i.charCodeAt(a+d))return i.slice(a+d+1);if(0===d)return i.slice(a+d)}else o>h&&(47===e.charCodeAt(s+d)?c=d:0===d&&(c=0));break}var u=e.charCodeAt(s+d);if(u!==i.charCodeAt(a+d))break;47===u&&(c=d)}var p="";for(d=s+c+1;d<=r;++d)d!==r&&47!==e.charCodeAt(d)||(0===p.length?p+="..":p+="/..");return p.length>0?p+i.slice(a+c):(a+=c,47===i.charCodeAt(a)&&++a,i.slice(a))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var i=e.charCodeAt(0),n=47===i,s=-1,r=!0,o=e.length-1;o>=1;--o)if(47===(i=e.charCodeAt(o))){if(!r){s=o;break}}else r=!1;return-1===s?n?"/":".":n&&1===s?"//":e.slice(0,s)},basename:function(e,i){if(void 0!==i&&"string"!=typeof i)throw new TypeError('"ext" argument must be a string');t(e);var n,s=0,r=-1,o=!0;if(void 0!==i&&i.length>0&&i.length<=e.length){if(i.length===e.length&&i===e)return"";var a=i.length-1,l=-1;for(n=e.length-1;n>=0;--n){var h=e.charCodeAt(n);if(47===h){if(!o){s=n+1;break}}else-1===l&&(o=!1,l=n+1),a>=0&&(h===i.charCodeAt(a)?-1==--a&&(r=n):(a=-1,r=l))}return s===r?r=l:-1===r&&(r=e.length),e.slice(s,r)}for(n=e.length-1;n>=0;--n)if(47===e.charCodeAt(n)){if(!o){s=n+1;break}}else-1===r&&(o=!1,r=n+1);return-1===r?"":e.slice(s,r)},extname:function(e){t(e);for(var i=-1,n=0,s=-1,r=!0,o=0,a=e.length-1;a>=0;--a){var l=e.charCodeAt(a);if(47!==l)-1===s&&(r=!1,s=a+1),46===l?-1===i?i=a:1!==o&&(o=1):-1!==i&&(o=-1);else if(!r){n=a+1;break}}return-1===i||-1===s||0===o||1===o&&i===s-1&&i===n+1?"":e.slice(i,s)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var i=t.dir||t.root,n=t.base||(t.name||"")+(t.ext||"");return i?i===t.root?i+n:i+"/"+n:n}(0,e)},parse:function(e){t(e);var i={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return i;var n,s=e.charCodeAt(0),r=47===s;r?(i.root="/",n=1):n=0;for(var o=-1,a=0,l=-1,h=!0,c=e.length-1,d=0;c>=n;--c)if(47!==(s=e.charCodeAt(c)))-1===l&&(h=!1,l=c+1),46===s?-1===o?o=c:1!==d&&(d=1):-1!==o&&(d=-1);else if(!h){a=c+1;break}return-1===o||-1===l||0===d||1===d&&o===l-1&&o===a+1?-1!==l&&(i.base=i.name=0===a&&r?e.slice(1,l):e.slice(a,l)):(0===a&&r?(i.name=e.slice(1,o),i.base=e.slice(1,l)):(i.name=e.slice(a,o),i.base=e.slice(a,l)),i.ext=e.slice(o,l)),a>0?i.dir=e.slice(0,a-1):r&&(i.dir="/"),i},sep:"/",delimiter:":",win32:null,posix:null};n.posix=n,e.exports=n},1435:e=>{var t=String,i=function(){return{isColorSupported:!1,reset:t,bold:t,dim:t,italic:t,underline:t,inverse:t,hidden:t,strikethrough:t,black:t,red:t,green:t,yellow:t,blue:t,magenta:t,cyan:t,white:t,gray:t,bgBlack:t,bgRed:t,bgGreen:t,bgYellow:t,bgBlue:t,bgMagenta:t,bgCyan:t,bgWhite:t}};e.exports=i(),e.exports.createColors=i},7983:(e,t,i)=>{"use strict";let n=i(9930);class s extends n{constructor(e){super(e),this.type="atrule"}append(...e){return this.proxyOf.nodes||(this.nodes=[]),super.append(...e)}prepend(...e){return this.proxyOf.nodes||(this.nodes=[]),super.prepend(...e)}}e.exports=s,s.default=s,n.registerAtRule(s)},1044:(e,t,i)=>{"use strict";let n=i(322);class s extends n{constructor(e){super(e),this.type="comment"}}e.exports=s,s.default=s},9930:(e,t,i)=>{"use strict";let n,s,r,o,{isClean:a,my:l}=i(2450),h=i(9026),c=i(1044),d=i(322);function u(e){return e.map((e=>(e.nodes&&(e.nodes=u(e.nodes)),delete e.source,e)))}function p(e){if(e[a]=!1,e.proxyOf.nodes)for(let t of e.proxyOf.nodes)p(t)}class f extends d{append(...e){for(let t of e){let e=this.normalize(t,this.last);for(let t of e)this.proxyOf.nodes.push(t)}return this.markDirty(),this}cleanRaws(e){if(super.cleanRaws(e),this.nodes)for(let t of this.nodes)t.cleanRaws(e)}each(e){if(!this.proxyOf.nodes)return;let t,i,n=this.getIterator();for(;this.indexes[n]"proxyOf"===t?e:e[t]?"each"===t||"string"==typeof t&&t.startsWith("walk")?(...i)=>e[t](...i.map((e=>"function"==typeof e?(t,i)=>e(t.toProxy(),i):e))):"every"===t||"some"===t?i=>e[t](((e,...t)=>i(e.toProxy(),...t))):"root"===t?()=>e.root().toProxy():"nodes"===t?e.nodes.map((e=>e.toProxy())):"first"===t||"last"===t?e[t].toProxy():e[t]:e[t],set:(e,t,i)=>(e[t]===i||(e[t]=i,"name"!==t&&"params"!==t&&"selector"!==t||e.markDirty()),!0)}}index(e){return"number"==typeof e?e:(e.proxyOf&&(e=e.proxyOf),this.proxyOf.nodes.indexOf(e))}insertAfter(e,t){let i,n=this.index(e),s=this.normalize(t,this.proxyOf.nodes[n]).reverse();n=this.index(e);for(let e of s)this.proxyOf.nodes.splice(n+1,0,e);for(let e in this.indexes)i=this.indexes[e],n(e[l]||f.rebuild(e),(e=e.proxyOf).parent&&e.parent.removeChild(e),e[a]&&p(e),void 0===e.raws.before&&t&&void 0!==t.raws.before&&(e.raws.before=t.raws.before.replace(/\S/g,"")),e.parent=this.proxyOf,e)))}prepend(...e){e=e.reverse();for(let t of e){let e=this.normalize(t,this.first,"prepend").reverse();for(let t of e)this.proxyOf.nodes.unshift(t);for(let t in this.indexes)this.indexes[t]=this.indexes[t]+e.length}return this.markDirty(),this}push(e){return e.parent=this,this.proxyOf.nodes.push(e),this}removeAll(){for(let e of this.proxyOf.nodes)e.parent=void 0;return this.proxyOf.nodes=[],this.markDirty(),this}removeChild(e){let t;e=this.index(e),this.proxyOf.nodes[e].parent=void 0,this.proxyOf.nodes.splice(e,1);for(let i in this.indexes)t=this.indexes[i],t>=e&&(this.indexes[i]=t-1);return this.markDirty(),this}replaceValues(e,t,i){return i||(i=t,t={}),this.walkDecls((n=>{t.props&&!t.props.includes(n.prop)||t.fast&&!n.value.includes(t.fast)||(n.value=n.value.replace(e,i))})),this.markDirty(),this}some(e){return this.nodes.some(e)}walk(e){return this.each(((t,i)=>{let n;try{n=e(t,i)}catch(e){throw t.addToError(e)}return!1!==n&&t.walk&&(n=t.walk(e)),n}))}walkAtRules(e,t){return t?e instanceof RegExp?this.walk(((i,n)=>{if("atrule"===i.type&&e.test(i.name))return t(i,n)})):this.walk(((i,n)=>{if("atrule"===i.type&&i.name===e)return t(i,n)})):(t=e,this.walk(((e,i)=>{if("atrule"===e.type)return t(e,i)})))}walkComments(e){return this.walk(((t,i)=>{if("comment"===t.type)return e(t,i)}))}walkDecls(e,t){return t?e instanceof RegExp?this.walk(((i,n)=>{if("decl"===i.type&&e.test(i.prop))return t(i,n)})):this.walk(((i,n)=>{if("decl"===i.type&&i.prop===e)return t(i,n)})):(t=e,this.walk(((e,i)=>{if("decl"===e.type)return t(e,i)})))}walkRules(e,t){return t?e instanceof RegExp?this.walk(((i,n)=>{if("rule"===i.type&&e.test(i.selector))return t(i,n)})):this.walk(((i,n)=>{if("rule"===i.type&&i.selector===e)return t(i,n)})):(t=e,this.walk(((e,i)=>{if("rule"===e.type)return t(e,i)})))}get first(){if(this.proxyOf.nodes)return this.proxyOf.nodes[0]}get last(){if(this.proxyOf.nodes)return this.proxyOf.nodes[this.proxyOf.nodes.length-1]}}f.registerParse=e=>{n=e},f.registerRule=e=>{s=e},f.registerAtRule=e=>{r=e},f.registerRoot=e=>{o=e},e.exports=f,f.default=f,f.rebuild=e=>{"atrule"===e.type?Object.setPrototypeOf(e,r.prototype):"rule"===e.type?Object.setPrototypeOf(e,s.prototype):"decl"===e.type?Object.setPrototypeOf(e,h.prototype):"comment"===e.type?Object.setPrototypeOf(e,c.prototype):"root"===e.type&&Object.setPrototypeOf(e,o.prototype),e[l]=!0,e.nodes&&e.nodes.forEach((e=>{f.rebuild(e)}))}},2604:(e,t,i)=>{"use strict";let n=i(1435),s=i(2940);class r extends Error{constructor(e,t,i,n,s,o){super(e),this.name="CssSyntaxError",this.reason=e,s&&(this.file=s),n&&(this.source=n),o&&(this.plugin=o),void 0!==t&&void 0!==i&&("number"==typeof t?(this.line=t,this.column=i):(this.line=t.line,this.column=t.column,this.endLine=i.line,this.endColumn=i.column)),this.setMessage(),Error.captureStackTrace&&Error.captureStackTrace(this,r)}setMessage(){this.message=this.plugin?this.plugin+": ":"",this.message+=this.file?this.file:"",void 0!==this.line&&(this.message+=":"+this.line+":"+this.column),this.message+=": "+this.reason}showSourceCode(e){if(!this.source)return"";let t=this.source;null==e&&(e=n.isColorSupported),s&&e&&(t=s(t));let i,r,o=t.split(/\r?\n/),a=Math.max(this.line-3,0),l=Math.min(this.line+2,o.length),h=String(l).length;if(e){let{bold:e,gray:t,red:s}=n.createColors(!0);i=t=>e(s(t)),r=e=>t(e)}else i=r=e=>e;return o.slice(a,l).map(((e,t)=>{let n=a+1+t,s=" "+(" "+n).slice(-h)+" | ";if(n===this.line){let t=r(s.replace(/\d/g," "))+e.slice(0,this.column-1).replace(/[^\t]/g," ");return i(">")+r(s)+e+"\n "+t+i("^")}return" "+r(s)+e})).join("\n")}toString(){let e=this.showSourceCode();return e&&(e="\n\n"+e+"\n"),this.name+": "+this.message+e}}e.exports=r,r.default=r},9026:(e,t,i)=>{"use strict";let n=i(322);class s extends n{constructor(e){e&&void 0!==e.value&&"string"!=typeof e.value&&(e={...e,value:String(e.value)}),super(e),this.type="decl"}get variable(){return this.prop.startsWith("--")||"$"===this.prop[0]}}e.exports=s,s.default=s},2900:(e,t,i)=>{"use strict";let n,s,r=i(9930);class o extends r{constructor(e){super({type:"document",...e}),this.nodes||(this.nodes=[])}toResult(e={}){return new n(new s,this,e).stringify()}}o.registerLazyResult=e=>{n=e},o.registerProcessor=e=>{s=e},e.exports=o,o.default=o},4899:(e,t,i)=>{"use strict";let n=i(9026),s=i(2764),r=i(1044),o=i(7983),a=i(6970),l=i(4539),h=i(4146);function c(e,t){if(Array.isArray(e))return e.map((e=>c(e)));let{inputs:i,...d}=e;if(i){t=[];for(let e of i){let i={...e,__proto__:a.prototype};i.map&&(i.map={...i.map,__proto__:s.prototype}),t.push(i)}}if(d.nodes&&(d.nodes=e.nodes.map((e=>c(e,t)))),d.source){let{inputId:e,...i}=d.source;d.source=i,null!=e&&(d.source.input=t[e])}if("root"===d.type)return new l(d);if("decl"===d.type)return new n(d);if("rule"===d.type)return new h(d);if("comment"===d.type)return new r(d);if("atrule"===d.type)return new o(d);throw new Error("Unknown node type: "+e.type)}e.exports=c,c.default=c},6970:(e,t,i)=>{"use strict";let{SourceMapConsumer:n,SourceMapGenerator:s}=i(9059),{fileURLToPath:r,pathToFileURL:o}=i(415),{isAbsolute:a,resolve:l}=i(2666),{nanoid:h}=i(8845),c=i(2940),d=i(2604),u=i(2764),p=Symbol("fromOffsetCache"),f=Boolean(n&&s),m=Boolean(l&&a);class g{constructor(e,t={}){if(null==e||"object"==typeof e&&!e.toString)throw new Error(`PostCSS received ${e} instead of CSS string`);if(this.css=e.toString(),"\ufeff"===this.css[0]||"๏ฟพ"===this.css[0]?(this.hasBOM=!0,this.css=this.css.slice(1)):this.hasBOM=!1,t.from&&(!m||/^\w+:\/\//.test(t.from)||a(t.from)?this.file=t.from:this.file=l(t.from)),m&&f){let e=new u(this.css,t);if(e.text){this.map=e;let t=e.consumer().file;!this.file&&t&&(this.file=this.mapResolve(t))}}this.file||(this.id=""),this.map&&(this.map.file=this.from)}error(e,t,i,n={}){let s,r,a;if(t&&"object"==typeof t){let e=t,n=i;if("number"==typeof e.offset){let n=this.fromOffset(e.offset);t=n.line,i=n.col}else t=e.line,i=e.column;if("number"==typeof n.offset){let e=this.fromOffset(n.offset);r=e.line,a=e.col}else r=n.line,a=n.column}else if(!i){let e=this.fromOffset(t);t=e.line,i=e.col}let l=this.origin(t,i,r,a);return s=l?new d(e,void 0===l.endLine?l.line:{column:l.column,line:l.line},void 0===l.endLine?l.column:{column:l.endColumn,line:l.endLine},l.source,l.file,n.plugin):new d(e,void 0===r?t:{column:i,line:t},void 0===r?i:{column:a,line:r},this.css,this.file,n.plugin),s.input={column:i,endColumn:a,endLine:r,line:t,source:this.css},this.file&&(o&&(s.input.url=o(this.file).toString()),s.input.file=this.file),s}fromOffset(e){let t,i;if(this[p])i=this[p];else{let e=this.css.split("\n");i=new Array(e.length);let t=0;for(let n=0,s=e.length;n=t)n=i.length-1;else{let t,s=i.length-2;for(;n>1),e=i[t+1])){n=t;break}n=t+1}}return{col:e-i[n]+1,line:n+1}}mapResolve(e){return/^\w+:\/\//.test(e)?e:l(this.map.consumer().sourceRoot||this.map.root||".",e)}origin(e,t,i,n){if(!this.map)return!1;let s,l,h=this.map.consumer(),c=h.originalPositionFor({column:t,line:e});if(!c.source)return!1;"number"==typeof i&&(s=h.originalPositionFor({column:n,line:i})),l=a(c.source)?o(c.source):new URL(c.source,this.map.consumer().sourceRoot||o(this.map.mapFile));let d={column:c.column,endColumn:s&&s.column,endLine:s&&s.line,line:c.line,url:l.toString()};if("file:"===l.protocol){if(!r)throw new Error("file: protocol is not available in this PostCSS build");d.file=r(l)}let u=h.sourceContentFor(c.source);return u&&(d.source=u),d}toJSON(){let e={};for(let t of["hasBOM","css","file","id"])null!=this[t]&&(e[t]=this[t]);return this.map&&(e.map={...this.map},e.map.consumerCache&&(e.map.consumerCache=void 0)),e}get from(){return this.file||this.id}}e.exports=g,g.default=g,c&&c.registerInput&&c.registerInput(g)},427:(e,t,i)=>{"use strict";let{isClean:n,my:s}=i(2450),r=i(4342),o=i(9573),a=i(9930),l=i(2900),h=(i(5411),i(165)),c=i(6214),d=i(4539);const u={atrule:"AtRule",comment:"Comment",decl:"Declaration",document:"Document",root:"Root",rule:"Rule"},p={AtRule:!0,AtRuleExit:!0,Comment:!0,CommentExit:!0,Declaration:!0,DeclarationExit:!0,Document:!0,DocumentExit:!0,Once:!0,OnceExit:!0,postcssPlugin:!0,prepare:!0,Root:!0,RootExit:!0,Rule:!0,RuleExit:!0},f={Once:!0,postcssPlugin:!0,prepare:!0},m=0;function g(e){return"object"==typeof e&&"function"==typeof e.then}function v(e){let t=!1,i=u[e.type];return"decl"===e.type?t=e.prop.toLowerCase():"atrule"===e.type&&(t=e.name.toLowerCase()),t&&e.append?[i,i+"-"+t,m,i+"Exit",i+"Exit-"+t]:t?[i,i+"-"+t,i+"Exit",i+"Exit-"+t]:e.append?[i,m,i+"Exit"]:[i,i+"Exit"]}function O(e){let t;return t="document"===e.type?["Document",m,"DocumentExit"]:"root"===e.type?["Root",m,"RootExit"]:v(e),{eventIndex:0,events:t,iterator:0,node:e,visitorIndex:0,visitors:[]}}function b(e){return e[n]=!1,e.nodes&&e.nodes.forEach((e=>b(e))),e}let _={};class y{constructor(e,t,i){let n;if(this.stringified=!1,this.processed=!1,"object"!=typeof t||null===t||"root"!==t.type&&"document"!==t.type)if(t instanceof y||t instanceof h)n=b(t.root),t.map&&(void 0===i.map&&(i.map={}),i.map.inline||(i.map.inline=!1),i.map.prev=t.map);else{let e=c;i.syntax&&(e=i.syntax.parse),i.parser&&(e=i.parser),e.parse&&(e=e.parse);try{n=e(t,i)}catch(e){this.processed=!0,this.error=e}n&&!n[s]&&a.rebuild(n)}else n=b(t);this.result=new h(e,n,i),this.helpers={..._,postcss:_,result:this.result},this.plugins=this.processor.plugins.map((e=>"object"==typeof e&&e.prepare?{...e,...e.prepare(this.result)}:e))}async(){return this.error?Promise.reject(this.error):this.processed?Promise.resolve(this.result):(this.processing||(this.processing=this.runAsync()),this.processing)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}getAsyncError(){throw new Error("Use process(css).then(cb) to work with async plugins")}handleError(e,t){let i=this.result.lastPlugin;try{t&&t.addToError(e),this.error=e,"CssSyntaxError"!==e.name||e.plugin?i.postcssVersion:(e.plugin=i.postcssPlugin,e.setMessage())}catch(e){console&&console.error&&console.error(e)}return e}prepareVisitors(){this.listeners={};let e=(e,t,i)=>{this.listeners[t]||(this.listeners[t]=[]),this.listeners[t].push([e,i])};for(let t of this.plugins)if("object"==typeof t)for(let i in t){if(!p[i]&&/^[A-Z]/.test(i))throw new Error(`Unknown event ${i} in ${t.postcssPlugin}. Try to update PostCSS (${this.processor.version} now).`);if(!f[i])if("object"==typeof t[i])for(let n in t[i])e(t,"*"===n?i:i+"-"+n.toLowerCase(),t[i][n]);else"function"==typeof t[i]&&e(t,i,t[i])}this.hasListener=Object.keys(this.listeners).length>0}async runAsync(){this.plugin=0;for(let e=0;e0;){let e=this.visitTick(t);if(g(e))try{await e}catch(e){let i=t[t.length-1].node;throw this.handleError(e,i)}}}if(this.listeners.OnceExit)for(let[t,i]of this.listeners.OnceExit){this.result.lastPlugin=t;try{if("document"===e.type){let t=e.nodes.map((e=>i(e,this.helpers)));await Promise.all(t)}else await i(e,this.helpers)}catch(e){throw this.handleError(e)}}}return this.processed=!0,this.stringify()}runOnRoot(e){this.result.lastPlugin=e;try{if("object"==typeof e&&e.Once){if("document"===this.result.root.type){let t=this.result.root.nodes.map((t=>e.Once(t,this.helpers)));return g(t[0])?Promise.all(t):t}return e.Once(this.result.root,this.helpers)}if("function"==typeof e)return e(this.result.root,this.result)}catch(e){throw this.handleError(e)}}stringify(){if(this.error)throw this.error;if(this.stringified)return this.result;this.stringified=!0,this.sync();let e=this.result.opts,t=o;e.syntax&&(t=e.syntax.stringify),e.stringifier&&(t=e.stringifier),t.stringify&&(t=t.stringify);let i=new r(t,this.result.root,this.result.opts).generate();return this.result.css=i[0],this.result.map=i[1],this.result}sync(){if(this.error)throw this.error;if(this.processed)return this.result;if(this.processed=!0,this.processing)throw this.getAsyncError();for(let e of this.plugins)if(g(this.runOnRoot(e)))throw this.getAsyncError();if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[n];)e[n]=!0,this.walkSync(e);if(this.listeners.OnceExit)if("document"===e.type)for(let t of e.nodes)this.visitSync(this.listeners.OnceExit,t);else this.visitSync(this.listeners.OnceExit,e)}return this.result}then(e,t){return this.async().then(e,t)}toString(){return this.css}visitSync(e,t){for(let[i,n]of e){let e;this.result.lastPlugin=i;try{e=n(t,this.helpers)}catch(e){throw this.handleError(e,t.proxyOf)}if("root"!==t.type&&"document"!==t.type&&!t.parent)return!0;if(g(e))throw this.getAsyncError()}}visitTick(e){let t=e[e.length-1],{node:i,visitors:s}=t;if("root"!==i.type&&"document"!==i.type&&!i.parent)return void e.pop();if(s.length>0&&t.visitorIndex{e[n]||this.walkSync(e)}));else{let t=this.listeners[i];if(t&&this.visitSync(t,e.toProxy()))return}}warnings(){return this.sync().warnings()}get content(){return this.stringify().content}get css(){return this.stringify().css}get map(){return this.stringify().map}get messages(){return this.sync().messages}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){return this.sync().root}get[Symbol.toStringTag](){return"LazyResult"}}y.registerPostcss=e=>{_=e},e.exports=y,y.default=y,d.registerLazyResult(y),l.registerLazyResult(y)},6065:e=>{"use strict";let t={comma:e=>t.split(e,[","],!0),space:e=>t.split(e,[" ","\n","\t"]),split(e,t,i){let n=[],s="",r=!1,o=0,a=!1,l="",h=!1;for(let i of e)h?h=!1:"\\"===i?h=!0:a?i===l&&(a=!1):'"'===i||"'"===i?(a=!0,l=i):"("===i?o+=1:")"===i?o>0&&(o-=1):0===o&&t.includes(i)&&(r=!0),r?(""!==s&&n.push(s.trim()),s="",r=!1):s+=i;return(i||""!==s)&&n.push(s.trim()),n}};e.exports=t,t.default=t},4342:(e,t,i)=>{"use strict";let{SourceMapConsumer:n,SourceMapGenerator:s}=i(9059),{dirname:r,relative:o,resolve:a,sep:l}=i(2666),{pathToFileURL:h}=i(415),c=i(6970),d=Boolean(n&&s),u=Boolean(r&&a&&o&&l);e.exports=class{constructor(e,t,i,n){this.stringify=e,this.mapOpts=i.map||{},this.root=t,this.opts=i,this.css=n,this.usesFileUrls=!this.mapOpts.from&&this.mapOpts.absolute,this.memoizedFileURLs=new Map,this.memoizedPaths=new Map,this.memoizedURLs=new Map}addAnnotation(){let e;e=this.isInline()?"data:application/json;base64,"+this.toBase64(this.map.toString()):"string"==typeof this.mapOpts.annotation?this.mapOpts.annotation:"function"==typeof this.mapOpts.annotation?this.mapOpts.annotation(this.opts.to,this.root):this.outputFile()+".map";let t="\n";this.css.includes("\r\n")&&(t="\r\n"),this.css+=t+"/*# sourceMappingURL="+e+" */"}applyPrevMaps(){for(let e of this.previous()){let t,i=this.toUrl(this.path(e.file)),s=e.root||r(e.file);!1===this.mapOpts.sourcesContent?(t=new n(e.text),t.sourcesContent&&(t.sourcesContent=t.sourcesContent.map((()=>null)))):t=e.consumer(),this.map.applySourceMap(t,i,this.toUrl(this.path(s)))}}clearAnnotation(){if(!1!==this.mapOpts.annotation)if(this.root){let e;for(let t=this.root.nodes.length-1;t>=0;t--)e=this.root.nodes[t],"comment"===e.type&&0===e.text.indexOf("# sourceMappingURL=")&&this.root.removeChild(t)}else this.css&&(this.css=this.css.replace(/(\n)?\/\*#[\S\s]*?\*\/$/gm,""))}generate(){if(this.clearAnnotation(),u&&d&&this.isMap())return this.generateMap();{let e="";return this.stringify(this.root,(t=>{e+=t})),[e]}}generateMap(){if(this.root)this.generateString();else if(1===this.previous().length){let e=this.previous()[0].consumer();e.file=this.outputFile(),this.map=s.fromSourceMap(e)}else this.map=new s({file:this.outputFile()}),this.map.addMapping({generated:{column:0,line:1},original:{column:0,line:1},source:this.opts.from?this.toUrl(this.path(this.opts.from)):""});return this.isSourcesContent()&&this.setSourcesContent(),this.root&&this.previous().length>0&&this.applyPrevMaps(),this.isAnnotation()&&this.addAnnotation(),this.isInline()?[this.css]:[this.css,this.map]}generateString(){this.css="",this.map=new s({file:this.outputFile()});let e,t,i=1,n=1,r="",o={generated:{column:0,line:0},original:{column:0,line:0},source:""};this.stringify(this.root,((s,a,l)=>{if(this.css+=s,a&&"end"!==l&&(o.generated.line=i,o.generated.column=n-1,a.source&&a.source.start?(o.source=this.sourcePath(a),o.original.line=a.source.start.line,o.original.column=a.source.start.column-1,this.map.addMapping(o)):(o.source=r,o.original.line=1,o.original.column=0,this.map.addMapping(o))),e=s.match(/\n/g),e?(i+=e.length,t=s.lastIndexOf("\n"),n=s.length-t):n+=s.length,a&&"start"!==l){let e=a.parent||{raws:{}};("decl"===a.type||"atrule"===a.type&&!a.nodes)&&a===e.last&&!e.raws.semicolon||(a.source&&a.source.end?(o.source=this.sourcePath(a),o.original.line=a.source.end.line,o.original.column=a.source.end.column-1,o.generated.line=i,o.generated.column=n-2,this.map.addMapping(o)):(o.source=r,o.original.line=1,o.original.column=0,o.generated.line=i,o.generated.column=n-1,this.map.addMapping(o)))}}))}isAnnotation(){return!!this.isInline()||(void 0!==this.mapOpts.annotation?this.mapOpts.annotation:!this.previous().length||this.previous().some((e=>e.annotation)))}isInline(){if(void 0!==this.mapOpts.inline)return this.mapOpts.inline;let e=this.mapOpts.annotation;return(void 0===e||!0===e)&&(!this.previous().length||this.previous().some((e=>e.inline)))}isMap(){return void 0!==this.opts.map?!!this.opts.map:this.previous().length>0}isSourcesContent(){return void 0!==this.mapOpts.sourcesContent?this.mapOpts.sourcesContent:!this.previous().length||this.previous().some((e=>e.withContent()))}outputFile(){return this.opts.to?this.path(this.opts.to):this.opts.from?this.path(this.opts.from):"to.css"}path(e){if(this.mapOpts.absolute)return e;if(60===e.charCodeAt(0))return e;if(/^\w+:\/\//.test(e))return e;let t=this.memoizedPaths.get(e);if(t)return t;let i=this.opts.to?r(this.opts.to):".";"string"==typeof this.mapOpts.annotation&&(i=r(a(i,this.mapOpts.annotation)));let n=o(i,e);return this.memoizedPaths.set(e,n),n}previous(){if(!this.previousMaps)if(this.previousMaps=[],this.root)this.root.walk((e=>{if(e.source&&e.source.input.map){let t=e.source.input.map;this.previousMaps.includes(t)||this.previousMaps.push(t)}}));else{let e=new c(this.css,this.opts);e.map&&this.previousMaps.push(e.map)}return this.previousMaps}setSourcesContent(){let e={};if(this.root)this.root.walk((t=>{if(t.source){let i=t.source.input.from;if(i&&!e[i]){e[i]=!0;let n=this.usesFileUrls?this.toFileUrl(i):this.toUrl(this.path(i));this.map.setSourceContent(n,t.source.input.css)}}}));else if(this.css){let e=this.opts.from?this.toUrl(this.path(this.opts.from)):"";this.map.setSourceContent(e,this.css)}}sourcePath(e){return this.mapOpts.from?this.toUrl(this.mapOpts.from):this.usesFileUrls?this.toFileUrl(e.source.input.from):this.toUrl(this.path(e.source.input.from))}toBase64(e){return Buffer?Buffer.from(e).toString("base64"):window.btoa(unescape(encodeURIComponent(e)))}toFileUrl(e){let t=this.memoizedFileURLs.get(e);if(t)return t;if(h){let t=h(e).toString();return this.memoizedFileURLs.set(e,t),t}throw new Error("`map.absolute` option is not available in this PostCSS build")}toUrl(e){let t=this.memoizedURLs.get(e);if(t)return t;"\\"===l&&(e=e.replace(/\\/g,"/"));let i=encodeURI(e).replace(/[#?]/g,encodeURIComponent);return this.memoizedURLs.set(e,i),i}}},7744:(e,t,i)=>{"use strict";let n=i(4342),s=i(9573),r=(i(5411),i(6214));const o=i(165);class a{constructor(e,t,i){let r;t=t.toString(),this.stringified=!1,this._processor=e,this._css=t,this._opts=i,this._map=void 0;let a=s;this.result=new o(this._processor,r,this._opts),this.result.css=t;let l=this;Object.defineProperty(this.result,"root",{get:()=>l.root});let h=new n(a,r,this._opts,t);if(h.isMap()){let[e,t]=h.generate();e&&(this.result.css=e),t&&(this.result.map=t)}}async(){return this.error?Promise.reject(this.error):Promise.resolve(this.result)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}sync(){if(this.error)throw this.error;return this.result}then(e,t){return this.async().then(e,t)}toString(){return this._css}warnings(){return[]}get content(){return this.result.css}get css(){return this.result.css}get map(){return this.result.map}get messages(){return[]}get opts(){return this.result.opts}get processor(){return this.result.processor}get root(){if(this._root)return this._root;let e,t=r;try{e=t(this._css,this._opts)}catch(e){this.error=e}if(this.error)throw this.error;return this._root=e,e}get[Symbol.toStringTag](){return"NoWorkResult"}}e.exports=a,a.default=a},322:(e,t,i)=>{"use strict";let{isClean:n,my:s}=i(2450),r=i(2604),o=i(9906),a=i(9573);function l(e,t){let i=new e.constructor;for(let n in e){if(!Object.prototype.hasOwnProperty.call(e,n))continue;if("proxyCache"===n)continue;let s=e[n],r=typeof s;"parent"===n&&"object"===r?t&&(i[n]=t):"source"===n?i[n]=s:Array.isArray(s)?i[n]=s.map((e=>l(e,i))):("object"===r&&null!==s&&(s=l(s)),i[n]=s)}return i}class h{constructor(e={}){this.raws={},this[n]=!1,this[s]=!0;for(let t in e)if("nodes"===t){this.nodes=[];for(let i of e[t])"function"==typeof i.clone?this.append(i.clone()):this.append(i)}else this[t]=e[t]}addToError(e){if(e.postcssNode=this,e.stack&&this.source&&/\n\s{4}at /.test(e.stack)){let t=this.source;e.stack=e.stack.replace(/\n\s{4}at /,`$&${t.input.from}:${t.start.line}:${t.start.column}$&`)}return e}after(e){return this.parent.insertAfter(this,e),this}assign(e={}){for(let t in e)this[t]=e[t];return this}before(e){return this.parent.insertBefore(this,e),this}cleanRaws(e){delete this.raws.before,delete this.raws.after,e||delete this.raws.between}clone(e={}){let t=l(this);for(let i in e)t[i]=e[i];return t}cloneAfter(e={}){let t=this.clone(e);return this.parent.insertAfter(this,t),t}cloneBefore(e={}){let t=this.clone(e);return this.parent.insertBefore(this,t),t}error(e,t={}){if(this.source){let{end:i,start:n}=this.rangeBy(t);return this.source.input.error(e,{column:n.column,line:n.line},{column:i.column,line:i.line},t)}return new r(e)}getProxyProcessor(){return{get:(e,t)=>"proxyOf"===t?e:"root"===t?()=>e.root().toProxy():e[t],set:(e,t,i)=>(e[t]===i||(e[t]=i,"prop"!==t&&"value"!==t&&"name"!==t&&"params"!==t&&"important"!==t&&"text"!==t||e.markDirty()),!0)}}markDirty(){if(this[n]){this[n]=!1;let e=this;for(;e=e.parent;)e[n]=!1}}next(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e+1]}positionBy(e,t){let i=this.source.start;if(e.index)i=this.positionInside(e.index,t);else if(e.word){let n=(t=this.toString()).indexOf(e.word);-1!==n&&(i=this.positionInside(n,t))}return i}positionInside(e,t){let i=t||this.toString(),n=this.source.start.column,s=this.source.start.line;for(let t=0;t"object"==typeof e&&e.toJSON?e.toJSON(null,t):e));else if("object"==typeof n&&n.toJSON)i[e]=n.toJSON(null,t);else if("source"===e){let r=t.get(n.input);null==r&&(r=s,t.set(n.input,s),s++),i[e]={end:n.end,inputId:r,start:n.start}}else i[e]=n}return n&&(i.inputs=[...t.keys()].map((e=>e.toJSON()))),i}toProxy(){return this.proxyCache||(this.proxyCache=new Proxy(this,this.getProxyProcessor())),this.proxyCache}toString(e=a){e.stringify&&(e=e.stringify);let t="";return e(this,(e=>{t+=e})),t}warn(e,t,i){let n={node:this};for(let e in i)n[e]=i[e];return e.warn(t,n)}get proxyOf(){return this}}e.exports=h,h.default=h},6214:(e,t,i)=>{"use strict";let n=i(9930),s=i(6992),r=i(6970);function o(e,t){let i=new r(e,t),n=new s(i);try{n.parse()}catch(e){throw e}return n.root}e.exports=o,o.default=o,n.registerParse(o)},6992:(e,t,i)=>{"use strict";let n=i(9026),s=i(9985),r=i(1044),o=i(7983),a=i(4539),l=i(4146);const h={empty:!0,space:!0};e.exports=class{constructor(e){this.input=e,this.root=new a,this.current=this.root,this.spaces="",this.semicolon=!1,this.customProperty=!1,this.createTokenizer(),this.root.source={input:e,start:{column:1,line:1,offset:0}}}atrule(e){let t,i,n,s=new o;s.name=e[1].slice(1),""===s.name&&this.unnamedAtrule(s,e),this.init(s,e[2]);let r=!1,a=!1,l=[],h=[];for(;!this.tokenizer.endOfFile();){if(t=(e=this.tokenizer.nextToken())[0],"("===t||"["===t?h.push("("===t?")":"]"):"{"===t&&h.length>0?h.push("}"):t===h[h.length-1]&&h.pop(),0===h.length){if(";"===t){s.source.end=this.getPosition(e[2]),s.source.end.offset++,this.semicolon=!0;break}if("{"===t){a=!0;break}if("}"===t){if(l.length>0){for(n=l.length-1,i=l[n];i&&"space"===i[0];)i=l[--n];i&&(s.source.end=this.getPosition(i[3]||i[2]),s.source.end.offset++)}this.end(e);break}l.push(e)}else l.push(e);if(this.tokenizer.endOfFile()){r=!0;break}}s.raws.between=this.spacesAndCommentsFromEnd(l),l.length?(s.raws.afterName=this.spacesAndCommentsFromStart(l),this.raw(s,"params",l),r&&(e=l[l.length-1],s.source.end=this.getPosition(e[3]||e[2]),s.source.end.offset++,this.spaces=s.raws.between,s.raws.between="")):(s.raws.afterName="",s.params=""),a&&(s.nodes=[],this.current=s)}checkMissedSemicolon(e){let t=this.colon(e);if(!1===t)return;let i,n=0;for(let s=t-1;s>=0&&(i=e[s],"space"===i[0]||(n+=1,2!==n));s--);throw this.input.error("Missed semicolon","word"===i[0]?i[3]+1:i[2])}colon(e){let t,i,n,s=0;for(let[r,o]of e.entries()){if(t=o,i=t[0],"("===i&&(s+=1),")"===i&&(s-=1),0===s&&":"===i){if(n){if("word"===n[0]&&"progid"===n[1])continue;return r}this.doubleColon(t)}n=t}return!1}comment(e){let t=new r;this.init(t,e[2]),t.source.end=this.getPosition(e[3]||e[2]),t.source.end.offset++;let i=e[1].slice(2,-2);if(/^\s*$/.test(i))t.text="",t.raws.left=i,t.raws.right="";else{let e=i.match(/^(\s*)([^]*\S)(\s*)$/);t.text=e[2],t.raws.left=e[1],t.raws.right=e[3]}}createTokenizer(){this.tokenizer=s(this.input)}decl(e,t){let i=new n;this.init(i,e[0][2]);let s,r=e[e.length-1];for(";"===r[0]&&(this.semicolon=!0,e.pop()),i.source.end=this.getPosition(r[3]||r[2]||function(e){for(let t=e.length-1;t>=0;t--){let i=e[t],n=i[3]||i[2];if(n)return n}}(e)),i.source.end.offset++;"word"!==e[0][0];)1===e.length&&this.unknownWord(e),i.raws.before+=e.shift()[1];for(i.source.start=this.getPosition(e[0][2]),i.prop="";e.length;){let t=e[0][0];if(":"===t||"space"===t||"comment"===t)break;i.prop+=e.shift()[1]}for(i.raws.between="";e.length;){if(s=e.shift(),":"===s[0]){i.raws.between+=s[1];break}"word"===s[0]&&/\w/.test(s[1])&&this.unknownWord([s]),i.raws.between+=s[1]}"_"!==i.prop[0]&&"*"!==i.prop[0]||(i.raws.before+=i.prop[0],i.prop=i.prop.slice(1));let o,a=[];for(;e.length&&(o=e[0][0],"space"===o||"comment"===o);)a.push(e.shift());this.precheckMissedSemicolon(e);for(let t=e.length-1;t>=0;t--){if(s=e[t],"!important"===s[1].toLowerCase()){i.important=!0;let n=this.stringFrom(e,t);n=this.spacesFromEnd(e)+n," !important"!==n&&(i.raws.important=n);break}if("important"===s[1].toLowerCase()){let n=e.slice(0),s="";for(let e=t;e>0;e--){let t=n[e][0];if(0===s.trim().indexOf("!")&&"space"!==t)break;s=n.pop()[1]+s}0===s.trim().indexOf("!")&&(i.important=!0,i.raws.important=s,e=n)}if("space"!==s[0]&&"comment"!==s[0])break}e.some((e=>"space"!==e[0]&&"comment"!==e[0]))&&(i.raws.between+=a.map((e=>e[1])).join(""),a=[]),this.raw(i,"value",a.concat(e),t),i.value.includes(":")&&!t&&this.checkMissedSemicolon(e)}doubleColon(e){throw this.input.error("Double colon",{offset:e[2]},{offset:e[2]+e[1].length})}emptyRule(e){let t=new l;this.init(t,e[2]),t.selector="",t.raws.between="",this.current=t}end(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.spaces="",this.current.parent?(this.current.source.end=this.getPosition(e[2]),this.current.source.end.offset++,this.current=this.current.parent):this.unexpectedClose(e)}endFile(){this.current.parent&&this.unclosedBlock(),this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.root.source.end=this.getPosition(this.tokenizer.position())}freeSemicolon(e){if(this.spaces+=e[1],this.current.nodes){let e=this.current.nodes[this.current.nodes.length-1];e&&"rule"===e.type&&!e.raws.ownSemicolon&&(e.raws.ownSemicolon=this.spaces,this.spaces="")}}getPosition(e){let t=this.input.fromOffset(e);return{column:t.col,line:t.line,offset:e}}init(e,t){this.current.push(e),e.source={input:this.input,start:this.getPosition(t)},e.raws.before=this.spaces,this.spaces="","comment"!==e.type&&(this.semicolon=!1)}other(e){let t=!1,i=null,n=!1,s=null,r=[],o=e[1].startsWith("--"),a=[],l=e;for(;l;){if(i=l[0],a.push(l),"("===i||"["===i)s||(s=l),r.push("("===i?")":"]");else if(o&&n&&"{"===i)s||(s=l),r.push("}");else if(0===r.length){if(";"===i){if(n)return void this.decl(a,o);break}if("{"===i)return void this.rule(a);if("}"===i){this.tokenizer.back(a.pop()),t=!0;break}":"===i&&(n=!0)}else i===r[r.length-1]&&(r.pop(),0===r.length&&(s=null));l=this.tokenizer.nextToken()}if(this.tokenizer.endOfFile()&&(t=!0),r.length>0&&this.unclosedBracket(s),t&&n){if(!o)for(;a.length&&(l=a[a.length-1][0],"space"===l||"comment"===l);)this.tokenizer.back(a.pop());this.decl(a,o)}else this.unknownWord(a)}parse(){let e;for(;!this.tokenizer.endOfFile();)switch(e=this.tokenizer.nextToken(),e[0]){case"space":this.spaces+=e[1];break;case";":this.freeSemicolon(e);break;case"}":this.end(e);break;case"comment":this.comment(e);break;case"at-word":this.atrule(e);break;case"{":this.emptyRule(e);break;default:this.other(e)}this.endFile()}precheckMissedSemicolon(){}raw(e,t,i,n){let s,r,o,a,l=i.length,c="",d=!0;for(let e=0;ee+t[1]),"");e.raws[t]={raw:n,value:c}}e[t]=c}rule(e){e.pop();let t=new l;this.init(t,e[0][2]),t.raws.between=this.spacesAndCommentsFromEnd(e),this.raw(t,"selector",e),this.current=t}spacesAndCommentsFromEnd(e){let t,i="";for(;e.length&&(t=e[e.length-1][0],"space"===t||"comment"===t);)i=e.pop()[1]+i;return i}spacesAndCommentsFromStart(e){let t,i="";for(;e.length&&(t=e[0][0],"space"===t||"comment"===t);)i+=e.shift()[1];return i}spacesFromEnd(e){let t,i="";for(;e.length&&(t=e[e.length-1][0],"space"===t);)i=e.pop()[1]+i;return i}stringFrom(e,t){let i="";for(let n=t;n{"use strict";let n=i(2604),s=i(9026),r=i(427),o=i(9930),a=i(540),l=i(9573),h=i(4899),c=i(2900),d=i(860),u=i(1044),p=i(7983),f=i(165),m=i(6970),g=i(6214),v=i(6065),O=i(4146),b=i(4539),_=i(322);function y(...e){return 1===e.length&&Array.isArray(e[0])&&(e=e[0]),new a(e)}y.plugin=function(e,t){let i,n=!1;function s(...i){console&&console.warn&&!n&&(n=!0,console.warn(e+": postcss.plugin was deprecated. Migration guide:\nhttps://evilmartians.com/chronicles/postcss-8-plugin-migration"),{}.LANG&&{}.LANG.startsWith("cn")&&console.warn(e+": ้‡Œ้ข postcss.plugin ่ขซๅผƒ็”จ. ่ฟ็งปๆŒ‡ๅ—:\nhttps://www.w3ctech.com/topic/2226"));let s=t(...i);return s.postcssPlugin=e,s.postcssVersion=(new a).version,s}return Object.defineProperty(s,"postcss",{get:()=>(i||(i=s()),i)}),s.process=function(e,t,i){return y([s(i)]).process(e,t)},s},y.stringify=l,y.parse=g,y.fromJSON=h,y.list=v,y.comment=e=>new u(e),y.atRule=e=>new p(e),y.decl=e=>new s(e),y.rule=e=>new O(e),y.root=e=>new b(e),y.document=e=>new c(e),y.CssSyntaxError=n,y.Declaration=s,y.Container=o,y.Processor=a,y.Document=c,y.Comment=u,y.Warning=d,y.AtRule=p,y.Result=f,y.Input=m,y.Rule=O,y.Root=b,y.Node=_,r.registerPostcss(y),e.exports=y,y.default=y},2764:(e,t,i)=>{"use strict";let{SourceMapConsumer:n,SourceMapGenerator:s}=i(9059),{existsSync:r,readFileSync:o}=i(1336),{dirname:a,join:l}=i(2666);class h{constructor(e,t){if(!1===t.map)return;this.loadAnnotation(e),this.inline=this.startWith(this.annotation,"data:");let i=t.map?t.map.prev:void 0,n=this.loadMap(t.from,i);!this.mapFile&&t.from&&(this.mapFile=t.from),this.mapFile&&(this.root=a(this.mapFile)),n&&(this.text=n)}consumer(){return this.consumerCache||(this.consumerCache=new n(this.text)),this.consumerCache}decodeInline(e){if(/^data:application\/json;charset=utf-?8,/.test(e)||/^data:application\/json,/.test(e))return decodeURIComponent(e.substr(RegExp.lastMatch.length));if(/^data:application\/json;charset=utf-?8;base64,/.test(e)||/^data:application\/json;base64,/.test(e))return t=e.substr(RegExp.lastMatch.length),Buffer?Buffer.from(t,"base64").toString():window.atob(t);var t;let i=e.match(/data:application\/json;([^,]+),/)[1];throw new Error("Unsupported source map encoding "+i)}getAnnotationURL(e){return e.replace(/^\/\*\s*# sourceMappingURL=/,"").trim()}isMap(e){return"object"==typeof e&&("string"==typeof e.mappings||"string"==typeof e._mappings||Array.isArray(e.sections))}loadAnnotation(e){let t=e.match(/\/\*\s*# sourceMappingURL=/gm);if(!t)return;let i=e.lastIndexOf(t.pop()),n=e.indexOf("*/",i);i>-1&&n>-1&&(this.annotation=this.getAnnotationURL(e.substring(i,n)))}loadFile(e){if(this.root=a(e),r(e))return this.mapFile=e,o(e,"utf-8").toString().trim()}loadMap(e,t){if(!1===t)return!1;if(t){if("string"==typeof t)return t;if("function"!=typeof t){if(t instanceof n)return s.fromSourceMap(t).toString();if(t instanceof s)return t.toString();if(this.isMap(t))return JSON.stringify(t);throw new Error("Unsupported previous source map format: "+t.toString())}{let i=t(e);if(i){let e=this.loadFile(i);if(!e)throw new Error("Unable to load previous source map: "+i.toString());return e}}}else{if(this.inline)return this.decodeInline(this.annotation);if(this.annotation){let t=this.annotation;return e&&(t=l(a(e),t)),this.loadFile(t)}}}startWith(e,t){return!!e&&e.substr(0,t.length)===t}withContent(){return!!(this.consumer().sourcesContent&&this.consumer().sourcesContent.length>0)}}e.exports=h,h.default=h},540:(e,t,i)=>{"use strict";let n=i(7744),s=i(427),r=i(2900),o=i(4539);class a{constructor(e=[]){this.version="8.4.31",this.plugins=this.normalize(e)}normalize(e){let t=[];for(let i of e)if(!0===i.postcss?i=i():i.postcss&&(i=i.postcss),"object"==typeof i&&Array.isArray(i.plugins))t=t.concat(i.plugins);else if("object"==typeof i&&i.postcssPlugin)t.push(i);else if("function"==typeof i)t.push(i);else if("object"!=typeof i||!i.parse&&!i.stringify)throw new Error(i+" is not a PostCSS plugin");return t}process(e,t={}){return 0===this.plugins.length&&void 0===t.parser&&void 0===t.stringifier&&void 0===t.syntax?new n(this,e,t):new s(this,e,t)}use(e){return this.plugins=this.plugins.concat(this.normalize([e])),this}}e.exports=a,a.default=a,o.registerProcessor(a),r.registerProcessor(a)},165:(e,t,i)=>{"use strict";let n=i(860);class s{constructor(e,t,i){this.processor=e,this.messages=[],this.root=t,this.opts=i,this.css=void 0,this.map=void 0}toString(){return this.css}warn(e,t={}){t.plugin||this.lastPlugin&&this.lastPlugin.postcssPlugin&&(t.plugin=this.lastPlugin.postcssPlugin);let i=new n(e,t);return this.messages.push(i),i}warnings(){return this.messages.filter((e=>"warning"===e.type))}get content(){return this.css}}e.exports=s,s.default=s},4539:(e,t,i)=>{"use strict";let n,s,r=i(9930);class o extends r{constructor(e){super(e),this.type="root",this.nodes||(this.nodes=[])}normalize(e,t,i){let n=super.normalize(e);if(t)if("prepend"===i)this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t)for(let e of n)e.raws.before=t.raws.before;return n}removeChild(e,t){let i=this.index(e);return!t&&0===i&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[i].raws.before),super.removeChild(e)}toResult(e={}){return new n(new s,this,e).stringify()}}o.registerLazyResult=e=>{n=e},o.registerProcessor=e=>{s=e},e.exports=o,o.default=o,r.registerRoot(o)},4146:(e,t,i)=>{"use strict";let n=i(9930),s=i(6065);class r extends n{constructor(e){super(e),this.type="rule",this.nodes||(this.nodes=[])}get selectors(){return s.comma(this.selector)}set selectors(e){let t=this.selector?this.selector.match(/,\s*/):null,i=t?t[0]:","+this.raw("between","beforeOpen");this.selector=e.join(i)}}e.exports=r,r.default=r,n.registerRule(r)},9906:e=>{"use strict";const t={after:"\n",beforeClose:"\n",beforeComment:"\n",beforeDecl:"\n",beforeOpen:" ",beforeRule:"\n",colon:": ",commentLeft:" ",commentRight:" ",emptyBody:"",indent:" ",semicolon:!1};class i{constructor(e){this.builder=e}atrule(e,t){let i="@"+e.name,n=e.params?this.rawValue(e,"params"):"";if(void 0!==e.raws.afterName?i+=e.raws.afterName:n&&(i+=" "),e.nodes)this.block(e,i+n);else{let s=(e.raws.between||"")+(t?";":"");this.builder(i+n+s,e)}}beforeAfter(e,t){let i;i="decl"===e.type?this.raw(e,null,"beforeDecl"):"comment"===e.type?this.raw(e,null,"beforeComment"):"before"===t?this.raw(e,null,"beforeRule"):this.raw(e,null,"beforeClose");let n=e.parent,s=0;for(;n&&"root"!==n.type;)s+=1,n=n.parent;if(i.includes("\n")){let t=this.raw(e,null,"indent");if(t.length)for(let e=0;e0&&"comment"===e.nodes[t].type;)t-=1;let i=this.raw(e,"semicolon");for(let n=0;n{if(s=e.raws[i],void 0!==s)return!1}))}var a;return void 0===s&&(s=t[n]),o.rawCache[n]=s,s}rawBeforeClose(e){let t;return e.walk((e=>{if(e.nodes&&e.nodes.length>0&&void 0!==e.raws.after)return t=e.raws.after,t.includes("\n")&&(t=t.replace(/[^\n]+$/,"")),!1})),t&&(t=t.replace(/\S/g,"")),t}rawBeforeComment(e,t){let i;return e.walkComments((e=>{if(void 0!==e.raws.before)return i=e.raws.before,i.includes("\n")&&(i=i.replace(/[^\n]+$/,"")),!1})),void 0===i?i=this.raw(t,null,"beforeDecl"):i&&(i=i.replace(/\S/g,"")),i}rawBeforeDecl(e,t){let i;return e.walkDecls((e=>{if(void 0!==e.raws.before)return i=e.raws.before,i.includes("\n")&&(i=i.replace(/[^\n]+$/,"")),!1})),void 0===i?i=this.raw(t,null,"beforeRule"):i&&(i=i.replace(/\S/g,"")),i}rawBeforeOpen(e){let t;return e.walk((e=>{if("decl"!==e.type&&(t=e.raws.between,void 0!==t))return!1})),t}rawBeforeRule(e){let t;return e.walk((i=>{if(i.nodes&&(i.parent!==e||e.first!==i)&&void 0!==i.raws.before)return t=i.raws.before,t.includes("\n")&&(t=t.replace(/[^\n]+$/,"")),!1})),t&&(t=t.replace(/\S/g,"")),t}rawColon(e){let t;return e.walkDecls((e=>{if(void 0!==e.raws.between)return t=e.raws.between.replace(/[^\s:]/g,""),!1})),t}rawEmptyBody(e){let t;return e.walk((e=>{if(e.nodes&&0===e.nodes.length&&(t=e.raws.after,void 0!==t))return!1})),t}rawIndent(e){if(e.raws.indent)return e.raws.indent;let t;return e.walk((i=>{let n=i.parent;if(n&&n!==e&&n.parent&&n.parent===e&&void 0!==i.raws.before){let e=i.raws.before.split("\n");return t=e[e.length-1],t=t.replace(/\S/g,""),!1}})),t}rawSemicolon(e){let t;return e.walk((e=>{if(e.nodes&&e.nodes.length&&"decl"===e.last.type&&(t=e.raws.semicolon,void 0!==t))return!1})),t}rawValue(e,t){let i=e[t],n=e.raws[t];return n&&n.value===i?n.raw:i}root(e){this.body(e),e.raws.after&&this.builder(e.raws.after)}rule(e){this.block(e,this.rawValue(e,"selector")),e.raws.ownSemicolon&&this.builder(e.raws.ownSemicolon,e,"end")}stringify(e,t){if(!this[e.type])throw new Error("Unknown AST node type "+e.type+". Maybe you need to change PostCSS stringifier.");this[e.type](e,t)}}e.exports=i,i.default=i},9573:(e,t,i)=>{"use strict";let n=i(9906);function s(e,t){new n(t).stringify(e)}e.exports=s,s.default=s},2450:e=>{"use strict";e.exports.isClean=Symbol("isClean"),e.exports.my=Symbol("my")},9985:e=>{"use strict";const t="'".charCodeAt(0),i='"'.charCodeAt(0),n="\\".charCodeAt(0),s="/".charCodeAt(0),r="\n".charCodeAt(0),o=" ".charCodeAt(0),a="\f".charCodeAt(0),l="\t".charCodeAt(0),h="\r".charCodeAt(0),c="[".charCodeAt(0),d="]".charCodeAt(0),u="(".charCodeAt(0),p=")".charCodeAt(0),f="{".charCodeAt(0),m="}".charCodeAt(0),g=";".charCodeAt(0),v="*".charCodeAt(0),O=":".charCodeAt(0),b="@".charCodeAt(0),_=/[\t\n\f\r "#'()/;[\\\]{}]/g,y=/[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g,w=/.[\r\n"'(/\\]/,x=/[\da-f]/i;e.exports=function(e,S={}){let k,T,C,P,M,E,A,R,D,I,q=e.css.valueOf(),L=S.ignoreErrors,N=q.length,B=0,$=[],Q=[];function z(t){throw e.error("Unclosed "+t,B)}return{back:function(e){Q.push(e)},endOfFile:function(){return 0===Q.length&&B>=N},nextToken:function(e){if(Q.length)return Q.pop();if(B>=N)return;let S=!!e&&e.ignoreUnclosed;switch(k=q.charCodeAt(B),k){case r:case o:case l:case h:case a:T=B;do{T+=1,k=q.charCodeAt(T)}while(k===o||k===r||k===l||k===h||k===a);I=["space",q.slice(B,T)],B=T-1;break;case c:case d:case f:case m:case O:case g:case p:{let e=String.fromCharCode(k);I=[e,e,B];break}case u:if(R=$.length?$.pop()[1]:"",D=q.charCodeAt(B+1),"url"===R&&D!==t&&D!==i&&D!==o&&D!==r&&D!==l&&D!==a&&D!==h){T=B;do{if(E=!1,T=q.indexOf(")",T+1),-1===T){if(L||S){T=B;break}z("bracket")}for(A=T;q.charCodeAt(A-1)===n;)A-=1,E=!E}while(E);I=["brackets",q.slice(B,T+1),B,T],B=T}else T=q.indexOf(")",B+1),P=q.slice(B,T+1),-1===T||w.test(P)?I=["(","(",B]:(I=["brackets",P,B,T],B=T);break;case t:case i:C=k===t?"'":'"',T=B;do{if(E=!1,T=q.indexOf(C,T+1),-1===T){if(L||S){T=B+1;break}z("string")}for(A=T;q.charCodeAt(A-1)===n;)A-=1,E=!E}while(E);I=["string",q.slice(B,T+1),B,T],B=T;break;case b:_.lastIndex=B+1,_.test(q),T=0===_.lastIndex?q.length-1:_.lastIndex-2,I=["at-word",q.slice(B,T+1),B,T],B=T;break;case n:for(T=B,M=!0;q.charCodeAt(T+1)===n;)T+=1,M=!M;if(k=q.charCodeAt(T+1),M&&k!==s&&k!==o&&k!==r&&k!==l&&k!==h&&k!==a&&(T+=1,x.test(q.charAt(T)))){for(;x.test(q.charAt(T+1));)T+=1;q.charCodeAt(T+1)===o&&(T+=1)}I=["word",q.slice(B,T+1),B,T],B=T;break;default:k===s&&q.charCodeAt(B+1)===v?(T=q.indexOf("*/",B+2)+1,0===T&&(L||S?T=q.length:z("comment")),I=["comment",q.slice(B,T+1),B,T],B=T):(y.lastIndex=B+1,y.test(q),T=0===y.lastIndex?q.length-1:y.lastIndex-2,I=["word",q.slice(B,T+1),B,T],$.push(I),B=T)}return B++,I},position:function(){return B}}}},5411:e=>{"use strict";let t={};e.exports=function(e){t[e]||(t[e]=!0,"undefined"!=typeof console&&console.warn&&console.warn(e))}},860:e=>{"use strict";class t{constructor(e,t={}){if(this.type="warning",this.text=e,t.node&&t.node.source){let e=t.node.rangeBy(t);this.line=e.start.line,this.column=e.start.column,this.endLine=e.end.line,this.endColumn=e.end.column}for(let e in t)this[e]=t[e]}toString(){return this.node?this.node.error(this.text,{index:this.index,plugin:this.plugin,word:this.word}).message:this.plugin?this.plugin+": "+this.text:this.text}}e.exports=t,t.default=t},8878:(e,t)=>{"use strict";var i=Object.prototype.hasOwnProperty;function n(e){try{return decodeURIComponent(e.replace(/\+/g," "))}catch(e){return null}}function s(e){try{return encodeURIComponent(e)}catch(e){return null}}t.stringify=function(e,t){t=t||"";var n,r,o=[];for(r in"string"!=typeof t&&(t="?"),e)if(i.call(e,r)){if((n=e[r])||null!=n&&!isNaN(n)||(n=""),r=s(r),n=s(n),null===r||null===n)continue;o.push(r+"="+n)}return o.length?t+o.join("&"):""},t.parse=function(e){for(var t,i=/([^=?#&]+)=?([^&]*)/g,s={};t=i.exec(e);){var r=n(t[1]),o=n(t[2]);null===r||null===o||r in s||(s[r]=o)}return s}},1384:e=>{"use strict";e.exports=function(e,t){if(t=t.split(":")[0],!(e=+e))return!1;switch(t){case"http":case"ws":return 80!==e;case"https":case"wss":return 443!==e;case"ftp":return 21!==e;case"gopher":return 70!==e;case"file":return!1}return 0!==e}},1622:(e,t,i)=>{const n=i(1659),s=i(3419),{isPlainObject:r}=i(3056),o=i(2454),a=i(9382),{parse:l}=i(5356),h=["img","audio","video","picture","svg","object","map","iframe","embed"],c=["script","style"];function d(e,t){e&&Object.keys(e).forEach((function(i){t(e[i],i)}))}function u(e,t){return{}.hasOwnProperty.call(e,t)}function p(e,t){const i=[];return d(e,(function(e){t(e)&&i.push(e)})),i}e.exports=m;const f=/^[^\0\t\n\f\r /<=>]+$/;function m(e,t,i){if(null==e)return"";let v="",O="";function b(e,t){const i=this;this.tag=e,this.attribs=t||{},this.tagPosition=v.length,this.text="",this.mediaChildren=[],this.updateParentNodeText=function(){M.length&&(M[M.length-1].text+=i.text)},this.updateParentNodeMediaChildren=function(){M.length&&h.includes(this.tag)&&M[M.length-1].mediaChildren.push(this.tag)}}(t=Object.assign({},m.defaults,t)).parser=Object.assign({},g,t.parser),c.forEach((function(e){!1!==t.allowedTags&&(t.allowedTags||[]).indexOf(e)>-1&&!t.allowVulnerableTags&&console.warn(`\n\nโš ๏ธ Your \`allowedTags\` option includes, \`${e}\`, which is inherently\nvulnerable to XSS attacks. Please remove it from \`allowedTags\`.\nOr, to disable this warning, add the \`allowVulnerableTags\` option\nand ensure you are accounting for this risk.\n\n`)}));const _=t.nonTextTags||["script","style","textarea","option"];let y,w;t.allowedAttributes&&(y={},w={},d(t.allowedAttributes,(function(e,t){y[t]=[];const i=[];e.forEach((function(e){"string"==typeof e&&e.indexOf("*")>=0?i.push(s(e).replace(/\\\*/g,".*")):y[t].push(e)})),i.length&&(w[t]=new RegExp("^("+i.join("|")+")$"))})));const x={},S={},k={};d(t.allowedClasses,(function(e,t){y&&(u(y,t)||(y[t]=[]),y[t].push("class")),x[t]=[],k[t]=[];const i=[];e.forEach((function(e){"string"==typeof e&&e.indexOf("*")>=0?i.push(s(e).replace(/\\\*/g,".*")):e instanceof RegExp?k[t].push(e):x[t].push(e)})),i.length&&(S[t]=new RegExp("^("+i.join("|")+")$"))}));const T={};let C,P,M,E,A,R,D;d(t.transformTags,(function(e,t){let i;"function"==typeof e?i=e:"string"==typeof e&&(i=m.simpleTransform(e)),"*"===t?C=i:T[t]=i}));let I=!1;L();const q=new n.Parser({onopentag:function(e,i){if(t.enforceHtmlBoundary&&"html"===e&&L(),R)return void D++;const n=new b(e,i);M.push(n);let s=!1;const h=!!n.text;let c;if(u(T,e)&&(c=T[e](e,i),n.attribs=i=c.attribs,void 0!==c.text&&(n.innerText=c.text),e!==c.tagName&&(n.name=e=c.tagName,A[P]=c.tagName)),C&&(c=C(e,i),n.attribs=i=c.attribs,e!==c.tagName&&(n.name=e=c.tagName,A[P]=c.tagName)),(!1!==t.allowedTags&&-1===(t.allowedTags||[]).indexOf(e)||"recursiveEscape"===t.disallowedTagsMode&&!function(e){for(const t in e)if(u(e,t))return!1;return!0}(E)||null!=t.nestingLimit&&P>=t.nestingLimit)&&(s=!0,E[P]=!0,"discard"===t.disallowedTagsMode&&-1!==_.indexOf(e)&&(R=!0,D=1),E[P]=!0),P++,s){if("discard"===t.disallowedTagsMode)return;O=v,v=""}v+="<"+e,"script"===e&&(t.allowedScriptHostnames||t.allowedScriptDomains)&&(n.innerText=""),(!y||u(y,e)||y["*"])&&d(i,(function(i,s){if(!f.test(s))return void delete n.attribs[s];let h=!1;if(!y||u(y,e)&&-1!==y[e].indexOf(s)||y["*"]&&-1!==y["*"].indexOf(s)||u(w,e)&&w[e].test(s)||w["*"]&&w["*"].test(s))h=!0;else if(y&&y[e])for(const t of y[e])if(r(t)&&t.name&&t.name===s){h=!0;let e="";if(!0===t.multiple){const n=i.split(" ");for(const i of n)-1!==t.values.indexOf(i)&&(""===e?e=i:e+=" "+i)}else t.values.indexOf(i)>=0&&(e=i);i=e}if(h){if(-1!==t.allowedSchemesAppliedToAttributes.indexOf(s)&&B(e,i))return void delete n.attribs[s];if("script"===e&&"src"===s){let e=!0;try{const n=$(i);if(t.allowedScriptHostnames||t.allowedScriptDomains){const i=(t.allowedScriptHostnames||[]).find((function(e){return e===n.url.hostname})),s=(t.allowedScriptDomains||[]).find((function(e){return n.url.hostname===e||n.url.hostname.endsWith(`.${e}`)}));e=i||s}}catch(t){e=!1}if(!e)return void delete n.attribs[s]}if("iframe"===e&&"src"===s){let e=!0;try{const n=$(i);if(n.isRelativeUrl)e=u(t,"allowIframeRelativeUrls")?t.allowIframeRelativeUrls:!t.allowedIframeHostnames&&!t.allowedIframeDomains;else if(t.allowedIframeHostnames||t.allowedIframeDomains){const i=(t.allowedIframeHostnames||[]).find((function(e){return e===n.url.hostname})),s=(t.allowedIframeDomains||[]).find((function(e){return n.url.hostname===e||n.url.hostname.endsWith(`.${e}`)}));e=i||s}}catch(t){e=!1}if(!e)return void delete n.attribs[s]}if("srcset"===s)try{let e=a(i);if(e.forEach((function(e){B("srcset",e.url)&&(e.evil=!0)})),e=p(e,(function(e){return!e.evil})),!e.length)return void delete n.attribs[s];i=p(e,(function(e){return!e.evil})).map((function(e){if(!e.url)throw new Error("URL missing");return e.url+(e.w?` ${e.w}w`:"")+(e.h?` ${e.h}h`:"")+(e.d?` ${e.d}x`:"")})).join(", "),n.attribs[s]=i}catch(e){return void delete n.attribs[s]}if("class"===s){const t=x[e],r=x["*"],a=S[e],l=k[e],h=[a,S["*"]].concat(l).filter((function(e){return e}));if(!(c=i,d=t&&r?o(t,r):t||r,m=h,i=d?(c=c.split(/\s+/)).filter((function(e){return-1!==d.indexOf(e)||m.some((function(t){return t.test(e)}))})).join(" "):c).length)return void delete n.attribs[s]}if("style"===s)try{if(i=function(e){return e.nodes[0].nodes.reduce((function(e,t){return e.push(`${t.prop}:${t.value}${t.important?" !important":""}`),e}),[]).join(";")}(function(e,t){if(!t)return e;const i=e.nodes[0];let n;return n=t[i.selector]&&t["*"]?o(t[i.selector],t["*"]):t[i.selector]||t["*"],n&&(e.nodes[0].nodes=i.nodes.reduce(function(e){return function(t,i){return u(e,i.prop)&&e[i.prop].some((function(e){return e.test(i.value)}))&&t.push(i),t}}(n),[])),e}(l(e+" {"+i+"}"),t.allowedStyles)),0===i.length)return void delete n.attribs[s]}catch(e){return void delete n.attribs[s]}v+=" "+s,i&&i.length&&(v+='="'+N(i,!0)+'"')}else delete n.attribs[s];var c,d,m})),-1!==t.selfClosing.indexOf(e)?v+=" />":(v+=">",!n.innerText||h||t.textFilter||(v+=N(n.innerText),I=!0)),s&&(v=O+N(v),O="")},ontext:function(e){if(R)return;const i=M[M.length-1];let n;if(i&&(n=i.tag,e=void 0!==i.innerText?i.innerText:e),"discard"!==t.disallowedTagsMode||"script"!==n&&"style"!==n){const i=N(e,!1);t.textFilter&&!I?v+=t.textFilter(i,n):I||(v+=i)}else v+=e;M.length&&(M[M.length-1].text+=e)},onclosetag:function(e){if(R){if(D--,D)return;R=!1}const i=M.pop();if(!i)return;if(i.tag!==e)return void M.push(i);R=!!t.enforceHtmlBoundary&&"html"===e,P--;const n=E[P];if(n){if(delete E[P],"discard"===t.disallowedTagsMode)return void i.updateParentNodeText();O=v,v=""}A[P]&&(e=A[P],delete A[P]),t.exclusiveFilter&&t.exclusiveFilter(i)?v=v.substr(0,i.tagPosition):(i.updateParentNodeMediaChildren(),i.updateParentNodeText(),-1===t.selfClosing.indexOf(e)?(v+="",n&&(v=O+N(v),O=""),I=!1):n&&(v=O,O=""))}},t.parser);return q.write(e),q.end(),v;function L(){v="",P=0,M=[],E={},A={},R=!1,D=0}function N(e,i){return"string"!=typeof e&&(e+=""),t.parser.decodeEntities&&(e=e.replace(/&/g,"&").replace(//g,">"),i&&(e=e.replace(/"/g,"""))),e=e.replace(/&(?![a-zA-Z0-9#]{1,20};)/g,"&").replace(//g,">"),i&&(e=e.replace(/"/g,""")),e}function B(e,i){for(i=i.replace(/[\x00-\x20]+/g,"");;){const e=i.indexOf("\x3c!--");if(-1===e)break;const t=i.indexOf("--\x3e",e+4);if(-1===t)break;i=i.substring(0,e)+i.substring(t+3)}const n=i.match(/^([a-zA-Z][a-zA-Z0-9.\-+]*):/);if(!n)return!!i.match(/^[/\\]{2}/)&&!t.allowProtocolRelative;const s=n[1].toLowerCase();return u(t.allowedSchemesByTag,e)?-1===t.allowedSchemesByTag[e].indexOf(s):!t.allowedSchemes||-1===t.allowedSchemes.indexOf(s)}function $(e){if((e=e.replace(/^(\w+:)?\s*[\\/]\s*[\\/]/,"$1//")).startsWith("relative:"))throw new Error("relative: exploit attempt");let t="relative://relative-site";for(let e=0;e<100;e++)t+=`/${e}`;const i=new URL(e,t);return{isRelativeUrl:i&&"relative-site"===i.hostname&&"relative:"===i.protocol,url:i}}}const g={decodeEntities:!0};m.defaults={allowedTags:["address","article","aside","footer","header","h1","h2","h3","h4","h5","h6","hgroup","main","nav","section","blockquote","dd","div","dl","dt","figcaption","figure","hr","li","main","ol","p","pre","ul","a","abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rb","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","caption","col","colgroup","table","tbody","td","tfoot","th","thead","tr"],disallowedTagsMode:"discard",allowedAttributes:{a:["href","name","target"],img:["src","srcset","alt","title","width","height","loading"]},selfClosing:["img","br","hr","area","base","basefont","input","link","meta"],allowedSchemes:["http","https","ftp","mailto","tel"],allowedSchemesByTag:{},allowedSchemesAppliedToAttributes:["href","src","cite"],allowProtocolRelative:!0,enforceHtmlBoundary:!1},m.simpleTransform=function(e,t,i){return i=void 0===i||i,t=t||{},function(n,s){let r;if(i)for(r in t)s[r]=t[r];else s=t;return{tagName:e,attribs:s}}}},2296:(e,t,i)=>{"use strict";var n=i(1384),s=i(8878),r=/^[\x00-\x20\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]+/,o=/[\n\r\t]/g,a=/^[A-Za-z][A-Za-z0-9+-.]*:\/\//,l=/:\d+$/,h=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\\/]+)?([\S\s]*)/i,c=/^[a-zA-Z]:/;function d(e){return(e||"").toString().replace(r,"")}var u=[["#","hash"],["?","query"],function(e,t){return m(t.protocol)?e.replace(/\\/g,"/"):e},["/","pathname"],["@","auth",1],[NaN,"host",void 0,1,1],[/:(\d*)$/,"port",void 0,1],[NaN,"hostname",void 0,1,1]],p={hash:1,query:1};function f(e){var t,n=("undefined"!=typeof window?window:void 0!==i.g?i.g:"undefined"!=typeof self?self:{}).location||{},s={},r=typeof(e=e||n);if("blob:"===e.protocol)s=new v(unescape(e.pathname),{});else if("string"===r)for(t in s=new v(e,{}),p)delete s[t];else if("object"===r){for(t in e)t in p||(s[t]=e[t]);void 0===s.slashes&&(s.slashes=a.test(e.href))}return s}function m(e){return"file:"===e||"ftp:"===e||"http:"===e||"https:"===e||"ws:"===e||"wss:"===e}function g(e,t){e=(e=d(e)).replace(o,""),t=t||{};var i,n=h.exec(e),s=n[1]?n[1].toLowerCase():"",r=!!n[2],a=!!n[3],l=0;return r?a?(i=n[2]+n[3]+n[4],l=n[2].length+n[3].length):(i=n[2]+n[4],l=n[2].length):a?(i=n[3]+n[4],l=n[3].length):i=n[4],"file:"===s?l>=2&&(i=i.slice(2)):m(s)?i=n[4]:s?r&&(i=i.slice(2)):l>=2&&m(t.protocol)&&(i=n[4]),{protocol:s,slashes:r||m(s),slashesCount:l,rest:i}}function v(e,t,i){if(e=(e=d(e)).replace(o,""),!(this instanceof v))return new v(e,t,i);var r,a,l,h,p,O,b=u.slice(),_=typeof t,y=this,w=0;for("object"!==_&&"string"!==_&&(i=t,t=null),i&&"function"!=typeof i&&(i=s.parse),r=!(a=g(e||"",t=f(t))).protocol&&!a.slashes,y.slashes=a.slashes||r&&t.slashes,y.protocol=a.protocol||t.protocol||"",e=a.rest,("file:"===a.protocol&&(2!==a.slashesCount||c.test(e))||!a.slashes&&(a.protocol||a.slashesCount<2||!m(y.protocol)))&&(b[3]=[/(.*)/,"pathname"]);w{},1336:()=>{},2666:()=>{},9059:()=>{},415:()=>{},8845:e=>{e.exports={nanoid:(e=21)=>{let t="",i=e;for(;i--;)t+="useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict"[64*Math.random()|0];return t},customAlphabet:(e,t=21)=>(i=t)=>{let n="",s=i;for(;s--;)n+=e[Math.random()*e.length|0];return n}}},6399:e=>{"use strict";e.exports=JSON.parse('{"0":65533,"128":8364,"130":8218,"131":402,"132":8222,"133":8230,"134":8224,"135":8225,"136":710,"137":8240,"138":352,"139":8249,"140":338,"142":381,"145":8216,"146":8217,"147":8220,"148":8221,"149":8226,"150":8211,"151":8212,"152":732,"153":8482,"154":353,"155":8250,"156":339,"158":382,"159":376}')},2810:e=>{"use strict";e.exports=JSON.parse('{"Aacute":"ร","aacute":"รก","Abreve":"ฤ‚","abreve":"ฤƒ","ac":"โˆพ","acd":"โˆฟ","acE":"โˆพฬณ","Acirc":"ร‚","acirc":"รข","acute":"ยด","Acy":"ะ","acy":"ะฐ","AElig":"ร†","aelig":"รฆ","af":"โก","Afr":"๐”„","afr":"๐”ž","Agrave":"ร€","agrave":"ร ","alefsym":"โ„ต","aleph":"โ„ต","Alpha":"ฮ‘","alpha":"ฮฑ","Amacr":"ฤ€","amacr":"ฤ","amalg":"โจฟ","amp":"&","AMP":"&","andand":"โฉ•","And":"โฉ“","and":"โˆง","andd":"โฉœ","andslope":"โฉ˜","andv":"โฉš","ang":"โˆ ","ange":"โฆค","angle":"โˆ ","angmsdaa":"โฆจ","angmsdab":"โฆฉ","angmsdac":"โฆช","angmsdad":"โฆซ","angmsdae":"โฆฌ","angmsdaf":"โฆญ","angmsdag":"โฆฎ","angmsdah":"โฆฏ","angmsd":"โˆก","angrt":"โˆŸ","angrtvb":"โŠพ","angrtvbd":"โฆ","angsph":"โˆข","angst":"ร…","angzarr":"โผ","Aogon":"ฤ„","aogon":"ฤ…","Aopf":"๐”ธ","aopf":"๐•’","apacir":"โฉฏ","ap":"โ‰ˆ","apE":"โฉฐ","ape":"โ‰Š","apid":"โ‰‹","apos":"\'","ApplyFunction":"โก","approx":"โ‰ˆ","approxeq":"โ‰Š","Aring":"ร…","aring":"รฅ","Ascr":"๐’œ","ascr":"๐’ถ","Assign":"โ‰”","ast":"*","asymp":"โ‰ˆ","asympeq":"โ‰","Atilde":"รƒ","atilde":"รฃ","Auml":"ร„","auml":"รค","awconint":"โˆณ","awint":"โจ‘","backcong":"โ‰Œ","backepsilon":"ฯถ","backprime":"โ€ต","backsim":"โˆฝ","backsimeq":"โ‹","Backslash":"โˆ–","Barv":"โซง","barvee":"โŠฝ","barwed":"โŒ…","Barwed":"โŒ†","barwedge":"โŒ…","bbrk":"โŽต","bbrktbrk":"โŽถ","bcong":"โ‰Œ","Bcy":"ะ‘","bcy":"ะฑ","bdquo":"โ€ž","becaus":"โˆต","because":"โˆต","Because":"โˆต","bemptyv":"โฆฐ","bepsi":"ฯถ","bernou":"โ„ฌ","Bernoullis":"โ„ฌ","Beta":"ฮ’","beta":"ฮฒ","beth":"โ„ถ","between":"โ‰ฌ","Bfr":"๐”…","bfr":"๐”Ÿ","bigcap":"โ‹‚","bigcirc":"โ—ฏ","bigcup":"โ‹ƒ","bigodot":"โจ€","bigoplus":"โจ","bigotimes":"โจ‚","bigsqcup":"โจ†","bigstar":"โ˜…","bigtriangledown":"โ–ฝ","bigtriangleup":"โ–ณ","biguplus":"โจ„","bigvee":"โ‹","bigwedge":"โ‹€","bkarow":"โค","blacklozenge":"โงซ","blacksquare":"โ–ช","blacktriangle":"โ–ด","blacktriangledown":"โ–พ","blacktriangleleft":"โ—‚","blacktriangleright":"โ–ธ","blank":"โฃ","blk12":"โ–’","blk14":"โ–‘","blk34":"โ–“","block":"โ–ˆ","bne":"=โƒฅ","bnequiv":"โ‰กโƒฅ","bNot":"โซญ","bnot":"โŒ","Bopf":"๐”น","bopf":"๐•“","bot":"โŠฅ","bottom":"โŠฅ","bowtie":"โ‹ˆ","boxbox":"โง‰","boxdl":"โ”","boxdL":"โ••","boxDl":"โ•–","boxDL":"โ•—","boxdr":"โ”Œ","boxdR":"โ•’","boxDr":"โ•“","boxDR":"โ•”","boxh":"โ”€","boxH":"โ•","boxhd":"โ”ฌ","boxHd":"โ•ค","boxhD":"โ•ฅ","boxHD":"โ•ฆ","boxhu":"โ”ด","boxHu":"โ•ง","boxhU":"โ•จ","boxHU":"โ•ฉ","boxminus":"โŠŸ","boxplus":"โŠž","boxtimes":"โŠ ","boxul":"โ”˜","boxuL":"โ•›","boxUl":"โ•œ","boxUL":"โ•","boxur":"โ””","boxuR":"โ•˜","boxUr":"โ•™","boxUR":"โ•š","boxv":"โ”‚","boxV":"โ•‘","boxvh":"โ”ผ","boxvH":"โ•ช","boxVh":"โ•ซ","boxVH":"โ•ฌ","boxvl":"โ”ค","boxvL":"โ•ก","boxVl":"โ•ข","boxVL":"โ•ฃ","boxvr":"โ”œ","boxvR":"โ•ž","boxVr":"โ•Ÿ","boxVR":"โ• ","bprime":"โ€ต","breve":"ห˜","Breve":"ห˜","brvbar":"ยฆ","bscr":"๐’ท","Bscr":"โ„ฌ","bsemi":"โ","bsim":"โˆฝ","bsime":"โ‹","bsolb":"โง…","bsol":"\\\\","bsolhsub":"โŸˆ","bull":"โ€ข","bullet":"โ€ข","bump":"โ‰Ž","bumpE":"โชฎ","bumpe":"โ‰","Bumpeq":"โ‰Ž","bumpeq":"โ‰","Cacute":"ฤ†","cacute":"ฤ‡","capand":"โฉ„","capbrcup":"โฉ‰","capcap":"โฉ‹","cap":"โˆฉ","Cap":"โ‹’","capcup":"โฉ‡","capdot":"โฉ€","CapitalDifferentialD":"โ……","caps":"โˆฉ๏ธ€","caret":"โ","caron":"ห‡","Cayleys":"โ„ญ","ccaps":"โฉ","Ccaron":"ฤŒ","ccaron":"ฤ","Ccedil":"ร‡","ccedil":"รง","Ccirc":"ฤˆ","ccirc":"ฤ‰","Cconint":"โˆฐ","ccups":"โฉŒ","ccupssm":"โฉ","Cdot":"ฤŠ","cdot":"ฤ‹","cedil":"ยธ","Cedilla":"ยธ","cemptyv":"โฆฒ","cent":"ยข","centerdot":"ยท","CenterDot":"ยท","cfr":"๐” ","Cfr":"โ„ญ","CHcy":"ะง","chcy":"ั‡","check":"โœ“","checkmark":"โœ“","Chi":"ฮง","chi":"ฯ‡","circ":"ห†","circeq":"โ‰—","circlearrowleft":"โ†บ","circlearrowright":"โ†ป","circledast":"โŠ›","circledcirc":"โŠš","circleddash":"โŠ","CircleDot":"โŠ™","circledR":"ยฎ","circledS":"โ“ˆ","CircleMinus":"โŠ–","CirclePlus":"โŠ•","CircleTimes":"โŠ—","cir":"โ—‹","cirE":"โงƒ","cire":"โ‰—","cirfnint":"โจ","cirmid":"โซฏ","cirscir":"โง‚","ClockwiseContourIntegral":"โˆฒ","CloseCurlyDoubleQuote":"โ€","CloseCurlyQuote":"โ€™","clubs":"โ™ฃ","clubsuit":"โ™ฃ","colon":":","Colon":"โˆท","Colone":"โฉด","colone":"โ‰”","coloneq":"โ‰”","comma":",","commat":"@","comp":"โˆ","compfn":"โˆ˜","complement":"โˆ","complexes":"โ„‚","cong":"โ‰…","congdot":"โฉญ","Congruent":"โ‰ก","conint":"โˆฎ","Conint":"โˆฏ","ContourIntegral":"โˆฎ","copf":"๐•”","Copf":"โ„‚","coprod":"โˆ","Coproduct":"โˆ","copy":"ยฉ","COPY":"ยฉ","copysr":"โ„—","CounterClockwiseContourIntegral":"โˆณ","crarr":"โ†ต","cross":"โœ—","Cross":"โจฏ","Cscr":"๐’ž","cscr":"๐’ธ","csub":"โซ","csube":"โซ‘","csup":"โซ","csupe":"โซ’","ctdot":"โ‹ฏ","cudarrl":"โคธ","cudarrr":"โคต","cuepr":"โ‹ž","cuesc":"โ‹Ÿ","cularr":"โ†ถ","cularrp":"โคฝ","cupbrcap":"โฉˆ","cupcap":"โฉ†","CupCap":"โ‰","cup":"โˆช","Cup":"โ‹“","cupcup":"โฉŠ","cupdot":"โŠ","cupor":"โฉ…","cups":"โˆช๏ธ€","curarr":"โ†ท","curarrm":"โคผ","curlyeqprec":"โ‹ž","curlyeqsucc":"โ‹Ÿ","curlyvee":"โ‹Ž","curlywedge":"โ‹","curren":"ยค","curvearrowleft":"โ†ถ","curvearrowright":"โ†ท","cuvee":"โ‹Ž","cuwed":"โ‹","cwconint":"โˆฒ","cwint":"โˆฑ","cylcty":"โŒญ","dagger":"โ€ ","Dagger":"โ€ก","daleth":"โ„ธ","darr":"โ†“","Darr":"โ†ก","dArr":"โ‡“","dash":"โ€","Dashv":"โซค","dashv":"โŠฃ","dbkarow":"โค","dblac":"ห","Dcaron":"ฤŽ","dcaron":"ฤ","Dcy":"ะ”","dcy":"ะด","ddagger":"โ€ก","ddarr":"โ‡Š","DD":"โ……","dd":"โ…†","DDotrahd":"โค‘","ddotseq":"โฉท","deg":"ยฐ","Del":"โˆ‡","Delta":"ฮ”","delta":"ฮด","demptyv":"โฆฑ","dfisht":"โฅฟ","Dfr":"๐”‡","dfr":"๐”ก","dHar":"โฅฅ","dharl":"โ‡ƒ","dharr":"โ‡‚","DiacriticalAcute":"ยด","DiacriticalDot":"ห™","DiacriticalDoubleAcute":"ห","DiacriticalGrave":"`","DiacriticalTilde":"หœ","diam":"โ‹„","diamond":"โ‹„","Diamond":"โ‹„","diamondsuit":"โ™ฆ","diams":"โ™ฆ","die":"ยจ","DifferentialD":"โ…†","digamma":"ฯ","disin":"โ‹ฒ","div":"รท","divide":"รท","divideontimes":"โ‹‡","divonx":"โ‹‡","DJcy":"ะ‚","djcy":"ั’","dlcorn":"โŒž","dlcrop":"โŒ","dollar":"$","Dopf":"๐”ป","dopf":"๐••","Dot":"ยจ","dot":"ห™","DotDot":"โƒœ","doteq":"โ‰","doteqdot":"โ‰‘","DotEqual":"โ‰","dotminus":"โˆธ","dotplus":"โˆ”","dotsquare":"โŠก","doublebarwedge":"โŒ†","DoubleContourIntegral":"โˆฏ","DoubleDot":"ยจ","DoubleDownArrow":"โ‡“","DoubleLeftArrow":"โ‡","DoubleLeftRightArrow":"โ‡”","DoubleLeftTee":"โซค","DoubleLongLeftArrow":"โŸธ","DoubleLongLeftRightArrow":"โŸบ","DoubleLongRightArrow":"โŸน","DoubleRightArrow":"โ‡’","DoubleRightTee":"โŠจ","DoubleUpArrow":"โ‡‘","DoubleUpDownArrow":"โ‡•","DoubleVerticalBar":"โˆฅ","DownArrowBar":"โค“","downarrow":"โ†“","DownArrow":"โ†“","Downarrow":"โ‡“","DownArrowUpArrow":"โ‡ต","DownBreve":"ฬ‘","downdownarrows":"โ‡Š","downharpoonleft":"โ‡ƒ","downharpoonright":"โ‡‚","DownLeftRightVector":"โฅ","DownLeftTeeVector":"โฅž","DownLeftVectorBar":"โฅ–","DownLeftVector":"โ†ฝ","DownRightTeeVector":"โฅŸ","DownRightVectorBar":"โฅ—","DownRightVector":"โ‡","DownTeeArrow":"โ†ง","DownTee":"โŠค","drbkarow":"โค","drcorn":"โŒŸ","drcrop":"โŒŒ","Dscr":"๐’Ÿ","dscr":"๐’น","DScy":"ะ…","dscy":"ั•","dsol":"โงถ","Dstrok":"ฤ","dstrok":"ฤ‘","dtdot":"โ‹ฑ","dtri":"โ–ฟ","dtrif":"โ–พ","duarr":"โ‡ต","duhar":"โฅฏ","dwangle":"โฆฆ","DZcy":"ะ","dzcy":"ัŸ","dzigrarr":"โŸฟ","Eacute":"ร‰","eacute":"รฉ","easter":"โฉฎ","Ecaron":"ฤš","ecaron":"ฤ›","Ecirc":"รŠ","ecirc":"รช","ecir":"โ‰–","ecolon":"โ‰•","Ecy":"ะญ","ecy":"ั","eDDot":"โฉท","Edot":"ฤ–","edot":"ฤ—","eDot":"โ‰‘","ee":"โ…‡","efDot":"โ‰’","Efr":"๐”ˆ","efr":"๐”ข","eg":"โชš","Egrave":"รˆ","egrave":"รจ","egs":"โช–","egsdot":"โช˜","el":"โช™","Element":"โˆˆ","elinters":"โง","ell":"โ„“","els":"โช•","elsdot":"โช—","Emacr":"ฤ’","emacr":"ฤ“","empty":"โˆ…","emptyset":"โˆ…","EmptySmallSquare":"โ—ป","emptyv":"โˆ…","EmptyVerySmallSquare":"โ–ซ","emsp13":"โ€„","emsp14":"โ€…","emsp":"โ€ƒ","ENG":"ลŠ","eng":"ล‹","ensp":"โ€‚","Eogon":"ฤ˜","eogon":"ฤ™","Eopf":"๐”ผ","eopf":"๐•–","epar":"โ‹•","eparsl":"โงฃ","eplus":"โฉฑ","epsi":"ฮต","Epsilon":"ฮ•","epsilon":"ฮต","epsiv":"ฯต","eqcirc":"โ‰–","eqcolon":"โ‰•","eqsim":"โ‰‚","eqslantgtr":"โช–","eqslantless":"โช•","Equal":"โฉต","equals":"=","EqualTilde":"โ‰‚","equest":"โ‰Ÿ","Equilibrium":"โ‡Œ","equiv":"โ‰ก","equivDD":"โฉธ","eqvparsl":"โงฅ","erarr":"โฅฑ","erDot":"โ‰“","escr":"โ„ฏ","Escr":"โ„ฐ","esdot":"โ‰","Esim":"โฉณ","esim":"โ‰‚","Eta":"ฮ—","eta":"ฮท","ETH":"ร","eth":"รฐ","Euml":"ร‹","euml":"รซ","euro":"โ‚ฌ","excl":"!","exist":"โˆƒ","Exists":"โˆƒ","expectation":"โ„ฐ","exponentiale":"โ…‡","ExponentialE":"โ…‡","fallingdotseq":"โ‰’","Fcy":"ะค","fcy":"ั„","female":"โ™€","ffilig":"๏ฌƒ","fflig":"๏ฌ€","ffllig":"๏ฌ„","Ffr":"๐”‰","ffr":"๐”ฃ","filig":"๏ฌ","FilledSmallSquare":"โ—ผ","FilledVerySmallSquare":"โ–ช","fjlig":"fj","flat":"โ™ญ","fllig":"๏ฌ‚","fltns":"โ–ฑ","fnof":"ฦ’","Fopf":"๐”ฝ","fopf":"๐•—","forall":"โˆ€","ForAll":"โˆ€","fork":"โ‹”","forkv":"โซ™","Fouriertrf":"โ„ฑ","fpartint":"โจ","frac12":"ยฝ","frac13":"โ…“","frac14":"ยผ","frac15":"โ…•","frac16":"โ…™","frac18":"โ…›","frac23":"โ…”","frac25":"โ…–","frac34":"ยพ","frac35":"โ…—","frac38":"โ…œ","frac45":"โ…˜","frac56":"โ…š","frac58":"โ…","frac78":"โ…ž","frasl":"โ„","frown":"โŒข","fscr":"๐’ป","Fscr":"โ„ฑ","gacute":"วต","Gamma":"ฮ“","gamma":"ฮณ","Gammad":"ฯœ","gammad":"ฯ","gap":"โช†","Gbreve":"ฤž","gbreve":"ฤŸ","Gcedil":"ฤข","Gcirc":"ฤœ","gcirc":"ฤ","Gcy":"ะ“","gcy":"ะณ","Gdot":"ฤ ","gdot":"ฤก","ge":"โ‰ฅ","gE":"โ‰ง","gEl":"โชŒ","gel":"โ‹›","geq":"โ‰ฅ","geqq":"โ‰ง","geqslant":"โฉพ","gescc":"โชฉ","ges":"โฉพ","gesdot":"โช€","gesdoto":"โช‚","gesdotol":"โช„","gesl":"โ‹›๏ธ€","gesles":"โช”","Gfr":"๐”Š","gfr":"๐”ค","gg":"โ‰ซ","Gg":"โ‹™","ggg":"โ‹™","gimel":"โ„ท","GJcy":"ะƒ","gjcy":"ั“","gla":"โชฅ","gl":"โ‰ท","glE":"โช’","glj":"โชค","gnap":"โชŠ","gnapprox":"โชŠ","gne":"โชˆ","gnE":"โ‰ฉ","gneq":"โชˆ","gneqq":"โ‰ฉ","gnsim":"โ‹ง","Gopf":"๐”พ","gopf":"๐•˜","grave":"`","GreaterEqual":"โ‰ฅ","GreaterEqualLess":"โ‹›","GreaterFullEqual":"โ‰ง","GreaterGreater":"โชข","GreaterLess":"โ‰ท","GreaterSlantEqual":"โฉพ","GreaterTilde":"โ‰ณ","Gscr":"๐’ข","gscr":"โ„Š","gsim":"โ‰ณ","gsime":"โชŽ","gsiml":"โช","gtcc":"โชง","gtcir":"โฉบ","gt":">","GT":">","Gt":"โ‰ซ","gtdot":"โ‹—","gtlPar":"โฆ•","gtquest":"โฉผ","gtrapprox":"โช†","gtrarr":"โฅธ","gtrdot":"โ‹—","gtreqless":"โ‹›","gtreqqless":"โชŒ","gtrless":"โ‰ท","gtrsim":"โ‰ณ","gvertneqq":"โ‰ฉ๏ธ€","gvnE":"โ‰ฉ๏ธ€","Hacek":"ห‡","hairsp":"โ€Š","half":"ยฝ","hamilt":"โ„‹","HARDcy":"ะช","hardcy":"ัŠ","harrcir":"โฅˆ","harr":"โ†”","hArr":"โ‡”","harrw":"โ†ญ","Hat":"^","hbar":"โ„","Hcirc":"ฤค","hcirc":"ฤฅ","hearts":"โ™ฅ","heartsuit":"โ™ฅ","hellip":"โ€ฆ","hercon":"โŠน","hfr":"๐”ฅ","Hfr":"โ„Œ","HilbertSpace":"โ„‹","hksearow":"โคฅ","hkswarow":"โคฆ","hoarr":"โ‡ฟ","homtht":"โˆป","hookleftarrow":"โ†ฉ","hookrightarrow":"โ†ช","hopf":"๐•™","Hopf":"โ„","horbar":"โ€•","HorizontalLine":"โ”€","hscr":"๐’ฝ","Hscr":"โ„‹","hslash":"โ„","Hstrok":"ฤฆ","hstrok":"ฤง","HumpDownHump":"โ‰Ž","HumpEqual":"โ‰","hybull":"โƒ","hyphen":"โ€","Iacute":"ร","iacute":"รญ","ic":"โฃ","Icirc":"รŽ","icirc":"รฎ","Icy":"ะ˜","icy":"ะธ","Idot":"ฤฐ","IEcy":"ะ•","iecy":"ะต","iexcl":"ยก","iff":"โ‡”","ifr":"๐”ฆ","Ifr":"โ„‘","Igrave":"รŒ","igrave":"รฌ","ii":"โ…ˆ","iiiint":"โจŒ","iiint":"โˆญ","iinfin":"โงœ","iiota":"โ„ฉ","IJlig":"ฤฒ","ijlig":"ฤณ","Imacr":"ฤช","imacr":"ฤซ","image":"โ„‘","ImaginaryI":"โ…ˆ","imagline":"โ„","imagpart":"โ„‘","imath":"ฤฑ","Im":"โ„‘","imof":"โŠท","imped":"ฦต","Implies":"โ‡’","incare":"โ„…","in":"โˆˆ","infin":"โˆž","infintie":"โง","inodot":"ฤฑ","intcal":"โŠบ","int":"โˆซ","Int":"โˆฌ","integers":"โ„ค","Integral":"โˆซ","intercal":"โŠบ","Intersection":"โ‹‚","intlarhk":"โจ—","intprod":"โจผ","InvisibleComma":"โฃ","InvisibleTimes":"โข","IOcy":"ะ","iocy":"ั‘","Iogon":"ฤฎ","iogon":"ฤฏ","Iopf":"๐•€","iopf":"๐•š","Iota":"ฮ™","iota":"ฮน","iprod":"โจผ","iquest":"ยฟ","iscr":"๐’พ","Iscr":"โ„","isin":"โˆˆ","isindot":"โ‹ต","isinE":"โ‹น","isins":"โ‹ด","isinsv":"โ‹ณ","isinv":"โˆˆ","it":"โข","Itilde":"ฤจ","itilde":"ฤฉ","Iukcy":"ะ†","iukcy":"ั–","Iuml":"ร","iuml":"รฏ","Jcirc":"ฤด","jcirc":"ฤต","Jcy":"ะ™","jcy":"ะน","Jfr":"๐”","jfr":"๐”ง","jmath":"ศท","Jopf":"๐•","jopf":"๐•›","Jscr":"๐’ฅ","jscr":"๐’ฟ","Jsercy":"ะˆ","jsercy":"ั˜","Jukcy":"ะ„","jukcy":"ั”","Kappa":"ฮš","kappa":"ฮบ","kappav":"ฯฐ","Kcedil":"ฤถ","kcedil":"ฤท","Kcy":"ะš","kcy":"ะบ","Kfr":"๐”Ž","kfr":"๐”จ","kgreen":"ฤธ","KHcy":"ะฅ","khcy":"ั…","KJcy":"ะŒ","kjcy":"ัœ","Kopf":"๐•‚","kopf":"๐•œ","Kscr":"๐’ฆ","kscr":"๐“€","lAarr":"โ‡š","Lacute":"ฤน","lacute":"ฤบ","laemptyv":"โฆด","lagran":"โ„’","Lambda":"ฮ›","lambda":"ฮป","lang":"โŸจ","Lang":"โŸช","langd":"โฆ‘","langle":"โŸจ","lap":"โช…","Laplacetrf":"โ„’","laquo":"ยซ","larrb":"โ‡ค","larrbfs":"โคŸ","larr":"โ†","Larr":"โ†ž","lArr":"โ‡","larrfs":"โค","larrhk":"โ†ฉ","larrlp":"โ†ซ","larrpl":"โคน","larrsim":"โฅณ","larrtl":"โ†ข","latail":"โค™","lAtail":"โค›","lat":"โชซ","late":"โชญ","lates":"โชญ๏ธ€","lbarr":"โคŒ","lBarr":"โคŽ","lbbrk":"โฒ","lbrace":"{","lbrack":"[","lbrke":"โฆ‹","lbrksld":"โฆ","lbrkslu":"โฆ","Lcaron":"ฤฝ","lcaron":"ฤพ","Lcedil":"ฤป","lcedil":"ฤผ","lceil":"โŒˆ","lcub":"{","Lcy":"ะ›","lcy":"ะป","ldca":"โคถ","ldquo":"โ€œ","ldquor":"โ€ž","ldrdhar":"โฅง","ldrushar":"โฅ‹","ldsh":"โ†ฒ","le":"โ‰ค","lE":"โ‰ฆ","LeftAngleBracket":"โŸจ","LeftArrowBar":"โ‡ค","leftarrow":"โ†","LeftArrow":"โ†","Leftarrow":"โ‡","LeftArrowRightArrow":"โ‡†","leftarrowtail":"โ†ข","LeftCeiling":"โŒˆ","LeftDoubleBracket":"โŸฆ","LeftDownTeeVector":"โฅก","LeftDownVectorBar":"โฅ™","LeftDownVector":"โ‡ƒ","LeftFloor":"โŒŠ","leftharpoondown":"โ†ฝ","leftharpoonup":"โ†ผ","leftleftarrows":"โ‡‡","leftrightarrow":"โ†”","LeftRightArrow":"โ†”","Leftrightarrow":"โ‡”","leftrightarrows":"โ‡†","leftrightharpoons":"โ‡‹","leftrightsquigarrow":"โ†ญ","LeftRightVector":"โฅŽ","LeftTeeArrow":"โ†ค","LeftTee":"โŠฃ","LeftTeeVector":"โฅš","leftthreetimes":"โ‹‹","LeftTriangleBar":"โง","LeftTriangle":"โŠฒ","LeftTriangleEqual":"โŠด","LeftUpDownVector":"โฅ‘","LeftUpTeeVector":"โฅ ","LeftUpVectorBar":"โฅ˜","LeftUpVector":"โ†ฟ","LeftVectorBar":"โฅ’","LeftVector":"โ†ผ","lEg":"โช‹","leg":"โ‹š","leq":"โ‰ค","leqq":"โ‰ฆ","leqslant":"โฉฝ","lescc":"โชจ","les":"โฉฝ","lesdot":"โฉฟ","lesdoto":"โช","lesdotor":"โชƒ","lesg":"โ‹š๏ธ€","lesges":"โช“","lessapprox":"โช…","lessdot":"โ‹–","lesseqgtr":"โ‹š","lesseqqgtr":"โช‹","LessEqualGreater":"โ‹š","LessFullEqual":"โ‰ฆ","LessGreater":"โ‰ถ","lessgtr":"โ‰ถ","LessLess":"โชก","lesssim":"โ‰ฒ","LessSlantEqual":"โฉฝ","LessTilde":"โ‰ฒ","lfisht":"โฅผ","lfloor":"โŒŠ","Lfr":"๐”","lfr":"๐”ฉ","lg":"โ‰ถ","lgE":"โช‘","lHar":"โฅข","lhard":"โ†ฝ","lharu":"โ†ผ","lharul":"โฅช","lhblk":"โ–„","LJcy":"ะ‰","ljcy":"ั™","llarr":"โ‡‡","ll":"โ‰ช","Ll":"โ‹˜","llcorner":"โŒž","Lleftarrow":"โ‡š","llhard":"โฅซ","lltri":"โ—บ","Lmidot":"ฤฟ","lmidot":"ล€","lmoustache":"โŽฐ","lmoust":"โŽฐ","lnap":"โช‰","lnapprox":"โช‰","lne":"โช‡","lnE":"โ‰จ","lneq":"โช‡","lneqq":"โ‰จ","lnsim":"โ‹ฆ","loang":"โŸฌ","loarr":"โ‡ฝ","lobrk":"โŸฆ","longleftarrow":"โŸต","LongLeftArrow":"โŸต","Longleftarrow":"โŸธ","longleftrightarrow":"โŸท","LongLeftRightArrow":"โŸท","Longleftrightarrow":"โŸบ","longmapsto":"โŸผ","longrightarrow":"โŸถ","LongRightArrow":"โŸถ","Longrightarrow":"โŸน","looparrowleft":"โ†ซ","looparrowright":"โ†ฌ","lopar":"โฆ…","Lopf":"๐•ƒ","lopf":"๐•","loplus":"โจญ","lotimes":"โจด","lowast":"โˆ—","lowbar":"_","LowerLeftArrow":"โ†™","LowerRightArrow":"โ†˜","loz":"โ—Š","lozenge":"โ—Š","lozf":"โงซ","lpar":"(","lparlt":"โฆ“","lrarr":"โ‡†","lrcorner":"โŒŸ","lrhar":"โ‡‹","lrhard":"โฅญ","lrm":"โ€Ž","lrtri":"โŠฟ","lsaquo":"โ€น","lscr":"๐“","Lscr":"โ„’","lsh":"โ†ฐ","Lsh":"โ†ฐ","lsim":"โ‰ฒ","lsime":"โช","lsimg":"โช","lsqb":"[","lsquo":"โ€˜","lsquor":"โ€š","Lstrok":"ล","lstrok":"ล‚","ltcc":"โชฆ","ltcir":"โฉน","lt":"<","LT":"<","Lt":"โ‰ช","ltdot":"โ‹–","lthree":"โ‹‹","ltimes":"โ‹‰","ltlarr":"โฅถ","ltquest":"โฉป","ltri":"โ—ƒ","ltrie":"โŠด","ltrif":"โ—‚","ltrPar":"โฆ–","lurdshar":"โฅŠ","luruhar":"โฅฆ","lvertneqq":"โ‰จ๏ธ€","lvnE":"โ‰จ๏ธ€","macr":"ยฏ","male":"โ™‚","malt":"โœ ","maltese":"โœ ","Map":"โค…","map":"โ†ฆ","mapsto":"โ†ฆ","mapstodown":"โ†ง","mapstoleft":"โ†ค","mapstoup":"โ†ฅ","marker":"โ–ฎ","mcomma":"โจฉ","Mcy":"ะœ","mcy":"ะผ","mdash":"โ€”","mDDot":"โˆบ","measuredangle":"โˆก","MediumSpace":"โŸ","Mellintrf":"โ„ณ","Mfr":"๐”","mfr":"๐”ช","mho":"โ„ง","micro":"ยต","midast":"*","midcir":"โซฐ","mid":"โˆฃ","middot":"ยท","minusb":"โŠŸ","minus":"โˆ’","minusd":"โˆธ","minusdu":"โจช","MinusPlus":"โˆ“","mlcp":"โซ›","mldr":"โ€ฆ","mnplus":"โˆ“","models":"โŠง","Mopf":"๐•„","mopf":"๐•ž","mp":"โˆ“","mscr":"๐“‚","Mscr":"โ„ณ","mstpos":"โˆพ","Mu":"ฮœ","mu":"ฮผ","multimap":"โŠธ","mumap":"โŠธ","nabla":"โˆ‡","Nacute":"ลƒ","nacute":"ล„","nang":"โˆ โƒ’","nap":"โ‰‰","napE":"โฉฐฬธ","napid":"โ‰‹ฬธ","napos":"ล‰","napprox":"โ‰‰","natural":"โ™ฎ","naturals":"โ„•","natur":"โ™ฎ","nbsp":"ย ","nbump":"โ‰Žฬธ","nbumpe":"โ‰ฬธ","ncap":"โฉƒ","Ncaron":"ล‡","ncaron":"ลˆ","Ncedil":"ล…","ncedil":"ล†","ncong":"โ‰‡","ncongdot":"โฉญฬธ","ncup":"โฉ‚","Ncy":"ะ","ncy":"ะฝ","ndash":"โ€“","nearhk":"โคค","nearr":"โ†—","neArr":"โ‡—","nearrow":"โ†—","ne":"โ‰ ","nedot":"โ‰ฬธ","NegativeMediumSpace":"โ€‹","NegativeThickSpace":"โ€‹","NegativeThinSpace":"โ€‹","NegativeVeryThinSpace":"โ€‹","nequiv":"โ‰ข","nesear":"โคจ","nesim":"โ‰‚ฬธ","NestedGreaterGreater":"โ‰ซ","NestedLessLess":"โ‰ช","NewLine":"\\n","nexist":"โˆ„","nexists":"โˆ„","Nfr":"๐”‘","nfr":"๐”ซ","ngE":"โ‰งฬธ","nge":"โ‰ฑ","ngeq":"โ‰ฑ","ngeqq":"โ‰งฬธ","ngeqslant":"โฉพฬธ","nges":"โฉพฬธ","nGg":"โ‹™ฬธ","ngsim":"โ‰ต","nGt":"โ‰ซโƒ’","ngt":"โ‰ฏ","ngtr":"โ‰ฏ","nGtv":"โ‰ซฬธ","nharr":"โ†ฎ","nhArr":"โ‡Ž","nhpar":"โซฒ","ni":"โˆ‹","nis":"โ‹ผ","nisd":"โ‹บ","niv":"โˆ‹","NJcy":"ะŠ","njcy":"ัš","nlarr":"โ†š","nlArr":"โ‡","nldr":"โ€ฅ","nlE":"โ‰ฆฬธ","nle":"โ‰ฐ","nleftarrow":"โ†š","nLeftarrow":"โ‡","nleftrightarrow":"โ†ฎ","nLeftrightarrow":"โ‡Ž","nleq":"โ‰ฐ","nleqq":"โ‰ฆฬธ","nleqslant":"โฉฝฬธ","nles":"โฉฝฬธ","nless":"โ‰ฎ","nLl":"โ‹˜ฬธ","nlsim":"โ‰ด","nLt":"โ‰ชโƒ’","nlt":"โ‰ฎ","nltri":"โ‹ช","nltrie":"โ‹ฌ","nLtv":"โ‰ชฬธ","nmid":"โˆค","NoBreak":"โ ","NonBreakingSpace":"ย ","nopf":"๐•Ÿ","Nopf":"โ„•","Not":"โซฌ","not":"ยฌ","NotCongruent":"โ‰ข","NotCupCap":"โ‰ญ","NotDoubleVerticalBar":"โˆฆ","NotElement":"โˆ‰","NotEqual":"โ‰ ","NotEqualTilde":"โ‰‚ฬธ","NotExists":"โˆ„","NotGreater":"โ‰ฏ","NotGreaterEqual":"โ‰ฑ","NotGreaterFullEqual":"โ‰งฬธ","NotGreaterGreater":"โ‰ซฬธ","NotGreaterLess":"โ‰น","NotGreaterSlantEqual":"โฉพฬธ","NotGreaterTilde":"โ‰ต","NotHumpDownHump":"โ‰Žฬธ","NotHumpEqual":"โ‰ฬธ","notin":"โˆ‰","notindot":"โ‹ตฬธ","notinE":"โ‹นฬธ","notinva":"โˆ‰","notinvb":"โ‹ท","notinvc":"โ‹ถ","NotLeftTriangleBar":"โงฬธ","NotLeftTriangle":"โ‹ช","NotLeftTriangleEqual":"โ‹ฌ","NotLess":"โ‰ฎ","NotLessEqual":"โ‰ฐ","NotLessGreater":"โ‰ธ","NotLessLess":"โ‰ชฬธ","NotLessSlantEqual":"โฉฝฬธ","NotLessTilde":"โ‰ด","NotNestedGreaterGreater":"โชขฬธ","NotNestedLessLess":"โชกฬธ","notni":"โˆŒ","notniva":"โˆŒ","notnivb":"โ‹พ","notnivc":"โ‹ฝ","NotPrecedes":"โŠ€","NotPrecedesEqual":"โชฏฬธ","NotPrecedesSlantEqual":"โ‹ ","NotReverseElement":"โˆŒ","NotRightTriangleBar":"โงฬธ","NotRightTriangle":"โ‹ซ","NotRightTriangleEqual":"โ‹ญ","NotSquareSubset":"โŠฬธ","NotSquareSubsetEqual":"โ‹ข","NotSquareSuperset":"โАฬธ","NotSquareSupersetEqual":"โ‹ฃ","NotSubset":"โŠ‚โƒ’","NotSubsetEqual":"โŠˆ","NotSucceeds":"โЁ","NotSucceedsEqual":"โชฐฬธ","NotSucceedsSlantEqual":"โ‹ก","NotSucceedsTilde":"โ‰ฟฬธ","NotSuperset":"โŠƒโƒ’","NotSupersetEqual":"โЉ","NotTilde":"โ‰","NotTildeEqual":"โ‰„","NotTildeFullEqual":"โ‰‡","NotTildeTilde":"โ‰‰","NotVerticalBar":"โˆค","nparallel":"โˆฆ","npar":"โˆฆ","nparsl":"โซฝโƒฅ","npart":"โˆ‚ฬธ","npolint":"โจ”","npr":"โŠ€","nprcue":"โ‹ ","nprec":"โŠ€","npreceq":"โชฏฬธ","npre":"โชฏฬธ","nrarrc":"โคณฬธ","nrarr":"โ†›","nrArr":"โ‡","nrarrw":"โ†ฬธ","nrightarrow":"โ†›","nRightarrow":"โ‡","nrtri":"โ‹ซ","nrtrie":"โ‹ญ","nsc":"โЁ","nsccue":"โ‹ก","nsce":"โชฐฬธ","Nscr":"๐’ฉ","nscr":"๐“ƒ","nshortmid":"โˆค","nshortparallel":"โˆฆ","nsim":"โ‰","nsime":"โ‰„","nsimeq":"โ‰„","nsmid":"โˆค","nspar":"โˆฆ","nsqsube":"โ‹ข","nsqsupe":"โ‹ฃ","nsub":"โŠ„","nsubE":"โซ…ฬธ","nsube":"โŠˆ","nsubset":"โŠ‚โƒ’","nsubseteq":"โŠˆ","nsubseteqq":"โซ…ฬธ","nsucc":"โЁ","nsucceq":"โชฐฬธ","nsup":"โŠ…","nsupE":"โซ†ฬธ","nsupe":"โЉ","nsupset":"โŠƒโƒ’","nsupseteq":"โЉ","nsupseteqq":"โซ†ฬธ","ntgl":"โ‰น","Ntilde":"ร‘","ntilde":"รฑ","ntlg":"โ‰ธ","ntriangleleft":"โ‹ช","ntrianglelefteq":"โ‹ฌ","ntriangleright":"โ‹ซ","ntrianglerighteq":"โ‹ญ","Nu":"ฮ","nu":"ฮฝ","num":"#","numero":"โ„–","numsp":"โ€‡","nvap":"โ‰โƒ’","nvdash":"โŠฌ","nvDash":"โŠญ","nVdash":"โŠฎ","nVDash":"โŠฏ","nvge":"โ‰ฅโƒ’","nvgt":">โƒ’","nvHarr":"โค„","nvinfin":"โงž","nvlArr":"โค‚","nvle":"โ‰คโƒ’","nvlt":"<โƒ’","nvltrie":"โŠดโƒ’","nvrArr":"โคƒ","nvrtrie":"โŠตโƒ’","nvsim":"โˆผโƒ’","nwarhk":"โคฃ","nwarr":"โ†–","nwArr":"โ‡–","nwarrow":"โ†–","nwnear":"โคง","Oacute":"ร“","oacute":"รณ","oast":"โŠ›","Ocirc":"ร”","ocirc":"รด","ocir":"โŠš","Ocy":"ะž","ocy":"ะพ","odash":"โŠ","Odblac":"ล","odblac":"ล‘","odiv":"โจธ","odot":"โŠ™","odsold":"โฆผ","OElig":"ล’","oelig":"ล“","ofcir":"โฆฟ","Ofr":"๐”’","ofr":"๐”ฌ","ogon":"ห›","Ograve":"ร’","ograve":"รฒ","ogt":"โง","ohbar":"โฆต","ohm":"ฮฉ","oint":"โˆฎ","olarr":"โ†บ","olcir":"โฆพ","olcross":"โฆป","oline":"โ€พ","olt":"โง€","Omacr":"ลŒ","omacr":"ล","Omega":"ฮฉ","omega":"ฯ‰","Omicron":"ฮŸ","omicron":"ฮฟ","omid":"โฆถ","ominus":"โŠ–","Oopf":"๐•†","oopf":"๐• ","opar":"โฆท","OpenCurlyDoubleQuote":"โ€œ","OpenCurlyQuote":"โ€˜","operp":"โฆน","oplus":"โŠ•","orarr":"โ†ป","Or":"โฉ”","or":"โˆจ","ord":"โฉ","order":"โ„ด","orderof":"โ„ด","ordf":"ยช","ordm":"ยบ","origof":"โŠถ","oror":"โฉ–","orslope":"โฉ—","orv":"โฉ›","oS":"โ“ˆ","Oscr":"๐’ช","oscr":"โ„ด","Oslash":"ร˜","oslash":"รธ","osol":"โŠ˜","Otilde":"ร•","otilde":"รต","otimesas":"โจถ","Otimes":"โจท","otimes":"โŠ—","Ouml":"ร–","ouml":"รถ","ovbar":"โŒฝ","OverBar":"โ€พ","OverBrace":"โž","OverBracket":"โŽด","OverParenthesis":"โœ","para":"ยถ","parallel":"โˆฅ","par":"โˆฅ","parsim":"โซณ","parsl":"โซฝ","part":"โˆ‚","PartialD":"โˆ‚","Pcy":"ะŸ","pcy":"ะฟ","percnt":"%","period":".","permil":"โ€ฐ","perp":"โŠฅ","pertenk":"โ€ฑ","Pfr":"๐”“","pfr":"๐”ญ","Phi":"ฮฆ","phi":"ฯ†","phiv":"ฯ•","phmmat":"โ„ณ","phone":"โ˜Ž","Pi":"ฮ ","pi":"ฯ€","pitchfork":"โ‹”","piv":"ฯ–","planck":"โ„","planckh":"โ„Ž","plankv":"โ„","plusacir":"โจฃ","plusb":"โŠž","pluscir":"โจข","plus":"+","plusdo":"โˆ”","plusdu":"โจฅ","pluse":"โฉฒ","PlusMinus":"ยฑ","plusmn":"ยฑ","plussim":"โจฆ","plustwo":"โจง","pm":"ยฑ","Poincareplane":"โ„Œ","pointint":"โจ•","popf":"๐•ก","Popf":"โ„™","pound":"ยฃ","prap":"โชท","Pr":"โชป","pr":"โ‰บ","prcue":"โ‰ผ","precapprox":"โชท","prec":"โ‰บ","preccurlyeq":"โ‰ผ","Precedes":"โ‰บ","PrecedesEqual":"โชฏ","PrecedesSlantEqual":"โ‰ผ","PrecedesTilde":"โ‰พ","preceq":"โชฏ","precnapprox":"โชน","precneqq":"โชต","precnsim":"โ‹จ","pre":"โชฏ","prE":"โชณ","precsim":"โ‰พ","prime":"โ€ฒ","Prime":"โ€ณ","primes":"โ„™","prnap":"โชน","prnE":"โชต","prnsim":"โ‹จ","prod":"โˆ","Product":"โˆ","profalar":"โŒฎ","profline":"โŒ’","profsurf":"โŒ“","prop":"โˆ","Proportional":"โˆ","Proportion":"โˆท","propto":"โˆ","prsim":"โ‰พ","prurel":"โŠฐ","Pscr":"๐’ซ","pscr":"๐“…","Psi":"ฮจ","psi":"ฯˆ","puncsp":"โ€ˆ","Qfr":"๐””","qfr":"๐”ฎ","qint":"โจŒ","qopf":"๐•ข","Qopf":"โ„š","qprime":"โ—","Qscr":"๐’ฌ","qscr":"๐“†","quaternions":"โ„","quatint":"โจ–","quest":"?","questeq":"โ‰Ÿ","quot":"\\"","QUOT":"\\"","rAarr":"โ‡›","race":"โˆฝฬฑ","Racute":"ล”","racute":"ล•","radic":"โˆš","raemptyv":"โฆณ","rang":"โŸฉ","Rang":"โŸซ","rangd":"โฆ’","range":"โฆฅ","rangle":"โŸฉ","raquo":"ยป","rarrap":"โฅต","rarrb":"โ‡ฅ","rarrbfs":"โค ","rarrc":"โคณ","rarr":"โ†’","Rarr":"โ† ","rArr":"โ‡’","rarrfs":"โคž","rarrhk":"โ†ช","rarrlp":"โ†ฌ","rarrpl":"โฅ…","rarrsim":"โฅด","Rarrtl":"โค–","rarrtl":"โ†ฃ","rarrw":"โ†","ratail":"โคš","rAtail":"โคœ","ratio":"โˆถ","rationals":"โ„š","rbarr":"โค","rBarr":"โค","RBarr":"โค","rbbrk":"โณ","rbrace":"}","rbrack":"]","rbrke":"โฆŒ","rbrksld":"โฆŽ","rbrkslu":"โฆ","Rcaron":"ล˜","rcaron":"ล™","Rcedil":"ล–","rcedil":"ล—","rceil":"โŒ‰","rcub":"}","Rcy":"ะ ","rcy":"ั€","rdca":"โคท","rdldhar":"โฅฉ","rdquo":"โ€","rdquor":"โ€","rdsh":"โ†ณ","real":"โ„œ","realine":"โ„›","realpart":"โ„œ","reals":"โ„","Re":"โ„œ","rect":"โ–ญ","reg":"ยฎ","REG":"ยฎ","ReverseElement":"โˆ‹","ReverseEquilibrium":"โ‡‹","ReverseUpEquilibrium":"โฅฏ","rfisht":"โฅฝ","rfloor":"โŒ‹","rfr":"๐”ฏ","Rfr":"โ„œ","rHar":"โฅค","rhard":"โ‡","rharu":"โ‡€","rharul":"โฅฌ","Rho":"ฮก","rho":"ฯ","rhov":"ฯฑ","RightAngleBracket":"โŸฉ","RightArrowBar":"โ‡ฅ","rightarrow":"โ†’","RightArrow":"โ†’","Rightarrow":"โ‡’","RightArrowLeftArrow":"โ‡„","rightarrowtail":"โ†ฃ","RightCeiling":"โŒ‰","RightDoubleBracket":"โŸง","RightDownTeeVector":"โฅ","RightDownVectorBar":"โฅ•","RightDownVector":"โ‡‚","RightFloor":"โŒ‹","rightharpoondown":"โ‡","rightharpoonup":"โ‡€","rightleftarrows":"โ‡„","rightleftharpoons":"โ‡Œ","rightrightarrows":"โ‡‰","rightsquigarrow":"โ†","RightTeeArrow":"โ†ฆ","RightTee":"โŠข","RightTeeVector":"โฅ›","rightthreetimes":"โ‹Œ","RightTriangleBar":"โง","RightTriangle":"โŠณ","RightTriangleEqual":"โŠต","RightUpDownVector":"โฅ","RightUpTeeVector":"โฅœ","RightUpVectorBar":"โฅ”","RightUpVector":"โ†พ","RightVectorBar":"โฅ“","RightVector":"โ‡€","ring":"หš","risingdotseq":"โ‰“","rlarr":"โ‡„","rlhar":"โ‡Œ","rlm":"โ€","rmoustache":"โŽฑ","rmoust":"โŽฑ","rnmid":"โซฎ","roang":"โŸญ","roarr":"โ‡พ","robrk":"โŸง","ropar":"โฆ†","ropf":"๐•ฃ","Ropf":"โ„","roplus":"โจฎ","rotimes":"โจต","RoundImplies":"โฅฐ","rpar":")","rpargt":"โฆ”","rppolint":"โจ’","rrarr":"โ‡‰","Rrightarrow":"โ‡›","rsaquo":"โ€บ","rscr":"๐“‡","Rscr":"โ„›","rsh":"โ†ฑ","Rsh":"โ†ฑ","rsqb":"]","rsquo":"โ€™","rsquor":"โ€™","rthree":"โ‹Œ","rtimes":"โ‹Š","rtri":"โ–น","rtrie":"โŠต","rtrif":"โ–ธ","rtriltri":"โงŽ","RuleDelayed":"โงด","ruluhar":"โฅจ","rx":"โ„ž","Sacute":"ลš","sacute":"ล›","sbquo":"โ€š","scap":"โชธ","Scaron":"ล ","scaron":"ลก","Sc":"โชผ","sc":"โ‰ป","sccue":"โ‰ฝ","sce":"โชฐ","scE":"โชด","Scedil":"ลž","scedil":"ลŸ","Scirc":"ลœ","scirc":"ล","scnap":"โชบ","scnE":"โชถ","scnsim":"โ‹ฉ","scpolint":"โจ“","scsim":"โ‰ฟ","Scy":"ะก","scy":"ั","sdotb":"โŠก","sdot":"โ‹…","sdote":"โฉฆ","searhk":"โคฅ","searr":"โ†˜","seArr":"โ‡˜","searrow":"โ†˜","sect":"ยง","semi":";","seswar":"โคฉ","setminus":"โˆ–","setmn":"โˆ–","sext":"โœถ","Sfr":"๐”–","sfr":"๐”ฐ","sfrown":"โŒข","sharp":"โ™ฏ","SHCHcy":"ะฉ","shchcy":"ั‰","SHcy":"ะจ","shcy":"ัˆ","ShortDownArrow":"โ†“","ShortLeftArrow":"โ†","shortmid":"โˆฃ","shortparallel":"โˆฅ","ShortRightArrow":"โ†’","ShortUpArrow":"โ†‘","shy":"ยญ","Sigma":"ฮฃ","sigma":"ฯƒ","sigmaf":"ฯ‚","sigmav":"ฯ‚","sim":"โˆผ","simdot":"โฉช","sime":"โ‰ƒ","simeq":"โ‰ƒ","simg":"โชž","simgE":"โช ","siml":"โช","simlE":"โชŸ","simne":"โ‰†","simplus":"โจค","simrarr":"โฅฒ","slarr":"โ†","SmallCircle":"โˆ˜","smallsetminus":"โˆ–","smashp":"โจณ","smeparsl":"โงค","smid":"โˆฃ","smile":"โŒฃ","smt":"โชช","smte":"โชฌ","smtes":"โชฌ๏ธ€","SOFTcy":"ะฌ","softcy":"ัŒ","solbar":"โŒฟ","solb":"โง„","sol":"/","Sopf":"๐•Š","sopf":"๐•ค","spades":"โ™ ","spadesuit":"โ™ ","spar":"โˆฅ","sqcap":"โŠ“","sqcaps":"โŠ“๏ธ€","sqcup":"โŠ”","sqcups":"โŠ”๏ธ€","Sqrt":"โˆš","sqsub":"โŠ","sqsube":"โŠ‘","sqsubset":"โŠ","sqsubseteq":"โŠ‘","sqsup":"โА","sqsupe":"โŠ’","sqsupset":"โА","sqsupseteq":"โŠ’","square":"โ–ก","Square":"โ–ก","SquareIntersection":"โŠ“","SquareSubset":"โŠ","SquareSubsetEqual":"โŠ‘","SquareSuperset":"โА","SquareSupersetEqual":"โŠ’","SquareUnion":"โŠ”","squarf":"โ–ช","squ":"โ–ก","squf":"โ–ช","srarr":"โ†’","Sscr":"๐’ฎ","sscr":"๐“ˆ","ssetmn":"โˆ–","ssmile":"โŒฃ","sstarf":"โ‹†","Star":"โ‹†","star":"โ˜†","starf":"โ˜…","straightepsilon":"ฯต","straightphi":"ฯ•","strns":"ยฏ","sub":"โŠ‚","Sub":"โ‹","subdot":"โชฝ","subE":"โซ…","sube":"โІ","subedot":"โซƒ","submult":"โซ","subnE":"โซ‹","subne":"โŠŠ","subplus":"โชฟ","subrarr":"โฅน","subset":"โŠ‚","Subset":"โ‹","subseteq":"โІ","subseteqq":"โซ…","SubsetEqual":"โІ","subsetneq":"โŠŠ","subsetneqq":"โซ‹","subsim":"โซ‡","subsub":"โซ•","subsup":"โซ“","succapprox":"โชธ","succ":"โ‰ป","succcurlyeq":"โ‰ฝ","Succeeds":"โ‰ป","SucceedsEqual":"โชฐ","SucceedsSlantEqual":"โ‰ฝ","SucceedsTilde":"โ‰ฟ","succeq":"โชฐ","succnapprox":"โชบ","succneqq":"โชถ","succnsim":"โ‹ฉ","succsim":"โ‰ฟ","SuchThat":"โˆ‹","sum":"โˆ‘","Sum":"โˆ‘","sung":"โ™ช","sup1":"ยน","sup2":"ยฒ","sup3":"ยณ","sup":"โŠƒ","Sup":"โ‹‘","supdot":"โชพ","supdsub":"โซ˜","supE":"โซ†","supe":"โЇ","supedot":"โซ„","Superset":"โŠƒ","SupersetEqual":"โЇ","suphsol":"โŸ‰","suphsub":"โซ—","suplarr":"โฅป","supmult":"โซ‚","supnE":"โซŒ","supne":"โŠ‹","supplus":"โซ€","supset":"โŠƒ","Supset":"โ‹‘","supseteq":"โЇ","supseteqq":"โซ†","supsetneq":"โŠ‹","supsetneqq":"โซŒ","supsim":"โซˆ","supsub":"โซ”","supsup":"โซ–","swarhk":"โคฆ","swarr":"โ†™","swArr":"โ‡™","swarrow":"โ†™","swnwar":"โคช","szlig":"รŸ","Tab":"\\t","target":"โŒ–","Tau":"ฮค","tau":"ฯ„","tbrk":"โŽด","Tcaron":"ลค","tcaron":"ลฅ","Tcedil":"ลข","tcedil":"ลฃ","Tcy":"ะข","tcy":"ั‚","tdot":"โƒ›","telrec":"โŒ•","Tfr":"๐”—","tfr":"๐”ฑ","there4":"โˆด","therefore":"โˆด","Therefore":"โˆด","Theta":"ฮ˜","theta":"ฮธ","thetasym":"ฯ‘","thetav":"ฯ‘","thickapprox":"โ‰ˆ","thicksim":"โˆผ","ThickSpace":"โŸโ€Š","ThinSpace":"โ€‰","thinsp":"โ€‰","thkap":"โ‰ˆ","thksim":"โˆผ","THORN":"รž","thorn":"รพ","tilde":"หœ","Tilde":"โˆผ","TildeEqual":"โ‰ƒ","TildeFullEqual":"โ‰…","TildeTilde":"โ‰ˆ","timesbar":"โจฑ","timesb":"โŠ ","times":"ร—","timesd":"โจฐ","tint":"โˆญ","toea":"โคจ","topbot":"โŒถ","topcir":"โซฑ","top":"โŠค","Topf":"๐•‹","topf":"๐•ฅ","topfork":"โซš","tosa":"โคฉ","tprime":"โ€ด","trade":"โ„ข","TRADE":"โ„ข","triangle":"โ–ต","triangledown":"โ–ฟ","triangleleft":"โ—ƒ","trianglelefteq":"โŠด","triangleq":"โ‰œ","triangleright":"โ–น","trianglerighteq":"โŠต","tridot":"โ—ฌ","trie":"โ‰œ","triminus":"โจบ","TripleDot":"โƒ›","triplus":"โจน","trisb":"โง","tritime":"โจป","trpezium":"โข","Tscr":"๐’ฏ","tscr":"๐“‰","TScy":"ะฆ","tscy":"ั†","TSHcy":"ะ‹","tshcy":"ั›","Tstrok":"ลฆ","tstrok":"ลง","twixt":"โ‰ฌ","twoheadleftarrow":"โ†ž","twoheadrightarrow":"โ† ","Uacute":"รš","uacute":"รบ","uarr":"โ†‘","Uarr":"โ†Ÿ","uArr":"โ‡‘","Uarrocir":"โฅ‰","Ubrcy":"ะŽ","ubrcy":"ัž","Ubreve":"ลฌ","ubreve":"ลญ","Ucirc":"ร›","ucirc":"รป","Ucy":"ะฃ","ucy":"ัƒ","udarr":"โ‡…","Udblac":"ลฐ","udblac":"ลฑ","udhar":"โฅฎ","ufisht":"โฅพ","Ufr":"๐”˜","ufr":"๐”ฒ","Ugrave":"ร™","ugrave":"รน","uHar":"โฅฃ","uharl":"โ†ฟ","uharr":"โ†พ","uhblk":"โ–€","ulcorn":"โŒœ","ulcorner":"โŒœ","ulcrop":"โŒ","ultri":"โ—ธ","Umacr":"ลช","umacr":"ลซ","uml":"ยจ","UnderBar":"_","UnderBrace":"โŸ","UnderBracket":"โŽต","UnderParenthesis":"โ","Union":"โ‹ƒ","UnionPlus":"โŠŽ","Uogon":"ลฒ","uogon":"ลณ","Uopf":"๐•Œ","uopf":"๐•ฆ","UpArrowBar":"โค’","uparrow":"โ†‘","UpArrow":"โ†‘","Uparrow":"โ‡‘","UpArrowDownArrow":"โ‡…","updownarrow":"โ†•","UpDownArrow":"โ†•","Updownarrow":"โ‡•","UpEquilibrium":"โฅฎ","upharpoonleft":"โ†ฟ","upharpoonright":"โ†พ","uplus":"โŠŽ","UpperLeftArrow":"โ†–","UpperRightArrow":"โ†—","upsi":"ฯ…","Upsi":"ฯ’","upsih":"ฯ’","Upsilon":"ฮฅ","upsilon":"ฯ…","UpTeeArrow":"โ†ฅ","UpTee":"โŠฅ","upuparrows":"โ‡ˆ","urcorn":"โŒ","urcorner":"โŒ","urcrop":"โŒŽ","Uring":"ลฎ","uring":"ลฏ","urtri":"โ—น","Uscr":"๐’ฐ","uscr":"๐“Š","utdot":"โ‹ฐ","Utilde":"ลจ","utilde":"ลฉ","utri":"โ–ต","utrif":"โ–ด","uuarr":"โ‡ˆ","Uuml":"รœ","uuml":"รผ","uwangle":"โฆง","vangrt":"โฆœ","varepsilon":"ฯต","varkappa":"ฯฐ","varnothing":"โˆ…","varphi":"ฯ•","varpi":"ฯ–","varpropto":"โˆ","varr":"โ†•","vArr":"โ‡•","varrho":"ฯฑ","varsigma":"ฯ‚","varsubsetneq":"โŠŠ๏ธ€","varsubsetneqq":"โซ‹๏ธ€","varsupsetneq":"โŠ‹๏ธ€","varsupsetneqq":"โซŒ๏ธ€","vartheta":"ฯ‘","vartriangleleft":"โŠฒ","vartriangleright":"โŠณ","vBar":"โซจ","Vbar":"โซซ","vBarv":"โซฉ","Vcy":"ะ’","vcy":"ะฒ","vdash":"โŠข","vDash":"โŠจ","Vdash":"โŠฉ","VDash":"โŠซ","Vdashl":"โซฆ","veebar":"โŠป","vee":"โˆจ","Vee":"โ‹","veeeq":"โ‰š","vellip":"โ‹ฎ","verbar":"|","Verbar":"โ€–","vert":"|","Vert":"โ€–","VerticalBar":"โˆฃ","VerticalLine":"|","VerticalSeparator":"โ˜","VerticalTilde":"โ‰€","VeryThinSpace":"โ€Š","Vfr":"๐”™","vfr":"๐”ณ","vltri":"โŠฒ","vnsub":"โŠ‚โƒ’","vnsup":"โŠƒโƒ’","Vopf":"๐•","vopf":"๐•ง","vprop":"โˆ","vrtri":"โŠณ","Vscr":"๐’ฑ","vscr":"๐“‹","vsubnE":"โซ‹๏ธ€","vsubne":"โŠŠ๏ธ€","vsupnE":"โซŒ๏ธ€","vsupne":"โŠ‹๏ธ€","Vvdash":"โŠช","vzigzag":"โฆš","Wcirc":"ลด","wcirc":"ลต","wedbar":"โฉŸ","wedge":"โˆง","Wedge":"โ‹€","wedgeq":"โ‰™","weierp":"โ„˜","Wfr":"๐”š","wfr":"๐”ด","Wopf":"๐•Ž","wopf":"๐•จ","wp":"โ„˜","wr":"โ‰€","wreath":"โ‰€","Wscr":"๐’ฒ","wscr":"๐“Œ","xcap":"โ‹‚","xcirc":"โ—ฏ","xcup":"โ‹ƒ","xdtri":"โ–ฝ","Xfr":"๐”›","xfr":"๐”ต","xharr":"โŸท","xhArr":"โŸบ","Xi":"ฮž","xi":"ฮพ","xlarr":"โŸต","xlArr":"โŸธ","xmap":"โŸผ","xnis":"โ‹ป","xodot":"โจ€","Xopf":"๐•","xopf":"๐•ฉ","xoplus":"โจ","xotime":"โจ‚","xrarr":"โŸถ","xrArr":"โŸน","Xscr":"๐’ณ","xscr":"๐“","xsqcup":"โจ†","xuplus":"โจ„","xutri":"โ–ณ","xvee":"โ‹","xwedge":"โ‹€","Yacute":"ร","yacute":"รฝ","YAcy":"ะฏ","yacy":"ั","Ycirc":"ลถ","ycirc":"ลท","Ycy":"ะซ","ycy":"ั‹","yen":"ยฅ","Yfr":"๐”œ","yfr":"๐”ถ","YIcy":"ะ‡","yicy":"ั—","Yopf":"๐•","yopf":"๐•ช","Yscr":"๐’ด","yscr":"๐“Ž","YUcy":"ะฎ","yucy":"ัŽ","yuml":"รฟ","Yuml":"ลธ","Zacute":"ลน","zacute":"ลบ","Zcaron":"ลฝ","zcaron":"ลพ","Zcy":"ะ—","zcy":"ะท","Zdot":"ลป","zdot":"ลผ","zeetrf":"โ„จ","ZeroWidthSpace":"โ€‹","Zeta":"ฮ–","zeta":"ฮถ","zfr":"๐”ท","Zfr":"โ„จ","ZHcy":"ะ–","zhcy":"ะถ","zigrarr":"โ‡","zopf":"๐•ซ","Zopf":"โ„ค","Zscr":"๐’ต","zscr":"๐“","zwj":"โ€","zwnj":"โ€Œ"}')},2836:e=>{"use strict";e.exports=JSON.parse('{"Aacute":"ร","aacute":"รก","Acirc":"ร‚","acirc":"รข","acute":"ยด","AElig":"ร†","aelig":"รฆ","Agrave":"ร€","agrave":"ร ","amp":"&","AMP":"&","Aring":"ร…","aring":"รฅ","Atilde":"รƒ","atilde":"รฃ","Auml":"ร„","auml":"รค","brvbar":"ยฆ","Ccedil":"ร‡","ccedil":"รง","cedil":"ยธ","cent":"ยข","copy":"ยฉ","COPY":"ยฉ","curren":"ยค","deg":"ยฐ","divide":"รท","Eacute":"ร‰","eacute":"รฉ","Ecirc":"รŠ","ecirc":"รช","Egrave":"รˆ","egrave":"รจ","ETH":"ร","eth":"รฐ","Euml":"ร‹","euml":"รซ","frac12":"ยฝ","frac14":"ยผ","frac34":"ยพ","gt":">","GT":">","Iacute":"ร","iacute":"รญ","Icirc":"รŽ","icirc":"รฎ","iexcl":"ยก","Igrave":"รŒ","igrave":"รฌ","iquest":"ยฟ","Iuml":"ร","iuml":"รฏ","laquo":"ยซ","lt":"<","LT":"<","macr":"ยฏ","micro":"ยต","middot":"ยท","nbsp":"ย ","not":"ยฌ","Ntilde":"ร‘","ntilde":"รฑ","Oacute":"ร“","oacute":"รณ","Ocirc":"ร”","ocirc":"รด","Ograve":"ร’","ograve":"รฒ","ordf":"ยช","ordm":"ยบ","Oslash":"ร˜","oslash":"รธ","Otilde":"ร•","otilde":"รต","Ouml":"ร–","ouml":"รถ","para":"ยถ","plusmn":"ยฑ","pound":"ยฃ","quot":"\\"","QUOT":"\\"","raquo":"ยป","reg":"ยฎ","REG":"ยฎ","sect":"ยง","shy":"ยญ","sup1":"ยน","sup2":"ยฒ","sup3":"ยณ","szlig":"รŸ","THORN":"รž","thorn":"รพ","times":"ร—","Uacute":"รš","uacute":"รบ","Ucirc":"ร›","ucirc":"รป","Ugrave":"ร™","ugrave":"รน","uml":"ยจ","Uuml":"รœ","uuml":"รผ","Yacute":"ร","yacute":"รฝ","yen":"ยฅ","yuml":"รฟ"}')},8689:e=>{"use strict";e.exports=JSON.parse('{"amp":"&","apos":"\'","gt":">","lt":"<","quot":"\\""}')}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var i=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(i.exports,i,i.exports,__webpack_require__),i.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var i in t)__webpack_require__.o(t,i)&&!__webpack_require__.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};(()=>{"use strict";class e{lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){let s=[];return this.decompose(0,e,s,2),n.length&&n.decompose(0,n.length,s,3),this.decompose(t,this.length,s,1),i.from(s,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){let n=[];return this.decompose(e,t,n,0),i.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),i=this.length-this.scanIdentical(e,-1),n=new r(this),s=new r(e);for(let e=t,r=t;;){if(n.next(e),s.next(e),e=0,n.lineBreak!=s.lineBreak||n.done!=s.done||n.value!=s.value)return!1;if(r+=n.value.length,n.done||r>=i)return!0}}iter(e=1){return new r(this,e)}iterRange(e,t=this.length){return new o(this,e,t)}iterLines(e,t){let i;if(null==e)i=this.iter();else{null==t&&(t=this.lines+1);let n=this.line(e).from;i=this.iterRange(n,Math.max(n,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new a(i)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(n){if(0==n.length)throw new RangeError("A document must have at least one line");return 1!=n.length||n[0]?n.length<=32?new t(n):i.from(t.split(n,[])):e.empty}}class t extends e{constructor(e,t=function(e){let t=-1;for(let i of e)t+=i.length+1;return t}(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,i,n){for(let s=0;;s++){let r=this.text[s],o=n+r.length;if((t?i:o)>=e)return new l(n,o,i,r);n=o+1,i++}}decompose(e,i,r,o){let a=e<=0&&i>=this.length?this:new t(s(this.text,e,i),Math.min(i,this.length)-Math.max(0,e));if(1&o){let e=r.pop(),i=n(a.text,e.text.slice(),0,a.length);if(i.length<=32)r.push(new t(i,e.length+a.length));else{let e=i.length>>1;r.push(new t(i.slice(0,e)),new t(i.slice(e)))}}else r.push(a)}replace(e,r,o){if(!(o instanceof t))return super.replace(e,r,o);let a=n(this.text,n(o.text,s(this.text,0,e)),r),l=this.length+o.length-(r-e);return a.length<=32?new t(a,l):i.from(t.split(a,[]),l)}sliceString(e,t=this.length,i="\n"){let n="";for(let s=0,r=0;s<=t&&re&&r&&(n+=i),es&&(n+=o.slice(Math.max(0,e-s),t-s)),s=a+1}return n}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(e,i){let n=[],s=-1;for(let r of e)n.push(r),s+=r.length+1,32==n.length&&(i.push(new t(n,s)),n=[],s=-1);return s>-1&&i.push(new t(n,s)),i}}class i extends e{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let t of e)this.lines+=t.lines}lineInner(e,t,i,n){for(let s=0;;s++){let r=this.children[s],o=n+r.length,a=i+r.lines-1;if((t?a:o)>=e)return r.lineInner(e,t,i,n);n=o+1,i=a+1}}decompose(e,t,i,n){for(let s=0,r=0;r<=t&&s=r){let s=n&((r<=e?1:0)|(a>=t?2:0));r>=e&&a<=t&&!s?i.push(o):o.decompose(e-r,t-r,i,s)}r=a+1}}replace(e,t,n){if(n.lines=r&&t<=a){let l=o.replace(e-r,t-r,n),h=this.lines-o.lines+l.lines;if(l.lines>4&&l.lines>h>>6){let r=this.children.slice();return r[s]=l,new i(r,this.length-(t-e)+n.length)}return super.replace(r,a,l)}r=a+1}return super.replace(e,t,n)}sliceString(e,t=this.length,i="\n"){let n="";for(let s=0,r=0;se&&s&&(n+=i),er&&(n+=o.sliceString(e-r,t-r,i)),r=a+1}return n}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(e,t){if(!(e instanceof i))return 0;let n=0,[s,r,o,a]=t>0?[0,0,this.children.length,e.children.length]:[this.children.length-1,e.children.length-1,-1,-1];for(;;s+=t,r+=t){if(s==o||r==a)return n;let i=this.children[s],l=e.children[r];if(i!=l)return n+i.scanIdentical(l,t);n+=i.length+1}}static from(e,n=e.reduce(((e,t)=>e+t.length+1),-1)){let s=0;for(let t of e)s+=t.lines;if(s<32){let i=[];for(let t of e)t.flatten(i);return new t(i,n)}let r=Math.max(32,s>>5),o=r<<1,a=r>>1,l=[],h=0,c=-1,d=[];function u(e){let n;if(e.lines>o&&e instanceof i)for(let t of e.children)u(t);else e.lines>a&&(h>a||!h)?(p(),l.push(e)):e instanceof t&&h&&(n=d[d.length-1])instanceof t&&e.lines+n.lines<=32?(h+=e.lines,c+=e.length+1,d[d.length-1]=new t(n.text.concat(e.text),n.length+1+e.length)):(h+e.lines>r&&p(),h+=e.lines,c+=e.length+1,d.push(e))}function p(){0!=h&&(l.push(1==d.length?d[0]:i.from(d,c)),c=-1,h=d.length=0)}for(let t of e)u(t);return p(),1==l.length?l[0]:new i(l,n)}}function n(e,t,i=0,n=1e9){for(let s=0,r=0,o=!0;r=i&&(l>n&&(a=a.slice(0,n-s)),s0?1:(e instanceof t?e.text.length:e.children.length)<<1]}nextInner(e,i){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,s=this.nodes[n],r=this.offsets[n],o=r>>1,a=s instanceof t?s.text.length:s.children.length;if(o==(i>0?a:0)){if(0==n)return this.done=!0,this.value="",this;i>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((1&r)==(i>0?0:1)){if(this.offsets[n]+=i,0==e)return this.lineBreak=!0,this.value="\n",this;e--}else if(s instanceof t){let t=s.text[o+(i<0?-1:0)];if(this.offsets[n]+=i,t.length>Math.max(0,e))return this.value=0==e?t:i>0?t.slice(e):t.slice(0,t.length-e),this;e-=t.length}else{let r=s.children[o+(i<0?-1:0)];e>r.length?(e-=r.length,this.offsets[n]+=i):(i<0&&this.offsets[n]--,this.nodes.push(r),this.offsets.push(i>0?1:(r instanceof t?r.text.length:r.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}}class o{constructor(e,t,i){this.value="",this.done=!1,this.cursor=new r(e,t>i?-1:1),this.pos=t>i?e.length:0,this.from=Math.min(t,i),this.to=Math.max(t,i)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value="",this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let i=t<0?this.pos-this.from:this.to-this.pos;e>i&&(e=i),i-=e;let{value:n}=this.cursor.next(e);return this.pos+=(n.length+e)*t,this.value=n.length<=i?n:t<0?n.slice(n.length-i):n.slice(0,i),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&""!=this.value}}class a{constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}next(e=0){let{done:t,lineBreak:i,value:n}=this.inner.next(e);return t?(this.done=!0,this.value=""):i?this.afterBreak?this.value="":(this.afterBreak=!0,this.next()):(this.value=n,this.afterBreak=!1),this}get lineBreak(){return!1}}"undefined"!=typeof Symbol&&(e.prototype[Symbol.iterator]=function(){return this.iter()},r.prototype[Symbol.iterator]=o.prototype[Symbol.iterator]=a.prototype[Symbol.iterator]=function(){return this});class l{constructor(e,t,i,n){this.from=e,this.to=t,this.number=i,this.text=n}get length(){return this.to-this.from}}let h="lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,3b,f,,w,1j,,,,4,8,4,,3,7,a,2,t,,1m,,,,2,4,8,,9,,a,2,q,,2,2,1l,,4,2,4,2,2,3,3,,u,2,3,,b,2,1l,,4,5,,2,4,,k,2,m,6,,,1m,,,2,,4,8,,7,3,a,2,u,,1n,,,,c,,9,,14,,3,,1l,3,5,3,,4,7,2,b,2,t,,1m,,2,,2,,3,,5,2,7,2,b,2,s,2,1l,2,,,2,4,8,,9,,a,2,t,,20,,4,,2,3,,,8,,29,,2,7,c,8,2q,,2,9,b,6,22,2,r,,,,,,1j,e,,5,,2,5,b,,10,9,,2u,4,,6,,2,2,2,p,2,4,3,g,4,d,,2,2,6,,f,,jj,3,qa,3,t,3,t,2,u,2,1s,2,,7,8,,2,b,9,,19,3,3b,2,y,,3a,3,4,2,9,,6,3,63,2,2,,1m,,,7,,,,,2,8,6,a,2,,1c,h,1r,4,1c,7,,,5,,14,9,c,2,w,4,2,2,,3,1k,,,2,3,,,3,1m,8,2,2,48,3,,d,,7,4,,6,,3,2,5i,1m,,5,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,p,2,5,,47,2,q,i,d,,12,8,p,b,1a,3,1c,,2,4,2,2,13,,1v,6,2,2,2,2,c,,8,,1b,,1f,,,3,2,2,5,2,,,16,2,8,,6m,,2,,4,,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,ar,2,49,b,4w,,1i,f,1k,3,1d,4,2,2,1x,3,10,5,,8,1q,,c,2,1g,9,a,4,2,,2n,3,2,,,2,6,,4g,,3,8,l,2,1l,2,,,,,m,,e,7,3,5,5f,8,2,3,,,n,,29,,2,6,,,2,,,2,,2,6j,,2,4,6,2,,2,r,2,2d,8,2,,,2,2y,,,,2,6,,,2t,3,2,4,,5,77,9,,2,6t,,a,2,,,4,,40,4,2,2,4,,w,a,14,6,2,4,8,,9,6,2,3,1a,d,,2,ba,7,,6,,,2a,m,2,7,,2,,2,3e,6,3,,,2,,7,,,20,2,3,,,,9n,2,f0b,5,1n,7,t4,,1r,4,29,,f5k,2,43q,,,3,4,5,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,79,7,c5,4,15s,7,31,7,240,5,gx7k,2o,3k,6o".split(",").map((e=>e?parseInt(e,36):1));for(let e=1;ee)return h[t-1]<=e;return!1}function d(e){return e>=127462&&e<=127487}const u=8205;function p(e,t,i=!0,n=!0){return(i?f:m)(e,t,n)}function f(e,t,i){if(t==e.length)return t;t&&g(e.charCodeAt(t))&&v(e.charCodeAt(t-1))&&t--;let n=O(e,t);for(t+=_(n);t=0&&d(O(e,n));)i++,n-=2;if(i%2==0)break;t+=2}}}return t}function m(e,t,i){for(;t>0;){let n=f(e,t-2,i);if(n=56320&&e<57344}function v(e){return e>=55296&&e<56320}function O(e,t){let i=e.charCodeAt(t);if(!v(i)||t+1==e.length)return i;let n=e.charCodeAt(t+1);return g(n)?n-56320+(i-55296<<10)+65536:i}function b(e){return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}function _(e){return e<65536?1:2}const y=/\r\n?|\n/;var w=function(e){return e[e.Simple=0]="Simple",e[e.TrackDel=1]="TrackDel",e[e.TrackBefore=2]="TrackBefore",e[e.TrackAfter=3]="TrackAfter",e}(w||(w={}));class x{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;te)return s+(e-n);s+=o}else{if(i!=w.Simple&&l>=e&&(i==w.TrackDel&&ne||i==w.TrackBefore&&ne))return null;if(l>e||l==e&&t<0&&!o)return e==n||t<0?s:s+a;s+=a}n=l}if(e>n)throw new RangeError(`Position ${e} is out of range for changeset of length ${n}`);return s}touchesRange(e,t=e){for(let i=0,n=0;i=0&&n<=t&&s>=e)return!(nt)||"cover";n=s}return!1}toString(){let e="";for(let t=0;t=0?":"+n:"")}return e}toJSON(){return this.sections}static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some((e=>"number"!=typeof e)))throw new RangeError("Invalid JSON representation of ChangeDesc");return new x(e)}static create(e){return new x(e)}}class S extends x{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw new RangeError("Applying change set to a document with the wrong length");return C(this,((t,i,n,s,r)=>e=e.replace(n,n+(i-t),r)),!1),e}mapDesc(e,t=!1){return P(this,e,t,!0)}invert(t){let i=this.sections.slice(),n=[];for(let s=0,r=0;s=0){i[s]=a,i[s+1]=o;let l=s>>1;for(;n.length0&&T(i,t,s.text),s.forward(e),o+=e}let l=e[r++];for(;o>1].toJSON()))}return e}static of(t,i,n){let s=[],r=[],o=0,a=null;function l(e=!1){if(!e&&!s.length)return;oa||t<0||a>i)throw new RangeError(`Invalid change range ${t} to ${a} (in doc of length ${i})`);let d=c?"string"==typeof c?e.of(c.split(n||y)):c:e.empty,u=d.length;if(t==a&&0==u)return;to&&k(s,t-o,-1),k(s,a-t,u),T(r,s,d),o=a}}(t),l(!a),a}static empty(e){return new S(e?[e,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw new RangeError("Invalid JSON representation of ChangeSet");let i=[],n=[];for(let s=0;st&&"string"!=typeof e)))throw new RangeError("Invalid JSON representation of ChangeSet");if(1==r.length)i.push(r[0],0);else{for(;n.length=0&&i<=0&&i==e[s+1]?e[s]+=t:0==t&&0==e[s]?e[s+1]+=i:n?(e[s]+=t,e[s+1]+=i):e.push(t,i)}function T(t,i,n){if(0==n.length)return;let s=i.length-2>>1;if(s>1])),!(n||a==t.sections.length||t.sections[a+1]<0);)l=t.sections[a++],h=t.sections[a++];i(r,c,o,d,u),r=c,o=d}}}function P(e,t,i,n=!1){let s=[],r=n?[]:null,o=new E(e),a=new E(t);for(let e=-1;;)if(-1==o.ins&&-1==a.ins){let e=Math.min(o.len,a.len);k(s,e,-1),o.forward(e),a.forward(e)}else if(a.ins>=0&&(o.ins<0||e==o.i||0==o.off&&(a.len=0&&e=0)){if(o.done&&a.done)return r?S.createSet(s,r):x.create(s);throw new Error("Mismatched change set lengths")}{let t=0,i=o.len;for(;i;)if(-1==a.ins){let e=Math.min(i,a.len);t+=e,i-=e,a.forward(e)}else{if(!(0==a.ins&&a.lent||o.ins>=0&&o.len>t)&&(e||n.length>i),r.forward2(t),o.forward(t)}}else k(n,0,o.ins,e),s&&T(s,n,o.text),o.next()}}class E{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i>1;return i>=t.length?e.empty:t[i]}textBit(t){let{inserted:i}=this.set,n=this.i-2>>1;return n>=i.length&&!t?e.empty:i[n].slice(this.off,null==t?void 0:this.off+t)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){-1==this.ins?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}}class A{constructor(e,t,i){this.from=e,this.to=t,this.flags=i}get anchor(){return 32&this.flags?this.to:this.from}get head(){return 32&this.flags?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return 8&this.flags?-1:16&this.flags?1:0}get bidiLevel(){let e=7&this.flags;return 7==e?null:e}get goalColumn(){let e=this.flags>>6;return 16777215==e?void 0:e}map(e,t=-1){let i,n;return this.empty?i=n=e.mapPos(this.from,t):(i=e.mapPos(this.from,1),n=e.mapPos(this.to,-1)),i==this.from&&n==this.to?this:new A(i,n,this.flags)}extend(e,t=e){if(e<=this.anchor&&t>=this.anchor)return R.range(e,t);let i=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return R.range(this.anchor,i)}eq(e){return this.anchor==e.anchor&&this.head==e.head}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||"number"!=typeof e.anchor||"number"!=typeof e.head)throw new RangeError("Invalid JSON representation for SelectionRange");return R.range(e.anchor,e.head)}static create(e,t,i){return new A(e,t,i)}}class R{constructor(e,t){this.ranges=e,this.mainIndex=t}map(e,t=-1){return e.empty?this:R.create(this.ranges.map((i=>i.map(e,t))),this.mainIndex)}eq(e){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let t=0;te.toJSON())),main:this.mainIndex}}static fromJSON(e){if(!e||!Array.isArray(e.ranges)||"number"!=typeof e.main||e.main>=e.ranges.length)throw new RangeError("Invalid JSON representation for EditorSelection");return new R(e.ranges.map((e=>A.fromJSON(e))),e.main)}static single(e,t=e){return new R([R.range(e,t)],0)}static create(e,t=0){if(0==e.length)throw new RangeError("A selection needs at least one range");for(let i=0,n=0;ne?8:0)|s)}static normalized(e,t=0){let i=e[t];e.sort(((e,t)=>e.from-t.from)),t=e.indexOf(i);for(let i=1;in.head?R.range(o,r):R.range(r,o))}}return new R(e,t)}}function D(e,t){for(let i of e.ranges)if(i.to>t)throw new RangeError("Selection points outside of document")}let I=0;class q{constructor(e,t,i,n,s){this.combine=e,this.compareInput=t,this.compare=i,this.isStatic=n,this.id=I++,this.default=e([]),this.extensions="function"==typeof s?s(this):s}get reader(){return this}static define(e={}){return new q(e.combine||(e=>e),e.compareInput||((e,t)=>e===t),e.compare||(e.combine?(e,t)=>e===t:L),!!e.static,e.enables)}of(e){return new N([],this,0,e)}compute(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new N(e,this,1,t)}computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static facet");return new N(e,this,2,t)}from(e,t){return t||(t=e=>e),this.compute([e],(i=>t(i.field(e))))}}function L(e,t){return e==t||e.length==t.length&&e.every(((e,i)=>e===t[i]))}class N{constructor(e,t,i,n){this.dependencies=e,this.facet=t,this.type=i,this.value=n,this.id=I++}dynamicSlot(e){var t;let i=this.value,n=this.facet.compareInput,s=this.id,r=e[s]>>1,o=2==this.type,a=!1,l=!1,h=[];for(let i of this.dependencies)"doc"==i?a=!0:"selection"==i?l=!0:0==(1&(null!==(t=e[i.id])&&void 0!==t?t:1))&&h.push(e[i.id]);return{create:e=>(e.values[r]=i(e),1),update(e,t){if(a&&t.docChanged||l&&(t.docChanged||t.selection)||$(e,h)){let t=i(e);if(o?!B(t,e.values[r],n):!n(t,e.values[r]))return e.values[r]=t,1}return 0},reconfigure:(e,t)=>{let a,l=t.config.address[s];if(null!=l){let s=G(t,l);if(this.dependencies.every((i=>i instanceof q?t.facet(i)===e.facet(i):!(i instanceof j)||t.field(i,!1)==e.field(i,!1)))||(o?B(a=i(e),s,n):n(a=i(e),s)))return e.values[r]=s,0}else a=i(e);return e.values[r]=a,1}}}}function B(e,t,i){if(e.length!=t.length)return!1;for(let n=0;ne[t.id])),s=i.map((e=>e.type)),r=n.filter((e=>!(1&e))),o=e[t.id]>>1;function a(e){let i=[];for(let t=0;te===t),e);return e.provide&&(t.provides=e.provide(t)),t}create(e){let t=e.facet(z).find((e=>e.field==this));return((null==t?void 0:t.create)||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:e=>(e.values[t]=this.create(e),1),update:(e,i)=>{let n=e.values[t],s=this.updateF(n,i);return this.compareF(n,s)?0:(e.values[t]=s,1)},reconfigure:(e,i)=>null!=i.config.address[this.id]?(e.values[t]=i.field(this),0):(e.values[t]=this.create(e),1)}}init(e){return[this,z.of({field:this,create:e})]}get extension(){return this}}function W(e){return t=>new U(t,e)}const V={highest:W(0),high:W(1),default:W(2),low:W(3),lowest:W(4)};class U{constructor(e,t){this.inner=e,this.prec=t}}class F{of(e){return new H(this,e)}reconfigure(e){return F.reconfigure.of({compartment:this,extension:e})}get(e){return e.config.compartments.get(this)}}class H{constructor(e,t){this.compartment=e,this.inner=t}}class X{constructor(e,t,i,n,s,r){for(this.base=e,this.compartments=t,this.dynamicSlots=i,this.address=n,this.staticValues=s,this.facets=r,this.statusTemplate=[];this.statusTemplate.length>1]}static resolve(e,t,i){let n=[],s=Object.create(null),r=new Map;for(let i of function(e,t,i){let n=[[],[],[],[],[]],s=new Map;return function e(r,o){let a=s.get(r);if(null!=a){if(a<=o)return;let e=n[a].indexOf(r);e>-1&&n[a].splice(e,1),r instanceof H&&i.delete(r.compartment)}if(s.set(r,o),Array.isArray(r))for(let t of r)e(t,o);else if(r instanceof H){if(i.has(r.compartment))throw new RangeError("Duplicate use of compartment in extensions");let n=t.get(r.compartment)||r.inner;i.set(r.compartment,n),e(n,o)}else if(r instanceof U)e(r.inner,r.prec);else if(r instanceof j)n[o].push(r),r.provides&&e(r.provides,o);else if(r instanceof N)n[o].push(r),r.facet.extensions&&e(r.facet.extensions,2);else{let t=r.extension;if(!t)throw new Error(`Unrecognized extension value in extension set (${r}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);e(t,o)}}(e,2),n.reduce(((e,t)=>e.concat(t)))}(e,t,r))i instanceof j?n.push(i):(s[i.facet.id]||(s[i.facet.id]=[])).push(i);let o=Object.create(null),a=[],l=[];for(let e of n)o[e.id]=l.length<<1,l.push((t=>e.slot(t)));let h=null==i?void 0:i.config.facets;for(let e in s){let t=s[e],n=t[0].facet,r=h&&h[e]||[];if(t.every((e=>0==e.type)))if(o[n.id]=a.length<<1|1,L(r,t))a.push(i.facet(n));else{let e=n.combine(t.map((e=>e.value)));a.push(i&&n.compare(e,i.facet(n))?i.facet(n):e)}else{for(let e of t)0==e.type?(o[e.id]=a.length<<1|1,a.push(e.value)):(o[e.id]=l.length<<1,l.push((t=>e.dynamicSlot(t))));o[n.id]=l.length<<1,l.push((e=>Q(e,n,t)))}}let c=l.map((e=>e(o)));return new X(e,r,c,o,a,s)}}function Y(e,t){if(1&t)return 2;let i=t>>1,n=e.status[i];if(4==n)throw new Error("Cyclic dependency between fields and/or facets");if(2&n)return n;e.status[i]=4;let s=e.computeSlot(e,e.config.dynamicSlots[i]);return e.status[i]=2|s}function G(e,t){return 1&t?e.config.staticValues[t>>1]:e.values[t>>1]}const Z=q.define(),K=q.define({combine:e=>e.some((e=>e)),static:!0}),J=q.define({combine:e=>e.length?e[0]:void 0,static:!0}),ee=q.define(),te=q.define(),ie=q.define(),ne=q.define({combine:e=>!!e.length&&e[0]});class se{constructor(e,t){this.type=e,this.value=t}static define(){return new re}}class re{of(e){return new se(this,e)}}class oe{constructor(e){this.map=e}of(e){return new ae(this,e)}}class ae{constructor(e,t){this.type=e,this.value=t}map(e){let t=this.type.map(this.value,e);return void 0===t?void 0:t==this.value?this:new ae(this.type,t)}is(e){return this.type==e}static define(e={}){return new oe(e.map||(e=>e))}static mapEffects(e,t){if(!e.length)return e;let i=[];for(let n of e){let e=n.map(t);e&&i.push(e)}return i}}ae.reconfigure=ae.define(),ae.appendConfig=ae.define();class le{constructor(e,t,i,n,s,r){this.startState=e,this.changes=t,this.selection=i,this.effects=n,this.annotations=s,this.scrollIntoView=r,this._doc=null,this._state=null,i&&D(i,t.newLength),s.some((e=>e.type==le.time))||(this.annotations=s.concat(le.time.of(Date.now())))}static create(e,t,i,n,s,r){return new le(e,t,i,n,s,r)}get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startState.doc))}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(e){let t=this.annotation(le.userEvent);return!(!t||!(t==e||t.length>e.length&&t.slice(0,e.length)==e&&"."==t[e.length]))}}function he(e,t){let i=[];for(let n=0,s=0;;){let r,o;if(n=e[n]))r=e[n++],o=e[n++];else{if(!(s=0;s--){let r=i[s](e);r&&Object.keys(r).length&&(n=ce(n,de(t,r,e.changes.newLength),!0))}return n==e?e:le.create(t,e.changes,e.selection,n.effects,n.annotations,n.scrollIntoView)}(i?function(e){let t=e.startState,i=!0;for(let n of t.facet(ee)){let t=n(e);if(!1===t){i=!1;break}Array.isArray(t)&&(i=!0===i?t:he(i,t))}if(!0!==i){let n,s;if(!1===i)s=e.changes.invertedDesc,n=S.empty(t.doc.length);else{let t=e.changes.filter(i);n=t.changes,s=t.filtered.mapDesc(t.changes).invertedDesc}e=le.create(t,n,e.selection&&e.selection.map(s),ae.mapEffects(e.effects,s),e.annotations,e.scrollIntoView)}let n=t.facet(te);for(let i=n.length-1;i>=0;i--){let s=n[i](e);e=s instanceof le?s:Array.isArray(s)&&1==s.length&&s[0]instanceof le?s[0]:ue(t,fe(s),!1)}return e}(s):s)}le.time=se.define(),le.userEvent=se.define(),le.addToHistory=se.define(),le.remote=se.define();const pe=[];function fe(e){return null==e?pe:Array.isArray(e)?e:[e]}var me=function(e){return e[e.Word=0]="Word",e[e.Space=1]="Space",e[e.Other=2]="Other",e}(me||(me={}));const ge=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let ve;try{ve=new RegExp("[\\p{Alphabetic}\\p{Number}_]","u")}catch(e){}class Oe{constructor(e,t,i,n,s,r){this.config=e,this.doc=t,this.selection=i,this.values=n,this.status=e.statusTemplate.slice(),this.computeSlot=s,r&&(r._state=this);for(let e=0;es.set(t,e))),i=null),s.set(t.value.compartment,t.value.extension)):t.is(ae.reconfigure)?(i=null,n=t.value):t.is(ae.appendConfig)&&(i=null,n=fe(n).concat(t.value));i?t=e.startState.values.slice():(i=X.resolve(n,s,this),t=new Oe(i,this.doc,this.selection,i.dynamicSlots.map((()=>null)),((e,t)=>t.reconfigure(e,this)),null).values),new Oe(i,e.newDoc,e.newSelection,t,((t,i)=>i.update(t,e)),e)}replaceSelection(e){return"string"==typeof e&&(e=this.toText(e)),this.changeByRange((t=>({changes:{from:t.from,to:t.to,insert:e},range:R.cursor(t.from+e.length)})))}changeByRange(e){let t=this.selection,i=e(t.ranges[0]),n=this.changes(i.changes),s=[i.range],r=fe(i.effects);for(let i=1;is.spec.fromJSON(r,e))))}return Oe.create({doc:e.doc,selection:R.fromJSON(e.selection),extensions:t.extensions?n.concat([t.extensions]):n})}static create(t={}){let i=X.resolve(t.extensions||[],new Map),n=t.doc instanceof e?t.doc:e.of((t.doc||"").split(i.staticFacet(Oe.lineSeparator)||y)),s=t.selection?t.selection instanceof R?t.selection:R.single(t.selection.anchor,t.selection.head):R.single(0);return D(s,n.length),i.staticFacet(K)||(s=s.asSingle()),new Oe(i,n,s,i.dynamicSlots.map((()=>null)),((e,t)=>t.create(e)),null)}get tabSize(){return this.facet(Oe.tabSize)}get lineBreak(){return this.facet(Oe.lineSeparator)||"\n"}get readOnly(){return this.facet(ne)}phrase(e,...t){for(let t of this.facet(Oe.phrases))if(Object.prototype.hasOwnProperty.call(t,e)){e=t[e];break}return t.length&&(e=e.replace(/\$(\$|\d*)/g,((e,i)=>{if("$"==i)return"$";let n=+(i||1);return!n||n>t.length?e:t[n-1]}))),e}languageDataAt(e,t,i=-1){let n=[];for(let s of this.facet(Z))for(let r of s(this,t,i))Object.prototype.hasOwnProperty.call(r,e)&&n.push(r[e]);return n}charCategorizer(e){return t=this.languageDataAt("wordChars",e).join(""),e=>{if(!/\S/.test(e))return me.Space;if(function(e){if(ve)return ve.test(e);for(let t=0;t"ย€"&&(i.toUpperCase()!=i.toLowerCase()||ge.test(i)))return!0}return!1}(e))return me.Word;for(let i=0;i-1)return me.Word;return me.Other};var t}wordAt(e){let{text:t,from:i,length:n}=this.doc.lineAt(e),s=this.charCategorizer(e),r=e-i,o=e-i;for(;r>0;){let e=p(t,r,!1);if(s(t.slice(e,r))!=me.Word)break;r=e}for(;oe.length?e[0]:4}),Oe.lineSeparator=J,Oe.readOnly=ne,Oe.phrases=q.define({compare(e,t){let i=Object.keys(e),n=Object.keys(t);return i.length==n.length&&i.every((i=>e[i]==t[i]))}}),Oe.languageData=Z,Oe.changeFilter=ee,Oe.transactionFilter=te,Oe.transactionExtender=ie,F.reconfigure=ae.define();class _e{eq(e){return this==e}range(e,t=e){return ye.create(e,t,this)}}_e.prototype.startSide=_e.prototype.endSide=0,_e.prototype.point=!1,_e.prototype.mapMode=w.TrackDel;class ye{constructor(e,t,i){this.from=e,this.to=t,this.value=i}static create(e,t,i){return new ye(e,t,i)}}function we(e,t){return e.from-t.from||e.value.startSide-t.value.startSide}class xe{constructor(e,t,i,n){this.from=e,this.to=t,this.value=i,this.maxPoint=n}get length(){return this.to[this.to.length-1]}findIndex(e,t,i,n=0){let s=i?this.to:this.from;for(let r=n,o=s.length;;){if(r==o)return r;let n=r+o>>1,a=s[n]-e||(i?this.value[n].endSide:this.value[n].startSide)-t;if(n==r)return a>=0?r:o;a>=0?o=n:r=n+1}}between(e,t,i,n){for(let s=this.findIndex(t,-1e9,!0),r=this.findIndex(i,1e9,!1,s);sh||l==h&&c.startSide>0&&c.endSide<=0)continue;(h-l||c.endSide-c.startSide)<0||(r<0&&(r=l),c.point&&(o=Math.max(o,h-l)),i.push(c),n.push(l-r),s.push(h-r))}return{mapped:i.length?new xe(n,s,i,o):null,pos:r}}}class Se{constructor(e,t,i,n){this.chunkPos=e,this.chunk=t,this.nextLayer=i,this.maxPoint=n}static create(e,t,i,n){return new Se(e,t,i,n)}get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkEnd(e),this.nextLayer.length)}get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t of this.chunk)e+=t.value.length;return e}chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}update(e){let{add:t=[],sort:i=!1,filterFrom:n=0,filterTo:s=this.length}=e,r=e.filter;if(0==t.length&&!r)return this;if(i&&(t=t.slice().sort(we)),this.isEmpty)return t.length?Se.of(t):this;let o=new Ce(this,null,-1).goto(0),a=0,l=[],h=new ke;for(;o.value||a=0){let e=t[a++];h.addInner(e.from,e.to,e.value)||l.push(e)}else 1==o.rangeIndex&&o.chunkIndexthis.chunkEnd(o.chunkIndex)||so.to||s=s&&e<=s+r.length&&!1===r.between(s,e-s,t-s,i))return}this.nextLayer.between(e,t,i)}}iter(e=0){return Pe.from([this]).goto(e)}get isEmpty(){return this.nextLayer==this}static iter(e,t=0){return Pe.from(e).goto(t)}static compare(e,t,i,n,s=-1){let r=e.filter((e=>e.maxPoint>0||!e.isEmpty&&e.maxPoint>=s)),o=t.filter((e=>e.maxPoint>0||!e.isEmpty&&e.maxPoint>=s)),a=Te(r,o,i),l=new Ee(r,a,s),h=new Ee(o,a,s);i.iterGaps(((e,t,i)=>Ae(l,e,h,t,i,n))),i.empty&&0==i.length&&Ae(l,0,h,0,0,n)}static eq(e,t,i=0,n){null==n&&(n=999999999);let s=e.filter((e=>!e.isEmpty&&t.indexOf(e)<0)),r=t.filter((t=>!t.isEmpty&&e.indexOf(t)<0));if(s.length!=r.length)return!1;if(!s.length)return!0;let o=Te(s,r),a=new Ee(s,o,0).goto(i),l=new Ee(r,o,0).goto(i);for(;;){if(a.to!=l.to||!Re(a.active,l.active)||a.point&&(!l.point||!a.point.eq(l.point)))return!1;if(a.to>n)return!0;a.next(),l.next()}}static spans(e,t,i,n,s=-1){let r=new Ee(e,null,s).goto(t),o=t,a=r.openStart;for(;;){let e=Math.min(r.to,i);if(r.point){let i=r.activeForPoint(r.to),s=r.pointFromo&&(n.span(o,e,r.active,a),a=r.openEnd(e));if(r.to>i)return a+(r.point&&r.to>i?1:0);o=r.to,r.next()}}static of(e,t=!1){let i=new ke;for(let n of e instanceof ye?[e]:t?function(e){if(e.length>1)for(let t=e[0],i=1;i0)return e.slice().sort(we);t=n}return e}(e):e)i.add(n.from,n.to,n.value);return i.finish()}}Se.empty=new Se([],[],null,-1),Se.empty.nextLayer=Se.empty;class ke{finishChunk(e){this.chunks.push(new xe(this.from,this.to,this.value,this.maxPoint)),this.chunkPos.push(this.chunkStart),this.chunkStart=-1,this.setMaxPoint=Math.max(this.setMaxPoint,this.maxPoint),this.maxPoint=-1,e&&(this.from=[],this.to=[],this.value=[])}constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.last=null,this.lastFrom=-1e9,this.lastTo=-1e9,this.from=[],this.to=[],this.value=[],this.maxPoint=-1,this.setMaxPoint=-1,this.nextLayer=null}add(e,t,i){this.addInner(e,t,i)||(this.nextLayer||(this.nextLayer=new ke)).add(e,t,i)}addInner(e,t,i){let n=e-this.lastTo||i.startSide-this.last.endSide;if(n<=0&&(e-this.lastFrom||i.startSide-this.last.startSide)<0)throw new Error("Ranges must be added sorted by `from` position and `startSide`");return!(n<0||(250==this.from.length&&this.finishChunk(!0),this.chunkStart<0&&(this.chunkStart=e),this.from.push(e-this.chunkStart),this.to.push(t-this.chunkStart),this.last=i,this.lastFrom=e,this.lastTo=t,this.value.push(i),i.point&&(this.maxPoint=Math.max(this.maxPoint,t-e)),0))}addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)<0)return!1;this.from.length&&this.finishChunk(!0),this.setMaxPoint=Math.max(this.setMaxPoint,t.maxPoint),this.chunks.push(t),this.chunkPos.push(e);let i=t.value.length-1;return this.last=t.value[i],this.lastFrom=t.from[i]+e,this.lastTo=t.to[i]+e,!0}finish(){return this.finishInner(Se.empty)}finishInner(e){if(this.from.length&&this.finishChunk(!1),0==this.chunks.length)return e;let t=Se.create(this.chunkPos,this.chunks,this.nextLayer?this.nextLayer.finishInner(e):e,this.setMaxPoint);return this.from=null,t}}function Te(e,t,i){let n=new Map;for(let t of e)for(let e=0;e=this.minPoint)break}}}setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){if(this.chunkIndex++,this.skip)for(;this.chunkIndex=i&&n.push(new Ce(r,t,i,s));return 1==n.length?n[0]:new Pe(n)}get startSide(){return this.value?this.value.startSide:0}goto(e,t=-1e9){for(let i of this.heap)i.goto(e,t);for(let e=this.heap.length>>1;e>=0;e--)Me(this.heap,e);return this.next(),this}forward(e,t){for(let i of this.heap)i.forward(e,t);for(let e=this.heap.length>>1;e>=0;e--)Me(this.heap,e);(this.to-e||this.value.endSide-t)<0&&this.next()}next(){if(0==this.heap.length)this.from=this.to=1e9,this.value=null,this.rank=-1;else{let e=this.heap[0];this.from=e.from,this.to=e.to,this.value=e.value,this.rank=e.rank,e.value&&e.next(),Me(this.heap,0)}}}function Me(e,t){for(let i=e[t];;){let n=1+(t<<1);if(n>=e.length)break;let s=e[n];if(n+1=0&&(s=e[n+1],n++),i.compare(s)<0)break;e[n]=i,e[t]=s,t=n}}class Ee{constructor(e,t,i){this.minPoint=i,this.active=[],this.activeTo=[],this.activeRank=[],this.minActive=-1,this.point=null,this.pointFrom=0,this.pointRank=0,this.to=-1e9,this.endSide=0,this.openStart=-1,this.cursor=Pe.from(e,t,i)}goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.activeTo.length=this.activeRank.length=0,this.minActive=-1,this.to=e,this.endSide=t,this.openStart=-1,this.next(),this}forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||this.active[this.minActive].endSide-t)<0;)this.removeActive(this.minActive);this.cursor.forward(e,t)}removeActive(e){De(this.active,e),De(this.activeTo,e),De(this.activeRank,e),this.minActive=qe(this.active,this.activeTo)}addActive(e){let t=0,{value:i,to:n,rank:s}=this.cursor;for(;t-1&&(this.activeTo[n]-this.cursor.from||this.active[n].endSide-this.cursor.startSide)<0){if(this.activeTo[n]>e){this.to=this.activeTo[n],this.endSide=this.active[n].endSide;break}this.removeActive(n),i&&De(i,n)}else{if(!this.cursor.value){this.to=this.endSide=1e9;break}if(this.cursor.from>e){this.to=this.cursor.from,this.endSide=this.cursor.startSide;break}{let e=this.cursor.value;if(e.point){if(!(t&&this.cursor.to==this.to&&this.cursor.from=0&&i[t]=0&&!(this.activeRank[i]e||this.activeTo[i]==e&&this.active[i].endSide>=this.point.endSide)&&t.push(this.active[i]);return t.reverse()}openEnd(e){let t=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[i]>e;i--)t++;return t}}function Ae(e,t,i,n,s,r){e.goto(t),i.goto(n);let o=n+s,a=n,l=n-t;for(;;){let t=e.to+l-i.to||e.endSide-i.endSide,n=t<0?e.to+l:i.to,s=Math.min(n,o);if(e.point||i.point?e.point&&i.point&&(e.point==i.point||e.point.eq(i.point))&&Re(e.activeForPoint(e.to),i.activeForPoint(i.to))||r.comparePoint(a,s,e.point,i.point):s>a&&!Re(e.active,i.active)&&r.compareRange(a,s,e.active,i.active),n>o)break;a=n,t<=0&&e.next(),t>=0&&i.next()}}function Re(e,t){if(e.length!=t.length)return!1;for(let i=0;i=t;i--)e[i+1]=e[i];e[t]=i}function qe(e,t){let i=-1,n=1e9;for(let s=0;s=t)return n;if(n==e.length)break;s+=9==e.charCodeAt(n)?i-s%i:1,n=p(e,n)}return!0===n?-1:e.length}const Be="undefined"==typeof Symbol?"__อผ":Symbol.for("อผ"),$e="undefined"==typeof Symbol?"__styleSet"+Math.floor(1e8*Math.random()):Symbol("styleSet"),Qe="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};class ze{constructor(e,t){this.rules=[];let{finish:i}=t||{};function n(e){return/^@/.test(e)?[e]:e.split(/,\s*/)}function s(e,t,r,o){let a=[],l=/^@(\w+)\b/.exec(e[0]),h=l&&"keyframes"==l[1];if(l&&null==t)return r.push(e[0]+";");for(let i in t){let o=t[i];if(/&/.test(i))s(i.split(/,\s*/).map((t=>e.map((e=>t.replace(/&/,e))))).reduce(((e,t)=>e.concat(t))),o,r);else if(o&&"object"==typeof o){if(!l)throw new RangeError("The value of a property ("+i+") should be a primitive value.");s(n(i),o,a,h)}else null!=o&&a.push(i.replace(/_.*/,"").replace(/[A-Z]/g,(e=>"-"+e.toLowerCase()))+": "+o+";")}(a.length||h)&&r.push((!i||l||o?e:e.map(i)).join(", ")+" {"+a.join(" ")+"}")}for(let t in e)s(n(t),e[t],this.rules)}getRules(){return this.rules.join("\n")}static newName(){let e=Qe[Be]||1;return Qe[Be]=e+1,"อผ"+e.toString(36)}static mount(e,t,i){let n=e[$e],s=i&&i.nonce;n?s&&n.setNonce(s):n=new We(e,s),n.mount(Array.isArray(t)?t:[t])}}let je=new Map;class We{constructor(e,t){let i=e.ownerDocument||e,n=i.defaultView;if(!e.head&&e.adoptedStyleSheets&&n.CSSStyleSheet){let t=je.get(i);if(t)return e.adoptedStyleSheets=[t.sheet,...e.adoptedStyleSheets],e[$e]=t;this.sheet=new n.CSSStyleSheet,e.adoptedStyleSheets=[this.sheet,...e.adoptedStyleSheets],je.set(i,this)}else{this.styleTag=i.createElement("style"),t&&this.styleTag.setAttribute("nonce",t);let n=e.head||e;n.insertBefore(this.styleTag,n.firstChild)}this.modules=[],e[$e]=this}mount(e){let t=this.sheet,i=0,n=0;for(let s=0;s-1&&(this.modules.splice(o,1),n--,o=-1),-1==o){if(this.modules.splice(n++,0,r),t)for(let e=0;e",191:"?",192:"~",219:"{",220:"|",221:"}",222:'"'},Fe="undefined"!=typeof navigator&&/Mac/.test(navigator.platform),He="undefined"!=typeof navigator&&/MSIE \d|Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),Xe=0;Xe<10;Xe++)Ve[48+Xe]=Ve[96+Xe]=String(Xe);for(Xe=1;Xe<=24;Xe++)Ve[Xe+111]="F"+Xe;for(Xe=65;Xe<=90;Xe++)Ve[Xe]=String.fromCharCode(Xe+32),Ue[Xe]=String.fromCharCode(Xe);for(var Ye in Ve)Ue.hasOwnProperty(Ye)||(Ue[Ye]=Ve[Ye]);function Ge(e){let t;return t=11==e.nodeType?e.getSelection?e:e.ownerDocument:e,t.getSelection()}function Ze(e,t){return!!t&&(e==t||e.contains(1!=t.nodeType?t.parentNode:t))}function Ke(e,t){if(!t.anchorNode)return!1;try{return Ze(e,t.anchorNode)}catch(e){return!1}}function Je(e){return 3==e.nodeType?ct(e,0,e.nodeValue.length).getClientRects():1==e.nodeType?e.getClientRects():[]}function et(e,t,i,n){return!!i&&(it(e,t,i,n,-1)||it(e,t,i,n,1))}function tt(e){for(var t=0;;t++)if(!(e=e.previousSibling))return t}function it(e,t,i,n,s){for(;;){if(e==i&&t==n)return!0;if(t==(s<0?0:nt(e))){if("DIV"==e.nodeName)return!1;let i=e.parentNode;if(!i||1!=i.nodeType)return!1;t=tt(e)+(s<0?0:1),e=i}else{if(1!=e.nodeType)return!1;if(1==(e=e.childNodes[t+(s<0?-1:0)]).nodeType&&"false"==e.contentEditable)return!1;t=s<0?nt(e):0}}}function nt(e){return 3==e.nodeType?e.nodeValue.length:e.childNodes.length}function st(e,t){let i=t?e.left:e.right;return{left:i,right:i,top:e.top,bottom:e.bottom}}function rt(e){return{left:0,right:e.innerWidth,top:0,bottom:e.innerHeight}}class ot{constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=null,this.focusOffset=0}eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorOffset&&this.focusNode==e.focusNode&&this.focusOffset==e.focusOffset}setRange(e){let{anchorNode:t,focusNode:i}=e;this.set(t,Math.min(e.anchorOffset,t?nt(t):0),i,Math.min(e.focusOffset,i?nt(i):0))}set(e,t,i,n){this.anchorNode=e,this.anchorOffset=t,this.focusNode=i,this.focusOffset=n}}let at,lt=null;function ht(e){if(e.setActive)return e.setActive();if(lt)return e.focus(lt);let t=[];for(let i=e;i&&(t.push(i,i.scrollTop,i.scrollLeft),i!=i.ownerDocument);i=i.parentNode);if(e.focus(null==lt?{get preventScroll(){return lt={preventScroll:!0},!0}}:void 0),!lt){lt=!1;for(let e=0;eMath.max(1,e.scrollHeight-e.clientHeight-4)}class ft{constructor(e,t,i=!0){this.node=e,this.offset=t,this.precise=i}static before(e,t){return new ft(e.parentNode,tt(e),t)}static after(e,t){return new ft(e.parentNode,tt(e)+1,t)}}const mt=[];class gt{constructor(){this.parent=null,this.dom=null,this.flags=2}get overrideDOMText(){return null}get posAtStart(){return this.parent?this.parent.posBefore(this):0}get posAtEnd(){return this.posAtStart+this.length}posBefore(e){let t=this.posAtStart;for(let i of this.children){if(i==e)return t;t+=i.length+i.breakAfter}throw new RangeError("Invalid child in posBefore")}posAfter(e){return this.posBefore(e)+e.length}sync(e,t){if(2&this.flags){let i,n=this.dom,s=null;for(let r of this.children){if(7&r.flags){if(!r.dom&&(i=s?s.nextSibling:n.firstChild)){let e=gt.get(i);(!e||!e.parent&&e.canReuseDOM(r))&&r.reuseDOM(i)}r.sync(e,t),r.flags&=-8}if(i=s?s.nextSibling:n.firstChild,t&&!t.written&&t.node==n&&i!=r.dom&&(t.written=!0),r.dom.parentNode==n)for(;i&&i!=r.dom;)i=vt(i);else n.insertBefore(r.dom,i);s=r.dom}for(i=s?s.nextSibling:n.firstChild,i&&t&&t.node==n&&(t.written=!0);i;)i=vt(i)}else if(1&this.flags)for(let i of this.children)7&i.flags&&(i.sync(e,t),i.flags&=-8)}reuseDOM(e){}localPosFromDOM(e,t){let i;if(e==this.dom)i=this.dom.childNodes[t];else{let n=0==nt(e)?0:0==t?-1:1;for(;;){let t=e.parentNode;if(t==this.dom)break;0==n&&t.firstChild!=t.lastChild&&(n=e==t.firstChild?-1:1),e=t}i=n<0?e:e.nextSibling}if(i==this.dom.firstChild)return 0;for(;i&&!gt.get(i);)i=i.nextSibling;if(!i)return this.length;for(let e=0,t=0;;e++){let n=this.children[e];if(n.dom==i)return t;t+=n.length+n.breakAfter}}domBoundsAround(e,t,i=0){let n=-1,s=-1,r=-1,o=-1;for(let a=0,l=i,h=i;at)return i.domBoundsAround(e,t,l);if(c>=e&&-1==n&&(n=a,s=l),l>t&&i.dom.parentNode==this.dom){r=a,o=h;break}h=c,l=c+i.breakAfter}return{from:s,to:o<0?i+this.length:o,startDOM:(n?this.children[n-1].dom.nextSibling:null)||this.dom.firstChild,endDOM:r=0?this.children[r].dom:null}}markDirty(e=!1){this.flags|=2,this.markParentsDirty(e)}markParentsDirty(e){for(let t=this.parent;t;t=t.parent){if(e&&(t.flags|=2),1&t.flags)return;t.flags|=1,e=!1}}setParent(e){this.parent!=e&&(this.parent=e,7&this.flags&&this.markParentsDirty(!0))}setDOM(e){this.dom!=e&&(this.dom&&(this.dom.cmView=null),this.dom=e,e.cmView=this)}get rootView(){for(let e=this;;){let t=e.parent;if(!t)return e;e=t}}replaceChildren(e,t,i=mt){this.markDirty();for(let i=e;ithis.pos||e==this.pos&&(t>0||0==this.i||this.children[this.i-1].breakAfter))return this.off=e-this.pos,this;let i=this.children[--this.i];this.pos-=i.length+i.breakAfter}}}function bt(e,t,i,n,s,r,o,a,l){let{children:h}=e,c=h.length?h[t]:null,d=r.length?r[r.length-1]:null,u=d?d.breakAfter:o;if(!(t==n&&c&&!o&&!u&&r.length<2&&c.merge(i,s,r.length?d:null,0==i,a,l))){if(n0&&(!o&&r.length&&c.merge(i,c.length,r[0],!1,a,0)?c.breakAfter=r.shift().breakAfter:(i2);var Rt={mac:At||/Mac/.test(yt.platform),windows:/Win/.test(yt.platform),linux:/Linux|X11/.test(yt.platform),ie:Tt,ie_version:St?wt.documentMode||6:kt?+kt[1]:xt?+xt[1]:0,gecko:Ct,gecko_version:Ct?+(/Firefox\/(\d+)/.exec(yt.userAgent)||[0,0])[1]:0,chrome:!!Pt,chrome_version:Pt?+Pt[1]:0,ios:At,android:/Android\b/.test(yt.userAgent),webkit:Mt,safari:Et,webkit_version:Mt?+(/\bAppleWebKit\/(\d+)/.exec(navigator.userAgent)||[0,0])[1]:0,tabSize:null!=wt.documentElement.style.tabSize?"tab-size":"-moz-tab-size"};class Dt extends gt{constructor(e){super(),this.text=e}get length(){return this.text.length}createDOM(e){this.setDOM(e||document.createTextNode(this.text))}sync(e,t){this.dom||this.createDOM(),this.dom.nodeValue!=this.text&&(t&&t.node==this.dom&&(t.written=!0),this.dom.nodeValue=this.text)}reuseDOM(e){3==e.nodeType&&this.createDOM(e)}merge(e,t,i){return!(8&this.flags||i&&(!(i instanceof Dt)||this.length-(t-e)+i.length>256||8&i.flags)||(this.text=this.text.slice(0,e)+(i?i.text:"")+this.text.slice(t),this.markDirty(),0))}split(e){let t=new Dt(this.text.slice(e));return this.text=this.text.slice(0,e),this.markDirty(),t.flags|=8&this.flags,t}localPosFromDOM(e,t){return e==this.dom?t:t?this.text.length:0}domAtPos(e){return new ft(this.dom,e)}domBoundsAround(e,t,i){return{from:i,to:i+this.length,startDOM:this.dom,endDOM:this.dom.nextSibling}}coordsAt(e,t){return function(e,t,i){let n=e.nodeValue.length;t>n&&(t=n);let s=t,r=t,o=0;0==t&&i<0||t==n&&i>=0?Rt.chrome||Rt.gecko||(t?(s--,o=1):r=0)?0:a.length-1];return Rt.safari&&!o&&0==l.width&&(l=Array.prototype.find.call(a,(e=>e.width))||l),o?st(l,o<0):l||null}(this.dom,e,t)}}class It extends gt{constructor(e,t=[],i=0){super(),this.mark=e,this.children=t,this.length=i;for(let e of t)e.setParent(this)}setAttrs(e){if(ut(e),this.mark.class&&(e.className=this.mark.class),this.mark.attrs)for(let t in this.mark.attrs)e.setAttribute(t,this.mark.attrs[t]);return e}canReuseDOM(e){return super.canReuseDOM(e)&&!(8&(this.flags|e.flags))}reuseDOM(e){e.nodeName==this.mark.tagName.toUpperCase()&&(this.setDOM(e),this.flags|=6)}sync(e,t){this.dom?4&this.flags&&this.setAttrs(this.dom):this.setDOM(this.setAttrs(document.createElement(this.mark.tagName))),super.sync(e,t)}merge(e,t,i,n,s,r){return!(i&&(!(i instanceof It&&i.mark.eq(this.mark))||e&&s<=0||te&&t.push(i=e&&(n=s),i=o,s++}let r=this.length-e;return this.length=e,n>-1&&(this.children.length=n,this.markDirty()),new It(this.mark,t,r)}domAtPos(e){return Nt(this,e)}coordsAt(e,t){return $t(this,e,t)}}class qt extends gt{static create(e,t,i){return new qt(e,t,i)}constructor(e,t,i){super(),this.widget=e,this.length=t,this.side=i,this.prevWidget=null}split(e){let t=qt.create(this.widget,this.length-e,this.side);return this.length-=e,t}sync(e){this.dom&&this.widget.updateDOM(this.dom,e)||(this.dom&&this.prevWidget&&this.prevWidget.destroy(this.dom),this.prevWidget=null,this.setDOM(this.widget.toDOM(e)),this.dom.contentEditable="false")}getSide(){return this.side}merge(e,t,i,n,s,r){return!(i&&(!(i instanceof qt&&this.widget.compare(i.widget))||e>0&&s<=0||t0)?ft.before(this.dom):ft.after(this.dom,e==this.length)}domBoundsAround(){return null}coordsAt(e,t){let i=this.widget.coordsAt(this.dom,e,t);if(i)return i;let n=this.dom.getClientRects(),s=null;if(!n.length)return null;let r=this.side?this.side<0:e>0;for(let t=r?n.length-1:0;s=n[t],!(e>0?0==t:t==n.length-1||s.top0?ft.before(this.dom):ft.after(this.dom)}localPosFromDOM(){return 0}domBoundsAround(){return null}coordsAt(e){return this.dom.getBoundingClientRect()}get overrideDOMText(){return e.empty}get isHidden(){return!0}}function Nt(e,t){let i=e.dom,{children:n}=e,s=0;for(let e=0;se&&t0;e--){let t=n[e-1];if(t.dom.parentNode==i)return t.domAtPos(t.length)}for(let e=s;e0&&t instanceof It&&s.length&&(n=s[s.length-1])instanceof It&&n.mark.eq(t.mark)?Bt(n,t.children[0],i-1):(s.push(t),t.setParent(e)),e.length+=t.length}function $t(e,t,i){let n=null,s=-1,r=null,o=-1;!function e(t,a){for(let l=0,h=0;l=a&&(c.children.length?e(c,a-h):(!r||r.isHidden&&i>0)&&(d>a||h==d&&c.getSide()>0)?(r=c,o=a-h):(h-1?1:0)!=s.length-(i&&s.indexOf(i)>-1?1:0))return!1;for(let r of n)if(r!=i&&(-1==s.indexOf(r)||e[r]!==t[r]))return!1;return!0}function Wt(e,t,i){let n=!1;if(t)for(let s in t)i&&s in i||(n=!0,"style"==s?e.style.cssText="":e.removeAttribute(s));if(i)for(let s in i)t&&t[s]==i[s]||(n=!0,"style"==s?e.style.cssText=i[s]:e.setAttribute(s,i[s]));return n}function Vt(e){let t=Object.create(null);for(let i=0;i0&&0==this.children[i-1].length;)this.children[--i].destroy();return this.children.length=i,this.markDirty(),this.length=e,t}transferDOM(e){this.dom&&(this.markDirty(),e.setDOM(this.dom),e.prevAttrs=void 0===this.prevAttrs?this.attrs:this.prevAttrs,this.prevAttrs=void 0,this.dom=null)}setDeco(e){jt(this.attrs,e)||(this.dom&&(this.prevAttrs=this.attrs,this.markDirty()),this.attrs=e)}append(e,t){Bt(this,e,t)}addLineDeco(e){let t=e.spec.attributes,i=e.spec.class;t&&(this.attrs=Qt(t,this.attrs||{})),i&&(this.attrs=Qt({class:i},this.attrs||{}))}domAtPos(e){return Nt(this,e)}reuseDOM(e){"DIV"==e.nodeName&&(this.setDOM(e),this.flags|=6)}sync(e,t){var i;this.dom?4&this.flags&&(ut(this.dom),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0):(this.setDOM(document.createElement("div")),this.dom.className="cm-line",this.prevAttrs=this.attrs?null:void 0),void 0!==this.prevAttrs&&(Wt(this.dom,this.prevAttrs,this.attrs),this.dom.classList.add("cm-line"),this.prevAttrs=void 0),super.sync(e,t);let n=this.dom.lastChild;for(;n&>.get(n)instanceof It;)n=n.lastChild;if(!(n&&this.length&&("BR"==n.nodeName||0!=(null===(i=gt.get(n))||void 0===i?void 0:i.isEditable)||Rt.ios&&this.children.some((e=>e instanceof Dt))))){let e=document.createElement("BR");e.cmIgnore=!0,this.dom.appendChild(e)}}measureTextSize(){if(0==this.children.length||this.length>20)return null;let e,t=0;for(let i of this.children){if(!(i instanceof Dt)||/[^ -~]/.test(i.text))return null;let n=Je(i.dom);if(1!=n.length)return null;t+=n[0].width,e=n[0].height}return t?{lineHeight:this.dom.getBoundingClientRect().height,charWidth:t/this.length,textHeight:e}:null}coordsAt(e,t){let i=$t(this,e,t);if(!this.children.length&&i&&this.parent){let{heightOracle:e}=this.parent.view.viewState,t=i.bottom-i.top;if(Math.abs(t-e.lineHeight)<2&&e.textHeight=t){if(s instanceof Ut)return s;if(r>t)break}n=r+s.breakAfter}return null}}class Ft extends gt{constructor(e,t,i){super(),this.widget=e,this.length=t,this.deco=i,this.breakAfter=0,this.prevWidget=null}merge(e,t,i,n,s,r){return!(i&&(!(i instanceof Ft&&this.widget.compare(i.widget))||e>0&&s<=0||t0)}}class Ht{eq(e){return!1}updateDOM(e,t){return!1}compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}get estimatedHeight(){return-1}get lineBreaks(){return 0}ignoreEvent(e){return!0}coordsAt(e,t,i){return null}get isHidden(){return!1}destroy(e){}}var Xt=function(e){return e[e.Text=0]="Text",e[e.WidgetBefore=1]="WidgetBefore",e[e.WidgetAfter=2]="WidgetAfter",e[e.WidgetRange=3]="WidgetRange",e}(Xt||(Xt={}));class Yt extends _e{constructor(e,t,i,n){super(),this.startSide=e,this.endSide=t,this.widget=i,this.spec=n}get heightRelevant(){return!1}static mark(e){return new Gt(e)}static widget(e){let t=Math.max(-1e4,Math.min(1e4,e.side||0)),i=!!e.block;return t+=i&&!e.inlineOrder?t>0?3e8:-4e8:t>0?1e8:-1e8,new Kt(e,t,t,i,e.widget||null,!1)}static replace(e){let t,i,n=!!e.block;if(e.isBlockGap)t=-5e8,i=4e8;else{let{start:s,end:r}=Jt(e,n);t=(s?n?-3e8:-1:5e8)-1,i=1+(r?n?2e8:1:-6e8)}return new Kt(e,t,i,n,e.widget||null,!0)}static line(e){return new Zt(e)}static set(e,t=!1){return Se.of(e,t)}hasHeight(){return!!this.widget&&this.widget.estimatedHeight>-1}}Yt.none=Se.empty;class Gt extends Yt{constructor(e){let{start:t,end:i}=Jt(e);super(t?-1:5e8,i?1:-6e8,null,e),this.tagName=e.tagName||"span",this.class=e.class||"",this.attrs=e.attributes||null}eq(e){var t,i;return this==e||e instanceof Gt&&this.tagName==e.tagName&&(this.class||(null===(t=this.attrs)||void 0===t?void 0:t.class))==(e.class||(null===(i=e.attrs)||void 0===i?void 0:i.class))&&jt(this.attrs,e.attrs,"class")}range(e,t=e){if(e>=t)throw new RangeError("Mark decorations may not be empty");return super.range(e,t)}}Gt.prototype.point=!1;class Zt extends Yt{constructor(e){super(-2e8,-2e8,null,e)}eq(e){return e instanceof Zt&&this.spec.class==e.spec.class&&jt(this.spec.attributes,e.spec.attributes)}range(e,t=e){if(t!=e)throw new RangeError("Line decoration ranges must be zero-length");return super.range(e,t)}}Zt.prototype.mapMode=w.TrackBefore,Zt.prototype.point=!0;class Kt extends Yt{constructor(e,t,i,n,s,r){super(t,i,s,e),this.block=n,this.isReplace=r,this.mapMode=n?t<=0?w.TrackBefore:w.TrackAfter:w.TrackDel}get type(){return this.startSide!=this.endSide?Xt.WidgetRange:this.startSide<=0?Xt.WidgetBefore:Xt.WidgetAfter}get heightRelevant(){return this.block||!!this.widget&&(this.widget.estimatedHeight>=5||this.widget.lineBreaks>0)}eq(e){return e instanceof Kt&&((t=this.widget)==(i=e.widget)||!!(t&&i&&t.compare(i)))&&this.block==e.block&&this.startSide==e.startSide&&this.endSide==e.endSide;var t,i}range(e,t=e){if(this.isReplace&&(e>t||e==t&&this.startSide>0&&this.endSide<=0))throw new RangeError("Invalid range for replacement decoration");if(!this.isReplace&&t!=e)throw new RangeError("Widget decorations can only have zero-length ranges");return super.range(e,t)}}function Jt(e,t=!1){let{inclusiveStart:i,inclusiveEnd:n}=e;return null==i&&(i=e.inclusive),null==n&&(n=e.inclusive),{start:null!=i?i:t,end:null!=n?n:t}}function ei(e,t,i,n=0){let s=i.length-1;s>=0&&i[s]+n>=e?i[s]=Math.max(i[s],t):i.push(e,t)}Kt.prototype.point=!0;class ti{constructor(e,t,i,n){this.doc=e,this.pos=t,this.end=i,this.disallowBlockEffectsFor=n,this.content=[],this.curLine=null,this.breakAtStart=0,this.pendingBuffer=0,this.bufferMarks=[],this.atCursorPos=!0,this.openStart=-1,this.openEnd=-1,this.text="",this.textOff=0,this.cursor=e.iter(),this.skip=t}posCovered(){if(0==this.content.length)return!this.breakAtStart&&this.doc.lineAt(this.pos).from!=this.pos;let e=this.content[this.content.length-1];return!(e.breakAfter||e instanceof Ft&&e.deco.endSide<0)}getLine(){return this.curLine||(this.content.push(this.curLine=new Ut),this.atCursorPos=!0),this.curLine}flushBuffer(e=this.bufferMarks){this.pendingBuffer&&(this.curLine.append(ii(new Lt(-1),e),e.length),this.pendingBuffer=0)}addBlockWidget(e){this.flushBuffer(),this.curLine=null,this.content.push(e)}finish(e){this.pendingBuffer&&e<=this.bufferMarks.length?this.flushBuffer():this.pendingBuffer=0,this.posCovered()||e&&this.content.length&&this.content[this.content.length-1]instanceof Ft||this.getLine()}buildText(e,t,i){for(;e>0;){if(this.textOff==this.text.length){let{value:t,lineBreak:i,done:n}=this.cursor.next(this.skip);if(this.skip=0,n)throw new Error("Ran out of text content when drawing inline views");if(i){this.posCovered()||this.getLine(),this.content.length?this.content[this.content.length-1].breakAfter=1:this.breakAtStart=1,this.flushBuffer(),this.curLine=null,this.atCursorPos=!0,e--;continue}this.text=t,this.textOff=0}let n=Math.min(this.text.length-this.textOff,e,512);this.flushBuffer(t.slice(t.length-i)),this.getLine().append(ii(new Dt(this.text.slice(this.textOff,this.textOff+n)),t),i),this.atCursorPos=!0,this.textOff+=n,e-=n,i=0}}span(e,t,i,n){this.buildText(t-e,i,n),this.pos=t,this.openStart<0&&(this.openStart=n)}point(e,t,i,n,s,r){if(this.disallowBlockEffectsFor[r]&&i instanceof Kt){if(i.block)throw new RangeError("Block decorations may not be specified via plugins");if(t>this.doc.lineAt(this.pos).to)throw new RangeError("Decorations that replace line breaks may not be specified via plugins")}let o=t-e;if(i instanceof Kt)if(i.block)i.startSide>0&&!this.posCovered()&&this.getLine(),this.addBlockWidget(new Ft(i.widget||new ni("div"),o,i));else{let r=qt.create(i.widget||new ni("span"),o,o?0:i.startSide),a=this.atCursorPos&&!r.isEditable&&s<=n.length&&(e0),l=!r.isEditable&&(en.length||i.startSide<=0),h=this.getLine();2!=this.pendingBuffer||a||r.isEditable||(this.pendingBuffer=0),this.flushBuffer(n),a&&(h.append(ii(new Lt(1),n),s),s=n.length+Math.max(0,s-n.length)),h.append(ii(r,n),s),this.atCursorPos=l,this.pendingBuffer=l?en.length?1:2:0,this.pendingBuffer&&(this.bufferMarks=n.slice())}else this.doc.lineAt(this.pos).from==this.pos&&this.getLine().addLineDeco(i);o&&(this.textOff+o<=this.text.length?this.textOff+=o:(this.skip+=o-(this.text.length-this.textOff),this.text="",this.textOff=0),this.pos=t),this.openStart<0&&(this.openStart=s)}static build(e,t,i,n,s){let r=new ti(e,t,i,s);return r.openEnd=Se.spans(n,t,i,r),r.openStart<0&&(r.openStart=r.openEnd),r.finish(r.openEnd),r}}function ii(e,t){for(let i of t)e=new It(i,[e],e.length);return e}class ni extends Ht{constructor(e){super(),this.tag=e}eq(e){return e.tag==this.tag}toDOM(){return document.createElement(this.tag)}updateDOM(e){return e.nodeName.toLowerCase()==this.tag}get isHidden(){return!0}}const si=q.define(),ri=q.define(),oi=q.define(),ai=q.define(),li=q.define(),hi=q.define(),ci=q.define(),di=q.define({combine:e=>e.some((e=>e))}),ui=q.define({combine:e=>e.some((e=>e))});class pi{constructor(e,t="nearest",i="nearest",n=5,s=5){this.range=e,this.y=t,this.x=i,this.yMargin=n,this.xMargin=s}map(e){return e.empty?this:new pi(this.range.map(e),this.y,this.x,this.yMargin,this.xMargin)}}const fi=ae.define({map:(e,t)=>e.map(t)});function mi(e,t,i){let n=e.facet(ai);n.length?n[0](t):window.onerror?window.onerror(String(t),i,void 0,void 0,t):i?console.error(i+":",t):console.error(t)}const gi=q.define({combine:e=>!e.length||e[0]});let vi=0;const Oi=q.define();class bi{constructor(e,t,i,n,s){this.id=e,this.create=t,this.domEventHandlers=i,this.domEventObservers=n,this.extension=s(this)}static define(e,t){const{eventHandlers:i,eventObservers:n,provide:s,decorations:r}=t||{};return new bi(vi++,e,i,n,(e=>{let t=[Oi.of(e)];return r&&t.push(xi.of((t=>{let i=t.plugin(e);return i?r(i):Yt.none}))),s&&t.push(s(e)),t}))}static fromClass(e,t){return bi.define((t=>new e(t)),t)}}class _i{constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}update(e){if(this.value){if(this.mustUpdate){let e=this.mustUpdate;if(this.mustUpdate=null,this.value.update)try{this.value.update(e)}catch(t){if(mi(e.state,t,"CodeMirror plugin crashed"),this.value.destroy)try{this.value.destroy()}catch(e){}this.deactivate()}}}else if(this.spec)try{this.value=this.spec.create(e)}catch(t){mi(e.state,t,"CodeMirror plugin crashed"),this.deactivate()}return this}destroy(e){var t;if(null===(t=this.value)||void 0===t?void 0:t.destroy)try{this.value.destroy()}catch(t){mi(e.state,t,"CodeMirror plugin crashed")}}deactivate(){this.spec=this.value=null}}const yi=q.define(),wi=q.define(),xi=q.define(),Si=q.define(),ki=q.define();function Ti(e,t,i){let n=e.state.facet(ki);if(!n.length)return n;let s=n.map((t=>t instanceof Function?t(e):t)),r=[];return Se.spans(s,t,i,{point(){},span(e,t,i,n){let s=r;for(let r=i.length-1;r>=0;r--,n--){let o,a=i[r].spec.bidiIsolate;if(null!=a)if(n>0&&s.length&&(o=s[s.length-1]).to==e&&o.direction==a)o.to=t,s=o.inner;else{let i={from:e,to:t,direction:a,inner:[]};s.push(i),s=i.inner}}}}),r}const Ci=q.define();function Pi(e){let t=0,i=0,n=0,s=0;for(let r of e.state.facet(Ci)){let o=r(e);o&&(null!=o.left&&(t=Math.max(t,o.left)),null!=o.right&&(i=Math.max(i,o.right)),null!=o.top&&(n=Math.max(n,o.top)),null!=o.bottom&&(s=Math.max(s,o.bottom)))}return{left:t,right:i,top:n,bottom:s}}const Mi=q.define();class Ei{constructor(e,t,i,n){this.fromA=e,this.toA=t,this.fromB=i,this.toB=n}join(e){return new Ei(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.toA),Math.min(this.fromB,e.fromB),Math.max(this.toB,e.toB))}addToSet(e){let t=e.length,i=this;for(;t>0;t--){let n=e[t-1];if(!(n.fromA>i.toA)){if(n.toAh)break;s+=2}if(!a)return i;new Ei(a.fromA,a.toA,a.fromB,a.toB).addToSet(i),r=a.toA,o=a.toB}}}class Ai{constructor(e,t,i){this.view=e,this.state=t,this.transactions=i,this.flags=0,this.startState=e.state,this.changes=S.empty(this.startState.doc.length);for(let e of i)this.changes=this.changes.compose(e.changes);let n=[];this.changes.iterChangedRanges(((e,t,i,s)=>n.push(new Ei(e,t,i,s)))),this.changedRanges=n}static create(e,t,i){return new Ai(e,t,i)}get viewportChanged(){return(4&this.flags)>0}get heightChanged(){return(2&this.flags)>0}get geometryChanged(){return this.docChanged||(10&this.flags)>0}get focusChanged(){return(1&this.flags)>0}get docChanged(){return!this.changes.empty}get selectionSet(){return this.transactions.some((e=>e.selection))}get empty(){return 0==this.flags&&0==this.transactions.length}}var Ri=function(e){return e[e.LTR=0]="LTR",e[e.RTL=1]="RTL",e}(Ri||(Ri={}));const Di=Ri.LTR,Ii=Ri.RTL;function qi(e){let t=[];for(let i=0;i=t){if(o.level==i)return r;(s<0||(0!=n?n<0?o.fromt:e[s].level>o.level))&&(s=r)}}if(s<0)throw new RangeError("Index out of range");return s}}function ji(e,t){if(e.length!=t.length)return!1;for(let i=0;il&&o.push(new zi(l,f.from,u)),Ui(e,f.direction==Di!=!(u%2)?n+1:n,s,f.inner,f.from,f.to,o),l=f.to),p=f.to}else{if(p==i||(t?Wi[p]!=a:Wi[p]==a))break;p++}d?Vi(e,l,p,n+1,s,d,o):lt;){let i=!0,c=!1;if(!h||l>r[h-1].to){let e=Wi[l-1];e!=a&&(i=!1,c=16==e)}let d=i||1!=a?null:[],u=i?n:n+1,p=l;e:for(;;)if(h&&p==r[h-1].to){if(c)break e;let f=r[--h];if(!i)for(let e=f.from,i=h;;){if(e==t)break e;if(!i||r[i-1].to!=e){if(Wi[e-1]==a)break e;break}e=r[--i].from}d?d.push(f):(f.to=0;e-=3)if($i[e+1]==-i){let t=$i[e+2],i=2&t?s:4&t?1&t?r:s:0;i&&(Wi[o]=Wi[$i[e]]=i),a=e;break}}else{if(189==$i.length)break;$i[a++]=o,$i[a++]=t,$i[a++]=l}else if(2==(n=Wi[o])||1==n){let e=n==s;l=e?0:1;for(let t=a-3;t>=0;t-=3){let i=$i[t+2];if(2&i)break;if(e)$i[t+2]|=2;else{if(4&i)break;$i[t+2]|=4}}}}}(e,s,r,n,a),function(e,t,i,n){for(let s=0,r=n;s<=i.length;s++){let o=s?i[s-1].to:e,a=sl;)t==r&&(t=i[--n].from,r=n?i[n-1].to:e),Wi[--t]=c;l=o}else r=o,l++}}}(s,r,n,a),Vi(e,s,r,t,i,n,o)}function Fi(e){return[new zi(0,e,0)]}let Hi="";function Xi(e,t,i,n,s){var r;let o=n.head-e.from,a=-1;if(0==o){if(!s||!e.length)return null;t[0].level!=i&&(o=t[0].side(!1,i),a=0)}else if(o==e.length){if(s)return null;let e=t[t.length-1];e.level!=i&&(o=e.side(!0,i),a=t.length-1)}a<0&&(a=zi.find(t,o,null!==(r=n.bidiLevel)&&void 0!==r?r:-1,n.assoc));let l=t[a];o==l.side(s,i)&&(l=t[a+=s?1:-1],o=l.side(!s,i));let h=s==(l.dir==i),c=p(e.text,o,h);if(Hi=e.text.slice(Math.min(o,c),Math.max(o,c)),c!=l.side(s,i))return R.cursor(c+e.from,h?-1:1,l.level);let d=a==(s?t.length-1:0)?null:t[a+(s?1:-1)];return d||l.level==i?d&&d.level0&&i.length&&(i.every((({fromA:e,toA:t})=>tthis.minWidthTo))?(this.minWidthFrom=e.changes.mapPos(this.minWidthFrom,1),this.minWidthTo=e.changes.mapPos(this.minWidthTo,1)):this.minWidth=this.minWidthFrom=this.minWidthTo=0);let n=-1;this.view.inputState.composing>=0&&((null===(t=this.domChanged)||void 0===t?void 0:t.newSel)?n=this.domChanged.newSel.head:function(e,t){let i=!1;return t&&e.iterChangedRanges(((e,n)=>{et.from&&(i=!0)})),i}(e.changes,this.hasComposition)||e.selectionSet||(n=e.state.selection.main.head));let s=n>-1?function(e,t,i){let n=Zi(e,i);if(!n)return null;let{node:s,from:r,to:o}=n,a=s.nodeValue;if(/[\n\r]/.test(a))return null;if(e.state.doc.sliceString(n.from,n.to)!=a)return null;let l=t.invertedDesc,h=new Ei(l.mapPos(r),l.mapPos(o),r,o),c=[];for(let t=s.parentNode;;t=t.parentNode){let i=gt.get(t);if(i instanceof It)c.push({node:t,deco:i.mark});else{if(i instanceof Ut||"DIV"==t.nodeName&&t.parentNode==e.contentDOM)return{range:h,text:s,marks:c,line:t};if(t==e.contentDOM)return null;c.push({node:t,deco:new Gt({inclusive:!0,attributes:Vt(t),tagName:t.tagName.toLowerCase()})})}}}(this.view,e.changes,n):null;if(this.domChanged=null,this.hasComposition){this.markedForComposition.clear();let{from:t,to:n}=this.hasComposition;i=new Ei(t,n,e.changes.mapPos(t,-1),e.changes.mapPos(n,1)).addToSet(i.slice())}this.hasComposition=s?{from:s.range.fromB,to:s.range.toB}:null,(Rt.ie||Rt.chrome)&&!s&&e&&e.state.doc.lines!=e.startState.doc.lines&&(this.forceSelection=!0);let r=function(e,t,i){let n=new Ji;return Se.compare(e,t,i,n),n.changes}(this.decorations,this.updateDeco(),e.changes);return i=Ei.extendWithRanges(i,r),!!(7&this.flags||0!=i.length)&&(this.updateInner(i,e.startState.doc.length,s),e.transactions.length&&(this.lastUpdate=Date.now()),!0)}updateInner(e,t,i){this.view.viewState.mustMeasureContent=!0,this.updateChildren(e,t,i);let{observer:n}=this.view;n.ignore((()=>{this.dom.style.height=this.view.viewState.contentHeight/this.view.scaleY+"px",this.dom.style.flexBasis=this.minWidth?this.minWidth+"px":"";let e=Rt.chrome||Rt.ios?{node:n.selectionRange.focusNode,written:!1}:void 0;this.sync(this.view,e),this.flags&=-8,e&&(e.written||n.selectionRange.focusNode!=e.node)&&(this.forceSelection=!0),this.dom.style.height=""})),this.markedForComposition.forEach((e=>e.flags&=-9));let s=[];if(this.view.viewport.from||this.view.viewport.to=0?n[e]:null;if(!t)break;let r,o,a,l,{fromA:h,toA:c,fromB:d,toB:u}=t;if(i&&i.range.fromBd){let e=ti.build(this.view.state.doc,d,i.range.fromB,this.decorations,this.dynamicDecorationMap),t=ti.build(this.view.state.doc,i.range.toB,u,this.decorations,this.dynamicDecorationMap);o=e.breakAtStart,a=e.openStart,l=t.openEnd;let n=this.compositionView(i);t.breakAtStart?n.breakAfter=1:t.content.length&&n.merge(n.length,n.length,t.content[0],!1,t.openStart,0)&&(n.breakAfter=t.content[0].breakAfter,t.content.shift()),e.content.length&&n.merge(0,0,e.content[e.content.length-1],!0,0,e.openEnd)&&e.content.pop(),r=e.content.concat(n).concat(t.content)}else({content:r,breakAtStart:o,openStart:a,openEnd:l}=ti.build(this.view.state.doc,d,u,this.decorations,this.dynamicDecorationMap));let{i:p,off:f}=s.findPos(c,1),{i:m,off:g}=s.findPos(h,-1);bt(this,m,g,p,f,r,o,a,l)}i&&this.fixCompositionDOM(i)}compositionView(e){let t=new Dt(e.text.nodeValue);t.flags|=8;for(let{deco:i}of e.marks)t=new It(i,[t],t.length);let i=new Ut;return i.append(t,0),i}fixCompositionDOM(e){let t=(e,t)=>{t.flags|=8|(t.children.some((e=>7&e.flags))?1:0),this.markedForComposition.add(t);let i=gt.get(e);i&&i!=t&&(i.dom=null),t.setDOM(e)},i=this.childPos(e.range.fromB,1),n=this.children[i.i];t(e.line,n);for(let s=e.marks.length-1;s>=-1;s--)i=n.childPos(i.off,1),n=n.children[i.i],t(s>=0?e.marks[s].node:e.text,n)}updateSelection(e=!1,t=!1){!e&&this.view.observer.selectionRange.focusNode||this.view.observer.readSelectionRange();let i=this.view.root.activeElement,n=i==this.dom,s=!n&&Ke(this.dom,this.view.observer.selectionRange)&&!(i&&this.dom.contains(i));if(!(n||t||s))return;let r=this.forceSelection;this.forceSelection=!1;let o=this.view.state.selection.main,a=this.moveToLine(this.domAtPos(o.anchor)),l=o.empty?a:this.moveToLine(this.domAtPos(o.head));if(Rt.gecko&&o.empty&&!this.hasComposition&&1==(h=a).node.nodeType&&h.node.firstChild&&(0==h.offset||"false"==h.node.childNodes[h.offset-1].contentEditable)&&(h.offset==h.node.childNodes.length||"false"==h.node.childNodes[h.offset].contentEditable)){let e=document.createTextNode("");this.view.observer.ignore((()=>a.node.insertBefore(e,a.node.childNodes[a.offset]||null))),a=l=new ft(e,0),r=!0}var h;let c=this.view.observer.selectionRange;!r&&c.focusNode&&et(a.node,a.offset,c.anchorNode,c.anchorOffset)&&et(l.node,l.offset,c.focusNode,c.focusOffset)||(this.view.observer.ignore((()=>{Rt.android&&Rt.chrome&&this.dom.contains(c.focusNode)&&function(e,t){for(let i=e;i&&i!=t;i=i.assignedSlot||i.parentNode)if(1==i.nodeType&&"false"==i.contentEditable)return!0;return!1}(c.focusNode,this.dom)&&(this.dom.blur(),this.dom.focus({preventScroll:!0}));let e=Ge(this.view.root);if(e)if(o.empty){if(Rt.gecko){let e=(t=a.node,n=a.offset,1!=t.nodeType?0:(n&&"false"==t.childNodes[n-1].contentEditable?1:0)|(no.head&&([a,l]=[l,a]),t.setEnd(l.node,l.offset),t.setStart(a.node,a.offset),e.removeAllRanges(),e.addRange(t)}var t,n;s&&this.view.root.activeElement==this.dom&&(this.dom.blur(),i&&i.focus())})),this.view.observer.setSelectionRange(a,l)),this.impreciseAnchor=a.precise?null:new ft(c.anchorNode,c.anchorOffset),this.impreciseHead=l.precise?null:new ft(c.focusNode,c.focusOffset)}enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,t=e.state.selection.main,i=Ge(e.root),{anchorNode:n,anchorOffset:s}=e.observer.selectionRange;if(!(i&&t.empty&&t.assoc&&i.modify))return;let r=Ut.find(this,t.head);if(!r)return;let o=r.posAtStart;if(t.head==o||t.head==o+r.length)return;let a=this.coordsAt(t.head,-1),l=this.coordsAt(t.head,1);if(!a||!l||a.bottom>l.top)return;let h=this.domAtPos(t.head+t.assoc);i.collapse(h.node,h.offset),i.modify("move",t.assoc<0?"forward":"backward","lineboundary"),e.observer.readSelectionRange();let c=e.observer.selectionRange;e.docView.posFromDOM(c.anchorNode,c.anchorOffset)!=t.from&&i.collapse(n,s)}moveToLine(e){let t,i=this.dom;if(e.node!=i)return e;for(let n=e.offset;!t&&n=0;n--){let e=gt.get(i.childNodes[n]);e instanceof Ut&&(t=e.domAtPos(e.length))}return t?new ft(t.node,t.offset,!0):e}nearest(e){for(let t=e;t;){let e=gt.get(t);if(e&&e.rootView==this)return e;t=t.parentNode}return null}posFromDOM(e,t){let i=this.nearest(e);if(!i)throw new RangeError("Trying to find position for a DOM position outside of the document");return i.localPosFromDOM(e,t)+i.posAtStart}domAtPos(e){let{i:t,off:i}=this.childCursor().findPos(e,-1);for(;t=0;r--){let o=this.children[r],a=s-o.breakAfter,l=a-o.length;if(ae||o.covers(1))&&(!i||o instanceof Ut&&!(i instanceof Ut&&t>=0))&&(i=o,n=l),s=l}return i?i.coordsAt(e-n,t):null}coordsForChar(e){let{i:t,off:i}=this.childPos(e,1),n=this.children[t];if(!(n instanceof Ut))return null;for(;n.children.length;){let{i:e,off:t}=n.childPos(i,1);for(;;e++){if(e==n.children.length)return null;if((n=n.children[e]).length)break}i=t}if(!(n instanceof Dt))return null;let s=p(n.text,i);if(s==i)return null;let r=ct(n.dom,i,s).getClientRects();for(let e=0;eMath.max(this.view.scrollDOM.clientWidth,this.minWidth)+1,o=-1,a=this.view.textDirection==Ri.LTR;for(let e=0,l=0;ln)break;if(e>=i){let i=h.dom.getBoundingClientRect();if(t.push(i.height),r){let t=h.dom.lastChild,n=t?Je(t):[];if(n.length){let t=n[n.length-1],r=a?t.right-i.left:i.right-t.left;r>o&&(o=r,this.minWidth=s,this.minWidthFrom=e,this.minWidthTo=c)}}}e=c+h.breakAfter}return t}textDirectionAt(e){let{i:t}=this.childPos(e,1);return"rtl"==getComputedStyle(this.children[t].dom).direction?Ri.RTL:Ri.LTR}measureTextSize(){for(let e of this.children)if(e instanceof Ut){let t=e.measureTextSize();if(t)return t}let e,t,i,n=document.createElement("div");return n.className="cm-line",n.style.width="99999px",n.style.position="absolute",n.textContent="abc def ghi jkl mno pqr stu",this.view.observer.ignore((()=>{this.dom.appendChild(n);let s=Je(n.firstChild)[0];e=n.getBoundingClientRect().height,t=s?s.width/27:7,i=s?s.height:e,n.remove()})),{lineHeight:e,charWidth:t,textHeight:i}}childCursor(e=this.length){let t=this.children.length;return t&&(e-=this.children[--t].length),new Ot(this.children,e,t)}computeBlockGapDeco(){let e=[],t=this.view.viewState;for(let i=0,n=0;;n++){let s=n==t.viewports.length?null:t.viewports[n],r=s?s.from-1:this.length;if(r>i){let n=(t.lineBlockAt(r).bottom-t.lineBlockAt(i).top)/this.view.scaleY;e.push(Yt.replace({widget:new Gi(n),block:!0,inclusive:!0,isBlockGap:!0}).range(i,r))}if(!s)break;i=s.to+1}return Yt.set(e)}updateDeco(){let e=this.view.state.facet(xi).map(((e,t)=>(this.dynamicDecorationMap[t]="function"==typeof e)?e(this.view):e));for(let t=e.length;ti.anchor?-1:1);if(!n)return;!i.empty&&(t=this.coordsAt(i.anchor,i.anchor>i.head?-1:1))&&(n={left:Math.min(n.left,t.left),top:Math.min(n.top,t.top),right:Math.max(n.right,t.right),bottom:Math.max(n.bottom,t.bottom)});let s=Pi(this.view),r={left:n.left-s.left,top:n.top-s.top,right:n.right+s.right,bottom:n.bottom+s.bottom};!function(e,t,i,n,s,r,o,a){let l=e.ownerDocument,h=l.defaultView||window;for(let c=e,d=!1;c&&!d;)if(1==c.nodeType){let e,u=c==l.body,p=1,f=1;if(u)e=rt(h);else{if(/^(fixed|sticky)$/.test(getComputedStyle(c).position)&&(d=!0),c.scrollHeight<=c.clientHeight&&c.scrollWidth<=c.clientWidth){c=c.assignedSlot||c.parentNode;continue}let t=c.getBoundingClientRect();p=t.width/c.offsetWidth,f=t.height/c.offsetHeight,e={left:t.left,right:t.left+c.clientWidth*p,top:t.top,bottom:t.top+c.clientHeight*f}}let m=0,g=0;if("nearest"==s)t.top0&&t.bottom>e.bottom+g&&(g=t.bottom-e.bottom+g+o)):t.bottom>e.bottom&&(g=t.bottom-e.bottom+o,i<0&&t.top-g0&&t.right>e.right+m&&(m=t.right-e.right+m+r)):t.right>e.right&&(m=t.right-e.right+r,i<0&&t.left0))break;i=i.childNodes[n-1],n=nt(i)}if(i>=0)for(let n=e,s=t;;){if(3==n.nodeType)return{node:n,offset:s};if(!(1==n.nodeType&&s=0))break;n=n.childNodes[s],s=0}return null}let Ji=class{constructor(){this.changes=[]}compareRange(e,t){ei(e,t,this.changes)}comparePoint(e,t){ei(e,t,this.changes)}};function en(e,t){return t.left>e?t.left-e:Math.max(0,e-t.right)}function tn(e,t){return t.top>e?t.top-e:Math.max(0,e-t.bottom)}function nn(e,t){return e.topt.top+1}function sn(e,t){return te.bottom?{top:e.top,left:e.left,right:e.right,bottom:t}:e}function on(e,t,i){let n,s,r,o,a,l,h,c,d=!1;for(let u=e.firstChild;u;u=u.nextSibling){let e=Je(u);for(let p=0;pg||o==g&&r>m){n=u,s=f,r=m,o=g;let a=g?i0?p0)}0==m?i>f.bottom&&(!h||h.bottomf.top)&&(l=u,c=f):h&&nn(h,f)?h=rn(h,f.bottom):c&&nn(c,f)&&(c=sn(c,f.top))}}if(h&&h.bottom>=i?(n=a,s=h):c&&c.top<=i&&(n=l,s=c),!n)return{node:e,offset:0};let u=Math.max(s.left,Math.min(s.right,t));return 3==n.nodeType?an(n,u,i):d&&"false"!=n.contentEditable?on(n,u,i):{node:e,offset:Array.prototype.indexOf.call(e.childNodes,n)+(t>=(s.left+s.right)/2?1:0)}}function an(e,t,i){let n=e.nodeValue.length,s=-1,r=1e9,o=0;for(let a=0;ai?h.top-i:i-h.bottom)-1;if(h.left-1<=t&&h.right+1>=t&&c=(h.left+h.right)/2,n=i;if((Rt.chrome||Rt.gecko)&&ct(e,a).getBoundingClientRect().left==h.right&&(n=!i),c<=0)return{node:e,offset:a+(n?1:0)};s=a+(n?1:0),r=c}}}return{node:e,offset:s>-1?s:o>0?e.nodeValue.length:0}}function ln(e,t,i,n=-1){var s,r;let o,a=e.contentDOM.getBoundingClientRect(),l=a.top+e.viewState.paddingTop,{docHeight:h}=e.viewState,{x:c,y:d}=t,u=d-l;if(u<0)return 0;if(u>h)return e.state.doc.length;for(let t=e.viewState.heightOracle.textHeight/2,s=!1;o=e.elementAtHeight(u),o.type!=Xt.Text;)for(;u=n>0?o.bottom+t:o.top-t,!(u>=0&&u<=h);){if(s)return i?null:0;s=!0,n=-n}d=l+u;let p=o.from;if(pe.viewport.to)return e.viewport.to==e.state.doc.length?e.state.doc.length:i?null:hn(e,a,o,c,d);let f=e.dom.ownerDocument,m=e.root.elementFromPoint?e.root:f,g=m.elementFromPoint(c,d);g&&!e.contentDOM.contains(g)&&(g=null),g||(c=Math.max(a.left+1,Math.min(a.right-1,c)),g=m.elementFromPoint(c,d),g&&!e.contentDOM.contains(g)&&(g=null));let v,O=-1;if(g&&0!=(null===(s=e.docView.nearest(g))||void 0===s?void 0:s.isEditable))if(f.caretPositionFromPoint){let e=f.caretPositionFromPoint(c,d);e&&({offsetNode:v,offset:O}=e)}else if(f.caretRangeFromPoint){let t=f.caretRangeFromPoint(c,d);t&&(({startContainer:v,startOffset:O}=t),(!e.contentDOM.contains(v)||Rt.safari&&function(e,t,i){let n;if(3!=e.nodeType||t!=(n=e.nodeValue.length))return!1;for(let t=e.nextSibling;t;t=t.nextSibling)if(1!=t.nodeType||"BR"!=t.nodeName)return!1;return ct(e,n-1,n).getBoundingClientRect().left>i}(v,O,c)||Rt.chrome&&function(e,t,i){if(0!=t)return!1;for(let t=e;;){let e=t.parentNode;if(!e||1!=e.nodeType||e.firstChild!=t)return!1;if(e.classList.contains("cm-line"))break;t=e}return i-(1==e.nodeType?e.getBoundingClientRect():ct(e,0,Math.max(e.nodeValue.length,1)).getBoundingClientRect()).left>5}(v,O,c))&&(v=void 0))}if(!v||!e.docView.dom.contains(v)){let t=Ut.find(e.docView,p);if(!t)return u>o.top+o.height/2?o.to:o.from;({node:v,offset:O}=on(t.dom,c,d))}let b=e.docView.nearest(v);if(!b)return null;if(b.isWidget&&1==(null===(r=b.dom)||void 0===r?void 0:r.nodeType)){let e=b.dom.getBoundingClientRect();return t.y1.5*e.defaultLineHeight){let t=e.viewState.heightOracle.textHeight;r+=Math.floor((s-i.top-.5*(e.defaultLineHeight-t))/t)*e.viewState.heightOracle.lineLength}let o=e.state.sliceDoc(i.from,i.to);return i.from+Ne(o,r,e.state.tabSize)}function cn(e,t){let i=e.lineBlockAt(t);if(Array.isArray(i.type))for(let e of i.type)if(e.to>t||e.to==t&&(e.to==i.to||e.type==Xt.Text))return e;return i}function dn(e,t,i,n){let s=e.state.doc.lineAt(t.head),r=e.bidiSpans(s),o=e.textDirectionAt(s.from);for(let a=t,l=null;;){let t=Xi(s,r,o,a,i),h=Hi;if(!t){if(s.number==(i?e.state.doc.lines:1))return a;h="\n",s=e.state.doc.line(s.number+(i?1:-1)),r=e.bidiSpans(s),t=R.cursor(i?s.from:s.to)}if(l){if(!l(h))return a}else{if(!n)return t;l=n(h)}a=t}}function un(e,t,i){for(;;){let n=0;for(let s of e)s.between(t-1,t+1,((e,s,r)=>{if(t>e&&tt(e))),i.from,t.head>i.from?-1:1);return n==i.from?i:R.cursor(n,nnull)),Rt.gecko&&function(e){zn.has(e)||(zn.add(e),e.addEventListener("copy",(()=>{})),e.addEventListener("cut",(()=>{})))}(e.contentDOM.ownerDocument)}handleEvent(e){(function(e,t){if(!t.bubbles)return!0;if(t.defaultPrevented)return!1;for(let i,n=t.target;n!=e.contentDOM;n=n.parentNode)if(!n||11==n.nodeType||(i=gt.get(n))&&i.ignoreEvent(t))return!1;return!0})(this.view,e)&&!this.ignoreDuringComposition(e)&&("keydown"==e.type&&this.keydown(e)||this.runHandlers(e.type,e))}runHandlers(e,t){let i=this.handlers[e];if(i){for(let e of i.observers)e(this.view,t);for(let e of i.handlers){if(t.defaultPrevented)break;if(e(this.view,t)){t.preventDefault();break}}}}ensureHandlers(e){let t=gn(e),i=this.handlers,n=this.view.contentDOM;for(let e in t)if("scroll"!=e){let s=!t[e].handlers.length,r=i[e];r&&s!=!r.handlers.length&&(n.removeEventListener(e,this.handleEvent),r=null),r||n.addEventListener(e,this.handleEvent,{passive:s})}for(let e in i)"scroll"==e||t[e]||n.removeEventListener(e,this.handleEvent);this.handlers=t}keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),9==e.keyCode&&Date.now()t.keyCode==e.keyCode)))&&!e.ctrlKey||On.indexOf(e.key)>-1&&e.ctrlKey&&!e.shiftKey)?(229!=e.keyCode&&this.view.observer.forceFlush(),!1):(this.pendingIOSKey=t||e,setTimeout((()=>this.flushIOSKey()),250),!0)}flushIOSKey(){let e=this.pendingIOSKey;return!!e&&(this.pendingIOSKey=void 0,dt(this.view.contentDOM,e.key,e.keyCode))}ignoreDuringComposition(e){return!!/^key/.test(e.type)&&(this.composing>0||!!(Rt.safari&&!Rt.ios&&this.compositionPendingKey&&Date.now()-this.compositionEndedAt<100)&&(this.compositionPendingKey=!1,!0))}startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(),this.mouseSelection=e}update(e){this.mouseSelection&&this.mouseSelection.update(e),e.transactions.length&&(this.lastKeyCode=this.lastSelectionTime=0)}destroy(){this.mouseSelection&&this.mouseSelection.destroy()}}function mn(e,t){return(i,n)=>{try{return t.call(e,n,i)}catch(e){mi(i.state,e)}}}function gn(e){let t=Object.create(null);function i(e){return t[e]||(t[e]={observers:[],handlers:[]})}for(let t of e){let e=t.spec;if(e&&e.domEventHandlers)for(let n in e.domEventHandlers){let s=e.domEventHandlers[n];s&&i(n).handlers.push(mn(t.value,s))}if(e&&e.domEventObservers)for(let n in e.domEventObservers){let s=e.domEventObservers[n];s&&i(n).observers.push(mn(t.value,s))}}for(let e in wn)i(e).handlers.push(wn[e]);for(let e in xn)i(e).observers.push(xn[e]);return t}const vn=[{key:"Backspace",keyCode:8,inputType:"deleteContentBackward"},{key:"Enter",keyCode:13,inputType:"insertParagraph"},{key:"Enter",keyCode:13,inputType:"insertLineBreak"},{key:"Delete",keyCode:46,inputType:"deleteContentForward"}],On="dthko",bn=[16,17,18,20,91,92,224,225];function _n(e){return.7*Math.max(0,e)+8}class yn{constructor(e,t,i,n){this.view=e,this.startEvent=t,this.style=i,this.mustSelect=n,this.scrollSpeed={x:0,y:0},this.scrolling=-1,this.lastEvent=t,this.scrollParent=function(e){let t=e.ownerDocument;for(let i=e.parentNode;i&&i!=t.body;)if(1==i.nodeType){if(i.scrollHeight>i.clientHeight||i.scrollWidth>i.clientWidth)return i;i=i.assignedSlot||i.parentNode}else{if(11!=i.nodeType)break;i=i.host}return null}(e.contentDOM),this.atoms=e.state.facet(Si).map((t=>t(e)));let s=e.contentDOM.ownerDocument;s.addEventListener("mousemove",this.move=this.move.bind(this)),s.addEventListener("mouseup",this.up=this.up.bind(this)),this.extend=t.shiftKey,this.multiple=e.state.facet(Oe.allowMultipleSelections)&&function(e,t){let i=e.state.facet(si);return i.length?i[0](t):Rt.mac?t.metaKey:t.ctrlKey}(e,t),this.dragging=!(!function(e,t){let{main:i}=e.state.selection;if(i.empty)return!1;let n=Ge(e.root);if(!n||0==n.rangeCount)return!0;let s=n.getRangeAt(0).getClientRects();for(let e=0;e=t.clientX&&i.top<=t.clientY&&i.bottom>=t.clientY)return!0}return!1}(e,t)||1!=qn(t))&&null}start(e){!1===this.dragging&&this.select(e)}move(e){var t,i,n;if(0==e.buttons)return this.destroy();if(this.dragging||null==this.dragging&&(i=this.startEvent,n=e,Math.max(Math.abs(i.clientX-n.clientX),Math.abs(i.clientY-n.clientY))<10))return;this.select(this.lastEvent=e);let s=0,r=0,o=(null===(t=this.scrollParent)||void 0===t?void 0:t.getBoundingClientRect())||{left:0,top:0,right:this.view.win.innerWidth,bottom:this.view.win.innerHeight},a=Pi(this.view);e.clientX-a.left<=o.left+6?s=-_n(o.left-e.clientX):e.clientX+a.right>=o.right-6&&(s=_n(e.clientX-o.right)),e.clientY-a.top<=o.top+6?r=-_n(o.top-e.clientY):e.clientY+a.bottom>=o.bottom-6&&(r=_n(e.clientY-o.bottom)),this.setScrollSpeed(s,r)}up(e){null==this.dragging&&this.select(this.lastEvent),this.dragging||e.preventDefault(),this.destroy()}destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocument;e.removeEventListener("mousemove",this.move),e.removeEventListener("mouseup",this.up),this.view.inputState.mouseSelection=null}setScrollSpeed(e,t){this.scrollSpeed={x:e,y:t},e||t?this.scrolling<0&&(this.scrolling=setInterval((()=>this.scroll()),50)):this.scrolling>-1&&(clearInterval(this.scrolling),this.scrolling=-1)}scroll(){this.scrollParent?(this.scrollParent.scrollLeft+=this.scrollSpeed.x,this.scrollParent.scrollTop+=this.scrollSpeed.y):this.view.win.scrollBy(this.scrollSpeed.x,this.scrollSpeed.y),!1===this.dragging&&this.select(this.lastEvent)}skipAtoms(e){let t=null;for(let i=0;ithis.select(this.lastEvent)),20)}}const wn=Object.create(null),xn=Object.create(null),Sn=Rt.ie&&Rt.ie_version<15||Rt.ios&&Rt.webkit_version<604;function kn(e,t){let i,{state:n}=e,s=1,r=n.toText(t),o=r.lines==n.selection.ranges.length;if(null!=Nn&&n.selection.ranges.every((e=>e.empty))&&Nn==r.toString()){let e=-1;i=n.changeByRange((i=>{let a=n.doc.lineAt(i.from);if(a.from==e)return{range:i};e=a.from;let l=n.toText((o?r.line(s++).text:t)+n.lineBreak);return{changes:{from:a.from,insert:l},range:R.cursor(i.from+l.length)}}))}else i=o?n.changeByRange((e=>{let t=r.line(s++);return{changes:{from:e.from,to:e.to,insert:t.text},range:R.cursor(e.from+t.length)}})):n.replaceSelection(r);e.dispatch(i,{userEvent:"input.paste",scrollIntoView:!0})}function Tn(e,t,i,n){if(1==n)return R.cursor(t,i);if(2==n)return function(e,t,i=1){let n=e.charCategorizer(t),s=e.doc.lineAt(t),r=t-s.from;if(0==s.length)return R.cursor(t);0==r?i=1:r==s.length&&(i=-1);let o=r,a=r;i<0?o=p(s.text,r,!1):a=p(s.text,r);let l=n(s.text.slice(o,a));for(;o>0;){let e=p(s.text,o,!1);if(n(s.text.slice(e,o))!=l)break;o=e}for(;a{e.inputState.lastScrollTop=e.scrollDOM.scrollTop,e.inputState.lastScrollLeft=e.scrollDOM.scrollLeft},wn.keydown=(e,t)=>(e.inputState.setSelectionOrigin("select"),27==t.keyCode&&(e.inputState.lastEscPress=Date.now()),!1),xn.touchstart=(e,t)=>{e.inputState.lastTouchTime=Date.now(),e.inputState.setSelectionOrigin("select.pointer")},xn.touchmove=e=>{e.inputState.setSelectionOrigin("select.pointer")},wn.mousedown=(e,t)=>{if(e.observer.flush(),e.inputState.lastTouchTime>Date.now()-2e3)return!1;let i=null;for(let n of e.state.facet(oi))if(i=n(e,t),i)break;if(i||0!=t.button||(i=function(e,t){let i=En(e,t),n=qn(t),s=e.state.selection;return{update(e){e.docChanged&&(i.pos=e.changes.mapPos(i.pos),s=s.map(e.changes))},get(t,r,o){let a,l=En(e,t),h=Tn(e,l.pos,l.bias,n);if(i.pos!=l.pos&&!r){let t=Tn(e,i.pos,i.bias,n),s=Math.min(t.from,h.from),r=Math.max(t.to,h.to);h=s1&&(a=function(e,t){for(let i=0;i=t)return R.create(e.ranges.slice(0,i).concat(e.ranges.slice(i+1)),e.mainIndex==i?0:e.mainIndex-(e.mainIndex>i?1:0))}return null}(s,l.pos))?a:o?s.addRange(h):R.create([h])}}}(e,t)),i){let n=!e.hasFocus;e.inputState.startMouseSelection(new yn(e,t,i,n)),n&&e.observer.ignore((()=>ht(e.contentDOM)));let s=e.inputState.mouseSelection;if(s)return s.start(t),!1===s.dragging}return!1};let Cn=(e,t)=>e>=t.top&&e<=t.bottom,Pn=(e,t,i)=>Cn(t,i)&&e>=i.left&&e<=i.right;function Mn(e,t,i,n){let s=Ut.find(e.docView,t);if(!s)return 1;let r=t-s.posAtStart;if(0==r)return 1;if(r==s.length)return-1;let o=s.coordsAt(r,-1);if(o&&Pn(i,n,o))return-1;let a=s.coordsAt(r,1);return a&&Pn(i,n,a)?1:o&&Cn(n,o)?-1:1}function En(e,t){let i=e.posAtCoords({x:t.clientX,y:t.clientY},!1);return{pos:i,bias:Mn(e,i,t.clientX,t.clientY)}}const An=Rt.ie&&Rt.ie_version<=11;let Rn=null,Dn=0,In=0;function qn(e){if(!An)return e.detail;let t=Rn,i=In;return Rn=e,In=Date.now(),Dn=!t||i>Date.now()-400&&Math.abs(t.clientX-e.clientX)<2&&Math.abs(t.clientY-e.clientY)<2?(Dn+1)%3:1}function Ln(e,t,i,n){if(!i)return;let s=e.posAtCoords({x:t.clientX,y:t.clientY},!1),{mouseSelection:r}=e.inputState,o=n&&r&&r.dragging&&function(e,t){let i=e.state.facet(ri);return i.length?i[0](t):Rt.mac?!t.altKey:!t.ctrlKey}(e,t)?{from:r.dragging.from,to:r.dragging.to}:null,a={from:s,insert:i},l=e.state.changes(o?[o,a]:a);e.focus(),e.dispatch({changes:l,selection:{anchor:l.mapPos(s,-1),head:l.mapPos(s,1)},userEvent:o?"move.drop":"input.drop"})}wn.dragstart=(e,t)=>{let{selection:{main:i}}=e.state,{mouseSelection:n}=e.inputState;return n&&(n.dragging=i),t.dataTransfer&&(t.dataTransfer.setData("Text",e.state.sliceDoc(i.from,i.to)),t.dataTransfer.effectAllowed="copyMove"),!1},wn.drop=(e,t)=>{if(!t.dataTransfer)return!1;if(e.state.readOnly)return!0;let i=t.dataTransfer.files;if(i&&i.length){let n=Array(i.length),s=0,r=()=>{++s==i.length&&Ln(e,t,n.filter((e=>null!=e)).join(e.state.lineBreak),!1)};for(let e=0;e{/[\x00-\x08\x0e-\x1f]{2}/.test(t.result)||(n[e]=t.result),r()},t.readAsText(i[e])}return!0}{let i=t.dataTransfer.getData("Text");if(i)return Ln(e,t,i,!0),!0}return!1},wn.paste=(e,t)=>{if(e.state.readOnly)return!0;e.observer.flush();let i=Sn?null:t.clipboardData;return i?(kn(e,i.getData("text/plain")||i.getData("text/uri-text")),!0):(function(e){let t=e.dom.parentNode;if(!t)return;let i=t.appendChild(document.createElement("textarea"));i.style.cssText="position: fixed; left: -10000px; top: 10px",i.focus(),setTimeout((()=>{e.focus(),i.remove(),kn(e,i.value)}),50)}(e),!1)};let Nn=null;wn.copy=wn.cut=(e,t)=>{let{text:i,ranges:n,linewise:s}=function(e){let t=[],i=[],n=!1;for(let n of e.selection.ranges)n.empty||(t.push(e.sliceDoc(n.from,n.to)),i.push(n));if(!t.length){let s=-1;for(let{from:n}of e.selection.ranges){let r=e.doc.lineAt(n);r.number>s&&(t.push(r.text),i.push({from:r.from,to:Math.min(e.doc.length,r.to+1)})),s=r.number}n=!0}return{text:t.join(e.lineBreak),ranges:i,linewise:n}}(e.state);if(!i&&!s)return!1;Nn=s?i:null,"cut"!=t.type||e.state.readOnly||e.dispatch({changes:n,scrollIntoView:!0,userEvent:"delete.cut"});let r=Sn?null:t.clipboardData;return r?(r.clearData(),r.setData("text/plain",i),!0):(function(e,t){let i=e.dom.parentNode;if(!i)return;let n=i.appendChild(document.createElement("textarea"));n.style.cssText="position: fixed; left: -10000px; top: 10px",n.value=t,n.focus(),n.selectionEnd=t.length,n.selectionStart=0,setTimeout((()=>{n.remove(),e.focus()}),50)}(e,i),!1)};const Bn=se.define();function $n(e,t){let i=[];for(let n of e.facet(ci)){let s=n(e,t);s&&i.push(s)}return i?e.update({effects:i,annotations:Bn.of(!0)}):null}function Qn(e){setTimeout((()=>{let t=e.hasFocus;if(t!=e.inputState.notifiedFocused){let i=$n(e.state,t);i?e.dispatch(i):e.update([])}}),10)}xn.focus=e=>{e.inputState.lastFocusTime=Date.now(),e.scrollDOM.scrollTop||!e.inputState.lastScrollTop&&!e.inputState.lastScrollLeft||(e.scrollDOM.scrollTop=e.inputState.lastScrollTop,e.scrollDOM.scrollLeft=e.inputState.lastScrollLeft),Qn(e)},xn.blur=e=>{e.observer.clearSelectionRange(),Qn(e)},xn.compositionstart=xn.compositionupdate=e=>{null==e.inputState.compositionFirstChange&&(e.inputState.compositionFirstChange=!0),e.inputState.composing<0&&(e.inputState.composing=0)},xn.compositionend=e=>{e.inputState.composing=-1,e.inputState.compositionEndedAt=Date.now(),e.inputState.compositionPendingKey=!0,e.inputState.compositionPendingChange=e.observer.pendingRecords().length>0,e.inputState.compositionFirstChange=null,Rt.chrome&&Rt.android?e.observer.flushSoon():e.inputState.compositionPendingChange?Promise.resolve().then((()=>e.observer.flush())):setTimeout((()=>{e.inputState.composing<0&&e.docView.hasComposition&&e.update([])}),50)},xn.contextmenu=e=>{e.inputState.lastContextMenu=Date.now()},wn.beforeinput=(e,t)=>{var i;let n;if(Rt.chrome&&Rt.android&&(n=vn.find((e=>e.inputType==t.inputType)))&&(e.observer.delayAndroidKey(n.key,n.keyCode),"Backspace"==n.key||"Delete"==n.key)){let t=(null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0;setTimeout((()=>{var i;((null===(i=window.visualViewport)||void 0===i?void 0:i.height)||0)>t+10&&e.hasFocus&&(e.contentDOM.blur(),e.focus())}),100)}return!1};const zn=new Set,jn=["pre-wrap","normal","pre-line","break-spaces"];class Wn{constructor(t){this.lineWrapping=t,this.doc=e.empty,this.heightSamples={},this.lineHeight=14,this.charWidth=7,this.textHeight=14,this.lineLength=30,this.heightChanged=!1}heightForGap(e,t){let i=this.doc.lineAt(t).number-this.doc.lineAt(e).number+1;return this.lineWrapping&&(i+=Math.max(0,Math.ceil((t-e-i*this.lineLength*.5)/this.lineLength))),this.lineHeight*i}heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-this.lineLength)/(this.lineLength-5))))*this.lineHeight:this.lineHeight}setDoc(e){return this.doc=e,this}mustRefreshForWrapping(e){return jn.indexOf(e)>-1!=this.lineWrapping}mustRefreshForHeights(e){let t=!1;for(let i=0;i-1,a=Math.round(t)!=Math.round(this.lineHeight)||this.lineWrapping!=o;if(this.lineWrapping=o,this.lineHeight=t,this.charWidth=i,this.textHeight=n,this.lineLength=s,a){this.heightSamples={};for(let e=0;e0}set outdated(e){this.flags=(e?2:0)|-3&this.flags}setHeight(e,t){this.height!=t&&(Math.abs(this.height-t)>Hn&&(e.heightChanged=!0),this.height=t)}replace(e,t,i){return Xn.of(i)}decomposeLeft(e,t){t.push(this)}decomposeRight(e,t){t.push(this)}applyChanges(e,t,i,n){let s=this,r=i.doc;for(let o=n.length-1;o>=0;o--){let{fromA:a,toA:l,fromB:h,toB:c}=n[o],d=s.lineAt(a,Fn.ByPosNoHeight,i.setDoc(t),0,0),u=d.to>=l?d:s.lineAt(l,Fn.ByPosNoHeight,i,0,0);for(c+=u.to-l,l=u.to;o>0&&d.from<=n[o-1].toA;)a=n[o-1].fromA,h=n[o-1].fromB,o--,a2*s){let s=e[t-1];s.break?e.splice(--t,1,s.left,null,s.right):e.splice(--t,1,s.left,s.right),i+=1+s.break,n-=s.size}else{if(!(s>2*n))break;{let t=e[i];t.break?e.splice(i,1,t.left,null,t.right):e.splice(i,1,t.left,t.right),i+=2+t.break,s-=t.size}}else if(n=s&&r(this.blockAt(0,i,n,s))}updateHeight(e,t=0,i=!1,n){return n&&n.from<=t&&n.more&&this.setHeight(e,n.heights[n.index++]),this.outdated=!1,this}toString(){return`block(${this.length})`}}class Gn extends Yn{constructor(e,t){super(e,t,null),this.collapsed=0,this.widgetHeight=0,this.breaks=0}blockAt(e,t,i,n){return new Un(n,this.length,i,this.height,this.breaks)}replace(e,t,i){let n=i[0];return 1==i.length&&(n instanceof Gn||n instanceof Zn&&4&n.flags)&&Math.abs(this.length-n.length)<10?(n instanceof Zn?n=new Gn(n.length,this.height):n.height=this.height,this.outdated||(n.outdated=!1),n):Xn.of(i)}updateHeight(e,t=0,i=!1,n){return n&&n.from<=t&&n.more?this.setHeight(e,n.heights[n.index++]):(i||this.outdated)&&this.setHeight(e,Math.max(this.widgetHeight,e.heightForLine(this.length-this.collapsed))+this.breaks*e.lineHeight),this.outdated=!1,this}toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""}${this.widgetHeight?":"+this.widgetHeight:""})`}}class Zn extends Xn{constructor(e){super(e,0)}heightMetrics(e,t){let i,n=e.doc.lineAt(t).number,s=e.doc.lineAt(t+this.length).number,r=s-n+1,o=0;if(e.lineWrapping){let t=Math.min(this.height,e.lineHeight*r);i=t/r,this.length>r+1&&(o=(this.height-t)/(this.length-r-1))}else i=this.height/r;return{firstLine:n,lastLine:s,perLine:i,perChar:o}}blockAt(e,t,i,n){let{firstLine:s,lastLine:r,perLine:o,perChar:a}=this.heightMetrics(t,n);if(t.lineWrapping){let s=n+Math.round(Math.max(0,Math.min(1,(e-i)/this.height))*this.length),r=t.doc.lineAt(s),l=o+r.length*a,h=Math.max(i,e-l/2);return new Un(r.from,r.length,h,l,0)}{let n=Math.max(0,Math.min(r-s,Math.floor((e-i)/o))),{from:a,length:l}=t.doc.line(s+n);return new Un(a,l,i+o*n,o,0)}}lineAt(e,t,i,n,s){if(t==Fn.ByHeight)return this.blockAt(e,i,n,s);if(t==Fn.ByPosNoHeight){let{from:t,to:n}=i.doc.lineAt(e);return new Un(t,n-t,0,0,0)}let{firstLine:r,perLine:o,perChar:a}=this.heightMetrics(i,s),l=i.doc.lineAt(e),h=o+l.length*a,c=l.number-r,d=n+o*c+a*(l.from-s-c);return new Un(l.from,l.length,Math.max(n,Math.min(d,n+this.height-h)),h,0)}forEachLine(e,t,i,n,s,r){e=Math.max(e,s),t=Math.min(t,s+this.length);let{firstLine:o,perLine:a,perChar:l}=this.heightMetrics(i,s);for(let h=e,c=n;h<=t;){let t=i.doc.lineAt(h);if(h==e){let i=t.number-o;c+=a*i+l*(e-s-i)}let n=a+l*t.length;r(new Un(t.from,t.length,c,n,0)),c+=n,h=t.to+1}}replace(e,t,i){let n=this.length-t;if(n>0){let e=i[i.length-1];e instanceof Zn?i[i.length-1]=new Zn(e.length+n):i.push(null,new Zn(n-1))}if(e>0){let t=i[0];t instanceof Zn?i[0]=new Zn(e+t.length):i.unshift(new Zn(e-1),null)}return Xn.of(i)}decomposeLeft(e,t){t.push(new Zn(e-1),null)}decomposeRight(e,t){t.push(null,new Zn(this.length-e-1))}updateHeight(e,t=0,i=!1,n){let s=t+this.length;if(n&&n.from<=t+this.length&&n.more){let i=[],r=Math.max(t,n.from),o=-1;for(n.from>t&&i.push(new Zn(n.from-t-1).updateHeight(e,t));r<=s&&n.more;){let t=e.doc.lineAt(r).length;i.length&&i.push(null);let s=n.heights[n.index++];-1==o?o=s:Math.abs(s-o)>=Hn&&(o=-2);let a=new Gn(t,s);a.outdated=!1,i.push(a),r+=t+1}r<=s&&i.push(null,new Zn(s-r).updateHeight(e,r));let a=Xn.of(i);return(o<0||Math.abs(a.height-this.height)>=Hn||Math.abs(o-this.heightMetrics(e,t).perLine)>=Hn)&&(e.heightChanged=!0),a}return(i||this.outdated)&&(this.setHeight(e,e.heightForGap(t,t+this.length)),this.outdated=!1),this}toString(){return`gap(${this.length})`}}class Kn extends Xn{constructor(e,t,i){super(e.length+t+i.length,e.height+i.height,t|(e.outdated||i.outdated?2:0)),this.left=e,this.right=i,this.size=e.size+i.size}get break(){return 1&this.flags}blockAt(e,t,i,n){let s=i+this.left.height;return eo))return l;let h=t==Fn.ByPosNoHeight?Fn.ByPosNoHeight:Fn.ByPos;return a?l.join(this.right.lineAt(o,h,i,r,o)):this.left.lineAt(o,h,i,n,s).join(l)}forEachLine(e,t,i,n,s,r){let o=n+this.left.height,a=s+this.left.length+this.break;if(this.break)e=a&&this.right.forEachLine(e,t,i,o,a,r);else{let l=this.lineAt(a,Fn.ByPos,i,n,s);e=e&&l.from<=t&&r(l),t>l.to&&this.right.forEachLine(l.to+1,t,i,o,a,r)}}replace(e,t,i){let n=this.left.length+this.break;if(tthis.left.length)return this.balanced(this.left,this.right.replace(e-n,t-n,i));let s=[];e>0&&this.decomposeLeft(e,s);let r=s.length;for(let e of i)s.push(e);if(e>0&&Jn(s,r-1),t=i&&t.push(null)),e>i&&this.right.decomposeLeft(e-i,t)}decomposeRight(e,t){let i=this.left.length,n=i+this.break;if(e>=n)return this.right.decomposeRight(e-n,t);e2*t.size||t.size>2*e.size?Xn.of(this.break?[e,null,t]:[e,t]):(this.left=e,this.right=t,this.height=e.height+t.height,this.outdated=e.outdated||t.outdated,this.size=e.size+t.size,this.length=e.length+this.break+t.length,this)}updateHeight(e,t=0,i=!1,n){let{left:s,right:r}=this,o=t+s.length+this.break,a=null;return n&&n.from<=t+s.length&&n.more?a=s=s.updateHeight(e,t,i,n):s.updateHeight(e,t,i),n&&n.from<=o+r.length&&n.more?a=r=r.updateHeight(e,o,i,n):r.updateHeight(e,o,i),a?this.balanced(s,r):(this.height=this.left.height+this.right.height,this.outdated=!1,this)}toString(){return this.left+(this.break?" ":"-")+this.right}}function Jn(e,t){let i,n;null==e[t]&&(i=e[t-1])instanceof Zn&&(n=e[t+1])instanceof Zn&&e.splice(t-1,3,new Zn(i.length+1+n.length))}class es{constructor(e,t){this.pos=e,this.oracle=t,this.nodes=[],this.lineStart=-1,this.lineEnd=-1,this.covering=null,this.writtenTo=e}get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==this.covering}span(e,t){if(this.lineStart>-1){let e=Math.min(t,this.lineEnd),i=this.nodes[this.nodes.length-1];i instanceof Gn?i.length+=e-this.pos:(e>this.pos||!this.isCovered)&&this.nodes.push(new Gn(e-this.pos,-1)),this.writtenTo=e,t>e&&(this.nodes.push(null),this.writtenTo++,this.lineStart=-1)}this.pos=t}point(e,t,i){if(e=5)&&this.addLineDeco(n,s,r)}else t>e&&this.span(e,t);this.lineEnd>-1&&this.lineEnd-1)return;let{from:e,to:t}=this.oracle.doc.lineAt(this.pos);this.lineStart=e,this.lineEnd=t,this.writtenToe&&this.nodes.push(new Gn(this.pos-e,-1)),this.writtenTo=this.pos}blankContent(e,t){let i=new Zn(t-e);return this.oracle.doc.lineAt(e).to==t&&(i.flags|=4),i}ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.nodes.length-1]:null;if(e instanceof Gn)return e;let t=new Gn(0,-1);return this.nodes.push(t),t}addBlock(e){this.enterLine();let t=e.deco;t&&t.startSide>0&&!this.isCovered&&this.ensureLine(),this.nodes.push(e),this.writtenTo=this.pos=this.pos+e.length,t&&t.endSide>0&&(this.covering=e)}addLineDeco(e,t,i){let n=this.ensureLine();n.length+=i,n.collapsed+=i,n.widgetHeight=Math.max(n.widgetHeight,e),n.breaks+=t,this.writtenTo=this.pos=this.pos+i}finish(e){let t=0==this.nodes.length?null:this.nodes[this.nodes.length-1];!(this.lineStart>-1)||t instanceof Gn||this.isCovered?(this.writtenToi.clientHeight||i.scrollWidth>i.clientWidth)&&"visible"!=n.overflow){let n=i.getBoundingClientRect();r=Math.max(r,n.left),o=Math.min(o,n.right),a=Math.max(a,n.top),l=t==e.parentNode?n.bottom:Math.min(l,n.bottom)}t="absolute"==n.position||"fixed"==n.position?i.offsetParent:i.parentNode}else{if(11!=t.nodeType)break;t=t.host}return{left:r-i.left,right:Math.max(r,o)-i.left,top:a-(i.top+t),bottom:Math.max(a,l)-(i.top+t)}}function ns(e,t){let i=e.getBoundingClientRect();return{left:0,right:i.right-i.left,top:t,bottom:i.bottom-(i.top+t)}}class ss{constructor(e,t,i){this.from=e,this.to=t,this.size=i}static same(e,t){if(e.length!=t.length)return!1;for(let i=0;i"function"!=typeof e&&"cm-lineWrapping"==e.class));this.heightOracle=new Wn(i),this.stateDeco=t.facet(xi).filter((e=>"function"!=typeof e)),this.heightMap=Xn.empty().applyChanges(this.stateDeco,e.empty,this.heightOracle.setDoc(t.doc),[new Ei(0,0,0,t.doc.length)]),this.viewport=this.getViewport(0,null),this.updateViewportLines(),this.updateForViewport(),this.lineGaps=this.ensureLineGaps([]),this.lineGapDeco=Yt.set(this.lineGaps.map((e=>e.draw(this,!1)))),this.computeVisibleRanges()}updateForViewport(){let e=[this.viewport],{main:t}=this.state.selection;for(let i=0;i<=1;i++){let n=i?t.head:t.anchor;if(!e.some((({from:e,to:t})=>n>=e&&n<=t))){let{from:t,to:i}=this.lineBlockAt(n);e.push(new as(t,i))}}this.viewports=e.sort(((e,t)=>e.from-t.from)),this.scaler=this.heightMap.height<=7e6?ds:new us(this.heightOracle,this.heightMap,this.viewports)}updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(this.viewport.from,this.viewport.to,this.heightOracle.setDoc(this.state.doc),0,0,(e=>{this.viewportLines.push(1==this.scaler.scale?e:ps(e,this.scaler))}))}update(e,t=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=this.state.facet(xi).filter((e=>"function"!=typeof e));let n=e.changedRanges,s=Ei.extendWithRanges(n,function(e,t,i){let n=new ts;return Se.compare(e,t,i,n,0),n.changes}(i,this.stateDeco,e?e.changes:S.empty(this.state.doc.length))),r=this.heightMap.height,o=this.scrolledToBottom?null:this.scrollAnchorAt(this.scrollTop);this.heightMap=this.heightMap.applyChanges(this.stateDeco,e.startState.doc,this.heightOracle.setDoc(this.state.doc),s),this.heightMap.height!=r&&(e.flags|=2),o?(this.scrollAnchorPos=e.changes.mapPos(o.from,-1),this.scrollAnchorHeight=o.top):(this.scrollAnchorPos=-1,this.scrollAnchorHeight=this.heightMap.height);let a=s.length?this.mapViewport(this.viewport,e.changes):this.viewport;(t&&(t.range.heada.to)||!this.viewportIsAppropriate(a))&&(a=this.getViewport(0,t));let l=!e.changes.empty||2&e.flags||a.from!=this.viewport.from||a.to!=this.viewport.to;this.viewport=a,this.updateForViewport(),l&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(this.mapLineGaps(this.lineGaps,e.changes))),e.flags|=this.computeVisibleRanges(),t&&(this.scrollTarget=t),!this.mustEnforceCursorAssoc&&e.selectionSet&&e.view.lineWrapping&&e.state.selection.main.empty&&e.state.selection.main.assoc&&!e.state.facet(ui)&&(this.mustEnforceCursorAssoc=!0)}measure(t){let i=t.contentDOM,n=window.getComputedStyle(i),s=this.heightOracle,r=n.whiteSpace;this.defaultTextDirection="rtl"==n.direction?Ri.RTL:Ri.LTR;let o=this.heightOracle.mustRefreshForWrapping(r),a=i.getBoundingClientRect(),l=o||this.mustMeasureContent||this.contentDOMHeight!=a.height;this.contentDOMHeight=a.height,this.mustMeasureContent=!1;let h=0,c=0;if(a.width&&a.height){let e=a.width/i.offsetWidth,t=a.height/i.offsetHeight;(e>.995&&e<1.005||!isFinite(e)||Math.abs(a.width-i.offsetWidth)<1)&&(e=1),(t>.995&&t<1.005||!isFinite(t)||Math.abs(a.height-i.offsetHeight)<1)&&(t=1),this.scaleX==e&&this.scaleY==t||(this.scaleX=e,this.scaleY=t,h|=8,o=l=!0)}let d=(parseInt(n.paddingTop)||0)*this.scaleY,u=(parseInt(n.paddingBottom)||0)*this.scaleY;this.paddingTop==d&&this.paddingBottom==u||(this.paddingTop=d,this.paddingBottom=u,h|=10),this.editorWidth!=t.scrollDOM.clientWidth&&(s.lineWrapping&&(l=!0),this.editorWidth=t.scrollDOM.clientWidth,h|=8);let p=t.scrollDOM.scrollTop*this.scaleY;this.scrollTop!=p&&(this.scrollAnchorHeight=-1,this.scrollTop=p),this.scrolledToBottom=pt(t.scrollDOM);let f=(this.printing?ns:is)(i,this.paddingTop),m=f.top-this.pixelViewport.top,g=f.bottom-this.pixelViewport.bottom;this.pixelViewport=f;let v=this.pixelViewport.bottom>this.pixelViewport.top&&this.pixelViewport.right>this.pixelViewport.left;if(v!=this.inView&&(this.inView=v,v&&(l=!0)),!this.inView&&!this.scrollTarget)return 0;let O=a.width;if(this.contentDOMWidth==O&&this.editorHeight==t.scrollDOM.clientHeight||(this.contentDOMWidth=a.width,this.editorHeight=t.scrollDOM.clientHeight,h|=8),l){let i=t.docView.measureVisibleLineHeights(this.viewport);if(s.mustRefreshForHeights(i)&&(o=!0),o||s.lineWrapping&&Math.abs(O-this.contentDOMWidth)>s.charWidth){let{lineHeight:e,charWidth:n,textHeight:a}=t.docView.measureTextSize();o=e>0&&s.refresh(r,e,n,a,O/n,i),o&&(t.docView.minWidth=0,h|=8)}m>0&&g>0?c=Math.max(m,g):m<0&&g<0&&(c=Math.min(m,g)),s.heightChanged=!1;for(let n of this.viewports){let r=n.from==this.viewport.from?i:t.docView.measureVisibleLineHeights(n);this.heightMap=(o?Xn.empty().applyChanges(this.stateDeco,e.empty,this.heightOracle,[new Ei(0,0,0,t.state.doc.length)]):this.heightMap).updateHeight(s,0,o,new Vn(n.from,r))}s.heightChanged&&(h|=2)}let b=!this.viewportIsAppropriate(this.viewport,c)||this.scrollTarget&&(this.scrollTarget.range.headthis.viewport.to);return b&&(this.viewport=this.getViewport(c,this.scrollTarget)),this.updateForViewport(),(2&h||b)&&this.updateViewportLines(),(this.lineGaps.length||this.viewport.to-this.viewport.from>4e3)&&this.updateLineGaps(this.ensureLineGaps(o?[]:this.lineGaps,t)),h|=this.computeVisibleRanges(),this.mustEnforceCursorAssoc&&(this.mustEnforceCursorAssoc=!1,t.docView.enforceCursorAssoc()),h}get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}getViewport(e,t){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),n=this.heightMap,s=this.heightOracle,{visibleTop:r,visibleBottom:o}=this,a=new as(n.lineAt(r-1e3*i,Fn.ByHeight,s,0,0).from,n.lineAt(o+1e3*(1-i),Fn.ByHeight,s,0,0).to);if(t){let{head:e}=t.range;if(ea.to){let i,r=Math.min(this.editorHeight,this.pixelViewport.bottom-this.pixelViewport.top),o=n.lineAt(e,Fn.ByPos,s,0,0);i="center"==t.y?(o.top+o.bottom)/2-r/2:"start"==t.y||"nearest"==t.y&&e=o+Math.max(10,Math.min(i,250)))&&n>r-2e3&&s>1,r=n<<1;if(this.defaultTextDirection!=Ri.LTR&&!i)return[];let o=[],a=(n,r,l,h)=>{if(r-nn&&ee.from>=l.from&&e.to<=l.to&&Math.abs(e.from-n)e.fromt))));if(!u){if(re.from<=r&&e.to>=r))){let e=t.moveToLineBoundary(R.cursor(r),!1,!0).head;e>n&&(r=e)}u=new ss(n,r,this.gapSize(l,n,r,h))}o.push(u)};for(let e of this.viewportLines){if(e.lengthe.from&&a(e.from,s,e,t),oe.draw(this,this.heightOracle.lineWrapping)))))}computeVisibleRanges(){let e=this.stateDeco;this.lineGaps.length&&(e=e.concat(this.lineGapDeco));let t=[];Se.spans(e,this.viewport.from,this.viewport.to,{span(e,i){t.push({from:e,to:i})},point(){}},20);let i=t.length!=this.visibleRanges.length||this.visibleRanges.some(((e,i)=>e.from!=t[i].from||e.to!=t[i].to));return this.visibleRanges=t,i?4:0}lineBlockAt(e){return e>=this.viewport.from&&e<=this.viewport.to&&this.viewportLines.find((t=>t.from<=e&&t.to>=e))||ps(this.heightMap.lineAt(e,Fn.ByPos,this.heightOracle,0,0),this.scaler)}lineBlockAtHeight(e){return ps(this.heightMap.lineAt(this.scaler.fromDOM(e),Fn.ByHeight,this.heightOracle,0,0),this.scaler)}scrollAnchorAt(e){let t=this.lineBlockAtHeight(e+8);return t.from>=this.viewport.from||this.viewportLines[0].top-e>200?t:this.viewportLines[0]}elementAtHeight(e){return ps(this.heightMap.blockAt(this.scaler.fromDOM(e),this.heightOracle,0,0),this.scaler)}get docHeight(){return this.scaler.toDOM(this.heightMap.height)}get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBottom}}class as{constructor(e,t){this.from=e,this.to=t}}function ls(e,t,i){let n=[],s=e,r=0;return Se.spans(i,e,t,{span(){},point(e,t){e>s&&(n.push({from:s,to:e}),r+=e-s),s=t}},20),s=1)return t[t.length-1].to;let n=Math.floor(e*i);for(let e=0;;e++){let{from:i,to:s}=t[e],r=s-i;if(n<=r)return i+n;n-=r}}function cs(e,t){let i=0;for(let{from:n,to:s}of e.ranges){if(t<=s){i+=t-n;break}i+=s-n}return i/e.total}const ds={toDOM:e=>e,fromDOM:e=>e,scale:1};class us{constructor(e,t,i){let n=0,s=0,r=0;this.viewports=i.map((({from:i,to:s})=>{let r=t.lineAt(i,Fn.ByPos,e,0,0).top,o=t.lineAt(s,Fn.ByPos,e,0,0).bottom;return n+=o-r,{from:i,to:s,top:r,bottom:o,domTop:0,domBottom:0}})),this.scale=(7e6-n)/(t.height-n);for(let e of this.viewports)e.domTop=r+(e.top-s)*this.scale,r=e.domBottom=e.domTop+(e.bottom-e.top),s=e.bottom}toDOM(e){for(let t=0,i=0,n=0;;t++){let s=tps(e,t))):e._content)}const fs=q.define({combine:e=>e.join(" ")}),ms=q.define({combine:e=>e.indexOf(!0)>-1}),gs=ze.newName(),vs=ze.newName(),Os=ze.newName(),bs={"&light":"."+vs,"&dark":"."+Os};function _s(e,t,i){return new ze(t,{finish:t=>/&/.test(t)?t.replace(/&\w*/,(t=>{if("&"==t)return e;if(!i||!i[t])throw new RangeError(`Unsupported selector: ${t}`);return i[t]})):e+" "+t})}const ys=_s("."+gs,{"&":{position:"relative !important",boxSizing:"border-box","&.cm-focused":{outline:"1px dotted #212121"},display:"flex !important",flexDirection:"column"},".cm-scroller":{display:"flex !important",alignItems:"flex-start !important",fontFamily:"monospace",lineHeight:1.4,height:"100%",overflowX:"auto",position:"relative",zIndex:0},".cm-content":{margin:0,flexGrow:2,flexShrink:0,display:"block",whiteSpace:"pre",wordWrap:"normal",boxSizing:"border-box",minHeight:"100%",padding:"4px 0",outline:"none","&[contenteditable=true]":{WebkitUserModify:"read-write-plaintext-only"}},".cm-lineWrapping":{whiteSpace_fallback:"pre-wrap",whiteSpace:"break-spaces",wordBreak:"break-word",overflowWrap:"anywhere",flexShrink:1},"&light .cm-content":{caretColor:"black"},"&dark .cm-content":{caretColor:"white"},".cm-line":{display:"block",padding:"0 2px 0 6px"},".cm-layer":{position:"absolute",left:0,top:0,contain:"size style","& > *":{position:"absolute"}},"&light .cm-selectionBackground":{background:"#d9d9d9"},"&dark .cm-selectionBackground":{background:"#222"},"&light.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#d7d4f0"},"&dark.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground":{background:"#233"},".cm-cursorLayer":{pointerEvents:"none"},"&.cm-focused > .cm-scroller > .cm-cursorLayer":{animation:"steps(1) cm-blink 1.2s infinite"},"@keyframes cm-blink":{"0%":{},"50%":{opacity:0},"100%":{}},"@keyframes cm-blink2":{"0%":{},"50%":{opacity:0},"100%":{}},".cm-cursor, .cm-dropCursor":{borderLeft:"1.2px solid black",marginLeft:"-0.6px",pointerEvents:"none"},".cm-cursor":{display:"none"},"&dark .cm-cursor":{borderLeftColor:"#444"},".cm-dropCursor":{position:"absolute"},"&.cm-focused > .cm-scroller > .cm-cursorLayer .cm-cursor":{display:"block"},"&light .cm-activeLine":{backgroundColor:"#cceeff44"},"&dark .cm-activeLine":{backgroundColor:"#99eeff33"},"&light .cm-specialChar":{color:"red"},"&dark .cm-specialChar":{color:"#f78"},".cm-gutters":{flexShrink:0,display:"flex",height:"100%",boxSizing:"border-box",insetInlineStart:0,zIndex:200},"&light .cm-gutters":{backgroundColor:"#f5f5f5",color:"#6c6c6c",borderRight:"1px solid #ddd"},"&dark .cm-gutters":{backgroundColor:"#333338",color:"#ccc"},".cm-gutter":{display:"flex !important",flexDirection:"column",flexShrink:0,boxSizing:"border-box",minHeight:"100%",overflow:"hidden"},".cm-gutterElement":{boxSizing:"border-box"},".cm-lineNumbers .cm-gutterElement":{padding:"0 3px 0 5px",minWidth:"20px",textAlign:"right",whiteSpace:"nowrap"},"&light .cm-activeLineGutter":{backgroundColor:"#e2f2ff"},"&dark .cm-activeLineGutter":{backgroundColor:"#222227"},".cm-panels":{boxSizing:"border-box",position:"sticky",left:0,right:0},"&light .cm-panels":{backgroundColor:"#f5f5f5",color:"black"},"&light .cm-panels-top":{borderBottom:"1px solid #ddd"},"&light .cm-panels-bottom":{borderTop:"1px solid #ddd"},"&dark .cm-panels":{backgroundColor:"#333338",color:"white"},".cm-tab":{display:"inline-block",overflow:"hidden",verticalAlign:"bottom"},".cm-widgetBuffer":{verticalAlign:"text-top",height:"1em",width:0,display:"inline"},".cm-placeholder":{color:"#888",display:"inline-block",verticalAlign:"top"},".cm-highlightSpace:before":{content:"attr(data-display)",position:"absolute",pointerEvents:"none",color:"#888"},".cm-highlightTab":{backgroundImage:'url(\'data:image/svg+xml,\')',backgroundSize:"auto 100%",backgroundPosition:"right 90%",backgroundRepeat:"no-repeat"},".cm-trailingSpace":{backgroundColor:"#ff332255"},".cm-button":{verticalAlign:"middle",color:"inherit",fontSize:"70%",padding:".2em 1em",borderRadius:"1px"},"&light .cm-button":{backgroundImage:"linear-gradient(#eff1f5, #d9d9df)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#b4b4b4, #d0d3d6)"}},"&dark .cm-button":{backgroundImage:"linear-gradient(#393939, #111)",border:"1px solid #888","&:active":{backgroundImage:"linear-gradient(#111, #333)"}},".cm-textfield":{verticalAlign:"middle",color:"inherit",fontSize:"70%",border:"1px solid silver",padding:".2em .5em"},"&light .cm-textfield":{backgroundColor:"white"},"&dark .cm-textfield":{border:"1px solid #555",backgroundColor:"inherit"}},bs),ws="๏ฟฟ";class xs{constructor(e,t){this.points=e,this.text="",this.lineSeparator=t.facet(Oe.lineSeparator)}append(e){this.text+=e}lineBreak(){this.text+=ws}readRange(e,t){if(!e)return this;let i=e.parentNode;for(let n=e;;){this.findPointBefore(i,n);let e=this.text.length;this.readNode(n);let s=n.nextSibling;if(s==t)break;let r=gt.get(n),o=gt.get(s);(r&&o?r.breakAfter:(r?r.breakAfter:ks(n))||ks(s)&&("BR"!=n.nodeName||n.cmIgnore)&&this.text.length>e)&&this.lineBreak(),n=s}return this.findPointBefore(i,t),this}readTextNode(e){let t=e.nodeValue;for(let i of this.points)i.node==e&&(i.pos=this.text.length+Math.min(i.offset,t.length));for(let i=0,n=this.lineSeparator?null:/\r\n?|\n/g;;){let s,r=-1,o=1;if(this.lineSeparator?(r=t.indexOf(this.lineSeparator,i),o=this.lineSeparator.length):(s=n.exec(t))&&(r=s.index,o=s[0].length),this.append(t.slice(i,r<0?t.length:r)),r<0)break;if(this.lineBreak(),o>1)for(let t of this.points)t.node==e&&t.pos>this.text.length&&(t.pos-=o-1);i=r+o}}readNode(e){if(e.cmIgnore)return;let t=gt.get(e),i=t&&t.overrideDOMText;if(null!=i){this.findPointInside(e,i.length);for(let e=i.iter();!e.next().done;)e.lineBreak?this.lineBreak():this.append(e.value)}else 3==e.nodeType?this.readTextNode(e):"BR"==e.nodeName?e.nextSibling&&this.lineBreak():1==e.nodeType&&this.readRange(e.firstChild,null)}findPointBefore(e,t){for(let i of this.points)i.node==e&&e.childNodes[i.offset]==t&&(i.pos=this.text.length)}findPointInside(e,t){for(let i of this.points)(3==e.nodeType?i.node==e:e.contains(i.node))&&(i.pos=this.text.length+(Ss(e,i.node,i.offset)?t:0))}}function Ss(e,t,i){for(;;){if(!t||i-1)this.newSel=null;else if(t>-1&&(this.bounds=e.docView.domBoundsAround(t,i,0))){let t=s||r?[]:function(e){let t=[];if(e.root.activeElement!=e.contentDOM)return t;let{anchorNode:i,anchorOffset:n,focusNode:s,focusOffset:r}=e.observer.selectionRange;return i&&(t.push(new Ts(i,n)),s==i&&r==n||t.push(new Ts(s,r))),t}(e),i=new xs(t,e.state);i.readRange(this.bounds.startDOM,this.bounds.endDOM),this.text=i.text,this.newSel=function(e,t){if(0==e.length)return null;let i=e[0].pos,n=2==e.length?e[1].pos:i;return i>-1&&n>-1?R.single(i+t,n+t):null}(t,this.bounds.from)}else{let t=e.observer.selectionRange,i=s&&s.node==t.focusNode&&s.offset==t.focusOffset||!Ze(e.contentDOM,t.focusNode)?e.state.selection.main.head:e.docView.posFromDOM(t.focusNode,t.focusOffset),n=r&&r.node==t.anchorNode&&r.offset==t.anchorOffset||!Ze(e.contentDOM,t.anchorNode)?e.state.selection.main.anchor:e.docView.posFromDOM(t.anchorNode,t.anchorOffset);this.newSel=R.single(n,i)}}}function Ps(t,i){let n,{newSel:s}=i,r=t.state.selection.main,o=t.inputState.lastKeyTime>Date.now()-100?t.inputState.lastKeyCode:-1;if(i.bounds){let{from:s,to:a}=i.bounds,l=r.from,h=null;(8===o||Rt.android&&i.text.length0&&a>0&&e.charCodeAt(o-1)==t.charCodeAt(a-1);)o--,a--;return"end"==n&&(i-=o+Math.max(0,r-Math.min(o,a))-r),o=o?r-i:0,a=r+(a-o),o=r):a=a?r-i:0,o=r+(o-a),a=r),{from:r,toA:o,toB:a}}(t.state.doc.sliceString(s,a,ws),i.text,l-s,h);c&&(Rt.chrome&&13==o&&c.toB==c.from+2&&i.text.slice(c.from,c.toB)==ws+ws&&c.toB--,n={from:s+c.from,to:s+c.toA,insert:e.of(i.text.slice(c.from,c.toB).split(ws))})}else s&&(!t.hasFocus&&t.state.facet(gi)||s.main.eq(r))&&(s=null);if(!n&&!s)return!1;if(!n&&i.typeOver&&!r.empty&&s&&s.main.empty?n={from:r.from,to:r.to,insert:t.state.doc.slice(r.from,r.to)}:n&&n.from>=r.from&&n.to<=r.to&&(n.from!=r.from||n.to!=r.to)&&r.to-r.from-(n.to-n.from)<=4?n={from:r.from,to:r.to,insert:t.state.doc.slice(r.from,n.from).append(n.insert).append(t.state.doc.slice(n.to,r.to))}:(Rt.mac||Rt.android)&&n&&n.from==n.to&&n.from==r.head-1&&/^\. ?$/.test(n.insert.toString())&&"off"==t.contentDOM.getAttribute("autocorrect")?(s&&2==n.insert.length&&(s=R.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:e.of([" "])}):Rt.chrome&&n&&n.from==n.to&&n.from==r.head&&"\n "==n.insert.toString()&&t.lineWrapping&&(s&&(s=R.single(s.main.anchor-1,s.main.head-1)),n={from:r.from,to:r.to,insert:e.of([" "])}),n){if(Rt.ios&&t.inputState.flushIOSKey())return!0;if(Rt.android&&(n.from==r.from&&n.to==r.to&&1==n.insert.length&&2==n.insert.lines&&dt(t.contentDOM,"Enter",13)||(n.from==r.from-1&&n.to==r.to&&0==n.insert.length||8==o&&n.insert.lengthr.head)&&dt(t.contentDOM,"Backspace",8)||n.from==r.from&&n.to==r.to+1&&0==n.insert.length&&dt(t.contentDOM,"Delete",46)))return!0;let e,i=n.insert.toString();t.inputState.composing>=0&&t.inputState.composing++;let a=()=>e||(e=function(e,t,i){let n,s=e.state,r=s.selection.main;if(t.from>=r.from&&t.to<=r.to&&t.to-t.from>=(r.to-r.from)/3&&(!i||i.main.empty&&i.main.from==t.from+t.insert.length)&&e.inputState.composing<0){let i=r.fromt.to?s.sliceDoc(t.to,r.to):"";n=s.replaceSelection(e.state.toText(i+t.insert.sliceString(0,void 0,e.state.lineBreak)+o))}else{let o=s.changes(t),a=i&&i.main.to<=o.newLength?i.main:void 0;if(s.selection.ranges.length>1&&e.inputState.composing>=0&&t.to<=r.to&&t.to>=r.to-10){let l,h=e.state.sliceDoc(t.from,t.to),c=i&&Zi(e,i.main.head);if(c){let e=t.insert.length-(t.to-t.from);l={from:c.from,to:c.to-e}}else l=e.state.doc.lineAt(r.head);let d=r.to-t.to,u=r.to-r.from;n=s.changeByRange((i=>{if(i.from==r.from&&i.to==r.to)return{changes:o,range:a||i.map(o)};let n=i.to-d,c=n-h.length;if(i.to-i.from!=u||e.state.sliceDoc(c,n)!=h||i.to>=l.from&&i.from<=l.to)return{range:i};let p=s.changes({from:c,to:n,insert:t.insert}),f=i.to-r.to;return{changes:p,range:a?R.range(Math.max(0,a.anchor+f),Math.max(0,a.head+f)):i.map(p)}}))}else n={changes:o,selection:a&&s.selection.replaceRange(a)}}let o="input.type";return(e.composing||e.inputState.compositionPendingChange&&e.inputState.compositionEndedAt>Date.now()-50)&&(e.inputState.compositionPendingChange=!1,o+=".compose",e.inputState.compositionFirstChange&&(o+=".start",e.inputState.compositionFirstChange=!1)),s.update(n,{userEvent:o,scrollIntoView:!0})}(t,n,s));return t.state.facet(hi).some((e=>e(t,n.from,n.to,i,a)))||t.dispatch(a()),!0}if(s&&!s.main.eq(r)){let e=!1,i="select";return t.inputState.lastSelectionTime>Date.now()-50&&("select"==t.inputState.lastSelectionOrigin&&(e=!0),i=t.inputState.lastSelectionOrigin),t.dispatch({selection:s,scrollIntoView:e,userEvent:i}),!0}return!1}const Ms={childList:!0,characterData:!0,subtree:!0,attributes:!0,characterDataOldValue:!0},Es=Rt.ie&&Rt.ie_version<=11;class As{constructor(e){this.view=e,this.active=!1,this.selectionRange=new ot,this.selectionChanged=!1,this.delayedFlush=-1,this.resizeTimeout=-1,this.queue=[],this.delayedAndroidKey=null,this.flushingAndroidKey=-1,this.lastChange=0,this.scrollTargets=[],this.intersection=null,this.resizeScroll=null,this.intersecting=!1,this.gapIntersection=null,this.gaps=[],this.parentCheck=-1,this.dom=e.contentDOM,this.observer=new MutationObserver((t=>{for(let e of t)this.queue.push(e);(Rt.ie&&Rt.ie_version<=11||Rt.ios&&e.composing)&&t.some((e=>"childList"==e.type&&e.removedNodes.length||"characterData"==e.type&&e.oldValue.length>e.target.nodeValue.length))?this.flushSoon():this.flush()})),Es&&(this.onCharData=e=>{this.queue.push({target:e.target,type:"characterData",oldValue:e.prevValue}),this.flushSoon()}),this.onSelectionChange=this.onSelectionChange.bind(this),this.onResize=this.onResize.bind(this),this.onPrint=this.onPrint.bind(this),this.onScroll=this.onScroll.bind(this),"function"==typeof ResizeObserver&&(this.resizeScroll=new ResizeObserver((()=>{var e;(null===(e=this.view.docView)||void 0===e?void 0:e.lastUpdate){this.parentCheck<0&&(this.parentCheck=setTimeout(this.listenForScroll.bind(this),1e3)),e.length>0&&e[e.length-1].intersectionRatio>0!=this.intersecting&&(this.intersecting=!this.intersecting,this.intersecting!=this.view.inView&&this.onScrollChanged(document.createEvent("Event")))}),{threshold:[0,.001]}),this.intersection.observe(this.dom),this.gapIntersection=new IntersectionObserver((e=>{e.length>0&&e[e.length-1].intersectionRatio>0&&this.onScrollChanged(document.createEvent("Event"))}),{})),this.listenForScroll(),this.readSelectionRange()}onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.intersecting&&this.view.measure()}onScroll(e){this.intersecting&&this.flush(!1),this.onScrollChanged(e)}onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout((()=>{this.resizeTimeout=-1,this.view.requestMeasure()}),50))}onPrint(){this.view.viewState.printing=!0,this.view.measure(),setTimeout((()=>{this.view.viewState.printing=!1,this.view.requestMeasure()}),500)}updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this.gaps.some(((t,i)=>t!=e[i])))){this.gapIntersection.disconnect();for(let t of e)this.gapIntersection.observe(t);this.gaps=e}}onSelectionChange(e){let t=this.selectionChanged;if(!this.readSelectionRange()||this.delayedAndroidKey)return;let{view:i}=this,n=this.selectionRange;if(i.state.facet(gi)?i.root.activeElement!=this.dom:!Ke(i.dom,n))return;let s=n.anchorNode&&i.docView.nearest(n.anchorNode);s&&s.ignoreEvent(e)?t||(this.selectionChanged=!1):(Rt.ie&&Rt.ie_version<=11||Rt.android&&Rt.chrome)&&!i.state.selection.main.empty&&n.focusNode&&et(n.focusNode,n.focusOffset,n.anchorNode,n.anchorOffset)?this.flushSoon():this.flush(!1)}readSelectionRange(){let{view:e}=this,t=Rt.safari&&11==e.root.nodeType&&function(e){let t=e.activeElement;for(;t&&t.shadowRoot;)t=t.shadowRoot.activeElement;return t}(this.dom.ownerDocument)==this.dom&&function(e){let t=null;function i(e){e.preventDefault(),e.stopImmediatePropagation(),t=e.getTargetRanges()[0]}if(e.contentDOM.addEventListener("beforeinput",i,!0),e.dom.ownerDocument.execCommand("indent"),e.contentDOM.removeEventListener("beforeinput",i,!0),!t)return null;let n=t.startContainer,s=t.startOffset,r=t.endContainer,o=t.endOffset,a=e.docView.domAtPos(e.state.selection.main.anchor);return et(a.node,a.offset,r,o)&&([n,s,r,o]=[r,o,n,s]),{anchorNode:n,anchorOffset:s,focusNode:r,focusOffset:o}}(this.view)||Ge(e.root);if(!t||this.selectionRange.eq(t))return!1;let i=Ke(this.dom,t);return i&&!this.selectionChanged&&e.inputState.lastFocusTime>Date.now()-200&&e.inputState.lastTouchTime{let e=this.delayedAndroidKey;e&&(this.clearDelayedAndroidKey(),this.view.inputState.lastKeyCode=e.keyCode,this.view.inputState.lastKeyTime=Date.now(),!this.flush()&&e.force&&dt(this.dom,e.key,e.keyCode))};this.flushingAndroidKey=this.view.win.requestAnimationFrame(e)}this.delayedAndroidKey&&"Enter"!=e||(this.delayedAndroidKey={key:e,keyCode:t,force:this.lastChange{this.delayedFlush=-1,this.flush()})))}forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(this.delayedFlush),this.delayedFlush=-1),this.flush()}pendingRecords(){for(let e of this.observer.takeRecords())this.queue.push(e);return this.queue}processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);let t=-1,i=-1,n=!1;for(let s of e){let e=this.readMutation(s);e&&(e.typeOver&&(n=!0),-1==t?({from:t,to:i}=e):(t=Math.min(e.from,t),i=Math.max(e.to,i)))}return{from:t,to:i,typeOver:n}}readChange(){let{from:e,to:t,typeOver:i}=this.processRecords(),n=this.selectionChanged&&Ke(this.dom,this.selectionRange);if(e<0&&!n)return null;e>-1&&(this.lastChange=Date.now()),this.view.inputState.lastFocusTime=0,this.selectionChanged=!1;let s=new Cs(this.view,e,t,i);return this.view.docView.domChanged={newSel:s.newSel?s.newSel.main:null},s}flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&this.readSelectionRange();let t=this.readChange();if(!t)return this.view.requestMeasure(),!1;let i=this.view.state,n=Ps(this.view,t);return this.view.state==i&&this.view.update([]),n}readMutation(e){let t=this.view.docView.nearest(e.target);if(!t||t.ignoreMutation(e))return null;if(t.markDirty("attributes"==e.type),"attributes"==e.type&&(t.flags|=4),"childList"==e.type){let i=Rs(t,e.previousSibling||e.target.previousSibling,-1),n=Rs(t,e.nextSibling||e.target.nextSibling,1);return{from:i?t.posAfter(i):t.posAtStart,to:n?t.posBefore(n):t.posAtEnd,typeOver:!1}}return"characterData"==e.type?{from:t.posAtStart,to:t.posAtEnd,typeOver:e.target.nodeValue==e.oldValue}:null}setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win=e,this.addWindowListeners(this.win))}addWindowListeners(e){e.addEventListener("resize",this.onResize),e.addEventListener("beforeprint",this.onPrint),e.addEventListener("scroll",this.onScroll),e.document.addEventListener("selectionchange",this.onSelectionChange)}removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e.removeEventListener("resize",this.onResize),e.removeEventListener("beforeprint",this.onPrint),e.document.removeEventListener("selectionchange",this.onSelectionChange)}destroy(){var e,t,i;this.stop(),null===(e=this.intersection)||void 0===e||e.disconnect(),null===(t=this.gapIntersection)||void 0===t||t.disconnect(),null===(i=this.resizeScroll)||void 0===i||i.disconnect();for(let e of this.scrollTargets)e.removeEventListener("scroll",this.onScroll);this.removeWindowListeners(this.win),clearTimeout(this.parentCheck),clearTimeout(this.resizeTimeout),this.win.cancelAnimationFrame(this.delayedFlush),this.win.cancelAnimationFrame(this.flushingAndroidKey)}}function Rs(e,t,i){for(;t;){let n=gt.get(t);if(n&&n.parent==e)return n;let s=t.parentNode;t=s!=e.dom?s:i>0?t.nextSibling:t.previousSibling}return null}class Ds{get state(){return this.viewState.state}get viewport(){return this.viewState.viewport}get visibleRanges(){return this.viewState.visibleRanges}get inView(){return this.viewState.inView}get composing(){return this.inputState.composing>0}get compositionStarted(){return this.inputState.composing>=0}get root(){return this._root}get win(){return this.dom.ownerDocument.defaultView||window}constructor(e={}){this.plugins=[],this.pluginMap=new Map,this.editorAttrs={},this.contentAttrs={},this.bidiCache=[],this.destroyed=!1,this.updateState=2,this.measureScheduled=-1,this.measureRequests=[],this.contentDOM=document.createElement("div"),this.scrollDOM=document.createElement("div"),this.scrollDOM.tabIndex=-1,this.scrollDOM.className="cm-scroller",this.scrollDOM.appendChild(this.contentDOM),this.announceDOM=document.createElement("div"),this.announceDOM.style.cssText="position: fixed; top: -10000px",this.announceDOM.setAttribute("aria-live","polite"),this.dom=document.createElement("div"),this.dom.appendChild(this.announceDOM),this.dom.appendChild(this.scrollDOM);let{dispatch:t}=e;this.dispatchTransactions=e.dispatchTransactions||t&&(e=>e.forEach((e=>t(e,this))))||(e=>this.update(e)),this.dispatch=this.dispatch.bind(this),this._root=e.root||function(e){for(;e;){if(e&&(9==e.nodeType||11==e.nodeType&&e.host))return e;e=e.assignedSlot||e.parentNode}return null}(e.parent)||document,this.viewState=new os(e.state||Oe.create(e)),this.plugins=this.state.facet(Oi).map((e=>new _i(e)));for(let e of this.plugins)e.update(this);this.observer=new As(this),this.inputState=new fn(this),this.inputState.ensureHandlers(this.plugins),this.docView=new Yi(this),this.mountStyles(),this.updateAttrs(),this.updateState=0,this.requestMeasure(),e.parent&&e.parent.appendChild(this.dom)}dispatch(...e){let t=1==e.length&&e[0]instanceof le?e:1==e.length&&Array.isArray(e[0])?e[0]:[this.state.update(...e)];this.dispatchTransactions(t,this)}update(e){if(0!=this.updateState)throw new Error("Calls to EditorView.update are not allowed while an update is in progress");let t,i=!1,n=!1,s=this.state;for(let t of e){if(t.startState!=s)throw new RangeError("Trying to update state with a transaction that doesn't start from the previous state.");s=t.state}if(this.destroyed)return void(this.viewState.state=s);let r=this.hasFocus,o=0,a=null;e.some((e=>e.annotation(Bn)))?(this.inputState.notifiedFocused=r,o=1):r!=this.inputState.notifiedFocused&&(this.inputState.notifiedFocused=r,a=$n(s,r),a||(o=1));let l=this.observer.delayedAndroidKey,h=null;if(l?(this.observer.clearDelayedAndroidKey(),h=this.observer.readChange(),(h&&!this.state.doc.eq(s.doc)||!this.state.selection.eq(s.selection))&&(h=null)):this.observer.clear(),s.facet(Oe.phrases)!=this.state.facet(Oe.phrases))return this.setState(s);t=Ai.create(this,s,e),t.flags|=o;let c=this.viewState.scrollTarget;try{this.updateState=2;for(let t of e){if(c&&(c=c.map(t.changes)),t.scrollIntoView){let{main:e}=t.state.selection;c=new pi(e.empty?e:R.cursor(e.head,e.head>e.anchor?-1:1))}for(let e of t.effects)e.is(fi)&&(c=e.value)}this.viewState.update(t,c),this.bidiCache=Ls.update(this.bidiCache,t.changes),t.empty||(this.updatePlugins(t),this.inputState.update(t)),i=this.docView.update(t),this.state.facet(Mi)!=this.styleModules&&this.mountStyles(),n=this.updateAttrs(),this.showAnnouncements(e),this.docView.updateSelection(i,e.some((e=>e.isUserEvent("select.pointer"))))}finally{this.updateState=0}if(t.startState.facet(fs)!=t.state.facet(fs)&&(this.viewState.mustMeasureContent=!0),(i||n||c||this.viewState.mustEnforceCursorAssoc||this.viewState.mustMeasureContent)&&this.requestMeasure(),!t.empty)for(let e of this.state.facet(li))e(t);(a||h)&&Promise.resolve().then((()=>{a&&this.state==a.startState&&this.dispatch(a),h&&!Ps(this,h)&&l.force&&dt(this.contentDOM,l.key,l.keyCode)}))}setState(e){if(0!=this.updateState)throw new Error("Calls to EditorView.setState are not allowed while an update is in progress");if(this.destroyed)return void(this.viewState.state=e);this.updateState=2;let t=this.hasFocus;try{for(let e of this.plugins)e.destroy(this);this.viewState=new os(e),this.plugins=e.facet(Oi).map((e=>new _i(e))),this.pluginMap.clear();for(let e of this.plugins)e.update(this);this.docView=new Yi(this),this.inputState.ensureHandlers(this.plugins),this.mountStyles(),this.updateAttrs(),this.bidiCache=[]}finally{this.updateState=0}t&&this.focus(),this.requestMeasure()}updatePlugins(e){let t=e.startState.facet(Oi),i=e.state.facet(Oi);if(t!=i){let n=[];for(let s of i){let i=t.indexOf(s);if(i<0)n.push(new _i(s));else{let t=this.plugins[i];t.mustUpdate=e,n.push(t)}}for(let t of this.plugins)t.mustUpdate!=e&&t.destroy(this);this.plugins=n,this.pluginMap.clear()}else for(let t of this.plugins)t.mustUpdate=e;for(let e=0;e-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.observer.delayedAndroidKey)return this.measureScheduled=-1,void this.requestMeasure();this.measureScheduled=0,e&&this.observer.forceFlush();let t=null,i=this.scrollDOM,n=i.scrollTop*this.scaleY,{scrollAnchorPos:s,scrollAnchorHeight:r}=this.viewState;Math.abs(n-this.viewState.scrollTop)>1&&(r=-1),this.viewState.scrollAnchorHeight=-1;try{for(let e=0;;e++){if(r<0)if(pt(i))s=-1,r=this.viewState.heightMap.height;else{let e=this.viewState.scrollAnchorAt(n);s=e.from,r=e.top}this.updateState=1;let o=this.viewState.measure(this);if(!o&&!this.measureRequests.length&&null==this.viewState.scrollTarget)break;if(e>5){console.warn(this.measureRequests.length?"Measure loop restarted more than 5 times":"Viewport failed to stabilize");break}let a=[];4&o||([this.measureRequests,a]=[a,this.measureRequests]);let l=a.map((e=>{try{return e.read(this)}catch(e){return mi(this.state,e),qs}})),h=Ai.create(this,this.state,[]),c=!1;h.flags|=o,t?t.flags|=o:t=h,this.updateState=2,h.empty||(this.updatePlugins(h),this.inputState.update(h),this.updateAttrs(),c=this.docView.update(h));for(let e=0;e1||e<-1){n+=e,i.scrollTop=n/this.scaleY,r=-1;continue}}}break}}}finally{this.updateState=0,this.measureScheduled=-1}if(t&&!t.empty)for(let e of this.state.facet(li))e(t)}get themeClasses(){return gs+" "+(this.state.facet(ms)?Os:vs)+" "+this.state.facet(fs)}updateAttrs(){let e=Ns(this,yi,{class:"cm-editor"+(this.hasFocus?" cm-focused ":" ")+this.themeClasses}),t={spellcheck:"false",autocorrect:"off",autocapitalize:"off",translate:"no",contenteditable:this.state.facet(gi)?"true":"false",class:"cm-content",style:`${Rt.tabSize}: ${this.state.tabSize}`,role:"textbox","aria-multiline":"true"};this.state.readOnly&&(t["aria-readonly"]="true"),Ns(this,wi,t);let i=this.observer.ignore((()=>{let i=Wt(this.contentDOM,this.contentAttrs,t),n=Wt(this.dom,this.editorAttrs,e);return i||n}));return this.editorAttrs=e,this.contentAttrs=t,i}showAnnouncements(e){let t=!0;for(let i of e)for(let e of i.effects)e.is(Ds.announce)&&(t&&(this.announceDOM.textContent=""),t=!1,this.announceDOM.appendChild(document.createElement("div")).textContent=e.value)}mountStyles(){this.styleModules=this.state.facet(Mi);let e=this.state.facet(Ds.cspNonce);ze.mount(this.root,this.styleModules.concat(ys).reverse(),e?{nonce:e}:void 0)}readMeasured(){if(2==this.updateState)throw new Error("Reading the editor layout isn't allowed during an update");0==this.updateState&&this.measureScheduled>-1&&this.measure(!1)}requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=this.win.requestAnimationFrame((()=>this.measure()))),e){if(this.measureRequests.indexOf(e)>-1)return;if(null!=e.key)for(let t=0;tt.spec==e))||null),t&&t.update(this).value}get documentTop(){return this.contentDOM.getBoundingClientRect().top+this.viewState.paddingTop}get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.viewState.paddingBottom}}get scaleX(){return this.viewState.scaleX}get scaleY(){return this.viewState.scaleY}elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHeight(e)}lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlockAtHeight(e)}get viewportLineBlocks(){return this.viewState.viewportLines}lineBlockAt(e){return this.viewState.lineBlockAt(e)}get contentHeight(){return this.viewState.contentHeight}moveByChar(e,t,i){return pn(this,e,dn(this,e,t,i))}moveByGroup(e,t){return pn(this,e,dn(this,e,t,(t=>function(e,t,i){let n=e.state.charCategorizer(t),s=n(i);return e=>{let t=n(e);return s==me.Space&&(s=t),s==t}}(this,e.head,t))))}moveToLineBoundary(e,t,i=!0){return function(e,t,i,n){let s=cn(e,t.head),r=n&&s.type==Xt.Text&&(e.lineWrapping||s.widgetLineBreaks)?e.coordsAtPos(t.assoc<0&&t.head>s.from?t.head-1:t.head):null;if(r){let t=e.dom.getBoundingClientRect(),n=e.textDirectionAt(s.from),o=e.posAtCoords({x:i==(n==Ri.LTR)?t.right-1:t.left+1,y:(r.top+r.bottom)/2});if(null!=o)return R.cursor(o,i?-1:1)}return R.cursor(i?s.to:s.from,i?-1:1)}(this,e,t,i)}moveVertically(e,t,i){return pn(this,e,function(e,t,i,n){let s=t.head,r=i?1:-1;if(s==(i?e.state.doc.length:0))return R.cursor(s,t.assoc);let o,a=t.goalColumn,l=e.contentDOM.getBoundingClientRect(),h=e.coordsAtPos(s,t.assoc||-1),c=e.documentTop;if(h)null==a&&(a=h.left-l.left),o=r<0?h.top:h.bottom;else{let t=e.viewState.lineBlockAt(s);null==a&&(a=Math.min(l.right-l.left,e.defaultCharacterWidth*(s-t.from))),o=(r<0?t.top:t.bottom)+c}let d=l.left+a,u=null!=n?n:e.viewState.heightOracle.textHeight>>1;for(let t=0;;t+=10){let i=o+(u+t)*r,n=ln(e,{x:d,y:i},!1,r);if(il.bottom||(r<0?ns)){let t=e.docView.coordsForChar(n),s=!t||i0)}coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}get textDirection(){return this.viewState.defaultTextDirection}textDirectionAt(e){return!this.state.facet(di)||ethis.viewport.to?this.textDirection:(this.readMeasured(),this.docView.textDirectionAt(e))}get lineWrapping(){return this.viewState.heightOracle.lineWrapping}bidiSpans(e){if(e.length>Is)return Fi(e.length);let t,i=this.textDirectionAt(e.from);for(let n of this.bidiCache)if(n.from==e.from&&n.dir==i&&(n.fresh||ji(n.isolates,t=Ti(this,e.from,e.to))))return n.order;t||(t=Ti(this,e.from,e.to));let n=function(e,t,i){if(!e)return[new zi(0,0,t==Ii?1:0)];if(t==Di&&!i.length&&!Qi.test(e))return Fi(e.length);if(i.length)for(;e.length>Wi.length;)Wi[Wi.length]=256;let n=[],s=t==Di?0:1;return Ui(e,s,s,i,0,e.length,n),n}(e.text,i,t);return this.bidiCache.push(new Ls(e.from,e.to,i,t,!0,n)),n}get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||Rt.safari&&(null===(e=this.inputState)||void 0===e?void 0:e.lastContextMenu)>Date.now()-3e4)&&this.root.activeElement==this.contentDOM}focus(){this.observer.ignore((()=>{ht(this.contentDOM),this.docView.updateSelection()}))}setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((9==e.nodeType?e:e.ownerDocument).defaultView||window),this.mountStyles())}destroy(){for(let e of this.plugins)e.destroy(this);this.plugins=[],this.inputState.destroy(),this.dom.remove(),this.observer.destroy(),this.measureScheduled>-1&&this.win.cancelAnimationFrame(this.measureScheduled),this.destroyed=!0}static scrollIntoView(e,t={}){return fi.of(new pi("number"==typeof e?R.cursor(e):e,t.y,t.x,t.yMargin,t.xMargin))}static domEventHandlers(e){return bi.define((()=>({})),{eventHandlers:e})}static domEventObservers(e){return bi.define((()=>({})),{eventObservers:e})}static theme(e,t){let i=ze.newName(),n=[fs.of(i),Mi.of(_s(`.${i}`,e))];return t&&t.dark&&n.push(ms.of(!0)),n}static baseTheme(e){return V.lowest(Mi.of(_s("."+gs,e,bs)))}static findFromDOM(e){var t;let i=e.querySelector(".cm-content"),n=i&>.get(i)||gt.get(e);return(null===(t=null==n?void 0:n.rootView)||void 0===t?void 0:t.view)||null}}Ds.styleModule=Mi,Ds.inputHandler=hi,Ds.focusChangeEffect=ci,Ds.perLineTextDirection=di,Ds.exceptionSink=ai,Ds.updateListener=li,Ds.editable=gi,Ds.mouseSelectionStyle=oi,Ds.dragMovesSelection=ri,Ds.clickAddsSelectionRange=si,Ds.decorations=xi,Ds.atomicRanges=Si,Ds.bidiIsolatedRanges=ki,Ds.scrollMargins=Ci,Ds.darkTheme=ms,Ds.cspNonce=q.define({combine:e=>e.length?e[0]:""}),Ds.contentAttributes=wi,Ds.editorAttributes=yi,Ds.lineWrapping=Ds.contentAttributes.of({class:"cm-lineWrapping"}),Ds.announce=ae.define();const Is=4096,qs={};class Ls{constructor(e,t,i,n,s,r){this.from=e,this.to=t,this.dir=i,this.isolates=n,this.fresh=s,this.order=r}static update(e,t){if(t.empty&&!e.some((e=>e.fresh)))return e;let i=[],n=e.length?e[e.length-1].dir:Ri.LTR;for(let s=Math.max(0,e.length-10);s=0;s--){let t=n[s],r="function"==typeof t?t(e):t;r&&Qt(r,i)}return i}const Bs=Rt.mac?"mac":Rt.windows?"win":Rt.linux?"linux":"key";function $s(e,t,i){return t.altKey&&(e="Alt-"+e),t.ctrlKey&&(e="Ctrl-"+e),t.metaKey&&(e="Meta-"+e),!1!==i&&t.shiftKey&&(e="Shift-"+e),e}const Qs=V.default(Ds.domEventHandlers({keydown:(e,t)=>Fs(Ws(t.state),e,t,"editor")})),zs=q.define({enables:Qs}),js=new WeakMap;function Ws(e){let t=e.facet(zs),i=js.get(t);return i||js.set(t,i=function(e,t=Bs){let i=Object.create(null),n=Object.create(null),s=(e,t)=>{let i=n[e];if(null==i)n[e]=t;else if(i!=t)throw new Error("Key binding "+e+" is used both as a regular binding and as a multi-stroke prefix")},r=(e,n,r,o,a)=>{var l,h;let c=i[e]||(i[e]=Object.create(null)),d=n.split(/ (?!$)/).map((e=>function(e,t){const i=e.split(/-(?!$)/);let n,s,r,o,a=i[i.length-1];"Space"==a&&(a=" ");for(let e=0;e{let n=Vs={view:t,prefix:i,scope:e};return setTimeout((()=>{Vs==n&&(Vs=null)}),Us),!0}]})}let u=d.join(" ");s(u,!1);let p=c[u]||(c[u]={preventDefault:!1,stopPropagation:!1,run:(null===(h=null===(l=c._any)||void 0===l?void 0:l.run)||void 0===h?void 0:h.slice())||[]});r&&p.run.push(r),o&&(p.preventDefault=!0),a&&(p.stopPropagation=!0)};for(let n of e){let e=n.scope?n.scope.split(" "):["editor"];if(n.any)for(let t of e){let e=i[t]||(i[t]=Object.create(null));e._any||(e._any={preventDefault:!1,stopPropagation:!1,run:[]});for(let t in e)e[t].run.push(n.any)}let s=n[t]||n.key;if(s)for(let t of e)r(t,s,n.run,n.preventDefault,n.stopPropagation),n.shift&&r(t,"Shift-"+s,n.shift,n.preventDefault,n.stopPropagation)}return i}(t.reduce(((e,t)=>e.concat(t)),[]))),i}let Vs=null;const Us=4e3;function Fs(e,t,i,n){let s=function(e){var t=!(Fe&&e.metaKey&&e.shiftKey&&!e.ctrlKey&&!e.altKey||He&&e.shiftKey&&e.key&&1==e.key.length||"Unidentified"==e.key)&&e.key||(e.shiftKey?Ue:Ve)[e.keyCode]||e.key||"Unidentified";return"Esc"==t&&(t="Escape"),"Del"==t&&(t="Delete"),"Left"==t&&(t="ArrowLeft"),"Up"==t&&(t="ArrowUp"),"Right"==t&&(t="ArrowRight"),"Down"==t&&(t="ArrowDown"),t}(t),r=_(O(s,0))==s.length&&" "!=s,o="",a=!1,l=!1,h=!1;Vs&&Vs.view==i&&Vs.scope==n&&(o=Vs.prefix+" ",bn.indexOf(t.keyCode)<0&&(l=!0,Vs=null));let c,d,u=new Set,p=e=>{if(e){for(let n of e.run)if(!u.has(n)&&(u.add(n),n(i,t)))return e.stopPropagation&&(h=!0),!0;e.preventDefault&&(e.stopPropagation&&(h=!0),l=!0)}return!1},f=e[n];return f&&(p(f[o+$s(s,t,!r)])?a=!0:r&&(t.altKey||t.metaKey||t.ctrlKey)&&!(Rt.windows&&t.ctrlKey&&t.altKey)&&(c=Ve[t.keyCode])&&c!=s?(p(f[o+$s(c,t,!0)])||t.shiftKey&&(d=Ue[t.keyCode])!=s&&d!=c&&p(f[o+$s(d,t,!1)]))&&(a=!0):r&&t.shiftKey&&p(f[o+$s(s,t,!0)])&&(a=!0),!a&&p(f._any)&&(a=!0)),l&&(a=!0),a&&h&&t.stopPropagation(),a}class Hs{constructor(e,t,i,n,s){this.className=e,this.left=t,this.top=i,this.width=n,this.height=s}draw(){let e=document.createElement("div");return e.className=this.className,this.adjust(e),e}update(e,t){return t.className==this.className&&(this.adjust(e),!0)}adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",null!=this.width&&(e.style.width=this.width+"px"),e.style.height=this.height+"px"}eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&this.height==e.height&&this.className==e.className}static forRange(e,t,i){if(i.empty){let n=e.coordsAtPos(i.head,i.assoc||1);if(!n)return[];let s=Xs(e);return[new Hs(t,n.left-s.left,n.top-s.top,null,n.bottom-n.top)]}return function(e,t,i){if(i.to<=e.viewport.from||i.from>=e.viewport.to)return[];let n=Math.max(i.from,e.viewport.from),s=Math.min(i.to,e.viewport.to),r=e.textDirection==Ri.LTR,o=e.contentDOM,a=o.getBoundingClientRect(),l=Xs(e),h=o.querySelector(".cm-line"),c=h&&window.getComputedStyle(h),d=a.left+(c?parseInt(c.paddingLeft)+Math.min(0,parseInt(c.textIndent)):0),u=a.right-(c?parseInt(c.paddingRight):0),p=cn(e,n),f=cn(e,s),m=p.type==Xt.Text?p:null,g=f.type==Xt.Text?f:null;if(m&&(e.lineWrapping||p.widgetLineBreaks)&&(m=Ys(e,n,m)),g&&(e.lineWrapping||f.widgetLineBreaks)&&(g=Ys(e,s,g)),m&&g&&m.from==g.from)return O(b(i.from,i.to,m));{let t=m?b(i.from,null,m):_(p,!1),n=g?b(null,i.to,g):_(f,!0),s=[];return(m||p).to<(g||f).from-(m&&g?1:0)||p.widgetLineBreaks>1&&t.bottom+e.defaultLineHeight/2h&&n.from=r)break;a>s&&l(Math.max(e,s),null==t&&e<=h,Math.min(a,r),null==i&&a>=c,o.dir)}if(s=n.to+1,s>=r)break}return 0==a.length&&l(h,null==t,c,null==i,e.textDirection),{top:s,bottom:o,horizontal:a}}function _(e,t){let i=a.top+(t?e.top:e.bottom);return{top:i,bottom:i,horizontal:[]}}}(e,t,i)}}function Xs(e){let t=e.scrollDOM.getBoundingClientRect();return{left:(e.textDirection==Ri.LTR?t.left:t.right-e.scrollDOM.clientWidth*e.scaleX)-e.scrollDOM.scrollLeft*e.scaleX,top:t.top-e.scrollDOM.scrollTop*e.scaleY}}function Ys(e,t,i){let n=R.cursor(t);return{from:Math.max(i.from,e.moveToLineBoundary(n,!1,!0).from),to:Math.min(i.to,e.moveToLineBoundary(n,!0,!0).from),type:Xt.Text}}class Gs{constructor(e,t){this.view=e,this.layer=t,this.drawn=[],this.scaleX=1,this.scaleY=1,this.measureReq={read:this.measure.bind(this),write:this.draw.bind(this)},this.dom=e.scrollDOM.appendChild(document.createElement("div")),this.dom.classList.add("cm-layer"),t.above&&this.dom.classList.add("cm-layer-above"),t.class&&this.dom.classList.add(t.class),this.scale(),this.dom.setAttribute("aria-hidden","true"),this.setOrder(e.state),e.requestMeasure(this.measureReq),t.mount&&t.mount(this.dom,e)}update(e){e.startState.facet(Zs)!=e.state.facet(Zs)&&this.setOrder(e.state),(this.layer.update(e,this.dom)||e.geometryChanged)&&(this.scale(),e.view.requestMeasure(this.measureReq))}setOrder(e){let t=0,i=e.facet(Zs);for(;t{return i=e,n=this.drawn[t],!(i.constructor==n.constructor&&i.eq(n));var i,n}))){let t=this.dom.firstChild,i=0;for(let n of e)n.update&&t&&n.constructor&&this.drawn[i].constructor&&n.update(t,this.drawn[i])?(t=t.nextSibling,i++):this.dom.insertBefore(n.draw(),t);for(;t;){let e=t.nextSibling;t.remove(),t=e}this.drawn=e}}destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),this.dom.remove()}}const Zs=q.define();function Ks(e){return[bi.define((t=>new Gs(t,e))),Zs.of(e)]}const Js=!Rt.ios,er=q.define({combine:e=>be(e,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursorBlinkRate:(e,t)=>Math.min(e,t),drawRangeCursor:(e,t)=>e||t})});function tr(e={}){return[er.of(e),nr,rr,ar,ui.of(!0)]}function ir(e){return e.startState.facet(er)!=e.state.facet(er)}const nr=Ks({above:!0,markers(e){let{state:t}=e,i=t.facet(er),n=[];for(let s of t.selection.ranges){let r=s==t.selection.main;if(s.empty?!r||Js:i.drawRangeCursor){let t=r?"cm-cursor cm-cursor-primary":"cm-cursor cm-cursor-secondary",i=s.empty?s:R.cursor(s.head,s.head>s.anchor?-1:1);for(let s of Hs.forRange(e,t,i))n.push(s)}}return n},update(e,t){e.transactions.some((e=>e.selection))&&(t.style.animationName="cm-blink"==t.style.animationName?"cm-blink2":"cm-blink");let i=ir(e);return i&&sr(e.state,t),e.docChanged||e.selectionSet||i},mount(e,t){sr(t.state,e)},class:"cm-cursorLayer"});function sr(e,t){t.style.animationDuration=e.facet(er).cursorBlinkRate+"ms"}const rr=Ks({above:!1,markers:e=>e.state.selection.ranges.map((t=>t.empty?[]:Hs.forRange(e,"cm-selectionBackground",t))).reduce(((e,t)=>e.concat(t))),update:(e,t)=>e.docChanged||e.selectionSet||e.viewportChanged||ir(e),class:"cm-selectionLayer"}),or={".cm-line":{"& ::selection":{backgroundColor:"transparent !important"},"&::selection":{backgroundColor:"transparent !important"}}};Js&&(or[".cm-line"].caretColor="transparent !important");const ar=V.highest(Ds.theme(or)),lr=ae.define({map:(e,t)=>null==e?null:t.mapPos(e)}),hr=j.define({create:()=>null,update:(e,t)=>(null!=e&&(e=t.changes.mapPos(e)),t.effects.reduce(((e,t)=>t.is(lr)?t.value:e),e))}),cr=bi.fromClass(class{constructor(e){this.view=e,this.cursor=null,this.measureReq={read:this.readPos.bind(this),write:this.drawCursor.bind(this)}}update(e){var t;let i=e.state.field(hr);null==i?null!=this.cursor&&(null===(t=this.cursor)||void 0===t||t.remove(),this.cursor=null):(this.cursor||(this.cursor=this.view.scrollDOM.appendChild(document.createElement("div")),this.cursor.className="cm-dropCursor"),(e.startState.field(hr)!=i||e.docChanged||e.geometryChanged)&&this.view.requestMeasure(this.measureReq))}readPos(){let{view:e}=this,t=e.state.field(hr),i=null!=t&&e.coordsAtPos(t);if(!i)return null;let n=e.scrollDOM.getBoundingClientRect();return{left:i.left-n.left+e.scrollDOM.scrollLeft*e.scaleX,top:i.top-n.top+e.scrollDOM.scrollTop*e.scaleY,height:i.bottom-i.top}}drawCursor(e){if(this.cursor){let{scaleX:t,scaleY:i}=this.view;e?(this.cursor.style.left=e.left/t+"px",this.cursor.style.top=e.top/i+"px",this.cursor.style.height=e.height/i+"px"):this.cursor.style.left="-100000px"}}destroy(){this.cursor&&this.cursor.remove()}setDropPos(e){this.view.state.field(hr)!=e&&this.view.dispatch({effects:lr.of(e)})}},{eventObservers:{dragover(e){this.setDropPos(this.view.posAtCoords({x:e.clientX,y:e.clientY}))},dragleave(e){e.target!=this.view.contentDOM&&this.view.contentDOM.contains(e.relatedTarget)||this.setDropPos(null)},dragend(){this.setDropPos(null)},drop(){this.setDropPos(null)}}});function dr(e,t,i,n,s){t.lastIndex=0;for(let r,o=e.iterRange(i,n),a=i;!o.next().done;a+=o.value.length)if(!o.lineBreak)for(;r=t.exec(o.value);)s(a+r.index,r)}class ur{constructor(e){const{regexp:t,decoration:i,decorate:n,boundary:s,maxLength:r=1e3}=e;if(!t.global)throw new RangeError("The regular expression given to MatchDecorator should have its 'g' flag set");if(this.regexp=t,n)this.addMatch=(e,t,i,s)=>n(s,i,i+e[0].length,e,t);else if("function"==typeof i)this.addMatch=(e,t,n,s)=>{let r=i(e,t,n);r&&s(n,n+e[0].length,r)};else{if(!i)throw new RangeError("Either 'decorate' or 'decoration' should be provided to MatchDecorator");this.addMatch=(e,t,n,s)=>s(n,n+e[0].length,i)}this.boundary=s,this.maxLength=r}createDeco(e){let t=new ke,i=t.add.bind(t);for(let{from:t,to:n}of function(e,t){let i=e.visibleRanges;if(1==i.length&&i[0].from==e.viewport.from&&i[0].to==e.viewport.to)return i;let n=[];for(let{from:s,to:r}of i)s=Math.max(e.state.doc.lineAt(s).from,s-t),r=Math.min(e.state.doc.lineAt(r).to,r+t),n.length&&n[n.length-1].to>=s?n[n.length-1].to=r:n.push({from:s,to:r});return n}(e,this.maxLength))dr(e.state.doc,this.regexp,t,n,((t,n)=>this.addMatch(n,e,t,i)));return t.finish()}updateDeco(e,t){let i=1e9,n=-1;return e.docChanged&&e.changes.iterChanges(((t,s,r,o)=>{o>e.view.viewport.from&&r1e3?this.createDeco(e.view):n>-1?this.updateRange(e.view,t.map(e.changes),i,n):t}updateRange(e,t,i,n){for(let s of e.visibleRanges){let r=Math.max(s.from,i),o=Math.min(s.to,n);if(o>r){let i=e.state.doc.lineAt(r),n=i.toi.from;r--)if(this.boundary.test(i.text[r-1-i.from])){a=r;break}for(;oc.push(i.range(e,t));if(i==n)for(this.regexp.lastIndex=a-i.from;(h=this.regexp.exec(i.text))&&h.indexthis.addMatch(i,e,t,d)));t=t.update({filterFrom:a,filterTo:l,filter:(e,t)=>el,add:c})}}return t}}const pr=null!=/x/.unicode?"gu":"g",fr=new RegExp("[\0-\b\n--ยŸยญุœโ€‹โ€Žโ€\u2028\u2029โ€ญโ€ฎโฆโงโฉ\ufeff๏ฟน-๏ฟผ]",pr),mr={0:"null",7:"bell",8:"backspace",10:"newline",11:"vertical tab",13:"carriage return",27:"escape",8203:"zero width space",8204:"zero width non-joiner",8205:"zero width joiner",8206:"left-to-right mark",8207:"right-to-left mark",8232:"line separator",8237:"left-to-right override",8238:"right-to-left override",8294:"left-to-right isolate",8295:"right-to-left isolate",8297:"pop directional isolate",8233:"paragraph separator",65279:"zero width no-break space",65532:"object replacement"};let gr=null;const vr=q.define({combine(e){let t=be(e,{render:null,specialChars:fr,addSpecialChars:null});return(t.replaceTabs=!function(){var e;if(null==gr&&"undefined"!=typeof document&&document.body){let t=document.body.style;gr=null!=(null!==(e=t.tabSize)&&void 0!==e?e:t.MozTabSize)}return gr||!1}())&&(t.specialChars=new RegExp("\t|"+t.specialChars.source,pr)),t.addSpecialChars&&(t.specialChars=new RegExp(t.specialChars.source+"|"+t.addSpecialChars.source,pr)),t}});function Or(e={}){return[vr.of(e),br||(br=bi.fromClass(class{constructor(e){this.view=e,this.decorations=Yt.none,this.decorationCache=Object.create(null),this.decorator=this.makeDecorator(e.state.facet(vr)),this.decorations=this.decorator.createDeco(e)}makeDecorator(e){return new ur({regexp:e.specialChars,decoration:(t,i,n)=>{let{doc:s}=i.state,r=O(t[0],0);if(9==r){let e=s.lineAt(n),t=i.state.tabSize,r=Le(e.text,t,n-e.from);return Yt.replace({widget:new yr((t-r%t)*this.view.defaultCharacterWidth/this.view.scaleX)})}return this.decorationCache[r]||(this.decorationCache[r]=Yt.replace({widget:new _r(e,r)}))},boundary:e.replaceTabs?void 0:/[^]/})}update(e){let t=e.state.facet(vr);e.startState.facet(vr)!=t?(this.decorator=this.makeDecorator(t),this.decorations=this.decorator.createDeco(e.view)):this.decorations=this.decorator.updateDeco(e,this.decorations)}},{decorations:e=>e.decorations}))]}let br=null;class _r extends Ht{constructor(e,t){super(),this.options=e,this.code=t}eq(e){return e.code==this.code}toDOM(e){let t=function(e){return e>=32?"โ€ข":10==e?"โค":String.fromCharCode(9216+e)}(this.code),i=e.state.phrase("Control character")+" "+(mr[this.code]||"0x"+this.code.toString(16)),n=this.options.render&&this.options.render(this.code,i,t);if(n)return n;let s=document.createElement("span");return s.textContent=t,s.title=i,s.setAttribute("aria-label",i),s.className="cm-specialChar",s}ignoreEvent(){return!1}}class yr extends Ht{constructor(e){super(),this.width=e}eq(e){return e.width==this.width}toDOM(){let e=document.createElement("span");return e.textContent="\t",e.className="cm-tab",e.style.width=this.width+"px",e}ignoreEvent(){return!1}}const wr=Yt.line({class:"cm-activeLine"}),xr=bi.fromClass(class{constructor(e){this.decorations=this.getDeco(e)}update(e){(e.docChanged||e.selectionSet)&&(this.decorations=this.getDeco(e.view))}getDeco(e){let t=-1,i=[];for(let n of e.state.selection.ranges){let s=e.lineBlockAt(n.head);s.from>t&&(i.push(wr.range(s.from)),t=s.from)}return Yt.set(i)}},{decorations:e=>e.decorations}),Sr=2e3;function kr(e,t){let i=e.posAtCoords({x:t.clientX,y:t.clientY},!1),n=e.state.doc.lineAt(i),s=i-n.from,r=s>Sr?-1:s==n.length?function(e,t){let i=e.coordsAtPos(e.viewport.from);return i?Math.round(Math.abs((i.left-t)/e.defaultCharacterWidth)):-1}(e,t.clientX):Le(n.text,e.state.tabSize,i-n.from);return{line:n.number,col:r,off:s}}function Tr(e){let t=(null==e?void 0:e.eventFilter)||(e=>e.altKey&&0==e.button);return Ds.mouseSelectionStyle.of(((e,i)=>t(i)?function(e,t){let i=kr(e,t),n=e.state.selection;return i?{update(e){if(e.docChanged){let t=e.changes.mapPos(e.startState.doc.line(i.line).from),s=e.state.doc.lineAt(t);i={line:s.number,col:i.col,off:Math.min(i.off,s.length)},n=n.map(e.changes)}},get(t,s,r){let o=kr(e,t);if(!o)return n;let a=function(e,t,i){let n=Math.min(t.line,i.line),s=Math.max(t.line,i.line),r=[];if(t.off>Sr||i.off>Sr||t.col<0||i.col<0){let o=Math.min(t.off,i.off),a=Math.max(t.off,i.off);for(let t=n;t<=s;t++){let i=e.doc.line(t);i.length<=a&&r.push(R.range(i.from+o,i.to+a))}}else{let o=Math.min(t.col,i.col),a=Math.max(t.col,i.col);for(let t=n;t<=s;t++){let i=e.doc.line(t),n=Ne(i.text,o,e.tabSize,!0);if(n<0)r.push(R.cursor(i.to));else{let t=Ne(i.text,a,e.tabSize);r.push(R.range(i.from+n,i.from+t))}}}return r}(e.state,i,o);return a.length?r?R.create(a.concat(n.ranges)):R.create(a):n}}:null}(e,i):null))}const Cr={Alt:[18,e=>!!e.altKey],Control:[17,e=>!!e.ctrlKey],Shift:[16,e=>!!e.shiftKey],Meta:[91,e=>!!e.metaKey]},Pr={style:"cursor: crosshair"};function Mr(e={}){let[t,i]=Cr[e.key||"Alt"],n=bi.fromClass(class{constructor(e){this.view=e,this.isDown=!1}set(e){this.isDown!=e&&(this.isDown=e,this.view.update([]))}},{eventObservers:{keydown(e){this.set(e.keyCode==t||i(e))},keyup(e){e.keyCode!=t&&i(e)||this.set(!1)},mousemove(e){this.set(i(e))}}});return[n,Ds.contentAttributes.of((e=>{var t;return(null===(t=e.plugin(n))||void 0===t?void 0:t.isDown)?Pr:null}))]}const Er="-10000px";class Ar{constructor(e,t,i){this.facet=t,this.createTooltipView=i,this.input=e.state.facet(t),this.tooltips=this.input.filter((e=>e)),this.tooltipViews=this.tooltips.map(i)}update(e,t){var i;let n=e.state.facet(this.facet),s=n.filter((e=>e));if(n===this.input){for(let t of this.tooltipViews)t.update&&t.update(e);return!1}let r=[],o=t?[]:null;for(let i=0;it[i]=e)),t.length=o.length),this.input=n,this.tooltips=s,this.tooltipViews=r,!0}}function Rr(e){let{win:t}=e;return{top:0,left:0,bottom:t.innerHeight,right:t.innerWidth}}const Dr=q.define({combine:e=>{var t,i,n;return{position:Rt.ios?"absolute":(null===(t=e.find((e=>e.position)))||void 0===t?void 0:t.position)||"fixed",parent:(null===(i=e.find((e=>e.parent)))||void 0===i?void 0:i.parent)||null,tooltipSpace:(null===(n=e.find((e=>e.tooltipSpace)))||void 0===n?void 0:n.tooltipSpace)||Rr}}}),Ir=new WeakMap,qr=bi.fromClass(class{constructor(e){this.view=e,this.above=[],this.inView=!0,this.madeAbsolute=!1,this.lastTransaction=0,this.measureTimeout=-1;let t=e.state.facet(Dr);this.position=t.position,this.parent=t.parent,this.classes=e.themeClasses,this.createContainer(),this.measureReq={read:this.readMeasure.bind(this),write:this.writeMeasure.bind(this),key:this},this.manager=new Ar(e,Br,(e=>this.createTooltip(e))),this.intersectionObserver="function"==typeof IntersectionObserver?new IntersectionObserver((e=>{Date.now()>this.lastTransaction-50&&e.length>0&&e[e.length-1].intersectionRatio<1&&this.measureSoon()}),{threshold:[1]}):null,this.observeIntersection(),e.win.addEventListener("resize",this.measureSoon=this.measureSoon.bind(this)),this.maybeMeasure()}createContainer(){this.parent?(this.container=document.createElement("div"),this.container.style.position="relative",this.container.className=this.view.themeClasses,this.parent.appendChild(this.container)):this.container=this.view.dom}observeIntersection(){if(this.intersectionObserver){this.intersectionObserver.disconnect();for(let e of this.manager.tooltipViews)this.intersectionObserver.observe(e.dom)}}measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout((()=>{this.measureTimeout=-1,this.maybeMeasure()}),50))}update(e){e.transactions.length&&(this.lastTransaction=Date.now());let t=this.manager.update(e,this.above);t&&this.observeIntersection();let i=t||e.geometryChanged,n=e.state.facet(Dr);if(n.position!=this.position&&!this.madeAbsolute){this.position=n.position;for(let e of this.manager.tooltipViews)e.dom.style.position=this.position;i=!0}if(n.parent!=this.parent){this.parent&&this.container.remove(),this.parent=n.parent,this.createContainer();for(let e of this.manager.tooltipViews)this.container.appendChild(e.dom);i=!0}else this.parent&&this.view.themeClasses!=this.classes&&(this.classes=this.container.className=this.view.themeClasses);i&&this.maybeMeasure()}createTooltip(e){let t=e.create(this.view);if(t.dom.classList.add("cm-tooltip"),e.arrow&&!t.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")){let e=document.createElement("div");e.className="cm-tooltip-arrow",t.dom.appendChild(e)}return t.dom.style.position=this.position,t.dom.style.top=Er,t.dom.style.left="0px",this.container.appendChild(t.dom),t.mount&&t.mount(this.view),t}destroy(){var e,t;this.view.win.removeEventListener("resize",this.measureSoon);for(let t of this.manager.tooltipViews)t.dom.remove(),null===(e=t.destroy)||void 0===e||e.call(t);this.parent&&this.container.remove(),null===(t=this.intersectionObserver)||void 0===t||t.disconnect(),clearTimeout(this.measureTimeout)}readMeasure(){let e=this.view.dom.getBoundingClientRect(),t=1,i=1,n=!1;if("fixed"==this.position&&this.manager.tooltipViews.length){let{dom:e}=this.manager.tooltipViews[0];if(Rt.gecko)n=e.offsetParent!=this.container.ownerDocument.body;else if(1!=this.view.scaleX||1!=this.view.scaleY)n=!0;else if(e.style.top==Er&&"0px"==e.style.left){let t=e.getBoundingClientRect();n=Math.abs(t.top+1e4)>1||Math.abs(t.left)>1}}if(n||"absolute"==this.position)if(this.parent){let e=this.parent.getBoundingClientRect();e.width&&e.height&&(t=e.width/this.parent.offsetWidth,i=e.height/this.parent.offsetHeight)}else({scaleX:t,scaleY:i}=this.view.viewState);return{editor:e,parent:this.parent?this.container.getBoundingClientRect():e,pos:this.manager.tooltips.map(((e,t)=>{let i=this.manager.tooltipViews[t];return i.getCoords?i.getCoords(e.pos):this.view.coordsAtPos(e.pos)})),size:this.manager.tooltipViews.map((({dom:e})=>e.getBoundingClientRect())),space:this.view.state.facet(Dr).tooltipSpace(this.view),scaleX:t,scaleY:i,makeAbsolute:n}}writeMeasure(e){var t;if(e.makeAbsolute){this.madeAbsolute=!0,this.position="absolute";for(let e of this.manager.tooltipViews)e.dom.style.position="absolute"}let{editor:i,space:n,scaleX:s,scaleY:r}=e,o=[];for(let a=0;a=Math.min(i.bottom,n.bottom)||d.rightMath.min(i.right,n.right)+.1){c.style.top=Er;continue}let p=l.arrow?h.dom.querySelector(".cm-tooltip-arrow"):null,f=p?7:0,m=u.right-u.left,g=null!==(t=Ir.get(h))&&void 0!==t?t:u.bottom-u.top,v=h.offset||Nr,O=this.view.textDirection==Ri.LTR,b=u.width>n.right-n.left?O?n.left:n.right-u.width:O?Math.min(d.left-(p?14:0)+v.x,n.right-m):Math.max(n.left,d.left-m+(p?14:0)-v.x),_=this.above[a];!l.strictSide&&(_?d.top-(u.bottom-u.top)-v.yn.bottom)&&_==n.bottom-d.bottom>d.top-n.top&&(_=this.above[a]=!_);let y=(_?d.top-n.top:n.bottom-d.bottom)-f;if(yb&&e.topw&&(w=_?e.top-g-2-f:e.bottom+f+2);if("absolute"==this.position?(c.style.top=(w-e.parent.top)/r+"px",c.style.left=(b-e.parent.left)/s+"px"):(c.style.top=w/r+"px",c.style.left=b/s+"px"),p){let e=d.left+(O?v.x:-v.x)-(b+14-7);p.style.left=e/s+"px"}!0!==h.overlap&&o.push({left:b,top:w,right:x,bottom:w+g}),c.classList.toggle("cm-tooltip-above",_),c.classList.toggle("cm-tooltip-below",!_),h.positioned&&h.positioned(e.space)}}maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this.view.requestMeasure(this.measureReq),this.inView!=this.view.inView&&(this.inView=this.view.inView,!this.inView)))for(let e of this.manager.tooltipViews)e.dom.style.top=Er}},{eventObservers:{scroll(){this.maybeMeasure()}}}),Lr=Ds.baseTheme({".cm-tooltip":{zIndex:100,boxSizing:"border-box"},"&light .cm-tooltip":{border:"1px solid #bbb",backgroundColor:"#f5f5f5"},"&light .cm-tooltip-section:not(:first-child)":{borderTop:"1px solid #bbb"},"&dark .cm-tooltip":{backgroundColor:"#333338",color:"white"},".cm-tooltip-arrow":{height:"7px",width:"14px",position:"absolute",zIndex:-1,overflow:"hidden","&:before, &:after":{content:"''",position:"absolute",width:0,height:0,borderLeft:"7px solid transparent",borderRight:"7px solid transparent"},".cm-tooltip-above &":{bottom:"-7px","&:before":{borderTop:"7px solid #bbb"},"&:after":{borderTop:"7px solid #f5f5f5",bottom:"1px"}},".cm-tooltip-below &":{top:"-7px","&:before":{borderBottom:"7px solid #bbb"},"&:after":{borderBottom:"7px solid #f5f5f5",top:"1px"}}},"&dark .cm-tooltip .cm-tooltip-arrow":{"&:before":{borderTopColor:"#333338",borderBottomColor:"#333338"},"&:after":{borderTopColor:"transparent",borderBottomColor:"transparent"}}}),Nr={x:0,y:0},Br=q.define({enables:[qr,Lr]}),$r=q.define();class Qr{static create(e){return new Qr(e)}constructor(e){this.view=e,this.mounted=!1,this.dom=document.createElement("div"),this.dom.classList.add("cm-tooltip-hover"),this.manager=new Ar(e,$r,(e=>this.createHostedView(e)))}createHostedView(e){let t=e.create(this.view);return t.dom.classList.add("cm-tooltip-section"),this.dom.appendChild(t.dom),this.mounted&&t.mount&&t.mount(this.view),t}mount(e){for(let t of this.manager.tooltipViews)t.mount&&t.mount(e);this.mounted=!0}positioned(e){for(let t of this.manager.tooltipViews)t.positioned&&t.positioned(e)}update(e){this.manager.update(e)}destroy(){var e;for(let t of this.manager.tooltipViews)null===(e=t.destroy)||void 0===e||e.call(t)}passProp(e){let t;for(let i of this.manager.tooltipViews){let n=i[e];if(void 0!==n)if(void 0===t)t=n;else if(t!==n)return}return t}get offset(){return this.passProp("offset")}get getCoords(){return this.passProp("getCoords")}get overlap(){return this.passProp("overlap")}get resize(){return this.passProp("resize")}}const zr=Br.compute([$r],(e=>{let t=e.facet($r).filter((e=>e));return 0===t.length?null:{pos:Math.min(...t.map((e=>e.pos))),end:Math.max(...t.filter((e=>null!=e.end)).map((e=>e.end))),create:Qr.create,above:t[0].above,arrow:t.some((e=>e.arrow))}}));class jr{constructor(e,t,i,n,s){this.view=e,this.source=t,this.field=i,this.setHover=n,this.hoverTime=s,this.hoverTimeout=-1,this.restartTimeout=-1,this.pending=null,this.lastMove={x:0,y:0,target:e.dom,time:0},this.checkHover=this.checkHover.bind(this),e.dom.addEventListener("mouseleave",this.mouseleave=this.mouseleave.bind(this)),e.dom.addEventListener("mousemove",this.mousemove=this.mousemove.bind(this))}update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeout),this.restartTimeout=setTimeout((()=>this.startHover()),20))}get active(){return this.view.state.field(this.field)}checkHover(){if(this.hoverTimeout=-1,this.active)return;let e=Date.now()-this.lastMove.time;ei.bottom||t.xi.right+e.defaultCharacterWidth)return;let r=e.bidiSpans(e.state.doc.lineAt(n)).find((e=>e.from<=n&&e.to>=n)),o=r&&r.dir==Ri.RTL?-1:1;s=t.x{this.pending==t&&(this.pending=null,i&&e.dispatch({effects:this.setHover.of(i)}))}),(t=>mi(e.state,t,"hover tooltip")))}else r&&e.dispatch({effects:this.setHover.of(r)})}mousemove(e){var t;this.lastMove={x:e.clientX,y:e.clientY,target:e.target,time:Date.now()},this.hoverTimeout<0&&(this.hoverTimeout=setTimeout(this.checkHover,this.hoverTime));let i=this.active;if(i&&!Wr(this.lastMove.target)||this.pending){let{pos:n}=i||this.pending,s=null!==(t=null==i?void 0:i.end)&&void 0!==t?t:n;(n==s?this.view.posAtCoords(this.lastMove)==n:function(e,t,i,n,s,r){let o=e.scrollDOM.getBoundingClientRect(),a=e.documentTop+e.documentPadding.top+e.contentHeight;if(o.left>n||o.rights||Math.min(o.bottom,a)=t&&l<=i}(this.view,n,s,e.clientX,e.clientY))||(this.view.dispatch({effects:this.setHover.of(null)}),this.pending=null)}}mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1,this.active&&!Wr(e.relatedTarget)&&this.view.dispatch({effects:this.setHover.of(null)})}destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListener("mouseleave",this.mouseleave),this.view.dom.removeEventListener("mousemove",this.mousemove)}}function Wr(e){for(let t=e;t;t=t.parentNode)if(1==t.nodeType&&t.classList.contains("cm-tooltip"))return!0;return!1}function Vr(e,t={}){let i=ae.define(),n=j.define({create:()=>null,update(e,n){if(e&&(t.hideOnChange&&(n.docChanged||n.selection)||t.hideOn&&t.hideOn(n,e)))return null;if(e&&n.docChanged){let t=n.changes.mapPos(e.pos,-1,w.TrackDel);if(null==t)return null;let i=Object.assign(Object.create(null),e);i.pos=t,null!=e.end&&(i.end=n.changes.mapPos(e.end)),e=i}for(let t of n.effects)t.is(i)&&(e=t.value),t.is(Fr)&&(e=null);return e},provide:e=>$r.from(e)});return[n,bi.define((s=>new jr(s,e,n,i,t.hoverTime||300))),zr]}function Ur(e,t){let i=e.plugin(qr);if(!i)return null;let n=i.manager.tooltips.indexOf(t);return n<0?null:i.manager.tooltipViews[n]}const Fr=ae.define(),Hr=q.define({combine(e){let t,i;for(let n of e)t=t||n.topContainer,i=i||n.bottomContainer;return{topContainer:t,bottomContainer:i}}});function Xr(e,t){let i=e.plugin(Yr),n=i?i.specs.indexOf(t):-1;return n>-1?i.panels[n]:null}const Yr=bi.fromClass(class{constructor(e){this.input=e.state.facet(Kr),this.specs=this.input.filter((e=>e)),this.panels=this.specs.map((t=>t(e)));let t=e.state.facet(Hr);this.top=new Gr(e,!0,t.topContainer),this.bottom=new Gr(e,!1,t.bottomContainer),this.top.sync(this.panels.filter((e=>e.top))),this.bottom.sync(this.panels.filter((e=>!e.top)));for(let e of this.panels)e.dom.classList.add("cm-panel"),e.mount&&e.mount()}update(e){let t=e.state.facet(Hr);this.top.container!=t.topContainer&&(this.top.sync([]),this.top=new Gr(e.view,!0,t.topContainer)),this.bottom.container!=t.bottomContainer&&(this.bottom.sync([]),this.bottom=new Gr(e.view,!1,t.bottomContainer)),this.top.syncClasses(),this.bottom.syncClasses();let i=e.state.facet(Kr);if(i!=this.input){let t=i.filter((e=>e)),n=[],s=[],r=[],o=[];for(let i of t){let t,a=this.specs.indexOf(i);a<0?(t=i(e.view),o.push(t)):(t=this.panels[a],t.update&&t.update(e)),n.push(t),(t.top?s:r).push(t)}this.specs=t,this.panels=n,this.top.sync(s),this.bottom.sync(r);for(let e of o)e.dom.classList.add("cm-panel"),e.mount&&e.mount()}else for(let t of this.panels)t.update&&t.update(e)}destroy(){this.top.sync([]),this.bottom.sync([])}},{provide:e=>Ds.scrollMargins.of((t=>{let i=t.plugin(e);return i&&{top:i.top.scrollMargin(),bottom:i.bottom.scrollMargin()}}))});class Gr{constructor(e,t,i){this.view=e,this.top=t,this.container=i,this.dom=void 0,this.classes="",this.panels=[],this.syncClasses()}sync(e){for(let t of this.panels)t.destroy&&e.indexOf(t)<0&&t.destroy();this.panels=e,this.syncDOM()}syncDOM(){if(0==this.panels.length)return void(this.dom&&(this.dom.remove(),this.dom=void 0));if(!this.dom){this.dom=document.createElement("div"),this.dom.className=this.top?"cm-panels cm-panels-top":"cm-panels cm-panels-bottom",this.dom.style[this.top?"top":"bottom"]="0";let e=this.container||this.view.dom;e.insertBefore(this.dom,this.top?e.firstChild:null)}let e=this.dom.firstChild;for(let t of this.panels)if(t.dom.parentNode==this.dom){for(;e!=t.dom;)e=Zr(e);e=e.nextSibling}else this.dom.insertBefore(t.dom,e);for(;e;)e=Zr(e)}scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?this.dom.getBoundingClientRect().bottom-Math.max(0,this.view.scrollDOM.getBoundingClientRect().top):Math.min(innerHeight,this.view.scrollDOM.getBoundingClientRect().bottom)-this.dom.getBoundingClientRect().top)}syncClasses(){if(this.container&&this.classes!=this.view.themeClasses){for(let e of this.classes.split(" "))e&&this.container.classList.remove(e);for(let e of(this.classes=this.view.themeClasses).split(" "))e&&this.container.classList.add(e)}}}function Zr(e){let t=e.nextSibling;return e.remove(),t}const Kr=q.define({enables:Yr});class Jr extends _e{compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}eq(e){return!1}destroy(e){}}Jr.prototype.elementClass="",Jr.prototype.toDOM=void 0,Jr.prototype.mapMode=w.TrackBefore,Jr.prototype.startSide=Jr.prototype.endSide=-1,Jr.prototype.point=!0;const eo=q.define(),to={class:"",renderEmptyElements:!1,elementStyle:"",markers:()=>Se.empty,lineMarker:()=>null,widgetMarker:()=>null,lineMarkerChange:null,initialSpacer:null,updateSpacer:null,domEventHandlers:{}},io=q.define();function no(e){return[ro(),io.of(Object.assign(Object.assign({},to),e))]}const so=q.define({combine:e=>e.some((e=>e))});function ro(e){let t=[oo];return e&&!1===e.fixed&&t.push(so.of(!0)),t}const oo=bi.fromClass(class{constructor(e){this.view=e,this.prevViewport=e.viewport,this.dom=document.createElement("div"),this.dom.className="cm-gutters",this.dom.setAttribute("aria-hidden","true"),this.dom.style.minHeight=this.view.contentHeight/this.view.scaleY+"px",this.gutters=e.state.facet(io).map((t=>new co(e,t)));for(let e of this.gutters)this.dom.appendChild(e.dom);this.fixed=!e.state.facet(so),this.fixed&&(this.dom.style.position="sticky"),this.syncGutters(!1),e.scrollDOM.insertBefore(this.dom,e.contentDOM)}update(e){if(this.updateGutters(e)){let t=this.prevViewport,i=e.view.viewport,n=Math.min(t.to,i.to)-Math.max(t.from,i.from);this.syncGutters(n<.8*(i.to-i.from))}e.geometryChanged&&(this.dom.style.minHeight=this.view.contentHeight+"px"),this.view.state.facet(so)!=!this.fixed&&(this.fixed=!this.fixed,this.dom.style.position=this.fixed?"sticky":""),this.prevViewport=e.view.viewport}syncGutters(e){let t=this.dom.nextSibling;e&&this.dom.remove();let i=Se.iter(this.view.state.facet(eo),this.view.viewport.from),n=[],s=this.gutters.map((e=>new ho(e,this.view.viewport,-this.view.documentPadding.top)));for(let e of this.view.viewportLineBlocks)if(n.length&&(n=[]),Array.isArray(e.type)){let t=!0;for(let r of e.type)if(r.type==Xt.Text&&t){lo(i,n,r.from);for(let e of s)e.line(this.view,r,n);t=!1}else if(r.widget)for(let e of s)e.widget(this.view,r)}else if(e.type==Xt.Text){lo(i,n,e.from);for(let t of s)t.line(this.view,e,n)}else if(e.widget)for(let t of s)t.widget(this.view,e);for(let e of s)e.finish();e&&this.view.scrollDOM.insertBefore(this.dom,t)}updateGutters(e){let t=e.startState.facet(io),i=e.state.facet(io),n=e.docChanged||e.heightChanged||e.viewportChanged||!Se.eq(e.startState.facet(eo),e.state.facet(eo),e.view.viewport.from,e.view.viewport.to);if(t==i)for(let t of this.gutters)t.update(e)&&(n=!0);else{n=!0;let s=[];for(let n of i){let i=t.indexOf(n);i<0?s.push(new co(this.view,n)):(this.gutters[i].update(e),s.push(this.gutters[i]))}for(let e of this.gutters)e.dom.remove(),s.indexOf(e)<0&&e.destroy();for(let e of s)this.dom.appendChild(e.dom);this.gutters=s}return n}destroy(){for(let e of this.gutters)e.destroy();this.dom.remove()}},{provide:e=>Ds.scrollMargins.of((t=>{let i=t.plugin(e);return i&&0!=i.gutters.length&&i.fixed?t.textDirection==Ri.LTR?{left:i.dom.offsetWidth*t.scaleX}:{right:i.dom.offsetWidth*t.scaleX}:null}))});function ao(e){return Array.isArray(e)?e:[e]}function lo(e,t,i){for(;e.value&&e.from<=i;)e.from==i&&t.push(e.value),e.next()}class ho{constructor(e,t,i){this.gutter=e,this.height=i,this.i=0,this.cursor=Se.iter(e.markers,t.from)}addElement(e,t,i){let{gutter:n}=this,s=(t.top-this.height)/e.scaleY,r=t.height/e.scaleY;if(this.i==n.elements.length){let t=new uo(e,r,s,i);n.elements.push(t),n.dom.appendChild(t.dom)}else n.elements[this.i].update(e,r,s,i);this.height=t.bottom,this.i++}line(e,t,i){let n=[];lo(this.cursor,n,t.from),i.length&&(n=n.concat(i));let s=this.gutter.config.lineMarker(e,t,n);s&&n.unshift(s);let r=this.gutter;(0!=n.length||r.config.renderEmptyElements)&&this.addElement(e,t,n)}widget(e,t){let i=this.gutter.config.widgetMarker(e,t.widget,t);i&&this.addElement(e,t,[i])}finish(){let e=this.gutter;for(;e.elements.length>this.i;){let t=e.elements.pop();e.dom.removeChild(t.dom),t.destroy()}}}class co{constructor(e,t){this.view=e,this.config=t,this.elements=[],this.spacer=null,this.dom=document.createElement("div"),this.dom.className="cm-gutter"+(this.config.class?" "+this.config.class:"");for(let i in t.domEventHandlers)this.dom.addEventListener(i,(n=>{let s,r=n.target;if(r!=this.dom&&this.dom.contains(r)){for(;r.parentNode!=this.dom;)r=r.parentNode;let e=r.getBoundingClientRect();s=(e.top+e.bottom)/2}else s=n.clientY;let o=e.lineBlockAtHeight(s-e.documentTop);t.domEventHandlers[i](e,o,n)&&n.preventDefault()}));this.markers=ao(t.markers(e)),t.initialSpacer&&(this.spacer=new uo(e,0,0,[t.initialSpacer(e)]),this.dom.appendChild(this.spacer.dom),this.spacer.dom.style.cssText+="visibility: hidden; pointer-events: none")}update(e){let t=this.markers;if(this.markers=ao(this.config.markers(e.view)),this.spacer&&this.config.updateSpacer){let t=this.config.updateSpacer(this.spacer.markers[0],e);t!=this.spacer.markers[0]&&this.spacer.update(e.view,0,0,[t])}let i=e.view.viewport;return!Se.eq(this.markers,t,i.from,i.to)||!!this.config.lineMarkerChange&&this.config.lineMarkerChange(e)}destroy(){for(let e of this.elements)e.destroy()}}class uo{constructor(e,t,i,n){this.height=-1,this.above=0,this.markers=[],this.dom=document.createElement("div"),this.dom.className="cm-gutterElement",this.update(e,t,i,n)}update(e,t,i,n){this.height!=t&&(this.height=t,this.dom.style.height=t+"px"),this.above!=i&&(this.dom.style.marginTop=(this.above=i)?i+"px":""),function(e,t){if(e.length!=t.length)return!1;for(let i=0;ibe(e,{formatNumber:String,domEventHandlers:{}},{domEventHandlers(e,t){let i=Object.assign({},e);for(let e in t){let n=i[e],s=t[e];i[e]=n?(e,t,i)=>n(e,t,i)||s(e,t,i):s}return i}})});class mo extends Jr{constructor(e){super(),this.number=e}eq(e){return this.number==e.number}toDOM(){return document.createTextNode(this.number)}}function go(e,t){return e.state.facet(fo).formatNumber(t,e.state)}const vo=io.compute([fo],(e=>({class:"cm-lineNumbers",renderEmptyElements:!1,markers:e=>e.state.facet(po),lineMarker:(e,t,i)=>i.some((e=>e.toDOM))?null:new mo(go(e,e.state.doc.lineAt(t.from).number)),widgetMarker:()=>null,lineMarkerChange:e=>e.startState.facet(fo)!=e.state.facet(fo),initialSpacer:e=>new mo(go(e,bo(e.state.doc.lines))),updateSpacer(e,t){let i=go(t.view,bo(t.view.state.doc.lines));return i==e.number?e:new mo(i)},domEventHandlers:e.facet(fo).domEventHandlers})));function Oo(e={}){return[fo.of(e),ro(),vo]}function bo(e){let t=9;for(;t{let t=[],i=-1;for(let n of e.selection.ranges){let s=e.doc.lineAt(n.head).from;s>i&&(i=s,t.push(_o.range(s)))}return Se.of(t)})),wo=1024;let xo=0;class So{constructor(e,t){this.from=e,this.to=t}}class ko{constructor(e={}){this.id=xo++,this.perNode=!!e.perNode,this.deserialize=e.deserialize||(()=>{throw new Error("This node type doesn't define a deserialize function")})}add(e){if(this.perNode)throw new RangeError("Can't add per-node props to node types");return"function"!=typeof e&&(e=Po.match(e)),t=>{let i=e(t);return void 0===i?null:[this,i]}}}ko.closedBy=new ko({deserialize:e=>e.split(" ")}),ko.openedBy=new ko({deserialize:e=>e.split(" ")}),ko.group=new ko({deserialize:e=>e.split(" ")}),ko.contextHash=new ko({perNode:!0}),ko.lookAhead=new ko({perNode:!0}),ko.mounted=new ko({perNode:!0});class To{constructor(e,t,i){this.tree=e,this.overlay=t,this.parser=i}static get(e){return e&&e.props&&e.props[ko.mounted.id]}}const Co=Object.create(null);class Po{constructor(e,t,i,n=0){this.name=e,this.props=t,this.id=i,this.flags=n}static define(e){let t=e.props&&e.props.length?Object.create(null):Co,i=(e.top?1:0)|(e.skipped?2:0)|(e.error?4:0)|(null==e.name?8:0),n=new Po(e.name||"",t,e.id,i);if(e.props)for(let i of e.props)if(Array.isArray(i)||(i=i(n)),i){if(i[0].perNode)throw new RangeError("Can't store a per-node prop on a node type");t[i[0].id]=i[1]}return n}prop(e){return this.props[e.id]}get isTop(){return(1&this.flags)>0}get isSkipped(){return(2&this.flags)>0}get isError(){return(4&this.flags)>0}get isAnonymous(){return(8&this.flags)>0}is(e){if("string"==typeof e){if(this.name==e)return!0;let t=this.prop(ko.group);return!!t&&t.indexOf(e)>-1}return this.id==e}static match(e){let t=Object.create(null);for(let i in e)for(let n of i.split(" "))t[n]=e[i];return e=>{for(let i=e.prop(ko.group),n=-1;n<(i?i.length:0);n++){let s=t[n<0?e.name:i[n]];if(s)return s}}}}Po.none=new Po("",Object.create(null),0,8);class Mo{constructor(e){this.types=e;for(let t=0;t=t){let o=new $o(r.tree,r.overlay[0].from+e.from,0,null);(s||(s=[n])).push(No(o,t,i,!1))}}return s?Vo(s):n}(this,e,t)}iterate(e){let{enter:t,leave:i,from:n=0,to:s=this.length}=e,r=e.mode||0,o=(r&Ro.IncludeAnonymous)>0;for(let e=this.cursor(r|Ro.IncludeAnonymous);;){let r=!1;if(e.from<=s&&e.to>=n&&(!o&&e.type.isAnonymous||!1!==t(e))){if(e.firstChild())continue;r=!0}for(;r&&i&&(o||!e.type.isAnonymous)&&i(e),!e.nextSibling();){if(!e.parent())return;r=!0}}}prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.prop(e)}get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([+t,this.props[t]]);return e}balance(e={}){return this.children.length<=8?this:Go(Po.none,this.children,this.positions,0,this.children.length,0,this.length,((e,t,i)=>new Do(this.type,e,t,i,this.propValues)),e.makeTree||((e,t,i)=>new Do(Po.none,e,t,i)))}static build(e){return function(e){var t;let{buffer:i,nodeSet:n,maxBufferLength:s=wo,reused:r=[],minRepeatType:o=n.types.length}=e,a=Array.isArray(i)?new Io(i,i.length):i,l=n.types,h=0,c=0;function d(e,t,i,m,g){let{id:v,start:O,end:b,size:_}=a,y=c;for(;_<0;){if(a.next(),-1==_){let t=r[v];return i.push(t),void m.push(O-e)}if(-3==_)return void(h=v);if(-4==_)return void(c=v);throw new RangeError(`Unrecognized record size: ${_}`)}let w,x,S=l[v],k=O-e;if(b-O<=s&&(x=function(e,t){let i=a.fork(),n=0,r=0,l=0,h=i.end-s,c={size:0,start:0,skip:0};e:for(let s=i.pos-e;i.pos>s;){let e=i.size;if(i.id==t&&e>=0){c.size=n,c.start=r,c.skip=l,l+=4,n+=4,i.next();continue}let a=i.pos-e;if(e<0||a=o?4:0,u=i.start;for(i.next();i.pos>a;){if(i.size<0){if(-3!=i.size)break e;d+=4}else i.id>=o&&(d+=4);i.next()}r=u,n+=e,l+=d}return(t<0||n==e)&&(c.size=n,c.start=r,c.skip=l),c.size>4?c:void 0}(a.pos-t,g))){let t=new Uint16Array(x.size-x.skip),i=a.pos-x.size,s=t.length;for(;a.pos>i;)s=f(x.start,t,s);w=new qo(t,b-x.start,n),k=x.start-e}else{let e=a.pos-_;a.next();let t=[],i=[],n=v>=o?v:-1,r=0,l=b;for(;a.pos>e;)n>=0&&a.id==n&&a.size>=0?(a.end<=l-s&&(u(t,i,O,r,a.end,l,n,y),r=t.length,l=a.end),a.next()):d(O,e,t,i,n);if(n>=0&&r>0&&r-1&&r>0){let e=function(e){return(t,i,n)=>{let s,r,o=0,a=t.length-1;if(a>=0&&(s=t[a])instanceof Do){if(!a&&s.type==e&&s.length==n)return s;(r=s.prop(ko.lookAhead))&&(o=i[a]+s.length+r)}return p(e,t,i,n,o)}}(S);w=Go(S,t,i,0,t.length,0,b-O,e,e)}else w=p(S,t,i,b-O,y-b)}i.push(w),m.push(k)}function u(e,t,i,s,r,o,a,l){let h=[],c=[];for(;e.length>s;)h.push(e.pop()),c.push(t.pop()+i-r);e.push(p(n.types[a],h,c,o-r,l-o)),t.push(r-i)}function p(e,t,i,n,s=0,r){if(h){let e=[ko.contextHash,h];r=r?[e].concat(r):[e]}if(s>25){let e=[ko.lookAhead,s];r=r?[e].concat(r):[e]}return new Do(e,t,i,n,r)}function f(e,t,i){let{id:n,start:s,end:r,size:l}=a;if(a.next(),l>=0&&n4){let n=a.pos-(l-4);for(;a.pos>n;)i=f(e,t,i)}t[--i]=o,t[--i]=r-e,t[--i]=s-e,t[--i]=n}else-3==l?h=n:-4==l&&(c=n);return i}let m=[],g=[];for(;a.pos>0;)d(e.start||0,e.bufferStart||0,m,g,-1);let v=null!==(t=e.length)&&void 0!==t?t:m.length?g[0]+m[0].length:0;return new Do(l[e.topID],m.reverse(),g.reverse(),v)}(e)}}Do.empty=new Do(Po.none,[],[],0);class Io{constructor(e,t){this.buffer=e,this.index=t}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}get pos(){return this.index}next(){this.index-=4}fork(){return new Io(this.buffer,this.index)}}class qo{constructor(e,t,i){this.buffer=e,this.length=t,this.set=i}get type(){return Po.none}toString(){let e=[];for(let t=0;t0));a=r[a+3]);return o}slice(e,t,i){let n=this.buffer,s=new Uint16Array(t-e),r=0;for(let o=e,a=0;o=t&&it;case 1:return i<=t&&n>t;case 2:return n>t;case 4:return!0}}function No(e,t,i,n){for(var s;e.from==e.to||(i<1?e.from>=t:e.from>t)||(i>-1?e.to<=t:e.to0?o.length:-1;e!=l;e+=t){let l=o[e],h=a[e]+r.from;if(Lo(n,i,h,h+l.length))if(l instanceof qo){if(s&Ro.ExcludeBuffers)continue;let o=l.findChild(0,l.buffer.length,t,i-h,n);if(o>-1)return new Wo(new jo(r,l,e,h),null,o)}else if(s&Ro.IncludeAnonymous||!l.type.isAnonymous||Ho(l)){let o;if(!(s&Ro.IgnoreMounts)&&(o=To.get(l))&&!o.overlay)return new $o(o.tree,h,e,r);let a=new $o(l,h,e,r);return s&Ro.IncludeAnonymous||!a.type.isAnonymous?a:a.nextChild(t<0?l.children.length-1:0,t,i,n)}}if(s&Ro.IncludeAnonymous||!r.type.isAnonymous)return null;if(e=r.index>=0?r.index+t:t<0?-1:r._parent._tree.children.length,r=r._parent,!r)return null}}get firstChild(){return this.nextChild(0,1,0,4)}get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}childAfter(e){return this.nextChild(0,1,e,2)}childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}enter(e,t,i=0){let n;if(!(i&Ro.IgnoreOverlays)&&(n=To.get(this._tree))&&n.overlay){let i=e-this.from;for(let{from:e,to:s}of n.overlay)if((t>0?e<=i:e=i:s>i))return new $o(n.tree,n.overlay[0].from+this.from,-1,this)}return this.nextChild(0,1,e,t,i)}nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e=e._parent;return e}get parent(){return this._parent?this._parent.nextSignificantParent():null}get nextSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index+1,1,0,4):null}get prevSibling(){return this._parent&&this.index>=0?this._parent.nextChild(this.index-1,-1,0,4):null}get tree(){return this._tree}toTree(){return this._tree}toString(){return this._tree.toString()}}function Qo(e,t,i,n){let s=e.cursor(),r=[];if(!s.firstChild())return r;if(null!=i)for(;!s.type.is(i);)if(!s.nextSibling())return r;for(;;){if(null!=n&&s.type.is(n))return r;if(s.type.is(t)&&r.push(s.node),!s.nextSibling())return null==n?r:[]}}function zo(e,t,i=t.length-1){for(let n=e.parent;i>=0;n=n.parent){if(!n)return!1;if(!n.type.isAnonymous){if(t[i]&&t[i]!=n.name)return!1;i--}}return!0}class jo{constructor(e,t,i,n){this.parent=e,this.buffer=t,this.index=i,this.start=n}}class Wo extends Bo{get name(){return this.type.name}get from(){return this.context.start+this.context.buffer.buffer[this.index+1]}get to(){return this.context.start+this.context.buffer.buffer[this.index+2]}constructor(e,t,i){super(),this.context=e,this._parent=t,this.index=i,this.type=e.buffer.set.types[e.buffer.buffer[i]]}child(e,t,i){let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],e,t-this.context.start,i);return s<0?null:new Wo(this.context,this,s)}get firstChild(){return this.child(1,0,4)}get lastChild(){return this.child(-1,0,4)}childAfter(e){return this.child(1,e,2)}childBefore(e){return this.child(-1,e,-2)}enter(e,t,i=0){if(i&Ro.ExcludeBuffers)return null;let{buffer:n}=this.context,s=n.findChild(this.index+4,n.buffer[this.index+3],t>0?1:-1,e-this.context.start,t);return s<0?null:new Wo(this.context,this,s)}get parent(){return this._parent||this.context.parent.nextSignificantParent()}externalSibling(e){return this._parent?null:this.context.parent.nextChild(this.context.index+e,e,0,4)}get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];return t<(this._parent?e.buffer[this._parent.index+3]:e.buffer.length)?new Wo(this.context,this._parent,t):this.externalSibling(1)}get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent.index+4:0;return this.index==t?this.externalSibling(-1):new Wo(this.context,this._parent,e.findChild(t,this.index,-1,0,4))}get tree(){return null}toTree(){let e=[],t=[],{buffer:i}=this.context,n=this.index+4,s=i.buffer[this.index+3];if(s>n){let r=i.buffer[this.index+1];e.push(i.slice(n,s,r)),t.push(0)}return new Do(this.type,e,t,this.to-this.from)}toString(){return this.context.buffer.childString(this.index)}}function Vo(e){if(!e.length)return null;if(1==e.length)return e[0];let t=0,i=e[0];for(let n=1;ni.from||s.to0){if(this.index-1)for(let n=t+e,s=e<0?-1:i._tree.children.length;n!=s;n+=e){let e=i._tree.children[n];if(this.mode&Ro.IncludeAnonymous||e instanceof qo||!e.type.isAnonymous||Ho(e))return!1}return!0}move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(e))return!0;if(this.atLastNode(e)||!this.parent())return!1}}next(e=!0){return this.move(1,e)}prev(e=!0){return this.move(-1,e)}moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||(t>-1?this.to<=e:this.to=0;){for(let r=e;r;r=r._parent)if(r.index==n){if(n==this.index)return r;t=r,i=s+1;break e}n=this.stack[--s]}for(let e=i;e=0;s--){if(s<0)return zo(this.node,e,n);let r=i[t.buffer[this.stack[s]]];if(!r.isAnonymous){if(e[n]&&e[n]!=r.name)return!1;n--}}return!0}}function Ho(e){return e.children.some((e=>e instanceof qo||!e.type.isAnonymous||Ho(e)))}const Xo=new WeakMap;function Yo(e,t){if(!e.isAnonymous||t instanceof qo||t.type!=e)return 1;let i=Xo.get(t);if(null==i){i=1;for(let n of t.children){if(n.type!=e||!(n instanceof Do)){i=1;break}i+=Yo(e,n)}Xo.set(t,i)}return i}function Go(e,t,i,n,s,r,o,a,l){let h=0;for(let i=n;i=c)break;f+=t}if(h==s+1){if(f>c){let e=i[s];t(e.children,e.positions,0,e.children.length,n[s]+a);continue}d.push(i[s])}else{let t=n[h-1]+i[h-1].length-p;d.push(Go(e,i,n,s,h,p,t,null,l))}u.push(p+a-r)}}(t,i,n,s,0),(a||l)(d,u,o)}class Zo{constructor(){this.map=new WeakMap}setBuffer(e,t,i){let n=this.map.get(e);n||this.map.set(e,n=new Map),n.set(t,i)}getBuffer(e,t){let i=this.map.get(e);return i&&i.get(t)}set(e,t){e instanceof Wo?this.setBuffer(e.context.buffer,e.index,t):e instanceof $o&&this.map.set(e.tree,t)}get(e){return e instanceof Wo?this.getBuffer(e.context.buffer,e.index):e instanceof $o?this.map.get(e.tree):void 0}cursorSet(e,t){e.buffer?this.setBuffer(e.buffer.buffer,e.index,t):this.map.set(e.tree,t)}cursorGet(e){return e.buffer?this.getBuffer(e.buffer.buffer,e.index):this.map.get(e.tree)}}class Ko{constructor(e,t,i,n,s=!1,r=!1){this.from=e,this.to=t,this.tree=i,this.offset=n,this.open=(s?1:0)|(r?2:0)}get openStart(){return(1&this.open)>0}get openEnd(){return(2&this.open)>0}static addTree(e,t=[],i=!1){let n=[new Ko(0,e.length,e,0,!1,i)];for(let i of t)i.to>e.length&&n.push(i);return n}static applyChanges(e,t,i=128){if(!t.length)return e;let n=[],s=1,r=e.length?e[0]:null;for(let o=0,a=0,l=0;;o++){let h=o=i)for(;r&&r.from=t.from||c<=t.to||l){let e=Math.max(t.from,a)-l,i=Math.min(t.to,c)-l;t=e>=i?null:new Ko(e,i,t.tree,t.offset+l,o>0,!!h)}if(t&&n.push(t),r.to>c)break;r=snew So(e.from,e.to))):[new So(0,0)]:[new So(0,e.length)],this.createParse(e,t||[],i)}parse(e,t,i){let n=this.startParse(e,t,i);for(;;){let e=n.advance();if(e)return e}}}class ea{constructor(e){this.string=e}get length(){return this.string.length}chunk(e){return this.string.slice(e)}get lineChunks(){return!1}read(e,t){return this.string.slice(e,t)}}new ko({perNode:!0});let ta=0;class ia{constructor(e,t,i){this.set=e,this.base=t,this.modified=i,this.id=ta++}static define(e){if(null==e?void 0:e.base)throw new Error("Can not derive from a modified tag");let t=new ia([],null,[]);if(t.set.push(t),e)for(let i of e.set)t.set.push(i);return t}static defineModifier(){let e=new sa;return t=>t.modified.indexOf(e)>-1?t:sa.get(t.base||t,t.modified.concat(e).sort(((e,t)=>e.id-t.id)))}}let na=0;class sa{constructor(){this.instances=[],this.id=na++}static get(e,t){if(!t.length)return e;let i=t[0].instances.find((i=>{return i.base==e&&(n=t,s=i.modified,n.length==s.length&&n.every(((e,t)=>e==s[t])));var n,s}));if(i)return i;let n=[],s=new ia(n,e,t);for(let e of t)e.instances.push(s);let r=function(e){let t=[[]];for(let i=0;it.length-e.length))}(t);for(let t of e.set)if(!t.modified.length)for(let e of r)n.push(sa.get(t,e));return s}}function ra(e){let t=Object.create(null);for(let i in e){let n=e[i];Array.isArray(n)||(n=[n]);for(let e of i.split(" "))if(e){let i=[],s=2,r=e;for(let t=0;;){if("..."==r&&t>0&&t+3==e.length){s=1;break}let n=/^"(?:[^"\\]|\\.)*?"|[^\/!]+/.exec(r);if(!n)throw new RangeError("Invalid path: "+e);if(i.push("*"==n[0]?"":'"'==n[0][0]?JSON.parse(n[0]):n[0]),t+=n[0].length,t==e.length)break;let o=e[t++];if(t==e.length&&"!"==o){s=0;break}if("/"!=o)throw new RangeError("Invalid path: "+e);r=e.slice(t)}let o=i.length-1,a=i[o];if(!a)throw new RangeError("Invalid path: "+e);let l=new aa(n,s,o>0?i.slice(0,o):null);t[a]=l.sort(t[a])}}return oa.add(t)}const oa=new ko;class aa{constructor(e,t,i,n){this.tags=e,this.mode=t,this.context=i,this.next=n}get opaque(){return 0==this.mode}get inherit(){return 1==this.mode}sort(e){return!e||e.depth{let t=s;for(let n of e)for(let e of n.set){let n=i[e.id];if(n){t=t?t+" "+n:n;break}}return t},scope:n}}function ha(e,t,i,n=0,s=e.length){let r=new ca(n,Array.isArray(t)?t:[t],i);r.highlightRange(e.cursor(),n,s,"",r.highlighters),r.flush(s)}aa.empty=new aa([],2,null);class ca{constructor(e,t,i){this.at=e,this.highlighters=t,this.span=i,this.class=""}startSpan(e,t){t!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this.class=t)}flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}highlightRange(e,t,i,n,s){let{type:r,from:o,to:a}=e;if(o>=i||a<=t)return;r.isTop&&(s=this.highlighters.filter((e=>!e.scope||e.scope(r))));let l=n,h=function(e){let t=e.type.prop(oa);for(;t&&t.context&&!e.matchContext(t.context);)t=t.next;return t||null}(e)||aa.empty,c=function(e,t){let i=null;for(let n of e){let e=n.style(t);e&&(i=i?i+" "+e:e)}return i}(s,h.tags);if(c&&(l&&(l+=" "),l+=c,1==h.mode&&(n+=(n?" ":"")+c)),this.startSpan(Math.max(t,o),l),h.opaque)return;let d=e.tree&&e.tree.prop(ko.mounted);if(d&&d.overlay){let r=e.node.enter(d.overlay[0].from+o,1),h=this.highlighters.filter((e=>!e.scope||e.scope(d.tree.type))),c=e.firstChild();for(let u=0,p=o;;u++){let f=u=m)&&e.nextSibling()););if(!f||m>i)break;p=f.to+o,p>t&&(this.highlightRange(r.cursor(),Math.max(t,f.from+o),Math.min(i,p),"",h),this.startSpan(Math.min(i,p),l))}c&&e.parent()}else if(e.firstChild()){d&&(n="");do{if(!(e.to<=t)){if(e.from>=i)break;this.highlightRange(e,t,i,n,s),this.startSpan(Math.min(i,e.to),l)}}while(e.nextSibling());e.parent()}}}const da=ia.define,ua=da(),pa=da(),fa=da(pa),ma=da(pa),ga=da(),va=da(ga),Oa=da(ga),ba=da(),_a=da(ba),ya=da(),wa=da(),xa=da(),Sa=da(xa),ka=da(),Ta={comment:ua,lineComment:da(ua),blockComment:da(ua),docComment:da(ua),name:pa,variableName:da(pa),typeName:fa,tagName:da(fa),propertyName:ma,attributeName:da(ma),className:da(pa),labelName:da(pa),namespace:da(pa),macroName:da(pa),literal:ga,string:va,docString:da(va),character:da(va),attributeValue:da(va),number:Oa,integer:da(Oa),float:da(Oa),bool:da(ga),regexp:da(ga),escape:da(ga),color:da(ga),url:da(ga),keyword:ya,self:da(ya),null:da(ya),atom:da(ya),unit:da(ya),modifier:da(ya),operatorKeyword:da(ya),controlKeyword:da(ya),definitionKeyword:da(ya),moduleKeyword:da(ya),operator:wa,derefOperator:da(wa),arithmeticOperator:da(wa),logicOperator:da(wa),bitwiseOperator:da(wa),compareOperator:da(wa),updateOperator:da(wa),definitionOperator:da(wa),typeOperator:da(wa),controlOperator:da(wa),punctuation:xa,separator:da(xa),bracket:Sa,angleBracket:da(Sa),squareBracket:da(Sa),paren:da(Sa),brace:da(Sa),content:ba,heading:_a,heading1:da(_a),heading2:da(_a),heading3:da(_a),heading4:da(_a),heading5:da(_a),heading6:da(_a),contentSeparator:da(ba),list:da(ba),quote:da(ba),emphasis:da(ba),strong:da(ba),link:da(ba),monospace:da(ba),strikethrough:da(ba),inserted:da(),deleted:da(),changed:da(),invalid:da(),meta:ka,documentMeta:da(ka),annotation:da(ka),processingInstruction:da(ka),definition:ia.defineModifier(),constant:ia.defineModifier(),function:ia.defineModifier(),standard:ia.defineModifier(),local:ia.defineModifier(),special:ia.defineModifier()};var Ca;la([{tag:Ta.link,class:"tok-link"},{tag:Ta.heading,class:"tok-heading"},{tag:Ta.emphasis,class:"tok-emphasis"},{tag:Ta.strong,class:"tok-strong"},{tag:Ta.keyword,class:"tok-keyword"},{tag:Ta.atom,class:"tok-atom"},{tag:Ta.bool,class:"tok-bool"},{tag:Ta.url,class:"tok-url"},{tag:Ta.labelName,class:"tok-labelName"},{tag:Ta.inserted,class:"tok-inserted"},{tag:Ta.deleted,class:"tok-deleted"},{tag:Ta.literal,class:"tok-literal"},{tag:Ta.string,class:"tok-string"},{tag:Ta.number,class:"tok-number"},{tag:[Ta.regexp,Ta.escape,Ta.special(Ta.string)],class:"tok-string2"},{tag:Ta.variableName,class:"tok-variableName"},{tag:Ta.local(Ta.variableName),class:"tok-variableName tok-local"},{tag:Ta.definition(Ta.variableName),class:"tok-variableName tok-definition"},{tag:Ta.special(Ta.variableName),class:"tok-variableName2"},{tag:Ta.definition(Ta.propertyName),class:"tok-propertyName tok-definition"},{tag:Ta.typeName,class:"tok-typeName"},{tag:Ta.namespace,class:"tok-namespace"},{tag:Ta.className,class:"tok-className"},{tag:Ta.macroName,class:"tok-macroName"},{tag:Ta.propertyName,class:"tok-propertyName"},{tag:Ta.operator,class:"tok-operator"},{tag:Ta.comment,class:"tok-comment"},{tag:Ta.meta,class:"tok-meta"},{tag:Ta.invalid,class:"tok-invalid"},{tag:Ta.punctuation,class:"tok-punctuation"}]);const Pa=new ko;const Ma=new ko;class Ea{constructor(e,t,i=[],n=""){this.data=e,this.name=n,Oe.prototype.hasOwnProperty("tree")||Object.defineProperty(Oe.prototype,"tree",{get(){return Da(this)}}),this.parser=t,this.extension=[ja.of(this),Oe.languageData.of(((e,t,i)=>{let n=Aa(e,t,i),s=n.type.prop(Pa);if(!s)return[];let r=e.facet(s),o=n.type.prop(Ma);if(o){let s=n.resolve(t-n.from,i);for(let t of o)if(t.test(s,e)){let i=e.facet(t.facet);return"replace"==t.type?i:i.concat(r)}}return r}))].concat(i)}isActiveAt(e,t,i=-1){return Aa(e,t,i).type.prop(Pa)==this.data}findRegions(e){let t=e.facet(ja);if((null==t?void 0:t.data)==this.data)return[{from:0,to:e.doc.length}];if(!t||!t.allowsNesting)return[];let i=[],n=(e,t)=>{if(e.prop(Pa)==this.data)return void i.push({from:t,to:t+e.length});let s=e.prop(ko.mounted);if(s){if(s.tree.prop(Pa)==this.data){if(s.overlay)for(let e of s.overlay)i.push({from:e.from+t,to:e.to+t});else i.push({from:t,to:t+e.length});return}if(s.overlay){let e=i.length;if(n(s.tree,s.overlay[0].from+t),i.length>e)return}}for(let i=0;ie.concat(i):void 0}));var i;return new Ra(t,e.parser.configure({props:[Pa.add((e=>e.isTop?t:void 0))]}),e.name)}configure(e,t){return new Ra(this.data,this.parser.configure(e),t||this.name)}get allowsNesting(){return this.parser.hasWrappers()}}function Da(e){let t=e.field(Ea.state,!1);return t?t.tree:Do.empty}class Ia{constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e.iter()}get length(){return this.doc.length}syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,this.cursorPos=e+this.string.length,this.cursorPos-this.string.length}chunk(e){return this.syncTo(e),this.string}get lineChunks(){return!0}read(e,t){let i=this.cursorPos-this.string.length;return e=this.cursorPos?this.doc.sliceString(e,t):this.string.slice(e-i,t-i)}}let qa=null;class La{constructor(e,t,i=[],n,s,r,o,a){this.parser=e,this.state=t,this.fragments=i,this.tree=n,this.treeLen=s,this.viewport=r,this.skipped=o,this.scheduleOn=a,this.parse=null,this.tempSkipped=[]}static create(e,t,i){return new La(e,t,[],Do.empty,0,i,[],null)}startParse(){return this.parser.startParse(new Ia(this.state.doc),this.fragments)}work(e,t){return null!=t&&t>=this.state.doc.length&&(t=void 0),this.tree!=Do.empty&&this.isDone(null!=t?t:this.state.doc.length)?(this.takeTree(),!0):this.withContext((()=>{var i;if("number"==typeof e){let t=Date.now()+e;e=()=>Date.now()>t}for(this.parse||(this.parse=this.startParse()),null!=t&&(null==this.parse.stoppedAt||this.parse.stoppedAt>t)&&t=this.treeLen&&((null==this.parse.stoppedAt||this.parse.stoppedAt>e)&&this.parse.stopAt(e),this.withContext((()=>{for(;!(t=this.parse.advance()););})),this.treeLen=e,this.tree=t,this.fragments=this.withoutTempSkipped(Ko.addTree(this.tree,this.fragments,!0)),this.parse=null)}withContext(e){let t=qa;qa=this;try{return e()}finally{qa=t}}withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=Na(e,t.from,t.to);return e}changes(e,t){let{fragments:i,tree:n,treeLen:s,viewport:r,skipped:o}=this;if(this.takeTree(),!e.empty){let t=[];if(e.iterChangedRanges(((e,i,n,s)=>t.push({fromA:e,toA:i,fromB:n,toB:s}))),i=Ko.applyChanges(i,t),n=Do.empty,s=0,r={from:e.mapPos(r.from,-1),to:e.mapPos(r.to,1)},this.skipped.length){o=[];for(let t of this.skipped){let i=e.mapPos(t.from,1),n=e.mapPos(t.to,-1);ie.from&&(this.fragments=Na(this.fragments,i,n),this.skipped.splice(t--,1))}return!(this.skipped.length>=t||(this.reset(),0))}reset(){this.parse&&(this.takeTree(),this.parse=null)}skipUntilInView(e,t){this.skipped.push({from:e,to:t})}static getSkippingParser(e){return new class extends Jo{createParse(t,i,n){let s=n[0].from,r=n[n.length-1].to;return{parsedPos:s,advance(){let t=qa;if(t){for(let e of n)t.tempSkipped.push(e);e&&(t.scheduleOn=t.scheduleOn?Promise.all([t.scheduleOn,e]):e)}return this.parsedPos=r,new Do(Po.none,[],[],r-s)},stoppedAt:null,stopAt(){}}}}}isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;return this.treeLen>=e&&t.length&&0==t[0].from&&t[0].to>=e}static get(){return qa}}function Na(e,t,i){return Ko.applyChanges(e,[{fromA:t,toA:i,fromB:t,toB:i}])}class Ba{constructor(e){this.context=e,this.tree=e.tree}apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let t=this.context.changes(e.changes,e.state),i=this.context.treeLen==e.startState.doc.length?void 0:Math.max(e.changes.mapPos(this.context.treeLen),t.viewport.to);return t.work(20,i)||t.takeTree(),new Ba(t)}static init(e){let t=Math.min(3e3,e.doc.length),i=La.create(e.facet(ja).parser,e,{from:0,to:t});return i.work(20,t)||i.takeTree(),new Ba(i)}}Ea.state=j.define({create:Ba.init,update(e,t){for(let e of t.effects)if(e.is(Ea.setState))return e.value;return t.startState.facet(ja)!=t.state.facet(ja)?Ba.init(t.state):e.apply(t)}});let $a=e=>{let t=setTimeout((()=>e()),500);return()=>clearTimeout(t)};"undefined"!=typeof requestIdleCallback&&($a=e=>{let t=-1,i=setTimeout((()=>{t=requestIdleCallback(e,{timeout:400})}),100);return()=>t<0?clearTimeout(i):cancelIdleCallback(t)});const Qa="undefined"!=typeof navigator&&(null===(Ca=navigator.scheduling)||void 0===Ca?void 0:Ca.isInputPending)?()=>navigator.scheduling.isInputPending():null,za=bi.fromClass(class{constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.chunkEnd=-1,this.chunkBudget=-1,this.work=this.work.bind(this),this.scheduleWork()}update(e){let t=this.view.state.field(Ea.state).context;(t.updateViewport(e.view.viewport)||this.view.viewport.to>t.treeLen)&&this.scheduleWork(),(e.docChanged||e.selectionSet)&&(this.view.hasFocus&&(this.chunkBudget+=50),this.scheduleWork()),this.checkAsyncSchedule(t)}scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(Ea.state);t.tree==t.context.tree&&t.context.isDone(e.doc.length)||(this.working=$a(this.work))}work(e){this.working=null;let t=Date.now();if(this.chunkEndn+1e3,a=s.context.work((()=>Qa&&Qa()||Date.now()>r),n+(o?0:1e5));this.chunkBudget-=Date.now()-t,(a||this.chunkBudget<=0)&&(s.context.takeTree(),this.view.dispatch({effects:Ea.setState.of(new Ba(s.context))})),this.chunkBudget>0&&(!a||o)&&this.scheduleWork(),this.checkAsyncSchedule(s.context)}checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.then((()=>this.scheduleWork())).catch((e=>mi(this.view.state,e))).then((()=>this.workScheduled--)),e.scheduleOn=null)}destroy(){this.working&&this.working()}isWorking(){return!!(this.working||this.workScheduled>0)}},{eventHandlers:{focus(){this.scheduleWork()}}}),ja=q.define({combine:e=>e.length?e[0]:null,enables:e=>[Ea.state,za,Ds.contentAttributes.compute([e],(t=>{let i=t.facet(e);return i&&i.name?{"data-language":i.name}:{}}))]});class Wa{constructor(e,t=[]){this.language=e,this.support=t,this.extension=[e,t]}}const Va=q.define(),Ua=q.define({combine:e=>{if(!e.length)return" ";let t=e[0];if(!t||/\S/.test(t)||Array.from(t).some((e=>e!=t[0])))throw new Error("Invalid indent unit: "+JSON.stringify(e[0]));return t}});function Fa(e){let t=e.facet(Ua);return 9==t.charCodeAt(0)?e.tabSize*t.length:t.length}function Ha(e,t){let i="",n=e.tabSize,s=e.facet(Ua)[0];if("\t"==s){for(;t>=n;)i+="\t",t-=n;s=" "}for(let e=0;e=t?function(e,t,i){let n=t.resolveStack(i),s=n.node.enterUnfinishedNodesBefore(i);if(s!=n.node){let e=[];for(let t=s;t!=n.node;t=t.parent)e.push(t);for(let t=e.length-1;t>=0;t--)n={node:e[t],next:n}}return Za(n,e,i)}(e,i,t):null}class Ya{constructor(e,t={}){this.state=e,this.options=t,this.unit=Fa(e)}lineAt(e,t=1){let i=this.state.doc.lineAt(e),{simulateBreak:n,simulateDoubleBreak:s}=this.options;return null!=n&&n>=i.from&&n<=i.to?s&&n==e?{text:"",from:e}:(t<0?n-1&&(s+=r-this.countColumn(i,i.search(/\S|$/))),s}countColumn(e,t=e.length){return Le(e,this.state.tabSize,t)}lineIndent(e,t=1){let{text:i,from:n}=this.lineAt(e,t),s=this.options.overrideIndentation;if(s){let e=s(n);if(e>-1)return e}return this.countColumn(i,i.search(/\S|$/))}get simulatedBreak(){return this.options.simulateBreak||null}}const Ga=new ko;function Za(e,t,i){for(let n=e;n;n=n.next){let e=Ka(n.node);if(e)return e(el.create(t,i,n))}return 0}function Ka(e){let t=e.type.prop(Ga);if(t)return t;let i,n=e.firstChild;if(n&&(i=n.type.prop(ko.closedBy))){let t=e.lastChild,n=t&&i.indexOf(t.name)>-1;return e=>nl(e,!0,1,void 0,n&&!function(e){return e.pos==e.options.simulateBreak&&e.options.simulateDoubleBreak}(e)?t.from:void 0)}return null==e.parent?Ja:null}function Ja(){return 0}class el extends Ya{constructor(e,t,i){super(e.state,e.options),this.base=e,this.pos=t,this.context=i}get node(){return this.context.node}static create(e,t,i){return new el(e,t,i)}get textAfter(){return this.textAfterPos(this.pos)}get baseIndent(){return this.baseIndentFor(this.node)}baseIndentFor(e){let t=this.state.doc.lineAt(e.from);for(;;){let i=e.resolve(t.from);for(;i.parent&&i.parent.from==i.from;)i=i.parent;if(tl(i,e))break;t=this.state.doc.lineAt(i.from)}return this.lineIndent(t.from)}continue(){return Za(this.context.next,this.base,this.pos)}}function tl(e,t){for(let i=t;i;i=i.parent)if(e==i)return!0;return!1}function il({closing:e,align:t=!0,units:i=1}){return n=>nl(n,t,i,e)}function nl(e,t,i,n,s){let r=e.textAfter,o=r.match(/^\s*/)[0].length,a=n&&r.slice(o,o+n.length)==n||s==e.pos+o,l=t?function(e){let t=e.node,i=t.childAfter(t.from),n=t.lastChild;if(!i)return null;let s=e.options.simulateBreak,r=e.state.doc.lineAt(i.from),o=null==s||s<=r.from?r.to:Math.min(r.to,s);for(let e=i.to;;){let s=t.childAfter(e);if(!s||s==n)return null;if(!s.type.isSkipped)return s.fromi)continue;if(s&&o.from=t&&n.to>i&&(s=n)}}return s}(e,t,i)}function ll(e,t){let i=t.mapPos(e.from,1),n=t.mapPos(e.to,-1);return i>=n?void 0:{from:i,to:n}}const hl=ae.define({map:ll}),cl=ae.define({map:ll});function dl(e){let t=[];for(let{head:i}of e.state.selection.ranges)t.some((e=>e.from<=i&&e.to>=i))||t.push(e.lineBlockAt(i));return t}const ul=j.define({create:()=>Yt.none,update(e,t){e=e.map(t.changes);for(let i of t.effects)if(i.is(hl)&&!fl(e,i.value.from,i.value.to)){let{preparePlaceholder:n}=t.state.facet(bl),s=n?Yt.replace({widget:new xl(n(t.state,i.value))}):wl;e=e.update({add:[s.range(i.value.from,i.value.to)]})}else i.is(cl)&&(e=e.update({filter:(e,t)=>i.value.from!=e||i.value.to!=t,filterFrom:i.value.from,filterTo:i.value.to}));if(t.selection){let i=!1,{head:n}=t.selection.main;e.between(n,n,((e,t)=>{en&&(i=!0)})),i&&(e=e.update({filterFrom:n,filterTo:n,filter:(e,t)=>t<=n||e>=n}))}return e},provide:e=>Ds.decorations.from(e),toJSON(e,t){let i=[];return e.between(0,t.doc.length,((e,t)=>{i.push(e,t)})),i},fromJSON(e){if(!Array.isArray(e)||e.length%2)throw new RangeError("Invalid JSON for fold state");let t=[];for(let i=0;i{(!s||s.from>e)&&(s={from:e,to:t})})),s}function fl(e,t,i){let n=!1;return e.between(t,t,((e,s)=>{e==t&&s==i&&(n=!0)})),n}function ml(e,t){return e.field(ul,!1)?t:t.concat(ae.appendConfig.of(_l()))}function gl(e,t,i=!0){let n=e.state.doc.lineAt(t.from).number,s=e.state.doc.lineAt(t.to).number;return Ds.announce.of(`${e.state.phrase(i?"Folded lines":"Unfolded lines")} ${n} ${e.state.phrase("to")} ${s}.`)}const vl=[{key:"Ctrl-Shift-[",mac:"Cmd-Alt-[",run:e=>{for(let t of dl(e)){let i=al(e.state,t.from,t.to);if(i)return e.dispatch({effects:ml(e.state,[hl.of(i),gl(e,i)])}),!0}return!1}},{key:"Ctrl-Shift-]",mac:"Cmd-Alt-]",run:e=>{if(!e.state.field(ul,!1))return!1;let t=[];for(let i of dl(e)){let n=pl(e.state,i.from,i.to);n&&t.push(cl.of(n),gl(e,n,!1))}return t.length&&e.dispatch({effects:t}),t.length>0}},{key:"Ctrl-Alt-[",run:e=>{let{state:t}=e,i=[];for(let n=0;n{let t=e.state.field(ul,!1);if(!t||!t.size)return!1;let i=[];return t.between(0,e.state.doc.length,((e,t)=>{i.push(cl.of({from:e,to:t}))})),e.dispatch({effects:i}),!0}}],Ol={placeholderDOM:null,preparePlaceholder:null,placeholderText:"โ€ฆ"},bl=q.define({combine:e=>be(e,Ol)});function _l(e){let t=[ul,Cl];return e&&t.push(bl.of(e)),t}function yl(e,t){let{state:i}=e,n=i.facet(bl),s=t=>{let i=e.lineBlockAt(e.posAtDOM(t.target)),n=pl(e.state,i.from,i.to);n&&e.dispatch({effects:cl.of(n)}),t.preventDefault()};if(n.placeholderDOM)return n.placeholderDOM(e,s,t);let r=document.createElement("span");return r.textContent=n.placeholderText,r.setAttribute("aria-label",i.phrase("folded code")),r.title=i.phrase("unfold"),r.className="cm-foldPlaceholder",r.onclick=s,r}const wl=Yt.replace({widget:new class extends Ht{toDOM(e){return yl(e,null)}}});class xl extends Ht{constructor(e){super(),this.value=e}eq(e){return this.value==e.value}toDOM(e){return yl(e,this.value)}}const Sl={openText:"โŒ„",closedText:"โ€บ",markerDOM:null,domEventHandlers:{},foldingChanged:()=>!1};class kl extends Jr{constructor(e,t){super(),this.config=e,this.open=t}eq(e){return this.config==e.config&&this.open==e.open}toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open);let t=document.createElement("span");return t.textContent=this.open?this.config.openText:this.config.closedText,t.title=e.state.phrase(this.open?"Fold line":"Unfold line"),t}}function Tl(e={}){let t=Object.assign(Object.assign({},Sl),e),i=new kl(t,!0),n=new kl(t,!1),s=bi.fromClass(class{constructor(e){this.from=e.viewport.from,this.markers=this.buildMarkers(e)}update(e){(e.docChanged||e.viewportChanged||e.startState.facet(ja)!=e.state.facet(ja)||e.startState.field(ul,!1)!=e.state.field(ul,!1)||Da(e.startState)!=Da(e.state)||t.foldingChanged(e))&&(this.markers=this.buildMarkers(e.view))}buildMarkers(e){let t=new ke;for(let s of e.viewportLineBlocks){let r=pl(e.state,s.from,s.to)?n:al(e.state,s.from,s.to)?i:null;r&&t.add(s.from,s.from,r)}return t.finish()}}),{domEventHandlers:r}=t;return[s,no({class:"cm-foldGutter",markers(e){var t;return(null===(t=e.plugin(s))||void 0===t?void 0:t.markers)||Se.empty},initialSpacer:()=>new kl(t,!1),domEventHandlers:Object.assign(Object.assign({},r),{click:(e,t,i)=>{if(r.click&&r.click(e,t,i))return!0;let n=pl(e.state,t.from,t.to);if(n)return e.dispatch({effects:cl.of(n)}),!0;let s=al(e.state,t.from,t.to);return!!s&&(e.dispatch({effects:hl.of(s)}),!0)}})}),_l()]}const Cl=Ds.baseTheme({".cm-foldPlaceholder":{backgroundColor:"#eee",border:"1px solid #ddd",color:"#888",borderRadius:".2em",margin:"0 1px",padding:"0 1px",cursor:"pointer"},".cm-foldGutter span":{padding:"0 1px",cursor:"pointer"}});class Pl{constructor(e,t){let i;function n(e){let t=ze.newName();return(i||(i=Object.create(null)))["."+t]=e,t}this.specs=e;const s="string"==typeof t.all?t.all:t.all?n(t.all):void 0,r=t.scope;this.scope=r instanceof Ea?e=>e.prop(Pa)==r.data:r?e=>e==r:void 0,this.style=la(e.map((e=>({tag:e.tag,class:e.class||n(Object.assign({},e,{tag:null}))}))),{all:s}).style,this.module=i?new ze(i):null,this.themeType=t.themeType}static define(e,t){return new Pl(e,t||{})}}const Ml=q.define(),El=q.define({combine:e=>e.length?[e[0]]:null});function Al(e){let t=e.facet(Ml);return t.length?t:e.facet(El)}function Rl(e,t){let i,n=[Il];return e instanceof Pl&&(e.module&&n.push(Ds.styleModule.of(e.module)),i=e.themeType),(null==t?void 0:t.fallback)?n.push(El.of(e)):i?n.push(Ml.computeN([Ds.darkTheme],(t=>t.facet(Ds.darkTheme)==("dark"==i)?[e]:[]))):n.push(Ml.of(e)),n}class Dl{constructor(e){this.markCache=Object.create(null),this.tree=Da(e.state),this.decorations=this.buildDeco(e,Al(e.state))}update(e){let t=Da(e.state),i=Al(e.state),n=i!=Al(e.startState);t.length{i.add(e,t,this.markCache[n]||(this.markCache[n]=Yt.mark({class:n})))}),n,s);return i.finish()}}const Il=V.high(bi.fromClass(Dl,{decorations:e=>e.decorations})),ql=Pl.define([{tag:Ta.meta,color:"#404740"},{tag:Ta.link,textDecoration:"underline"},{tag:Ta.heading,textDecoration:"underline",fontWeight:"bold"},{tag:Ta.emphasis,fontStyle:"italic"},{tag:Ta.strong,fontWeight:"bold"},{tag:Ta.strikethrough,textDecoration:"line-through"},{tag:Ta.keyword,color:"#708"},{tag:[Ta.atom,Ta.bool,Ta.url,Ta.contentSeparator,Ta.labelName],color:"#219"},{tag:[Ta.literal,Ta.inserted],color:"#164"},{tag:[Ta.string,Ta.deleted],color:"#a11"},{tag:[Ta.regexp,Ta.escape,Ta.special(Ta.string)],color:"#e40"},{tag:Ta.definition(Ta.variableName),color:"#00f"},{tag:Ta.local(Ta.variableName),color:"#30a"},{tag:[Ta.typeName,Ta.namespace],color:"#085"},{tag:Ta.className,color:"#167"},{tag:[Ta.special(Ta.variableName),Ta.macroName],color:"#256"},{tag:Ta.definition(Ta.propertyName),color:"#00c"},{tag:Ta.comment,color:"#940"},{tag:Ta.invalid,color:"#f00"}]),Ll=Ds.baseTheme({"&.cm-focused .cm-matchingBracket":{backgroundColor:"#328c8252"},"&.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bb555544"}}),Nl=1e4,Bl="()[]{}",$l=q.define({combine:e=>be(e,{afterCursor:!0,brackets:Bl,maxScanDistance:Nl,renderMatch:jl})}),Ql=Yt.mark({class:"cm-matchingBracket"}),zl=Yt.mark({class:"cm-nonmatchingBracket"});function jl(e){let t=[],i=e.matched?Ql:zl;return t.push(i.range(e.start.from,e.start.to)),e.end&&t.push(i.range(e.end.from,e.end.to)),t}const Wl=j.define({create:()=>Yt.none,update(e,t){if(!t.docChanged&&!t.selection)return e;let i=[],n=t.state.facet($l);for(let e of t.state.selection.ranges){if(!e.empty)continue;let s=Yl(t.state,e.head,-1,n)||e.head>0&&Yl(t.state,e.head-1,1,n)||n.afterCursor&&(Yl(t.state,e.head,1,n)||e.headDs.decorations.from(e)}),Vl=[Wl,Ll];function Ul(e={}){return[$l.of(e),Vl]}const Fl=new ko;function Hl(e,t,i){let n=e.prop(t<0?ko.openedBy:ko.closedBy);if(n)return n;if(1==e.name.length){let n=i.indexOf(e.name);if(n>-1&&n%2==(t<0?1:0))return[i[n+t]]}return null}function Xl(e){let t=e.type.prop(Fl);return t?t(e.node):e}function Yl(e,t,i,n={}){let s=n.maxScanDistance||Nl,r=n.brackets||Bl,o=Da(e),a=o.resolveInner(t,i);for(let e=a;e;e=e.parent){let n=Hl(e.type,i,r);if(n&&e.from0?t>=s.from&&ts.from&&t<=s.to))return Gl(0,0,i,e,s,n,r)}}return function(e,t,i,n,s,r,o){let a=i<0?e.sliceDoc(t-1,t):e.sliceDoc(t,t+1),l=o.indexOf(a);if(l<0||l%2==0!=i>0)return null;let h={from:i<0?t-1:t,to:i>0?t+1:t},c=e.doc.iterRange(t,i>0?e.doc.length:0),d=0;for(let e=0;!c.next().done&&e<=r;){let r=c.value;i<0&&(e+=r.length);let a=t+e*i;for(let e=i>0?0:r.length-1,t=i>0?r.length:-1;e!=t;e+=i){let t=o.indexOf(r[e]);if(!(t<0||n.resolveInner(a+e,1).type!=s))if(t%2==0==i>0)d++;else{if(1==d)return{start:h,end:{from:a+e,to:a+e+1},matched:t>>1==l>>1};d--}}i>0&&(e+=r.length)}return c.done?{start:h,matched:!1}:null}(e,t,i,o,a.type,s,r)}function Gl(e,t,i,n,s,r,o){let a=n.parent,l={from:s.from,to:s.to},h=0,c=null==a?void 0:a.cursor();if(c&&(i<0?c.childBefore(n.from):c.childAfter(n.to)))do{if(i<0?c.to<=n.from:c.from>=n.to){if(0==h&&r.indexOf(c.type.name)>-1&&c.from-1||(Jl.push(e),console.warn(t))}function ih(e,t){let i=[];for(let n of t.split(" ")){let t=[];for(let i of n.split(".")){let n=e[i]||Ta[i];n?"function"==typeof n?t.length?t=t.map(n):th(i,`Modifier ${i} used at start of tag`):t.length?th(i,`Tag ${i} used as modifier`):t=Array.isArray(n)?n:[n]:th(i,`Unknown highlighting tag ${i}`)}for(let e of t)i.push(e)}if(!i.length)return 0;let n=t.replace(/ /g,"_"),s=Po.define({id:Kl.length,name:n,props:[ra({[n]:i})]});return Kl.push(s),s.id}function nh(e,t){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=e(t,i);return!!s&&(n(i.update(s)),!0)}}const sh=nh(ch,0),rh=nh(hh,0),oh=nh(((e,t)=>hh(e,t,function(e){let t=[];for(let i of e.selection.ranges){let n=e.doc.lineAt(i.from),s=i.to<=n.to?n:e.doc.lineAt(i.to),r=t.length-1;r>=0&&t[r].to>n.from?t[r].to=s.to:t.push({from:n.from+/^\s*/.exec(n.text)[0].length,to:s.to})}return t}(t))),0);function ah(e,t){let i=e.languageDataAt("commentTokens",t);return i.length?i[0]:{}}const lh=50;function hh(e,t,i=t.selection.ranges){let n=i.map((e=>ah(t,e.from).block));if(!n.every((e=>e)))return null;let s=i.map(((e,i)=>function(e,{open:t,close:i},n,s){let r,o,a=e.sliceDoc(n-lh,n),l=e.sliceDoc(s,s+lh),h=/\s*$/.exec(a)[0].length,c=/^\s*/.exec(l)[0].length,d=a.length-h;if(a.slice(d-t.length,d)==t&&l.slice(c,c+i.length)==i)return{open:{pos:n-h,margin:h&&1},close:{pos:s+c,margin:c&&1}};s-n<=2*lh?r=o=e.sliceDoc(n,s):(r=e.sliceDoc(n,n+lh),o=e.sliceDoc(s-lh,s));let u=/^\s*/.exec(r)[0].length,p=/\s*$/.exec(o)[0].length,f=o.length-p-i.length;return r.slice(u,u+t.length)==t&&o.slice(f,f+i.length)==i?{open:{pos:n+u+t.length,margin:/\s/.test(r.charAt(u+t.length))?1:0},close:{pos:s-p-i.length,margin:/\s/.test(o.charAt(f-1))?1:0}}:null}(t,n[i],e.from,e.to)));if(2!=e&&!s.every((e=>e)))return{changes:t.changes(i.map(((e,t)=>s[t]?[]:[{from:e.from,insert:n[t].open+" "},{from:e.to,insert:" "+n[t].close}])))};if(1!=e&&s.some((e=>e))){let e=[];for(let t,i=0;is&&(e==r||r>l.from)){s=l.from;let e=/^\s*/.exec(l.text)[0].length,t=e==l.length,i=l.text.slice(e,e+a.length)==a?e:-1;ee.comment<0&&(!e.empty||e.single)))){let e=[];for(let{line:t,token:i,indent:s,empty:r,single:o}of n)!o&&r||e.push({from:t.from+s,insert:i+" "});let i=t.changes(e);return{changes:i,selection:t.selection.map(i,1)}}if(1!=e&&n.some((e=>e.comment>=0))){let e=[];for(let{line:t,comment:i,token:s}of n)if(i>=0){let n=t.from+i,r=n+s.length;" "==t.text[r-t.from]&&r++,e.push({from:n,to:r})}return{changes:e}}return null}const dh=se.define(),uh=se.define(),ph=q.define(),fh=q.define({combine:e=>be(e,{minDepth:100,newGroupDelay:500,joinToEvent:(e,t)=>t},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(e,t)=>(i,n)=>e(i,n)||t(i,n)})}),mh=j.define({create:()=>Rh.empty,update(e,t){let i=t.state.facet(fh),n=t.annotation(dh);if(n){let s=t.docChanged?R.single(function(e){let t=0;return e.iterChangedRanges(((e,i)=>t=i)),t}(t.changes)):void 0,r=wh.fromTransaction(t,s),o=n.side,a=0==o?e.undone:e.done;return a=r?xh(a,a.length,i.minDepth,r):Ch(a,t.startState.selection),new Rh(0==o?n.rest:a,0==o?a:n.rest)}let s=t.annotation(uh);if("full"!=s&&"before"!=s||(e=e.isolate()),!1===t.annotation(le.addToHistory))return t.changes.empty?e:e.addMapping(t.changes.desc);let r=wh.fromTransaction(t),o=t.annotation(le.time),a=t.annotation(le.userEvent);return r?e=e.addChanges(r,o,a,i,t):t.selection&&(e=e.addSelection(t.startState.selection,o,a,i.newGroupDelay)),"full"!=s&&"after"!=s||(e=e.isolate()),e},toJSON:e=>({done:e.done.map((e=>e.toJSON())),undone:e.undone.map((e=>e.toJSON()))}),fromJSON:e=>new Rh(e.done.map(wh.fromJSON),e.undone.map(wh.fromJSON))});function gh(e={}){return[mh,fh.of(e),Ds.domEventHandlers({beforeinput(e,t){let i="historyUndo"==e.inputType?Oh:"historyRedo"==e.inputType?bh:null;return!!i&&(e.preventDefault(),i(t))}})]}function vh(e,t){return function({state:i,dispatch:n}){if(!t&&i.readOnly)return!1;let s=i.field(mh,!1);if(!s)return!1;let r=s.pop(e,i,t);return!!r&&(n(r),!0)}}const Oh=vh(0,!1),bh=vh(1,!1),_h=vh(0,!0),yh=vh(1,!0);class wh{constructor(e,t,i,n,s){this.changes=e,this.effects=t,this.mapped=i,this.startSelection=n,this.selectionsAfter=s}setSelAfter(e){return new wh(this.changes,this.effects,this.mapped,this.startSelection,e)}toJSON(){var e,t,i;return{changes:null===(e=this.changes)||void 0===e?void 0:e.toJSON(),mapped:null===(t=this.mapped)||void 0===t?void 0:t.toJSON(),startSelection:null===(i=this.startSelection)||void 0===i?void 0:i.toJSON(),selectionsAfter:this.selectionsAfter.map((e=>e.toJSON()))}}static fromJSON(e){return new wh(e.changes&&S.fromJSON(e.changes),[],e.mapped&&x.fromJSON(e.mapped),e.startSelection&&R.fromJSON(e.startSelection),e.selectionsAfter.map(R.fromJSON))}static fromTransaction(e,t){let i=kh;for(let t of e.startState.facet(ph)){let n=t(e);n.length&&(i=i.concat(n))}return!i.length&&e.changes.empty?null:new wh(e.changes.invert(e.startState.doc),i,void 0,t||e.startState.selection,kh)}static selection(e){return new wh(void 0,kh,void 0,void 0,e)}}function xh(e,t,i,n){let s=t+1>i+20?t-i-1:0,r=e.slice(s,t);return r.push(n),r}function Sh(e,t){return e.length?t.length?e.concat(t):e:t}const kh=[],Th=200;function Ch(e,t){if(e.length){let i=e[e.length-1],n=i.selectionsAfter.slice(Math.max(0,i.selectionsAfter.length-Th));return n.length&&n[n.length-1].eq(t)?e:(n.push(t),xh(e,e.length-1,1e9,i.setSelAfter(n)))}return[wh.selection([t])]}function Ph(e){let t=e[e.length-1],i=e.slice();return i[e.length-1]=t.setSelAfter(t.selectionsAfter.slice(0,t.selectionsAfter.length-1)),i}function Mh(e,t){if(!e.length)return e;let i=e.length,n=kh;for(;i;){let s=Eh(e[i-1],t,n);if(s.changes&&!s.changes.empty||s.effects.length){let t=e.slice(0,i);return t[i-1]=s,t}t=s.mapped,i--,n=s.selectionsAfter}return n.length?[wh.selection(n)]:kh}function Eh(e,t,i){let n=Sh(e.selectionsAfter.length?e.selectionsAfter.map((e=>e.map(t))):kh,i);if(!e.changes)return wh.selection(n);let s=e.changes.map(t),r=t.mapDesc(e.changes,!0),o=e.mapped?e.mapped.composeDesc(r):r;return new wh(s,ae.mapEffects(e.effects,t),o,e.startSelection.map(r),n)}const Ah=/^(input\.type|delete)($|\.)/;class Rh{constructor(e,t,i=0,n=void 0){this.done=e,this.undone=t,this.prevTime=i,this.prevUserEvent=n}isolate(){return this.prevTime?new Rh(this.done,this.undone):this}addChanges(e,t,i,n,s){let r=this.done,o=r[r.length-1];return r=o&&o.changes&&!o.changes.empty&&e.changes&&(!i||Ah.test(i))&&(!o.selectionsAfter.length&&t-this.prevTimei.push(e,t))),t.iterChangedRanges(((e,t,s,r)=>{for(let e=0;e=t&&s<=o&&(n=!0)}})),n}(o.changes,e.changes))||"input.type.compose"==i)?xh(r,r.length-1,n.minDepth,new wh(e.changes.compose(o.changes),Sh(e.effects,o.effects),o.mapped,o.startSelection,kh)):xh(r,r.length,n.minDepth,e),new Rh(r,kh,t,i)}addSelection(e,t,i,n){let s=this.done.length?this.done[this.done.length-1].selectionsAfter:kh;return s.length>0&&t-this.prevTimee.empty!=o.ranges[t].empty)).length)?this:new Rh(Ch(this.done,e),this.undone,t,i);var r,o}addMapping(e){return new Rh(Mh(this.done,e),Mh(this.undone,e),this.prevTime,this.prevUserEvent)}pop(e,t,i){let n=0==e?this.done:this.undone;if(0==n.length)return null;let s=n[n.length-1];if(i&&s.selectionsAfter.length)return t.update({selection:s.selectionsAfter[s.selectionsAfter.length-1],annotations:dh.of({side:e,rest:Ph(n)}),userEvent:0==e?"select.undo":"select.redo",scrollIntoView:!0});if(s.changes){let i=1==n.length?kh:n.slice(0,n.length-1);return s.mapped&&(i=Mh(i,s.mapped)),t.update({changes:s.changes,selection:s.startSelection,effects:s.effects,annotations:dh.of({side:e,rest:i}),filter:!1,userEvent:0==e?"undo":"redo",scrollIntoView:!0})}return null}}Rh.empty=new Rh(kh,kh);const Dh=[{key:"Mod-z",run:Oh,preventDefault:!0},{key:"Mod-y",mac:"Mod-Shift-z",run:bh,preventDefault:!0},{linux:"Ctrl-Shift-z",run:bh,preventDefault:!0},{key:"Mod-u",run:_h,preventDefault:!0},{key:"Alt-u",mac:"Mod-Shift-u",run:yh,preventDefault:!0}];function Ih(e,t){return R.create(e.ranges.map(t),e.mainIndex)}function qh(e,t){return e.update({selection:t,scrollIntoView:!0,userEvent:"select"})}function Lh({state:e,dispatch:t},i){let n=Ih(e.selection,i);return!n.eq(e.selection)&&(t(qh(e,n)),!0)}function Nh(e,t){return R.cursor(t?e.to:e.from)}function Bh(e,t){return Lh(e,(i=>i.empty?e.moveByChar(i,t):Nh(i,t)))}function $h(e){return e.textDirectionAt(e.state.selection.main.head)==Ri.LTR}const Qh=e=>Bh(e,!$h(e)),zh=e=>Bh(e,$h(e));function jh(e,t){return Lh(e,(i=>i.empty?e.moveByGroup(i,t):Nh(i,t)))}function Wh(e,t,i){if(t.type.prop(i))return!0;let n=t.to-t.from;return n&&(n>2||/[^\s,.;:]/.test(e.sliceDoc(t.from,t.to)))||t.firstChild}function Vh(e,t,i){let n,s,r=Da(e).resolveInner(t.head),o=i?ko.closedBy:ko.openedBy;for(let n=t.head;;){let t=i?r.childAfter(n):r.childBefore(n);if(!t)break;Wh(e,t,o)?r=t:n=i?t.to:t.from}return s=r.type.prop(o)&&(n=i?Yl(e,r.from,1):Yl(e,r.to,-1))&&n.matched?i?n.end.to:n.end.from:i?r.to:r.from,R.cursor(s,i?-1:1)}function Uh(e,t){return Lh(e,(i=>{if(!i.empty)return Nh(i,t);let n=e.moveVertically(i,t);return n.head!=i.head?n:e.moveToLineBoundary(i,t)}))}"undefined"!=typeof Intl&&Intl.Segmenter;const Fh=e=>Uh(e,!1),Hh=e=>Uh(e,!0);function Xh(e){let t,i=e.scrollDOM.clientHeighti.empty?e.moveVertically(i,t,n.height):Nh(i,t)));if(r.eq(s.selection))return!1;if(n.selfScroll){let t=e.coordsAtPos(s.selection.main.head),o=e.scrollDOM.getBoundingClientRect(),a=o.top+n.marginTop,l=o.bottom-n.marginBottom;t&&t.top>a&&t.bottomYh(e,!1),Zh=e=>Yh(e,!0);function Kh(e,t,i){let n=e.lineBlockAt(t.head),s=e.moveToLineBoundary(t,i);if(s.head==t.head&&s.head!=(i?n.to:n.from)&&(s=e.moveToLineBoundary(t,i,!1)),!i&&s.head==n.from&&n.length){let i=/^\s*/.exec(e.state.sliceDoc(n.from,Math.min(n.from+100,n.to)))[0].length;i&&t.head!=n.from+i&&(s=R.cursor(n.from+i))}return s}function Jh(e,t){let i=Ih(e.state.selection,(e=>{let i=t(e);return R.range(e.anchor,i.head,i.goalColumn,i.bidiLevel||void 0)}));return!i.eq(e.state.selection)&&(e.dispatch(qh(e.state,i)),!0)}function ec(e,t){return Jh(e,(i=>e.moveByChar(i,t)))}const tc=e=>ec(e,!$h(e)),ic=e=>ec(e,$h(e));function nc(e,t){return Jh(e,(i=>e.moveByGroup(i,t)))}function sc(e,t){return Jh(e,(i=>e.moveVertically(i,t)))}const rc=e=>sc(e,!1),oc=e=>sc(e,!0);function ac(e,t){return Jh(e,(i=>e.moveVertically(i,t,Xh(e).height)))}const lc=e=>ac(e,!1),hc=e=>ac(e,!0),cc=({state:e,dispatch:t})=>(t(qh(e,{anchor:0})),!0),dc=({state:e,dispatch:t})=>(t(qh(e,{anchor:e.doc.length})),!0),uc=({state:e,dispatch:t})=>(t(qh(e,{anchor:e.selection.main.anchor,head:0})),!0),pc=({state:e,dispatch:t})=>(t(qh(e,{anchor:e.selection.main.anchor,head:e.doc.length})),!0);function fc(e,t){if(e.state.readOnly)return!1;let i="delete.selection",{state:n}=e,s=n.changeByRange((n=>{let{from:s,to:r}=n;if(s==r){let o=t(n);os&&(i="delete.forward",o=mc(e,o,!0)),s=Math.min(s,o),r=Math.max(r,o)}else s=mc(e,s,!1),r=mc(e,r,!0);return s==r?{range:n}:{changes:{from:s,to:r},range:R.cursor(s,st(e))))n.between(t,t,((e,n)=>{et&&(t=i?n:e)}));return t}const gc=(e,t)=>fc(e,(i=>{let n,s,r=i.from,{state:o}=e,a=o.doc.lineAt(r);if(!t&&r>a.from&&rgc(e,!1),Oc=e=>gc(e,!0),bc=(e,t)=>fc(e,(i=>{let n=i.head,{state:s}=e,r=s.doc.lineAt(n),o=s.charCategorizer(n);for(let e=null;;){if(n==(t?r.to:r.from)){n==i.head&&r.number!=(t?s.doc.lines:1)&&(n+=t?1:-1);break}let a=p(r.text,n-r.from,t)+r.from,l=r.text.slice(Math.min(n,a)-r.from,Math.max(n,a)-r.from),h=o(l);if(null!=e&&h!=e)break;" "==l&&n==i.head||(e=h),n=a}return n})),_c=e=>bc(e,!1);function yc(e){let t=[],i=-1;for(let n of e.selection.ranges){let s=e.doc.lineAt(n.from),r=e.doc.lineAt(n.to);if(n.empty||n.to!=r.from||(r=e.doc.lineAt(n.to-1)),i>=s.number){let e=t[t.length-1];e.to=r.to,e.ranges.push(n)}else t.push({from:s.from,to:r.to,ranges:[n]});i=r.number+1}return t}function wc(e,t,i){if(e.readOnly)return!1;let n=[],s=[];for(let t of yc(e)){if(i?t.to==e.doc.length:0==t.from)continue;let r=e.doc.lineAt(i?t.to+1:t.from-1),o=r.length+1;if(i){n.push({from:t.to,to:r.to},{from:t.from,insert:r.text+e.lineBreak});for(let i of t.ranges)s.push(R.range(Math.min(e.doc.length,i.anchor+o),Math.min(e.doc.length,i.head+o)))}else{n.push({from:r.from,to:t.from},{from:t.to,insert:e.lineBreak+r.text});for(let e of t.ranges)s.push(R.range(e.anchor-o,e.head-o))}}return!!n.length&&(t(e.update({changes:n,scrollIntoView:!0,selection:R.create(s,e.selection.mainIndex),userEvent:"move.line"})),!0)}function xc(e,t,i){if(e.readOnly)return!1;let n=[];for(let t of yc(e))i?n.push({from:t.from,insert:e.doc.slice(t.from,t.to)+e.lineBreak}):n.push({from:t.to,insert:e.lineBreak+e.doc.slice(t.from,t.to)});return t(e.update({changes:n,scrollIntoView:!0,userEvent:"input.copyline"})),!0}const Sc=kc(!1);function kc(t){return({state:i,dispatch:n})=>{if(i.readOnly)return!1;let s=i.changeByRange((n=>{let{from:s,to:r}=n,o=i.doc.lineAt(s),a=!t&&s==r&&function(e,t){if(/\(\)|\[\]|\{\}/.test(e.sliceDoc(t-1,t+1)))return{from:t,to:t};let i,n=Da(e).resolveInner(t),s=n.childBefore(t),r=n.childAfter(t);return s&&r&&s.to<=t&&r.from>=t&&(i=s.type.prop(ko.closedBy))&&i.indexOf(r.name)>-1&&e.doc.lineAt(s.to).from==e.doc.lineAt(r.from).from&&!/\S/.test(e.sliceDoc(s.to,r.from))?{from:s.to,to:r.from}:null}(i,s);t&&(s=r=(r<=o.to?o:i.doc.lineAt(r)).to);let l=new Ya(i,{simulateBreak:s,simulateDoubleBreak:!!a}),h=Xa(l,s);for(null==h&&(h=Le(/^\s*/.exec(i.doc.lineAt(s).text)[0],i.tabSize));ro.from&&s{let s=[];for(let r=n.from;r<=n.to;){let o=e.doc.lineAt(r);o.number>i&&(n.empty||n.to>o.from)&&(t(o,s,n),i=o.number),r=o.to+1}let r=e.changes(s);return{changes:s,range:R.range(r.mapPos(n.anchor,1),r.mapPos(n.head,1))}}))}const Cc=[{key:"Alt-ArrowLeft",mac:"Ctrl-ArrowLeft",run:e=>Lh(e,(t=>Vh(e.state,t,!$h(e)))),shift:e=>Jh(e,(t=>Vh(e.state,t,!$h(e))))},{key:"Alt-ArrowRight",mac:"Ctrl-ArrowRight",run:e=>Lh(e,(t=>Vh(e.state,t,$h(e)))),shift:e=>Jh(e,(t=>Vh(e.state,t,$h(e))))},{key:"Alt-ArrowUp",run:({state:e,dispatch:t})=>wc(e,t,!1)},{key:"Shift-Alt-ArrowUp",run:({state:e,dispatch:t})=>xc(e,t,!1)},{key:"Alt-ArrowDown",run:({state:e,dispatch:t})=>wc(e,t,!0)},{key:"Shift-Alt-ArrowDown",run:({state:e,dispatch:t})=>xc(e,t,!0)},{key:"Escape",run:({state:e,dispatch:t})=>{let i=e.selection,n=null;return i.ranges.length>1?n=R.create([i.main]):i.main.empty||(n=R.create([R.cursor(i.main.head)])),!!n&&(t(qh(e,n)),!0)}},{key:"Mod-Enter",run:kc(!0)},{key:"Alt-l",mac:"Ctrl-l",run:({state:e,dispatch:t})=>{let i=yc(e).map((({from:t,to:i})=>R.range(t,Math.min(i+1,e.doc.length))));return t(e.update({selection:R.create(i),userEvent:"select"})),!0}},{key:"Mod-i",run:({state:e,dispatch:t})=>{let i=Ih(e.selection,(t=>{var i;for(let n=Da(e).resolveStack(t.from,1);n;n=n.next){let{node:e}=n;if((e.from=t.to||e.to>t.to&&e.from<=t.from)&&(null===(i=e.parent)||void 0===i?void 0:i.parent))return R.range(e.to,e.from)}return t}));return t(qh(e,i)),!0},preventDefault:!0},{key:"Mod-[",run:({state:e,dispatch:t})=>!e.readOnly&&(t(e.update(Tc(e,((t,i)=>{let n=/^\s*/.exec(t.text)[0];if(!n)return;let s=Le(n,e.tabSize),r=0,o=Ha(e,Math.max(0,s-Fa(e)));for(;r!e.readOnly&&(t(e.update(Tc(e,((t,i)=>{i.push({from:t.from,insert:e.facet(Ua)})})),{userEvent:"input.indent"})),!0)},{key:"Mod-Alt-\\",run:({state:e,dispatch:t})=>{if(e.readOnly)return!1;let i=Object.create(null),n=new Ya(e,{overrideIndentation:e=>{let t=i[e];return null==t?-1:t}}),s=Tc(e,((t,s,r)=>{let o=Xa(n,t.from);if(null==o)return;/\S/.test(t.text)||(o=0);let a=/^\s*/.exec(t.text)[0],l=Ha(e,o);(a!=l||r.from{if(e.state.readOnly)return!1;let{state:t}=e,i=t.changes(yc(t).map((({from:e,to:i})=>(e>0?e--:ie.moveVertically(t,!0))).map(i);return e.dispatch({changes:i,selection:n,scrollIntoView:!0,userEvent:"delete.line"}),!0}},{key:"Shift-Mod-\\",run:({state:e,dispatch:t})=>function(e,t,i){let n=!1,s=Ih(e.selection,(t=>{let s=Yl(e,t.head,-1)||Yl(e,t.head,1)||t.head>0&&Yl(e,t.head-1,1)||t.head{let{state:t}=e,i=t.doc.lineAt(t.selection.main.from),n=ah(e.state,i.from);return n.line?sh(e):!!n.block&&oh(e)}},{key:"Alt-A",run:rh}].concat([{key:"ArrowLeft",run:Qh,shift:tc,preventDefault:!0},{key:"Mod-ArrowLeft",mac:"Alt-ArrowLeft",run:e=>jh(e,!$h(e)),shift:e=>nc(e,!$h(e)),preventDefault:!0},{mac:"Cmd-ArrowLeft",run:e=>Lh(e,(t=>Kh(e,t,!$h(e)))),shift:e=>Jh(e,(t=>Kh(e,t,!$h(e)))),preventDefault:!0},{key:"ArrowRight",run:zh,shift:ic,preventDefault:!0},{key:"Mod-ArrowRight",mac:"Alt-ArrowRight",run:e=>jh(e,$h(e)),shift:e=>nc(e,$h(e)),preventDefault:!0},{mac:"Cmd-ArrowRight",run:e=>Lh(e,(t=>Kh(e,t,$h(e)))),shift:e=>Jh(e,(t=>Kh(e,t,$h(e)))),preventDefault:!0},{key:"ArrowUp",run:Fh,shift:rc,preventDefault:!0},{mac:"Cmd-ArrowUp",run:cc,shift:uc},{mac:"Ctrl-ArrowUp",run:Gh,shift:lc},{key:"ArrowDown",run:Hh,shift:oc,preventDefault:!0},{mac:"Cmd-ArrowDown",run:dc,shift:pc},{mac:"Ctrl-ArrowDown",run:Zh,shift:hc},{key:"PageUp",run:Gh,shift:lc},{key:"PageDown",run:Zh,shift:hc},{key:"Home",run:e=>Lh(e,(t=>Kh(e,t,!1))),shift:e=>Jh(e,(t=>Kh(e,t,!1))),preventDefault:!0},{key:"Mod-Home",run:cc,shift:uc},{key:"End",run:e=>Lh(e,(t=>Kh(e,t,!0))),shift:e=>Jh(e,(t=>Kh(e,t,!0))),preventDefault:!0},{key:"Mod-End",run:dc,shift:pc},{key:"Enter",run:Sc},{key:"Mod-a",run:({state:e,dispatch:t})=>(t(e.update({selection:{anchor:0,head:e.doc.length},userEvent:"select"})),!0)},{key:"Backspace",run:vc,shift:vc},{key:"Delete",run:Oc},{key:"Mod-Backspace",mac:"Alt-Backspace",run:_c},{key:"Mod-Delete",mac:"Alt-Delete",run:e=>bc(e,!0)},{mac:"Mod-Backspace",run:e=>fc(e,(t=>{let i=e.moveToLineBoundary(t,!1).head;return t.head>i?i:Math.max(0,t.head-1)}))},{mac:"Mod-Delete",run:e=>fc(e,(t=>{let i=e.moveToLineBoundary(t,!0).head;return t.headLh(e,(t=>R.cursor(e.lineBlockAt(t.head).from,1))),shift:e=>Jh(e,(t=>R.cursor(e.lineBlockAt(t.head).from)))},{key:"Ctrl-e",run:e=>Lh(e,(t=>R.cursor(e.lineBlockAt(t.head).to,-1))),shift:e=>Jh(e,(t=>R.cursor(e.lineBlockAt(t.head).to)))},{key:"Ctrl-d",run:Oc},{key:"Ctrl-h",run:vc},{key:"Ctrl-k",run:e=>fc(e,(t=>{let i=e.lineBlockAt(t.head).to;return t.head{if(t.readOnly)return!1;let n=t.changeByRange((t=>({changes:{from:t.from,to:t.to,insert:e.of(["",""])},range:R.cursor(t.from)})));return i(t.update(n,{scrollIntoView:!0,userEvent:"input"})),!0}},{key:"Ctrl-t",run:({state:e,dispatch:t})=>{if(e.readOnly)return!1;let i=e.changeByRange((t=>{if(!t.empty||0==t.from||t.from==e.doc.length)return{range:t};let i=t.from,n=e.doc.lineAt(i),s=i==n.from?i-1:p(n.text,i-n.from,!1)+n.from,r=i==n.to?i+1:p(n.text,i-n.from,!0)+n.from;return{changes:{from:s,to:r,insert:e.doc.slice(i,r).append(e.doc.slice(s,i))},range:R.cursor(r)}}));return!i.changes.empty&&(t(e.update(i,{scrollIntoView:!0,userEvent:"move.character"})),!0)}},{key:"Ctrl-v",run:Zh}].map((e=>({mac:e.key,run:e.run,shift:e.shift})))));function Pc(){var e=arguments[0];"string"==typeof e&&(e=document.createElement(e));var t=1,i=arguments[1];if(i&&"object"==typeof i&&null==i.nodeType&&!Array.isArray(i)){for(var n in i)if(Object.prototype.hasOwnProperty.call(i,n)){var s=i[n];"string"==typeof s?e.setAttribute(n,s):null!=s&&(e[n]=s)}t++}for(;te.normalize("NFKD"):e=>e;class Ac{constructor(e,t,i=0,n=e.length,s,r){this.test=r,this.value={from:0,to:0},this.done=!1,this.matches=[],this.buffer="",this.bufferPos=0,this.iter=e.iterRange(i,n),this.bufferStart=i,this.normalize=s?e=>s(Ec(e)):Ec,this.query=this.normalize(t)}peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this.buffer.length,this.iter.next(),this.iter.done)return-1;this.bufferPos=0,this.buffer=this.iter.value}return O(this.buffer,this.bufferPos)}next(){for(;this.matches.length;)this.matches.pop();return this.nextOverlapping()}nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,this;let t=b(e),i=this.bufferStart+this.bufferPos;this.bufferPos+=_(e);let n=this.normalize(t);for(let e=0,s=i;;e++){let r=n.charCodeAt(e),o=this.match(r,s);if(e==n.length-1){if(o)return this.value=o,this;break}s==i&&ethis.to&&(this.curLine=this.curLine.slice(0,this.to-this.curLineStart)),this.iter.next())}nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,this.curLineStart>this.to?this.curLine="":this.getLine(0)}next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;let t=this.matchPos<=this.to&&this.re.exec(this.curLine);if(t){let i=this.curLineStart+t.index,n=i+t[0].length;if(this.matchPos=Bc(this.text,n+(i==n?1:0)),i==this.curLineStart+this.curLine.length&&this.nextLine(),(ithis.value.to)&&(!this.test||this.test(i,n,t)))return this.value={from:i,to:n,match:t},this;e=this.matchPos-this.curLineStart}else{if(!(this.curLineStart+this.curLine.length=i||n.to<=t){let n=new Lc(t,e.sliceString(t,i));return qc.set(e,n),n}if(n.from==t&&n.to==i)return n;let{text:s,from:r}=n;return r>t&&(s=e.sliceString(t,r)+s,r=t),n.to=this.to?this.to:this.text.lineAt(e).to}next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,t=this.re.exec(this.flat.text);if(t&&!t[0]&&t.index==e&&(this.re.lastIndex=e+1,t=this.re.exec(this.flat.text)),t){let e=this.flat.from+t.index,i=e+t[0].length;if((this.flat.to>=this.to||t.index+t[0].length<=this.flat.text.length-10)&&(!this.test||this.test(e,i,t)))return this.value={from:e,to:i,match:t},this.matchPos=Bc(this.text,i+(e==i?1:0)),this}if(this.flat.to==this.to)return this.done=!0,this;this.flat=Lc.get(this.text,this.flat.from,this.chunkEnd(this.flat.from+2*this.flat.text.length))}}}function Bc(e,t){if(t>=e.length)return t;let i,n=e.lineAt(t);for(;t=56320&&i<57344;)t++;return t}function $c(e){let t=Pc("input",{class:"cm-textfield",name:"line",value:String(e.state.doc.lineAt(e.state.selection.main.head).number)});function i(){let i=/^([+-])?(\d+)?(:\d+)?(%)?$/.exec(t.value);if(!i)return;let{state:n}=e,s=n.doc.lineAt(n.selection.main.head),[,r,o,a,l]=i,h=a?+a.slice(1):0,c=o?+o:s.number;if(o&&l){let e=c/100;r&&(e=e*("-"==r?-1:1)+s.number/n.doc.lines),c=Math.round(n.doc.lines*e)}else o&&r&&(c=c*("-"==r?-1:1)+s.number);let d=n.doc.line(Math.max(1,Math.min(n.doc.lines,c))),u=R.cursor(d.from+Math.max(0,Math.min(h,d.length)));e.dispatch({effects:[Qc.of(!1),Ds.scrollIntoView(u.from,{y:"center"})],selection:u}),e.focus()}return{dom:Pc("form",{class:"cm-gotoLine",onkeydown:t=>{27==t.keyCode?(t.preventDefault(),e.dispatch({effects:Qc.of(!1)}),e.focus()):13==t.keyCode&&(t.preventDefault(),i())},onsubmit:e=>{e.preventDefault(),i()}},Pc("label",e.state.phrase("Go to line"),": ",t)," ",Pc("button",{class:"cm-button",type:"submit"},e.state.phrase("go")))}}"undefined"!=typeof Symbol&&(Ic.prototype[Symbol.iterator]=Nc.prototype[Symbol.iterator]=function(){return this});const Qc=ae.define(),zc=j.define({create:()=>!0,update(e,t){for(let i of t.effects)i.is(Qc)&&(e=i.value);return e},provide:e=>Kr.from(e,(e=>e?$c:null))}),jc=Ds.baseTheme({".cm-panel.cm-gotoLine":{padding:"2px 6px 4px","& label":{fontSize:"80%"}}}),Wc={highlightWordAroundCursor:!1,minSelectionLength:1,maxMatches:100,wholeWords:!1},Vc=q.define({combine:e=>be(e,Wc,{highlightWordAroundCursor:(e,t)=>e||t,minSelectionLength:Math.min,maxMatches:Math.min})});function Uc(e){let t=[Gc,Yc];return e&&t.push(Vc.of(e)),t}const Fc=Yt.mark({class:"cm-selectionMatch"}),Hc=Yt.mark({class:"cm-selectionMatch cm-selectionMatch-main"});function Xc(e,t,i,n){return!(0!=i&&e(t.sliceDoc(i-1,i))==me.Word||n!=t.doc.length&&e(t.sliceDoc(n,n+1))==me.Word)}const Yc=bi.fromClass(class{constructor(e){this.decorations=this.getDeco(e)}update(e){(e.selectionSet||e.docChanged||e.viewportChanged)&&(this.decorations=this.getDeco(e.view))}getDeco(e){let t=e.state.facet(Vc),{state:i}=e,n=i.selection;if(n.ranges.length>1)return Yt.none;let s,r=n.main,o=null;if(r.empty){if(!t.highlightWordAroundCursor)return Yt.none;let e=i.wordAt(r.head);if(!e)return Yt.none;o=i.charCategorizer(r.head),s=i.sliceDoc(e.from,e.to)}else{let e=r.to-r.from;if(e200)return Yt.none;if(t.wholeWords){if(s=i.sliceDoc(r.from,r.to),o=i.charCategorizer(r.head),!Xc(o,i,r.from,r.to)||!function(e,t,i,n){return e(t.sliceDoc(i,i+1))==me.Word&&e(t.sliceDoc(n-1,n))==me.Word}(o,i,r.from,r.to))return Yt.none}else if(s=i.sliceDoc(r.from,r.to).trim(),!s)return Yt.none}let a=[];for(let n of e.visibleRanges){let e=new Ac(i.doc,s,n.from,n.to);for(;!e.next().done;){let{from:n,to:s}=e.value;if((!o||Xc(o,i,n,s))&&(r.empty&&n<=r.from&&s>=r.to?a.push(Hc.range(n,s)):(n>=r.to||s<=r.from)&&a.push(Fc.range(n,s)),a.length>t.maxMatches))return Yt.none}}return Yt.set(a)}},{decorations:e=>e.decorations}),Gc=Ds.baseTheme({".cm-selectionMatch":{backgroundColor:"#99ff7780"},".cm-searchMatch .cm-selectionMatch":{backgroundColor:"transparent"}}),Zc=q.define({combine:e=>be(e,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,wholeWord:!1,createPanel:e=>new Td(e),scrollToMatch:e=>Ds.scrollIntoView(e)})});class Kc{constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive,this.literal=!!e.literal,this.regexp=!!e.regexp,this.replace=e.replace||"",this.valid=!!this.search&&(!this.regexp||function(e){try{return new RegExp(e,Dc),!0}catch(e){return!1}}(this.search)),this.unquoted=this.unquote(this.search),this.wholeWord=!!e.wholeWord}unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,((e,t)=>"n"==t?"\n":"r"==t?"\r":"t"==t?"\t":"\\"))}eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSensitive==e.caseSensitive&&this.regexp==e.regexp&&this.wholeWord==e.wholeWord}create(){return this.regexp?new rd(this):new td(this)}getCursor(e,t=0,i){let n=e.doc?e:Oe.create({doc:e});return null==i&&(i=n.doc.length),this.regexp?id(this,n,t,i):ed(this,n,t,i)}}class Jc{constructor(e){this.spec=e}}function ed(e,t,i,n){return new Ac(t.doc,e.unquoted,i,n,e.caseSensitive?void 0:e=>e.toLowerCase(),e.wholeWord?function(e,t){return(i,n,s,r)=>((r>i||r+s.length=t)return null;n.push(i.value)}return n}highlight(e,t,i,n){let s=ed(this.spec,e,Math.max(0,t-this.spec.unquoted.length),Math.min(i+this.spec.unquoted.length,e.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}function id(e,t,i,n){return new Ic(t.doc,e.search,{ignoreCase:!e.caseSensitive,test:e.wholeWord?(s=t.charCategorizer(t.selection.main.head),(e,t,i)=>!i[0].length||(s(nd(i.input,i.index))!=me.Word||s(sd(i.input,i.index))!=me.Word)&&(s(sd(i.input,i.index+i[0].length))!=me.Word||s(nd(i.input,i.index+i[0].length))!=me.Word)):void 0},i,n);var s}function nd(e,t){return e.slice(p(e,t,!1),t)}function sd(e,t){return e.slice(t,p(e,t))}class rd extends Jc{nextMatch(e,t,i){let n=id(this.spec,e,i,e.doc.length).next();return n.done&&(n=id(this.spec,e,0,t).next()),n.done?null:n.value}prevMatchInRange(e,t,i){for(let n=1;;n++){let s=Math.max(t,i-1e4*n),r=id(this.spec,e,s,i),o=null;for(;!r.next().done;)o=r.value;if(o&&(s==t||o.from>s+10))return o;if(s==t)return null}}prevMatch(e,t,i){return this.prevMatchInRange(e,0,t)||this.prevMatchInRange(e,i,e.doc.length)}getReplacement(e){return this.spec.unquote(this.spec.replace.replace(/\$([$&\d+])/g,((t,i)=>"$"==i?"$":"&"==i?e.match[0]:"0"!=i&&+i=t)return null;n.push(i.value)}return n}highlight(e,t,i,n){let s=id(this.spec,e,Math.max(0,t-250),Math.min(i+250,e.doc.length));for(;!s.next().done;)n(s.value.from,s.value.to)}}const od=ae.define(),ad=ae.define(),ld=j.define({create:e=>new hd(_d(e).create(),null),update(e,t){for(let i of t.effects)i.is(od)?e=new hd(i.value.create(),e.panel):i.is(ad)&&(e=new hd(e.query,i.value?bd:null));return e},provide:e=>Kr.from(e,(e=>e.panel))});class hd{constructor(e,t){this.query=e,this.panel=t}}const cd=Yt.mark({class:"cm-searchMatch"}),dd=Yt.mark({class:"cm-searchMatch cm-searchMatch-selected"}),ud=bi.fromClass(class{constructor(e){this.view=e,this.decorations=this.highlight(e.state.field(ld))}update(e){let t=e.state.field(ld);(t!=e.startState.field(ld)||e.docChanged||e.selectionSet||e.viewportChanged)&&(this.decorations=this.highlight(t))}highlight({query:e,panel:t}){if(!t||!e.spec.valid)return Yt.none;let{view:i}=this,n=new ke;for(let t=0,s=i.visibleRanges,r=s.length;ts[t+1].from-500;)a=s[++t].to;e.highlight(i.state,o,a,((e,t)=>{let s=i.state.selection.ranges.some((i=>i.from==e&&i.to==t));n.add(e,t,s?dd:cd)}))}return n.finish()}},{decorations:e=>e.decorations});function pd(e){return t=>{let i=t.state.field(ld,!1);return i&&i.query.spec.valid?e(t,i):xd(t)}}const fd=pd(((e,{query:t})=>{let{to:i}=e.state.selection.main,n=t.nextMatch(e.state,i,i);if(!n)return!1;let s=R.single(n.from,n.to),r=e.state.facet(Zc);return e.dispatch({selection:s,effects:[Ed(e,n),r.scrollToMatch(s.main,e)],userEvent:"select.search"}),wd(e),!0})),md=pd(((e,{query:t})=>{let{state:i}=e,{from:n}=i.selection.main,s=t.prevMatch(i,n,n);if(!s)return!1;let r=R.single(s.from,s.to),o=e.state.facet(Zc);return e.dispatch({selection:r,effects:[Ed(e,s),o.scrollToMatch(r.main,e)],userEvent:"select.search"}),wd(e),!0})),gd=pd(((e,{query:t})=>{let i=t.matchAll(e.state,1e3);return!(!i||!i.length||(e.dispatch({selection:R.create(i.map((e=>R.range(e.from,e.to)))),userEvent:"select.search.matches"}),0))})),vd=pd(((e,{query:t})=>{let{state:i}=e,{from:n,to:s}=i.selection.main;if(i.readOnly)return!1;let r=t.nextMatch(i,n,n);if(!r)return!1;let o,a,l=[],h=[];if(r.from==n&&r.to==s&&(a=i.toText(t.getReplacement(r)),l.push({from:r.from,to:r.to,insert:a}),r=t.nextMatch(i,r.from,r.to),h.push(Ds.announce.of(i.phrase("replaced match on line $",i.doc.lineAt(n).number)+"."))),r){let t=0==l.length||l[0].from>=r.to?0:r.to-r.from-a.length;o=R.single(r.from-t,r.to-t),h.push(Ed(e,r)),h.push(i.facet(Zc).scrollToMatch(o.main,e))}return e.dispatch({changes:l,selection:o,effects:h,userEvent:"input.replace"}),!0})),Od=pd(((e,{query:t})=>{if(e.state.readOnly)return!1;let i=t.matchAll(e.state,1e9).map((e=>{let{from:i,to:n}=e;return{from:i,to:n,insert:t.getReplacement(e)}}));if(!i.length)return!1;let n=e.state.phrase("replaced $ matches",i.length)+".";return e.dispatch({changes:i,effects:Ds.announce.of(n),userEvent:"input.replace.all"}),!0}));function bd(e){return e.state.facet(Zc).createPanel(e)}function _d(e,t){var i,n,s,r,o;let a=e.selection.main,l=a.empty||a.to>a.from+100?"":e.sliceDoc(a.from,a.to);if(t&&!l)return t;let h=e.facet(Zc);return new Kc({search:(null!==(i=null==t?void 0:t.literal)&&void 0!==i?i:h.literal)?l:l.replace(/\n/g,"\\n"),caseSensitive:null!==(n=null==t?void 0:t.caseSensitive)&&void 0!==n?n:h.caseSensitive,literal:null!==(s=null==t?void 0:t.literal)&&void 0!==s?s:h.literal,regexp:null!==(r=null==t?void 0:t.regexp)&&void 0!==r?r:h.regexp,wholeWord:null!==(o=null==t?void 0:t.wholeWord)&&void 0!==o?o:h.wholeWord})}function yd(e){let t=Xr(e,bd);return t&&t.dom.querySelector("[main-field]")}function wd(e){let t=yd(e);t&&t==e.root.activeElement&&t.select()}const xd=e=>{let t=e.state.field(ld,!1);if(t&&t.panel){let i=yd(e);if(i&&i!=e.root.activeElement){let n=_d(e.state,t.query.spec);n.valid&&e.dispatch({effects:od.of(n)}),i.focus(),i.select()}}else e.dispatch({effects:[ad.of(!0),t?od.of(_d(e.state,t.query.spec)):ae.appendConfig.of(Rd)]});return!0},Sd=e=>{let t=e.state.field(ld,!1);if(!t||!t.panel)return!1;let i=Xr(e,bd);return i&&i.dom.contains(e.root.activeElement)&&e.focus(),e.dispatch({effects:ad.of(!1)}),!0},kd=[{key:"Mod-f",run:xd,scope:"editor search-panel"},{key:"F3",run:fd,shift:md,scope:"editor search-panel",preventDefault:!0},{key:"Mod-g",run:fd,shift:md,scope:"editor search-panel",preventDefault:!0},{key:"Escape",run:Sd,scope:"editor search-panel"},{key:"Mod-Shift-l",run:({state:e,dispatch:t})=>{let i=e.selection;if(i.ranges.length>1||i.main.empty)return!1;let{from:n,to:s}=i.main,r=[],o=0;for(let t=new Ac(e.doc,e.sliceDoc(n,s));!t.next().done;){if(r.length>1e3)return!1;t.value.from==n&&(o=r.length),r.push(R.range(t.value.from,t.value.to))}return t(e.update({selection:R.create(r,o),userEvent:"select.search.matches"})),!0}},{key:"Alt-g",run:e=>{let t=Xr(e,$c);if(!t){let i=[Qc.of(!0)];null==e.state.field(zc,!1)&&i.push(ae.appendConfig.of([zc,jc])),e.dispatch({effects:i}),t=Xr(e,$c)}return t&&t.dom.querySelector("input").select(),!0}},{key:"Mod-d",run:({state:e,dispatch:t})=>{let{ranges:i}=e.selection;if(i.some((e=>e.from===e.to)))return(({state:e,dispatch:t})=>{let{selection:i}=e,n=R.create(i.ranges.map((t=>e.wordAt(t.head)||R.cursor(t.head))),i.mainIndex);return!n.eq(i)&&(t(e.update({selection:n})),!0)})({state:e,dispatch:t});let n=e.sliceDoc(i[0].from,i[0].to);if(e.selection.ranges.some((t=>e.sliceDoc(t.from,t.to)!=n)))return!1;let s=function(e,t){let{main:i,ranges:n}=e.selection,s=e.wordAt(i.head),r=s&&s.from==i.from&&s.to==i.to;for(let i=!1,s=new Ac(e.doc,t,n[n.length-1].to);;){if(s.next(),!s.done){if(i&&n.some((e=>e.from==s.value.from)))continue;if(r){let t=e.wordAt(s.value.from);if(!t||t.from!=s.value.from||t.to!=s.value.to)continue}return s.value}if(i)return null;s=new Ac(e.doc,t,0,Math.max(0,n[n.length-1].from-1)),i=!0}}(e,n);return!!s&&(t(e.update({selection:e.selection.addRange(R.range(s.from,s.to),!1),effects:Ds.scrollIntoView(s.to)})),!0)},preventDefault:!0}];class Td{constructor(e){this.view=e;let t=this.query=e.state.field(ld).query.spec;function i(e,t,i){return Pc("button",{class:"cm-button",name:e,onclick:t,type:"button"},i)}this.commit=this.commit.bind(this),this.searchField=Pc("input",{value:t.search,placeholder:Cd(e,"Find"),"aria-label":Cd(e,"Find"),class:"cm-textfield",name:"search",form:"","main-field":"true",onchange:this.commit,onkeyup:this.commit}),this.replaceField=Pc("input",{value:t.replace,placeholder:Cd(e,"Replace"),"aria-label":Cd(e,"Replace"),class:"cm-textfield",name:"replace",form:"",onchange:this.commit,onkeyup:this.commit}),this.caseField=Pc("input",{type:"checkbox",name:"case",form:"",checked:t.caseSensitive,onchange:this.commit}),this.reField=Pc("input",{type:"checkbox",name:"re",form:"",checked:t.regexp,onchange:this.commit}),this.wordField=Pc("input",{type:"checkbox",name:"word",form:"",checked:t.wholeWord,onchange:this.commit}),this.dom=Pc("div",{onkeydown:e=>this.keydown(e),class:"cm-search"},[this.searchField,i("next",(()=>fd(e)),[Cd(e,"next")]),i("prev",(()=>md(e)),[Cd(e,"previous")]),i("select",(()=>gd(e)),[Cd(e,"all")]),Pc("label",null,[this.caseField,Cd(e,"match case")]),Pc("label",null,[this.reField,Cd(e,"regexp")]),Pc("label",null,[this.wordField,Cd(e,"by word")]),...e.state.readOnly?[]:[Pc("br"),this.replaceField,i("replace",(()=>vd(e)),[Cd(e,"replace")]),i("replaceAll",(()=>Od(e)),[Cd(e,"replace all")])],Pc("button",{name:"close",onclick:()=>Sd(e),"aria-label":Cd(e,"close"),type:"button"},["ร—"])])}commit(){let e=new Kc({search:this.searchField.value,caseSensitive:this.caseField.checked,regexp:this.reField.checked,wholeWord:this.wordField.checked,replace:this.replaceField.value});e.eq(this.query)||(this.query=e,this.view.dispatch({effects:od.of(e)}))}keydown(e){var t,i;i=e,Fs(Ws((t=this.view).state),i,t,"search-panel")?e.preventDefault():13==e.keyCode&&e.target==this.searchField?(e.preventDefault(),(e.shiftKey?md:fd)(this.view)):13==e.keyCode&&e.target==this.replaceField&&(e.preventDefault(),vd(this.view))}update(e){for(let t of e.transactions)for(let e of t.effects)e.is(od)&&!e.value.eq(this.query)&&this.setQuery(e.value)}setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceField.value=e.replace,this.caseField.checked=e.caseSensitive,this.reField.checked=e.regexp,this.wordField.checked=e.wholeWord}mount(){this.searchField.select()}get pos(){return 80}get top(){return this.view.state.facet(Zc).top}}function Cd(e,t){return e.state.phrase(t)}const Pd=30,Md=/[\s\.,:;?!]/;function Ed(e,{from:t,to:i}){let n=e.state.doc.lineAt(t),s=e.state.doc.lineAt(i).to,r=Math.max(n.from,t-Pd),o=Math.min(s,i+Pd),a=e.state.sliceDoc(r,o);if(r!=n.from)for(let e=0;ea.length-Pd;e--)if(!Md.test(a[e-1])&&Md.test(a[e])){a=a.slice(0,e);break}return Ds.announce.of(`${e.state.phrase("current match")}. ${a} ${e.state.phrase("on line")} ${n.number}.`)}const Ad=Ds.baseTheme({".cm-panel.cm-search":{padding:"2px 6px 4px",position:"relative","& [name=close]":{position:"absolute",top:"0",right:"4px",backgroundColor:"inherit",border:"none",font:"inherit",padding:0,margin:0},"& input, & button, & label":{margin:".2em .6em .2em 0"},"& input[type=checkbox]":{marginRight:".2em"},"& label":{fontSize:"80%",whiteSpace:"pre"}},"&light .cm-searchMatch":{backgroundColor:"#ffff0054"},"&dark .cm-searchMatch":{backgroundColor:"#00ffff8a"},"&light .cm-searchMatch-selected":{backgroundColor:"#ff6a0054"},"&dark .cm-searchMatch-selected":{backgroundColor:"#ff00ff8a"}}),Rd=[ld,V.low(ud),Ad];class Dd{constructor(e,t,i){this.state=e,this.pos=t,this.explicit=i,this.abortListeners=[]}tokenBefore(e){let t=Da(this.state).resolveInner(this.pos,-1);for(;t&&e.indexOf(t.name)<0;)t=t.parent;return t?{from:t.from,to:this.pos,text:this.state.sliceDoc(t.from,this.pos),type:t.type}:null}matchBefore(e){let t=this.state.doc.lineAt(this.pos),i=Math.max(t.from,this.pos-250),n=t.text.slice(i-t.from,this.pos-t.from),s=n.search($d(e,!1));return s<0?null:{from:i+s,to:this.pos,text:n.slice(s)}}get aborted(){return null==this.abortListeners}addEventListener(e,t){"abort"==e&&this.abortListeners&&this.abortListeners.push(t)}}function Id(e){let t=Object.keys(e).join(""),i=/\w/.test(t);return i&&(t=t.replace(/\w/g,"")),`[${i?"\\w":""}${t.replace(/[^\w\s]/g,"\\$&")}]`}function qd(e){let t=e.map((e=>"string"==typeof e?{label:e}:e)),[i,n]=t.every((e=>/^\w+$/.test(e.label)))?[/\w*$/,/\w+$/]:function(e){let t=Object.create(null),i=Object.create(null);for(let{label:n}of e){t[n[0]]=!0;for(let e=1;e{let s=e.matchBefore(n);return s||e.explicit?{from:s?s.from:e.pos,options:t,validFor:i}:null}}function Ld(e,t){return i=>{for(let t=Da(i.state).resolveInner(i.pos,-1);t;t=t.parent){if(e.indexOf(t.name)>-1)return null;if(t.type.isTop)break}return t(i)}}class Nd{constructor(e,t,i,n){this.completion=e,this.source=t,this.match=i,this.score=n}}function Bd(e){return e.selection.main.from}function $d(e,t){var i;let{source:n}=e,s=t&&"^"!=n[0],r="$"!=n[n.length-1];return s||r?new RegExp(`${s?"^":""}(?:${n})${r?"$":""}`,null!==(i=e.flags)&&void 0!==i?i:e.ignoreCase?"i":""):e}const Qd=se.define(),zd=new WeakMap;function jd(e){if(!Array.isArray(e))return e;let t=zd.get(e);return t||zd.set(e,t=qd(e)),t}const Wd=ae.define(),Vd=ae.define();class Ud{constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],this.precise=[],this.byWord=[],this.score=0,this.matched=[];for(let t=0;t=48&&l<=57||l>=97&&l<=122?2:l>=65&&l<=90?1:0:(y=b(l))!=y.toLowerCase()?1:y!=y.toUpperCase()?2:0;(!n||1==w&&m||0==v&&0!=w)&&(t[c]==l||i[c]==l&&(d=!0)?r[c++]=n:r.length&&(g=!1)),v=w,n+=_(l)}return c==a&&0==r[0]&&g?this.result((d?-200:0)-100,r,e):u==a&&0==p?this.ret(-200-e.length+(f==e.length?0:-100),[0,f]):o>-1?this.ret(-700-e.length,[o,o+this.pattern.length]):u==a?this.ret(-900-e.length,[p,f]):c==a?this.result((d?-200:0)-100-700+(g?0:-1100),r,e):2!=t.length&&this.result((n[0]?-700:0)-200-1100,n,e)}result(e,t,i){let n=[],s=0;for(let e of t){let t=e+(this.astral?_(O(i,e)):1);s&&n[s-1]==e?n[s-1]=t:(n[s++]=e,n[s++]=t)}return this.ret(e-i.length,n)}}const Fd=q.define({combine:e=>be(e,{activateOnTyping:!0,selectOnOpen:!0,override:null,closeOnBlur:!0,maxRenderedOptions:100,defaultKeymap:!0,tooltipClass:()=>"",optionClass:()=>"",aboveCursor:!1,icons:!0,addToOptions:[],positionInfo:Xd,compareCompletions:(e,t)=>e.label.localeCompare(t.label),interactionDelay:75,updateSyncTime:100},{defaultKeymap:(e,t)=>e&&t,closeOnBlur:(e,t)=>e&&t,icons:(e,t)=>e&&t,tooltipClass:(e,t)=>i=>Hd(e(i),t(i)),optionClass:(e,t)=>i=>Hd(e(i),t(i)),addToOptions:(e,t)=>e.concat(t)})});function Hd(e,t){return e?t?e+" "+t:e:t}function Xd(e,t,i,n,s,r){let o,a,l=e.textDirection==Ri.RTL,h=l,c=!1,d="top",u=t.left-s.left,p=s.right-t.right,f=n.right-n.left,m=n.bottom-n.top;if(h&&u=m||e>t.top?o=i.bottom-t.top:(d="bottom",o=t.bottom-i.top)}return{style:`${d}: ${o/((t.bottom-t.top)/r.offsetHeight)}px; max-width: ${a/((t.right-t.left)/r.offsetWidth)}px`,class:"cm-completionInfo-"+(c?l?"left-narrow":"right-narrow":h?"left":"right")}}function Yd(e,t,i){if(e<=i)return{from:0,to:e};if(t<0&&(t=0),t<=e>>1){let e=Math.floor(t/i);return{from:e*i,to:(e+1)*i}}let n=Math.floor((e-t)/i);return{from:e-(n+1)*i,to:e-n*i}}class Gd{constructor(e,t,i){this.view=e,this.stateField=t,this.applyCompletion=i,this.info=null,this.infoDestroy=null,this.placeInfoReq={read:()=>this.measureInfo(),write:e=>this.placeInfo(e),key:this},this.space=null,this.currentClass="";let n=e.state.field(t),{options:s,selected:r}=n.open,o=e.state.facet(Fd);this.optionContent=function(e){let t=e.addToOptions.slice();return e.icons&&t.push({render(e){let t=document.createElement("div");return t.classList.add("cm-completionIcon"),e.type&&t.classList.add(...e.type.split(/\s+/g).map((e=>"cm-completionIcon-"+e))),t.setAttribute("aria-hidden","true"),t},position:20}),t.push({render(e,t,i){let n=document.createElement("span");n.className="cm-completionLabel";let s=e.displayLabel||e.label,r=0;for(let e=0;er&&n.appendChild(document.createTextNode(s.slice(r,t)));let a=n.appendChild(document.createElement("span"));a.appendChild(document.createTextNode(s.slice(t,o))),a.className="cm-completionMatchedText",r=o}return re.position-t.position)).map((e=>e.render))}(o),this.optionClass=o.optionClass,this.tooltipClass=o.tooltipClass,this.range=Yd(s.length,r,o.maxRenderedOptions),this.dom=document.createElement("div"),this.dom.className="cm-tooltip-autocomplete",this.updateTooltipClass(e.state),this.dom.addEventListener("mousedown",(i=>{let{options:n}=e.state.field(t).open;for(let t,s=i.target;s&&s!=this.dom;s=s.parentNode)if("LI"==s.nodeName&&(t=/-(\d+)$/.exec(s.id))&&+t[1]{let i=e.state.field(this.stateField,!1);i&&i.tooltip&&e.state.facet(Fd).closeOnBlur&&t.relatedTarget!=e.contentDOM&&e.dispatch({effects:Vd.of(null)})})),this.showOptions(s,n.id)}mount(){this.updateSel()}showOptions(e,t){this.list&&this.list.remove(),this.list=this.dom.appendChild(this.createListBox(e,t,this.range)),this.list.addEventListener("scroll",(()=>{this.info&&this.view.requestMeasure(this.placeInfoReq)}))}update(e){var t;let i=e.state.field(this.stateField),n=e.startState.field(this.stateField);if(this.updateTooltipClass(e.state),i!=n){let{options:s,selected:r,disabled:o}=i.open;n.open&&n.open.options==s||(this.range=Yd(s.length,r,e.state.facet(Fd).maxRenderedOptions),this.showOptions(s,i.id)),this.updateSel(),o!=(null===(t=n.open)||void 0===t?void 0:t.disabled)&&this.dom.classList.toggle("cm-tooltip-autocomplete-disabled",!!o)}}updateTooltipClass(e){let t=this.tooltipClass(e);if(t!=this.currentClass){for(let e of this.currentClass.split(" "))e&&this.dom.classList.remove(e);for(let e of t.split(" "))e&&this.dom.classList.add(e);this.currentClass=t}}positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.placeInfoReq)}updateSel(){let e=this.view.state.field(this.stateField),t=e.open;if((t.selected>-1&&t.selected=this.range.to)&&(this.range=Yd(t.options.length,t.selected,this.view.state.facet(Fd).maxRenderedOptions),this.showOptions(t.options,e.id)),this.updateSelectedOption(t.selected)){this.destroyInfo();let{completion:i}=t.options[t.selected],{info:n}=i;if(!n)return;let s="string"==typeof n?document.createTextNode(n):n(i);if(!s)return;"then"in s?s.then((t=>{t&&this.view.state.field(this.stateField,!1)==e&&this.addInfoPane(t,i)})).catch((e=>mi(this.view.state,e,"completion info"))):this.addInfoPane(s,i)}}addInfoPane(e,t){this.destroyInfo();let i=this.info=document.createElement("div");if(i.className="cm-tooltip cm-completionInfo",null!=e.nodeType)i.appendChild(e),this.infoDestroy=null;else{let{dom:t,destroy:n}=e;i.appendChild(t),this.infoDestroy=n||null}this.dom.appendChild(i),this.view.requestMeasure(this.placeInfoReq)}updateSelectedOption(e){let t=null;for(let i=this.list.firstChild,n=this.range.from;i;i=i.nextSibling,n++)"LI"==i.nodeName&&i.id?n==e?i.hasAttribute("aria-selected")||(i.setAttribute("aria-selected","true"),t=i):i.hasAttribute("aria-selected")&&i.removeAttribute("aria-selected"):n--;return t&&function(e,t){let i=e.getBoundingClientRect(),n=t.getBoundingClientRect(),s=i.height/e.offsetHeight;n.topi.bottom&&(e.scrollTop+=(n.bottom-i.bottom)/s)}(this.list,t),t}measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!this.info)return null;let t=this.dom.getBoundingClientRect(),i=this.info.getBoundingClientRect(),n=e.getBoundingClientRect(),s=this.space;if(!s){let e=this.dom.ownerDocument.defaultView||window;s={left:0,top:0,right:e.innerWidth,bottom:e.innerHeight}}return n.top>Math.min(s.bottom,t.bottom)-10||n.bottomi.from||0==i.from)&&(s=e,"string"!=typeof l&&l.header?n.appendChild(l.header(l)):n.appendChild(document.createElement("completion-section")).textContent=e)}const h=n.appendChild(document.createElement("li"));h.id=t+"-"+r,h.setAttribute("role","option");let c=this.optionClass(o);c&&(h.className=c);for(let e of this.optionContent){let t=e(o,this.view.state,a);t&&h.appendChild(t)}}return i.from&&n.classList.add("cm-completionListIncompleteTop"),i.tonew Gd(i,e,t)}function Kd(e){return 100*(e.boost||0)+(e.apply?10:0)+(e.info?5:0)+(e.type?1:0)}class Jd{constructor(e,t,i,n,s,r){this.options=e,this.attrs=t,this.tooltip=i,this.timestamp=n,this.selected=s,this.disabled=r}setSelected(e,t){return e==this.selected||e>=this.options.length?this:new Jd(this.options,iu(t,e),this.tooltip,this.timestamp,e,this.disabled)}static build(e,t,i,n,s){let r=function(e,t){let i=[],n=null,s=e=>{i.push(e);let{section:t}=e.completion;if(t){n||(n=[]);let e="string"==typeof t?t:t.name;n.some((t=>t.name==e))||n.push("string"==typeof t?{name:e}:t)}};for(let n of e)if(n.hasResult()){let e=n.result.getMatch;if(!1===n.result.filter)for(let t of n.result.options)s(new Nd(t,n.source,e?e(t):[],1e9-i.length));else{let i=new Ud(t.sliceDoc(n.from,n.to));for(let t of n.result.options)if(i.match(t.label)){let r=t.displayLabel?e?e(t,i.matched):[]:i.matched;s(new Nd(t,n.source,r,i.score+(t.boost||0)))}}}if(n){let e=Object.create(null),t=0,s=(e,t)=>{var i,n;return(null!==(i=e.rank)&&void 0!==i?i:1e9)-(null!==(n=t.rank)&&void 0!==n?n:1e9)||(e.namet.score-e.score||a(e.completion,t.completion)))){let t=e.completion;!o||o.label!=t.label||o.detail!=t.detail||null!=o.type&&null!=t.type&&o.type!=t.type||o.apply!=t.apply||o.boost!=t.boost?r.push(e):Kd(e.completion)>Kd(o)&&(r[r.length-1]=e),o=e.completion}return r}(e,t);if(!r.length)return n&&e.some((e=>1==e.state))?new Jd(n.options,n.attrs,n.tooltip,n.timestamp,n.selected,!0):null;let o=t.facet(Fd).selectOnOpen?0:-1;if(n&&n.selected!=o&&-1!=n.selected){let e=n.options[n.selected].completion;for(let t=0;tt.hasResult()?Math.min(e,t.from):e),1e8),create:du,above:s.aboveCursor},n?n.timestamp:Date.now(),o,!1)}map(e){return new Jd(this.options,this.attrs,Object.assign(Object.assign({},this.tooltip),{pos:e.mapPos(this.tooltip.pos)}),this.timestamp,this.selected,this.disabled)}}class eu{constructor(e,t,i){this.active=e,this.id=t,this.open=i}static start(){return new eu(nu,"cm-ac-"+Math.floor(2e6*Math.random()).toString(36),null)}update(e){let{state:t}=e,i=t.facet(Fd),n=(i.override||t.languageDataAt("autocomplete",Bd(t)).map(jd)).map((t=>(this.active.find((e=>e.source==t))||new ru(t,this.active.some((e=>0!=e.state))?1:0)).update(e,i)));n.length==this.active.length&&n.every(((e,t)=>e==this.active[t]))&&(n=this.active);let s=this.open;s&&e.docChanged&&(s=s.map(e.changes)),e.selection||n.some((t=>t.hasResult()&&e.changes.touchesRange(t.from,t.to)))||!function(e,t){if(e==t)return!0;for(let i=0,n=0;;){for(;i1==e.state))&&(s=null),!s&&n.every((e=>1!=e.state))&&n.some((e=>e.hasResult()))&&(n=n.map((e=>e.hasResult()?new ru(e.source,0):e)));for(let t of e.effects)t.is(lu)&&(s=s&&s.setSelected(t.value,this.id));return n==this.active&&s==this.open?this:new eu(n,this.id,s)}get tooltip(){return this.open?this.open.tooltip:null}get attrs(){return this.open?this.open.attrs:tu}}const tu={"aria-autocomplete":"list"};function iu(e,t){let i={"aria-autocomplete":"list","aria-haspopup":"listbox","aria-controls":e};return t>-1&&(i["aria-activedescendant"]=e+"-"+t),i}const nu=[];function su(e){return e.isUserEvent("input.type")?"input":e.isUserEvent("delete.backward")?"delete":null}class ru{constructor(e,t,i=-1){this.source=e,this.state=t,this.explicitPos=i}hasResult(){return!1}update(e,t){let i=su(e),n=this;i?n=n.handleUserEvent(e,i,t):e.docChanged?n=n.handleChange(e):e.selection&&0!=n.state&&(n=new ru(n.source,0));for(let t of e.effects)if(t.is(Wd))n=new ru(n.source,1,t.value?Bd(e.state):-1);else if(t.is(Vd))n=new ru(n.source,0);else if(t.is(au))for(let e of t.value)e.source==n.source&&(n=e);return n}handleUserEvent(e,t,i){return"delete"!=t&&i.activateOnTyping?new ru(this.source,1):this.map(e.changes)}handleChange(e){return e.changes.touchesRange(Bd(e.startState))?new ru(this.source,0):this.map(e.changes)}map(e){return e.empty||this.explicitPos<0?this:new ru(this.source,this.state,e.mapPos(this.explicitPos))}}class ou extends ru{constructor(e,t,i,n,s){super(e,2,t),this.result=i,this.from=n,this.to=s}hasResult(){return!0}handleUserEvent(e,t,i){var n;let s=e.changes.mapPos(this.from),r=e.changes.mapPos(this.to,1),o=Bd(e.state);if((this.explicitPos<0?o<=s:or||"delete"==t&&Bd(e.startState)==this.from)return new ru(this.source,"input"==t&&i.activateOnTyping?1:0);let a,l=this.explicitPos<0?-1:e.changes.mapPos(this.explicitPos);return function(e,t,i,n){if(!e)return!1;let s=t.sliceDoc(i,n);return"function"==typeof e?e(s,i,n,t):$d(e,!0).test(s)}(this.result.validFor,e.state,s,r)?new ou(this.source,l,this.result,s,r):this.result.update&&(a=this.result.update(this.result,s,r,new Dd(e.state,o,l>=0)))?new ou(this.source,l,a,a.from,null!==(n=a.to)&&void 0!==n?n:Bd(e.state)):new ru(this.source,1,l)}handleChange(e){return e.changes.touchesRange(this.from,this.to)?new ru(this.source,0):this.map(e.changes)}map(e){return e.empty?this:new ou(this.source,this.explicitPos<0?-1:e.mapPos(this.explicitPos),this.result,e.mapPos(this.from),e.mapPos(this.to,1))}}const au=ae.define({map:(e,t)=>e.map((e=>e.map(t)))}),lu=ae.define(),hu=j.define({create:()=>eu.start(),update:(e,t)=>e.update(t),provide:e=>[Br.from(e,(e=>e.tooltip)),Ds.contentAttributes.from(e,(e=>e.attrs))]});function cu(e,t){const i=t.completion.apply||t.completion.label;let n=e.state.field(hu).active.find((e=>e.source==t.source));return n instanceof ou&&("string"==typeof i?e.dispatch(Object.assign(Object.assign({},function(e,t,i,n){let{main:s}=e.selection,r=i-s.from,o=n-s.from;return Object.assign(Object.assign({},e.changeByRange((a=>a!=s&&i!=n&&e.sliceDoc(a.from+r,a.from+o)!=e.sliceDoc(i,n)?{range:a}:{changes:{from:a.from+r,to:n==s.from?a.to:a.from+o,insert:t},range:R.cursor(a.from+r+t.length)}))),{scrollIntoView:!0,userEvent:"input.complete"})}(e.state,i,n.from,n.to)),{annotations:Qd.of(t.completion)})):i(e,t.completion,n.from,n.to),!0)}const du=Zd(hu,cu);function uu(e,t="option"){return i=>{let n=i.state.field(hu,!1);if(!n||!n.open||n.open.disabled||Date.now()-n.open.timestamp-1?n.open.selected+r*(e?1:-1):e?0:o-1;return a<0?a="page"==t?0:o-1:a>=o&&(a="page"==t?o-1:0),i.dispatch({effects:lu.of(a)}),!0}}class pu{constructor(e,t){this.active=e,this.context=t,this.time=Date.now(),this.updates=[],this.done=void 0}}const fu=bi.fromClass(class{constructor(e){this.view=e,this.debounceUpdate=-1,this.running=[],this.debounceAccept=-1,this.composing=0;for(let t of e.state.field(hu).active)1==t.state&&this.startQuery(t)}update(e){let t=e.state.field(hu);if(!e.selectionSet&&!e.docChanged&&e.startState.field(hu)==t)return;let i=e.transactions.some((e=>(e.selection||e.docChanged)&&!su(e)));for(let t=0;t50&&Date.now()-n.time>1e3){for(let e of n.context.abortListeners)try{e()}catch(e){mi(this.view.state,e)}n.context.abortListeners=null,this.running.splice(t--,1)}else n.updates.push(...e.transactions)}if(this.debounceUpdate>-1&&clearTimeout(this.debounceUpdate),this.debounceUpdate=t.active.some((e=>1==e.state&&!this.running.some((t=>t.active.source==e.source))))?setTimeout((()=>this.startUpdate()),50):-1,0!=this.composing)for(let t of e.transactions)"input"==su(t)?this.composing=2:2==this.composing&&t.selection&&(this.composing=3)}startUpdate(){this.debounceUpdate=-1;let{state:e}=this.view,t=e.field(hu);for(let e of t.active)1!=e.state||this.running.some((t=>t.active.source==e.source))||this.startQuery(e)}startQuery(e){let{state:t}=this.view,i=Bd(t),n=new Dd(t,i,e.explicitPos==i),s=new pu(e,n);this.running.push(s),Promise.resolve(e.source(n)).then((e=>{s.context.aborted||(s.done=e||null,this.scheduleAccept())}),(e=>{this.view.dispatch({effects:Vd.of(null)}),mi(this.view.state,e)}))}scheduleAccept(){this.running.every((e=>void 0!==e.done))?this.accept():this.debounceAccept<0&&(this.debounceAccept=setTimeout((()=>this.accept()),this.view.state.facet(Fd).updateSyncTime))}accept(){var e;this.debounceAccept>-1&&clearTimeout(this.debounceAccept),this.debounceAccept=-1;let t=[],i=this.view.state.facet(Fd);for(let n=0;ne.source==s.active.source));if(r&&1==r.state)if(null==s.done){let e=new ru(s.active.source,0);for(let t of s.updates)e=e.update(t,i);1!=e.state&&t.push(e)}else this.startQuery(r)}t.length&&this.view.dispatch({effects:au.of(t)})}},{eventHandlers:{blur(e){let t=this.view.state.field(hu,!1);if(t&&t.tooltip&&this.view.state.facet(Fd).closeOnBlur){let i=t.open&&Ur(this.view,t.open.tooltip);i&&i.dom.contains(e.relatedTarget)||this.view.dispatch({effects:Vd.of(null)})}},compositionstart(){this.composing=1},compositionend(){3==this.composing&&setTimeout((()=>this.view.dispatch({effects:Wd.of(!1)})),20),this.composing=0}}}),mu=Ds.baseTheme({".cm-tooltip.cm-tooltip-autocomplete":{"& > ul":{fontFamily:"monospace",whiteSpace:"nowrap",overflow:"hidden auto",maxWidth_fallback:"700px",maxWidth:"min(700px, 95vw)",minWidth:"250px",maxHeight:"10em",height:"100%",listStyle:"none",margin:0,padding:0,"& > li, & > completion-section":{padding:"1px 3px",lineHeight:1.2},"& > li":{overflowX:"hidden",textOverflow:"ellipsis",cursor:"pointer"},"& > completion-section":{display:"list-item",borderBottom:"1px solid silver",paddingLeft:"0.5em",opacity:.7}}},"&light .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#17c",color:"white"},"&light .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#777"},"&dark .cm-tooltip-autocomplete ul li[aria-selected]":{background:"#347",color:"white"},"&dark .cm-tooltip-autocomplete-disabled ul li[aria-selected]":{background:"#444"},".cm-completionListIncompleteTop:before, .cm-completionListIncompleteBottom:after":{content:'"ยทยทยท"',opacity:.5,display:"block",textAlign:"center"},".cm-tooltip.cm-completionInfo":{position:"absolute",padding:"3px 9px",width:"max-content",maxWidth:"400px",boxSizing:"border-box"},".cm-completionInfo.cm-completionInfo-left":{right:"100%"},".cm-completionInfo.cm-completionInfo-right":{left:"100%"},".cm-completionInfo.cm-completionInfo-left-narrow":{right:"30px"},".cm-completionInfo.cm-completionInfo-right-narrow":{left:"30px"},"&light .cm-snippetField":{backgroundColor:"#00000022"},"&dark .cm-snippetField":{backgroundColor:"#ffffff22"},".cm-snippetFieldPosition":{verticalAlign:"text-top",width:0,height:"1.15em",display:"inline-block",margin:"0 -0.7px -.7em",borderLeft:"1.4px dotted #888"},".cm-completionMatchedText":{textDecoration:"underline"},".cm-completionDetail":{marginLeft:"0.5em",fontStyle:"italic"},".cm-completionIcon":{fontSize:"90%",width:".8em",display:"inline-block",textAlign:"center",paddingRight:".6em",opacity:"0.6",boxSizing:"content-box"},".cm-completionIcon-function, .cm-completionIcon-method":{"&:after":{content:"'ฦ’'"}},".cm-completionIcon-class":{"&:after":{content:"'โ—‹'"}},".cm-completionIcon-interface":{"&:after":{content:"'โ—Œ'"}},".cm-completionIcon-variable":{"&:after":{content:"'๐‘ฅ'"}},".cm-completionIcon-constant":{"&:after":{content:"'๐ถ'"}},".cm-completionIcon-type":{"&:after":{content:"'๐‘ก'"}},".cm-completionIcon-enum":{"&:after":{content:"'โˆช'"}},".cm-completionIcon-property":{"&:after":{content:"'โ–ก'"}},".cm-completionIcon-keyword":{"&:after":{content:"'๐Ÿ”‘๏ธŽ'"}},".cm-completionIcon-namespace":{"&:after":{content:"'โ–ข'"}},".cm-completionIcon-text":{"&:after":{content:"'abc'",fontSize:"50%",verticalAlign:"middle"}}});class gu{constructor(e,t,i,n){this.field=e,this.line=t,this.from=i,this.to=n}}class vu{constructor(e,t,i){this.field=e,this.from=t,this.to=i}map(e){let t=e.mapPos(this.from,-1,w.TrackDel),i=e.mapPos(this.to,1,w.TrackDel);return null==t||null==i?null:new vu(this.field,t,i)}}class Ou{constructor(e,t){this.lines=e,this.fieldPositions=t}instantiate(e,t){let i=[],n=[t],s=e.doc.lineAt(t),r=/^\s*/.exec(s.text)[0];for(let s of this.lines){if(i.length){let i=r,o=/^\t*/.exec(s)[0].length;for(let t=0;tnew vu(e.field,n[e.line]+e.from,n[e.line]+e.to)));return{text:i,ranges:o}}static parse(e){let t,i=[],n=[],s=[];for(let r of e.split(/\r\n?|\n/)){for(;t=/[#$]\{(?:(\d+)(?::([^}]*))?|([^}]*))\}/.exec(r);){let e=t[1]?+t[1]:null,o=t[2]||t[3]||"",a=-1;for(let t=0;t=a&&e.field++}s.push(new gu(a,n.length,t.index,t.index+o.length)),r=r.slice(0,t.index)+o+r.slice(t.index+t[0].length)}for(let e;e=/\\([{}])/.exec(r);){r=r.slice(0,e.index)+e[1]+r.slice(e.index+e[0].length);for(let t of s)t.line==n.length&&t.from>e.index&&(t.from--,t.to--)}n.push(r)}return new Ou(n,s)}}let bu=Yt.widget({widget:new class extends Ht{toDOM(){let e=document.createElement("span");return e.className="cm-snippetFieldPosition",e}ignoreEvent(){return!1}}}),_u=Yt.mark({class:"cm-snippetField"});class yu{constructor(e,t){this.ranges=e,this.active=t,this.deco=Yt.set(e.map((e=>(e.from==e.to?bu:_u).range(e.from,e.to))))}map(e){let t=[];for(let i of this.ranges){let n=i.map(e);if(!n)return null;t.push(n)}return new yu(t,this.active)}selectionInsideField(e){return e.ranges.every((e=>this.ranges.some((t=>t.field==this.active&&t.from<=e.from&&t.to>=e.to))))}}const wu=ae.define({map:(e,t)=>e&&e.map(t)}),xu=ae.define(),Su=j.define({create:()=>null,update(e,t){for(let i of t.effects){if(i.is(wu))return i.value;if(i.is(xu)&&e)return new yu(e.ranges,i.value)}return e&&t.docChanged&&(e=e.map(t.changes)),e&&t.selection&&!e.selectionInsideField(t.selection)&&(e=null),e},provide:e=>Ds.decorations.from(e,(e=>e?e.deco:Yt.none))});function ku(e,t){return R.create(e.filter((e=>e.field==t)).map((e=>R.range(e.from,e.to))))}function Tu(t){let i=Ou.parse(t);return(t,n,s,r)=>{let{text:o,ranges:a}=i.instantiate(t.state,s),l={changes:{from:s,to:r,insert:e.of(o)},scrollIntoView:!0,annotations:n?Qd.of(n):void 0};if(a.length&&(l.selection=ku(a,0)),a.length>1){let e=new yu(a,0),i=l.effects=[wu.of(e)];void 0===t.state.field(Su,!1)&&i.push(ae.appendConfig.of([Su,Eu,Ru,mu]))}t.dispatch(t.state.update(l))}}function Cu(e){return({state:t,dispatch:i})=>{let n=t.field(Su,!1);if(!n||e<0&&0==n.active)return!1;let s=n.active+e,r=e>0&&!n.ranges.some((t=>t.field==s+e));return i(t.update({selection:ku(n.ranges,s),effects:wu.of(r?null:new yu(n.ranges,s)),scrollIntoView:!0})),!0}}const Pu=[{key:"Tab",run:Cu(1),shift:Cu(-1)},{key:"Escape",run:({state:e,dispatch:t})=>!!e.field(Su,!1)&&(t(e.update({effects:wu.of(null)})),!0)}],Mu=q.define({combine:e=>e.length?e[0]:Pu}),Eu=V.highest(zs.compute([Mu],(e=>e.facet(Mu))));function Au(e,t){return Object.assign(Object.assign({},t),{apply:Tu(e)})}const Ru=Ds.domEventHandlers({mousedown(e,t){let i,n=t.state.field(Su,!1);if(!n||null==(i=t.posAtCoords({x:e.clientX,y:e.clientY})))return!1;let s=n.ranges.find((e=>e.from<=i&&e.to>=i));return!(!s||s.field==n.active||(t.dispatch({selection:ku(n.ranges,s.field),effects:wu.of(n.ranges.some((e=>e.field>s.field))?new yu(n.ranges,s.field):null),scrollIntoView:!0}),0))}}),Du={brackets:["(","[","{","'",'"'],before:")]}:;>",stringPrefixes:[]},Iu=ae.define({map(e,t){let i=t.mapPos(e,-1,w.TrackAfter);return null==i?void 0:i}}),qu=new class extends _e{};qu.startSide=1,qu.endSide=-1;const Lu=j.define({create:()=>Se.empty,update(e,t){if(t.selection){let i=t.state.doc.lineAt(t.selection.main.head).from,n=t.startState.doc.lineAt(t.startState.selection.main.head).from;i!=t.changes.mapPos(n,-1)&&(e=Se.empty)}e=e.map(t.changes);for(let i of t.effects)i.is(Iu)&&(e=e.update({add:[qu.range(i.value,i.value+1)]}));return e}}),Nu="()[]{}<>";function Bu(e){for(let t=0;t<8;t+=2)if(Nu.charCodeAt(t)==e)return Nu.charAt(t+1);return b(e<128?e:e+1)}function $u(e,t){return e.languageDataAt("closeBrackets",t)[0]||Du}const Qu="object"==typeof navigator&&/Android\b/.test(navigator.userAgent),zu=Ds.inputHandler.of(((e,t,i,n)=>{if((Qu?e.composing:e.compositionStarted)||e.state.readOnly)return!1;let s=e.state.selection.main;if(n.length>2||2==n.length&&1==_(O(n,0))||t!=s.from||i!=s.to)return!1;let r=function(e,t){let i=$u(e,e.selection.main.head),n=i.brackets||Du.brackets;for(let s of n){let r=Bu(O(s,0));if(t==s)return r==s?Hu(e,s,n.indexOf(s+s+s)>-1,i):Uu(e,s,r,i.before||Du.before);if(t==r&&Wu(e,e.selection.main.from))return Fu(e,0,r)}return null}(e.state,n);return!!r&&(e.dispatch(r),!0)})),ju=[{key:"Backspace",run:({state:e,dispatch:t})=>{if(e.readOnly)return!1;let i=$u(e,e.selection.main.head).brackets||Du.brackets,n=null,s=e.changeByRange((t=>{if(t.empty){let n=function(e,t){let i=e.sliceString(t-2,t);return _(O(i,0))==i.length?i:i.slice(1)}(e.doc,t.head);for(let s of i)if(s==n&&Vu(e.doc,t.head)==Bu(O(s,0)))return{changes:{from:t.head-s.length,to:t.head+s.length},range:R.cursor(t.head-s.length)}}return{range:n=t}}));return n||t(e.update(s,{scrollIntoView:!0,userEvent:"delete.backward"})),!n}}];function Wu(e,t){let i=!1;return e.field(Lu).between(0,e.doc.length,(e=>{e==t&&(i=!0)})),i}function Vu(e,t){let i=e.sliceString(t,t+2);return i.slice(0,_(O(i,0)))}function Uu(e,t,i,n){let s=null,r=e.changeByRange((r=>{if(!r.empty)return{changes:[{insert:t,from:r.from},{insert:i,from:r.to}],effects:Iu.of(r.to+t.length),range:R.range(r.anchor+t.length,r.head+t.length)};let o=Vu(e.doc,r.head);return!o||/\s/.test(o)||n.indexOf(o)>-1?{changes:{insert:t+i,from:r.head},effects:Iu.of(r.head+t.length),range:R.cursor(r.head+t.length)}:{range:s=r}}));return s?null:e.update(r,{scrollIntoView:!0,userEvent:"input.type"})}function Fu(e,t,i){let n=null,s=e.changeByRange((t=>t.empty&&Vu(e.doc,t.head)==i?{changes:{from:t.head,to:t.head+i.length,insert:i},range:R.cursor(t.head+i.length)}:n={range:t}));return n?null:e.update(s,{scrollIntoView:!0,userEvent:"input.type"})}function Hu(e,t,i,n){let s=n.stringPrefixes||Du.stringPrefixes,r=null,o=e.changeByRange((n=>{if(!n.empty)return{changes:[{insert:t,from:n.from},{insert:t,from:n.to}],effects:Iu.of(n.to+t.length),range:R.range(n.anchor+t.length,n.head+t.length)};let o,a=n.head,l=Vu(e.doc,a);if(l==t){if(Xu(e,a))return{changes:{insert:t+t,from:a},effects:Iu.of(a+t.length),range:R.cursor(a+t.length)};if(Wu(e,a)){let n=i&&e.sliceDoc(a,a+3*t.length)==t+t+t?t+t+t:t;return{changes:{from:a,to:a+n.length,insert:n},range:R.cursor(a+n.length)}}}else{if(i&&e.sliceDoc(a-2*t.length,a)==t+t&&(o=Yu(e,a-2*t.length,s))>-1&&Xu(e,o))return{changes:{insert:t+t+t+t,from:a},effects:Iu.of(a+t.length),range:R.cursor(a+t.length)};if(e.charCategorizer(a)(l)!=me.Word&&Yu(e,a,s)>-1&&!function(e,t,i,n){let s=Da(e).resolveInner(t,-1),r=n.reduce(((e,t)=>Math.max(e,t.length)),0);for(let o=0;o<5;o++){let o=e.sliceDoc(s.from,Math.min(s.to,s.from+i.length+r)),a=o.indexOf(i);if(!a||a>-1&&n.indexOf(o.slice(0,a))>-1){let t=s.firstChild;for(;t&&t.from==s.from&&t.to-t.from>i.length+a;){if(e.sliceDoc(t.to-i.length,t.to)==i)return!1;t=t.firstChild}return!0}let l=s.to==t&&s.parent;if(!l)break;s=l}return!1}(e,a,t,s))return{changes:{insert:t+t,from:a},effects:Iu.of(a+t.length),range:R.cursor(a+t.length)}}return{range:r=n}}));return r?null:e.update(o,{scrollIntoView:!0,userEvent:"input.type"})}function Xu(e,t){let i=Da(e).resolveInner(t+1);return i.parent&&i.from==t}function Yu(e,t,i){let n=e.charCategorizer(t);if(n(e.sliceDoc(t-1,t))!=me.Word)return t;for(let s of i){let i=t-s.length;if(e.sliceDoc(i,t)==s&&n(e.sliceDoc(i-1,i))!=me.Word)return i}return-1}function Gu(e={}){return[hu,Fd.of(e),fu,Ku,mu]}const Zu=[{key:"Ctrl-Space",run:e=>!!e.state.field(hu,!1)&&(e.dispatch({effects:Wd.of(!0)}),!0)},{key:"Escape",run:e=>{let t=e.state.field(hu,!1);return!(!t||!t.active.some((e=>0!=e.state))||(e.dispatch({effects:Vd.of(null)}),0))}},{key:"ArrowDown",run:uu(!0)},{key:"ArrowUp",run:uu(!1)},{key:"PageDown",run:uu(!0,"page")},{key:"PageUp",run:uu(!1,"page")},{key:"Enter",run:e=>{let t=e.state.field(hu,!1);return!(e.state.readOnly||!t||!t.open||t.open.selected<0||t.open.disabled||Date.now()-t.open.timestampe.facet(Fd).defaultKeymap?[Zu]:[])));class Ju{constructor(e,t,i){this.from=e,this.to=t,this.diagnostic=i}}class ep{constructor(e,t,i){this.diagnostics=e,this.panel=t,this.selected=i}static init(e,t,i){let n=e,s=i.facet(dp).markerFilter;s&&(n=s(n));let r=Yt.set(n.map((e=>e.from==e.to||e.from==e.to-1&&i.doc.lineAt(e.from).to==e.from?Yt.widget({widget:new fp(e),diagnostic:e}).range(e.from):Yt.mark({attributes:{class:"cm-lintRange cm-lintRange-"+e.severity+(e.markClass?" "+e.markClass:"")},diagnostic:e}).range(e.from,e.to))),!0);return new ep(r,t,tp(r))}}function tp(e,t=null,i=0){let n=null;return e.between(i,1e9,((e,i,{spec:s})=>{if(!t||s.diagnostic==t)return n=new Ju(e,i,s.diagnostic),!1})),n}const ip=ae.define(),np=ae.define(),sp=ae.define(),rp=j.define({create:()=>new ep(Yt.none,null,null),update(e,t){if(t.docChanged){let i=e.diagnostics.map(t.changes),n=null;if(e.selected){let s=t.changes.mapPos(e.selected.from,1);n=tp(i,e.selected.diagnostic,s)||tp(i,null,s)}e=new ep(i,e.panel,n)}for(let i of t.effects)i.is(ip)?e=ep.init(i.value,e.panel,t.state):i.is(np)?e=new ep(e.diagnostics,i.value?gp.open:null,e.selected):i.is(sp)&&(e=new ep(e.diagnostics,e.panel,i.value));return e},provide:e=>[Kr.from(e,(e=>e.panel)),Ds.decorations.from(e,(e=>e.diagnostics))]}),op=Yt.mark({class:"cm-lintRange cm-lintRange-active"});function ap(e,t,i){let{diagnostics:n}=e.state.field(rp),s=[],r=2e8,o=0;n.between(t-(i<0?1:0),t+(i>0?1:0),((e,n,{spec:a})=>{t>=e&&t<=n&&(e==n||(t>e||i>0)&&(t({dom:lp(e,s)})}:null}function lp(e,t){return Pc("ul",{class:"cm-tooltip-lint"},t.map((t=>pp(e,t,!1))))}const hp=e=>{let t=e.state.field(rp,!1);return!(!t||!t.panel||(e.dispatch({effects:np.of(!1)}),0))},cp=[{key:"Mod-Shift-m",run:e=>{let t=e.state.field(rp,!1);var i,n;t&&t.panel||e.dispatch({effects:(i=e.state,n=[np.of(!0)],i.field(rp,!1)?n:n.concat(ae.appendConfig.of(bp)))});let s=Xr(e,gp.open);return s&&s.dom.querySelector(".cm-panel-lint ul").focus(),!0},preventDefault:!0},{key:"F8",run:e=>{let t=e.state.field(rp,!1);if(!t)return!1;let i=e.state.selection.main,n=t.diagnostics.iter(i.to+1);return!(!n.value&&(n=t.diagnostics.iter(0),!n.value||n.from==i.from&&n.to==i.to)||(e.dispatch({selection:{anchor:n.from,head:n.to},scrollIntoView:!0}),0))}}],dp=q.define({combine:e=>Object.assign({sources:e.map((e=>e.source))},be(e.map((e=>e.config)),{delay:750,markerFilter:null,tooltipFilter:null,needsRefresh:null},{needsRefresh:(e,t)=>e?t?i=>e(i)||t(i):e:t}))});function up(e){let t=[];if(e)e:for(let{name:i}of e){for(let e=0;ee.toLowerCase()==n.toLowerCase()))){t.push(n);continue e}}t.push("")}return t}function pp(e,t,i){var n;let s=i?up(t.actions):[];return Pc("li",{class:"cm-diagnostic cm-diagnostic-"+t.severity},Pc("span",{class:"cm-diagnosticText"},t.renderMessage?t.renderMessage():t.message),null===(n=t.actions)||void 0===n?void 0:n.map(((i,n)=>{let r=!1,o=n=>{if(n.preventDefault(),r)return;r=!0;let s=tp(e.state.field(rp).diagnostics,t);s&&i.apply(e,s.from,s.to)},{name:a}=i,l=s[n]?a.indexOf(s[n]):-1,h=l<0?a:[a.slice(0,l),Pc("u",a.slice(l,l+1)),a.slice(l+1)];return Pc("button",{type:"button",class:"cm-diagnosticAction",onclick:o,onmousedown:o,"aria-label":` Action: ${a}${l<0?"":` (access key "${s[n]})"`}.`},h)})),t.source&&Pc("div",{class:"cm-diagnosticSource"},t.source))}class fp extends Ht{constructor(e){super(),this.diagnostic=e}eq(e){return e.diagnostic==this.diagnostic}toDOM(){return Pc("span",{class:"cm-lintPoint cm-lintPoint-"+this.diagnostic.severity})}}class mp{constructor(e,t){this.diagnostic=t,this.id="item_"+Math.floor(4294967295*Math.random()).toString(16),this.dom=pp(e,t,!0),this.dom.id=this.id,this.dom.setAttribute("role","option")}}class gp{constructor(e){this.view=e,this.items=[],this.list=Pc("ul",{tabIndex:0,role:"listbox","aria-label":this.view.state.phrase("Diagnostics"),onkeydown:t=>{if(27==t.keyCode)hp(this.view),this.view.focus();else if(38==t.keyCode||33==t.keyCode)this.moveSelection((this.selectedIndex-1+this.items.length)%this.items.length);else if(40==t.keyCode||34==t.keyCode)this.moveSelection((this.selectedIndex+1)%this.items.length);else if(36==t.keyCode)this.moveSelection(0);else if(35==t.keyCode)this.moveSelection(this.items.length-1);else if(13==t.keyCode)this.view.focus();else{if(!(t.keyCode>=65&&t.keyCode<=90&&this.selectedIndex>=0))return;{let{diagnostic:i}=this.items[this.selectedIndex],n=up(i.actions);for(let s=0;s{for(let t=0;thp(this.view)},"ร—")),this.update()}get selectedIndex(){let e=this.view.state.field(rp).selected;if(!e)return-1;for(let t=0;t{let a,l=-1;for(let e=i;ei&&(this.items.splice(i,l-i),n=!0)),t&&a.diagnostic==t.diagnostic?a.dom.hasAttribute("aria-selected")||(a.dom.setAttribute("aria-selected","true"),s=a):a.dom.hasAttribute("aria-selected")&&a.dom.removeAttribute("aria-selected"),i++}));i({sel:s.dom.getBoundingClientRect(),panel:this.list.getBoundingClientRect()}),write:({sel:e,panel:t})=>{let i=t.height/this.list.offsetHeight;e.topt.bottom&&(this.list.scrollTop+=(e.bottom-t.bottom)/i)}})):this.selectedIndex<0&&this.list.removeAttribute("aria-activedescendant"),n&&this.sync()}sync(){let e=this.list.firstChild;function t(){let t=e;e=t.nextSibling,t.remove()}for(let i of this.items)if(i.dom.parentNode==this.list){for(;e!=i.dom;)t();e=i.dom.nextSibling}else this.list.insertBefore(i.dom,e);for(;e;)t()}moveSelection(e){if(this.selectedIndex<0)return;let t=tp(this.view.state.field(rp).diagnostics,this.items[e].diagnostic);t&&this.view.dispatch({selection:{anchor:t.from,head:t.to},scrollIntoView:!0,effects:sp.of(t)})}static open(e){return new gp(e)}}function vp(e){return function(e,t='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,${encodeURIComponent(e)}')`}(``,'width="6" height="3"')}const Op=Ds.baseTheme({".cm-diagnostic":{padding:"3px 6px 3px 8px",marginLeft:"-1px",display:"block",whiteSpace:"pre-wrap"},".cm-diagnostic-error":{borderLeft:"5px solid #d11"},".cm-diagnostic-warning":{borderLeft:"5px solid orange"},".cm-diagnostic-info":{borderLeft:"5px solid #999"},".cm-diagnostic-hint":{borderLeft:"5px solid #66d"},".cm-diagnosticAction":{font:"inherit",border:"none",padding:"2px 4px",backgroundColor:"#444",color:"white",borderRadius:"3px",marginLeft:"8px",cursor:"pointer"},".cm-diagnosticSource":{fontSize:"70%",opacity:.7},".cm-lintRange":{backgroundPosition:"left bottom",backgroundRepeat:"repeat-x",paddingBottom:"0.7px"},".cm-lintRange-error":{backgroundImage:vp("#d11")},".cm-lintRange-warning":{backgroundImage:vp("orange")},".cm-lintRange-info":{backgroundImage:vp("#999")},".cm-lintRange-hint":{backgroundImage:vp("#66d")},".cm-lintRange-active":{backgroundColor:"#ffdd9980"},".cm-tooltip-lint":{padding:0,margin:0},".cm-lintPoint":{position:"relative","&:after":{content:'""',position:"absolute",bottom:0,left:"-2px",borderLeft:"3px solid transparent",borderRight:"3px solid transparent",borderBottom:"4px solid #d11"}},".cm-lintPoint-warning":{"&:after":{borderBottomColor:"orange"}},".cm-lintPoint-info":{"&:after":{borderBottomColor:"#999"}},".cm-lintPoint-hint":{"&:after":{borderBottomColor:"#66d"}},".cm-panel.cm-panel-lint":{position:"relative","& ul":{maxHeight:"100px",overflowY:"auto","& [aria-selected]":{backgroundColor:"#ddd","& u":{textDecoration:"underline"}},"&:focus [aria-selected]":{background_fallback:"#bdf",backgroundColor:"Highlight",color_fallback:"white",color:"HighlightText"},"& u":{textDecoration:"none"},padding:0,margin:0},"& [name=close]":{position:"absolute",top:"0",right:"2px",background:"inherit",border:"none",font:"inherit",padding:0,margin:0}}}),bp=[rp,Ds.decorations.compute([rp],(e=>{let{selected:t,panel:i}=e.field(rp);return t&&i&&t.from!=t.to?Yt.set([op.range(t.from,t.to)]):Yt.none})),Vr(ap,{hideOn:function(e,t){let i=e.startState.doc.lineAt(t.pos);return!(!e.effects.some((e=>e.is(ip)))&&!e.changes.touchesRange(i.from,i.to))}}),Op],_p=(()=>[Oo(),yo,Or(),gh(),Tl(),tr(),[hr,cr],Oe.allowMultipleSelections.of(!0),Oe.transactionFilter.of((e=>{if(!e.docChanged||!e.isUserEvent("input.type")&&!e.isUserEvent("input.complete"))return e;let t=e.startState.languageDataAt("indentOnInput",e.startState.selection.main.head);if(!t.length)return e;let i=e.newDoc,{head:n}=e.newSelection.main,s=i.lineAt(n);if(n>s.from+200)return e;let r=i.sliceString(s.from,n);if(!t.some((e=>e.test(r))))return e;let{state:o}=e,a=-1,l=[];for(let{head:e}of o.selection.ranges){let t=o.doc.lineAt(e);if(t.from==a)continue;a=t.from;let i=Xa(o,t.from);if(null==i)continue;let n=/^\s*/.exec(t.text)[0],s=Ha(o,i);n!=s&&l.push({from:t.from,to:t.from+n.length,insert:s})}return l.length?[e,{changes:l,sequential:!0}]:e})),Rl(ql,{fallback:!0}),Ul(),[zu,Lu],Gu(),Tr(),Mr(),xr,Uc(),zs.of([...ju,...Cc,...kd,...Dh,...vl,...Zu,...cp])])();class yp{constructor(e,t,i,n,s,r,o,a,l,h=0,c){this.p=e,this.stack=t,this.state=i,this.reducePos=n,this.pos=s,this.score=r,this.buffer=o,this.bufferBase=a,this.curContext=l,this.lookAhead=h,this.parent=c}toString(){return`[${this.stack.filter(((e,t)=>t%3==0)).concat(this.state)}]@${this.pos}${this.score?"!"+this.score:""}`}static start(e,t,i=0){let n=e.parser.context;return new yp(e,[],t,i,i,0,[],0,n?new wp(n,n.start):null,0,null)}get context(){return this.curContext?this.curContext.context:null}pushState(e,t){this.stack.push(this.state,t,this.bufferBase+this.buffer.length),this.state=e}reduce(e){var t;let i=e>>19,n=65535&e,{parser:s}=this.p,r=s.dynamicPrecedence(n);if(r&&(this.score+=r),0==i)return this.pushState(s.getGoto(this.state,n,!0),this.reducePos),n=2e3&&!(null===(t=this.p.parser.nodeSet.types[n])||void 0===t?void 0:t.isAnonymous)&&(a==this.p.lastBigReductionStart?(this.p.bigReductionCount++,this.p.lastBigReductionSize=l):this.p.lastBigReductionSizeo;)this.stack.pop();this.reduceContext(n,a)}storeNode(e,t,i,n=4,s=!1){if(0==e&&(!this.stack.length||this.stack[this.stack.length-1]0&&0==e.buffer[n-4]&&e.buffer[n-1]>-1){if(t==i)return;if(e.buffer[n-2]>=t)return void(e.buffer[n-2]=i)}}if(s&&this.pos!=i){let s=this.buffer.length;if(s>0&&0!=this.buffer[s-4])for(;s>0&&this.buffer[s-2]>i;)this.buffer[s]=this.buffer[s-4],this.buffer[s+1]=this.buffer[s-3],this.buffer[s+2]=this.buffer[s-2],this.buffer[s+3]=this.buffer[s-1],s-=4,n>4&&(n-=4);this.buffer[s]=e,this.buffer[s+1]=t,this.buffer[s+2]=i,this.buffer[s+3]=n}else this.buffer.push(e,t,i,n)}shift(e,t,i,n){if(131072&e)this.pushState(65535&e,this.pos);else if(0==(262144&e)){let s=e,{parser:r}=this.p;(n>this.pos||t<=r.maxNode)&&(this.pos=n,r.stateFlag(s,1)||(this.reducePos=n)),this.pushState(s,i),this.shiftContext(t,i),t<=r.maxNode&&this.buffer.push(t,i,n,4)}else this.pos=n,this.shiftContext(t,i),t<=this.p.parser.maxNode&&this.buffer.push(t,i,n,4)}apply(e,t,i,n){65536&e?this.reduce(e):this.shift(e,t,i,n)}useNode(e,t){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(this.p.reused.push(e),i++);let n=this.pos;this.reducePos=this.pos=n+e.length,this.pushState(t,n),this.buffer.push(i,n,this.reducePos,-1),this.curContext&&this.updateContext(this.curContext.tracker.reuse(this.curContext.context,e,this,this.p.stream.reset(this.pos-e.length)))}split(){let e=this,t=e.buffer.length;for(;t>0&&e.buffer[t-2]>e.reducePos;)t-=4;let i=e.buffer.slice(t),n=e.bufferBase+t;for(;e&&n==e.bufferBase;)e=e.parent;return new yp(this.p,this.stack.slice(),this.state,this.reducePos,this.pos,this.score,i,n,this.curContext,this.lookAhead,e)}recoverByDelete(e,t){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,this.pos,t,4),this.storeNode(0,this.pos,t,i?8:4),this.pos=this.reducePos=t,this.score-=190}canShift(e){for(let t=new xp(this);;){let i=this.p.parser.stateSlot(t.state,4)||this.p.parser.hasAction(t.state,e);if(0==i)return!1;if(0==(65536&i))return!0;t.reduce(i)}}recoverByInsert(e){if(this.stack.length>=300)return[];let t=this.p.parser.nextStates(this.state);if(t.length>8||this.stack.length>=120){let i=[];for(let n,s=0;s1&t&&e==n))||i.push(t[e],n)}t=i}let i=[];for(let e=0;e>19,n=65535&t,s=this.stack.length-3*i;if(s<0||e.getGoto(this.stack[s],n,!1)<0){let e=this.findForcedReduction();if(null==e)return!1;t=e}this.storeNode(0,this.pos,this.pos,4,!0),this.score-=100}return this.reducePos=this.pos,this.reduce(t),!0}findForcedReduction(){let{parser:e}=this.p,t=[],i=(n,s)=>{if(!t.includes(n))return t.push(n),e.allActions(n,(t=>{if(393216&t);else if(65536&t){let i=(t>>19)-s;if(i>1){let n=65535&t,s=this.stack.length-3*i;if(s>=0&&e.getGoto(this.stack[s],n,!1)>=0)return i<<19|65536|n}}else{let e=i(t,s+1);if(null!=e)return e}}))};return i(this.state,0)}forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceReduce()){this.storeNode(0,this.pos,this.pos,4,!0);break}return this}get deadEnd(){if(3!=this.stack.length)return!1;let{parser:e}=this.p;return 65535==e.data[e.stateSlot(this.state,1)]&&!e.stateSlot(this.state,4)}restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack[0],this.stack.length=0}sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)return!1;for(let t=0;tthis.lookAhead&&(this.emitLookAhead(),this.lookAhead=e)}close(){this.curContext&&this.curContext.tracker.strict&&this.emitContext(),this.lookAhead>0&&this.emitLookAhead()}}class wp{constructor(e,t){this.tracker=e,this.context=t,this.hash=e.strict?e.hash(t):0}}class xp{constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.base=this.stack.length}reduce(e){let t=65535&e,i=e>>19;0==i?(this.stack==this.start.stack&&(this.stack=this.stack.slice()),this.stack.push(this.state,0,0),this.base+=3):this.base-=3*(i-1);let n=this.start.p.parser.getGoto(this.stack[this.base-3],t,!0);this.state=n}}class Sp{constructor(e,t,i){this.stack=e,this.pos=t,this.index=i,this.buffer=e.buffer,0==this.index&&this.maybeNext()}static create(e,t=e.bufferBase+e.buffer.length){return new Sp(e,t,t-e.bufferBase)}maybeNext(){let e=this.stack.parent;null!=e&&(this.index=this.stack.bufferBase-e.bufferBase,this.stack=e,this.buffer=e.buffer)}get id(){return this.buffer[this.index-4]}get start(){return this.buffer[this.index-3]}get end(){return this.buffer[this.index-2]}get size(){return this.buffer[this.index-1]}next(){this.index-=4,this.pos-=4,0==this.index&&this.maybeNext()}fork(){return new Sp(this.stack,this.pos,this.index)}}function kp(e,t=Uint16Array){if("string"!=typeof e)return e;let i=null;for(let n=0,s=0;n=92&&t--,t>=34&&t--;let s=t-32;if(s>=46&&(s-=46,i=!0),r+=s,i)break;r*=46}i?i[s++]=r:i=new t(r)}return i}class Tp{constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,this.lookAhead=0,this.mask=0,this.context=0}}const Cp=new Tp;class Pp{constructor(e,t){this.input=e,this.ranges=t,this.chunk="",this.chunkOff=0,this.chunk2="",this.chunk2Pos=0,this.next=-1,this.token=Cp,this.rangeIndex=0,this.pos=this.chunkPos=t[0].from,this.range=t[0],this.end=t[t.length-1].to,this.readNext()}resolveOffset(e,t){let i=this.range,n=this.rangeIndex,s=this.pos+e;for(;si.to:s>=i.to;){if(n==this.ranges.length-1)return null;let e=this.ranges[++n];s+=e.from-i.to,i=e}return s}clipPos(e){if(e>=this.range.from&&ee)return Math.max(e,t.from);return this.end}peek(e){let t,i,n=this.chunkOff+e;if(n>=0&&n=this.chunk2Pos&&tn.to&&(this.chunk2=this.chunk2.slice(0,n.to-t)),i=this.chunk2.charCodeAt(0)}}return t>=this.token.lookAhead&&(this.token.lookAhead=t+1),i}acceptToken(e,t=0){let i=t?this.resolveOffset(t,-1):this.pos;if(null==i||i=this.chunk2Pos&&this.posthis.range.to?e.slice(0,this.range.to-this.pos):e,this.chunkPos=this.pos,this.chunkOff=0}}readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),this.chunkOff==this.chunk.length)?this.next=-1:this.next=this.chunk.charCodeAt(this.chunkOff)}advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.rangeIndex==this.ranges.length-1)return this.setDone();e-=this.range.to-this.pos,this.range=this.ranges[++this.rangeIndex],this.pos=this.range.from}return this.pos+=e,this.pos>=this.token.lookAhead&&(this.token.lookAhead=this.pos+1),this.readNext()}setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[this.rangeIndex=this.ranges.length-1],this.chunk="",this.next=-1}reset(e,t){if(t?(this.token=t,t.start=e,t.lookAhead=e+1,t.value=t.extended=-1):this.token=Cp,this.pos!=e){if(this.pos=e,e==this.end)return this.setDone(),this;for(;e=this.range.to;)this.range=this.ranges[++this.rangeIndex];e>=this.chunkPos&&e=this.chunkPos&&t<=this.chunkPos+this.chunk.length)return this.chunk.slice(e-this.chunkPos,t-this.chunkPos);if(e>=this.chunk2Pos&&t<=this.chunk2Pos+this.chunk2.length)return this.chunk2.slice(e-this.chunk2Pos,t-this.chunk2Pos);if(e>=this.range.from&&t<=this.range.to)return this.input.read(e,t);let i="";for(let n of this.ranges){if(n.from>=t)break;n.to>e&&(i+=this.input.read(Math.max(n.from,e),Math.min(n.to,t)))}return i}}class Mp{constructor(e,t){this.data=e,this.id=t}token(e,t){let{parser:i}=t.p;!function(e,t,i,n,s,r){let o=0,a=1<0){let i=e[n];if(l.allows(i)&&(-1==t.token.value||t.token.value==i||Rp(i,t.token.value,s,r))){t.acceptToken(i);break}}let n=t.next,h=0,c=e[o+2];if(!(t.next<0&&c>h&&65535==e[i+3*c-3]&&65535==e[i+3*c-3])){for(;h>1,r=i+s+(s<<1),a=e[r],l=e[r+1]||65536;if(n=l)){o=e[r+2],t.advance();continue e}h=s+1}}break}o=e[i+3*c-1]}}(this.data,e,t,this.id,i.data,i.tokenPrecTable)}}Mp.prototype.contextual=Mp.prototype.fallback=Mp.prototype.extend=!1,Mp.prototype.fallback=Mp.prototype.extend=!1;class Ep{constructor(e,t={}){this.token=e,this.contextual=!!t.contextual,this.fallback=!!t.fallback,this.extend=!!t.extend}}function Ap(e,t,i){for(let n,s=t;65535!=(n=e[s]);s++)if(n==i)return s-t;return-1}function Rp(e,t,i,n){let s=Ap(i,n,t);return s<0||Ap(i,n,e)t)&&!n.type.isError)return i<0?Math.max(0,Math.min(n.to-1,t-25)):Math.min(e.length,Math.max(n.from+1,t+25));if(i<0?n.prevSibling():n.nextSibling())break;if(!n.parent())return i<0?0:e.length}}class Lp{constructor(e,t){this.fragments=e,this.nodeSet=t,this.i=0,this.fragment=null,this.safeFrom=-1,this.safeTo=-1,this.trees=[],this.start=[],this.index=[],this.nextFragment()}nextFragment(){let e=this.fragment=this.i==this.fragments.length?null:this.fragments[this.i++];if(e){for(this.safeFrom=e.openStart?qp(e.tree,e.from+e.offset,1)-e.offset:e.from,this.safeTo=e.openEnd?qp(e.tree,e.to+e.offset,-1)-e.offset:e.to;this.trees.length;)this.trees.pop(),this.start.pop(),this.index.pop();this.trees.push(e.tree),this.start.push(-e.offset),this.index.push(0),this.nextStart=this.safeFrom}else this.nextStart=1e9}nodeAt(e){if(ee)return this.nextStart=r,null;if(s instanceof Do){if(r==e){if(r=Math.max(this.safeFrom,e)&&(this.trees.push(s),this.start.push(r),this.index.push(0))}else this.index[t]++,this.nextStart=r+s.length}}}class Np{constructor(e,t){this.stream=t,this.tokens=[],this.mainToken=null,this.actions=[],this.tokens=e.tokenizers.map((e=>new Tp))}getActions(e){let t=0,i=null,{parser:n}=e.p,{tokenizers:s}=n,r=n.stateSlot(e.state,3),o=e.curContext?e.curContext.hash:0,a=0;for(let n=0;nh.end+25&&(a=Math.max(h.lookAhead,a)),0!=h.value)){let n=t;if(h.extended>-1&&(t=this.addActions(e,h.extended,h.end,t)),t=this.addActions(e,h.value,h.end,t),!l.extend&&(i=h,t>n))break}}for(;this.actions.length>t;)this.actions.pop();return a&&e.setLookAhead(a),i||e.pos!=this.stream.end||(i=new Tp,i.value=e.p.parser.eofTerm,i.start=i.end=e.pos,t=this.addActions(e,i.value,i.end,t)),this.mainToken=i,this.actions}getMainToken(e){if(this.mainToken)return this.mainToken;let t=new Tp,{pos:i,p:n}=e;return t.start=i,t.end=Math.min(i+1,n.stream.end),t.value=i==n.stream.end?n.parser.eofTerm:0,t}updateCachedToken(e,t,i){let n=this.stream.clipPos(i.pos);if(t.token(this.stream.reset(n,e),i),e.value>-1){let{parser:t}=i.p;for(let n=0;n=0&&i.p.parser.dialect.allows(s>>1)){0==(1&s)?e.value=s>>1:e.extended=s>>1;break}}}else e.value=0,e.end=this.stream.clipPos(n+1)}putAction(e,t,i,n){for(let t=0;t4*e.bufferLength?new Lp(i,e.nodeSet):null}get parsedPos(){return this.minStackPos}advance(){let e,t,i=this.stacks,n=this.minStackPos,s=this.stacks=[];if(this.bigReductionCount>300&&1==i.length){let[e]=i;for(;e.forceReduce()&&e.stack.length&&e.stack[e.stack.length-2]>=this.lastBigReductionStart;);this.bigReductionCount=this.lastBigReductionSize=0}for(let r=0;rn)s.push(o);else{if(this.advanceStack(o,s,i))continue;{e||(e=[],t=[]),e.push(o);let i=this.tokens.getMainToken(o);t.push(i.value,i.end)}}break}}if(!s.length){let t=e&&function(e){let t=null;for(let i of e){let e=i.p.stoppedAt;(i.pos==i.p.stream.end||null!=e&&i.pos>e)&&i.p.parser.stateFlag(i.state,2)&&(!t||t.scorethis.stoppedAt?e[0]:this.runRecovery(e,t,s);if(i)return Dp&&console.log("Force-finish "+this.stackID(i)),this.stackToTree(i.forceAll())}if(this.recovering){let e=1==this.recovering?1:3*this.recovering;if(s.length>e)for(s.sort(((e,t)=>t.score-e.score));s.length>e;)s.pop();s.some((e=>e.reducePos>n))&&this.recovering--}else if(s.length>1){e:for(let e=0;e500&&n.buffer.length>500){if(!((t.score-n.score||t.buffer.length-n.buffer.length)>0)){s.splice(e--,1);continue e}s.splice(i--,1)}}}s.length>12&&s.splice(12,s.length-12)}this.minStackPos=s[0].pos;for(let e=1;e ":"";if(null!=this.stoppedAt&&n>this.stoppedAt)return e.forceReduce()?e:null;if(this.fragments){let t=e.curContext&&e.curContext.tracker.strict,i=t?e.curContext.hash:0;for(let o=this.fragments.nodeAt(n);o;){let n=this.parser.nodeSet.types[o.type.id]==o.type?s.getGoto(e.state,o.type.id):-1;if(n>-1&&o.length&&(!t||(o.prop(ko.contextHash)||0)==i))return e.useNode(o,n),Dp&&console.log(r+this.stackID(e)+` (via reuse of ${s.getName(o.type.id)})`),!0;if(!(o instanceof Do)||0==o.children.length||o.positions[0]>0)break;let a=o.children[0];if(!(a instanceof Do&&0==o.positions[0]))break;o=a}}let o=s.stateSlot(e.state,4);if(o>0)return e.reduce(o),Dp&&console.log(r+this.stackID(e)+` (via always-reduce ${s.getName(65535&o)})`),!0;if(e.stack.length>=9e3)for(;e.stack.length>6e3&&e.forceReduce(););let a=this.tokens.getActions(e);for(let o=0;on?t.push(u):i.push(u)}return!1}advanceFully(e,t){let i=e.pos;for(;;){if(!this.advanceStack(e,null,null))return!1;if(e.pos>i)return $p(e,t),!0}}runRecovery(e,t,i){let n=null,s=!1;for(let r=0;r ":"";if(o.deadEnd){if(s)continue;if(s=!0,o.restart(),Dp&&console.log(h+this.stackID(o)+" (restarted)"),this.advanceFully(o,i))continue}let c=o.split(),d=h;for(let e=0;c.forceReduce()&&e<10&&(Dp&&console.log(d+this.stackID(c)+" (via force-reduce)"),!this.advanceFully(c,i));e++)Dp&&(d=this.stackID(c)+" -> ");for(let e of o.recoverByInsert(a))Dp&&console.log(h+this.stackID(e)+" (via recover-insert)"),this.advanceFully(e,i);this.stream.end>o.pos?(l==o.pos&&(l++,a=0),o.recoverByDelete(a,l),Dp&&console.log(h+this.stackID(o)+` (via recover-delete ${this.parser.getName(a)})`),$p(o,i)):(!n||n.scoree;class jp extends Jo{constructor(e){if(super(),this.wrappers=[],14!=e.version)throw new RangeError(`Parser version (${e.version}) doesn't match runtime version (14)`);let t=e.nodeNames.split(" ");this.minRepeatTerm=t.length;for(let i=0;ie.topRules[t][1])),n=[];for(let e=0;e=0)s(n,e,t[i++]);else{let r=t[i+-n];for(let o=-n;o>0;o--)s(t[i++],e,r);i++}}}this.nodeSet=new Mo(t.map(((t,s)=>Po.define({name:s>=this.minRepeatTerm?void 0:t,id:s,props:n[s],top:i.indexOf(s)>-1,error:0==s,skipped:e.skippedNodes&&e.skippedNodes.indexOf(s)>-1})))),e.propSources&&(this.nodeSet=this.nodeSet.extend(...e.propSources)),this.strict=!1,this.bufferLength=wo;let r=kp(e.tokenData);this.context=e.context,this.specializerSpecs=e.specialized||[],this.specialized=new Uint16Array(this.specializerSpecs.length);for(let e=0;e"number"==typeof e?new Mp(r,e):e)),this.topRules=e.topRules,this.dialects=e.dialects||{},this.dynamicPrecedences=e.dynamicPrecedences||null,this.tokenPrecTable=e.tokenPrec,this.termNames=e.termNames||null,this.maxNode=this.nodeSet.types.length-1,this.dialect=this.parseDialect(),this.top=this.topRules[Object.keys(this.topRules)[0]]}createParse(e,t,i){let n=new Bp(this,e,t,i);for(let s of this.wrappers)n=s(n,e,t,i);return n}getGoto(e,t,i=!1){let n=this.goto;if(t>=n[0])return-1;for(let s=n[t+1];;){let t=n[s++],r=1&t,o=n[s++];if(r&&i)return o;for(let i=s+(t>>1);s0}validAction(e,t){return!!this.allActions(e,(e=>e==t||null))}allActions(e,t){let i=this.stateSlot(e,4),n=i?t(i):void 0;for(let i=this.stateSlot(e,1);null==n;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=Wp(this.data,i+2)}n=t(Wp(this.data,i+1))}return n}nextStates(e){let t=[];for(let i=this.stateSlot(e,1);;i+=3){if(65535==this.data[i]){if(1!=this.data[i+1])break;i=Wp(this.data,i+2)}if(0==(1&this.data[i+2])){let e=this.data[i+1];t.some(((t,i)=>1&i&&t==e))||t.push(this.data[i],e)}}return t}configure(e){let t=Object.assign(Object.create(jp.prototype),this);if(e.props&&(t.nodeSet=this.nodeSet.extend(...e.props)),e.top){let i=this.topRules[e.top];if(!i)throw new RangeError(`Invalid top rule name ${e.top}`);t.top=i}return e.tokenizers&&(t.tokenizers=this.tokenizers.map((t=>{let i=e.tokenizers.find((e=>e.from==t));return i?i.to:t}))),e.specializers&&(t.specializers=this.specializers.slice(),t.specializerSpecs=this.specializerSpecs.map(((i,n)=>{let s=e.specializers.find((e=>e.from==i.external));if(!s)return i;let r=Object.assign(Object.assign({},i),{external:s.to});return t.specializers[n]=Vp(r),r}))),e.contextTracker&&(t.context=e.contextTracker),e.dialect&&(t.dialect=this.parseDialect(e.dialect)),null!=e.strict&&(t.strict=e.strict),e.wrap&&(t.wrappers=t.wrappers.concat(e.wrap)),null!=e.bufferLength&&(t.bufferLength=e.bufferLength),t}hasWrappers(){return this.wrappers.length>0}getName(e){return this.termNames?this.termNames[e]:String(e<=this.maxNode&&this.nodeSet.types[e].name||e)}get eofTerm(){return this.maxNode+1}get topNode(){return this.nodeSet.types[this.top[1]]}dynamicPrecedence(e){let t=this.dynamicPrecedences;return null==t?0:t[e]||0}parseDialect(e){let t=Object.keys(this.dialects),i=t.map((()=>!1));if(e)for(let n of e.split(" ")){let e=t.indexOf(n);e>=0&&(i[e]=!0)}let n=null;for(let e=0;ee.external(i,n)<<1|t}return e.get}const Up=new Set([27,51,52,270,67,133,58,59,251,64,65,74,62,63,154,155,158,115]);function Fp(e){return 10==e||13==e}const Hp=new Ep(((e,t)=>{let i;if(e.next<0)e.acceptToken(206);else if(t.context.depth<0)Fp(e.next)&&e.acceptToken(205,1);else if(((i=e.peek(-1))<0||Fp(i))&&t.canShift(204)){let t=0;for(;32==e.next||9==e.next;)e.advance(),t++;10!=e.next&&13!=e.next&&35!=e.next||e.acceptToken(204,-t)}else Fp(e.next)&&e.acceptToken(203,1)}),{contextual:!0}),Xp=new Ep(((e,t)=>{let i=t.context.depth;if(i<0)return;let n=e.peek(-1);if(10==n||13==n){let t=0,n=0;for(;;){if(32==e.next)t++;else{if(9!=e.next)break;t+=8-t%8}e.advance(),n++}t!=i&&10!=e.next&&13!=e.next&&35!=e.next&&(t0),this.strict=!1!==e.strict}}({start:Gp,reduce:(e,t)=>e.depth<0&&Up.has(t)?e.parent:e,shift:(e,t,i,n)=>201==t?new Yp(e,function(e){let t=0;for(let i=0;ie.hash}),Kp=new Ep((e=>{for(let t=0;t<5;t++){if(e.next!="print".charCodeAt(t))return;e.advance()}if(!/\w/.test(String.fromCharCode(e.next)))for(let t=0;;t++){let i=e.peek(t);if(32!=i&&9!=i)return void(40!=i&&46!=i&&10!=i&&13!=i&&35!=i&&e.acceptToken(1))}}));function Jp(e,t,i,n,s){return new Ep((r=>{let o=r.pos;for(;!(r.next<0);)if(123==r.next){if(123!=r.peek(1)){if(r.pos==o)return void r.acceptToken(n,1);break}r.advance(2)}else if(92==r.next)r.advance(),r.next>=0&&r.advance();else{if(r.next==e&&(1==t||r.peek(1)==e&&r.peek(2)==e)){if(r.pos==o)return void r.acceptToken(s,t);break}r.advance()}r.pos>o&&r.acceptToken(i)}))}const ef=Jp(39,1,207,2,208),tf=Jp(34,1,209,3,210),nf=Jp(39,3,211,4,212),sf=Jp(34,3,213,5,214),rf=ra({'async "*" "**" FormatConversion FormatSpec':Ta.modifier,"for while if elif else try except finally return raise break continue with pass assert await yield match case":Ta.controlKeyword,"in not and or is del":Ta.operatorKeyword,"from def class global nonlocal lambda":Ta.definitionKeyword,import:Ta.moduleKeyword,"with as print":Ta.keyword,Boolean:Ta.bool,None:Ta.null,VariableName:Ta.variableName,"CallExpression/VariableName":Ta.function(Ta.variableName),"FunctionDefinition/VariableName":Ta.function(Ta.definition(Ta.variableName)),"ClassDefinition/VariableName":Ta.definition(Ta.className),PropertyName:Ta.propertyName,"CallExpression/MemberExpression/PropertyName":Ta.function(Ta.propertyName),Comment:Ta.lineComment,Number:Ta.number,String:Ta.string,FormatString:Ta.special(Ta.string),UpdateOp:Ta.updateOperator,"ArithOp!":Ta.arithmeticOperator,BitOp:Ta.bitwiseOperator,CompareOp:Ta.compareOperator,AssignOp:Ta.definitionOperator,Ellipsis:Ta.punctuation,At:Ta.meta,"( )":Ta.paren,"[ ]":Ta.squareBracket,"{ }":Ta.brace,".":Ta.derefOperator,", ;":Ta.separator}),of={__proto__:null,await:48,or:58,and:60,in:64,not:66,is:68,if:74,else:76,lambda:80,yield:98,from:100,async:106,for:108,None:168,True:170,False:170,del:184,pass:188,break:192,continue:196,return:200,raise:208,import:212,as:214,global:218,nonlocal:220,assert:224,type:229,elif:242,while:246,try:252,except:254,finally:256,with:260,def:264,class:274,match:285,case:291},af=jp.deserialize({version:14,states:"#&jO`Q#yOOP$bOSOOO%kQ&nO'#HcOOQS'#Cq'#CqOOQS'#Cr'#CrO'ZQ#xO'#CpO(|Q&nO'#HbOOQS'#Hc'#HcOOQS'#DW'#DWOOQS'#Hb'#HbO)jQ#xO'#DaO)}Q#xO'#DhO*_Q#xO'#DlOOQS'#Dw'#DwO*rO,UO'#DwO*zO7[O'#DwO+SOWO'#DxO+_O`O'#DxO+jOpO'#DxO+uO!bO'#DxO-wQ&nO'#HSOOQS'#HS'#HSO'ZQ#xO'#HRO/ZQ&nO'#HROOQS'#Ee'#EeO/rQ#xO'#EfOOQS'#HQ'#HQO/|Q#xO'#HPOOQV'#HP'#HPO0XQ#xO'#F]OOQS'#Ge'#GeO0^Q#xO'#F[OOQV'#IY'#IYOOQV'#HO'#HOOOQV'#Ft'#FtQ`Q#yOOO'ZQ#xO'#CsO0lQ#xO'#DPO0sQ#xO'#DTO1RQ#xO'#HgO1cQ&nO'#EYO'ZQ#xO'#EZOOQS'#E]'#E]OOQS'#E_'#E_OOQS'#Ea'#EaO1wQ#xO'#EcO2_Q#xO'#EgO0XQ#xO'#EiO2rQ&nO'#EiO0XQ#xO'#ElO/rQ#xO'#EoO0XQ#xO'#EqO/rQ#xO'#EwO/rQ#xO'#EzO2}Q#xO'#E|O3UQ#xO'#FRO3aQ#xO'#E}O/rQ#xO'#FRO0XQ#xO'#FTO0XQ#xO'#FYO3fQ#xO'#F_P3mO#xO'#G}POOO)CBq)CBqOOQS'#Cg'#CgOOQS'#Ch'#ChOOQS'#Ci'#CiOOQS'#Cj'#CjOOQS'#Ck'#CkOOQS'#Cl'#ClOOQS'#Cn'#CnO'ZQ#xO,59QO'ZQ#xO,59QO'ZQ#xO,59QO'ZQ#xO,59QO'ZQ#xO,59QO'ZQ#xO,59QO3xQ#xO'#DqOOQS,5:[,5:[O4]Q#xO'#HqOOQS,5:_,5:_O4jQMlO,5:_O4oQ&nO,59[O0lQ#xO,59dO0lQ#xO,59dO0lQ#xO,59dO7_Q#xO,59dO7dQ#xO,59dO7kQ#xO,59lO7rQ#xO'#HbO8xQ#xO'#HaOOQS'#Ha'#HaOOQS'#D^'#D^O9aQ#xO,59cO'ZQ#xO,59cO9oQ#xO,59cOOQS,59{,59{O9tQ#xO,5:TO'ZQ#xO,5:TOOQS,5:S,5:SO:SQ#xO,5:SO:XQ#xO,5:ZO'ZQ#xO,5:ZO'ZQ#xO,5:XOOQS,5:W,5:WO:jQ#xO,5:WO:oQ#xO,5:YOOOO'#F|'#F|O:tO,UO,5:cOOQS,5:c,5:cOOOO'#F}'#F}O:|O7[O,5:cO;UQ#xO'#DyOOOW'#GO'#GOO;fOWO,5:dOOQS,5:d,5:dO;UQ#xO'#D}OOO`'#GR'#GRO;qO`O,5:dO;UQ#xO'#EOOOOp'#GS'#GSO;|OpO,5:dO;UQ#xO'#EPOOO!b'#GT'#GTOROOQS,5>R,5>RO/rQ#xO'#EUOOQS'#EV'#EVOGZQ#xO'#GWOGkQ#xO,59OOGkQ#xO,59OO)pQ#xO,5:rOGyQ&nO'#HjOOQS,5:u,5:uOOQS,5:},5:}OH^Q#xO,5;ROHoQ#xO,5;TOOQS'#GZ'#GZOH}Q&nO,5;TOI]Q#xO,5;TOIbQ#xO'#IWOOQS,5;W,5;WOIpQ#xO'#ISOOQS,5;Z,5;ZOJRQ#xO,5;]O3aQ#xO,5;cO3aQ#xO,5;fOJZQ&nO'#IZO'ZQ#xO'#IZOJeQ#xO,5;hO2}Q#xO,5;hO/rQ#xO,5;mO0XQ#xO,5;oOJjQ#yO'#ExOKvQ#{O,5;iO! [Q#xO'#I[O3aQ#xO,5;mO! gQ#xO,5;oO! oQ#xO,5;tO! zQ&nO,5;yO'ZQ#xO,5;yPOOO,5=i,5=iP!!ROSO,5=iP!!WO#xO,5=iO!${Q&nO1G.lO!%SQ&nO1G.lO!'sQ&nO1G.lO!'}Q&nO1G.lO!*hQ&nO1G.lO!*{Q&nO1G.lO!+`Q#xO'#HpO!+nQ&nO'#HSO/rQ#xO'#HpO!+xQ#xO'#HoOOQS,5:],5:]O!,QQ#xO,5:]O!,VQ#xO'#HrO!,bQ#xO'#HrO!,uQ#xO,5>]OOQS'#Du'#DuOOQS1G/y1G/yOOQS1G/O1G/OO!-uQ&nO1G/OO!-|Q&nO1G/OO0lQ#xO1G/OO!.iQ#xO1G/WOOQS'#D]'#D]O/rQ#xO,59vOOQS1G.}1G.}O!.pQ#xO1G/gO!/QQ#xO1G/gO!/YQ#xO1G/hO'ZQ#xO'#HiO!/_Q#xO'#HiO!/dQ&nO1G.}O!/tQ#xO,59kO!0zQ#xO,5>XO!1[Q#xO,5>XO!1dQ#xO1G/oO!1iQ&nO1G/oOOQS1G/n1G/nO!1yQ#xO,5>SO!2pQ#xO,5>SO/rQ#xO1G/sO!3_Q#xO1G/uO!3dQ&nO1G/uO!3tQ&nO1G/sOOQS1G/r1G/rOOQS1G/t1G/tOOOO-E9z-E9zOOQS1G/}1G/}OOOO-E9{-E9{O!4UQ#xO'#H|O/rQ#xO'#H|O!4dQ#xO,5:eOOOW-E9|-E9|OOQS1G0O1G0OO!4oQ#xO,5:iOOO`-E:P-E:PO!4zQ#xO,5:jOOOp-E:Q-E:QO!5VQ#xO,5:kOOO!b-E:R-E:ROOQS-E:S-E:SO!5bQ!LUO1G3XO!6RQ&nO1G3XO'ZQ#xO,5oOOQS1G1c1G1cO!7RQ#xO1G1cOOQS'#DX'#DXO/rQ#xO,5>OOOQS,5>O,5>OO!7WQ#xO'#FuO!7cQ#xO,59qO!7kQ#xO1G/ZO!7uQ&nO,5>SOOQS1G3m1G3mOOQS,5:p,5:pO!8fQ#xO'#HROOQS,5UO!9gQ#xO,5>UO/rQ#xO1G0mO/rQ#xO1G0mO0XQ#xO1G0oOOQS-E:X-E:XO!9xQ#xO1G0oO!:TQ#xO1G0oO!:YQ#xO,5>rO!:hQ#xO,5>rO!:vQ#xO,5>nO!;^Q#xO,5>nO!;oQ#xO'#EsO/rQ#xO1G0wO!;zQ#xO1G0wO!uO!BzQ#xO,5>uO!CSQ&nO,5>uO/rQ#xO1G1SO!C^Q#xO1G1SO3aQ#xO1G1XO! gQ#xO1G1ZOOQV,5;d,5;dO!CcQ#zO,5;dO!ChQ#{O1G1TO!F|Q#xO'#GbO3aQ#xO1G1TO3aQ#xO1G1TO!G^Q#xO,5>vO!GkQ#xO,5>vO0XQ#xO,5>vOOQV1G1X1G1XO!GsQ#xO'#FVO!HUQMlO1G1ZO!H^Q#xO1G1ZOOQV1G1`1G1`O3aQ#xO1G1`O!HcQ#xO1G1`O!HkQ#xO'#FaOOQV1G1e1G1eO! zQ&nO1G1ePOOO1G3T1G3TP!HpOSO1G3TOOQS,5>[,5>[OOQS'#Dr'#DrO/rQ#xO,5>[O!HuQ#xO,5>ZO!IYQ#xO,5>ZOOQS1G/w1G/wO!IbQ#xO,5>^O!IrQ#xO,5>^O!IzQ#xO,5>^O!J_Q#xO,5>^O!JoQ#xO,5>^OOQS1G3w1G3wOOQS7+$j7+$jO!7kQ#xO7+$rO!LbQ#xO1G/OO!LiQ#xO1G/OOOQS1G/b1G/bOOQS,5TO'ZQ#xO,5>TOOQS7+$i7+$iO!MVQ#xO7+%RO!M_Q#xO7+%SO!MdQ#xO1G3sOOQS7+%Z7+%ZO!MtQ#xO1G3sO!M|Q#xO7+%ZOOQS,5hO##PQ#xO,5>hO##PQ#xO,5>hO##_O$ISO'#D{O##jO#tO'#H}OOOW1G0P1G0PO##oQ#xO1G0POOO`1G0T1G0TO##wQ#xO1G0TOOOp1G0U1G0UO#$PQ#xO1G0UOOO!b1G0V1G0VO#$XQ#xO1G0VO#$aQ!LUO7+(sO#%QQ&nO1G2]P#%kQ#xO'#GVOOQS,5i,5>iOOOW7+%k7+%kOOO`7+%o7+%oOOOp7+%p7+%pOOO!b7+%q7+%qO#:`Q#xO1G3XO#:yQ#xO1G3XP'ZQ#xO'#FxO/rQ#xO<qO#;mQ#xO,5>qO0XQ#xO,5>qO#pOOQS<sO#sOOQS1G0y1G0yOOQS<xO#DpQ#xO,5>xOOQS,5>x,5>xO#D{Q#xO,5>wO#E^Q#xO,5>wOOQS1G1]1G1]OOQS,5;s,5;sOOQV<XAN>XO#HmQ#xO<eAN>eO/rQ#xO1G2PO#H}Q&nO1G2PP#IXQ#xO'#FyOOQS1G2V1G2VP#IfQ#xO'#GPO#IsQ#xO7+)nO#JZQ#xO,5:hOOOO-E:O-E:OO#JfQ#xO7+(sOOQSAN?_AN?_O#KPQ#xO,5VOOQSANBaANBaOOOO7+%n7+%nOOQS7+'|7+'|O$+jQ#xO<zO$.`Q#xO,5>zO0XQ#xO,5|O$!pQ#xO,5>|OOQS1G1s1G1sO$2WQ&nO,5<_OOQU7+'S7+'SO$$mQ#xO1G/kO$!pQ#xO,5<]O$2_Q#xO,5>}O$2fQ#xO,5>}OOQS1G1v1G1vOOQS7+'V7+'VP$!pQ#xO'#GkO$2nQ#xO1G4hO$2xQ#xO1G4hO$3QQ#xO1G4hOOQS7+%V7+%VO$3`Q#xO1G1wO$3nQ&nO'#FdO$3uQ#xO,5=UOOQS,5=U,5=UO$4TQ#xO1G4iOOQS-E:h-E:hO$!pQ#xO,5=TO$4[Q#xO,5=TO$4aQ#xO7+*SOOQS-E:g-E:gO$4kQ#xO7+*SO$!pQ#xO,5<^P$!pQ#xO'#GjO$4sQ#xO1G2oO$!pQ#xO1G2oP$5RQ#xO'#GiO$5YQ#xO<fPP>i?Z?^PP'a'aPP?vPP'a'aPP'a'a'a'a'a?z@t'aP@wP@}EXHxPH|IYI^IbIf'aPPPIjIs'XP'X'XP'XP'XP'XP'XP'X'X'XP'XPP'XPP'XP'XPIyJVJ_PJfJlPJfPJfJfPPPJfPLzPMTM_MeLzPJfMnPJfPMuM{PNPNe! S! mNPNP! s!!QNPNPNPNP!!f!!l!!o!!t!!w!#R!#X!#e!#w!#}!$X!$_!${!%R!%X!%_!%i!%o!%u!%{!&R!&X!&k!&u!&{!'R!'X!'c!'i!'o!'u!'{!(V!(]!(g!(m!(v!(|!)]!)e!)o!)vPPPPPPPPPPPPPPPPP!)|!*P!*V!*`!*j!*uPPPPPPPPPPPP!/l!1Q!5T!8hPP!8p!9S!9]!:U!9{!:_!:e!:h!:k!:n!:v!;gPPPPPPPPP!;j!;yPPPP!V!>`!?[!?_]jOs#v$w*W,d(TeOTYZ[fistuwy}!O!S!U!V!W!Z!^!h!i!j!k!l!m!n!p!t!u!v!x!y#P#T#X#Y#c#g#j#m#s#v$X$Y$[$^$a$r$t$u$w%O%[%a%h%k%m%p%t%y%{&V&b&d&o&s&|'O'P'W'Z'_'b'i'l'}(O(R(T(U(Y(_(a(e(i(n(o(u(x)V)X)a)d)p)w)y)}*O*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+d+h+i+l+t+v+w,O,],^,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/o/s0[0z0{0|0}1P1Q1R1S1T1V1Z}!hQ#r$P$b$q$}%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!P!iQ#r$P$b$q$}%S%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!R!jQ#r$P$b$q$}%S%T%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!T!kQ#r$P$b$q$}%S%T%U%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!V!lQ#r$P$b$q$}%S%T%U%V%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!X!mQ#r$P$b$q$}%S%T%U%V%W%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O!]!mQ!s#r$P$b$q$}%S%T%U%V%W%X%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1O(TTOTYZ[fistuwy}!O!S!U!V!W!Z!^!h!i!j!k!l!m!n!p!t!u!v!x!y#P#T#X#Y#c#g#j#m#s#v$X$Y$[$^$a$r$t$u$w%O%[%a%h%k%m%p%t%y%{&V&b&d&o&s&|'O'P'W'Z'_'b'i'l'}(O(R(T(U(Y(_(a(e(i(n(o(u(x)V)X)a)d)p)w)y)}*O*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+d+h+i+l+t+v+w,O,],^,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/o/s0[0z0{0|0}1P1Q1R1S1T1V1Z&iVOYZ[isuw}!O!S!U!V!Z!n!p!t!u!v!x!y#c#g#j#m#s#v$Y$[$^$a$u$w%[%a%h%k%m%t%y%{&V&b&o&s'O'P'W'Z'b'i'l'}(O(R(T(U(Y(a(i(o(u(x)V)X)a)p)w)y*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+h+i+l+t+w,O,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/s0[0z0{0|0}1P1Q1R1S1V1Z%sXOYZ[isw}!O!S!U!V!Z!n!p#c#g#j#m#s#v$Y$[$^$a$u$w%[%a%k%m%t%y%{&V&b&o&s'O'P'W'Z'b'i'l'}(O(R(T(U(Y(a(i(o(u(x)V)X)a)p)w)y*S*W*^*b*l*v*y*z*}+T+W+Y+]+^+a+h+i+l+t+w,O,d,l,m,p,z,{,|-O-P-S-W-Y-[-^-_-b-y-{.S.V.}/O/s1Q1R1SQ$VvQ/t/SR1W1Y'zeOTYZ[fistuwy}!O!S!U!V!W!Z!^!h!i!j!k!l!m!p!t!u!v!x!y#P#T#X#Y#c#g#j#m#s#v$X$Y$[$^$a$r$t$u$w%O%[%a%h%k%m%p%t%y%{&V&b&d&o&s&|'O'P'W'Z'_'b'i'l'}(R(T(U(Y(_(a(e(i(n(o(u(x)V)X)a)d)p)w)y)}*O*S*W*^*b*l*y*z*}+T+U+W+Y+]+^+a+d+h+i+l+t+v+w,O,],^,d,l,m,p,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/o/s0[0z0{0|0}1P1Q1R1S1T1V1ZW#ym!P!Q$hW$Rv&q/S1YQ$j!RQ$n!TQ${![Q$|!]W%Z!n(O*v,zS&p$S$TQ'e$vQ)Y&jQ)h'QU)i'S)j)kU)l'U)m+}W)s'Y,Q-j.dQ*d'nW*e'p,s-}.lQ,P)rS,r*f*gY-d+x-e.a.b/XQ-g+zQ-t,hQ-x,kQ.j-vl.o.R.u.v.x/d/f/k0R0W0]0b0m0r0uQ/W.`Q/l.wQ/x/^Q0T/hU0h0^0k0sX0n0c0o0v0wR&o$R!_!|YZ!U!V!p%a%m%t(R(T(U(a(i)y*y*z*}+T+W+Y,{,|-O-P-S.S.V.}/O/sR%k!{Q#QYQ&W#cQ&Z#gQ&]#jQ&_#mQ&x$^Q&{$aR-`+lT/R.Y0[![!oQ!s#r$P$b$q$}%S%T%U%V%W%X%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1OQ&m#zQ't$|R*p'uR'}%ZQ%d!rR/v/[(SdOTYZ[fistuwy}!O!S!U!V!W!Z!^!h!i!j!k!l!m!n!p!t!u!v!x!y#P#T#X#Y#c#g#j#m#s#v$X$Y$[$^$a$r$t$u$w%O%[%a%h%k%m%p%t%y%{&V&b&d&o&s&|'O'P'W'Z'_'b'i'l'}(O(R(T(U(Y(_(a(e(i(n(o(u(x)V)X)a)d)p)w)y)}*O*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+d+h+i+l+t+v+w,O,],^,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/o/s0[0z0{0|0}1P1Q1R1S1T1V1ZS#pd#q!P.s.R.u.v.w.x/^/d/f/k0R0W0]0^0b0c0k0m0o0r0s0u0v0w(SdOTYZ[fistuwy}!O!S!U!V!W!Z!^!h!i!j!k!l!m!n!p!t!u!v!x!y#P#T#X#Y#c#g#j#m#s#v$X$Y$[$^$a$r$t$u$w%O%[%a%h%k%m%p%t%y%{&V&b&d&o&s&|'O'P'W'Z'_'b'i'l'}(O(R(T(U(Y(_(a(e(i(n(o(u(x)V)X)a)d)p)w)y)}*O*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+d+h+i+l+t+v+w,O,],^,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/o/s0[0z0{0|0}1P1Q1R1S1T1V1ZT#pd#qT#d`#ee(|&W&Z&]&_)O)Q)S)U-`._T+m({+nT#ha#iT#kb#lT#nc#oQ$`xQ,P)sR,q*eX$^x$_$`&zQ'[$nQ'r${Q'u$|R*V'eQ)t'YV-i,Q-j.dZlOs$w*W,dXpOs*W,dQ$x!YQ']$oQ'^$pQ'o$zQ's$|Q*T'dQ*['iQ*_'jQ*`'kQ*m'qS*o't'uQ,W)yQ,Y)zQ,Z){Q,_*RS,a*U*nQ,e*YQ,f*ZS,g*]*^Q,w*pQ-l,VQ-m,XQ-o,`S-p,b,cQ-u,iQ-w,jQ.e-nQ.g-qQ.h-sQ.i-tQ/Y.fQ/Z.jQ/p.{R0Z/qWpOs*W,dR#|oQ'q${S*U'e'rR,c*VQ,p*eR-{,qQ*n'qQ,b*UR-q,cZnOos*W,dQ'w$}R*r'xT.P,x.Qu.z.R.u.v.x/^/d/f/k0R0W0]0^0b0k0m0r0s0ut.z.R.u.v.x/^/d/f/k0R0W0]0^0b0k0m0r0s0uQ/l.wX0n0c0o0v0w!P.r.R.u.v.w.x/^/d/f/k0R0W0]0^0b0c0k0m0o0r0s0u0v0wQ/a.qR/}/bg/d.t/e/y0Q0V0e0g0i0t0x0yu.y.R.u.v.x/^/d/f/k0R0W0]0^0b0k0m0r0s0uX/_.o.y/x0hR/z/^V0j0^0k0sR/q.{QsOS$Os,dR,d*WQ&r$UR)_&rS%z#W$WS(p%z(sT(s%}&tQ%n#OQ%u#SW(b%n%u(g(kQ(g%rR(k%wQ&}$bR)e&}Q(v&OQ+_(qT+e(v+_Q(P%]R*w(PS(S%`%aY*{(S*|-Q.W/PU*|(T(U(VU-Q*}+O+PS.W-R-SR/P.XQ#_^R&R#_Q#b_R&T#bQ#e`R&X#eQ(y&US+j(y+kR+k(zQ+n({R-a+nQ#iaR&[#iQ#lbR&^#lQ#ocR&`#oQ#qdR&a#qQ#tgQ&c#rW&f#t&c)b+uQ)b&wR+u1OQ$_xS&y$_&zR&z$`Q'X$lR)q'XQ&k#yR)Z&kQ$h!QR'R$hQ+y)iS-f+y.cR.c-gQ'V$jR)n'VQ,R)tR-k,RQ#wkR&h#wQ)x']R,U)xQ'`$qS*P'`*QR*Q'aQ'h$xR*X'hQ'm$yS*c'm,nR,n*dQ,t*iR.O,tWoOs*W,dR#{oQ.Q,xR.m.Qd/e.t/y0Q0V0e0g0i0t0x0yR0P/eU/].o/x0hR/w/]Q0d0VS0p0d0qR0q0eS0_/y/zR0l0_Q/g.tR0S/gR!`PXrOs*W,dWqOs*W,dR'f$wYkOs$w*W,dR&g#v[xOs#v$w*W,dR&x$^&hQOYZ[isuw}!O!S!U!V!Z!n!p!t!u!v!x!y#c#g#j#m#s#v$Y$[$^$a$u$w%[%a%h%k%m%t%y%{&V&b&o&s'O'P'W'Z'b'i'l'}(O(R(T(U(Y(a(i(o(u(x)V)X)a)p)w)y*S*W*^*b*l*v*y*z*}+T+U+W+Y+]+^+a+h+i+l+t+w,O,d,l,m,p,z,{,|-O-P-S-U-W-Y-[-^-_-b-y-{.S.V.Y.}/O/s0[0z0{0|0}1P1Q1R1S1V1ZQ!sTQ#rfQ$PtU$by%p(eS$q!W$tQ$}!^Q%S!hQ%T!iQ%U!jQ%V!kQ%W!lQ%X!mQ%r#PQ%w#TQ%}#XQ&O#YQ&t$XQ'a$rQ'x%OQ)W&dU)c&|)d+vW)|'_*O,],^Q+R(_Q+[(nQ,[)}Q-Z+dQ0Y/oR1O1TQ#OYQ#SZQ$o!UQ$p!VQ%`!pQ(V%a^(^%m%t(a(i+T+W+Y^*x(R*z-O-P.V/O/sQ+O(TQ+P(UQ,X)yQ,}*yQ-R*}Q.T,{Q.U,|Q.X-SQ.|.SR/r.}[gOs#v$w*W,d!^!{YZ!U!V!p%a%m%t(R(T(U(a(i)y*y*z*}+T+W+Y,{,|-O-P-S.S.V.}/O/sQ#W[Q#uiS$Ww}Q$e!OW$l!S$a'b*SS$y!Z$uW%Y!n(O*v,zY&U#c#g#j#m+l`&e#s&b)V)X)a+t-b1SQ&u$YQ&v$[Q&w$^Q'{%[Q(]%kW(m%y(o+]+aQ(q%{Q(z&VQ)]&oS)`&s1QQ)f'OQ)g'PU)o'W)p,OQ)v'ZQ*]'iY*a'l*b,l,m-yQ*t'}S+Q(Y1RW+c(u+^-W-[W+g(x+i-^-_Q,T)wQ,i*^Q,v*lQ-]+hQ-c+wQ-z,pQ.]-YR.k-{hUOs#s#v$w&b&s(Y)V)X*W,d%Y!zYZ[iw}!O!S!U!V!Z!n!p#c#g#j#m$Y$[$^$a$u%[%a%k%m%t%y%{&V&o'O'P'W'Z'b'i'l'}(O(R(T(U(a(i(o(u(x)a)p)w)y*S*^*b*l*v*y*z*}+T+W+Y+]+^+a+h+i+l+t+w,O,l,m,p,z,{,|-O-P-S-W-Y-[-^-_-b-y-{.S.V.}/O/s1Q1R1SQ$QuW%e!t!x0{1VQ%f!uQ%g!vQ%i!yQ%s0zS(X%h1PQ(Z0|Q([0}Q-T+UQ.[-US/Q.Y0[R1X1ZU$Uv/S1YR)^&q[hOs#v$w*W,da!}Y#c#g#j#m$^$a+lQ#][Q$ZwR$d}Q%o#OQ%v#SQ%|#WQ'{%YQ(h%rQ(l%wQ(t%}Q(w&OQ+`(qQ,y*tQ.Z-TQ/U.[R/u/TQ$cyQ(d%pR+V(eQ/T.YR0f0[R#VZR#[[R%_!nQ%]!nV*u(O*v,z!]!qQ!s#r$P$b$q$}%S%T%U%V%W%X%r%w%}&O&t'a'x)W)c)|+R+[,[-Z0Y1OR%b!pQ&W#cQ&Z#gQ&]#jQ&_#mR-`+lQ(}&WQ)P&ZQ)R&]Q)T&_Q+p)OQ+q)QQ+r)SQ+s)UQ.^-`R/V._Q$m!SQ&{$aQ*R'bR,`*SQ#zmQ$f!PQ$i!QR'T$hQ)h'SR+|)kQ)h'SQ+{)jR+|)kR$k!RR)u'YXqOs*W,dQ$s!WR'c$tQ$z!ZR'd$uR*k'pQ*i'pV-|,s-}.lQ.{.RQ/i.uR/j.vU.t.R.u.vQ/n.xQ/y/^Q0O/dU0Q/f0R0bQ0V/kQ0e0WQ0g0]U0i0^0k0sQ0t0mQ0x0rR0y0uR/m.wR/{/^",nodeNames:"โš  print { { { { Comment Script AssignStatement * BinaryExpression BitOp BitOp BitOp BitOp ArithOp ArithOp @ ArithOp ** UnaryExpression ArithOp BitOp AwaitExpression await ) ( ParenthesizedExpression BinaryExpression or and CompareOp in not is UnaryExpression ConditionalExpression if else LambdaExpression lambda ParamList VariableName AssignOp , : NamedExpression AssignOp YieldExpression yield from TupleExpression ComprehensionExpression async for LambdaExpression ] [ ArrayExpression ArrayComprehensionExpression } { DictionaryExpression DictionaryComprehensionExpression SetExpression SetComprehensionExpression CallExpression ArgList AssignOp MemberExpression . PropertyName Number String FormatString FormatReplacement FormatConversion FormatSpec FormatReplacement FormatReplacement FormatReplacement FormatReplacement ContinuedString Ellipsis None Boolean TypeDef AssignOp UpdateStatement UpdateOp ExpressionStatement DeleteStatement del PassStatement pass BreakStatement break ContinueStatement continue ReturnStatement return YieldStatement PrintStatement RaiseStatement raise ImportStatement import as ScopeStatement global nonlocal AssertStatement assert TypeDefinition type TypeParamList TypeParam StatementGroup ; IfStatement Body elif WhileStatement while ForStatement TryStatement try except finally WithStatement with FunctionDefinition def ParamList AssignOp TypeDef ClassDefinition class DecoratedStatement Decorator At MatchStatement match MatchBody MatchClause case CapturePattern LiteralPattern ArithOp ArithOp AsPattern OrPattern LogicOp AttributePattern SequencePattern MappingPattern StarPattern ClassPattern PatternArgList KeywordPattern KeywordPattern Guard",maxTerm:283,context:Zp,nodeProps:[["group",-15,8,88,90,91,93,95,97,99,101,102,103,105,108,111,113,"Statement Statement",-22,10,20,23,27,42,51,52,58,59,62,63,64,65,66,69,72,73,74,82,83,84,85,"Expression",-10,117,119,122,124,125,129,131,136,138,141,"Statement",-9,146,147,150,151,153,154,155,156,157,"Pattern"],["openedBy",25,"(",56,"[",60,"{"],["closedBy",26,")",57,"]",61,"}"]],propSources:[rf],skippedNodes:[0,6],repeatNodeCount:38,tokenData:"%-W#sR!`OX%TXY=|Y[%T[]=|]p%Tpq=|qr@_rsDOst!+|tu%Tuv!Nnvw#!|wx#$Wxy#:Uyz#;Yz{#<^{|#>x|}#@S}!O#AW!O!P#Ci!P!Q#N_!Q!R$!y!R![$&w![!]$1e!]!^$3s!^!_$4w!_!`$7c!`!a$8m!a!b%T!b!c$;U!c!d$W!e!h$W#V#Y$Q<%lO$Xc&r!b&jS&mW%p!TOX%TXY=|Y[%T[]=|]p%Tpq=|qr%Trs&Vsw%Twx/Xx#O%T#O#P?d#P#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=v<%lO%T#s?i[&r!bOY%TYZ=|Z]%T]^=|^#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=P;=`<%l8^<%lO%T!q@hd&r!b&jS&mWOr%Trs&Vsw%Twx/Xx!_%T!_!`Av!`#O%T#O#P7o#P#T%T#T#UBz#U#f%T#f#gBz#g#hBz#h#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=v<%lO%T!qBR]oR&r!b&jS&mWOr%Trs&Vsw%Twx/Xx#O%T#O#P7o#P#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=v<%lO%T!qCV]!nR&r!b&jS&mWOr%Trs&Vsw%Twx/Xx#O%T#O#P7o#P#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=v<%lO%T#cDXa&r!b&jS&hsOYE^YZ%TZ]E^]^%T^rE^rs!)|swE^wxGpx#OE^#O#P!!u#P#oE^#o#p!#d#p#qE^#q#r!#d#r;'SE^;'S;=`!)v<%lOE^#cEia&r!b&jS&mW&hsOYE^YZ%TZ]E^]^%T^rE^rsFnswE^wxGpx#OE^#O#P!!u#P#oE^#o#p!#d#p#qE^#q#r!#d#r;'SE^;'S;=`!)v<%lOE^#cFw]&r!b&jS&hsOr%Trs'Vsw%Twx/Xx#O%T#O#P7o#P#o%T#o#p8^#p#q%T#q#r8^#r;'S%T;'S;=`=v<%lO%T#cGya&r!b&mW&hsOYE^YZ%TZ]E^]^%T^rE^rsFnswE^wxIOx#OE^#O#P!!u#P#oE^#o#p!#d#p#qE^#q#r!#d#r;'SE^;'S;=`!)v<%lOE^#cIXa&r!b&mW&hsOYE^YZ%TZ]E^]^%T^rE^rsFnswE^wxJ^x#OE^#O#P!!u#P#oE^#o#p!#d#p#qE^#q#r!#d#r;'SE^;'S;=`!)v<%lOE^#_Jg_&r!b&mW&hsOYJ^YZ1XZ]J^]^1X^rJ^rsKfs#OJ^#O#PL`#P#oJ^#o#pL}#p#qJ^#q#rL}#r;'SJ^;'S;=`!!o<%lOJ^#_KmZ&r!b&hsOr1Xrs2ys#O1X#O#P3q#P#o1X#o#p4`#p#q1X#q#r4`#r;'S1X;'S;=`7i<%lO1X#_LeW&r!bO#oJ^#o#pL}#p#qJ^#q#rL}#r;'SJ^;'S;=`! r;=`<%lL}<%lOJ^{MUZ&mW&hsOYL}YZ4`Z]L}]^4`^rL}rsMws#OL}#O#PNc#P;'SL};'S;=`! l<%lOL}{M|V&hsOr4`rs5ds#O4`#O#P5y#P;'S4`;'S;=`6t<%lO4`{NfRO;'SL};'S;=`No;=`OL}{Nv[&mW&hsOYL}YZ4`Z]L}]^4`^rL}rsMws#OL}#O#PNc#P;'SL};'S;=`! l;=`<%lL}<%lOL}{! oP;=`<%lL}#_! y[&mW&hsOYL}YZ4`Z]L}]^4`^rL}rsMws#OL}#O#PNc#P;'SL};'S;=`! l;=`<%lJ^<%lOL}#_!!rP;=`<%lJ^#c!!zW&r!bO#oE^#o#p!#d#p#qE^#q#r!#d#r;'SE^;'S;=`!(q;=`<%l!#d<%lOE^!P!#m]&jS&mW&hsOY!#dYZ8^Z]!#d]^8^^r!#drs!$fsw!#dwx!%Yx#O!#d#O#P!'Y#P;'S!#d;'S;=`!(k<%lO!#d!P!$mX&jS&hsOr8^rs9rsw8^wx:dx#O8^#O#P;v#P;'S8^;'S;=`^s#O!=U#O#P!@j#P#o!=U#o#p!Ag#p#q!=U#q#r!Ag#r;'S!=U;'S;=`!FQ<%lO!=U#o!>e_U!T&r!bOY!=UYZ1XZ]!=U]^1X^r!=Urs!?ds#O!=U#O#P!@j#P#o!=U#o#p!Ag#p#q!=U#q#r!Ag#r;'S!=U;'S;=`!FQ<%lO!=U#o!?k_U!T&r!bOY!=UYZ1XZ]!=U]^1X^r!=Urs!3`s#O!=U#O#P!@j#P#o!=U#o#p!Ag#p#q!=U#q#r!Ag#r;'S!=U;'S;=`!FQ<%lO!=U#o!@q[U!T&r!bOY!=UYZ1XZ]!=U]^1X^#o!=U#o#p!Ag#p#q!=U#q#r!Ag#r;'S!=U;'S;=`!Ec;=`<%l4`<%lO!=U!]!AnZU!T&mWOY!AgYZ4`Z]!Ag]^4`^r!Agrs!Bas#O!Ag#O#P!DP#P;'S!Ag;'S;=`!E]<%lO!Ag!]!BfZU!TOY!AgYZ4`Z]!Ag]^4`^r!Agrs!CXs#O!Ag#O#P!DP#P;'S!Ag;'S;=`!E]<%lO!Ag!]!C^ZU!TOY!AgYZ4`Z]!Ag]^4`^r!Agrs!4Ys#O!Ag#O#P!DP#P;'S!Ag;'S;=`!E]<%lO!Ag!]!DUWU!TOY!AgYZ4`Z]!Ag]^4`^;'S!Ag;'S;=`!Dn;=`<%l4`<%lO!Ag!]!DsW&mWOr4`rs4zs#O4`#O#P5y#P;'S4`;'S;=`6t;=`<%l!Ag<%lO4`!]!E`P;=`<%l!Ag#o!EhW&mWOr4`rs4zs#O4`#O#P5y#P;'S4`;'S;=`6t;=`<%l!=U<%lO4`#o!FTP;=`<%l!=U#s!F_[U!T&r!bOY!+|YZ%TZ]!+|]^%T^#o!+|#o#p!GT#p#q!+|#q#r!GT#r;'S!+|;'S;=`!Mq;=`<%l8^<%lO!+|!a!G^]U!T&jS&mWOY!GTYZ8^Z]!GT]^8^^r!GTrs!HVsw!GTwx!JVx#O!GT#O#P!LV#P;'S!GT;'S;=`!Mk<%lO!GT!a!H^]U!T&jSOY!GTYZ8^Z]!GT]^8^^r!GTrs!IVsw!GTwx!JVx#O!GT#O#P!LV#P;'S!GT;'S;=`!Mk<%lO!GT!a!I^]U!T&jSOY!GTYZ8^Z]!GT]^8^^r!GTrs!5wsw!GTwx!JVx#O!GT#O#P!LV#P;'S!GT;'S;=`!Mk<%lO!GT!a!J^]U!T&mWOY!GTYZ8^Z]!GT]^8^^r!GTrs!HVsw!GTwx!KVx#O!GT#O#P!LV#P;'S!GT;'S;=`!Mk<%lO!GT!a!K^]U!T&mWOY!GTYZ8^Z]!GT]^8^^r!GTrs!HVsw!GTwx!Agx#O!GT#O#P!LV#P;'S!GT;'S;=`!Mk<%lO!GT!a!L[WU!TOY!GTYZ8^Z]!GT]^8^^;'S!GT;'S;=`!Lt;=`<%l8^<%lO!GT!a!L{Y&jS&mWOr8^rs9Qsw8^wx:dx#O8^#O#P;v#P;'S8^;'S;=`Q<%lO$TP;=`<%l$ei&r!b&jS&mW&g`&SsOr%Trs$@Ssw%Twx$C`x!Q%T!Q![$Q<%lO$Q<%lO$Q<%lO$Q<%lO$Q<%lO$of[e]||-1}],tokenPrec:7372}),lf=new Zo,hf=new Set(["Script","Body","FunctionDefinition","ClassDefinition","LambdaExpression","ForStatement","MatchClause"]);function cf(e){return(t,i,n)=>{if(n)return!1;let s=t.node.getChild("VariableName");return s&&i(s,e),!0}}const df={FunctionDefinition:cf("function"),ClassDefinition:cf("class"),ForStatement(e,t,i){if(i)for(let i=e.node.firstChild;i;i=i.nextSibling)if("VariableName"==i.name)t(i,"variable");else if("in"==i.name)break},ImportStatement(e,t){var i,n;let{node:s}=e,r="from"==(null===(i=s.firstChild)||void 0===i?void 0:i.name);for(let e=s.getChild("import");e;e=e.nextSibling)"VariableName"==e.name&&"as"!=(null===(n=e.nextSibling)||void 0===n?void 0:n.name)&&t(e,r?"variable":"namespace")},AssignStatement(e,t){for(let i=e.node.firstChild;i;i=i.nextSibling)if("VariableName"==i.name)t(i,"variable");else if(":"==i.name||"AssignOp"==i.name)break},ParamList(e,t){for(let i=null,n=e.node.firstChild;n;n=n.nextSibling)"VariableName"!=n.name||i&&/\*|AssignOp/.test(i.name)||t(n,"variable"),i=n},CapturePattern:cf("variable"),AsPattern:cf("variable"),__proto__:null};function uf(e,t){let i=lf.get(t);if(i)return i;let n=[],s=!0;function r(t,i){let s=e.sliceString(t.from,t.to);n.push({label:s,type:i})}return t.cursor(Ro.IncludeAnonymous).iterate((t=>{if(t.name){let e=df[t.name];if(e&&e(t,r,s)||!s&&hf.has(t.name))return!1;s=!1}else if(t.to-t.from>8192){for(let i of uf(e,t.node))n.push(i);return!1}})),lf.set(t,n),n}const pf=/^[\w\xa1-\uffff][\w\d\xa1-\uffff]*$/,ff=["String","FormatString","Comment","PropertyName"];function mf(e){let t=Da(e.state).resolveInner(e.pos,-1);if(ff.indexOf(t.name)>-1)return null;let i="VariableName"==t.name||t.to-t.from<20&&pf.test(e.state.sliceDoc(t.from,t.to));if(!i&&!e.explicit)return null;let n=[];for(let i=t;i;i=i.parent)hf.has(i.name)&&(n=n.concat(uf(e.state.doc,i)));return{options:n,from:i?t.from:e.pos,validFor:pf}}const gf=["__annotations__","__builtins__","__debug__","__doc__","__import__","__name__","__loader__","__package__","__spec__","False","None","True"].map((e=>({label:e,type:"constant"}))).concat(["ArithmeticError","AssertionError","AttributeError","BaseException","BlockingIOError","BrokenPipeError","BufferError","BytesWarning","ChildProcessError","ConnectionAbortedError","ConnectionError","ConnectionRefusedError","ConnectionResetError","DeprecationWarning","EOFError","Ellipsis","EncodingWarning","EnvironmentError","Exception","FileExistsError","FileNotFoundError","FloatingPointError","FutureWarning","GeneratorExit","IOError","ImportError","ImportWarning","IndentationError","IndexError","InterruptedError","IsADirectoryError","KeyError","KeyboardInterrupt","LookupError","MemoryError","ModuleNotFoundError","NameError","NotADirectoryError","NotImplemented","NotImplementedError","OSError","OverflowError","PendingDeprecationWarning","PermissionError","ProcessLookupError","RecursionError","ReferenceError","ResourceWarning","RuntimeError","RuntimeWarning","StopAsyncIteration","StopIteration","SyntaxError","SyntaxWarning","SystemError","SystemExit","TabError","TimeoutError","TypeError","UnboundLocalError","UnicodeDecodeError","UnicodeEncodeError","UnicodeError","UnicodeTranslateError","UnicodeWarning","UserWarning","ValueError","Warning","ZeroDivisionError"].map((e=>({label:e,type:"type"})))).concat(["bool","bytearray","bytes","classmethod","complex","float","frozenset","int","list","map","memoryview","object","range","set","staticmethod","str","super","tuple","type"].map((e=>({label:e,type:"class"})))).concat(["abs","aiter","all","anext","any","ascii","bin","breakpoint","callable","chr","compile","delattr","dict","dir","divmod","enumerate","eval","exec","exit","filter","format","getattr","globals","hasattr","hash","help","hex","id","input","isinstance","issubclass","iter","len","license","locals","max","min","next","oct","open","ord","pow","print","property","quit","repr","reversed","round","setattr","slice","sorted","sum","vars","zip"].map((e=>({label:e,type:"function"})))),vf=[Au("def ${name}(${params}):\n\t${}",{label:"def",detail:"function",type:"keyword"}),Au("for ${name} in ${collection}:\n\t${}",{label:"for",detail:"loop",type:"keyword"}),Au("while ${}:\n\t${}",{label:"while",detail:"loop",type:"keyword"}),Au("try:\n\t${}\nexcept ${error}:\n\t${}",{label:"try",detail:"/ except block",type:"keyword"}),Au("if ${}:\n\t\n",{label:"if",detail:"block",type:"keyword"}),Au("if ${}:\n\t${}\nelse:\n\t${}",{label:"if",detail:"/ else block",type:"keyword"}),Au("class ${name}:\n\tdef __init__(self, ${params}):\n\t\t\t${}",{label:"class",detail:"definition",type:"keyword"}),Au("import ${module}",{label:"import",detail:"statement",type:"keyword"}),Au("from ${module} import ${names}",{label:"from",detail:"import",type:"keyword"})],Of=Ld(ff,qd(gf.concat(vf)));function bf(e,t){let i=e.baseIndentFor(t),n=e.lineAt(e.pos,-1),s=n.from+n.text.length;return/^\s*($|#)/.test(n.text)&&e.node.toi?null:i+e.unit}const _f=Ra.define({name:"python",parser:af.configure({props:[Ga.add({Body:e=>{var t;return null!==(t=bf(e,e.node))&&void 0!==t?t:e.continue()},IfStatement:e=>/^\s*(else:|elif )/.test(e.textAfter)?e.baseIndent:e.continue(),TryStatement:e=>/^\s*(except |finally:|else:)/.test(e.textAfter)?e.baseIndent:e.continue(),"TupleExpression ComprehensionExpression ParamList ArgList ParenthesizedExpression":il({closing:")"}),"DictionaryExpression DictionaryComprehensionExpression SetExpression SetComprehensionExpression":il({closing:"}"}),"ArrayExpression ArrayComprehensionExpression":il({closing:"]"}),"String FormatString":()=>null,Script:e=>{if(e.pos+/\s*/.exec(e.textAfter)[0].length>=e.node.to){let t=null;for(let i=e.node,n=i.to;i=i.lastChild,i&&i.to==n;)"Body"==i.type.name&&(t=i);if(t){let i=bf(e,t);if(null!=i)return i}}return e.continue()}}),rl.add({"ArrayExpression DictionaryExpression SetExpression TupleExpression":function(e){let t=e.firstChild,i=e.lastChild;return t&&t.to({from:e.from+1,to:e.to-(e.to==t.doc.length?0:1)})})]}),languageData:{closeBrackets:{brackets:["(","[","{","'",'"',"'''",'"""'],stringPrefixes:["f","fr","rf","r","u","b","br","rb","F","FR","RF","R","U","B","BR","RB"]},commentTokens:{line:"#"},indentOnInput:/^\s*([\}\]\)]|else:|elif |except |finally:)$/}}),yf="#e06c75",wf="#abb2bf",xf="#7d8799",Sf="#d19a66",kf="#2c313a",Tf="#282c34",Cf="#353a42",Pf="#528bff",Mf=[Ds.theme({"&":{color:wf,backgroundColor:Tf},".cm-content":{caretColor:Pf},".cm-cursor, .cm-dropCursor":{borderLeftColor:Pf},"&.cm-focused > .cm-scroller > .cm-selectionLayer .cm-selectionBackground, .cm-selectionBackground, .cm-content ::selection":{backgroundColor:"#3E4451"},".cm-panels":{backgroundColor:"#21252b",color:wf},".cm-panels.cm-panels-top":{borderBottom:"2px solid black"},".cm-panels.cm-panels-bottom":{borderTop:"2px solid black"},".cm-searchMatch":{backgroundColor:"#72a1ff59",outline:"1px solid #457dff"},".cm-searchMatch.cm-searchMatch-selected":{backgroundColor:"#6199ff2f"},".cm-activeLine":{backgroundColor:"#6699ff0b"},".cm-selectionMatch":{backgroundColor:"#aafe661a"},"&.cm-focused .cm-matchingBracket, &.cm-focused .cm-nonmatchingBracket":{backgroundColor:"#bad0f847"},".cm-gutters":{backgroundColor:Tf,color:xf,border:"none"},".cm-activeLineGutter":{backgroundColor:kf},".cm-foldPlaceholder":{backgroundColor:"transparent",border:"none",color:"#ddd"},".cm-tooltip":{border:"none",backgroundColor:Cf},".cm-tooltip .cm-tooltip-arrow:before":{borderTopColor:"transparent",borderBottomColor:"transparent"},".cm-tooltip .cm-tooltip-arrow:after":{borderTopColor:Cf,borderBottomColor:Cf},".cm-tooltip-autocomplete":{"& > ul > li[aria-selected]":{backgroundColor:kf,color:wf}}},{dark:!0}),Rl(Pl.define([{tag:Ta.keyword,color:"#c678dd"},{tag:[Ta.name,Ta.deleted,Ta.character,Ta.propertyName,Ta.macroName],color:yf},{tag:[Ta.function(Ta.variableName),Ta.labelName],color:"#61afef"},{tag:[Ta.color,Ta.constant(Ta.name),Ta.standard(Ta.name)],color:Sf},{tag:[Ta.definition(Ta.name),Ta.separator],color:wf},{tag:[Ta.typeName,Ta.className,Ta.number,Ta.changed,Ta.annotation,Ta.modifier,Ta.self,Ta.namespace],color:"#e5c07b"},{tag:[Ta.operator,Ta.operatorKeyword,Ta.url,Ta.escape,Ta.regexp,Ta.link,Ta.special(Ta.string)],color:"#56b6c2"},{tag:[Ta.meta,Ta.comment],color:xf},{tag:Ta.strong,fontWeight:"bold"},{tag:Ta.emphasis,fontStyle:"italic"},{tag:Ta.strikethrough,textDecoration:"line-through"},{tag:Ta.link,color:xf,textDecoration:"underline"},{tag:Ta.heading,fontWeight:"bold",color:yf},{tag:[Ta.atom,Ta.bool,Ta.special(Ta.variableName)],color:Sf},{tag:[Ta.processingInstruction,Ta.string,Ta.inserted],color:"#98c379"},{tag:Ta.invalid,color:"#ffffff"}]))];var Ef,Af,Rf,Df,If,qf,Lf,Nf,Bf,$f=__webpack_require__(5247),Qf=__webpack_require__(5895),zf=__webpack_require__(6424),jf=__webpack_require__(7564),Wf=__webpack_require__(3911);!function(e){e.copyText=function(e){const t=document.body,i=n=>{n.preventDefault(),n.stopPropagation(),n.clipboardData.setData("text",e),t.removeEventListener("copy",i,!0)};t.addEventListener("copy",i,!0),document.execCommand("copy")}}(Ef||(Ef={})),(Bf=Af||(Af={})).boxSizing=function(e){let t=window.getComputedStyle(e),i=parseFloat(t.borderTopWidth)||0,n=parseFloat(t.borderLeftWidth)||0,s=parseFloat(t.borderRightWidth)||0,r=parseFloat(t.borderBottomWidth)||0,o=parseFloat(t.paddingTop)||0,a=parseFloat(t.paddingLeft)||0,l=parseFloat(t.paddingRight)||0,h=parseFloat(t.paddingBottom)||0;return{borderTop:i,borderLeft:n,borderRight:s,borderBottom:r,paddingTop:o,paddingLeft:a,paddingRight:l,paddingBottom:h,horizontalSum:n+a+l+s,verticalSum:i+o+h+r}},Bf.sizeLimits=function(e){let t=window.getComputedStyle(e),i=parseFloat(t.minWidth)||0,n=parseFloat(t.minHeight)||0,s=parseFloat(t.maxWidth)||1/0,r=parseFloat(t.maxHeight)||1/0;return s=Math.max(i,s),r=Math.max(n,r),{minWidth:i,minHeight:n,maxWidth:s,maxHeight:r}},Bf.hitTest=function(e,t,i){let n=e.getBoundingClientRect();return t>=n.left&&t=n.top&&i=i.bottom||(n.topi.bottom&&n.height>=i.height?e.scrollTop-=i.top-n.top:(n.topi.height||n.bottom>i.bottom&&n.height{let e=Element.prototype;return e.matches||e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector||function(e){let t=this,i=t.ownerDocument?t.ownerDocument.querySelectorAll(e):[];return-1!==Array.prototype.indexOf.call(i,t)}})(),e.calculateSingle=function(e){let h=0,c=0,d=0;function u(t){let i=e.match(t);return null!==i&&(e=e.slice(i[0].length),!0)}for(e=(e=e.split(",",1)[0]).replace(l," $1 ");e.length>0;)if(u(t))h++;else if(u(i))c++;else if(u(n))c++;else if(u(r))d++;else if(u(o))c++;else if(u(s))d++;else if(!u(a))return 0;return h=Math.min(h,255),c=Math.min(c,255),d=Math.min(d,255),h<<16|c<<8|d};const t=/^#[^\s\+>~#\.\[:]+/,i=/^\.[^\s\+>~#\.\[:]+/,n=/^\[[^\]]+\]/,s=/^[^\s\+>~#\.\[:]+/,r=/^(::[^\s\+>~#\.\[:]+|:first-line|:first-letter|:before|:after)/,o=/^:[^\s\+>~#\.\[:]+/,a=/^[\s\+>~\*]+/,l=/:not\(([^\)]+)\)/g}(If||(If={}));class Vf{constructor(){this._first=null,this._last=null,this._size=0}get isEmpty(){return 0===this._size}get size(){return this._size}get length(){return this._size}get first(){return this._first?this._first.value:void 0}get last(){return this._last?this._last.value:void 0}get firstNode(){return this._first}get lastNode(){return this._last}*[Symbol.iterator](){let e=this._first;for(;e;)yield e.value,e=e.next}*retro(){let e=this._last;for(;e;)yield e.value,e=e.prev}*nodes(){let e=this._first;for(;e;)yield e,e=e.next}*retroNodes(){let e=this._last;for(;e;)yield e,e=e.prev}assign(e){this.clear();for(const t of e)this.addLast(t)}push(e){this.addLast(e)}pop(){return this.removeLast()}shift(e){this.addFirst(e)}unshift(){return this.removeFirst()}addFirst(e){let t=new qf.LinkedListNode(this,e);return this._first?(t.next=this._first,this._first.prev=t,this._first=t):(this._first=t,this._last=t),this._size++,t}addLast(e){let t=new qf.LinkedListNode(this,e);return this._last?(t.prev=this._last,this._last.next=t,this._last=t):(this._first=t,this._last=t),this._size++,t}insertBefore(e,t){if(!t||t===this._first)return this.addFirst(e);if(!(t instanceof qf.LinkedListNode)||t.list!==this)throw new Error("Reference node is not owned by the list.");let i=new qf.LinkedListNode(this,e),n=t,s=n.prev;return i.next=n,i.prev=s,n.prev=i,s.next=i,this._size++,i}insertAfter(e,t){if(!t||t===this._last)return this.addLast(e);if(!(t instanceof qf.LinkedListNode)||t.list!==this)throw new Error("Reference node is not owned by the list.");let i=new qf.LinkedListNode(this,e),n=t,s=n.next;return i.next=s,i.prev=n,n.next=i,s.prev=i,this._size++,i}removeFirst(){let e=this._first;if(e)return e===this._last?(this._first=null,this._last=null):(this._first=e.next,this._first.prev=null),e.list=null,e.next=null,e.prev=null,this._size--,e.value}removeLast(){let e=this._last;if(e)return e===this._first?(this._first=null,this._last=null):(this._last=e.prev,this._last.next=null),e.list=null,e.next=null,e.prev=null,this._size--,e.value}removeNode(e){if(!(e instanceof qf.LinkedListNode)||e.list!==this)throw new Error("Node is not owned by the list.");let t=e;t===this._first&&t===this._last?(this._first=null,this._last=null):t===this._first?(this._first=t.next,this._first.prev=null):t===this._last?(this._last=t.prev,this._last.next=null):(t.next.prev=t.prev,t.prev.next=t.next),t.list=null,t.next=null,t.prev=null,this._size--}clear(){let e=this._first;for(;e;){let t=e.next;e.list=null,e.prev=null,e.next=null,e=t}this._first=null,this._last=null,this._size=0}}!function(e){e.from=function(t){let i=new e;return i.assign(t),i}}(Vf||(Vf={})),function(e){e.LinkedListNode=class{constructor(e,t){this.list=null,this.next=null,this.prev=null,this.list=e,this.value=t}}}(qf||(qf={}));class Uf{constructor(e){this.type=e}get isConflatable(){return!1}conflate(e){return!1}}class Ff extends Uf{get isConflatable(){return!0}conflate(e){return!0}}!function(e){let t=null;const i=(n=Promise.resolve(),e=>{let t=!1;return n.then((()=>!t&&e())),()=>{t=!0}});var n;function s(e,t){let i=o.get(e);if(!i||0===i.length)return void c(e,t);let n=(0,jf.yW)((0,jf.kh)(i),(i=>!i||function(e,t,i){let n=!0;try{n="function"==typeof e?e(t,i):e.messageHook(t,i)}catch(e){l(e)}return n}(i,e,t)));n&&c(e,t)}e.sendMessage=s,e.postMessage=function(e,t){t.isConflatable&&(0,jf.G)(r,(i=>i.handler===e&&!!i.msg&&i.msg.type===t.type&&!!i.msg.isConflatable&&i.msg.conflate(t)))||d(e,t)},e.installMessageHook=function(e,t){let i=o.get(e);i&&-1!==i.indexOf(t)||(i?i.push(t):o.set(e,[t]))},e.removeMessageHook=function(e,t){let i=o.get(e);if(!i)return;let n=i.indexOf(t);-1!==n&&(i[n]=null,p(i))},e.clearData=function(e){let t=o.get(e);t&&t.length>0&&(jf.RO.fill(t,null),p(t));for(const t of r)t.handler===e&&(t.handler=null,t.msg=null)},e.flush=function(){h||null===t||(t(),t=null,h=!0,u(),h=!1)},e.getExceptionHandler=function(){return l},e.setExceptionHandler=function(e){let t=l;return l=e,t};const r=new Vf,o=new WeakMap,a=new Set;let l=e=>{console.error(e)},h=!1;function c(e,t){try{e.processMessage(t)}catch(e){l(e)}}function d(e,n){r.addLast({handler:e,msg:n}),null===t&&(t=i(u))}function u(){if(t=null,r.isEmpty)return;let e={handler:null,msg:null};for(r.addLast(e);;){let t=r.removeFirst();if(t===e)return;t.handler&&t.msg&&s(t.handler,t.msg)}}function p(e){0===a.size&&i(f),a.add(e)}function f(){a.forEach(m),a.clear()}function m(e){jf.RO.removeAllWhere(e,g)}function g(e){return null===e}}(Lf||(Lf={}));var Hf,Xf=__webpack_require__(4050),Yf=__webpack_require__(1122);class Gf{constructor(e){this._onScrollFrame=()=>{if(!this._scrollTarget)return;let{element:e,edge:t,distance:i}=this._scrollTarget,n=Hf.SCROLL_EDGE_SIZE-i,s=Math.pow(n/Hf.SCROLL_EDGE_SIZE,2),r=Math.max(1,Math.round(s*Hf.SCROLL_EDGE_SIZE));switch(t){case"top":e.scrollTop-=r;break;case"left":e.scrollLeft-=r;break;case"right":e.scrollLeft+=r;break;case"bottom":e.scrollTop+=r}requestAnimationFrame(this._onScrollFrame)},this._disposed=!1,this._dropAction="none",this._override=null,this._currentTarget=null,this._currentElement=null,this._promise=null,this._scrollTarget=null,this._resolve=null,this.document=e.document||document,this.mimeData=e.mimeData,this.dragImage=e.dragImage||null,this.proposedAction=e.proposedAction||"copy",this.supportedActions=e.supportedActions||"all",this.source=e.source||null}dispose(){if(!this._disposed){if(this._disposed=!0,this._currentTarget){let e=new PointerEvent("pointerup",{bubbles:!0,cancelable:!0,clientX:-1,clientY:-1});Hf.dispatchDragLeave(this,this._currentTarget,null,e)}this._finalize("none")}}get isDisposed(){return this._disposed}start(e,t){if(this._disposed)return Promise.resolve("none");if(this._promise)return this._promise;this._addListeners(),this._attachDragImage(e,t),this._promise=new Promise((e=>{this._resolve=e}));let i=new PointerEvent("pointermove",{bubbles:!0,cancelable:!0,clientX:e,clientY:t});return document.dispatchEvent(i),this._promise}handleEvent(e){switch(e.type){case"pointermove":this._evtPointerMove(e);break;case"pointerup":this._evtPointerUp(e);break;case"keydown":this._evtKeyDown(e);break;default:e.preventDefault(),e.stopPropagation()}}moveDragImage(e,t){this.dragImage&&(this.dragImage.style.transform=`translate(${e}px, ${t}px)`)}_evtPointerMove(e){e.preventDefault(),e.stopPropagation(),this._updateCurrentTarget(e),this._updateDragScroll(e),this.moveDragImage(e.clientX,e.clientY)}_evtPointerUp(e){if(e.preventDefault(),e.stopPropagation(),0!==e.button)return;if(this._updateCurrentTarget(e),!this._currentTarget)return void this._finalize("none");if("none"===this._dropAction)return Hf.dispatchDragLeave(this,this._currentTarget,null,e),void this._finalize("none");let t=Hf.dispatchDrop(this,this._currentTarget,e);this._finalize(t)}_evtKeyDown(e){e.preventDefault(),e.stopPropagation(),27===e.keyCode&&this.dispose()}_addListeners(){document.addEventListener("pointerdown",this,!0),document.addEventListener("pointermove",this,!0),document.addEventListener("pointerup",this,!0),document.addEventListener("pointerenter",this,!0),document.addEventListener("pointerleave",this,!0),document.addEventListener("pointerover",this,!0),document.addEventListener("pointerout",this,!0),document.addEventListener("keydown",this,!0),document.addEventListener("keyup",this,!0),document.addEventListener("keypress",this,!0),document.addEventListener("contextmenu",this,!0)}_removeListeners(){document.removeEventListener("pointerdown",this,!0),document.removeEventListener("pointermove",this,!0),document.removeEventListener("pointerup",this,!0),document.removeEventListener("pointerenter",this,!0),document.removeEventListener("pointerleave",this,!0),document.removeEventListener("pointerover",this,!0),document.removeEventListener("pointerout",this,!0),document.removeEventListener("keydown",this,!0),document.removeEventListener("keyup",this,!0),document.removeEventListener("keypress",this,!0),document.removeEventListener("contextmenu",this,!0)}_updateDragScroll(e){let t=Hf.findScrollTarget(e);(this._scrollTarget||t)&&(this._scrollTarget||setTimeout(this._onScrollFrame,500),this._scrollTarget=t)}_updateCurrentTarget(e){let t=this._currentTarget,i=this._currentTarget,n=this._currentElement,s=Hf.findElementBehidBackdrop(e,this.document);this._currentElement=s,s!==n&&s!==i&&Hf.dispatchDragExit(this,i,s,e),s!==n&&s!==i&&(i=Hf.dispatchDragEnter(this,s,i,e)),i!==t&&(this._currentTarget=i,Hf.dispatchDragLeave(this,t,i,e));let r=Hf.dispatchDragOver(this,i,e);this._setDropAction(r)}_attachDragImage(e,t){if(!this.dragImage)return;this.dragImage.classList.add("lm-mod-drag-image");let i=this.dragImage.style;i.pointerEvents="none",i.position="fixed",i.transform=`translate(${e}px, ${t}px)`,(this.document instanceof Document?this.document.body:this.document.firstElementChild).appendChild(this.dragImage)}_detachDragImage(){if(!this.dragImage)return;let e=this.dragImage.parentNode;e&&e.removeChild(this.dragImage)}_setDropAction(e){if(e=Hf.validateAction(e,this.supportedActions),!this._override||this._dropAction!==e)switch(e){case"none":this._dropAction=e,this._override=Gf.overrideCursor("no-drop",this.document);break;case"copy":this._dropAction=e,this._override=Gf.overrideCursor("copy",this.document);break;case"link":this._dropAction=e,this._override=Gf.overrideCursor("alias",this.document);break;case"move":this._dropAction=e,this._override=Gf.overrideCursor("move",this.document)}}_finalize(e){let t=this._resolve;this._removeListeners(),this._detachDragImage(),this._override&&(this._override.dispose(),this._override=null),this.mimeData.clear(),this._disposed=!0,this._dropAction="none",this._currentTarget=null,this._currentElement=null,this._scrollTarget=null,this._promise=null,this._resolve=null,t&&t(e)}}function Zf(){return em.keyboardLayout}!function(e){class t extends DragEvent{constructor(e,t){super(t.type,{bubbles:!0,cancelable:!0,altKey:e.altKey,button:e.button,clientX:e.clientX,clientY:e.clientY,ctrlKey:e.ctrlKey,detail:0,metaKey:e.metaKey,relatedTarget:t.related,screenX:e.screenX,screenY:e.screenY,shiftKey:e.shiftKey,view:window});const{drag:i}=t;this.dropAction="none",this.mimeData=i.mimeData,this.proposedAction=i.proposedAction,this.supportedActions=i.supportedActions,this.source=i.source}}e.Event=t,e.overrideCursor=function(e,t=document){return Hf.overrideCursor(e,t)}}(Gf||(Gf={})),function(e){function t(t,n=document){if(i&&t==i.event)return i.element;e.cursorBackdrop.style.zIndex="-1000";const s=n.elementFromPoint(t.clientX,t.clientY);return e.cursorBackdrop.style.zIndex="",i={event:t,element:s},s}e.SCROLL_EDGE_SIZE=20,e.validateAction=function(e,t){return n[e]&s[t]?e:"none"},e.findElementBehidBackdrop=t;let i=null;e.findScrollTarget=function(i){let n=i.clientX,s=i.clientY,r=t(i);for(;r;r=r.parentElement){if(!r.hasAttribute("data-lm-dragscroll"))continue;let t=0,i=0;r===document.body&&(t=window.pageXOffset,i=window.pageYOffset);let o=r.getBoundingClientRect(),a=o.top+i,l=o.left+t,h=l+o.width,c=a+o.height;if(n=h||s=c)continue;let d,u=n-l+1,p=s-a+1,f=h-n,m=c-s,g=Math.min(u,p,f,m);if(g>e.SCROLL_EDGE_SIZE)continue;switch(g){case m:d="bottom";break;case p:d="top";break;case f:d="right";break;case u:d="left";break;default:throw"unreachable"}let v,O=r.scrollWidth-r.clientWidth,b=r.scrollHeight-r.clientHeight;switch(d){case"top":v=b>0&&r.scrollTop>0;break;case"left":v=O>0&&r.scrollLeft>0;break;case"right":v=O>0&&r.scrollLeft0&&r.scrollTop{n===o&&e.cursorBackdrop.isConnected&&(document.removeEventListener("pointermove",r,!0),s.removeChild(e.cursorBackdrop))}))};let o=0;e.cursorBackdrop=function(){const e=document.createElement("div");return e.classList.add("lm-cursor-backdrop"),e}()}(Hf||(Hf={}));class Kf{constructor(e,t,i=[]){this.name=e,this._codes=t,this._keys=Kf.extractKeys(t),this._modifierKeys=Kf.convertToKeySet(i)}keys(){return Object.keys(this._keys)}isValidKey(e){return e in this._keys}isModifierKey(e){return e in this._modifierKeys}keyForKeydownEvent(e){return this._codes[e.keyCode]||""}}!function(e){e.extractKeys=function(e){let t=Object.create(null);for(let i in e)t[e[i]]=!0;return t},e.convertToKeySet=function(e){let t=Object(null);for(let i=0,n=e.length;i{this._commands.delete(e),this._commandChanged.emit({id:e,type:"removed"})}))}notifyCommandChanged(e){if(void 0!==e&&!this._commands.has(e))throw new Error(`Command '${e}' is not registered.`);this._commandChanged.emit({id:e,type:e?"changed":"many-changed"})}describedBy(e,t=Wf.JSONExt.emptyObject){var i;let n=this._commands.get(e);return Promise.resolve(null!==(i=null==n?void 0:n.describedBy.call(void 0,t))&&void 0!==i?i:{args:null})}label(e,t=Wf.JSONExt.emptyObject){var i;let n=this._commands.get(e);return null!==(i=null==n?void 0:n.label.call(void 0,t))&&void 0!==i?i:""}mnemonic(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.mnemonic.call(void 0,t):-1}icon(e,t=Wf.JSONExt.emptyObject){var i;return null===(i=this._commands.get(e))||void 0===i?void 0:i.icon.call(void 0,t)}iconClass(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.iconClass.call(void 0,t):""}iconLabel(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.iconLabel.call(void 0,t):""}caption(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.caption.call(void 0,t):""}usage(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.usage.call(void 0,t):""}className(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.className.call(void 0,t):""}dataset(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return i?i.dataset.call(void 0,t):{}}isEnabled(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return!!i&&i.isEnabled.call(void 0,t)}isToggled(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return!!i&&i.isToggled.call(void 0,t)}isToggleable(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return!!i&&i.isToggleable}isVisible(e,t=Wf.JSONExt.emptyObject){let i=this._commands.get(e);return!!i&&i.isVisible.call(void 0,t)}execute(e,t=Wf.JSONExt.emptyObject){let i,n=this._commands.get(e);if(!n)return Promise.reject(new Error(`Command '${e}' not registered.`));try{i=n.execute.call(void 0,t)}catch(e){i=Promise.reject(e)}let s=Promise.resolve(i);return this._commandExecuted.emit({id:e,args:t,result:s}),s}addKeyBinding(e){let t=tm.createKeyBinding(e);return this._keyBindings.push(t),this._keyBindingChanged.emit({binding:t,type:"added"}),new Yf.DisposableDelegate((()=>{jf.RO.removeFirstOf(this._keyBindings,t),this._keyBindingChanged.emit({binding:t,type:"removed"})}))}processKeydownEvent(e){if(this._replaying||lm.isModifierKeyPressed(e))return;let t=lm.keystrokeForKeydownEvent(e);if(!t)return this._replayKeydownEvents(),void this._clearPendingState();this._keystrokes.push(t);let{exact:i,partial:n}=tm.matchKeyBinding(this._keyBindings,this._keystrokes,e);return i||n?(e.preventDefault(),e.stopPropagation(),i&&!n?(this._executeKeyBinding(i),void this._clearPendingState()):(i&&(this._exactKeyMatch=i),this._keydownEvents.push(e),void this._startTimer())):(this._replayKeydownEvents(),void this._clearPendingState())}_startTimer(){this._clearTimer(),this._timerID=window.setTimeout((()=>{this._onPendingTimeout()}),tm.CHORD_TIMEOUT)}_clearTimer(){0!==this._timerID&&(clearTimeout(this._timerID),this._timerID=0)}_replayKeydownEvents(){0!==this._keydownEvents.length&&(this._replaying=!0,this._keydownEvents.forEach(tm.replayKeyEvent),this._replaying=!1)}_executeKeyBinding(e){let{command:t,args:i}=e;if(this.hasCommand(t)&&this.isEnabled(t,i))this.execute(t,i);else{let i=this.hasCommand(t)?"enabled":"registered",n=`Cannot execute key binding '${e.keys.join(", ")}':`,s=`command '${t}' is not ${i}.`;console.warn(`${n} ${s}`)}}_clearPendingState(){this._clearTimer(),this._exactKeyMatch=null,this._keystrokes.length=0,this._keydownEvents.length=0}_onPendingTimeout(){this._timerID=0,this._exactKeyMatch?this._executeKeyBinding(this._exactKeyMatch):this._replayKeydownEvents(),this._clearPendingState()}}!function(e){function t(e){let t="",i=!1,n=!1,s=!1,r=!1;for(let o of e.split(/\s+/))"Accel"===o?Rf.IS_MAC?n=!0:s=!0:"Alt"===o?i=!0:"Cmd"===o?n=!0:"Ctrl"===o?s=!0:"Shift"===o?r=!0:o.length>0&&(t=o);return{cmd:n,ctrl:s,alt:i,shift:r,key:t}}function i(e){let i="",n=t(e);return n.ctrl&&(i+="Ctrl "),n.alt&&(i+="Alt "),n.shift&&(i+="Shift "),n.cmd&&Rf.IS_MAC&&(i+="Cmd "),i+n.key}e.parseKeystroke=t,e.normalizeKeystroke=i,e.normalizeKeys=function(e){let t;return t=Rf.IS_WIN?e.winKeys||e.keys:Rf.IS_MAC?e.macKeys||e.keys:e.linuxKeys||e.keys,t.map(i)},e.formatKeystroke=function(e){return"string"==typeof e?i(e):e.map(i).join(", ");function i(e){let i=[],n=Rf.IS_MAC?" ":"+",s=t(e);return s.ctrl&&i.push("Ctrl"),s.alt&&i.push("Alt"),s.shift&&i.push("Shift"),Rf.IS_MAC&&s.cmd&&i.push("Cmd"),i.push(s.key),i.map(tm.formatKey).join(n)}},e.isModifierKeyPressed=function(e){let t=Zf(),i=t.keyForKeydownEvent(e);return t.isModifierKey(i)},e.keystrokeForKeydownEvent=function(e){let t=Zf(),i=t.keyForKeydownEvent(e);if(!i||t.isModifierKey(i))return"";let n=[];return e.ctrlKey&&n.push("Ctrl"),e.altKey&&n.push("Alt"),e.shiftKey&&n.push("Shift"),e.metaKey&&Rf.IS_MAC&&n.push("Cmd"),n.push(i),n.join(" ")}}(lm||(lm={})),function(e){e.CHORD_TIMEOUT=1e3,e.createCommand=function(e){return{execute:e.execute,describedBy:h("function"==typeof e.describedBy?e.describedBy:{args:null,...e.describedBy},(()=>({args:null}))),label:h(e.label,n),mnemonic:h(e.mnemonic,s),icon:h(e.icon,l),iconClass:h(e.iconClass,n),iconLabel:h(e.iconLabel,n),caption:h(e.caption,n),usage:h(e.usage,n),className:h(e.className,n),dataset:h(e.dataset,a),isEnabled:e.isEnabled||r,isToggled:e.isToggled||o,isToggleable:e.isToggleable||!!e.isToggled,isVisible:e.isVisible||r}},e.createKeyBinding=function(e){return{keys:lm.normalizeKeys(e),selector:c(e),command:e.command,args:e.args||Wf.JSONExt.emptyObject}},e.matchKeyBinding=function(e,t,i){let n=null,s=!1,r=1/0,o=0;for(let a=0,l=e.length;ar)continue;let p=Df.calculateSpecificity(l.selector);(!n||c=o)&&(n=l,r=c,o=p)}return{exact:n,partial:s}},e.replayKeyEvent=function(e){e.target.dispatchEvent(function(e){let t=document.createEvent("Event"),i=e.bubbles||!0,n=e.cancelable||!0;return t.initEvent(e.type||"keydown",i,n),t.key=e.key||"",t.keyCode=e.keyCode||0,t.which=e.keyCode||0,t.ctrlKey=e.ctrlKey||!1,t.altKey=e.altKey||!1,t.shiftKey=e.shiftKey||!1,t.metaKey=e.metaKey||!1,t.view=e.view||window,t}(e))},e.formatKey=function(e){return Rf.IS_MAC?t.hasOwnProperty(e)?t[e]:e:i.hasOwnProperty(e)?i[e]:e};const t={Backspace:"โŒซ",Tab:"โ‡ฅ",Enter:"โŽ",Shift:"โ‡ง",Ctrl:"โŒƒ",Alt:"โŒฅ",Escape:"โŽ‹",PageUp:"โ‡ž",PageDown:"โ‡Ÿ",End:"โ†˜",Home:"โ†–",ArrowLeft:"โ†",ArrowUp:"โ†‘",ArrowRight:"โ†’",ArrowDown:"โ†“",Delete:"โŒฆ",Cmd:"โŒ˜"},i={Escape:"Esc",PageUp:"Page Up",PageDown:"Page Down",ArrowLeft:"Left",ArrowUp:"Up",ArrowRight:"Right",ArrowDown:"Down",Delete:"Del"},n=()=>"",s=()=>-1,r=()=>!0,o=()=>!1,a=()=>({}),l=()=>{};function h(e,t){return void 0===e?t:"function"==typeof e?e:()=>e}function c(e){if(-1!==e.selector.indexOf(","))throw new Error(`Selector cannot contain commas: ${e.selector}`);if(!Df.isValid(e.selector))throw new Error(`Invalid selector: ${e.selector}`);return e.selector}function d(e,t){if(e.lengtht.length?2:1}function u(e,t){let i=t.target,n=t.currentTarget;for(let t=0;null!==i;i=i.parentElement,++t){if(i.hasAttribute("data-lm-suppress-shortcuts"))return-1;if(Df.matches(i,e))return t;if(i===n)return-1}return-1}}(tm||(tm={}));class hm{constructor(e){this.type="text",this.content=e}}class cm{constructor(e,t,i,n){this.type="element",this.tag=e,this.attrs=t,this.children=i,this.renderer=n}}function dm(e){let t,i={},n=[];for(let e=1,r=arguments.length;e=n;--r){const n=t[r],o=s?e.lastChild:e.childNodes[r];"text"===n.type||(n.renderer&&n.renderer.unrender?n.renderer.unrender(o,{attrs:n.attrs,children:n.children}):i(o,n.children,0,!1)),s&&e.removeChild(o)}}e.hostMap=new WeakMap,e.asContentArray=function(e){return e?e instanceof Array?e:[e]:[]},e.createDOMNode=t,e.updateContent=function e(n,r,o){if(r===o)return;let a=function(e,t){let i=e.firstChild,n=Object.create(null);for(let e of t)"element"===e.type&&e.attrs.key&&(n[e.attrs.key]={vNode:e,element:i}),i=i.nextSibling;return n}(n,r),l=r.slice(),h=n.firstChild,c=o.length;for(let i=0;i=l.length){t(o[i],n);continue}let r=l[i],c=o[i];if(r===c){h=h.nextSibling;continue}if("text"===r.type&&"text"===c.type){h.textContent!==c.content&&(h.textContent=c.content),h=h.nextSibling;continue}if("text"===r.type||"text"===c.type){jf.RO.insert(l,i,c),t(c,n,h);continue}if(!r.renderer!=!c.renderer){jf.RO.insert(l,i,c),t(c,n,h);continue}let d=c.attrs.key;if(d&&d in a){let e=a[d];e.vNode!==r&&(jf.RO.move(l,l.indexOf(e.vNode,i+1),i),n.insertBefore(e.element,h),r=e.vNode,h=e.element)}if(r===c){h=h.nextSibling;continue}let u=r.attrs.key;u&&u!==d?(jf.RO.insert(l,i,c),t(c,n,h)):r.tag===c.tag?(s(h,r.attrs,c.attrs),c.renderer?c.renderer.render(h,{attrs:c.attrs,children:c.children}):e(h,r.children,c.children),h=h.nextSibling):(jf.RO.insert(l,i,c),t(c,n,h))}i(n,l,c,!0)};const n={key:!0,className:!0,htmlFor:!0,dataset:!0,style:!0};function s(e,t,i){if(t===i)return;let s;for(s in t)s in n||s in i||("on"===s.substr(0,2)?e[s]=null:e.removeAttribute(s));for(s in i)s in n||t[s]===i[s]||("on"===s.substr(0,2)?e[s]=i[s]:e.setAttribute(s,i[s]));t.className!==i.className&&(void 0!==i.className?e.setAttribute("class",i.className):e.removeAttribute("class")),t.htmlFor!==i.htmlFor&&(void 0!==i.htmlFor?e.setAttribute("for",i.htmlFor):e.removeAttribute("for")),t.dataset!==i.dataset&&function(e,t,i){for(let n in t)n in i||e.removeAttribute(`data-${n}`);for(let n in i)t[n]!==i[n]&&e.setAttribute(`data-${n}`,i[n])}(e,t.dataset||{},i.dataset||{}),t.style!==i.style&&function(e,t,i){let n,s=e.style;for(n in t)n in i||(s[n]="");for(n in i)t[n]!==i[n]&&(s[n]=i[n])}(e,t.style||{},i.style||{})}}(nm||(nm={}));class um{constructor(){this.sizeHint=0,this.minSize=0,this.maxSize=1/0,this.stretch=1,this.size=0,this.done=!1}}!function(e){e.calc=function(e,t){let i=e.length;if(0===i)return t;let n=0,s=0,r=0,o=0,a=0;for(let t=0;t0&&(o+=i.stretch,a++)}if(t===r)return 0;if(t<=n){for(let t=0;t=s){for(let t=0;t0&&n>l;){let t=n,s=o;for(let r=0;r0&&n>l;){let t=n/h;for(let s=0;s0&&n>l;){let t=n,s=o;for(let r=0;r=i.maxSize?(n-=i.maxSize-i.size,o-=i.stretch,i.size=i.maxSize,i.done=!0,h--,a--):(n-=l,i.size+=l)}}for(;h>0&&n>l;){let t=n/h;for(let s=0;s=i.maxSize?(n-=i.maxSize-i.size,i.size=i.maxSize,i.done=!0,h--):(n-=t,i.size+=t))}}}return 0},e.adjust=function(e,t,i){0!==e.length&&0!==i&&(i>0?function(e,t,i){let n=0;for(let i=0;i<=t;++i){let t=e[i];n+=t.maxSize-t.size}let s=0;for(let i=t+1,n=e.length;i=0&&r>0;--i){let t=e[i],n=t.maxSize-t.size;n>=r?(t.sizeHint=t.size+r,r=0):(t.sizeHint=t.size+n,r-=n)}let o=i;for(let i=t+1,n=e.length;i0;++i){let t=e[i],n=t.size-t.minSize;n>=o?(t.sizeHint=t.size-o,o=0):(t.sizeHint=t.size-n,o-=n)}}(e,t,i):function(e,t,i){let n=0;for(let i=t+1,s=e.length;i0;++i){let t=e[i],n=t.maxSize-t.size;n>=r?(t.sizeHint=t.size+r,r=0):(t.sizeHint=t.size+n,r-=n)}let o=i;for(let i=t;i>=0&&o>0;--i){let t=e[i],n=t.size-t.minSize;n>=o?(t.sizeHint=t.size-o,o=0):(t.sizeHint=t.size-n,o-=n)}}(e,t,-i))}}(sm||(sm={}));class pm{constructor(e){this._label="",this._caption="",this._mnemonic=-1,this._icon=void 0,this._iconClass="",this._iconLabel="",this._className="",this._closable=!1,this._changed=new zf.Signal(this),this._isDisposed=!1,this.owner=e.owner,void 0!==e.label&&(this._label=e.label),void 0!==e.mnemonic&&(this._mnemonic=e.mnemonic),void 0!==e.icon&&(this._icon=e.icon),void 0!==e.iconClass&&(this._iconClass=e.iconClass),void 0!==e.iconLabel&&(this._iconLabel=e.iconLabel),void 0!==e.caption&&(this._caption=e.caption),void 0!==e.className&&(this._className=e.className),void 0!==e.closable&&(this._closable=e.closable),this._dataset=e.dataset||{}}get changed(){return this._changed}get label(){return this._label}set label(e){this._label!==e&&(this._label=e,this._changed.emit(void 0))}get mnemonic(){return this._mnemonic}set mnemonic(e){this._mnemonic!==e&&(this._mnemonic=e,this._changed.emit(void 0))}get icon(){return this._icon}set icon(e){this._icon!==e&&(this._icon=e,this._changed.emit(void 0))}get iconClass(){return this._iconClass}set iconClass(e){this._iconClass!==e&&(this._iconClass=e,this._changed.emit(void 0))}get iconLabel(){return this._iconLabel}set iconLabel(e){this._iconLabel!==e&&(this._iconLabel=e,this._changed.emit(void 0))}get caption(){return this._caption}set caption(e){this._caption!==e&&(this._caption=e,this._changed.emit(void 0))}get className(){return this._className}set className(e){this._className!==e&&(this._className=e,this._changed.emit(void 0))}get closable(){return this._closable}set closable(e){this._closable!==e&&(this._closable=e,this._changed.emit(void 0))}get dataset(){return this._dataset}set dataset(e){this._dataset!==e&&(this._dataset=e,this._changed.emit(void 0))}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,zf.Signal.clearData(this))}}class fm{constructor(e={}){this._flags=0,this._layout=null,this._parent=null,this._disposed=new zf.Signal(this),this._hiddenMode=fm.HiddenMode.Display,this.node=rm.createNode(e),this.addClass("lm-Widget")}dispose(){this.isDisposed||(this.setFlag(fm.Flag.IsDisposed),this._disposed.emit(void 0),this.parent?this.parent=null:this.isAttached&&fm.detach(this),this._layout&&(this._layout.dispose(),this._layout=null),this.title.dispose(),zf.Signal.clearData(this),Lf.clearData(this),Xf.AttachedProperty.clearData(this))}get disposed(){return this._disposed}get isDisposed(){return this.testFlag(fm.Flag.IsDisposed)}get isAttached(){return this.testFlag(fm.Flag.IsAttached)}get isHidden(){return this.testFlag(fm.Flag.IsHidden)}get isVisible(){return this.testFlag(fm.Flag.IsVisible)}get title(){return rm.titleProperty.get(this)}get id(){return this.node.id}set id(e){this.node.id=e}get dataset(){return this.node.dataset}get hiddenMode(){return this._hiddenMode}set hiddenMode(e){this._hiddenMode!==e&&(this.isHidden&&this._toggleHidden(!1),e==fm.HiddenMode.Scale?this.node.style.willChange="transform":this.node.style.willChange="auto",this._hiddenMode=e,this.isHidden&&this._toggleHidden(!0))}get parent(){return this._parent}set parent(e){if(this._parent!==e){if(e&&this.contains(e))throw new Error("Invalid parent widget.");if(this._parent&&!this._parent.isDisposed){let e=new fm.ChildMessage("child-removed",this);Lf.sendMessage(this._parent,e)}if(this._parent=e,this._parent&&!this._parent.isDisposed){let e=new fm.ChildMessage("child-added",this);Lf.sendMessage(this._parent,e)}this.isDisposed||Lf.sendMessage(this,fm.Msg.ParentChanged)}}get layout(){return this._layout}set layout(e){if(this._layout!==e){if(this.testFlag(fm.Flag.DisallowLayout))throw new Error("Cannot set widget layout.");if(this._layout)throw new Error("Cannot change widget layout.");if(e.parent)throw new Error("Cannot change layout parent.");this._layout=e,e.parent=this}}*children(){this._layout&&(yield*this._layout)}contains(e){for(let t=e;t;t=t._parent)if(t===this)return!0;return!1}hasClass(e){return this.node.classList.contains(e)}addClass(e){this.node.classList.add(e)}removeClass(e){this.node.classList.remove(e)}toggleClass(e,t){return!0===t?(this.node.classList.add(e),!0):!1===t?(this.node.classList.remove(e),!1):this.node.classList.toggle(e)}update(){Lf.postMessage(this,fm.Msg.UpdateRequest)}fit(){Lf.postMessage(this,fm.Msg.FitRequest)}activate(){Lf.postMessage(this,fm.Msg.ActivateRequest)}close(){Lf.sendMessage(this,fm.Msg.CloseRequest)}show(){if(this.testFlag(fm.Flag.IsHidden)&&(!this.isAttached||this.parent&&!this.parent.isVisible||Lf.sendMessage(this,fm.Msg.BeforeShow),this.clearFlag(fm.Flag.IsHidden),this._toggleHidden(!1),!this.isAttached||this.parent&&!this.parent.isVisible||Lf.sendMessage(this,fm.Msg.AfterShow),this.parent)){let e=new fm.ChildMessage("child-shown",this);Lf.sendMessage(this.parent,e)}}hide(){if(!this.testFlag(fm.Flag.IsHidden)&&(!this.isAttached||this.parent&&!this.parent.isVisible||Lf.sendMessage(this,fm.Msg.BeforeHide),this.setFlag(fm.Flag.IsHidden),this._toggleHidden(!0),!this.isAttached||this.parent&&!this.parent.isVisible||Lf.sendMessage(this,fm.Msg.AfterHide),this.parent)){let e=new fm.ChildMessage("child-hidden",this);Lf.sendMessage(this.parent,e)}}setHidden(e){e?this.hide():this.show()}testFlag(e){return 0!=(this._flags&e)}setFlag(e){this._flags|=e}clearFlag(e){this._flags&=~e}processMessage(e){switch(e.type){case"resize":this.notifyLayout(e),this.onResize(e);break;case"update-request":this.notifyLayout(e),this.onUpdateRequest(e);break;case"fit-request":this.notifyLayout(e),this.onFitRequest(e);break;case"before-show":this.notifyLayout(e),this.onBeforeShow(e);break;case"after-show":this.setFlag(fm.Flag.IsVisible),this.notifyLayout(e),this.onAfterShow(e);break;case"before-hide":this.notifyLayout(e),this.onBeforeHide(e);break;case"after-hide":this.clearFlag(fm.Flag.IsVisible),this.notifyLayout(e),this.onAfterHide(e);break;case"before-attach":this.notifyLayout(e),this.onBeforeAttach(e);break;case"after-attach":this.isHidden||this.parent&&!this.parent.isVisible||this.setFlag(fm.Flag.IsVisible),this.setFlag(fm.Flag.IsAttached),this.notifyLayout(e),this.onAfterAttach(e);break;case"before-detach":this.notifyLayout(e),this.onBeforeDetach(e);break;case"after-detach":this.clearFlag(fm.Flag.IsVisible),this.clearFlag(fm.Flag.IsAttached),this.notifyLayout(e),this.onAfterDetach(e);break;case"activate-request":this.notifyLayout(e),this.onActivateRequest(e);break;case"close-request":this.notifyLayout(e),this.onCloseRequest(e);break;case"child-added":this.notifyLayout(e),this.onChildAdded(e);break;case"child-removed":this.notifyLayout(e),this.onChildRemoved(e);break;default:this.notifyLayout(e)}}notifyLayout(e){this._layout&&this._layout.processParentMessage(e)}onCloseRequest(e){this.parent?this.parent=null:this.isAttached&&fm.detach(this)}onResize(e){}onUpdateRequest(e){}onFitRequest(e){}onActivateRequest(e){}onBeforeShow(e){}onAfterShow(e){}onBeforeHide(e){}onAfterHide(e){}onBeforeAttach(e){}onAfterAttach(e){}onBeforeDetach(e){}onAfterDetach(e){}onChildAdded(e){}onChildRemoved(e){}_toggleHidden(e){if(e)switch(this._hiddenMode){case fm.HiddenMode.Display:this.addClass("lm-mod-hidden");break;case fm.HiddenMode.Scale:this.node.style.transform="scale(0)",this.node.setAttribute("aria-hidden","true");break;case fm.HiddenMode.ContentVisibility:this.node.style.contentVisibility="hidden",this.node.style.zIndex="-1"}else switch(this._hiddenMode){case fm.HiddenMode.Display:this.removeClass("lm-mod-hidden");break;case fm.HiddenMode.Scale:this.node.style.transform="",this.node.removeAttribute("aria-hidden");break;case fm.HiddenMode.ContentVisibility:this.node.style.contentVisibility="",this.node.style.zIndex=""}}}!function(e){var t,i,n;(t=e.HiddenMode||(e.HiddenMode={}))[t.Display=0]="Display",t[t.Scale=1]="Scale",t[t.ContentVisibility=2]="ContentVisibility",(i=e.Flag||(e.Flag={}))[i.IsDisposed=1]="IsDisposed",i[i.IsAttached=2]="IsAttached",i[i.IsHidden=4]="IsHidden",i[i.IsVisible=8]="IsVisible",i[i.DisallowLayout=16]="DisallowLayout",(n=e.Msg||(e.Msg={})).BeforeShow=new Uf("before-show"),n.AfterShow=new Uf("after-show"),n.BeforeHide=new Uf("before-hide"),n.AfterHide=new Uf("after-hide"),n.BeforeAttach=new Uf("before-attach"),n.AfterAttach=new Uf("after-attach"),n.BeforeDetach=new Uf("before-detach"),n.AfterDetach=new Uf("after-detach"),n.ParentChanged=new Uf("parent-changed"),n.UpdateRequest=new Ff("update-request"),n.FitRequest=new Ff("fit-request"),n.ActivateRequest=new Ff("activate-request"),n.CloseRequest=new Ff("close-request"),e.ChildMessage=class extends Uf{constructor(e,t){super(e),this.child=t}};class s extends Uf{constructor(e,t){super("resize"),this.width=e,this.height=t}}e.ResizeMessage=s,function(e){e.UnknownSize=new e(-1,-1)}(s=e.ResizeMessage||(e.ResizeMessage={})),e.attach=function(t,i,n=null){if(t.parent)throw new Error("Cannot attach a child widget.");if(t.isAttached||t.node.isConnected)throw new Error("Widget is already attached.");if(!i.isConnected)throw new Error("Host is not attached.");Lf.sendMessage(t,e.Msg.BeforeAttach),i.insertBefore(t.node,n),Lf.sendMessage(t,e.Msg.AfterAttach)},e.detach=function(t){if(t.parent)throw new Error("Cannot detach a child widget.");if(!t.isAttached||!t.node.isConnected)throw new Error("Widget is not attached.");Lf.sendMessage(t,e.Msg.BeforeDetach),t.node.parentNode.removeChild(t.node),Lf.sendMessage(t,e.Msg.AfterDetach)}}(fm||(fm={})),function(e){e.titleProperty=new Xf.AttachedProperty({name:"title",create:e=>new pm({owner:e})}),e.createNode=function(e){return e.node||document.createElement(e.tag||"div")}}(rm||(rm={}));class mm{constructor(e={}){this._disposed=!1,this._parent=null,this._fitPolicy=e.fitPolicy||"set-min-size"}dispose(){this._parent=null,this._disposed=!0,zf.Signal.clearData(this),Xf.AttachedProperty.clearData(this)}get isDisposed(){return this._disposed}get parent(){return this._parent}set parent(e){if(this._parent!==e){if(this._parent)throw new Error("Cannot change parent widget.");if(e.layout!==this)throw new Error("Invalid parent widget.");this._parent=e,this.init()}}get fitPolicy(){return this._fitPolicy}set fitPolicy(e){if(this._fitPolicy!==e&&(this._fitPolicy=e,this._parent)){let e=this._parent.node.style;e.minWidth="",e.minHeight="",e.maxWidth="",e.maxHeight="",this._parent.fit()}}processParentMessage(e){switch(e.type){case"resize":this.onResize(e);break;case"update-request":this.onUpdateRequest(e);break;case"fit-request":this.onFitRequest(e);break;case"before-show":this.onBeforeShow(e);break;case"after-show":this.onAfterShow(e);break;case"before-hide":this.onBeforeHide(e);break;case"after-hide":this.onAfterHide(e);break;case"before-attach":this.onBeforeAttach(e);break;case"after-attach":this.onAfterAttach(e);break;case"before-detach":this.onBeforeDetach(e);break;case"after-detach":this.onAfterDetach(e);break;case"child-removed":this.onChildRemoved(e);break;case"child-shown":this.onChildShown(e);break;case"child-hidden":this.onChildHidden(e)}}init(){for(const e of this)e.parent=this.parent}onResize(e){for(const e of this)Lf.sendMessage(e,fm.ResizeMessage.UnknownSize)}onUpdateRequest(e){for(const e of this)Lf.sendMessage(e,fm.ResizeMessage.UnknownSize)}onBeforeAttach(e){for(const t of this)Lf.sendMessage(t,e)}onAfterAttach(e){for(const t of this)Lf.sendMessage(t,e)}onBeforeDetach(e){for(const t of this)Lf.sendMessage(t,e)}onAfterDetach(e){for(const t of this)Lf.sendMessage(t,e)}onBeforeShow(e){for(const t of this)t.isHidden||Lf.sendMessage(t,e)}onAfterShow(e){for(const t of this)t.isHidden||Lf.sendMessage(t,e)}onBeforeHide(e){for(const t of this)t.isHidden||Lf.sendMessage(t,e)}onAfterHide(e){for(const t of this)t.isHidden||Lf.sendMessage(t,e)}onChildRemoved(e){this.removeWidget(e.child)}onFitRequest(e){}onChildShown(e){}onChildHidden(e){}}!function(e){e.getHorizontalAlignment=function(e){return om.horizontalAlignmentProperty.get(e)},e.setHorizontalAlignment=function(e,t){om.horizontalAlignmentProperty.set(e,t)},e.getVerticalAlignment=function(e){return om.verticalAlignmentProperty.get(e)},e.setVerticalAlignment=function(e,t){om.verticalAlignmentProperty.set(e,t)}}(mm||(mm={}));class gm{constructor(e){this._top=NaN,this._left=NaN,this._width=NaN,this._height=NaN,this._minWidth=0,this._minHeight=0,this._maxWidth=1/0,this._maxHeight=1/0,this._disposed=!1,this.widget=e,this.widget.node.style.position="absolute",this.widget.node.style.contain="strict"}dispose(){if(this._disposed)return;this._disposed=!0;let e=this.widget.node.style;e.position="",e.top="",e.left="",e.width="",e.height="",e.contain=""}get minWidth(){return this._minWidth}get minHeight(){return this._minHeight}get maxWidth(){return this._maxWidth}get maxHeight(){return this._maxHeight}get isDisposed(){return this._disposed}get isHidden(){return this.widget.isHidden}get isVisible(){return this.widget.isVisible}get isAttached(){return this.widget.isAttached}fit(){let e=Af.sizeLimits(this.widget.node);this._minWidth=e.minWidth,this._minHeight=e.minHeight,this._maxWidth=e.maxWidth,this._maxHeight=e.maxHeight}update(e,t,i,n){let s=Math.max(this._minWidth,Math.min(i,this._maxWidth)),r=Math.max(this._minHeight,Math.min(n,this._maxHeight));if(s"center",changed:t}),e.verticalAlignmentProperty=new Xf.AttachedProperty({name:"verticalAlignment",create:()=>"top",changed:t})}(om||(om={}));class vm extends mm{constructor(){super(...arguments),this._widgets=[]}dispose(){for(;this._widgets.length>0;)this._widgets.pop().dispose();super.dispose()}get widgets(){return this._widgets}*[Symbol.iterator](){yield*this._widgets}addWidget(e){this.insertWidget(this._widgets.length,e)}insertWidget(e,t){t.parent=this.parent;let i=this._widgets.indexOf(t),n=Math.max(0,Math.min(e,this._widgets.length));if(-1===i)return jf.RO.insert(this._widgets,n,t),void(this.parent&&this.attachWidget(n,t));n===this._widgets.length&&n--,i!==n&&(jf.RO.move(this._widgets,i,n),this.parent&&this.moveWidget(i,n,t))}removeWidget(e){this.removeWidgetAt(this._widgets.indexOf(e))}removeWidgetAt(e){let t=jf.RO.removeAt(this._widgets,e);t&&this.parent&&this.detachWidget(e,t)}init(){super.init();let e=0;for(const t of this)this.attachWidget(e++,t)}attachWidget(e,t){let i=this.parent.node.children[e];this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeAttach),this.parent.node.insertBefore(t.node,i),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterAttach)}moveWidget(e,t,i){this.parent.isAttached&&Lf.sendMessage(i,fm.Msg.BeforeDetach),this.parent.node.removeChild(i.node),this.parent.isAttached&&Lf.sendMessage(i,fm.Msg.AfterDetach);let n=this.parent.node.children[t];this.parent.isAttached&&Lf.sendMessage(i,fm.Msg.BeforeAttach),this.parent.node.insertBefore(i.node,n),this.parent.isAttached&&Lf.sendMessage(i,fm.Msg.AfterAttach)}detachWidget(e,t){this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeDetach),this.parent.node.removeChild(t.node),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterDetach)}}!function(e){e.clampDimension=function(e){return Math.max(0,Math.floor(e))}}(am||(am={}));var Om,bm,_m,ym,wm,xm,Sm,km,Tm,Cm,Pm=am;class Mm extends vm{constructor(e){super(),this.widgetOffset=0,this._fixed=0,this._spacing=4,this._dirty=!1,this._hasNormedSizes=!1,this._sizers=[],this._items=[],this._handles=[],this._box=null,this._alignment="start",this._orientation="horizontal",this.renderer=e.renderer,void 0!==e.orientation&&(this._orientation=e.orientation),void 0!==e.alignment&&(this._alignment=e.alignment),void 0!==e.spacing&&(this._spacing=am.clampDimension(e.spacing))}dispose(){for(const e of this._items)e.dispose();this._box=null,this._items.length=0,this._sizers.length=0,this._handles.length=0,super.dispose()}get orientation(){return this._orientation}set orientation(e){this._orientation!==e&&(this._orientation=e,this.parent&&(this.parent.dataset.orientation=e,this.parent.fit()))}get alignment(){return this._alignment}set alignment(e){this._alignment!==e&&(this._alignment=e,this.parent&&(this.parent.dataset.alignment=e,this.parent.update()))}get spacing(){return this._spacing}set spacing(e){e=am.clampDimension(e),this._spacing!==e&&(this._spacing=e,this.parent&&this.parent.fit())}get handles(){return this._handles}absoluteSizes(){return this._sizers.map((e=>e.size))}relativeSizes(){return Om.normalize(this._sizers.map((e=>e.size)))}setRelativeSizes(e,t=!0){let i=this._sizers.length,n=e.slice(0,i);for(;n.length0&&(e.sizeHint=e.size);sm.adjust(this._sizers,e,i),this.parent&&this.parent.update()}}init(){this.parent.dataset.orientation=this.orientation,this.parent.dataset.alignment=this.alignment,super.init()}attachWidget(e,t){let i=new gm(t),n=Om.createHandle(this.renderer),s=Om.averageSize(this._sizers),r=Om.createSizer(s);jf.RO.insert(this._items,e,i),jf.RO.insert(this._sizers,e,r),jf.RO.insert(this._handles,e,n),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeAttach),this.parent.node.appendChild(t.node),this.parent.node.appendChild(n),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterAttach),this.parent.fit()}moveWidget(e,t,i){jf.RO.move(this._items,e,t),jf.RO.move(this._sizers,e,t),jf.RO.move(this._handles,e,t),this.parent.fit()}detachWidget(e,t){let i=jf.RO.removeAt(this._items,e),n=jf.RO.removeAt(this._handles,e);jf.RO.removeAt(this._sizers,e),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeDetach),this.parent.node.removeChild(t.node),this.parent.node.removeChild(n),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterDetach),i.dispose(),this.parent.fit()}onBeforeShow(e){super.onBeforeShow(e),this.parent.update()}onBeforeAttach(e){super.onBeforeAttach(e),this.parent.fit()}onChildShown(e){this.parent.fit()}onChildHidden(e){this.parent.fit()}onResize(e){this.parent.isVisible&&this._update(e.width,e.height)}onUpdateRequest(e){this.parent.isVisible&&this._update(-1,-1)}onFitRequest(e){this.parent.isAttached&&this._fit()}updateItemPosition(e,t,i,n,s,r,o){const a=this._items[e];if(a.isHidden)return;let l=this._handles[e].style;t?(i+=this.widgetOffset,a.update(i,n,o,s),i+=o,l.top=`${n}px`,l.left=`${i}px`,l.width=`${this._spacing}px`,l.height=`${s}px`):(n+=this.widgetOffset,a.update(i,n,r,o),n+=o,l.top=`${n}px`,l.left=`${i}px`,l.width=`${r}px`,l.height=`${this._spacing}px`)}_fit(){let e=0,t=-1;for(let i=0,n=this._items.length;i0&&(r.sizeHint=r.size),t.isHidden?(r.minSize=0,r.maxSize=0):(t.fit(),r.stretch=Mm.getStretch(t.widget),i?(r.minSize=t.minWidth,r.maxSize=t.maxWidth,n+=t.minWidth,s=Math.max(s,t.minHeight)):(r.minSize=t.minHeight,r.maxSize=t.maxHeight,s+=t.minHeight,n=Math.max(n,t.minWidth)))}let r=this._box=Af.boxSizing(this.parent.node);n+=r.horizontalSum,s+=r.verticalSum;let o=this.parent.node.style;o.minWidth=`${n}px`,o.minHeight=`${s}px`,this._dirty=!0,this.parent.parent&&Lf.sendMessage(this.parent.parent,fm.Msg.FitRequest),this._dirty&&Lf.sendMessage(this.parent,fm.Msg.UpdateRequest)}_update(e,t){this._dirty=!1;let i=0;for(let e=0,t=this._items.length;e0){let e;if(e=h?Math.max(0,r-this._fixed):Math.max(0,o-this._fixed),this._hasNormedSizes){for(let t of this._sizers)t.sizeHint*=e;this._hasNormedSizes=!1}let t=sm.calc(this._sizers,e);if(t>0)switch(this._alignment){case"start":break;case"center":a=0,l=t/2;break;case"end":a=0,l=t;break;case"justify":a=t/i,l=0;break;default:throw"unreachable"}}for(let e=0,t=this._items.length;e0,coerce:(e,t)=>Math.max(0,Math.floor(t)),changed:function(e){e.parent&&e.parent.layout instanceof Mm&&e.parent.fit()}}),e.createSizer=function(e){let t=new um;return t.sizeHint=Math.floor(e),t},e.createHandle=function(e){let t=e.createHandle();return t.style.position="absolute",t.style.contain="style",t},e.averageSize=function(e){return e.reduce(((e,t)=>e+t.size),0)/e.length||0},e.normalize=function(e){let t=e.length;if(0===t)return[];let i=e.reduce(((e,t)=>e+Math.abs(t)),0);return 0===i?e.map((e=>1/t)):e.map((e=>e/i))}}(Om||(Om={}));class Em extends Mm{constructor(e){super({...e,orientation:e.orientation||"vertical"}),this._titles=[],this.titleSpace=e.titleSpace||22}get titleSpace(){return this.widgetOffset}set titleSpace(e){e=Pm.clampDimension(e),this.widgetOffset!==e&&(this.widgetOffset=e,this.parent&&this.parent.fit())}get titles(){return this._titles}dispose(){this.isDisposed||(this._titles.length=0,super.dispose())}updateTitle(e,t){const i=this._titles[e],n=i.classList.contains("lm-mod-expanded"),s=bm.createTitle(this.renderer,t.title,n);this._titles[e]=s,this.parent.node.replaceChild(s,i)}insertWidget(e,t){t.id||(t.id=`id-${Wf.UUID.uuid4()}`),super.insertWidget(e,t)}attachWidget(e,t){const i=bm.createTitle(this.renderer,t.title);jf.RO.insert(this._titles,e,i),this.parent.node.appendChild(i),t.node.setAttribute("role","region"),t.node.setAttribute("aria-labelledby",i.id),super.attachWidget(e,t)}moveWidget(e,t,i){jf.RO.move(this._titles,e,t),super.moveWidget(e,t,i)}detachWidget(e,t){const i=jf.RO.removeAt(this._titles,e);this.parent.node.removeChild(i),super.detachWidget(e,t)}updateItemPosition(e,t,i,n,s,r,o){const a=this._titles[e].style;a.top=`${n}px`,a.left=`${i}px`,a.height=`${this.widgetOffset}px`,a.width=t?`${s}px`:`${r}px`,super.updateItemPosition(e,t,i,n,s,r,o)}}!function(e){e.createTitle=function(e,t,i=!0){const n=e.createSectionTitle(t);return n.style.position="absolute",n.style.contain="strict",n.setAttribute("aria-label",`${t.label} Section`),n.setAttribute("aria-expanded",i?"true":"false"),n.setAttribute("aria-controls",t.owner.id),i&&n.classList.add("lm-mod-expanded"),n}}(bm||(bm={}));class Am extends fm{constructor(e={}){super(),this.addClass("lm-Panel"),this.layout=_m.createLayout(e)}get widgets(){return this.layout.widgets}addWidget(e){this.layout.addWidget(e)}insertWidget(e,t){this.layout.insertWidget(e,t)}}!function(e){e.createLayout=function(e){return e.layout||new vm}}(_m||(_m={}));class Rm extends Am{constructor(e={}){super({layout:ym.createLayout(e)}),this._handleMoved=new zf.Signal(this),this._pressData=null,this.addClass("lm-SplitPanel")}dispose(){this._releaseMouse(),super.dispose()}get orientation(){return this.layout.orientation}set orientation(e){this.layout.orientation=e}get alignment(){return this.layout.alignment}set alignment(e){this.layout.alignment=e}get spacing(){return this.layout.spacing}set spacing(e){this.layout.spacing=e}get renderer(){return this.layout.renderer}get handleMoved(){return this._handleMoved}get handles(){return this.layout.handles}relativeSizes(){return this.layout.relativeSizes()}setRelativeSizes(e,t=!0){this.layout.setRelativeSizes(e,t)}handleEvent(e){switch(e.type){case"pointerdown":this._evtPointerDown(e);break;case"pointermove":this._evtPointerMove(e);break;case"pointerup":this._evtPointerUp(e);break;case"keydown":this._evtKeyDown(e);break;case"contextmenu":e.preventDefault(),e.stopPropagation()}}onBeforeAttach(e){this.node.addEventListener("pointerdown",this)}onAfterDetach(e){this.node.removeEventListener("pointerdown",this),this._releaseMouse()}onChildAdded(e){e.child.addClass("lm-SplitPanel-child"),this._releaseMouse()}onChildRemoved(e){e.child.removeClass("lm-SplitPanel-child"),this._releaseMouse()}_evtKeyDown(e){this._pressData&&(e.preventDefault(),e.stopPropagation()),27===e.keyCode&&this._releaseMouse()}_evtPointerDown(e){if(0!==e.button)return;let t,i=this.layout,n=jf.RO.findFirstIndex(i.handles,(t=>t.contains(e.target)));if(-1===n)return;e.preventDefault(),e.stopPropagation(),document.addEventListener("pointerup",this,!0),document.addEventListener("pointermove",this,!0),document.addEventListener("keydown",this,!0),document.addEventListener("contextmenu",this,!0);let s=i.handles[n],r=s.getBoundingClientRect();t="horizontal"===i.orientation?e.clientX-r.left:e.clientY-r.top;let o=window.getComputedStyle(s),a=Gf.overrideCursor(o.cursor);this._pressData={index:n,delta:t,override:a}}_evtPointerMove(e){let t;e.preventDefault(),e.stopPropagation();let i=this.layout,n=this.node.getBoundingClientRect();t="horizontal"===i.orientation?e.clientX-n.left-this._pressData.delta:e.clientY-n.top-this._pressData.delta,i.moveHandle(this._pressData.index,t)}_evtPointerUp(e){0===e.button&&(e.preventDefault(),e.stopPropagation(),this._releaseMouse())}_releaseMouse(){this._pressData&&(this._pressData.override.dispose(),this._pressData=null,this._handleMoved.emit(),document.removeEventListener("keydown",this,!0),document.removeEventListener("pointerup",this,!0),document.removeEventListener("pointermove",this,!0),document.removeEventListener("contextmenu",this,!0))}}!function(e){class t{createHandle(){let e=document.createElement("div");return e.className="lm-SplitPanel-handle",e}}e.Renderer=t,e.defaultRenderer=new t,e.getStretch=function(e){return Mm.getStretch(e)},e.setStretch=function(e,t){Mm.setStretch(e,t)}}(Rm||(Rm={})),function(e){e.createLayout=function(e){return e.layout||new Mm({renderer:e.renderer||Rm.defaultRenderer,orientation:e.orientation,alignment:e.alignment,spacing:e.spacing})}}(ym||(ym={}));class Dm extends Rm{constructor(e={}){super({...e,layout:wm.createLayout(e)}),this._widgetSizesCache=new WeakMap,this._expansionToggled=new zf.Signal(this),this.addClass("lm-AccordionPanel")}get renderer(){return this.layout.renderer}get titleSpace(){return this.layout.titleSpace}set titleSpace(e){this.layout.titleSpace=e}get titles(){return this.layout.titles}get expansionToggled(){return this._expansionToggled}addWidget(e){super.addWidget(e),e.title.changed.connect(this._onTitleChanged,this)}collapse(e){const t=this.layout.widgets[e];t&&!t.isHidden&&this._toggleExpansion(e)}expand(e){const t=this.layout.widgets[e];t&&t.isHidden&&this._toggleExpansion(e)}insertWidget(e,t){super.insertWidget(e,t),t.title.changed.connect(this._onTitleChanged,this)}handleEvent(e){switch(super.handleEvent(e),e.type){case"click":this._evtClick(e);break;case"keydown":this._eventKeyDown(e)}}onBeforeAttach(e){this.node.addEventListener("click",this),this.node.addEventListener("keydown",this),super.onBeforeAttach(e)}onAfterDetach(e){super.onAfterDetach(e),this.node.removeEventListener("click",this),this.node.removeEventListener("keydown",this)}_onTitleChanged(e){const t=jf.RO.findFirstIndex(this.widgets,(t=>t.contains(e.owner)));t>=0&&(this.layout.updateTitle(t,e.owner),this.update())}_computeWidgetSize(e){const t=this.layout,i=t.widgets[e];if(!i)return;const n=i.isHidden,s=t.absoluteSizes(),r=(n?-1:1)*this.spacing,o=s.reduce(((e,t)=>e+t));let a=[...s];if(n){const t=this._widgetSizesCache.get(i);if(!t)return;a[e]+=t;const n=a.map((e=>e-t>0)).lastIndexOf(!0);-1===n?a.forEach(((i,n)=>{n!==e&&(a[n]-=s[n]/o*(t-r))})):a[n]-=t-r}else{const t=s[e];this._widgetSizesCache.set(i,t),a[e]=0;const n=a.map((e=>e>0)).lastIndexOf(!0);if(-1===n)return;a[n]=s[n]+t+r}return a.map((e=>e/(o+r)))}_evtClick(e){const t=e.target;if(t){const i=jf.RO.findFirstIndex(this.titles,(e=>e.contains(t)));i>=0&&(e.preventDefault(),e.stopPropagation(),this._toggleExpansion(i))}}_eventKeyDown(e){if(e.defaultPrevented)return;const t=e.target;let i=!1;if(t){const n=jf.RO.findFirstIndex(this.titles,(e=>e.contains(t)));if(n>=0){const s=e.keyCode.toString();if(e.key.match(/Space|Enter/)||s.match(/13|32/))t.click(),i=!0;else if("horizontal"===this.orientation?e.key.match(/ArrowLeft|ArrowRight/)||s.match(/37|39/):e.key.match(/ArrowUp|ArrowDown/)||s.match(/38|40/)){const t=e.key.match(/ArrowLeft|ArrowUp/)||s.match(/37|38/)?-1:1,r=this.titles.length,o=(n+r+t)%r;this.titles[o].focus(),i=!0}else"End"===e.key||"35"===s?(this.titles[this.titles.length-1].focus(),i=!0):"Home"!==e.key&&"36"!==s||(this.titles[0].focus(),i=!0)}i&&e.preventDefault()}}_toggleExpansion(e){const t=this.titles[e],i=this.layout.widgets[e],n=this._computeWidgetSize(e);n&&this.setRelativeSizes(n,!1),i.isHidden?(t.classList.add("lm-mod-expanded"),t.setAttribute("aria-expanded","true"),i.show()):(t.classList.remove("lm-mod-expanded"),t.setAttribute("aria-expanded","false"),i.hide()),this._expansionToggled.emit(e)}}!function(e){class t extends Rm.Renderer{constructor(){super(),this.titleClassName="lm-AccordionPanel-title",this._titleID=0,this._titleKeys=new WeakMap,this._uuid=++t._nInstance}createCollapseIcon(e){return document.createElement("span")}createSectionTitle(e){const t=document.createElement("h3");t.setAttribute("tabindex","0"),t.id=this.createTitleKey(e),t.className=this.titleClassName;for(const i in e.dataset)t.dataset[i]=e.dataset[i];t.appendChild(this.createCollapseIcon(e)).className="lm-AccordionPanel-titleCollapser";const i=t.appendChild(document.createElement("span"));return i.className="lm-AccordionPanel-titleLabel",i.textContent=e.label,i.title=e.caption||e.label,t}createTitleKey(e){let t=this._titleKeys.get(e);return void 0===t&&(t=`title-key-${this._uuid}-${this._titleID++}`,this._titleKeys.set(e,t)),t}}t._nInstance=0,e.Renderer=t,e.defaultRenderer=new t}(Dm||(Dm={})),function(e){e.createLayout=function(e){return e.layout||new Em({renderer:e.renderer||Dm.defaultRenderer,orientation:e.orientation,alignment:e.alignment,spacing:e.spacing,titleSpace:e.titleSpace})}}(wm||(wm={}));class Im extends vm{constructor(e={}){super(),this._fixed=0,this._spacing=4,this._dirty=!1,this._sizers=[],this._items=[],this._box=null,this._alignment="start",this._direction="top-to-bottom",void 0!==e.direction&&(this._direction=e.direction),void 0!==e.alignment&&(this._alignment=e.alignment),void 0!==e.spacing&&(this._spacing=Pm.clampDimension(e.spacing))}dispose(){for(const e of this._items)e.dispose();this._box=null,this._items.length=0,this._sizers.length=0,super.dispose()}get direction(){return this._direction}set direction(e){this._direction!==e&&(this._direction=e,this.parent&&(this.parent.dataset.direction=e,this.parent.fit()))}get alignment(){return this._alignment}set alignment(e){this._alignment!==e&&(this._alignment=e,this.parent&&(this.parent.dataset.alignment=e,this.parent.update()))}get spacing(){return this._spacing}set spacing(e){e=Pm.clampDimension(e),this._spacing!==e&&(this._spacing=e,this.parent&&this.parent.fit())}init(){this.parent.dataset.direction=this.direction,this.parent.dataset.alignment=this.alignment,super.init()}attachWidget(e,t){jf.RO.insert(this._items,e,new gm(t)),jf.RO.insert(this._sizers,e,new um),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeAttach),this.parent.node.appendChild(t.node),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterAttach),this.parent.fit()}moveWidget(e,t,i){jf.RO.move(this._items,e,t),jf.RO.move(this._sizers,e,t),this.parent.update()}detachWidget(e,t){let i=jf.RO.removeAt(this._items,e);jf.RO.removeAt(this._sizers,e),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeDetach),this.parent.node.removeChild(t.node),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterDetach),i.dispose(),this.parent.fit()}onBeforeShow(e){super.onBeforeShow(e),this.parent.update()}onBeforeAttach(e){super.onBeforeAttach(e),this.parent.fit()}onChildShown(e){this.parent.fit()}onChildHidden(e){this.parent.fit()}onResize(e){this.parent.isVisible&&this._update(e.width,e.height)}onUpdateRequest(e){this.parent.isVisible&&this._update(-1,-1)}onFitRequest(e){this.parent.isAttached&&this._fit()}_fit(){let e=0;for(let t=0,i=this._items.length;t0)switch(this._alignment){case"start":break;case"center":l=0,h=n/2;break;case"end":l=0,h=n;break;case"justify":l=n/i,h=0;break;default:throw"unreachable"}for(let e=0,t=this._items.length;e0,coerce:(e,t)=>Math.max(0,Math.floor(t)),changed:t}),e.sizeBasisProperty=new Xf.AttachedProperty({name:"sizeBasis",create:()=>0,coerce:(e,t)=>Math.max(0,Math.floor(t)),changed:t}),e.isHorizontal=function(e){return"left-to-right"===e||"right-to-left"===e},e.clampSpacing=function(e){return Math.max(0,Math.floor(e))}}(xm||(xm={}));class qm extends Am{constructor(e={}){super({layout:Sm.createLayout(e)}),this.addClass("lm-BoxPanel")}get direction(){return this.layout.direction}set direction(e){this.layout.direction=e}get alignment(){return this.layout.alignment}set alignment(e){this.layout.alignment=e}get spacing(){return this.layout.spacing}set spacing(e){this.layout.spacing=e}onChildAdded(e){e.child.addClass("lm-BoxPanel-child")}onChildRemoved(e){e.child.removeClass("lm-BoxPanel-child")}}!function(e){e.getStretch=function(e){return Im.getStretch(e)},e.setStretch=function(e,t){Im.setStretch(e,t)},e.getSizeBasis=function(e){return Im.getSizeBasis(e)},e.setSizeBasis=function(e,t){Im.setSizeBasis(e,t)}}(qm||(qm={})),function(e){e.createLayout=function(e){return e.layout||new Im(e)}}(Sm||(Sm={}));class Lm extends fm{constructor(e){super({node:km.createNode()}),this._activeIndex=-1,this._items=[],this._results=null,this.addClass("lm-CommandPalette"),this.setFlag(fm.Flag.DisallowLayout),this.commands=e.commands,this.renderer=e.renderer||Lm.defaultRenderer,this.commands.commandChanged.connect(this._onGenericChange,this),this.commands.keyBindingChanged.connect(this._onGenericChange,this)}dispose(){this._items.length=0,this._results=null,super.dispose()}get searchNode(){return this.node.getElementsByClassName("lm-CommandPalette-search")[0]}get inputNode(){return this.node.getElementsByClassName("lm-CommandPalette-input")[0]}get contentNode(){return this.node.getElementsByClassName("lm-CommandPalette-content")[0]}get items(){return this._items}addItem(e){let t=km.createItem(this.commands,e);return this._items.push(t),this.refresh(),t}addItems(e){const t=e.map((e=>km.createItem(this.commands,e)));return t.forEach((e=>this._items.push(e))),this.refresh(),t}removeItem(e){this.removeItemAt(this._items.indexOf(e))}removeItemAt(e){jf.RO.removeAt(this._items,e)&&this.refresh()}clearItems(){0!==this._items.length&&(this._items.length=0,this.refresh())}refresh(){this._results=null,""!==this.inputNode.value?this.node.getElementsByClassName("lm-close-icon")[0].style.display="inherit":this.node.getElementsByClassName("lm-close-icon")[0].style.display="none",this.update()}handleEvent(e){switch(e.type){case"click":this._evtClick(e);break;case"keydown":this._evtKeyDown(e);break;case"input":this.refresh();break;case"focus":case"blur":this._toggleFocused()}}onBeforeAttach(e){this.node.addEventListener("click",this),this.node.addEventListener("keydown",this),this.node.addEventListener("input",this),this.node.addEventListener("focus",this,!0),this.node.addEventListener("blur",this,!0)}onAfterDetach(e){this.node.removeEventListener("click",this),this.node.removeEventListener("keydown",this),this.node.removeEventListener("input",this),this.node.removeEventListener("focus",this,!0),this.node.removeEventListener("blur",this,!0)}onAfterShow(e){this.update(),super.onAfterShow(e)}onActivateRequest(e){if(this.isAttached){let e=this.inputNode;e.focus(),e.select()}}onUpdateRequest(e){if(this.isHidden)return;let t=this.inputNode.value,i=this.contentNode,n=this._results;if(n||(n=this._results=km.search(this._items,t),this._activeIndex=t?jf.RO.findFirstIndex(n,km.canActivate):-1),!t&&0===n.length)return void im.render(null,i);if(t&&0===n.length){let e=this.renderer.renderEmptyMessage({query:t});return void im.render(e,i)}let s=this.renderer,r=this._activeIndex,o=new Array(n.length);for(let e=0,t=n.length;e=n.length)i.scrollTop=0;else{let e=i.children[r];Af.scrollIntoViewIfNeeded(i,e)}}_evtClick(e){if(0!==e.button)return;if(e.target.classList.contains("lm-close-icon"))return this.inputNode.value="",void this.refresh();let t=jf.RO.findFirstIndex(this.contentNode.children,(t=>t.contains(e.target)));-1!==t&&(e.preventDefault(),e.stopPropagation(),this._execute(t))}_evtKeyDown(e){if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey))switch(e.keyCode){case 13:e.preventDefault(),e.stopPropagation(),this._execute(this._activeIndex);break;case 38:e.preventDefault(),e.stopPropagation(),this._activatePreviousItem();break;case 40:e.preventDefault(),e.stopPropagation(),this._activateNextItem()}}_activateNextItem(){if(!this._results||0===this._results.length)return;let e=this._activeIndex,t=this._results.length,i=ee-t)),h=r.slice(0,l),c=r.slice(l);for(let e=0,t=c.length;ei.command===e&&Wf.JSONExt.deepEqual(i.args,t)))||null}}}(km||(km={}));class Nm extends fm{constructor(e){super({node:Tm.createNode()}),this._childIndex=-1,this._activeIndex=-1,this._openTimerID=0,this._closeTimerID=0,this._items=[],this._childMenu=null,this._parentMenu=null,this._aboutToClose=new zf.Signal(this),this._menuRequested=new zf.Signal(this),this.addClass("lm-Menu"),this.setFlag(fm.Flag.DisallowLayout),this.commands=e.commands,this.renderer=e.renderer||Nm.defaultRenderer}dispose(){this.close(),this._items.length=0,super.dispose()}get aboutToClose(){return this._aboutToClose}get menuRequested(){return this._menuRequested}get parentMenu(){return this._parentMenu}get childMenu(){return this._childMenu}get rootMenu(){let e=this;for(;e._parentMenu;)e=e._parentMenu;return e}get leafMenu(){let e=this;for(;e._childMenu;)e=e._childMenu;return e}get contentNode(){return this.node.getElementsByClassName("lm-Menu-content")[0]}get activeItem(){return this._items[this._activeIndex]||null}set activeItem(e){this.activeIndex=e?this._items.indexOf(e):-1}get activeIndex(){return this._activeIndex}set activeIndex(e){(e<0||e>=this._items.length)&&(e=-1),-1===e||Tm.canActivate(this._items[e])||(e=-1),this._activeIndex!==e&&(this._activeIndex=e,this._activeIndex>=0&&this.contentNode.childNodes[this._activeIndex]&&this.contentNode.childNodes[this._activeIndex].focus(),this.update())}get items(){return this._items}activateNextItem(){let e=this._items.length,t=this._activeIndex,i=t{this.activeIndex=e}})}im.render(r,this.contentNode)}onCloseRequest(e){this._cancelOpenTimer(),this._cancelCloseTimer(),this.activeIndex=-1;let t=this._childMenu;t&&(this._childIndex=-1,this._childMenu=null,t._parentMenu=null,t.close());let i=this._parentMenu;i&&(this._parentMenu=null,i._childIndex=-1,i._childMenu=null,i.activate()),this.isAttached&&this._aboutToClose.emit(void 0),super.onCloseRequest(e)}_evtKeyDown(e){e.preventDefault(),e.stopPropagation();let t=e.keyCode;if(13===t)return void this.triggerActiveItem();if(27===t)return void this.close();if(37===t)return void(this._parentMenu?this.close():this._menuRequested.emit("previous"));if(38===t)return void this.activatePreviousItem();if(39===t){let e=this.activeItem;return void(e&&"submenu"===e.type?this.triggerActiveItem():this.rootMenu._menuRequested.emit("next"))}if(40===t)return void this.activateNextItem();let i=Zf().keyForKeydownEvent(e);if(!i)return;let n=this._activeIndex+1,s=Tm.findMnemonic(this._items,i,n);-1===s.index||s.multiple?-1!==s.index?this.activeIndex=s.index:-1!==s.auto&&(this.activeIndex=s.auto):(this.activeIndex=s.index,this.triggerActiveItem())}_evtMouseUp(e){0===e.button&&(e.preventDefault(),e.stopPropagation(),this.triggerActiveItem())}_evtMouseMove(e){let t=jf.RO.findFirstIndex(this.contentNode.children,(t=>Af.hitTest(t,e.clientX,e.clientY)));if(t===this._activeIndex)return;if(this.activeIndex=t,t=this.activeIndex,t===this._childIndex)return this._cancelOpenTimer(),void this._cancelCloseTimer();-1!==this._childIndex&&this._startCloseTimer(),this._cancelOpenTimer();let i=this.activeItem;i&&"submenu"===i.type&&i.submenu&&this._startOpenTimer()}_evtMouseEnter(e){for(let e=this._parentMenu;e;e=e._parentMenu)e._cancelOpenTimer(),e._cancelCloseTimer(),e.activeIndex=e._childIndex}_evtMouseLeave(e){if(this._cancelOpenTimer(),!this._childMenu)return void(this.activeIndex=-1);let{clientX:t,clientY:i}=e;Af.hitTest(this._childMenu.node,t,i)?this._cancelCloseTimer():(this.activeIndex=-1,this._startCloseTimer())}_evtMouseDown(e){this._parentMenu||(Tm.hitTestMenus(this,e.clientX,e.clientY)?(e.preventDefault(),e.stopPropagation()):this.close())}_openChildMenu(e=!1){let t=this.activeItem;if(!t||"submenu"!==t.type||!t.submenu)return void this._closeChildMenu();let i=t.submenu;if(i===this._childMenu)return;Nm.saveWindowData(),this._closeChildMenu(),this._childMenu=i,this._childIndex=this._activeIndex,i._parentMenu=this,Lf.sendMessage(this,fm.Msg.UpdateRequest);let n=this.contentNode.children[this._activeIndex];Tm.openSubmenu(i,n),e&&(i.activeIndex=-1,i.activateNextItem()),i.activate()}_closeChildMenu(){this._childMenu&&this._childMenu.close()}_startOpenTimer(){0===this._openTimerID&&(this._openTimerID=window.setTimeout((()=>{this._openTimerID=0,this._openChildMenu()}),Tm.TIMER_DELAY))}_startCloseTimer(){0===this._closeTimerID&&(this._closeTimerID=window.setTimeout((()=>{this._closeTimerID=0,this._closeChildMenu()}),Tm.TIMER_DELAY))}_cancelOpenTimer(){0!==this._openTimerID&&(clearTimeout(this._openTimerID),this._openTimerID=0)}_cancelCloseTimer(){0!==this._closeTimerID&&(clearTimeout(this._closeTimerID),this._closeTimerID=0)}static saveWindowData(){Tm.saveWindowData()}}!function(e){class t{renderItem(e){let t=this.createItemClass(e),i=this.createItemDataset(e),n=this.createItemARIA(e);return dm.li({className:t,dataset:i,tabindex:"0",onfocus:e.onfocus,...n},this.renderIcon(e),this.renderLabel(e),this.renderShortcut(e),this.renderSubmenu(e))}renderIcon(e){let t=this.createIconClass(e);return dm.div({className:t},e.item.icon,e.item.iconLabel)}renderLabel(e){let t=this.formatLabel(e);return dm.div({className:"lm-Menu-itemLabel"},t)}renderShortcut(e){let t=this.formatShortcut(e);return dm.div({className:"lm-Menu-itemShortcut"},t)}renderSubmenu(e){return dm.div({className:"lm-Menu-itemSubmenuIcon"})}createItemClass(e){let t="lm-Menu-item";e.item.isEnabled||(t+=" lm-mod-disabled"),e.item.isToggled&&(t+=" lm-mod-toggled"),e.item.isVisible||(t+=" lm-mod-hidden"),e.active&&(t+=" lm-mod-active"),e.collapsed&&(t+=" lm-mod-collapsed");let i=e.item.className;return i&&(t+=` ${i}`),t}createItemDataset(e){let t,{type:i,command:n,dataset:s}=e.item;return t="command"===i?{...s,type:i,command:n}:{...s,type:i},t}createIconClass(e){let t="lm-Menu-itemIcon",i=e.item.iconClass;return i?`${t} ${i}`:t}createItemARIA(e){let t={};switch(e.item.type){case"separator":t.role="presentation";break;case"submenu":t["aria-haspopup"]="true",e.item.isEnabled||(t["aria-disabled"]="true");break;default:e.item.isEnabled||(t["aria-disabled"]="true"),t.role="menuitem"}return t}formatLabel(e){let{label:t,mnemonic:i}=e.item;if(i<0||i>=t.length)return t;let n=t.slice(0,i),s=t.slice(i+1),r=t[i];return[n,dm.span({className:"lm-Menu-itemMnemonic"},r),s]}formatShortcut(e){let t=e.item.keyBinding;return t?lm.formatKeystroke(t.keys):null}}e.Renderer=t,e.defaultRenderer=new t}(Nm||(Nm={})),function(e){e.TIMER_DELAY=300,e.SUBMENU_OVERLAP=3;let t=null,i=0;function n(){return i>0?(i--,t):r()}function s(e){return"separator"!==e.type&&e.isEnabled&&e.isVisible}function r(){return{pageXOffset:window.pageXOffset,pageYOffset:window.pageYOffset,clientWidth:document.documentElement.clientWidth,clientHeight:document.documentElement.clientHeight}}e.saveWindowData=function(){t=r(),i++},e.createNode=function(){let e=document.createElement("div"),t=document.createElement("ul");return t.className="lm-Menu-content",e.appendChild(t),t.setAttribute("role","menu"),e.tabIndex=0,e},e.canActivate=s,e.createItem=function(e,t){return new o(e.commands,t)},e.hitTestMenus=function(e,t,i){for(let n=e;n;n=n.childMenu)if(Af.hitTest(n.node,t,i))return!0;return!1},e.computeCollapsed=function(e){let t=new Array(e.length);jf.RO.fill(t,!1);let i=0,n=e.length;for(;i=0;--s){let i=e[s];if(i.isVisible){if("separator"!==i.type)break;t[s]=!0}}let r=!1;for(;++ia+h&&(t=a+h-f),!r&&i+m>l+c&&(i>l+c?i=l+c-m:i-=m),p.transform=`translate(${Math.max(0,t)}px, ${Math.max(0,i)}px`,p.opacity="1"},e.openSubmenu=function(t,i){const s=n();let r=s.pageXOffset,o=s.pageYOffset,a=s.clientWidth,l=s.clientHeight;Lf.sendMessage(t,fm.Msg.UpdateRequest);let h=l,c=t.node,d=c.style;d.opacity="0",d.maxHeight=`${h}px`,fm.attach(t,document.body);let{width:u,height:p}=c.getBoundingClientRect(),f=Af.boxSizing(t.node),m=i.getBoundingClientRect(),g=m.right-e.SUBMENU_OVERLAP;g+u>r+a&&(g=m.left+e.SUBMENU_OVERLAP-u);let v=m.top-f.borderTop-f.paddingTop;v+p>o+l&&(v=m.bottom+f.borderBottom+f.paddingBottom-p),d.transform=`translate(${Math.max(0,g)}px, ${Math.max(0,v)}px`,d.opacity="1"},e.findMnemonic=function(e,t,i){let n=-1,r=-1,o=!1,a=t.toUpperCase();for(let t=0,l=e.length;t=0&&ui.command===e&&Wf.JSONExt.deepEqual(i.args,t)))||null}return null}}}(Tm||(Tm={})),function(e){function t(e,t){let i=e.rank,n=t.rank;return i!==n?i=this._titles.length)&&(e=-1),this._currentIndex===e)return;let t=this._currentIndex,i=this._titles[t]||null,n=e,s=this._titles[n]||null;this._currentIndex=n,this._previousTitle=i,this.update(),this._currentChanged.emit({previousIndex:t,previousTitle:i,currentIndex:n,currentTitle:s})}get name(){return this._name}set name(e){this._name=e,e?this.contentNode.setAttribute("aria-label",e):this.contentNode.removeAttribute("aria-label")}get orientation(){return this._orientation}set orientation(e){this._orientation!==e&&(this._releaseMouse(),this._orientation=e,this.dataset.orientation=e,this.contentNode.setAttribute("aria-orientation",e))}get addButtonEnabled(){return this._addButtonEnabled}set addButtonEnabled(e){this._addButtonEnabled!==e&&(this._addButtonEnabled=e,e?this.addButtonNode.classList.remove("lm-mod-hidden"):this.addButtonNode.classList.add("lm-mod-hidden"))}get titles(){return this._titles}get contentNode(){return this.node.getElementsByClassName("lm-TabBar-content")[0]}get addButtonNode(){return this.node.getElementsByClassName("lm-TabBar-addButton")[0]}addTab(e){return this.insertTab(this._titles.length,e)}insertTab(e,t){this._releaseMouse();let i=Qm.asTitle(t),n=this._titles.indexOf(i),s=Math.max(0,Math.min(e,this._titles.length));return-1===n?(jf.RO.insert(this._titles,s,i),i.changed.connect(this._onTitleChanged,this),this.update(),this._adjustCurrentForInsert(s,i),i):(s===this._titles.length&&s--,n===s||(jf.RO.move(this._titles,n,s),this.update(),this._adjustCurrentForMove(n,s)),i)}removeTab(e){this.removeTabAt(this._titles.indexOf(e))}removeTabAt(e){this._releaseMouse();let t=jf.RO.removeAt(this._titles,e);t&&(t.changed.disconnect(this._onTitleChanged,this),t===this._previousTitle&&(this._previousTitle=null),this.update(),this._adjustCurrentForRemove(e,t))}clearTabs(){if(0===this._titles.length)return;this._releaseMouse();for(let e of this._titles)e.changed.disconnect(this._onTitleChanged,this);let e=this.currentIndex,t=this.currentTitle;this._currentIndex=-1,this._previousTitle=null,this._titles.length=0,this.update(),-1!==e&&this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:-1,currentTitle:null})}releaseMouse(){this._releaseMouse()}handleEvent(e){switch(e.type){case"pointerdown":this._evtPointerDown(e);break;case"pointermove":this._evtPointerMove(e);break;case"pointerup":this._evtPointerUp(e);break;case"dblclick":this._evtDblClick(e);break;case"keydown":e.eventPhase===Event.CAPTURING_PHASE?this._evtKeyDownCapturing(e):this._evtKeyDown(e);break;case"contextmenu":e.preventDefault(),e.stopPropagation()}}onBeforeAttach(e){this.node.addEventListener("pointerdown",this),this.node.addEventListener("dblclick",this),this.node.addEventListener("keydown",this)}onAfterDetach(e){this.node.removeEventListener("pointerdown",this),this.node.removeEventListener("dblclick",this),this.node.removeEventListener("keydown",this),this._releaseMouse()}onUpdateRequest(e){var t;let i=this._titles,n=this.renderer,s=this.currentTitle,r=new Array(i.length);const o=null!==(t=this._getCurrentTabindex())&&void 0!==t?t:this._currentIndex>-1?this._currentIndex:0;for(let e=0,t=i.length;eAf.hitTest(t,e.clientX,e.clientY)));if(-1===i)return;let n=this.titles[i],s=t[i].querySelector(".lm-TabBar-tabLabel");if(s&&s.contains(e.target)){let e=n.label||"",t=s.innerHTML;s.innerHTML="";let i=document.createElement("input");i.classList.add("lm-TabBar-tabInput"),i.value=e,s.appendChild(i);let r=()=>{i.removeEventListener("blur",r),s.innerHTML=t,this.node.addEventListener("keydown",this)};i.addEventListener("dblclick",(e=>e.stopPropagation())),i.addEventListener("blur",r),i.addEventListener("keydown",(e=>{"Enter"===e.key?(""!==i.value&&(n.label=n.caption=i.value),r()):"Escape"===e.key&&r()})),this.node.removeEventListener("keydown",this),i.select(),i.focus(),s.children.length>0&&s.children[0].focus()}}_evtKeyDownCapturing(e){e.eventPhase===Event.CAPTURING_PHASE&&(e.preventDefault(),e.stopPropagation(),"Escape"===e.key&&this._releaseMouse())}_evtKeyDown(e){var t,i,n;if("Tab"!==e.key&&e.eventPhase!==Event.CAPTURING_PHASE)if("Enter"===e.key||"Spacebar"===e.key||" "===e.key){const t=document.activeElement;if(this.addButtonEnabled&&this.addButtonNode.contains(t))e.preventDefault(),e.stopPropagation(),this._addRequested.emit();else{const i=jf.RO.findFirstIndex(this.contentNode.children,(e=>e.contains(t)));i>=0&&(e.preventDefault(),e.stopPropagation(),this.currentIndex=i)}}else if(Bm.includes(e.key)){const s=[...this.contentNode.children];if(this.addButtonEnabled&&s.push(this.addButtonNode),s.length<=1)return;e.preventDefault(),e.stopPropagation();let r,o=s.indexOf(document.activeElement);-1===o&&(o=this._currentIndex),"ArrowRight"===e.key&&"horizontal"===this._orientation||"ArrowDown"===e.key&&"vertical"===this._orientation?r=null!==(t=s[o+1])&&void 0!==t?t:s[0]:"ArrowLeft"===e.key&&"horizontal"===this._orientation||"ArrowUp"===e.key&&"vertical"===this._orientation?r=null!==(i=s[o-1])&&void 0!==i?i:s[s.length-1]:"Home"===e.key?r=s[0]:"End"===e.key&&(r=s[s.length-1]),r&&(null===(n=s[o])||void 0===n||n.setAttribute("tabindex","-1"),null==r||r.setAttribute("tabindex","0"),r.focus())}}_evtPointerDown(e){if(0!==e.button&&1!==e.button)return;if(this._dragData)return;if(e.target.classList.contains("lm-TabBar-tabInput"))return;let t=this.addButtonEnabled&&this.addButtonNode.contains(e.target),i=this.contentNode.children,n=jf.RO.findFirstIndex(i,(t=>Af.hitTest(t,e.clientX,e.clientY)));if(-1===n&&!t)return;if(e.preventDefault(),e.stopPropagation(),this._dragData={tab:i[n],index:n,pressX:e.clientX,pressY:e.clientY,tabPos:-1,tabSize:-1,tabPressPos:-1,targetIndex:-1,tabLayout:null,contentRect:null,override:null,dragActive:!1,dragAborted:!1,detachRequested:!1},this.document.addEventListener("pointerup",this,!0),1===e.button||t)return;let s=i[n].querySelector(this.renderer.closeIconSelector);s&&s.contains(e.target)||(this.tabsMovable&&(this.document.addEventListener("pointermove",this,!0),this.document.addEventListener("keydown",this,!0),this.document.addEventListener("contextmenu",this,!0)),this.allowDeselect&&this.currentIndex===n?this.currentIndex=-1:this.currentIndex=n,-1!==this.currentIndex&&this._tabActivateRequested.emit({index:this.currentIndex,title:this.currentTitle}))}_evtPointerMove(e){let t=this._dragData;if(!t)return;e.preventDefault(),e.stopPropagation();let i=this.contentNode.children;if(t.dragActive||Qm.dragExceeded(t,e)){if(!t.dragActive){let e=t.tab.getBoundingClientRect();"horizontal"===this._orientation?(t.tabPos=t.tab.offsetLeft,t.tabSize=e.width,t.tabPressPos=t.pressX-e.left):(t.tabPos=t.tab.offsetTop,t.tabSize=e.height,t.tabPressPos=t.pressY-e.top),t.tabPressOffset={x:t.pressX-e.left,y:t.pressY-e.top},t.tabLayout=Qm.snapTabLayout(i,this._orientation),t.contentRect=this.contentNode.getBoundingClientRect(),t.override=Gf.overrideCursor("default"),t.tab.classList.add("lm-mod-dragging"),this.addClass("lm-mod-dragging"),t.dragActive=!0}if(!t.detachRequested&&Qm.detachExceeded(t,e)){t.detachRequested=!0;let n=t.index,s=e.clientX,r=e.clientY,o=i[n],a=this._titles[n];if(this._tabDetachRequested.emit({index:n,title:a,tab:o,clientX:s,clientY:r,offset:t.tabPressOffset}),t.dragAborted)return}Qm.layoutTabs(i,t,e,this._orientation)}}_evtPointerUp(e){if(0!==e.button&&1!==e.button)return;const t=this._dragData;if(!t)return;if(e.preventDefault(),e.stopPropagation(),this.document.removeEventListener("pointermove",this,!0),this.document.removeEventListener("pointerup",this,!0),this.document.removeEventListener("keydown",this,!0),this.document.removeEventListener("contextmenu",this,!0),!t.dragActive){if(this._dragData=null,this.addButtonEnabled&&this.addButtonNode.contains(e.target))return void this._addRequested.emit(void 0);let i=this.contentNode.children,n=jf.RO.findFirstIndex(i,(t=>Af.hitTest(t,e.clientX,e.clientY)));if(n!==t.index)return;let s=this._titles[n];if(!s.closable)return;if(1===e.button)return void this._tabCloseRequested.emit({index:n,title:s});let r=i[n].querySelector(this.renderer.closeIconSelector);return r&&r.contains(e.target)?void this._tabCloseRequested.emit({index:n,title:s}):void 0}if(0!==e.button)return;Qm.finalizeTabPosition(t,this._orientation),t.tab.classList.remove("lm-mod-dragging");let i=Qm.parseTransitionDuration(t.tab);setTimeout((()=>{if(t.dragAborted)return;this._dragData=null,Qm.resetTabPositions(this.contentNode.children,this._orientation),t.override.dispose(),this.removeClass("lm-mod-dragging");let e=t.index,i=t.targetIndex;-1!==i&&e!==i&&(jf.RO.move(this._titles,e,i),this._adjustCurrentForMove(e,i),this._tabMoved.emit({fromIndex:e,toIndex:i,title:this._titles[i]}),Lf.sendMessage(this,fm.Msg.UpdateRequest))}),i)}_releaseMouse(){let e=this._dragData;e&&(this._dragData=null,this.document.removeEventListener("pointermove",this,!0),this.document.removeEventListener("pointerup",this,!0),this.document.removeEventListener("keydown",this,!0),this.document.removeEventListener("contextmenu",this,!0),e.dragAborted=!0,e.dragActive&&(Qm.resetTabPositions(this.contentNode.children,this._orientation),e.override.dispose(),e.tab.classList.remove("lm-mod-dragging"),this.removeClass("lm-mod-dragging")))}_adjustCurrentForInsert(e,t){let i=this.currentTitle,n=this._currentIndex,s=this.insertBehavior;if("select-tab"===s||"select-tab-if-needed"===s&&-1===n)return this._currentIndex=e,this._previousTitle=i,void this._currentChanged.emit({previousIndex:n,previousTitle:i,currentIndex:e,currentTitle:t});n>=e&&this._currentIndex++}_adjustCurrentForMove(e,t){this._currentIndex===e?this._currentIndex=t:this._currentIndex=t?this._currentIndex++:this._currentIndex>e&&this._currentIndex<=t&&this._currentIndex--}_adjustCurrentForRemove(e,t){let i=this._currentIndex,n=this.removeBehavior;if(i===e){if(0===this._titles.length)return this._currentIndex=-1,void this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:-1,currentTitle:null});if("select-tab-after"===n)return this._currentIndex=Math.min(e,this._titles.length-1),void this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:this._currentIndex,currentTitle:this.currentTitle});if("select-tab-before"===n)return this._currentIndex=Math.max(0,e-1),void this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:this._currentIndex,currentTitle:this.currentTitle});if("select-previous-tab"===n)return this._previousTitle?(this._currentIndex=this._titles.indexOf(this._previousTitle),this._previousTitle=null):this._currentIndex=Math.min(e,this._titles.length-1),void this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:this._currentIndex,currentTitle:this.currentTitle});this._currentIndex=-1,this._currentChanged.emit({previousIndex:e,previousTitle:t,currentIndex:-1,currentTitle:null})}else i>e&&this._currentIndex--}_onTitleChanged(e){this.update()}}var Qm,zm,jm,Wm,Vm,Um,Fm,Hm;!function(e){class t{constructor(){this.closeIconSelector=".lm-TabBar-tabCloseIcon",this._tabID=0,this._tabKeys=new WeakMap,this._uuid=++t._nInstance}renderTab(e){let t=e.title.caption,i=this.createTabKey(e),n=i,s=this.createTabStyle(e),r=this.createTabClass(e),o=this.createTabDataset(e),a=this.createTabARIA(e);return e.title.closable?dm.li({id:n,key:i,className:r,title:t,style:s,dataset:o,...a},this.renderIcon(e),this.renderLabel(e),this.renderCloseIcon(e)):dm.li({id:n,key:i,className:r,title:t,style:s,dataset:o,...a},this.renderIcon(e),this.renderLabel(e))}renderIcon(e){const{title:t}=e;let i=this.createIconClass(e);return dm.div({className:i},t.icon,t.iconLabel)}renderLabel(e){return dm.div({className:"lm-TabBar-tabLabel"},e.title.label)}renderCloseIcon(e){return dm.div({className:"lm-TabBar-tabCloseIcon"})}createTabKey(e){let t=this._tabKeys.get(e.title);return void 0===t&&(t=`tab-key-${this._uuid}-${this._tabID++}`,this._tabKeys.set(e.title,t)),t}createTabStyle(e){return{zIndex:`${e.zIndex}`}}createTabClass(e){let t="lm-TabBar-tab";return e.title.className&&(t+=` ${e.title.className}`),e.title.closable&&(t+=" lm-mod-closable"),e.current&&(t+=" lm-mod-current"),t}createTabDataset(e){return e.title.dataset}createTabARIA(e){var t;return{role:"tab","aria-selected":e.current.toString(),tabindex:`${null!==(t=e.tabIndex)&&void 0!==t?t:"-1"}`}}createIconClass(e){let t="lm-TabBar-tabIcon",i=e.title.iconClass;return i?`${t} ${i}`:t}}t._nInstance=0,e.Renderer=t,e.defaultRenderer=new t,e.addButtonSelector=".lm-TabBar-addButton"}($m||($m={})),function(e){e.DRAG_THRESHOLD=5,e.DETACH_THRESHOLD=20,e.createNode=function(){let e=document.createElement("div"),t=document.createElement("ul");t.setAttribute("role","tablist"),t.className="lm-TabBar-content",e.appendChild(t);let i=document.createElement("div");return i.className="lm-TabBar-addButton lm-mod-hidden",i.setAttribute("tabindex","-1"),e.appendChild(i),e},e.asTitle=function(e){return e instanceof pm?e:new pm(e)},e.parseTransitionDuration=function(e){let t=window.getComputedStyle(e);return 1e3*(parseFloat(t.transitionDuration)||0)},e.snapTabLayout=function(e,t){let i=new Array(e.length);for(let n=0,s=e.length;n=e.DRAG_THRESHOLD||s>=e.DRAG_THRESHOLD},e.detachExceeded=function(t,i){let n=t.contentRect;return i.clientX=n.right+e.DETACH_THRESHOLD||i.clientY=n.bottom+e.DETACH_THRESHOLD},e.layoutTabs=function(e,t,i,n){let s,r,o,a;"horizontal"===n?(s=t.pressX,r=i.clientX-t.contentRect.left,o=i.clientX,a=t.contentRect.width):(s=t.pressY,r=i.clientY-t.contentRect.top,o=i.clientY,a=t.contentRect.height);let l=t.index,h=r-t.tabPressPos,c=h+t.tabSize;for(let i=0,r=e.length;i>1);if(it.index&&c>u)r=-t.tabSize-d.margin+"px",l=Math.max(l,i);else if(i===t.index){let e=o-s,i=a-(t.tabPos+t.tabSize);r=`${Math.max(-t.tabPos,Math.min(e,i))}px`}else r="";"horizontal"===n?e[i].style.left=r:e[i].style.top=r}t.targetIndex=l},e.finalizeTabPosition=function(e,t){let i,n;if(i="horizontal"===t?e.contentRect.width:e.contentRect.height,e.targetIndex===e.index)n=0;else if(e.targetIndex>e.index){let t=e.tabLayout[e.targetIndex];n=t.pos+t.size-e.tabSize-e.tabPos}else n=e.tabLayout[e.targetIndex].pos-e.tabPos;let s=i-(e.tabPos+e.tabSize),r=Math.max(-e.tabPos,Math.min(n,s));"horizontal"===t?e.tab.style.left=`${r}px`:e.tab.style.top=`${r}px`},e.resetTabPositions=function(e,t){for(const i of e)"horizontal"===t?i.style.left="":i.style.top=""}}(Qm||(Qm={}));class Xm extends mm{constructor(e){super(),this._spacing=4,this._dirty=!1,this._root=null,this._box=null,this._items=new Map,this.renderer=e.renderer,void 0!==e.spacing&&(this._spacing=Pm.clampDimension(e.spacing)),this._document=e.document||document,this._hiddenMode=void 0!==e.hiddenMode?e.hiddenMode:fm.HiddenMode.Display}dispose(){let e=this[Symbol.iterator]();this._items.forEach((e=>{e.dispose()})),this._box=null,this._root=null,this._items.clear();for(const t of e)t.dispose();super.dispose()}get hiddenMode(){return this._hiddenMode}set hiddenMode(e){if(this._hiddenMode!==e){this._hiddenMode=e;for(const e of this.tabBars())if(e.titles.length>1)for(const t of e.titles)t.owner.hiddenMode=this._hiddenMode}}get spacing(){return this._spacing}set spacing(e){e=Pm.clampDimension(e),this._spacing!==e&&(this._spacing=e,this.parent&&this.parent.fit())}get isEmpty(){return null===this._root}[Symbol.iterator](){return this._root?this._root.iterAllWidgets():(0,jf.cS)()}widgets(){return this._root?this._root.iterUserWidgets():(0,jf.cS)()}selectedWidgets(){return this._root?this._root.iterSelectedWidgets():(0,jf.cS)()}tabBars(){return this._root?this._root.iterTabBars():(0,jf.cS)()}handles(){return this._root?this._root.iterHandles():(0,jf.cS)()}moveHandle(e,t,i){let n=e.classList.contains("lm-mod-hidden");if(!this._root||n)return;let s,r=this._root.findSplitNode(e);r&&(s="horizontal"===r.node.orientation?t-e.offsetLeft:i-e.offsetTop,0!==s&&(r.node.holdSizes(),sm.adjust(r.node.sizers,r.index,s),this.parent&&this.parent.update()))}saveLayout(){return this._root?(this._root.holdAllSizes(),{main:this._root.createConfig()}):{main:null}}restoreLayout(e){let t,i=new Set;t=e.main?zm.normalizeAreaConfig(e.main,i):null;let n=this.widgets(),s=this.tabBars(),r=this.handles();this._root=null;for(const e of n)i.has(e)||(e.parent=null);for(const e of s)e.dispose();for(const e of r)e.parentNode&&e.parentNode.removeChild(e);for(const e of i)e.parent=this.parent;this._root=t?zm.realizeAreaConfig(t,{createTabBar:e=>this._createTabBar(),createHandle:()=>this._createHandle()},this._document):null,this.parent&&(i.forEach((e=>{this.attachWidget(e)})),this.parent.fit())}addWidget(e,t={}){let i=t.ref||null,n=t.mode||"tab-after",s=null;if(this._root&&i&&(s=this._root.findTabNode(i)),i&&!s)throw new Error("Reference widget is not in the layout.");switch(e.parent=this.parent,n){case"tab-after":this._insertTab(e,i,s,!0);break;case"tab-before":this._insertTab(e,i,s,!1);break;case"split-top":this._insertSplit(e,i,s,"vertical",!1);break;case"split-left":this._insertSplit(e,i,s,"horizontal",!1);break;case"split-right":this._insertSplit(e,i,s,"horizontal",!0);break;case"split-bottom":this._insertSplit(e,i,s,"vertical",!0);break;case"merge-top":this._insertSplit(e,i,s,"vertical",!1,!0);break;case"merge-left":this._insertSplit(e,i,s,"horizontal",!1,!0);break;case"merge-right":this._insertSplit(e,i,s,"horizontal",!0,!0);break;case"merge-bottom":this._insertSplit(e,i,s,"vertical",!0,!0)}this.parent&&(this.attachWidget(e),this.parent.fit())}removeWidget(e){this._removeWidget(e),this.parent&&(this.detachWidget(e),this.parent.fit())}hitTestTabAreas(e,t){if(!this._root||!this.parent||!this.parent.isVisible)return null;this._box||(this._box=Af.boxSizing(this.parent.node));let i=this.parent.node.getBoundingClientRect(),n=e-i.left-this._box.borderLeft,s=t-i.top-this._box.borderTop,r=this._root.hitTestTabNodes(n,s);if(!r)return null;let{tabBar:o,top:a,left:l,width:h,height:c}=r,d=this._box.borderLeft+this._box.borderRight,u=this._box.borderTop+this._box.borderBottom;return{tabBar:o,x:n,y:s,top:a,left:l,right:i.width-d-(l+h),bottom:i.height-u-(a+c),width:h,height:c}}init(){super.init();for(const e of this)this.attachWidget(e);for(const e of this.handles())this.parent.node.appendChild(e);this.parent.fit()}attachWidget(e){this.parent.node!==e.node.parentNode&&(this._items.set(e,new gm(e)),this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.BeforeAttach),this.parent.node.appendChild(e.node),this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.AfterAttach))}detachWidget(e){if(this.parent.node!==e.node.parentNode)return;this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.BeforeDetach),this.parent.node.removeChild(e.node),this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.AfterDetach);let t=this._items.get(e);t&&(this._items.delete(e),t.dispose())}onBeforeShow(e){super.onBeforeShow(e),this.parent.update()}onBeforeAttach(e){super.onBeforeAttach(e),this.parent.fit()}onChildShown(e){this.parent.fit()}onChildHidden(e){this.parent.fit()}onResize(e){this.parent.isVisible&&this._update(e.width,e.height)}onUpdateRequest(e){this.parent.isVisible&&this._update(-1,-1)}onFitRequest(e){this.parent.isAttached&&this._fit()}_removeWidget(e){if(!this._root)return;let t=this._root.findTabNode(e);if(!t)return;if(zm.removeAria(e),t.tabBar.titles.length>1)return t.tabBar.removeTab(e.title),void(this._hiddenMode===fm.HiddenMode.Scale&&1==t.tabBar.titles.length&&(t.tabBar.titles[0].owner.hiddenMode=fm.HiddenMode.Display));if(t.tabBar.dispose(),this._root===t)return void(this._root=null);this._root.holdAllSizes();let i=t.parent;t.parent=null;let n=jf.RO.removeFirstOf(i.children,t),s=jf.RO.removeAt(i.handles,n);if(jf.RO.removeAt(i.sizers,n),s.parentNode&&s.parentNode.removeChild(s),i.children.length>1)return void i.syncHandles();let r=i.parent;i.parent=null;let o=i.children[0],a=i.handles[0];if(i.children.length=0,i.handles.length=0,i.sizers.length=0,a.parentNode&&a.parentNode.removeChild(a),this._root===i)return o.parent=null,void(this._root=o);let l=r,h=l.children.indexOf(i);if(o instanceof zm.TabLayoutNode)return o.parent=l,void(l.children[h]=o);let c=jf.RO.removeAt(l.handles,h);jf.RO.removeAt(l.children,h),jf.RO.removeAt(l.sizers,h),c.parentNode&&c.parentNode.removeChild(c);for(let e=0,t=o.children.length;e=i.length)&&(n=0),{type:"tab-area",widgets:i,currentIndex:n}}(t,i):function(t,i){let n=t.orientation,s=[],r=[];for(let o=0,a=t.children.length;o{let l=s(n,i,r),h=t(e.sizes[a]),c=i.createHandle();o.children.push(l),o.handles.push(c),o.sizers.push(h),l.parent=o})),o.syncHandles(),o.normalizeSizes(),o}(r,o,a),l};class i{constructor(e){this.parent=null,this._top=0,this._left=0,this._width=0,this._height=0;let t=new um,i=new um;t.stretch=0,i.stretch=1,this.tabBar=e,this.sizers=[t,i]}get top(){return this._top}get left(){return this._left}get width(){return this._width}get height(){return this._height}*iterAllWidgets(){yield this.tabBar,yield*this.iterUserWidgets()}*iterUserWidgets(){for(const e of this.tabBar.titles)yield e.owner}*iterSelectedWidgets(){let e=this.tabBar.currentTitle;e&&(yield e.owner)}*iterTabBars(){yield this.tabBar}*iterHandles(){}findTabNode(e){return-1!==this.tabBar.titles.indexOf(e.title)?this:null}findSplitNode(e){return null}findFirstTabNode(){return this}hitTestTabNodes(e,t){return e=this._left+this._width||t=this._top+this._height?null:this}createConfig(){return{type:"tab-area",widgets:this.tabBar.titles.map((e=>e.owner)),currentIndex:this.tabBar.currentIndex}}holdAllSizes(){}fit(e,t){let i=0,n=0,s=t.get(this.tabBar),r=this.tabBar.currentTitle,o=r?t.get(r.owner):void 0,[a,l]=this.sizers;return s&&s.fit(),o&&o.fit(),s&&!s.isHidden?(i=Math.max(i,s.minWidth),n+=s.minHeight,a.minSize=s.minHeight,a.maxSize=s.maxHeight):(a.minSize=0,a.maxSize=0),o&&!o.isHidden?(i=Math.max(i,o.minWidth),n+=o.minHeight,l.minSize=o.minHeight,l.maxSize=1/0):(l.minSize=0,l.maxSize=1/0),{minWidth:i,minHeight:n,maxWidth:1/0,maxHeight:1/0}}update(e,t,i,n,s,r){this._top=t,this._left=e,this._width=i,this._height=n;let o=r.get(this.tabBar),a=this.tabBar.currentTitle,l=a?r.get(a.owner):void 0;if(sm.calc(this.sizers,n),o&&!o.isHidden){let n=this.sizers[0].size;o.update(e,t,i,n),t+=n}if(l&&!l.isHidden){let n=this.sizers[1].size;l.update(e,t,i,n)}}}e.TabLayoutNode=i;class n{constructor(e){this.parent=null,this.normalized=!1,this.children=[],this.sizers=[],this.handles=[],this.orientation=e}*iterAllWidgets(){for(const e of this.children)yield*e.iterAllWidgets()}*iterUserWidgets(){for(const e of this.children)yield*e.iterUserWidgets()}*iterSelectedWidgets(){for(const e of this.children)yield*e.iterSelectedWidgets()}*iterTabBars(){for(const e of this.children)yield*e.iterTabBars()}*iterHandles(){yield*this.handles;for(const e of this.children)yield*e.iterHandles()}findTabNode(e){for(let t=0,i=this.children.length;te.createConfig())),sizes:t}}syncHandles(){this.handles.forEach(((e,t)=>{e.setAttribute("data-orientation",this.orientation),t===this.handles.length-1?e.classList.add("lm-mod-hidden"):e.classList.remove("lm-mod-hidden")}))}holdSizes(){for(const e of this.sizers)e.sizeHint=e.size}holdAllSizes(){for(const e of this.children)e.holdAllSizes();this.holdSizes()}normalizeSizes(){let e=this.sizers.length;if(0===e)return;this.holdSizes();let t=this.sizers.reduce(((e,t)=>e+t.sizeHint),0);if(0===t)for(const t of this.sizers)t.size=t.sizeHint=1/e;else for(const e of this.sizers)e.size=e.sizeHint/=t;this.normalized=!0}createNormalizedSizes(){let e=this.sizers.length;if(0===e)return[];let t=this.sizers.map((e=>e.size)),i=t.reduce(((e,t)=>e+t),0);if(0===i)for(let i=t.length-1;i>-1;i--)t[i]=1/e;else for(let e=t.length-1;e>-1;e--)t[e]/=i;return t}fit(e,t){let i="horizontal"===this.orientation,n=Math.max(0,this.children.length-1)*e,s=i?n:0,r=i?0:n;for(let n=0,o=this.children.length;nthis._createTabBar(),createHandle:()=>this._createHandle()};this.layout=new Xm({document:this._document,renderer:t,spacing:e.spacing,hiddenMode:e.hiddenMode}),this.overlay=e.overlay||new Ym.Overlay,this.node.appendChild(this.overlay.node)}dispose(){this._releaseMouse(),this.overlay.hide(0),this._drag&&this._drag.dispose(),super.dispose()}get hiddenMode(){return this.layout.hiddenMode}set hiddenMode(e){this.layout.hiddenMode=e}get layoutModified(){return this._layoutModified}get addRequested(){return this._addRequested}get renderer(){return this.layout.renderer}get spacing(){return this.layout.spacing}set spacing(e){this.layout.spacing=e}get mode(){return this._mode}set mode(e){if(this._mode===e)return;this._mode=e,this.dataset.mode=e;let t=this.layout;switch(e){case"multiple-document":for(const e of t.tabBars())e.show();break;case"single-document":t.restoreLayout(jm.createSingleDocumentConfig(this));break;default:throw"unreachable"}Lf.postMessage(this,jm.LayoutModified)}get tabsMovable(){return this._tabsMovable}set tabsMovable(e){this._tabsMovable=e;for(const t of this.tabBars())t.tabsMovable=e}get tabsConstrained(){return this._tabsConstrained}set tabsConstrained(e){this._tabsConstrained=e}get addButtonEnabled(){return this._addButtonEnabled}set addButtonEnabled(e){this._addButtonEnabled=e;for(const t of this.tabBars())t.addButtonEnabled=e}get isEmpty(){return this.layout.isEmpty}*widgets(){yield*this.layout.widgets()}*selectedWidgets(){yield*this.layout.selectedWidgets()}*tabBars(){yield*this.layout.tabBars()}*handles(){yield*this.layout.handles()}selectWidget(e){let t=(0,jf.sE)(this.tabBars(),(t=>-1!==t.titles.indexOf(e.title)));if(!t)throw new Error("Widget is not contained in the dock panel.");t.currentTitle=e.title}activateWidget(e){this.selectWidget(e),e.activate()}saveLayout(){return this.layout.saveLayout()}restoreLayout(e){this._mode="multiple-document",this.layout.restoreLayout(e),(Rf.IS_EDGE||Rf.IS_IE)&&Lf.flush(),Lf.postMessage(this,jm.LayoutModified)}addWidget(e,t={}){"single-document"===this._mode?this.layout.addWidget(e):this.layout.addWidget(e,t),Lf.postMessage(this,jm.LayoutModified)}processMessage(e){"layout-modified"===e.type?this._layoutModified.emit(void 0):super.processMessage(e)}handleEvent(e){switch(e.type){case"lm-dragenter":this._evtDragEnter(e);break;case"lm-dragleave":this._evtDragLeave(e);break;case"lm-dragover":this._evtDragOver(e);break;case"lm-drop":this._evtDrop(e);break;case"pointerdown":this._evtPointerDown(e);break;case"pointermove":this._evtPointerMove(e);break;case"pointerup":this._evtPointerUp(e);break;case"keydown":this._evtKeyDown(e);break;case"contextmenu":e.preventDefault(),e.stopPropagation()}}onBeforeAttach(e){this.node.addEventListener("lm-dragenter",this),this.node.addEventListener("lm-dragleave",this),this.node.addEventListener("lm-dragover",this),this.node.addEventListener("lm-drop",this),this.node.addEventListener("pointerdown",this)}onAfterDetach(e){this.node.removeEventListener("lm-dragenter",this),this.node.removeEventListener("lm-dragleave",this),this.node.removeEventListener("lm-dragover",this),this.node.removeEventListener("lm-drop",this),this.node.removeEventListener("pointerdown",this),this._releaseMouse()}onChildAdded(e){jm.isGeneratedTabBarProperty.get(e.child)||e.child.addClass("lm-DockPanel-widget")}onChildRemoved(e){jm.isGeneratedTabBarProperty.get(e.child)||(e.child.removeClass("lm-DockPanel-widget"),Lf.postMessage(this,jm.LayoutModified))}_evtDragEnter(e){e.mimeData.hasData("application/vnd.lumino.widget-factory")&&(e.preventDefault(),e.stopPropagation())}_evtDragLeave(e){e.preventDefault(),this._tabsConstrained&&e.source!==this||(e.stopPropagation(),this.overlay.hide(1))}_evtDragOver(e){e.preventDefault(),this._tabsConstrained&&e.source!==this||"invalid"===this._showOverlay(e.clientX,e.clientY)?e.dropAction="none":(e.stopPropagation(),e.dropAction=e.proposedAction)}_evtDrop(e){if(e.preventDefault(),this.overlay.hide(0),"none"===e.proposedAction)return void(e.dropAction="none");let{clientX:t,clientY:i}=e,{zone:n,target:s}=jm.findDropTarget(this,t,i,this._edges);if(this._tabsConstrained&&e.source!==this||"invalid"===n)return void(e.dropAction="none");let r=e.mimeData.getData("application/vnd.lumino.widget-factory");if("function"!=typeof r)return void(e.dropAction="none");let o=r();if(!(o instanceof fm))return void(e.dropAction="none");if(o.contains(this))return void(e.dropAction="none");let a=s?jm.getDropRef(s.tabBar):null;switch(n){case"root-all":this.addWidget(o);break;case"root-top":this.addWidget(o,{mode:"split-top"});break;case"root-left":this.addWidget(o,{mode:"split-left"});break;case"root-right":this.addWidget(o,{mode:"split-right"});break;case"root-bottom":this.addWidget(o,{mode:"split-bottom"});break;case"widget-all":case"widget-tab":this.addWidget(o,{mode:"tab-after",ref:a});break;case"widget-top":this.addWidget(o,{mode:"split-top",ref:a});break;case"widget-left":this.addWidget(o,{mode:"split-left",ref:a});break;case"widget-right":this.addWidget(o,{mode:"split-right",ref:a});break;case"widget-bottom":this.addWidget(o,{mode:"split-bottom",ref:a});break;default:throw"unreachable"}e.dropAction=e.proposedAction,e.stopPropagation(),this.activateWidget(o)}_evtKeyDown(e){e.preventDefault(),e.stopPropagation(),27===e.keyCode&&(this._releaseMouse(),Lf.postMessage(this,jm.LayoutModified))}_evtPointerDown(e){if(0!==e.button)return;let t=this.layout,i=e.target,n=(0,jf.sE)(t.handles(),(e=>e.contains(i)));if(!n)return;e.preventDefault(),e.stopPropagation(),this._document.addEventListener("keydown",this,!0),this._document.addEventListener("pointerup",this,!0),this._document.addEventListener("pointermove",this,!0),this._document.addEventListener("contextmenu",this,!0);let s=n.getBoundingClientRect(),r=e.clientX-s.left,o=e.clientY-s.top,a=window.getComputedStyle(n),l=Gf.overrideCursor(a.cursor,this._document);this._pressData={handle:n,deltaX:r,deltaY:o,override:l}}_evtPointerMove(e){if(!this._pressData)return;e.preventDefault(),e.stopPropagation();let t=this.node.getBoundingClientRect(),i=e.clientX-t.left-this._pressData.deltaX,n=e.clientY-t.top-this._pressData.deltaY;this.layout.moveHandle(this._pressData.handle,i,n)}_evtPointerUp(e){0===e.button&&(e.preventDefault(),e.stopPropagation(),this._releaseMouse(),Lf.postMessage(this,jm.LayoutModified))}_releaseMouse(){this._pressData&&(this._pressData.override.dispose(),this._pressData=null,this._document.removeEventListener("keydown",this,!0),this._document.removeEventListener("pointerup",this,!0),this._document.removeEventListener("pointermove",this,!0),this._document.removeEventListener("contextmenu",this,!0))}_showOverlay(e,t){let i,n,s,r,{zone:o,target:a}=jm.findDropTarget(this,e,t,this._edges);if("invalid"===o)return this.overlay.hide(100),o;let l=Af.boxSizing(this.node),h=this.node.getBoundingClientRect();switch(o){case"root-all":i=l.paddingTop,n=l.paddingLeft,s=l.paddingRight,r=l.paddingBottom;break;case"root-top":i=l.paddingTop,n=l.paddingLeft,s=l.paddingRight,r=h.height*jm.GOLDEN_RATIO;break;case"root-left":i=l.paddingTop,n=l.paddingLeft,s=h.width*jm.GOLDEN_RATIO,r=l.paddingBottom;break;case"root-right":i=l.paddingTop,n=h.width*jm.GOLDEN_RATIO,s=l.paddingRight,r=l.paddingBottom;break;case"root-bottom":i=h.height*jm.GOLDEN_RATIO,n=l.paddingLeft,s=l.paddingRight,r=l.paddingBottom;break;case"widget-all":i=a.top,n=a.left,s=a.right,r=a.bottom;break;case"widget-top":i=a.top,n=a.left,s=a.right,r=a.bottom+a.height/2;break;case"widget-left":i=a.top,n=a.left,s=a.right+a.width/2,r=a.bottom;break;case"widget-right":i=a.top,n=a.left+a.width/2,s=a.right,r=a.bottom;break;case"widget-bottom":i=a.top+a.height/2,n=a.left,s=a.right,r=a.bottom;break;case"widget-tab":{const e=a.tabBar.node.getBoundingClientRect().height;i=a.top,n=a.left,s=a.right,r=a.bottom+a.height-e;break}default:throw"unreachable"}return this.overlay.show({top:i,left:n,right:s,bottom:r}),o}_createTabBar(){let e=this._renderer.createTabBar(this._document);return jm.isGeneratedTabBarProperty.set(e,!0),"single-document"===this._mode&&e.hide(),e.tabsMovable=this._tabsMovable,e.allowDeselect=!1,e.addButtonEnabled=this._addButtonEnabled,e.removeBehavior="select-previous-tab",e.insertBehavior="select-tab-if-needed",e.tabMoved.connect(this._onTabMoved,this),e.currentChanged.connect(this._onCurrentChanged,this),e.tabCloseRequested.connect(this._onTabCloseRequested,this),e.tabDetachRequested.connect(this._onTabDetachRequested,this),e.tabActivateRequested.connect(this._onTabActivateRequested,this),e.addRequested.connect(this._onTabAddRequested,this),e}_createHandle(){return this._renderer.createHandle()}_onTabMoved(){Lf.postMessage(this,jm.LayoutModified)}_onCurrentChanged(e,t){let{previousTitle:i,currentTitle:n}=t;i&&i.owner.hide(),n&&n.owner.show(),(Rf.IS_EDGE||Rf.IS_IE)&&Lf.flush(),Lf.postMessage(this,jm.LayoutModified)}_onTabAddRequested(e){this._addRequested.emit(e)}_onTabActivateRequested(e,t){t.title.owner.activate()}_onTabCloseRequested(e,t){t.title.owner.close()}_onTabDetachRequested(e,t){if(this._drag)return;e.releaseMouse();let{title:i,tab:n,clientX:s,clientY:r,offset:o}=t,a=new Wf.MimeData;a.setData("application/vnd.lumino.widget-factory",(()=>i.owner));let l=n.cloneNode(!0);o&&(l.style.top=`-${o.y}px`,l.style.left=`-${o.x}px`),this._drag=new Gf({document:this._document,mimeData:a,dragImage:l,proposedAction:"move",supportedActions:"move",source:this}),n.classList.add("lm-mod-hidden"),this._drag.start(s,r).then((()=>{this._drag=null,n.classList.remove("lm-mod-hidden")}))}}!function(e){e.Overlay=class{constructor(){this._timer=-1,this._hidden=!0,this.node=document.createElement("div"),this.node.classList.add("lm-DockPanel-overlay"),this.node.classList.add("lm-mod-hidden"),this.node.style.position="absolute",this.node.style.contain="strict"}show(e){let t=this.node.style;t.top=`${e.top}px`,t.left=`${e.left}px`,t.right=`${e.right}px`,t.bottom=`${e.bottom}px`,clearTimeout(this._timer),this._timer=-1,this._hidden&&(this._hidden=!1,this.node.classList.remove("lm-mod-hidden"))}hide(e){if(!this._hidden)return e<=0?(clearTimeout(this._timer),this._timer=-1,this._hidden=!0,void this.node.classList.add("lm-mod-hidden")):void(-1===this._timer&&(this._timer=window.setTimeout((()=>{this._timer=-1,this._hidden=!0,this.node.classList.add("lm-mod-hidden")}),e)))}};class t{createTabBar(e){let t=new $m({document:e});return t.addClass("lm-DockPanel-tabBar"),t}createHandle(){let e=document.createElement("div");return e.className="lm-DockPanel-handle",e}}e.Renderer=t,e.defaultRenderer=new t}(Ym||(Ym={})),function(e){e.GOLDEN_RATIO=.618,e.DEFAULT_EDGES={top:12,right:40,bottom:40,left:40},e.LayoutModified=new Ff("layout-modified"),e.isGeneratedTabBarProperty=new Xf.AttachedProperty({name:"isGeneratedTabBar",create:()=>!1}),e.createSingleDocumentConfig=function(e){if(e.isEmpty)return{main:null};let t=Array.from(e.widgets()),i=e.selectedWidgets().next().value,n=i?t.indexOf(i):-1;return{main:{type:"tab-area",widgets:t,currentIndex:n}}},e.findDropTarget=function(e,t,i,n){if(!Af.hitTest(e.node,t,i))return{zone:"invalid",target:null};let s=e.layout;if(s.isEmpty)return{zone:"root-all",target:null};if("multiple-document"===e.mode){let s=e.node.getBoundingClientRect(),r=t-s.left+1,o=i-s.top+1,a=s.right-t,l=s.bottom-i;switch(Math.min(o,a,l,r)){case o:if(od&&l>d&&a>u&&h>u)return{zone:"widget-all",target:r};switch(o/=d,a/=u,l/=d,h/=u,Math.min(o,a,l,h)){case o:c="widget-left";break;case a:c="widget-top";break;case l:c="widget-right";break;case h:c="widget-bottom";break;default:throw"unreachable"}return{zone:c,target:r}},e.getDropRef=function(e){return 0===e.titles.length?null:e.currentTitle?e.currentTitle.owner:e.titles[e.titles.length-1].owner}}(jm||(jm={}));class Gm{constructor(){this._counter=0,this._widgets=[],this._activeWidget=null,this._currentWidget=null,this._numbers=new Map,this._nodes=new Map,this._activeChanged=new zf.Signal(this),this._currentChanged=new zf.Signal(this)}dispose(){if(!(this._counter<0)){this._counter=-1,zf.Signal.clearData(this);for(const e of this._widgets)e.node.removeEventListener("focus",this,!0),e.node.removeEventListener("blur",this,!0);this._activeWidget=null,this._currentWidget=null,this._nodes.clear(),this._numbers.clear(),this._widgets.length=0}}get currentChanged(){return this._currentChanged}get activeChanged(){return this._activeChanged}get isDisposed(){return this._counter<0}get currentWidget(){return this._currentWidget}get activeWidget(){return this._activeWidget}get widgets(){return this._widgets}focusNumber(e){let t=this._numbers.get(e);return void 0===t?-1:t}has(e){return this._numbers.has(e)}add(e){if(this._numbers.has(e))return;let t=e.node.contains(document.activeElement),i=t?this._counter++:-1;this._widgets.push(e),this._numbers.set(e,i),this._nodes.set(e.node,e),e.node.addEventListener("focus",this,!0),e.node.addEventListener("blur",this,!0),e.disposed.connect(this._onWidgetDisposed,this),t&&this._setWidgets(e,e)}remove(e){if(!this._numbers.has(e))return;if(e.disposed.disconnect(this._onWidgetDisposed,this),e.node.removeEventListener("focus",this,!0),e.node.removeEventListener("blur",this,!0),jf.RO.removeFirstOf(this._widgets,e),this._nodes.delete(e.node),this._numbers.delete(e),this._currentWidget!==e)return;let t=this._widgets.filter((e=>-1!==this._numbers.get(e))),i=(0,jf.Fp)(t,((e,t)=>this._numbers.get(e)-this._numbers.get(t)))||null;this._setWidgets(i,null)}handleEvent(e){switch(e.type){case"focus":this._evtFocus(e);break;case"blur":this._evtBlur(e)}}_setWidgets(e,t){let i=this._currentWidget;this._currentWidget=e;let n=this._activeWidget;this._activeWidget=t,i!==e&&this._currentChanged.emit({oldValue:i,newValue:e}),n!==t&&this._activeChanged.emit({oldValue:n,newValue:t})}_evtFocus(e){let t=this._nodes.get(e.currentTarget);t!==this._currentWidget&&this._numbers.set(t,this._counter++),this._setWidgets(t,t)}_evtBlur(e){let t=this._nodes.get(e.currentTarget),i=e.relatedTarget;i&&(t.node.contains(i)||(0,jf.sE)(this._widgets,(e=>e.node.contains(i))))||this._setWidgets(this._currentWidget,null)}_onWidgetDisposed(e){this.remove(e)}}class Zm extends mm{constructor(e={}){super(e),this._dirty=!1,this._rowSpacing=4,this._columnSpacing=4,this._items=[],this._rowStarts=[],this._columnStarts=[],this._rowSizers=[new um],this._columnSizers=[new um],this._box=null,void 0!==e.rowCount&&Wm.reallocSizers(this._rowSizers,e.rowCount),void 0!==e.columnCount&&Wm.reallocSizers(this._columnSizers,e.columnCount),void 0!==e.rowSpacing&&(this._rowSpacing=Wm.clampValue(e.rowSpacing)),void 0!==e.columnSpacing&&(this._columnSpacing=Wm.clampValue(e.columnSpacing))}dispose(){for(const e of this._items){let t=e.widget;e.dispose(),t.dispose()}this._box=null,this._items.length=0,this._rowStarts.length=0,this._rowSizers.length=0,this._columnStarts.length=0,this._columnSizers.length=0,super.dispose()}get rowCount(){return this._rowSizers.length}set rowCount(e){e!==this.rowCount&&(Wm.reallocSizers(this._rowSizers,e),this.parent&&this.parent.fit())}get columnCount(){return this._columnSizers.length}set columnCount(e){e!==this.columnCount&&(Wm.reallocSizers(this._columnSizers,e),this.parent&&this.parent.fit())}get rowSpacing(){return this._rowSpacing}set rowSpacing(e){e=Wm.clampValue(e),this._rowSpacing!==e&&(this._rowSpacing=e,this.parent&&this.parent.fit())}get columnSpacing(){return this._columnSpacing}set columnSpacing(e){e=Wm.clampValue(e),this._columnSpacing!==e&&(this._columnSpacing=e,this.parent&&this.parent.fit())}rowStretch(e){let t=this._rowSizers[e];return t?t.stretch:-1}setRowStretch(e,t){let i=this._rowSizers[e];i&&(t=Wm.clampValue(t),i.stretch!==t&&(i.stretch=t,this.parent&&this.parent.update()))}columnStretch(e){let t=this._columnSizers[e];return t?t.stretch:-1}setColumnStretch(e,t){let i=this._columnSizers[e];i&&(t=Wm.clampValue(t),i.stretch!==t&&(i.stretch=t,this.parent&&this.parent.update()))}*[Symbol.iterator](){for(const e of this._items)yield e.widget}addWidget(e){-1===jf.RO.findFirstIndex(this._items,(t=>t.widget===e))&&(this._items.push(new gm(e)),this.parent&&this.attachWidget(e))}removeWidget(e){let t=jf.RO.findFirstIndex(this._items,(t=>t.widget===e));if(-1===t)return;let i=jf.RO.removeAt(this._items,t);this.parent&&this.detachWidget(e),i.dispose()}init(){super.init();for(const e of this)this.attachWidget(e)}attachWidget(e){this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.BeforeAttach),this.parent.node.appendChild(e.node),this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.AfterAttach),this.parent.fit()}detachWidget(e){this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.BeforeDetach),this.parent.node.removeChild(e.node),this.parent.isAttached&&Lf.sendMessage(e,fm.Msg.AfterDetach),this.parent.fit()}onBeforeShow(e){super.onBeforeShow(e),this.parent.update()}onBeforeAttach(e){super.onBeforeAttach(e),this.parent.fit()}onChildShown(e){this.parent.fit()}onChildHidden(e){this.parent.fit()}onResize(e){this.parent.isVisible&&this._update(e.width,e.height)}onUpdateRequest(e){this.parent.isVisible&&this._update(-1,-1)}onFitRequest(e){this.parent.isAttached&&this._fit()}_fit(){for(let e=0,t=this.rowCount;e!e.isHidden));for(let t=0,i=e.length;t({row:0,column:0,rowSpan:1,columnSpan:1}),changed:function(e){e.parent&&e.parent.layout instanceof Zm&&e.parent.fit()}}),e.normalizeConfig=function(e){return{row:Math.max(0,Math.floor(e.row||0)),column:Math.max(0,Math.floor(e.column||0)),rowSpan:Math.max(1,Math.floor(e.rowSpan||0)),columnSpan:Math.max(1,Math.floor(e.columnSpan||0))}},e.clampValue=function(e){return Math.max(0,Math.floor(e))},e.rowSpanCmp=function(t,i){let n=e.cellConfigProperty.get(t.widget),s=e.cellConfigProperty.get(i.widget);return n.rowSpan-s.rowSpan},e.columnSpanCmp=function(t,i){let n=e.cellConfigProperty.get(t.widget),s=e.cellConfigProperty.get(i.widget);return n.columnSpan-s.columnSpan},e.reallocSizers=function(e,t){for(t=Math.max(1,Math.floor(t));e.lengtht&&(e.length=t)},e.distributeMin=function(e,t,i,n){if(i=n)return;let r=(n-s)/(i-t+1);for(let n=t;n<=i;++n)e[n].minSize+=r}}(Wm||(Wm={}));class Km extends fm{constructor(e={}){super({node:Vm.createNode()}),this._activeIndex=-1,this._tabFocusIndex=0,this._menus=[],this._childMenu=null,this._overflowMenu=null,this._menuItemSizes=[],this._overflowIndex=-1,this.addClass("lm-MenuBar"),this.setFlag(fm.Flag.DisallowLayout),this.renderer=e.renderer||Km.defaultRenderer,this._forceItemsPosition=e.forceItemsPosition||{forceX:!0,forceY:!0},this._overflowMenuOptions=e.overflowMenuOptions||{isVisible:!0}}dispose(){this._closeChildMenu(),this._menus.length=0,super.dispose()}get childMenu(){return this._childMenu}get overflowIndex(){return this._overflowIndex}get overflowMenu(){return this._overflowMenu}get contentNode(){return this.node.getElementsByClassName("lm-MenuBar-content")[0]}get activeMenu(){return this._menus[this._activeIndex]||null}set activeMenu(e){this.activeIndex=e?this._menus.indexOf(e):-1}get activeIndex(){return this._activeIndex}set activeIndex(e){(e<0||e>=this._menus.length)&&(e=-1),this._activeIndex!==e&&(this._activeIndex=e,-1!==e&&(this._tabFocusIndex=e),this._activeIndex>=0&&this.contentNode.childNodes[this._activeIndex]&&this.contentNode.childNodes[this._activeIndex].focus(),this.update())}get menus(){return this._menus}openActiveMenu(){-1!==this._activeIndex&&(this._openChildMenu(),this._childMenu&&(this._childMenu.activeIndex=-1,this._childMenu.activateNextItem()))}addMenu(e,t=!0){this.insertMenu(this._menus.length,e,t)}insertMenu(e,t,i=!0){this._closeChildMenu();let n=this._menus.indexOf(t),s=Math.max(0,Math.min(e,this._menus.length));if(-1===n)return jf.RO.insert(this._menus,s,t),t.addClass("lm-MenuBar-menu"),t.aboutToClose.connect(this._onMenuAboutToClose,this),t.menuRequested.connect(this._onMenuMenuRequested,this),t.title.changed.connect(this._onTitleChanged,this),void(i&&this.update());s===this._menus.length&&s--,n!==s&&(jf.RO.move(this._menus,n,s),i&&this.update())}removeMenu(e,t=!0){this.removeMenuAt(this._menus.indexOf(e),t)}removeMenuAt(e,t=!0){this._closeChildMenu();let i=jf.RO.removeAt(this._menus,e);i&&(i.aboutToClose.disconnect(this._onMenuAboutToClose,this),i.menuRequested.disconnect(this._onMenuMenuRequested,this),i.title.changed.disconnect(this._onTitleChanged,this),i.removeClass("lm-MenuBar-menu"),t&&this.update())}clearMenus(){if(0!==this._menus.length){this._closeChildMenu();for(let e of this._menus)e.aboutToClose.disconnect(this._onMenuAboutToClose,this),e.menuRequested.disconnect(this._onMenuMenuRequested,this),e.title.changed.disconnect(this._onTitleChanged,this),e.removeClass("lm-MenuBar-menu");this._menus.length=0,this.update()}}handleEvent(e){switch(e.type){case"keydown":this._evtKeyDown(e);break;case"mousedown":this._evtMouseDown(e);break;case"mousemove":this._evtMouseMove(e);break;case"mouseleave":this._evtMouseLeave(e);break;case"contextmenu":e.preventDefault(),e.stopPropagation()}}onBeforeAttach(e){this.node.addEventListener("keydown",this),this.node.addEventListener("mousedown",this),this.node.addEventListener("mousemove",this),this.node.addEventListener("mouseleave",this),this.node.addEventListener("contextmenu",this)}onAfterDetach(e){this.node.removeEventListener("keydown",this),this.node.removeEventListener("mousedown",this),this.node.removeEventListener("mousemove",this),this.node.removeEventListener("mouseleave",this),this.node.removeEventListener("contextmenu",this),this._closeChildMenu()}onActivateRequest(e){this.isAttached&&(this.activeIndex=0)}onResize(e){this.update(),super.onResize(e)}onUpdateRequest(e){var t;let i=this._menus,n=this.renderer,s=this._activeIndex,r=this._tabFocusIndex>=0&&this._tabFocusIndex-1?this._overflowIndex:i.length,a=0,l=!1;o=null!==this._overflowMenu?o-1:o;let h=new Array(o);for(let e=0;e{this.activeIndex=e}}),a+=this._menuItemSizes[e],i[e].title.label===this._overflowMenuOptions.title&&(l=!0,o--);if(this._overflowMenuOptions.isVisible)if(this._overflowIndex>-1&&!l){if(null===this._overflowMenu){const e=null!==(t=this._overflowMenuOptions.title)&&void 0!==t?t:"...";this._overflowMenu=new Nm({commands:new lm}),this._overflowMenu.title.label=e,this._overflowMenu.title.mnemonic=0,this.addMenu(this._overflowMenu,!1)}for(let e=i.length-2;e>=o;e--){const t=this.menus[e];t.title.mnemonic=0,this._overflowMenu.insertItem(0,{type:"submenu",submenu:t}),this.removeMenu(t,!1)}h[o]=n.renderItem({title:this._overflowMenu.title,active:o===s&&0!==i[o].items.length,tabbable:o===r,onfocus:()=>{this.activeIndex=o}}),o++}else if(null!==this._overflowMenu){let e=this._overflowMenu.items,t=this.node.offsetWidth,s=this._overflowMenu.items.length;for(let l=0;lthis._menuItemSizes[s]){let t=e[0].submenu;this._overflowMenu.removeItemAt(0),this.insertMenu(o,t,!1),h[o]=n.renderItem({title:t.title,active:!1,tabbable:o===r,onfocus:()=>{this.activeIndex=o}}),o++}}0===this._overflowMenu.items.length&&(this.removeMenu(this._overflowMenu,!1),h.pop(),this._overflowMenu=null,this._overflowIndex=-1)}im.render(h,this.contentNode),this._updateOverflowIndex()}_updateOverflowIndex(){if(!this._overflowMenuOptions.isVisible)return;const e=this.contentNode.childNodes;let t=this.node.offsetWidth,i=0,n=-1,s=e.length;if(0==this._menuItemSizes.length)for(let r=0;rt&&-1===n&&(n=r)}else for(let e=0;et){n=e;break}this._overflowIndex=n}_evtKeyDown(e){let t=e.keyCode;if(9===t)return void(this.activeIndex=-1);if(e.preventDefault(),e.stopPropagation(),13===t||32===t||38===t||40===t)return void this.openActiveMenu();if(27===t)return this._closeChildMenu(),this.activeIndex=-1,void this.node.blur();if(37===t){let e=this._activeIndex,t=this._menus.length;return void(this.activeIndex=0===e?t-1:e-1)}if(39===t){let e=this._activeIndex,t=this._menus.length;return void(this.activeIndex=e===t-1?0:e+1)}let i=Zf().keyForKeydownEvent(e);if(!i)return;let n=this._activeIndex+1,s=Vm.findMnemonic(this._menus,i,n);-1===s.index||s.multiple?-1!==s.index?this.activeIndex=s.index:-1!==s.auto&&(this.activeIndex=s.auto):(this.activeIndex=s.index,this.openActiveMenu())}_evtMouseDown(e){if(!Af.hitTest(this.node,e.clientX,e.clientY))return;e.preventDefault(),e.stopPropagation(),e.stopImmediatePropagation();let t=jf.RO.findFirstIndex(this.contentNode.children,(t=>Af.hitTest(t,e.clientX,e.clientY)));if(-1!==t){if(0===e.button)if(this._childMenu)this._closeChildMenu(),this.activeIndex=t;else{const e=this._positionForMenu(t);Nm.saveWindowData(),this.activeIndex=t,this._openChildMenu(e)}}else this._closeChildMenu()}_evtMouseMove(e){let t=jf.RO.findFirstIndex(this.contentNode.children,(t=>Af.hitTest(t,e.clientX,e.clientY)));if(t===this._activeIndex)return;if(-1===t&&this._childMenu)return;const i=t>=0&&this._childMenu?this._positionForMenu(t):null;Nm.saveWindowData(),this.activeIndex=t,i&&this._openChildMenu(i)}_positionForMenu(e){let t=this.contentNode.children[e],{left:i,bottom:n}=t.getBoundingClientRect();return{top:n,left:i}}_evtMouseLeave(e){this._childMenu||(this.activeIndex=-1)}_openChildMenu(e={}){let t=this.activeMenu;if(!t)return void this._closeChildMenu();let i=this._childMenu;if(i===t)return;this._childMenu=t,i?i.close():document.addEventListener("mousedown",this,!0),Lf.sendMessage(this,fm.Msg.UpdateRequest);let{left:n,top:s}=e;void 0!==n&&void 0!==s||({left:n,top:s}=this._positionForMenu(this._activeIndex)),i||this.addClass("lm-mod-active"),t.items.length>0&&t.open(n,s,this._forceItemsPosition)}_closeChildMenu(){if(!this._childMenu)return;this.removeClass("lm-mod-active"),document.removeEventListener("mousedown",this,!0);let e=this._childMenu;this._childMenu=null,e.close(),this.activeIndex=-1}_onMenuAboutToClose(e){e===this._childMenu&&(this.removeClass("lm-mod-active"),document.removeEventListener("mousedown",this,!0),this._childMenu=null,this.activeIndex=-1)}_onMenuMenuRequested(e,t){if(e!==this._childMenu)return;let i=this._activeIndex,n=this._menus.length;switch(t){case"next":this.activeIndex=i===n-1?0:i+1;break;case"previous":this.activeIndex=0===i?n-1:i-1}this.openActiveMenu()}_onTitleChanged(){this.update()}}!function(e){class t{renderItem(e){let t=this.createItemClass(e),i=this.createItemDataset(e),n=this.createItemARIA(e);return dm.li({className:t,dataset:i,tabindex:e.tabbable?"0":"-1",onfocus:e.onfocus,...n},this.renderIcon(e),this.renderLabel(e))}renderIcon(e){let t=this.createIconClass(e);return dm.div({className:t},e.title.icon,e.title.iconLabel)}renderLabel(e){let t=this.formatLabel(e);return dm.div({className:"lm-MenuBar-itemLabel"},t)}createItemClass(e){let t="lm-MenuBar-item";return e.title.className&&(t+=` ${e.title.className}`),e.active&&(t+=" lm-mod-active"),t}createItemDataset(e){return e.title.dataset}createItemARIA(e){return{role:"menuitem","aria-haspopup":"true"}}createIconClass(e){let t="lm-MenuBar-itemIcon",i=e.title.iconClass;return i?`${t} ${i}`:t}formatLabel(e){let{label:t,mnemonic:i}=e.title;if(i<0||i>=t.length)return t;let n=t.slice(0,i),s=t.slice(i+1),r=t[i];return[n,dm.span({className:"lm-MenuBar-itemMnemonic"},r),s]}}e.Renderer=t,e.defaultRenderer=new t}(Km||(Km={})),function(e){e.createNode=function(){let e=document.createElement("div"),t=document.createElement("ul");return t.className="lm-MenuBar-content",e.appendChild(t),t.setAttribute("role","menubar"),e},e.findMnemonic=function(e,t,i){let n=-1,s=-1,r=!1,o=t.toUpperCase();for(let t=0,a=e.length;t=0&&c1&&this.widgets.forEach((e=>{e.hiddenMode=this._hiddenMode})))}dispose(){for(const e of this._items)e.dispose();this._box=null,this._items.length=0,super.dispose()}attachWidget(e,t){this._hiddenMode===fm.HiddenMode.Scale&&this._items.length>0?(1===this._items.length&&(this.widgets[0].hiddenMode=fm.HiddenMode.Scale),t.hiddenMode=fm.HiddenMode.Scale):t.hiddenMode=fm.HiddenMode.Display,jf.RO.insert(this._items,e,new gm(t)),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeAttach),this.parent.node.appendChild(t.node),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterAttach),this.parent.fit()}moveWidget(e,t,i){jf.RO.move(this._items,e,t),this.parent.update()}detachWidget(e,t){let i=jf.RO.removeAt(this._items,e);this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.BeforeDetach),this.parent.node.removeChild(t.node),this.parent.isAttached&&Lf.sendMessage(t,fm.Msg.AfterDetach),i.widget.node.style.zIndex="",this._hiddenMode===fm.HiddenMode.Scale&&(t.hiddenMode=fm.HiddenMode.Display,1===this._items.length&&(this._items[0].widget.hiddenMode=fm.HiddenMode.Display)),i.dispose(),this.parent.fit()}onBeforeShow(e){super.onBeforeShow(e),this.parent.update()}onBeforeAttach(e){super.onBeforeAttach(e),this.parent.fit()}onChildShown(e){this.parent.fit()}onChildHidden(e){this.parent.fit()}onResize(e){this.parent.isVisible&&this._update(e.width,e.height)}onUpdateRequest(e){this.parent.isVisible&&this._update(-1,-1)}onFitRequest(e){this.parent.isAttached&&this._fit()}_fit(){let e=0,t=0;for(let i=0,n=this._items.length;i{t.newValue!==this.currentWidget&&(i.current=t.newValue)}),this),i.added.connect(((e,t)=>{this._widgetAdded.emit(t)}),this),i.currentChanged.connect(((e,n)=>{null===n&&t.currentWidget?i.current=t.currentWidget:(this.onCurrentChanged(n),this._currentChanged.emit(n))}),this),i.updated.connect(((e,t)=>{this._widgetUpdated.emit(t)}),this)}get currentChanged(){return this._currentChanged}get currentWidget(){return this._pool.current||null}get restored(){return this._deferred?Promise.resolve():this._pool.restored}get size(){return this._pool.size}get widgetAdded(){return this._widgetAdded}get widgetUpdated(){return this._widgetUpdated}async add(e){this._focusTracker.add(e),await this._pool.add(e),this._focusTracker.activeWidget||(this._pool.current=e)}get isDisposed(){return this._isDisposed}dispose(){this.isDisposed||(this._isDisposed=!0,this._pool.dispose(),this._focusTracker.dispose(),zf.Signal.clearData(this))}find(e){return this._pool.find(e)}forEach(e){return this._pool.forEach(e)}filter(e){return this._pool.filter(e)}inject(e){return this._pool.inject(e)}has(e){return this._pool.has(e)}async restore(e){const t=this._deferred;return t?(this._deferred=null,this._pool.restore(t)):e?this._pool.restore(e):void console.warn("No options provided to restore the tracker.")}defer(e){this._deferred=e}async save(e){return this._pool.save(e)}onCurrentChanged(e){}}function tg(e){return e.replace("-","_")}class ig{constructor(e){e=e||{},this._defaults={domain:"messages",locale:document.documentElement.getAttribute("lang")||"en",pluralFunc:function(e){return{nplurals:2,plural:1!=e?1:0}},contextDelimiter:String.fromCharCode(4),stringsPrefix:""},this._locale=(e.locale||this._defaults.locale).replace("_","-"),this._domain=tg(e.domain||this._defaults.domain),this._contextDelimiter=e.contextDelimiter||this._defaults.contextDelimiter,this._stringsPrefix=e.stringsPrefix||this._defaults.stringsPrefix,this._pluralFuncs={},this._dictionary={},this._pluralForms={},e.messages&&(this._dictionary[this._domain]={},this._dictionary[this._domain][this._locale]=e.messages),e.pluralForms&&(this._pluralForms[this._locale]=e.pluralForms)}setContextDelimiter(e){this._contextDelimiter=e}getContextDelimiter(){return this._contextDelimiter}setLocale(e){this._locale=e.replace("_","-")}getLocale(){return this._locale}setDomain(e){this._domain=tg(e)}getDomain(){return this._domain}setStringsPrefix(e){this._stringsPrefix=e}getStringsPrefix(){return this._stringsPrefix}static strfmt(e,...t){return e.replace(/%%/g,"%% ").replace(/%(\d+)/g,(function(e,i){return t[i-1]})).replace(/%% /g,"%")}loadJSON(e,t){if(!e[""]||!e[""].language||!e[""].pluralForms)throw new Error(`Wrong jsonData, it must have an empty key ("") with "language" and "pluralForms" information: ${e}`);t=tg(t);let i=e[""],n=JSON.parse(JSON.stringify(e));delete n[""],this.setMessages(t||this._defaults.domain,i.language,n,i.pluralForms)}__(e,...t){return this.gettext(e,...t)}_n(e,t,i,...n){return this.ngettext(e,t,i,...n)}_p(e,t,...i){return this.pgettext(e,t,...i)}_np(e,t,i,n,...s){return this.npgettext(e,t,i,n,...s)}gettext(e,...t){return this.dcnpgettext("","",e,"",0,...t)}ngettext(e,t,i,...n){return this.dcnpgettext("","",e,t,i,...n)}pgettext(e,t,...i){return this.dcnpgettext("",e,t,"",0,...i)}npgettext(e,t,i,n,...s){return this.dcnpgettext("",e,t,i,n,...s)}dcnpgettext(e,t,i,n,s,...r){let o;e=tg(e)||this._domain;let a=t?t+this._contextDelimiter+i:i,l={pluralForm:!1},h=!1,c=this._locale,d=this.expandLocale(this._locale);for(let t in d)if(c=d[t],h=this._dictionary[e]&&this._dictionary[e][c]&&this._dictionary[e][c][a],h=n?h&&this._dictionary[e][c][a].length>1:h&&1==this._dictionary[e][c][a].length,h){l.locale=c;break}if(h?o=this._dictionary[e][c][a]:(o=[i],l.pluralFunc=this._defaults.pluralFunc),!n)return this.t(o,s,l,...r);l.pluralForm=!0;let u=h?o:[i,n];return this.t(u,s,l,...r)}expandLocale(e){let t=[e],i=e.lastIndexOf("-");for(;i>0;)e=e.slice(0,i),t.push(e),i=e.lastIndexOf("-");return t}getPluralFunc(e){if(!new RegExp("^\\s*nplurals\\s*=\\s*[0-9]+\\s*;\\s*plural\\s*=\\s*(?:\\s|[-\\?\\|&=!<>+*/%:;n0-9_()])+").test(e))throw new Error(ig.strfmt('The plural form "%1" is not valid',e));return new Function("n","let plural, nplurals; "+e+" return { nplurals: nplurals, plural: (plural === true ? 1 : (plural ? plural : 0)) };")}removeContext(e){return-1!==e.indexOf(this._contextDelimiter)?e.split(this._contextDelimiter)[1]:e}t(e,t,i,...n){if(!i.pluralForm)return this._stringsPrefix+ig.strfmt(this.removeContext(e[0]),...n);let s;return i.pluralFunc?s=i.pluralFunc(t):(this._pluralFuncs[i.locale||""]||(this._pluralFuncs[i.locale||""]=this.getPluralFunc(this._pluralForms[i.locale||""])),s=this._pluralFuncs[i.locale||""](t)),(void 0===!s.plural||s.plural>s.nplurals||e.length<=s.plural)&&(s.plural=0),this._stringsPrefix+ig.strfmt(this.removeContext(e[s.plural]),...[t].concat(n))}setMessages(e,t,i,n){e=tg(e),n&&(this._pluralForms[t]=n),this._dictionary[e]||(this._dictionary[e]={}),this._dictionary[e][t]=i}}const ng=new class{constructor(e){this.languageCode="en",this._languageBundle=e}load(e){return this._languageBundle}}(new class{__(e,...t){return this.gettext(e,...t)}_n(e,t,i,...n){return this.ngettext(e,t,i,...n)}_p(e,t,...i){return this.pgettext(e,t,...i)}_np(e,t,i,n,...s){return this.npgettext(e,t,i,n,...s)}gettext(e,...t){return ig.strfmt(e,...t)}ngettext(e,t,i,...n){return ig.strfmt(1==i?e:t,...[i].concat(n))}pgettext(e,t,...i){return ig.strfmt(t,...i)}npgettext(e,t,i,n,...s){return this.ngettext(t,i,n,...s)}dcnpgettext(e,t,i,n,s,...r){return this.ngettext(i,n,s,...r)}});new Wf.Token("@jupyterlab/translation:ITranslatorConnector","A service to connect to the server translation endpoint."),new Wf.Token("@jupyterlab/translation:ITranslator","A service to translate strings.");const sg="jp-OutputArea-child",rg="jp-OutputArea-output",og="jp-OutputArea-prompt";class ag extends fm{constructor(e){var t,i,n,s;super(),this.outputLengthChanged=new zf.Signal(this),this._onIOPub=e=>{const t=this.model,i=e.header.msg_type;let n;const s=(e.content.transient||{}).display_id;let r;switch(i){case"execute_result":case"display_data":case"stream":case"error":n={...e.content,output_type:i},t.add(n);break;case"clear_output":{const i=e.content.wait;t.clear(i);break}case"update_display_data":if(n={...e.content,output_type:"display_data"},r=this._displayIdMap.get(s),r)for(const e of r)t.set(e,n)}s&&"display_data"===i&&(r=this._displayIdMap.get(s)||[],r.push(t.length-1),this._displayIdMap.set(s,r))},this._onExecuteReply=e=>{const t=this.model,i=e.content;if("ok"!==i.status)return;const n=i&&i.payload;if(!n||!n.length)return;const s=n.filter((e=>"page"===e.source));if(!s.length)return;const r={output_type:"display_data",data:JSON.parse(JSON.stringify(s[0])).data,metadata:{}};t.add(r)},this._displayIdMap=new Map,this._minHeightTimeout=null,this._inputRequested=new zf.Signal(this),this._toggleScrolling=new zf.Signal(this),this._outputTracker=new eg({namespace:Wf.UUID.uuid4()}),this._inputHistoryScope="global",super.layout=new vm,this.addClass("jp-OutputArea"),this.contentFactory=null!==(t=e.contentFactory)&&void 0!==t?t:ag.defaultContentFactory,this.rendermime=e.rendermime,this._maxNumberOutputs=null!==(i=e.maxNumberOutputs)&&void 0!==i?i:1/0,this._translator=null!==(n=e.translator)&&void 0!==n?n:ng,this._inputHistoryScope=null!==(s=e.inputHistoryScope)&&void 0!==s?s:"global";const r=this.model=e.model;for(let e=0;e{$f.KernelMessage.isInputRequestMsg(t)&&this.onInputRequest(t,e)})}get inputRequested(){return this._inputRequested}get maxNumberOutputs(){return this._maxNumberOutputs}set maxNumberOutputs(e){if(e<=0)return void console.warn("OutputArea.maxNumberOutputs must be strictly positive.");const t=this._maxNumberOutputs;this._maxNumberOutputs=e,t{this._toggleScrolling.emit()})),this.node.appendChild(e)}_moveDisplayIdIndices(e,t){this._displayIdMap.forEach((i=>{const n=e+t;for(let s=i.length-1;s>=0;--s){const r=i[s];r>=e&&r=n&&(i[s]-=t)}}))}onStateChanged(e,t){const i=Math.min(this.model.length,this._maxNumberOutputs);if(t){if(t>=this._maxNumberOutputs)return;this._setOutput(t,this.model.get(t))}else for(let e=0;e{this.isDisposed||(this.node.style.minHeight="")}),50)}onInputRequest(e,t){const i=this.contentFactory,n=e.content.prompt,s=e.content.password,r=new Am;r.addClass(sg),r.addClass("jp-OutputArea-stdin-item");const o=i.createOutputPrompt();o.addClass(og),r.addWidget(o);const a=i.createStdin({parent_header:e.header,prompt:n,password:s,future:t,translator:this._translator,inputHistoryScope:this._inputHistoryScope});a.addClass(rg),r.addWidget(a),this.model.length>=this.maxNumberOutputs&&(this.maxNumberOutputs=this.model.length),this.layout.addWidget(r),this._inputRequested.emit(),a.value.then((e=>{this.model.length>=this.maxNumberOutputs&&(this.maxNumberOutputs=this.model.length+1),this.model.add({output_type:"stream",name:"stdin",text:e+"\n"}),r.dispose()}))}_setOutput(e,t){if(e>=this._maxNumberOutputs)return;const i=this.layout.widgets[e],n=i.widgets?i.widgets[1]:i,s=this.rendermime.preferredMimeType(t.data,t.trusted?"any":"ensure");cg.currentPreferredMimetype.get(n)===s&&ag.isIsolated(s,t.metadata)===n instanceof cg.IsolatedRenderer?n.renderModel(t):(this.layout.widgets[e].dispose(),this._insertOutput(e,t))}_insertOutput(e,t){if(e>this._maxNumberOutputs)return;const i=this.layout;if(e===this._maxNumberOutputs){const t=new cg.TrimmedOutputs(this._maxNumberOutputs,(()=>{const e=this._maxNumberOutputs;this._maxNumberOutputs=1/0,this._showTrimmedOutputs(e)}));i.insertWidget(e,this._wrappedOutput(t))}else{let n=this.createOutputItem(t);n?n.toggleClass("jp-OutputArea-executeResult",null!==t.executionCount):n=new fm,this._outputTracker.has(n)||this._outputTracker.add(n),i.insertWidget(e,n)}}get outputTracker(){return this._outputTracker}_showTrimmedOutputs(e){this.widgets[e].dispose();for(let t=e;t{const t=document.createElement("pre"),n=this._translator.load("jupyterlab");t.textContent=n.__("Javascript Error: %1",e.message),i.node.appendChild(t),i.node.className="lm-Widget jp-RenderedText",i.node.setAttribute("data-mime-type","application/vnd.jupyter.stderr")})),i}_wrappedOutput(e,t=null){const i=new cg.OutputPanel;i.addClass(sg);const n=this.contentFactory.createOutputPrompt();return n.executionCount=t,n.addClass(og),i.addWidget(n),e.addClass(rg),i.addWidget(e),i}}!function(e){e.execute=async function(e,t,i,n){var s;let r=!0;n&&Array.isArray(n.tags)&&-1!==n.tags.indexOf("raises-exception")&&(r=!1);const o={code:e,stop_on_error:r},a=null===(s=i.session)||void 0===s?void 0:s.kernel;if(!a)throw new Error("Session has no kernel.");const l=a.requestExecute(o,!1,n);return t.future=l,l.done},e.isIsolated=function(e,t){const i=t[e];return i&&void 0!==i.isolated?!!i.isolated:!!t.isolated};class t{createOutputPrompt(){return new lg}createStdin(e){return new hg(e)}}e.ContentFactory=t,e.defaultContentFactory=new t}(ag||(ag={}));class lg extends fm{constructor(){super(),this._executionCount=null,this.addClass("jp-OutputPrompt")}get executionCount(){return this._executionCount}set executionCount(e){this._executionCount=e,this.node.textContent=null===e?"":`[${e}]:`}}class hg extends fm{static _historyIx(e,t){const i=hg._history.get(e);if(!i)return;const n=i.length;return t<=0?n+t:void 0}static _historyAt(e,t){const i=hg._history.get(e);if(!i)return;const n=i.length,s=hg._historyIx(e,t);return void 0!==s&&s1e3&&i.shift()}static _historySearch(e,t,i,n=!0){const s=hg._history.get(e),r=s.length,o=hg._historyIx(e,i),a=e=>-1!==e.search(t);if(void 0!==o)if(n){if(0===o)return;const e=s.slice(0,o).findLastIndex(a);if(-1!==e)return e-r}else{if(o>=r-1)return;const e=s.slice(o+1).findIndex(a);if(-1!==e)return e-r+o+1}}constructor(e){var t;super({node:cg.createInputWidgetNode(e.prompt,e.password)}),this._promise=new Wf.PromiseDelegate,this.addClass("jp-Stdin"),this._future=e.future,this._historyIndex=0,this._historyKey="session"===e.inputHistoryScope?e.parent_header.session:"",this._historyPat="",this._parentHeader=e.parent_header,this._password=e.password,this._trans=(null!==(t=e.translator)&&void 0!==t?t:ng).load("jupyterlab"),this._value=e.prompt+" ",this._input=this.node.getElementsByTagName("input")[0],this._input.placeholder=this._trans.__("โ†‘โ†“ for history. Search history with c-โ†‘/c-โ†“"),hg._history.has(this._historyKey)||hg._history.set(this._historyKey,[])}get value(){return this._promise.promise.then((()=>this._value))}handleEvent(e){const t=this._input;if("keydown"===e.type)if("Enter"===e.key)this.resetSearch(),this._future.sendInputReply({status:"ok",value:t.value},this._parentHeader),this._password?this._value+="ยทยทยทยทยทยทยทยท":(this._value+=t.value,hg._historyPush(this._historyKey,t.value)),this._promise.resolve(void 0);else if("Escape"===e.key)this.resetSearch(),t.blur();else if(!e.ctrlKey||"ArrowUp"!==e.key&&"ArrowDown"!==e.key){if("ArrowUp"===e.key){this.resetSearch();const i=hg._historyAt(this._historyKey,this._historyIndex-1);i&&(0===this._historyIndex&&(this._valueCache=t.value),this._setInputValue(i),--this._historyIndex,e.preventDefault())}else if("ArrowDown"===e.key)if(this.resetSearch(),0===this._historyIndex);else if(-1===this._historyIndex)this._setInputValue(this._valueCache),++this._historyIndex;else{const e=hg._historyAt(this._historyKey,this._historyIndex+1);e&&(this._setInputValue(e),++this._historyIndex)}}else{""===this._historyPat&&(this._historyPat=t.value);const i="ArrowUp"===e.key,n=hg._historySearch(this._historyKey,this._historyPat,this._historyIndex,i);if(void 0!==n){const i=hg._historyAt(this._historyKey,n);void 0!==i&&(0===this._historyIndex&&(this._valueCache=t.value),this._setInputValue(i),this._historyIndex=n,e.preventDefault())}}}resetSearch(){this._historyPat=""}onAfterAttach(e){this._input.addEventListener("keydown",this),this._input.focus()}onBeforeDetach(e){this._input.removeEventListener("keydown",this)}_setInputValue(e){this._input.value=e,this._input.setSelectionRange(e.length,e.length)}}var cg,dg,ug,pg,fg;function mg(e){return"execute_result"===e.output_type}function gg(e){return"display_data"===e.output_type}function vg(e){return"stream"===e.output_type}hg._history=new Map,function(e){e.createInputWidgetNode=function(e,t){const i=document.createElement("div"),n=document.createElement("pre");n.className="jp-Stdin-prompt",n.textContent=e;const s=document.createElement("input");return s.className="jp-Stdin-input",t&&(s.type="password"),i.appendChild(n),n.appendChild(s),i},e.IsolatedRenderer=class extends fm{constructor(e){super({node:document.createElement("iframe")}),this.addClass("jp-mod-isolated"),this._wrapped=e;const t=this.node;t.frameBorder="0",t.scrolling="auto",t.addEventListener("load",(()=>{t.contentDocument.open(),t.contentDocument.write(this._wrapped.node.innerHTML),t.contentDocument.close();const e=t.contentDocument.body;t.style.height=`${e.scrollHeight}px`,t.heightChangeObserver=new ResizeObserver((()=>{t.style.height=`${e.scrollHeight}px`})),t.heightChangeObserver.observe(e)}))}renderModel(e){return this._wrapped.renderModel(e)}},e.currentPreferredMimetype=new Xf.AttachedProperty({name:"preferredMimetype",create:e=>""}),e.OutputPanel=class extends Am{constructor(e){super(e)}_onContext(e){this.node.focus()}onAfterAttach(e){super.onAfterAttach(e),this.node.addEventListener("contextmenu",this._onContext.bind(this))}onBeforeDetach(e){super.onAfterDetach(e),this.node.removeEventListener("contextmenu",this._onContext.bind(this))}},e.TrimmedOutputs=class extends fm{constructor(e,t){const i=document.createElement("div"),n=`The first ${e} are displayed`;i.insertAdjacentHTML("afterbegin",`\n
Show more outputs
\n
`),super({node:i}),this._onClick=t,this.addClass("jp-TrimmedOutputs"),this.addClass("jp-RenderedHTMLCommon")}handleEvent(e){"click"===e.type&&this._onClick(e)}onAfterAttach(e){super.onAfterAttach(e),this.node.addEventListener("click",this)}onBeforeDetach(e){super.onBeforeDetach(e),this.node.removeEventListener("click",this)}}}(cg||(cg={}));class Og{constructor(e={}){if(this._array=[],this._isDisposed=!1,this._changed=new zf.Signal(this),e.values)for(const t of e.values)this._array.push(t);this._itemCmp=e.itemCmp||dg.itemCmp}get type(){return"List"}get changed(){return this._changed}get length(){return this._array.length}get isDisposed(){return this._isDisposed}dispose(){this._isDisposed||(this._isDisposed=!0,zf.Signal.clearData(this),this.clear())}[Symbol.iterator](){return this._array[Symbol.iterator]()}get(e){return this._array[e]}set(e,t){const i=this._array[e];if(void 0===t)throw new Error("Cannot set an undefined item");(0,this._itemCmp)(i,t)||(this._array[e]=t,this._changed.emit({type:"set",oldIndex:e,newIndex:e,oldValues:[i],newValues:[t]}))}push(e){const t=this._array.push(e);return this._changed.emit({type:"add",oldIndex:-1,newIndex:this.length-1,oldValues:[],newValues:[e]}),t}insert(e,t){e===this._array.length?this._array.push(t):jf.RO.insert(this._array,e,t),this._changed.emit({type:"add",oldIndex:-2,newIndex:e,oldValues:[],newValues:[t]})}removeValue(e){const t=this._itemCmp,i=jf.RO.findFirstIndex(this._array,(i=>t(i,e)));return this.remove(i),i}remove(e){const t=jf.RO.removeAt(this._array,e);if(void 0!==t)return this._changed.emit({type:"remove",oldIndex:e,newIndex:-1,newValues:[],oldValues:[t]}),t}clear(){const e=this._array.slice();this._array.length=0,this._changed.emit({type:"remove",oldIndex:0,newIndex:0,newValues:[],oldValues:e})}move(e,t){if(this.length<=1||e===t)return;const i=[this._array[e]];jf.RO.move(this._array,e,t),this._changed.emit({type:"move",oldIndex:e,newIndex:t,oldValues:i,newValues:i})}pushAll(e){const t=this.length;for(const t of e)this._array.push(t);return this._changed.emit({type:"add",oldIndex:-1,newIndex:t,oldValues:[],newValues:Array.from(e)}),this.length}insertAll(e,t){const i=e;for(const i of t)jf.RO.insert(this._array,e++,i);this._changed.emit({type:"add",oldIndex:-2,newIndex:i,oldValues:[],newValues:Array.from(t)})}removeRange(e,t){const i=this._array.slice(e,t);for(let i=e;i{e.push(i)})),e}values(){const e=[];return this._map.forEach(((t,i)=>{e.push(t)})),e}delete(e){const t=this._map.get(e);return this._map.delete(e)&&this._changed.emit({type:"remove",key:e,oldValue:t,newValue:void 0}),t}clear(){const e=this.keys();for(let t=0;te.toJSON())))}_add(e){const t=this._trusted;if(e=Wf.JSONExt.deepCopy(e),fg.normalize(e),vg(e)&&this._lastStream&&e.name===this._lastName&&this.shouldCombine({value:e,lastModel:this.list.get(this.length-1)})){this._lastStream+=e.text,this._lastStream=fg.removeOverwrittenChars(this._lastStream),e.text=this._lastStream;const i=this._createItem({value:e,trusted:t}),n=this.length-1,s=this.list.get(n);return this.list.set(n,i),s.dispose(),this.length}vg(e)&&(e.text=fg.removeOverwrittenChars(e.text));const i=this._createItem({value:e,trusted:t});return vg(e)?(this._lastStream=e.text,this._lastName=e.name):this._lastStream="",this.list.push(i)}shouldCombine(e){return!0}_createItem(e){return this.contentFactory.createOutputModel(e)}_onListChanged(e,t){switch(t.type){case"add":t.newValues.forEach((e=>{e.changed.connect(this._onGenericChange,this)}));break;case"remove":t.oldValues.forEach((e=>{e.changed.disconnect(this._onGenericChange,this)}));break;case"set":t.newValues.forEach((e=>{e.changed.connect(this._onGenericChange,this)})),t.oldValues.forEach((e=>{e.changed.disconnect(this._onGenericChange,this)}))}this._changed.emit(t)}_onGenericChange(e){let t,i=null;for(t=0;t-1;){const t=e.match(/^(.*)\r+/m)[1];let i=e.match(/\r+(.*)$/m)[1];i+=t.slice(i.length,t.length),e=e.replace(/\r+.*$/m,"\r").replace(/^.*\r/m,i)}return e}(function(e){let t=e;do{t=(e=t).replace(/[^\n]\x08/gm,"")}while(t.length{const n=e[t],s=e[i];return n.rank!==s.rank?n.rank-s.rank:n.id-s.id}))}}(Pg||(Pg={}));var Rg=__webpack_require__(6145),Dg=__webpack_require__.n(Rg);const Ig=/(\$\$?|\\(?:begin|end)\{[a-z]*\*?\}|\\[{}$]|[{}]|(?:\n\s*)+|@@\d+@@|\\\\(?:\(|\)|\[|\]))/i;function qg(e,t,i,n,s){let r=s.slice(e,t+1).join("").replace(/&/g,"&").replace(//g,">");for(navigator&&"Microsoft Internet Explorer"===navigator.appName&&(r=r.replace(/(%[^\n]*)\n/g,"$1
\n"));t>e;)s[t]="",t--;return s[e]="@@"+n.length+"@@",i&&(r=i(r)),n.push(r),s}function Lg(e){let{host:t,source:i,trusted:n,sanitizer:s,resolver:r,linkHandler:o,shouldTypeset:a,latexTypesetter:l,translator:h}=e;h=h||ng;const c=null==h?void 0:h.load("jupyterlab");let d,u=i;if(!i)return t.textContent="",Promise.resolve(void 0);if(n||(u=`${i}`,i=s.sanitize(i)),t.innerHTML=i,t.getElementsByTagName("script").length>0)if(n)zg.evalInnerHTMLScriptTags(t);else{const e=document.createElement("div"),i=document.createElement("pre");i.textContent=c.__("This HTML output contains inline scripts. Are you sure that you want to run arbitrary Javascript within your JupyterLab session?");const n=document.createElement("button");n.textContent=c.__("Run"),n.onclick=e=>{t.innerHTML=u,zg.evalInnerHTMLScriptTags(t),t.firstChild&&t.removeChild(t.firstChild)},e.appendChild(i),e.appendChild(n),t.insertBefore(e,t.firstChild)}return zg.handleDefaults(t,r),d=r?zg.handleUrls(t,r,o):Promise.resolve(void 0),d.then((()=>{a&&l&&l.typeset(t)}))}async function Ng(e){const{host:t,source:i,markdownParser:n,...s}=e;if(!i)return void(t.textContent="");let r="";if(n){const e=function(e){const t=[];let i,n=null,s=null,r=null,o=0;e.includes("`")||e.includes("~~~")?(e=e.replace(/~/g,"~T").replace(/^(?`{3,}|(~T){3,})[^`\n]*\n([\s\S]*?)^\k`*$/gm,(e=>e.replace(/\$/g,"~D"))).replace(/(^|[^\\])(`+)([^\n]*?[^`\n])\2(?!`)/gm,(e=>e.replace(/\$/g,"~D"))),i=e=>e.replace(/~([TD])/g,((e,t)=>"T"===t?"~":"$"))):i=e=>e;let a=e.replace(/\r\n?/g,"\n").split(Ig);for(let e=1,l=a.length;e{let i=a[t];return"\\\\("===i.substr(0,3)&&"\\\\)"===i.substr(i.length-3)?i="\\("+i.substring(3,i.length-3)+"\\)":"\\\\["===i.substr(0,3)&&"\\\\]"===i.substr(i.length-3)&&(i="\\["+i.substring(3,i.length-3)+"\\]"),i}))}else r=`
${i}
`;var o,a;await Lg({host:t,source:r,...s}),zg.headerAnchors(t)}function Bg(e,t){var i,n;const s=e.cloneNode();s.textContent=null===(i=e.textContent)||void 0===i?void 0:i.slice(0,t);const r=e.cloneNode();return r.textContent=null===(n=e.textContent)||void 0===n?void 0:n.slice(t),{pre:s,post:r}}function*$g(e){var t;let i,n=0;for(let s of e)i=n+((null===(t=s.textContent)||void 0===t?void 0:t.length)||0),yield{node:s,start:n,end:i,isText:s.nodeType===Node.TEXT_NODE},n=i}function Qg(e){var t,i;const{host:n,sanitizer:s,source:r}=e,o=s.sanitize(zg.ansiSpan(r),{allowedTags:["span"]}),a=document.createElement("pre"),l=document.createElement("pre");l.innerHTML=o;const h=l.textContent;if(h){const e=null===(i=null===(t=s.getAutolink)||void 0===t?void 0:t.call(s))||void 0===i||i?function(e){const t="\\u0000-\\u0020\\u007f-\\u009f",i=new RegExp("(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\\/\\/|data:|www\\.)[^\\s"+t+'"]{2,}[^\\s'+t+"\"'(){}\\[\\],:;.!?]","ug"),n=[];let s,r=0;for(;null!=(s=i.exec(e));){s.index!==r&&n.push(document.createTextNode(e.slice(r,s.index)));let t=s[0];const i=t.slice(-1),o=-1!==[">","<"].indexOf(i)?t.length-1:t.length,a=document.createElement("a");t=t.slice(0,o),a.href=t.startsWith("www.")?"https://"+t:t,a.rel="noopener",a.target="_blank",a.appendChild(document.createTextNode(t.slice(0,o))),n.push(a),r=s.index+o}return r!==e.length&&n.push(document.createTextNode(e.slice(r,e.length))),n}(h):[document.createTextNode(o)];let n=!1;const r=[],c=Array.from(l.childNodes);for(let t of function*(e,t){var i,n;let s=$g(e),r=$g(t),o=s.next(),a=r.next();for(;!o.done&&!a.done;){let e=o.value,t=a.value;if(e.isText&&e.start<=t.start&&e.end>=t.end)yield[null,t.node],a=r.next();else if(t.isText&&t.start<=e.start&&t.end>=e.end)yield[e.node,null],o=s.next();else if(e.end===t.end&&e.start===t.start)yield[e.node,t.node],o=s.next(),a=r.next();else if(e.end>t.end){let{pre:n,post:s}=Bg(e.node,t.end-e.start);t.starte.end))throw new Error(`Unexpected intersection: ${JSON.stringify(e)} ${JSON.stringify(t)}`);{let{pre:i,post:r}=Bg(t.node,e.end-t.start);e.start{const s=decodeURIComponent(n);return i&&i.handleLink(e,s,r),t.getDownloadUrl(n)})).then((t=>{e.href=t+r})).catch((t=>{e.href=""}))}e.evalInnerHTMLScriptTags=function(e){const t=Array.from(e.getElementsByTagName("script"));for(const e of t){if(!e.parentNode)continue;const t=document.createElement("script"),i=e.attributes;for(let e=0,n=i.length;e{}))},e.headerAnchors=function(e){const t=["h1","h2","h3","h4","h5","h6"];for(const i of t){const t=e.getElementsByTagName(i);for(let e=0;e"),a.push(e),a.push("")):a.push(e)}}function r(e){let t,i,n;const s=e.shift();if(2===s&&e.length>=3){if(t=e.shift(),i=e.shift(),n=e.shift(),[t,i,n].some((e=>e<0||255=1))throw new RangeError("Invalid extended color specification");{const s=e.shift();if(s<0)throw new RangeError("Color index must be >= 0");if(s<16)return s;if(s<232)t=Math.floor((s-16)/36),t=t>0?55+40*t:0,i=Math.floor((s-16)%36/6),i=i>0?55+40*i:0,n=(s-16)%6,n=n>0?55+40*n:0;else{if(!(s<256))throw new RangeError("Color index must be < 256");t=i=n=10*(s-232)+8}}}return[t,i,n]}e.ansiSpan=function(e){const t=/\x1b\[(.*?)([@-~])/g;let i,n=[],o=[],a=!1,l=!1,h=!1;const c=[],d=[];let u=0;for(e=Dg()(e),e+="";i=t.exec(e);){if("m"===i[2]){const e=i[1].split(";");for(let t=0;t]+xmlns=[^>]+svg")<0&&(i=i.replace("new Vg(e)},{safe:!0,mimeTypes:["text/markdown"],defaultRank:60,createRenderer:e=>new Hg(e)},{safe:!0,mimeTypes:["text/latex"],defaultRank:70,createRenderer:e=>new Ug(e)},{safe:!1,mimeTypes:["image/svg+xml"],defaultRank:80,createRenderer:e=>new Xg(e)},{safe:!0,mimeTypes:["image/bmp","image/png","image/jpeg","image/gif","image/webp"],defaultRank:90,createRenderer:e=>new Fg(e)},{safe:!1,mimeTypes:["text/javascript","application/javascript"],defaultRank:110,createRenderer:e=>new Gg(e)},{safe:!0,mimeTypes:["text/plain","application/vnd.jupyter.stdout","application/vnd.jupyter.stderr"],defaultRank:120,createRenderer:e=>new Yg(e)}];var Kg=function(e,t,i,n){return new(i||(i=Promise))((function(s,r){function o(e){try{l(n.next(e))}catch(e){r(e)}}function a(e){try{l(n.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(o,a)}l((n=n.apply(e,t||[])).next())}))};const Jg={cell:"manim-binder-cell",input:"manim-binder-input",button:"manim-binder-button",output:"manim-binder-output",wrapper:"manim-binder-wrapper",title:"manim-binder-title",meta:"manim-binder-meta",buttonWrapper:"manim-binder-button-wrapper"};!function(e){let t="ManimCommunity/jupyter_examples",i="main",n=60,s="manim-notebook-kernel",r="python3",o=Jg,a="https://mybinder.org",l=!1,h=null,c=null,d=null,u=null;function p(t){if(void 0!==e){const i=(new Date).getTime()+60*n*1e3,r=JSON.stringify({settings:t,timestamp:i});e.localStorage.setItem(s,r)}const i=$f.ServerConnection.makeSettings(t);return c=new $f.KernelManager({serverSettings:i}),u=new $f.ContentsManager({serverSettings:i}),c.startNew({name:r}).then((e=>e))}function f(e,t="",i=""){const n=document.createElement(e);return n.className=t,n.textContent=i,n}function m(e,t){return Kg(this,void 0,void 0,(function*(){const i=h.requestExecute({code:"from manim import *"});yield i.done,console.log("Import done. Now running code"),e.future=h.requestExecute({code:t}),e.model.add({output_type:"stream",name:"loading",text:"Loading..."}),e.model.clear(!0)}))}function g(n,r){if(h)return n.model.clear(),n.model.add({output_type:"stream",name:"loading",text:"Loading..."}),void m(n,r);const o=a.split("//")[1],c=l?"Reconnecting to":"Launching";n.model.clear(),n.model.add({output_type:"stream",name:"stdout",text:`${c} Docker container on ${o}...`}),new Promise(((n,r)=>function(){if(void 0!==e){const t=e.localStorage.getItem(s);if(t){l=!0;const{settings:i,timestamp:n}=JSON.parse(t);if(n&&(new Date).getTime(){const i=new EventSource(n);i.onerror=e=>{i.close(),t(new Error("Unable to connect to Binder"))};let s=null;i.onmessage=({data:n})=>{const r=JSON.parse(n);if(r.phase&&r.phase!=s&&(s=r.phase.toLowerCase()),"failed"==r.phase)i.close(),t(new Error(r));else if("ready"==r.phase){i.close();const t={baseUrl:r.url,wsUrl:`ws${r.url.slice(4)}`,token:r.token};e(t)}}}))}(t,i,a).then((e=>p(e)))}().then(n).catch(r))).then((e=>{h=e,m(n,r)})).catch((()=>{h=null,void 0!==e&&(l=!1,e.localStorage.removeItem(s)),n.model.clear(),n.model.add({output_type:"stream",name:"failure",text:"Failed to connect to kernel"})}))}e.initManimBinder=function({repo:l,branch:h,storage_expire:c,storage_key:p,kernel_type:m,class_names:v,binder_url:O}={}){t=l||t,i=h||i,n=c||n,s=p||s,r=m||r,o=v||o,a=O||a,function(){const e=document.createElement("style");e.textContent=`\n .${o.wrapper} {\n padding: 10px;\n }\n\n .${o.title} {\n text-align: center;\n display: flex;\n justify-content: space-between;\n }\n\n .${o.meta} {\n font-size: 0.75rem;\n font-weight: 400;\n padding-top: 0.1rem;\n color: #666;\n }\n\n .${o.button} {\n cursor: pointer;\n }\n `,document.head.appendChild(e)}(),[...document.querySelectorAll("[data-manim-binder]")].forEach((t=>function(t){const i=t.getAttribute("data-manim-classname");if(!i)return void console.error("No manim classname provided.");const n=f("div",o.buttonWrapper);t.replaceWith(n);const s=f("button",o.button,"Make interactive");n.appendChild(s),s.addEventListener("click",(s=>{let r=t.textContent||"";r+="\n\n# don't remove below command for run button to work",r+=`\n%manim -qm -v WARNING ${i}`,function(t,i=""){const n=new ag({model:new wg({trusted:!0}),rendermime:new Ag({initialFactories:(d||(d=Zg.filter((t=>!t.mimeTypes.includes("text/latex")||void 0!==e&&e.MathJax))),d)})}),s=f("div",o.wrapper);t.replaceWith(s);const r=f("h4",o.title,"Try out manim!");s.appendChild(r);const l=f("span",o.meta,"Python 3 ยท via ");r.appendChild(l);const h=f("a","","Binder");h.setAttribute("href",a),l.appendChild(h);const c=f("div",o.cell);s.appendChild(c);const p=f("div",o.input);c.appendChild(p);const m=f("button",o.button,"Run");c.appendChild(m);const v=f("div",o.output);c.appendChild(v),Lf.sendMessage(n,fm.Msg.BeforeAttach),v.appendChild(n.node),Lf.sendMessage(n,fm.Msg.AfterAttach),n.model.changed.connect((()=>{v.querySelectorAll("video").forEach((e=>Kg(this,void 0,void 0,(function*(){console.log("fixing video");const t=e.getAttribute("src");if(!t)return void console.error("no src for the video.");e.style.maxWidth="100%";const i=yield u.get(t);if(!i.mimetype.startsWith("video/"))return void console.error("not a video");const n=atob(i.content),s=new ArrayBuffer(n.length),r=new Uint8Array(s);for(let e=0;e(g(n,O.state.doc.toString()),!0)},{key:"Ctrl-Enter",run:()=>(g(n,O.state.doc.toString()),!0)}]),zs.of([...Cc,...Dh])],parent:p});O.contentDOM.setAttribute("data-enable-grammarly","false"),O.dispatch({changes:{from:0,to:O.state.doc.length,insert:i.trim()}}),m.addEventListener("click",(e=>g(n,O.state.doc.toString())))}(n,r)}))}(t)))}}(window)})()})(); //# sourceMappingURL=manim-binder.min.js.map ManimCommunity-manim-1157b74/docs/source/_static/manim-binder.min.js.LICENSE.txt000066400000000000000000000002401515024150700272660ustar00rootroot00000000000000/*! * is-plain-object * * Copyright (c) 2014-2017, Jon Schlinkert. * Released under the MIT License. */ ManimCommunity-manim-1157b74/docs/source/_static/manim-binder.min.js.map000066400000000000000000202534321515024150700261620ustar00rootroot00000000000000{"version":3,"file":"manim-binder.min.js","mappings":"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CT,IACA,OACA,UACA,UACA,OACA,UACA,QACA,QACA,IACA,MACA,MACA,MACA,aACA,KACA,SACA,SACA,UACA,SACA,OACA,OACA,MACA,WACA,UACA,UACA,OACA,WACA,KACA,MACA,UACA,MACA,MACA,MACA,KACA,KACA,KACA,WACA,aACA,SACA,OACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,SACA,SACA,KACA,IAGA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,MACA,OACA,OACA,QACA,MACA,OACA,KACA,WACA,SACA,SACA,IACA,MACA,WACA,IACA,UACA,IACA,OACA,UACA,SACA,QACA,SACA,OACA,SACA,SACA,MACA,UACA,MACA,QACA,QACA,KACA,WACA,QACA,KACA,QACA,OACA,KACA,QACA,KACA,IACA,KACA,MACA,QACA,OAIJM,kBAAmB,CACf,IAAK,CACD,QACA,MACA,YACA,SACA,KACA,QACA,WACA,UACA,YACA,OACA,aACA,QACA,QACA,aAGJp7D,EAAG,CACC,YACA,SACA,OACA,WACA,OACA,MACA,QACA,WACA,SACA,QAEJ+8J,KAAM,CACF,YACA,MACA,SACA,OACA,SACA,QACA,YAGJ+P,MAAO,CACH,WACA,WACA,OACA,aACA,QACA,UACA,OAEJE,IAAK,CAAC,OACNr8H,WAAY,CAAC,QACbmgD,GAAI,CAAC,SACL7gD,OAAQ,CACJ,YACA,0BACA,6BACA,WACA,OACA,WACA,OACA,SAEJg9H,OAAQ,CAAC,SAAU,SACnB/E,QAAS,CAAC,SACVpgH,IAAK,CAAC,QAAS,OAAQ,UAAW,OAAQ,SAAU,SACpDqlH,SAAU,CAAC,QAAS,OAAQ,UAAW,OAAQ,SAAU,SACzDl9I,QAAS,CACL,UACA,UACA,WACA,OACA,QACA,aACA,QAEJttB,KAAM,CAAC,SACPygG,IAAK,CAAC,OAAQ,YACdxyD,QAAS,CAAC,QACVn0C,IAAK,CAAC,WACNo0C,IAAK,CAAC,SACNC,GAAI,CAAC,WACLC,SAAU,CAAC,YACX6rG,KAAM,CAAC,QAAS,OAAQ,QACxBzr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","sources":["webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/activitymonitor.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/interfaces.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/pageconfig.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/path.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/signal.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/text.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/time.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+coreutils@6.0.7/node_modules/@jupyterlab/coreutils/lib/url.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/basemanager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/builder/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/config/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/contents/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/contents/validate.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/event/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/comm.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/default.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/future.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/kernel.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/manager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/messages.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/restapi.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/serialize.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernel/validate.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernelspec/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernelspec/kernelspec.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernelspec/manager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernelspec/restapi.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/kernelspec/validate.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/manager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/nbconvert/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/serverconnection.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/default.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/manager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/restapi.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/session.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/session/validate.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/setting/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/shim/ws.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/terminal/default.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/terminal/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/terminal/manager.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/terminal/restapi.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/terminal/terminal.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/user/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/validate.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+services@7.0.7_react@18.2.0/node_modules/@jupyterlab/services/lib/workspace/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/dataconnector.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/interfaces.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/restorablepool.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/statedb.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+statedb@4.0.7/node_modules/@jupyterlab/statedb/lib/tokens.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+algorithm@2.0.1/node_modules/@lumino/algorithm/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+coreutils@2.1.2/node_modules/@lumino/coreutils/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+disposable@2.1.2/node_modules/@lumino/disposable/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+polling@2.1.2/node_modules/@lumino/polling/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+properties@2.0.1/node_modules/@lumino/properties/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+signaling@2.1.2/node_modules/@lumino/signaling/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/deepmerge@4.3.1/node_modules/deepmerge/dist/cjs.js","webpack://manim-binder/./node_modules/.pnpm/dom-serializer@1.4.1/node_modules/dom-serializer/lib/foreignNames.js","webpack://manim-binder/./node_modules/.pnpm/dom-serializer@1.4.1/node_modules/dom-serializer/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/domelementtype@2.3.0/node_modules/domelementtype/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/domhandler@4.3.1/node_modules/domhandler/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/domhandler@4.3.1/node_modules/domhandler/lib/node.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/feeds.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/helpers.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/legacy.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/manipulation.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/querying.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/stringify.js","webpack://manim-binder/./node_modules/.pnpm/domutils@2.8.0/node_modules/domutils/lib/traversal.js","webpack://manim-binder/./node_modules/.pnpm/entities@2.2.0/node_modules/entities/lib/decode.js","webpack://manim-binder/./node_modules/.pnpm/entities@2.2.0/node_modules/entities/lib/decode_codepoint.js","webpack://manim-binder/./node_modules/.pnpm/entities@2.2.0/node_modules/entities/lib/encode.js","webpack://manim-binder/./node_modules/.pnpm/entities@2.2.0/node_modules/entities/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/escape-string-regexp@4.0.0/node_modules/escape-string-regexp/index.js","webpack://manim-binder/./node_modules/.pnpm/htmlparser2@6.1.0/node_modules/htmlparser2/lib/FeedHandler.js","webpack://manim-binder/./node_modules/.pnpm/htmlparser2@6.1.0/node_modules/htmlparser2/lib/Parser.js","webpack://manim-binder/./node_modules/.pnpm/htmlparser2@6.1.0/node_modules/htmlparser2/lib/Tokenizer.js","webpack://manim-binder/./node_modules/.pnpm/htmlparser2@6.1.0/node_modules/htmlparser2/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/is-plain-object@5.0.0/node_modules/is-plain-object/dist/is-plain-object.js","webpack://manim-binder/./node_modules/.pnpm/lodash.escape@4.0.1/node_modules/lodash.escape/index.js","webpack://manim-binder/./node_modules/.pnpm/minimist@1.2.8/node_modules/minimist/index.js","webpack://manim-binder/./node_modules/.pnpm/parse-srcset@1.0.2/node_modules/parse-srcset/src/parse-srcset.js","webpack://manim-binder/./node_modules/.pnpm/path-browserify@1.0.1/node_modules/path-browserify/index.js","webpack://manim-binder/./node_modules/.pnpm/picocolors@1.0.0/node_modules/picocolors/picocolors.browser.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/at-rule.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/comment.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/container.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/css-syntax-error.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/declaration.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/document.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/fromJSON.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/input.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/lazy-result.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/list.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/map-generator.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/no-work-result.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/node.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/parse.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/parser.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/postcss.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/previous-map.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/processor.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/result.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/root.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/rule.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/stringifier.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/stringify.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/symbols.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/tokenize.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/warn-once.js","webpack://manim-binder/./node_modules/.pnpm/postcss@8.4.31/node_modules/postcss/lib/warning.js","webpack://manim-binder/./node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.js","webpack://manim-binder/./node_modules/.pnpm/requires-port@1.0.0/node_modules/requires-port/index.js","webpack://manim-binder/./node_modules/.pnpm/sanitize-html@2.7.3/node_modules/sanitize-html/index.js","webpack://manim-binder/./node_modules/.pnpm/url-parse@1.5.10/node_modules/url-parse/index.js","webpack://manim-binder/./node_modules/.pnpm/nanoid@3.3.6/node_modules/nanoid/non-secure/index.cjs","webpack://manim-binder/webpack/bootstrap","webpack://manim-binder/webpack/runtime/compat get default export","webpack://manim-binder/webpack/runtime/define property getters","webpack://manim-binder/webpack/runtime/global","webpack://manim-binder/webpack/runtime/hasOwnProperty shorthand","webpack://manim-binder/webpack/runtime/make namespace object","webpack://manim-binder/./node_modules/.pnpm/@codemirror+state@6.3.1/node_modules/@codemirror/state/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/style-mod@4.1.0/node_modules/style-mod/src/style-mod.js","webpack://manim-binder/./node_modules/.pnpm/w3c-keyname@2.2.8/node_modules/w3c-keyname/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+view@6.21.4/node_modules/@codemirror/view/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lezer+common@1.1.0/node_modules/@lezer/common/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lezer+highlight@1.1.6/node_modules/@lezer/highlight/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+language@6.9.2/node_modules/@codemirror/language/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+commands@6.3.0/node_modules/@codemirror/commands/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/crelt@1.0.6/node_modules/crelt/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+search@6.5.4/node_modules/@codemirror/search/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+autocomplete@6.10.2_@codemirror+language@6.9.2_@codemirror+state@6.3.1_@codemirro_qlo7c5orcxst6mqbb4ug325pdq/node_modules/@codemirror/autocomplete/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+lint@6.4.2/node_modules/@codemirror/lint/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/codemirror@6.0.1_@lezer+common@1.1.0/node_modules/codemirror/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lezer+lr@1.3.13/node_modules/@lezer/lr/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lezer+python@1.1.9/node_modules/@lezer/python/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+lang-python@6.1.3_@codemirror+state@6.3.1_@codemirror+view@6.21.4_@lezer+common@1.1.0/node_modules/@codemirror/lang-python/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@codemirror+theme-one-dark@6.1.2/node_modules/@codemirror/theme-one-dark/dist/index.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+domutils@2.0.1/node_modules/@lumino/domutils/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+collections@2.0.1/node_modules/@lumino/collections/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+messaging@2.0.1/node_modules/@lumino/messaging/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+dragdrop@2.1.3/node_modules/@lumino/dragdrop/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+keyboard@2.0.1/node_modules/@lumino/keyboard/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+commands@2.1.3/node_modules/@lumino/commands/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+virtualdom@2.0.1/node_modules/@lumino/virtualdom/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@lumino+widgets@2.3.0/node_modules/@lumino/widgets/dist/index.es6.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+apputils@4.1.7/node_modules/@jupyterlab/apputils/lib/widgettracker.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+translation@4.0.7_react@18.2.0/node_modules/@jupyterlab/translation/lib/utils.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+translation@4.0.7_react@18.2.0/node_modules/@jupyterlab/translation/lib/gettext.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+translation@4.0.7_react@18.2.0/node_modules/@jupyterlab/translation/lib/base.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+translation@4.0.7_react@18.2.0/node_modules/@jupyterlab/translation/lib/tokens.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+outputarea@4.0.7_react@18.2.0/node_modules/@jupyterlab/outputarea/lib/widget.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+observables@5.0.7/node_modules/@jupyterlab/observables/lib/observablelist.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+observables@5.0.7/node_modules/@jupyterlab/observables/lib/observablemap.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/outputmodel.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+outputarea@4.0.7_react@18.2.0/node_modules/@jupyterlab/outputarea/lib/model.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+nbformat@4.0.7/node_modules/@jupyterlab/nbformat/lib/index.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+observables@5.0.7/node_modules/@jupyterlab/observables/lib/observablejson.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+apputils@4.1.7/node_modules/@jupyterlab/apputils/lib/sanitizer.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/mimemodel.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/registry.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/latex.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/renderers.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/widgets.js","webpack://manim-binder/./node_modules/.pnpm/@jupyterlab+rendermime@4.0.7_react@18.2.0/node_modules/@jupyterlab/rendermime/lib/factories.js","webpack://manim-binder/./src/main.ts"],"sourcesContent":["\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ActivityMonitor = void 0;\nconst signaling_1 = require(\"@lumino/signaling\");\n/**\n * A class that monitors activity on a signal.\n */\nclass ActivityMonitor {\n /**\n * Construct a new activity monitor.\n */\n constructor(options) {\n this._timer = -1;\n this._timeout = -1;\n this._isDisposed = false;\n this._activityStopped = new signaling_1.Signal(this);\n options.signal.connect(this._onSignalFired, this);\n this._timeout = options.timeout || 1000;\n }\n /**\n * A signal emitted when activity has ceased.\n */\n get activityStopped() {\n return this._activityStopped;\n }\n /**\n * The timeout associated with the monitor, in milliseconds.\n */\n get timeout() {\n return this._timeout;\n }\n set timeout(value) {\n this._timeout = value;\n }\n /**\n * Test whether the monitor has been disposed.\n *\n * #### Notes\n * This is a read-only property.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the resources used by the activity monitor.\n */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n signaling_1.Signal.clearData(this);\n }\n /**\n * A signal handler for the monitored signal.\n */\n _onSignalFired(sender, args) {\n clearTimeout(this._timer);\n this._sender = sender;\n this._args = args;\n this._timer = setTimeout(() => {\n this._activityStopped.emit({\n sender: this._sender,\n args: this._args\n });\n }, this._timeout);\n }\n}\nexports.ActivityMonitor = ActivityMonitor;\n//# sourceMappingURL=activitymonitor.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/**\n * @packageDocumentation\n * @module coreutils\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./activitymonitor\"), exports);\n__exportStar(require(\"./interfaces\"), exports);\n__exportStar(require(\"./markdowncodeblocks\"), exports);\n__exportStar(require(\"./pageconfig\"), exports);\n__exportStar(require(\"./path\"), exports);\n__exportStar(require(\"./signal\"), exports);\n__exportStar(require(\"./text\"), exports);\n__exportStar(require(\"./time\"), exports);\n__exportStar(require(\"./url\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=interfaces.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MarkdownCodeBlocks = void 0;\n/**\n * The namespace for code block functions which help\n * in extract code from markdown text\n */\nvar MarkdownCodeBlocks;\n(function (MarkdownCodeBlocks) {\n MarkdownCodeBlocks.CODE_BLOCK_MARKER = '```';\n const markdownExtensions = [\n '.markdown',\n '.mdown',\n '.mkdn',\n '.md',\n '.mkd',\n '.mdwn',\n '.mdtxt',\n '.mdtext',\n '.text',\n '.txt',\n '.Rmd'\n ];\n class MarkdownCodeBlock {\n constructor(startLine) {\n this.startLine = startLine;\n this.code = '';\n this.endLine = -1;\n }\n }\n MarkdownCodeBlocks.MarkdownCodeBlock = MarkdownCodeBlock;\n /**\n * Check whether the given file extension is a markdown extension\n * @param extension - A file extension\n *\n * @returns true/false depending on whether this is a supported markdown extension\n */\n function isMarkdown(extension) {\n return markdownExtensions.indexOf(extension) > -1;\n }\n MarkdownCodeBlocks.isMarkdown = isMarkdown;\n /**\n * Construct all code snippets from current text\n * (this could be potentially optimized if we can cache and detect differences)\n * @param text - A string to parse codeblocks from\n *\n * @returns An array of MarkdownCodeBlocks.\n */\n function findMarkdownCodeBlocks(text) {\n if (!text || text === '') {\n return [];\n }\n const lines = text.split('\\n');\n const codeBlocks = [];\n let currentBlock = null;\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex];\n const lineContainsMarker = line.indexOf(MarkdownCodeBlocks.CODE_BLOCK_MARKER) === 0;\n const constructingBlock = currentBlock != null;\n // Skip this line if it is not part of any code block and doesn't contain a marker.\n if (!lineContainsMarker && !constructingBlock) {\n continue;\n }\n // Check if we are already constructing a code block.\n if (!constructingBlock) {\n // Start constructing a new code block.\n currentBlock = new MarkdownCodeBlock(lineIndex);\n // Check whether this is a single line code block of the form ```a = 10```.\n const firstIndex = line.indexOf(MarkdownCodeBlocks.CODE_BLOCK_MARKER);\n const lastIndex = line.lastIndexOf(MarkdownCodeBlocks.CODE_BLOCK_MARKER);\n const isSingleLine = firstIndex !== lastIndex;\n if (isSingleLine) {\n currentBlock.code = line.substring(firstIndex + MarkdownCodeBlocks.CODE_BLOCK_MARKER.length, lastIndex);\n currentBlock.endLine = lineIndex;\n codeBlocks.push(currentBlock);\n currentBlock = null;\n }\n }\n else if (currentBlock) {\n if (lineContainsMarker) {\n // End of block, finish it up.\n currentBlock.endLine = lineIndex - 1;\n codeBlocks.push(currentBlock);\n currentBlock = null;\n }\n else {\n // Append the current line.\n currentBlock.code += line + '\\n';\n }\n }\n }\n return codeBlocks;\n }\n MarkdownCodeBlocks.findMarkdownCodeBlocks = findMarkdownCodeBlocks;\n})(MarkdownCodeBlocks = exports.MarkdownCodeBlocks || (exports.MarkdownCodeBlocks = {}));\n//# sourceMappingURL=markdowncodeblocks.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PageConfig = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\nconst minimist_1 = __importDefault(require(\"minimist\"));\nconst url_1 = require(\"./url\");\n/**\n * The namespace for `PageConfig` functions.\n */\nvar PageConfig;\n(function (PageConfig) {\n /**\n * Get global configuration data for the Jupyter application.\n *\n * @param name - The name of the configuration option.\n *\n * @returns The config value or an empty string if not found.\n *\n * #### Notes\n * All values are treated as strings.\n * For browser based applications, it is assumed that the page HTML\n * includes a script tag with the id `jupyter-config-data` containing the\n * configuration as valid JSON. In order to support the classic Notebook,\n * we fall back on checking for `body` data of the given `name`.\n *\n * For node applications, it is assumed that the process was launched\n * with a `--jupyter-config-data` option pointing to a JSON settings\n * file.\n */\n function getOption(name) {\n if (configData) {\n return configData[name] || getBodyData(name);\n }\n configData = Object.create(null);\n let found = false;\n // Use script tag if available.\n if (typeof document !== 'undefined' && document) {\n const el = document.getElementById('jupyter-config-data');\n if (el) {\n configData = JSON.parse(el.textContent || '');\n found = true;\n }\n }\n // Otherwise use CLI if given.\n if (!found && typeof process !== 'undefined' && process.argv) {\n try {\n const cli = (0, minimist_1.default)(process.argv.slice(2));\n const path = require('path');\n let fullPath = '';\n if ('jupyter-config-data' in cli) {\n fullPath = path.resolve(cli['jupyter-config-data']);\n }\n else if ('JUPYTER_CONFIG_DATA' in process.env) {\n fullPath = path.resolve(process.env['JUPYTER_CONFIG_DATA']);\n }\n if (fullPath) {\n // Force Webpack to ignore this require.\n // eslint-disable-next-line\n configData = eval('require')(fullPath);\n }\n }\n catch (e) {\n console.error(e);\n }\n }\n if (!coreutils_1.JSONExt.isObject(configData)) {\n configData = Object.create(null);\n }\n else {\n for (const key in configData) {\n // PageConfig expects strings\n if (typeof configData[key] !== 'string') {\n configData[key] = JSON.stringify(configData[key]);\n }\n }\n }\n return configData[name] || getBodyData(name);\n }\n PageConfig.getOption = getOption;\n /**\n * Set global configuration data for the Jupyter application.\n *\n * @param name - The name of the configuration option.\n * @param value - The value to set the option to.\n *\n * @returns The last config value or an empty string if it doesn't exist.\n */\n function setOption(name, value) {\n const last = getOption(name);\n configData[name] = value;\n return last;\n }\n PageConfig.setOption = setOption;\n /**\n * Get the base url for a Jupyter application, or the base url of the page.\n */\n function getBaseUrl() {\n return url_1.URLExt.normalize(getOption('baseUrl') || '/');\n }\n PageConfig.getBaseUrl = getBaseUrl;\n /**\n * Get the tree url for a JupyterLab application.\n */\n function getTreeUrl() {\n return url_1.URLExt.join(getBaseUrl(), getOption('treeUrl'));\n }\n PageConfig.getTreeUrl = getTreeUrl;\n /**\n * Get the base url for sharing links (usually baseUrl)\n */\n function getShareUrl() {\n return url_1.URLExt.normalize(getOption('shareUrl') || getBaseUrl());\n }\n PageConfig.getShareUrl = getShareUrl;\n /**\n * Get the tree url for shareable links.\n * Usually the same as treeUrl,\n * but overrideable e.g. when sharing with JupyterHub.\n */\n function getTreeShareUrl() {\n return url_1.URLExt.normalize(url_1.URLExt.join(getShareUrl(), getOption('treeUrl')));\n }\n PageConfig.getTreeShareUrl = getTreeShareUrl;\n /**\n * Create a new URL given an optional mode and tree path.\n *\n * This is used to create URLS when the mode or tree path change as the user\n * changes mode or the current document in the main area. If fields in\n * options are omitted, the value in PageConfig will be used.\n *\n * @param options - IGetUrlOptions for the new path.\n */\n function getUrl(options) {\n var _a, _b, _c, _d;\n let path = options.toShare ? getShareUrl() : getBaseUrl();\n const mode = (_a = options.mode) !== null && _a !== void 0 ? _a : getOption('mode');\n const workspace = (_b = options.workspace) !== null && _b !== void 0 ? _b : getOption('workspace');\n const labOrDoc = mode === 'single-document' ? 'doc' : 'lab';\n path = url_1.URLExt.join(path, labOrDoc);\n if (workspace !== PageConfig.defaultWorkspace) {\n path = url_1.URLExt.join(path, 'workspaces', encodeURIComponent((_c = getOption('workspace')) !== null && _c !== void 0 ? _c : PageConfig.defaultWorkspace));\n }\n const treePath = (_d = options.treePath) !== null && _d !== void 0 ? _d : getOption('treePath');\n if (treePath) {\n path = url_1.URLExt.join(path, 'tree', url_1.URLExt.encodeParts(treePath));\n }\n return path;\n }\n PageConfig.getUrl = getUrl;\n PageConfig.defaultWorkspace = 'default';\n /**\n * Get the base websocket url for a Jupyter application, or an empty string.\n */\n function getWsUrl(baseUrl) {\n let wsUrl = getOption('wsUrl');\n if (!wsUrl) {\n baseUrl = baseUrl ? url_1.URLExt.normalize(baseUrl) : getBaseUrl();\n if (baseUrl.indexOf('http') !== 0) {\n return '';\n }\n wsUrl = 'ws' + baseUrl.slice(4);\n }\n return url_1.URLExt.normalize(wsUrl);\n }\n PageConfig.getWsUrl = getWsUrl;\n /**\n * Returns the URL converting this notebook to a certain\n * format with nbconvert.\n */\n function getNBConvertURL({ path, format, download }) {\n const notebookPath = url_1.URLExt.encodeParts(path);\n const url = url_1.URLExt.join(getBaseUrl(), 'nbconvert', format, notebookPath);\n if (download) {\n return url + '?download=true';\n }\n return url;\n }\n PageConfig.getNBConvertURL = getNBConvertURL;\n /**\n * Get the authorization token for a Jupyter application.\n */\n function getToken() {\n return getOption('token') || getBodyData('jupyterApiToken');\n }\n PageConfig.getToken = getToken;\n /**\n * Get the Notebook version info [major, minor, patch].\n */\n function getNotebookVersion() {\n const notebookVersion = getOption('notebookVersion');\n if (notebookVersion === '') {\n return [0, 0, 0];\n }\n return JSON.parse(notebookVersion);\n }\n PageConfig.getNotebookVersion = getNotebookVersion;\n /**\n * Private page config data for the Jupyter application.\n */\n let configData = null;\n /**\n * Get a url-encoded item from `body.data` and decode it\n * We should never have any encoded URLs anywhere else in code\n * until we are building an actual request.\n */\n function getBodyData(key) {\n if (typeof document === 'undefined' || !document.body) {\n return '';\n }\n const val = document.body.dataset[key];\n if (typeof val === 'undefined') {\n return '';\n }\n return decodeURIComponent(val);\n }\n /**\n * The namespace for page config `Extension` functions.\n */\n let Extension;\n (function (Extension) {\n /**\n * Populate an array from page config.\n *\n * @param key - The page config key (e.g., `deferredExtensions`).\n *\n * #### Notes\n * This is intended for `deferredExtensions` and `disabledExtensions`.\n */\n function populate(key) {\n try {\n const raw = getOption(key);\n if (raw) {\n return JSON.parse(raw);\n }\n }\n catch (error) {\n console.warn(`Unable to parse ${key}.`, error);\n }\n return [];\n }\n /**\n * The collection of deferred extensions in page config.\n */\n Extension.deferred = populate('deferredExtensions');\n /**\n * The collection of disabled extensions in page config.\n */\n Extension.disabled = populate('disabledExtensions');\n /**\n * Returns whether a plugin is deferred.\n *\n * @param id - The plugin ID.\n */\n function isDeferred(id) {\n // Check for either a full plugin id match or an extension\n // name match.\n const separatorIndex = id.indexOf(':');\n let extName = '';\n if (separatorIndex !== -1) {\n extName = id.slice(0, separatorIndex);\n }\n return Extension.deferred.some(val => val === id || (extName && val === extName));\n }\n Extension.isDeferred = isDeferred;\n /**\n * Returns whether a plugin is disabled.\n *\n * @param id - The plugin ID.\n */\n function isDisabled(id) {\n // Check for either a full plugin id match or an extension\n // name match.\n const separatorIndex = id.indexOf(':');\n let extName = '';\n if (separatorIndex !== -1) {\n extName = id.slice(0, separatorIndex);\n }\n return Extension.disabled.some(val => val === id || (extName && val === extName));\n }\n Extension.isDisabled = isDisabled;\n })(Extension = PageConfig.Extension || (PageConfig.Extension = {}));\n})(PageConfig = exports.PageConfig || (exports.PageConfig = {}));\n//# sourceMappingURL=pageconfig.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PathExt = void 0;\nconst path_1 = require(\"path\");\n/**\n * The namespace for path-related functions.\n *\n * Note that Jupyter server paths do not start with a leading slash.\n */\nvar PathExt;\n(function (PathExt) {\n /**\n * Join all arguments together and normalize the resulting path.\n * Arguments must be strings. In v0.8, non-string arguments were silently ignored. In v0.10 and up, an exception is thrown.\n *\n * @param paths - The string paths to join.\n */\n function join(...paths) {\n const path = path_1.posix.join(...paths);\n return path === '.' ? '' : removeSlash(path);\n }\n PathExt.join = join;\n /**\n * Return the last portion of a path. Similar to the Unix basename command.\n * Often used to extract the file name from a fully qualified path.\n *\n * @param path - The path to evaluate.\n *\n * @param ext - An extension to remove from the result.\n */\n function basename(path, ext) {\n return path_1.posix.basename(path, ext);\n }\n PathExt.basename = basename;\n /**\n * Get the directory name of a path, similar to the Unix dirname command.\n * When an empty path is given, returns the root path.\n *\n * @param path - The file path.\n */\n function dirname(path) {\n const dir = removeSlash(path_1.posix.dirname(path));\n return dir === '.' ? '' : dir;\n }\n PathExt.dirname = dirname;\n /**\n * Get the extension of the path.\n *\n * @param path - The file path.\n *\n * @returns the extension of the file.\n *\n * #### Notes\n * The extension is the string from the last occurrence of the `.`\n * character to end of string in the last portion of the path, inclusive.\n * If there is no `.` in the last portion of the path, or if the first\n * character of the basename of path [[basename]] is `.`, then an\n * empty string is returned.\n */\n function extname(path) {\n return path_1.posix.extname(path);\n }\n PathExt.extname = extname;\n /**\n * Normalize a string path, reducing '..' and '.' parts.\n * When multiple slashes are found, they're replaced by a single one; when the path contains a trailing slash, it is preserved. On Windows backslashes are used.\n * When an empty path is given, returns the root path.\n *\n * @param path - The string path to normalize.\n */\n function normalize(path) {\n if (path === '') {\n return '';\n }\n return removeSlash(path_1.posix.normalize(path));\n }\n PathExt.normalize = normalize;\n /**\n * Resolve a sequence of paths or path segments into an absolute path.\n * The root path in the application has no leading slash, so it is removed.\n *\n * @param parts - The paths to join.\n *\n * #### Notes\n * The right-most parameter is considered \\{to\\}. Other parameters are considered an array of \\{from\\}.\n *\n * Starting from leftmost \\{from\\} parameter, resolves \\{to\\} to an absolute path.\n *\n * If \\{to\\} isn't already absolute, \\{from\\} arguments are prepended in right to left order, until an absolute path is found. If after using all \\{from\\} paths still no absolute path is found, the current working directory is used as well. The resulting path is normalized, and trailing slashes are removed unless the path gets resolved to the root directory.\n */\n function resolve(...parts) {\n return removeSlash(path_1.posix.resolve(...parts));\n }\n PathExt.resolve = resolve;\n /**\n * Solve the relative path from \\{from\\} to \\{to\\}.\n *\n * @param from - The source path.\n *\n * @param to - The target path.\n *\n * #### Notes\n * If from and to each resolve to the same path (after calling\n * path.resolve() on each), a zero-length string is returned.\n * If a zero-length string is passed as from or to, `/`\n * will be used instead of the zero-length strings.\n */\n function relative(from, to) {\n return removeSlash(path_1.posix.relative(from, to));\n }\n PathExt.relative = relative;\n /**\n * Normalize a file extension to be of the type `'.foo'`.\n *\n * @param extension - the file extension.\n *\n * #### Notes\n * Adds a leading dot if not present and converts to lower case.\n */\n function normalizeExtension(extension) {\n if (extension.length > 0 && extension.indexOf('.') !== 0) {\n extension = `.${extension}`;\n }\n return extension;\n }\n PathExt.normalizeExtension = normalizeExtension;\n /**\n * Remove the leading slash from a path.\n *\n * @param path: the path from which to remove a leading slash.\n */\n function removeSlash(path) {\n if (path.indexOf('/') === 0) {\n path = path.slice(1);\n }\n return path;\n }\n PathExt.removeSlash = removeSlash;\n})(PathExt = exports.PathExt || (exports.PathExt = {}));\n//# sourceMappingURL=path.js.map","\"use strict\";\n/*\n * Copyright (c) Jupyter Development Team.\n * Distributed under the terms of the Modified BSD License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.signalToPromise = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\n/**\n * Convert a signal into a promise for the first emitted value.\n *\n * @param signal - The signal we are listening to.\n * @param timeout - Timeout to wait for signal in ms (not timeout if not defined or 0)\n *\n * @returns a Promise that resolves with a `(sender, args)` pair.\n */\nfunction signalToPromise(signal, timeout) {\n const waitForSignal = new coreutils_1.PromiseDelegate();\n function cleanup() {\n signal.disconnect(slot);\n }\n function slot(sender, args) {\n cleanup();\n waitForSignal.resolve([sender, args]);\n }\n signal.connect(slot);\n if ((timeout !== null && timeout !== void 0 ? timeout : 0) > 0) {\n setTimeout(() => {\n cleanup();\n waitForSignal.reject(`Signal not emitted within ${timeout} ms.`);\n }, timeout);\n }\n return waitForSignal.promise;\n}\nexports.signalToPromise = signalToPromise;\n//# sourceMappingURL=signal.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Text = void 0;\n/**\n * The namespace for text-related functions.\n */\nvar Text;\n(function (Text) {\n // javascript stores text as utf16 and string indices use \"code units\",\n // which stores high-codepoint characters as \"surrogate pairs\",\n // which occupy two indices in the javascript string.\n // We need to translate cursor_pos in the Jupyter protocol (in characters)\n // to js offset (with surrogate pairs taking two spots).\n const HAS_SURROGATES = '๐š'.length > 1;\n /**\n * Convert a javascript string index into a unicode character offset\n *\n * @param jsIdx - The javascript string index (counting surrogate pairs)\n *\n * @param text - The text in which the offset is calculated\n *\n * @returns The unicode character offset\n */\n function jsIndexToCharIndex(jsIdx, text) {\n if (HAS_SURROGATES) {\n // not using surrogates, nothing to do\n return jsIdx;\n }\n let charIdx = jsIdx;\n for (let i = 0; i + 1 < text.length && i < jsIdx; i++) {\n const charCode = text.charCodeAt(i);\n // check for surrogate pair\n if (charCode >= 0xd800 && charCode <= 0xdbff) {\n const nextCharCode = text.charCodeAt(i + 1);\n if (nextCharCode >= 0xdc00 && nextCharCode <= 0xdfff) {\n charIdx--;\n i++;\n }\n }\n }\n return charIdx;\n }\n Text.jsIndexToCharIndex = jsIndexToCharIndex;\n /**\n * Convert a unicode character offset to a javascript string index.\n *\n * @param charIdx - The index in unicode characters\n *\n * @param text - The text in which the offset is calculated\n *\n * @returns The js-native index\n */\n function charIndexToJsIndex(charIdx, text) {\n if (HAS_SURROGATES) {\n // not using surrogates, nothing to do\n return charIdx;\n }\n let jsIdx = charIdx;\n for (let i = 0; i + 1 < text.length && i < jsIdx; i++) {\n const charCode = text.charCodeAt(i);\n // check for surrogate pair\n if (charCode >= 0xd800 && charCode <= 0xdbff) {\n const nextCharCode = text.charCodeAt(i + 1);\n if (nextCharCode >= 0xdc00 && nextCharCode <= 0xdfff) {\n jsIdx++;\n i++;\n }\n }\n }\n return jsIdx;\n }\n Text.charIndexToJsIndex = charIndexToJsIndex;\n /**\n * Given a 'snake-case', 'snake_case', 'snake:case', or\n * 'snake case' string, will return the camel case version: 'snakeCase'.\n *\n * @param str: the snake-case input string.\n *\n * @param upper: default = false. If true, the first letter of the\n * returned string will be capitalized.\n *\n * @returns the camel case version of the input string.\n */\n function camelCase(str, upper = false) {\n return str.replace(/^(\\w)|[\\s-_:]+(\\w)/g, function (match, p1, p2) {\n if (p2) {\n return p2.toUpperCase();\n }\n else {\n return upper ? p1.toUpperCase() : p1.toLowerCase();\n }\n });\n }\n Text.camelCase = camelCase;\n /**\n * Given a string, title case the words in the string.\n *\n * @param str: the string to title case.\n *\n * @returns the same string, but with each word capitalized.\n */\n function titleCase(str) {\n return (str || '')\n .toLowerCase()\n .split(' ')\n .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ');\n }\n Text.titleCase = titleCase;\n})(Text = exports.Text || (exports.Text = {}));\n//# sourceMappingURL=text.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Time = void 0;\n/**\n * A list of time units with their associated value in milliseconds.\n */\nconst UNITS = [\n { name: 'years', milliseconds: 365 * 24 * 60 * 60 * 1000 },\n { name: 'months', milliseconds: 30 * 24 * 60 * 60 * 1000 },\n { name: 'days', milliseconds: 24 * 60 * 60 * 1000 },\n { name: 'hours', milliseconds: 60 * 60 * 1000 },\n { name: 'minutes', milliseconds: 60 * 1000 },\n { name: 'seconds', milliseconds: 1000 }\n];\n/**\n * The namespace for date functions.\n */\nvar Time;\n(function (Time) {\n /**\n * Convert a timestring to a human readable string (e.g. 'two minutes ago').\n *\n * @param value - The date timestring or date object.\n *\n * @returns A formatted date.\n */\n function formatHuman(value) {\n const lang = document.documentElement.lang || 'en';\n const formatter = new Intl.RelativeTimeFormat(lang, { numeric: 'auto' });\n const delta = new Date(value).getTime() - Date.now();\n for (let unit of UNITS) {\n const amount = Math.ceil(delta / unit.milliseconds);\n if (amount === 0) {\n continue;\n }\n return formatter.format(amount, unit.name);\n }\n return formatter.format(0, 'seconds');\n }\n Time.formatHuman = formatHuman;\n /**\n * Convenient helper to convert a timestring to a date format.\n *\n * @param value - The date timestring or date object.\n *\n * @returns A formatted date.\n */\n function format(value) {\n const lang = document.documentElement.lang || 'en';\n const formatter = new Intl.DateTimeFormat(lang, {\n dateStyle: 'short',\n timeStyle: 'short'\n });\n return formatter.format(new Date(value));\n }\n Time.format = format;\n})(Time = exports.Time || (exports.Time = {}));\n//# sourceMappingURL=time.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.URLExt = void 0;\nconst path_1 = require(\"path\");\nconst url_parse_1 = __importDefault(require(\"url-parse\"));\n/**\n * The namespace for URL-related functions.\n */\nvar URLExt;\n(function (URLExt) {\n /**\n * Parse a url into a URL object.\n *\n * @param urlString - The URL string to parse.\n *\n * @returns A URL object.\n */\n function parse(url) {\n if (typeof document !== 'undefined' && document) {\n const a = document.createElement('a');\n a.href = url;\n return a;\n }\n return (0, url_parse_1.default)(url);\n }\n URLExt.parse = parse;\n /**\n * Parse URL and retrieve hostname\n *\n * @param url - The URL string to parse\n *\n * @returns a hostname string value\n */\n function getHostName(url) {\n return (0, url_parse_1.default)(url).hostname;\n }\n URLExt.getHostName = getHostName;\n function normalize(url) {\n return url && parse(url).toString();\n }\n URLExt.normalize = normalize;\n /**\n * Join a sequence of url components and normalizes as in node `path.join`.\n *\n * @param parts - The url components.\n *\n * @returns the joined url.\n */\n function join(...parts) {\n let u = (0, url_parse_1.default)(parts[0], {});\n // Schema-less URL can be only parsed as relative to a base URL\n // see https://github.com/unshiftio/url-parse/issues/219#issuecomment-1002219326\n const isSchemaLess = u.protocol === '' && u.slashes;\n if (isSchemaLess) {\n u = (0, url_parse_1.default)(parts[0], 'https:' + parts[0]);\n }\n const prefix = `${isSchemaLess ? '' : u.protocol}${u.slashes ? '//' : ''}${u.auth}${u.auth ? '@' : ''}${u.host}`;\n // If there was a prefix, then the first path must start at the root.\n const path = path_1.posix.join(`${!!prefix && u.pathname[0] !== '/' ? '/' : ''}${u.pathname}`, ...parts.slice(1));\n return `${prefix}${path === '.' ? '' : path}`;\n }\n URLExt.join = join;\n /**\n * Encode the components of a multi-segment url.\n *\n * @param url - The url to encode.\n *\n * @returns the encoded url.\n *\n * #### Notes\n * Preserves the `'/'` separators.\n * Should not include the base url, since all parts are escaped.\n */\n function encodeParts(url) {\n return join(...url.split('/').map(encodeURIComponent));\n }\n URLExt.encodeParts = encodeParts;\n /**\n * Return a serialized object string suitable for a query.\n *\n * @param object - The source object.\n *\n * @returns an encoded url query.\n *\n * #### Notes\n * Modified version of [stackoverflow](http://stackoverflow.com/a/30707423).\n */\n function objectToQueryString(value) {\n const keys = Object.keys(value).filter(key => key.length > 0);\n if (!keys.length) {\n return '';\n }\n return ('?' +\n keys\n .map(key => {\n const content = encodeURIComponent(String(value[key]));\n return key + (content ? '=' + content : '');\n })\n .join('&'));\n }\n URLExt.objectToQueryString = objectToQueryString;\n /**\n * Return a parsed object that represents the values in a query string.\n */\n function queryStringToObject(value) {\n return value\n .replace(/^\\?/, '')\n .split('&')\n .reduce((acc, val) => {\n const [key, value] = val.split('=');\n if (key.length > 0) {\n acc[key] = decodeURIComponent(value || '');\n }\n return acc;\n }, {});\n }\n URLExt.queryStringToObject = queryStringToObject;\n /**\n * Test whether the url is a local url.\n *\n * #### Notes\n * This function returns `false` for any fully qualified url, including\n * `data:`, `file:`, and `//` protocol URLs.\n */\n function isLocal(url) {\n const { protocol } = parse(url);\n return ((!protocol || url.toLowerCase().indexOf(protocol) !== 0) &&\n url.indexOf('/') !== 0);\n }\n URLExt.isLocal = isLocal;\n})(URLExt = exports.URLExt || (exports.URLExt = {}));\n//# sourceMappingURL=url.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BaseManager = void 0;\nconst signaling_1 = require(\"@lumino/signaling\");\nconst serverconnection_1 = require(\"./serverconnection\");\nclass BaseManager {\n constructor(options) {\n var _a;\n this._isDisposed = false;\n this._disposed = new signaling_1.Signal(this);\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n }\n /**\n * A signal emitted when the delegate is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * Test whether the delegate has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Whether the manager is active.\n */\n get isActive() {\n return true;\n }\n /**\n * Dispose of the delegate and invoke the callback function.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._disposed.emit(undefined);\n signaling_1.Signal.clearData(this);\n }\n}\nexports.BaseManager = BaseManager;\n//# sourceMappingURL=basemanager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BuildManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst serverconnection_1 = require(\"../serverconnection\");\n/**\n * The url for the lab build service.\n */\nconst BUILD_SETTINGS_URL = 'api/build';\n/**\n * The build API service manager.\n */\nclass BuildManager {\n /**\n * Create a new setting manager.\n */\n constructor(options = {}) {\n var _a;\n this._url = '';\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n const { baseUrl, appUrl } = this.serverSettings;\n this._url = coreutils_1.URLExt.join(baseUrl, appUrl, BUILD_SETTINGS_URL);\n }\n /**\n * Test whether the build service is available.\n */\n get isAvailable() {\n return coreutils_1.PageConfig.getOption('buildAvailable').toLowerCase() === 'true';\n }\n /**\n * Test whether to check build status automatically.\n */\n get shouldCheck() {\n return coreutils_1.PageConfig.getOption('buildCheck').toLowerCase() === 'true';\n }\n /**\n * Get whether the application should be built.\n */\n getStatus() {\n const { _url, serverSettings } = this;\n const promise = serverconnection_1.ServerConnection.makeRequest(_url, {}, serverSettings);\n return promise\n .then(response => {\n if (response.status !== 200) {\n throw new serverconnection_1.ServerConnection.ResponseError(response);\n }\n return response.json();\n })\n .then(data => {\n if (typeof data.status !== 'string') {\n throw new Error('Invalid data');\n }\n if (typeof data.message !== 'string') {\n throw new Error('Invalid data');\n }\n return data;\n });\n }\n /**\n * Build the application.\n */\n build() {\n const { _url, serverSettings } = this;\n const init = { method: 'POST' };\n const promise = serverconnection_1.ServerConnection.makeRequest(_url, init, serverSettings);\n return promise.then(response => {\n if (response.status === 400) {\n throw new serverconnection_1.ServerConnection.ResponseError(response, 'Build aborted');\n }\n if (response.status !== 200) {\n const message = `Build failed with ${response.status}.\n\n If you are experiencing the build failure after installing an extension (or trying to include previously installed extension after updating JupyterLab) please check the extension repository for new installation instructions as many extensions migrated to the prebuilt extensions system which no longer requires rebuilding JupyterLab (but uses a different installation procedure, typically involving a package manager such as 'pip' or 'conda').\n\n If you specifically intended to install a source extension, please run 'jupyter lab build' on the server for full output.`;\n throw new serverconnection_1.ServerConnection.ResponseError(response, message);\n }\n });\n }\n /**\n * Cancel an active build.\n */\n cancel() {\n const { _url, serverSettings } = this;\n const init = { method: 'DELETE' };\n const promise = serverconnection_1.ServerConnection.makeRequest(_url, init, serverSettings);\n return promise.then(response => {\n if (response.status !== 204) {\n throw new serverconnection_1.ServerConnection.ResponseError(response);\n }\n });\n }\n}\nexports.BuildManager = BuildManager;\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConfigWithDefaults = exports.ConfigSection = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst __1 = require(\"..\");\n/**\n * The url for the config service.\n */\nconst SERVICE_CONFIG_URL = 'api/config';\n/**\n * The namespace for ConfigSection statics.\n */\nvar ConfigSection;\n(function (ConfigSection) {\n /**\n * Create a config section.\n *\n * @returns A Promise that is fulfilled with the config section is loaded.\n */\n function create(options) {\n const section = new DefaultConfigSection(options);\n return section.load().then(() => {\n return section;\n });\n }\n ConfigSection.create = create;\n})(ConfigSection = exports.ConfigSection || (exports.ConfigSection = {}));\n/**\n * Implementation of the Configurable data section.\n */\nclass DefaultConfigSection {\n /**\n * Construct a new config section.\n */\n constructor(options) {\n var _a;\n this._url = 'unknown';\n const settings = (this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : __1.ServerConnection.makeSettings());\n this._url = coreutils_1.URLExt.join(settings.baseUrl, SERVICE_CONFIG_URL, encodeURIComponent(options.name));\n }\n /**\n * Get the data for this section.\n */\n get data() {\n return this._data;\n }\n /**\n * Load the initial data for this section.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config).\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\n async load() {\n const response = await __1.ServerConnection.makeRequest(this._url, {}, this.serverSettings);\n if (response.status !== 200) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n this._data = await response.json();\n }\n /**\n * Modify the stored config values.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config).\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n *\n * Updates the local data immediately, sends the change to the server,\n * and updates the local data with the response, and fulfils the promise\n * with that data.\n */\n async update(newdata) {\n this._data = { ...this._data, ...newdata };\n const init = {\n method: 'PATCH',\n body: JSON.stringify(newdata)\n };\n const response = await __1.ServerConnection.makeRequest(this._url, init, this.serverSettings);\n if (response.status !== 200) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n this._data = await response.json();\n return this._data;\n }\n}\n/**\n * Configurable object with defaults.\n */\nclass ConfigWithDefaults {\n /**\n * Create a new config with defaults.\n */\n constructor(options) {\n var _a, _b;\n this._className = '';\n this._section = options.section;\n this._defaults = (_a = options.defaults) !== null && _a !== void 0 ? _a : {};\n this._className = (_b = options.className) !== null && _b !== void 0 ? _b : '';\n }\n /**\n * Get data from the config section or fall back to defaults.\n */\n get(key) {\n const data = this._classData();\n return key in data ? data[key] : this._defaults[key];\n }\n /**\n * Set a config value.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/config).\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n *\n * Sends the update to the server, and changes our local copy of the data\n * immediately.\n */\n set(key, value) {\n const d = {};\n d[key] = value;\n if (this._className) {\n const d2 = {};\n d2[this._className] = d;\n return this._section.update(d2);\n }\n else {\n return this._section.update(d);\n }\n }\n /**\n * Get data from the Section with our classname, if available.\n *\n * #### Notes\n * If we have no classname, get all of the data in the Section\n */\n _classData() {\n const data = this._section.data;\n if (this._className && this._className in data) {\n return data[this._className];\n }\n return data;\n }\n}\nexports.ConfigWithDefaults = ConfigWithDefaults;\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Drive = exports.ContentsManager = exports.Contents = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst validate = __importStar(require(\"./validate\"));\n/**\n * The url for the default drive service.\n */\nconst SERVICE_DRIVE_URL = 'api/contents';\n/**\n * The url for the file access.\n */\nconst FILES_URL = 'files';\n/**\n * A namespace for contents interfaces.\n */\nvar Contents;\n(function (Contents) {\n /**\n * Validates an IModel, throwing an error if it does not pass.\n */\n function validateContentsModel(contents) {\n validate.validateContentsModel(contents);\n }\n Contents.validateContentsModel = validateContentsModel;\n /**\n * Validates an ICheckpointModel, throwing an error if it does not pass.\n */\n function validateCheckpointModel(checkpoint) {\n validate.validateCheckpointModel(checkpoint);\n }\n Contents.validateCheckpointModel = validateCheckpointModel;\n})(Contents = exports.Contents || (exports.Contents = {}));\n/**\n * A contents manager that passes file operations to the server.\n * Multiple servers implementing the `IDrive` interface can be\n * attached to the contents manager, so that the same session can\n * perform file operations on multiple backends.\n *\n * This includes checkpointing with the normal file operations.\n */\nclass ContentsManager {\n /**\n * Construct a new contents manager object.\n *\n * @param options - The options used to initialize the object.\n */\n constructor(options = {}) {\n var _a, _b;\n this._isDisposed = false;\n this._additionalDrives = new Map();\n this._fileChanged = new signaling_1.Signal(this);\n const serverSettings = (this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : __1.ServerConnection.makeSettings());\n this._defaultDrive = (_b = options.defaultDrive) !== null && _b !== void 0 ? _b : new Drive({ serverSettings });\n this._defaultDrive.fileChanged.connect(this._onFileChanged, this);\n }\n /**\n * A signal emitted when a file operation takes place.\n */\n get fileChanged() {\n return this._fileChanged;\n }\n /**\n * Test whether the manager has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the resources held by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._isDisposed = true;\n signaling_1.Signal.clearData(this);\n }\n /**\n * Add an `IDrive` to the manager.\n */\n addDrive(drive) {\n this._additionalDrives.set(drive.name, drive);\n drive.fileChanged.connect(this._onFileChanged, this);\n }\n /**\n * Given a path, get a shared model factory from the\n * relevant backend. Returns `null` if the backend\n * does not provide one.\n */\n getSharedModelFactory(path) {\n var _a;\n const [drive] = this._driveForPath(path);\n return (_a = drive === null || drive === void 0 ? void 0 : drive.sharedModelFactory) !== null && _a !== void 0 ? _a : null;\n }\n /**\n * Given a path of the form `drive:local/portion/of/it.txt`\n * get the local part of it.\n *\n * @param path: the path.\n *\n * @returns The local part of the path.\n */\n localPath(path) {\n const parts = path.split('/');\n const firstParts = parts[0].split(':');\n if (firstParts.length === 1 || !this._additionalDrives.has(firstParts[0])) {\n return coreutils_1.PathExt.removeSlash(path);\n }\n return coreutils_1.PathExt.join(firstParts.slice(1).join(':'), ...parts.slice(1));\n }\n /**\n * Normalize a global path. Reduces '..' and '.' parts, and removes\n * leading slashes from the local part of the path, while retaining\n * the drive name if it exists.\n *\n * @param path: the path.\n *\n * @returns The normalized path.\n */\n normalize(path) {\n const parts = path.split(':');\n if (parts.length === 1) {\n return coreutils_1.PathExt.normalize(path);\n }\n return `${parts[0]}:${coreutils_1.PathExt.normalize(parts.slice(1).join(':'))}`;\n }\n /**\n * Resolve a global path, starting from the root path. Behaves like\n * posix-path.resolve, with 3 differences:\n * - will never prepend cwd\n * - if root has a drive name, the result is prefixed with \":\"\n * - before adding drive name, leading slashes are removed\n *\n * @param path: the path.\n *\n * @returns The normalized path.\n */\n resolvePath(root, path) {\n const driveName = this.driveName(root);\n const localPath = this.localPath(root);\n const resolved = coreutils_1.PathExt.resolve('/', localPath, path);\n return driveName ? `${driveName}:${resolved}` : resolved;\n }\n /**\n * Given a path of the form `drive:local/portion/of/it.txt`\n * get the name of the drive. If the path is missing\n * a drive portion, returns an empty string.\n *\n * @param path: the path.\n *\n * @returns The drive name for the path, or the empty string.\n */\n driveName(path) {\n const parts = path.split('/');\n const firstParts = parts[0].split(':');\n if (firstParts.length === 1) {\n return '';\n }\n if (this._additionalDrives.has(firstParts[0])) {\n return firstParts[0];\n }\n return '';\n }\n /**\n * Get a file or directory.\n *\n * @param path: The path to the file.\n *\n * @param options: The options used to fetch the file.\n *\n * @returns A promise which resolves with the file content.\n */\n get(path, options) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.get(localPath, options).then(contentsModel => {\n const listing = [];\n if (contentsModel.type === 'directory' && contentsModel.content) {\n for (const item of contentsModel.content) {\n listing.push({ ...item, path: this._toGlobalPath(drive, item.path) });\n }\n return {\n ...contentsModel,\n path: this._toGlobalPath(drive, localPath),\n content: listing,\n serverPath: contentsModel.path\n };\n }\n else {\n return {\n ...contentsModel,\n path: this._toGlobalPath(drive, localPath),\n serverPath: contentsModel.path\n };\n }\n });\n }\n /**\n * Get an encoded download url given a file path.\n *\n * @param path - An absolute POSIX file path on the server.\n *\n * #### Notes\n * It is expected that the path contains no relative paths.\n *\n * The returned URL may include a query parameter.\n */\n getDownloadUrl(path) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.getDownloadUrl(localPath);\n }\n /**\n * Create a new untitled file or directory in the specified directory path.\n *\n * @param options: The options used to create the file.\n *\n * @returns A promise which resolves with the created file content when the\n * file is created.\n */\n newUntitled(options = {}) {\n if (options.path) {\n const globalPath = this.normalize(options.path);\n const [drive, localPath] = this._driveForPath(globalPath);\n return drive\n .newUntitled({ ...options, path: localPath })\n .then(contentsModel => {\n return {\n ...contentsModel,\n path: coreutils_1.PathExt.join(globalPath, contentsModel.name),\n serverPath: contentsModel.path\n };\n });\n }\n else {\n return this._defaultDrive.newUntitled(options);\n }\n }\n /**\n * Delete a file.\n *\n * @param path - The path to the file.\n *\n * @returns A promise which resolves when the file is deleted.\n */\n delete(path) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.delete(localPath);\n }\n /**\n * Rename a file or directory.\n *\n * @param path - The original file path.\n *\n * @param newPath - The new file path.\n *\n * @returns A promise which resolves with the new file contents model when\n * the file is renamed.\n */\n rename(path, newPath) {\n const [drive1, path1] = this._driveForPath(path);\n const [drive2, path2] = this._driveForPath(newPath);\n if (drive1 !== drive2) {\n throw Error('ContentsManager: renaming files must occur within a Drive');\n }\n return drive1.rename(path1, path2).then(contentsModel => {\n return {\n ...contentsModel,\n path: this._toGlobalPath(drive1, path2),\n serverPath: contentsModel.path\n };\n });\n }\n /**\n * Save a file.\n *\n * @param path - The desired file path.\n *\n * @param options - Optional overrides to the model.\n *\n * @returns A promise which resolves with the file content model when the\n * file is saved.\n *\n * #### Notes\n * Ensure that `model.content` is populated for the file.\n */\n save(path, options = {}) {\n const globalPath = this.normalize(path);\n const [drive, localPath] = this._driveForPath(path);\n return drive\n .save(localPath, { ...options, path: localPath })\n .then(contentsModel => {\n return {\n ...contentsModel,\n path: globalPath,\n serverPath: contentsModel.path\n };\n });\n }\n /**\n * Copy a file into a given directory.\n *\n * @param path - The original file path.\n *\n * @param toDir - The destination directory path.\n *\n * @returns A promise which resolves with the new contents model when the\n * file is copied.\n *\n * #### Notes\n * The server will select the name of the copied file.\n */\n copy(fromFile, toDir) {\n const [drive1, path1] = this._driveForPath(fromFile);\n const [drive2, path2] = this._driveForPath(toDir);\n if (drive1 === drive2) {\n return drive1.copy(path1, path2).then(contentsModel => {\n return {\n ...contentsModel,\n path: this._toGlobalPath(drive1, contentsModel.path),\n serverPath: contentsModel.path\n };\n });\n }\n else {\n throw Error('Copying files between drives is not currently implemented');\n }\n }\n /**\n * Create a checkpoint for a file.\n *\n * @param path - The path of the file.\n *\n * @returns A promise which resolves with the new checkpoint model when the\n * checkpoint is created.\n */\n createCheckpoint(path) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.createCheckpoint(localPath);\n }\n /**\n * List available checkpoints for a file.\n *\n * @param path - The path of the file.\n *\n * @returns A promise which resolves with a list of checkpoint models for\n * the file.\n */\n listCheckpoints(path) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.listCheckpoints(localPath);\n }\n /**\n * Restore a file to a known checkpoint state.\n *\n * @param path - The path of the file.\n *\n * @param checkpointID - The id of the checkpoint to restore.\n *\n * @returns A promise which resolves when the checkpoint is restored.\n */\n restoreCheckpoint(path, checkpointID) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.restoreCheckpoint(localPath, checkpointID);\n }\n /**\n * Delete a checkpoint for a file.\n *\n * @param path - The path of the file.\n *\n * @param checkpointID - The id of the checkpoint to delete.\n *\n * @returns A promise which resolves when the checkpoint is deleted.\n */\n deleteCheckpoint(path, checkpointID) {\n const [drive, localPath] = this._driveForPath(path);\n return drive.deleteCheckpoint(localPath, checkpointID);\n }\n /**\n * Given a drive and a local path, construct a fully qualified\n * path. The inverse of `_driveForPath`.\n *\n * @param drive: an `IDrive`.\n *\n * @param localPath: the local path on the drive.\n *\n * @returns the fully qualified path.\n */\n _toGlobalPath(drive, localPath) {\n if (drive === this._defaultDrive) {\n return coreutils_1.PathExt.removeSlash(localPath);\n }\n else {\n return `${drive.name}:${coreutils_1.PathExt.removeSlash(localPath)}`;\n }\n }\n /**\n * Given a path, get the `IDrive to which it refers,\n * where the path satisfies the pattern\n * `'driveName:path/to/file'`. If there is no `driveName`\n * prepended to the path, it returns the default drive.\n *\n * @param path: a path to a file.\n *\n * @returns A tuple containing an `IDrive` object for the path,\n * and a local path for that drive.\n */\n _driveForPath(path) {\n const driveName = this.driveName(path);\n const localPath = this.localPath(path);\n if (driveName) {\n return [this._additionalDrives.get(driveName), localPath];\n }\n else {\n return [this._defaultDrive, localPath];\n }\n }\n /**\n * Respond to fileChanged signals from the drives attached to\n * the manager. This prepends the drive name to the path if necessary,\n * and then forwards the signal.\n */\n _onFileChanged(sender, args) {\n var _a, _b;\n if (sender === this._defaultDrive) {\n this._fileChanged.emit(args);\n }\n else {\n let newValue = null;\n let oldValue = null;\n if ((_a = args.newValue) === null || _a === void 0 ? void 0 : _a.path) {\n newValue = {\n ...args.newValue,\n path: this._toGlobalPath(sender, args.newValue.path)\n };\n }\n if ((_b = args.oldValue) === null || _b === void 0 ? void 0 : _b.path) {\n oldValue = {\n ...args.oldValue,\n path: this._toGlobalPath(sender, args.oldValue.path)\n };\n }\n this._fileChanged.emit({\n type: args.type,\n newValue,\n oldValue\n });\n }\n }\n}\nexports.ContentsManager = ContentsManager;\n/**\n * A default implementation for an `IDrive`, talking to the\n * server using the Jupyter REST API.\n */\nclass Drive {\n /**\n * Construct a new contents manager object.\n *\n * @param options - The options used to initialize the object.\n */\n constructor(options = {}) {\n var _a, _b, _c;\n this._isDisposed = false;\n this._fileChanged = new signaling_1.Signal(this);\n this.name = (_a = options.name) !== null && _a !== void 0 ? _a : 'Default';\n this._apiEndpoint = (_b = options.apiEndpoint) !== null && _b !== void 0 ? _b : SERVICE_DRIVE_URL;\n this.serverSettings =\n (_c = options.serverSettings) !== null && _c !== void 0 ? _c : __1.ServerConnection.makeSettings();\n }\n /**\n * A signal emitted when a file operation takes place.\n */\n get fileChanged() {\n return this._fileChanged;\n }\n /**\n * Test whether the manager has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the resources held by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._isDisposed = true;\n signaling_1.Signal.clearData(this);\n }\n /**\n * Get a file or directory.\n *\n * @param localPath: The path to the file.\n *\n * @param options: The options used to fetch the file.\n *\n * @returns A promise which resolves with the file content.\n *\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async get(localPath, options) {\n let url = this._getUrl(localPath);\n if (options) {\n // The notebook type cannot take an format option.\n if (options.type === 'notebook') {\n delete options['format'];\n }\n const content = options.content ? '1' : '0';\n const params = { ...options, content };\n url += coreutils_1.URLExt.objectToQueryString(params);\n }\n const settings = this.serverSettings;\n const response = await __1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateContentsModel(data);\n return data;\n }\n /**\n * Get an encoded download url given a file path.\n *\n * @param localPath - An absolute POSIX file path on the server.\n *\n * #### Notes\n * It is expected that the path contains no relative paths.\n *\n * The returned URL may include a query parameter.\n */\n getDownloadUrl(localPath) {\n const baseUrl = this.serverSettings.baseUrl;\n let url = coreutils_1.URLExt.join(baseUrl, FILES_URL, coreutils_1.URLExt.encodeParts(localPath));\n const xsrfTokenMatch = document.cookie.match('\\\\b_xsrf=([^;]*)\\\\b');\n if (xsrfTokenMatch) {\n const fullUrl = new URL(url);\n fullUrl.searchParams.append('_xsrf', xsrfTokenMatch[1]);\n url = fullUrl.toString();\n }\n return Promise.resolve(url);\n }\n /**\n * Create a new untitled file or directory in the specified directory path.\n *\n * @param options: The options used to create the file.\n *\n * @returns A promise which resolves with the created file content when the\n * file is created.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async newUntitled(options = {}) {\n var _a;\n let body = '{}';\n if (options) {\n if (options.ext) {\n options.ext = Private.normalizeExtension(options.ext);\n }\n body = JSON.stringify(options);\n }\n const settings = this.serverSettings;\n const url = this._getUrl((_a = options.path) !== null && _a !== void 0 ? _a : '');\n const init = {\n method: 'POST',\n body\n };\n const response = await __1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 201) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateContentsModel(data);\n this._fileChanged.emit({\n type: 'new',\n oldValue: null,\n newValue: data\n });\n return data;\n }\n /**\n * Delete a file.\n *\n * @param localPath - The path to the file.\n *\n * @returns A promise which resolves when the file is deleted.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents).\n */\n async delete(localPath) {\n const url = this._getUrl(localPath);\n const settings = this.serverSettings;\n const init = { method: 'DELETE' };\n const response = await __1.ServerConnection.makeRequest(url, init, settings);\n // TODO: update IPEP27 to specify errors more precisely, so\n // that error types can be detected here with certainty.\n if (response.status !== 204) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n this._fileChanged.emit({\n type: 'delete',\n oldValue: { path: localPath },\n newValue: null\n });\n }\n /**\n * Rename a file or directory.\n *\n * @param oldLocalPath - The original file path.\n *\n * @param newLocalPath - The new file path.\n *\n * @returns A promise which resolves with the new file contents model when\n * the file is renamed.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async rename(oldLocalPath, newLocalPath) {\n const settings = this.serverSettings;\n const url = this._getUrl(oldLocalPath);\n const init = {\n method: 'PATCH',\n body: JSON.stringify({ path: newLocalPath })\n };\n const response = await __1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 200) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateContentsModel(data);\n this._fileChanged.emit({\n type: 'rename',\n oldValue: { path: oldLocalPath },\n newValue: data\n });\n return data;\n }\n /**\n * Save a file.\n *\n * @param localPath - The desired file path.\n *\n * @param options - Optional overrides to the model.\n *\n * @returns A promise which resolves with the file content model when the\n * file is saved.\n *\n * #### Notes\n * Ensure that `model.content` is populated for the file.\n *\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async save(localPath, options = {}) {\n const settings = this.serverSettings;\n const url = this._getUrl(localPath);\n const init = {\n method: 'PUT',\n body: JSON.stringify(options)\n };\n const response = await __1.ServerConnection.makeRequest(url, init, settings);\n // will return 200 for an existing file and 201 for a new file\n if (response.status !== 200 && response.status !== 201) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateContentsModel(data);\n this._fileChanged.emit({\n type: 'save',\n oldValue: null,\n newValue: data\n });\n return data;\n }\n /**\n * Copy a file into a given directory.\n *\n * @param localPath - The original file path.\n *\n * @param toDir - The destination directory path.\n *\n * @returns A promise which resolves with the new contents model when the\n * file is copied.\n *\n * #### Notes\n * The server will select the name of the copied file.\n *\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async copy(fromFile, toDir) {\n const settings = this.serverSettings;\n const url = this._getUrl(toDir);\n const init = {\n method: 'POST',\n body: JSON.stringify({ copy_from: fromFile })\n };\n const response = await __1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 201) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateContentsModel(data);\n this._fileChanged.emit({\n type: 'new',\n oldValue: null,\n newValue: data\n });\n return data;\n }\n /**\n * Create a checkpoint for a file.\n *\n * @param localPath - The path of the file.\n *\n * @returns A promise which resolves with the new checkpoint model when the\n * checkpoint is created.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async createCheckpoint(localPath) {\n const url = this._getUrl(localPath, 'checkpoints');\n const init = { method: 'POST' };\n const response = await __1.ServerConnection.makeRequest(url, init, this.serverSettings);\n if (response.status !== 201) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n validate.validateCheckpointModel(data);\n return data;\n }\n /**\n * List available checkpoints for a file.\n *\n * @param localPath - The path of the file.\n *\n * @returns A promise which resolves with a list of checkpoint models for\n * the file.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents) and validates the response model.\n */\n async listCheckpoints(localPath) {\n const url = this._getUrl(localPath, 'checkpoints');\n const response = await __1.ServerConnection.makeRequest(url, {}, this.serverSettings);\n if (response.status !== 200) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n if (!Array.isArray(data)) {\n throw new Error('Invalid Checkpoint list');\n }\n for (let i = 0; i < data.length; i++) {\n validate.validateCheckpointModel(data[i]);\n }\n return data;\n }\n /**\n * Restore a file to a known checkpoint state.\n *\n * @param localPath - The path of the file.\n *\n * @param checkpointID - The id of the checkpoint to restore.\n *\n * @returns A promise which resolves when the checkpoint is restored.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents).\n */\n async restoreCheckpoint(localPath, checkpointID) {\n const url = this._getUrl(localPath, 'checkpoints', checkpointID);\n const init = { method: 'POST' };\n const response = await __1.ServerConnection.makeRequest(url, init, this.serverSettings);\n if (response.status !== 204) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n }\n /**\n * Delete a checkpoint for a file.\n *\n * @param localPath - The path of the file.\n *\n * @param checkpointID - The id of the checkpoint to delete.\n *\n * @returns A promise which resolves when the checkpoint is deleted.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/contents).\n */\n async deleteCheckpoint(localPath, checkpointID) {\n const url = this._getUrl(localPath, 'checkpoints', checkpointID);\n const init = { method: 'DELETE' };\n const response = await __1.ServerConnection.makeRequest(url, init, this.serverSettings);\n if (response.status !== 204) {\n const err = await __1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n }\n /**\n * Get a REST url for a file given a path.\n */\n _getUrl(...args) {\n const parts = args.map(path => coreutils_1.URLExt.encodeParts(path));\n const baseUrl = this.serverSettings.baseUrl;\n return coreutils_1.URLExt.join(baseUrl, this._apiEndpoint, ...parts);\n }\n}\nexports.Drive = Drive;\n/**\n * A namespace for module private data.\n */\nvar Private;\n(function (Private) {\n /**\n * Normalize a file extension to be of the type `'.foo'`.\n *\n * Adds a leading dot if not present and converts to lower case.\n */\n function normalizeExtension(extension) {\n if (extension.length > 0 && extension.indexOf('.') !== 0) {\n extension = `.${extension}`;\n }\n return extension;\n }\n Private.normalizeExtension = normalizeExtension;\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateCheckpointModel = exports.validateContentsModel = void 0;\nconst validate_1 = require(\"../validate\");\n/**\n * Validate an `Contents.IModel` object.\n */\nfunction validateContentsModel(model) {\n (0, validate_1.validateProperty)(model, 'name', 'string');\n (0, validate_1.validateProperty)(model, 'path', 'string');\n (0, validate_1.validateProperty)(model, 'type', 'string');\n (0, validate_1.validateProperty)(model, 'created', 'string');\n (0, validate_1.validateProperty)(model, 'last_modified', 'string');\n (0, validate_1.validateProperty)(model, 'mimetype', 'object');\n (0, validate_1.validateProperty)(model, 'content', 'object');\n (0, validate_1.validateProperty)(model, 'format', 'object');\n}\nexports.validateContentsModel = validateContentsModel;\n/**\n * Validate an `Contents.ICheckpointModel` object.\n */\nfunction validateCheckpointModel(model) {\n (0, validate_1.validateProperty)(model, 'id', 'string');\n (0, validate_1.validateProperty)(model, 'last_modified', 'string');\n}\nexports.validateCheckpointModel = validateCheckpointModel;\n//# sourceMappingURL=validate.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EventManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst serverconnection_1 = require(\"../serverconnection\");\n/**\n * The url for the jupyter-server events service.\n */\nconst SERVICE_EVENTS_URL = 'api/events';\n/**\n * The events API service manager.\n */\nclass EventManager {\n /**\n * Create a new event manager.\n */\n constructor(options = {}) {\n var _a;\n this._socket = null;\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n // If subscription fails, the poll attempts to reconnect and backs off.\n this._poll = new polling_1.Poll({ factory: () => this._subscribe() });\n this._stream = new signaling_1.Stream(this);\n // Subscribe to the events socket.\n void this._poll.start();\n }\n /**\n * Whether the event manager is disposed.\n */\n get isDisposed() {\n return this._poll.isDisposed;\n }\n /**\n * An event stream that emits and yields each new event.\n */\n get stream() {\n return this._stream;\n }\n /**\n * Dispose the event manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n // Clean up poll.\n this._poll.dispose();\n // Clean up socket.\n const socket = this._socket;\n if (socket) {\n this._socket = null;\n socket.onopen = () => undefined;\n socket.onerror = () => undefined;\n socket.onmessage = () => undefined;\n socket.onclose = () => undefined;\n socket.close();\n }\n // Clean up stream.\n signaling_1.Signal.clearData(this);\n this._stream.stop();\n }\n /**\n * Post an event request to be emitted by the event bus.\n */\n async emit(event) {\n const { serverSettings } = this;\n const { baseUrl, token } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const url = coreutils_1.URLExt.join(baseUrl, SERVICE_EVENTS_URL) +\n (token ? `?token=${token}` : '');\n const init = { body: JSON.stringify(event), method: 'POST' };\n const response = await makeRequest(url, init, serverSettings);\n if (response.status !== 204) {\n throw new ResponseError(response);\n }\n }\n /**\n * Subscribe to event bus emissions.\n */\n _subscribe() {\n return new Promise((_, reject) => {\n if (this.isDisposed) {\n return;\n }\n const { token, WebSocket, wsUrl } = this.serverSettings;\n const url = coreutils_1.URLExt.join(wsUrl, SERVICE_EVENTS_URL, 'subscribe') +\n (token ? `?token=${encodeURIComponent(token)}` : '');\n const socket = (this._socket = new WebSocket(url));\n const stream = this._stream;\n socket.onclose = () => reject(new Error('EventManager socket closed'));\n socket.onmessage = msg => msg.data && stream.emit(JSON.parse(msg.data));\n });\n }\n}\nexports.EventManager = EventManager;\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/**\n * @packageDocumentation\n * @module services\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./basemanager\"), exports);\n__exportStar(require(\"./config\"), exports);\n__exportStar(require(\"./contents\"), exports);\n__exportStar(require(\"./event\"), exports);\n__exportStar(require(\"./kernel\"), exports);\n__exportStar(require(\"./kernelspec\"), exports);\n__exportStar(require(\"./manager\"), exports);\n__exportStar(require(\"./serverconnection\"), exports);\n__exportStar(require(\"./session\"), exports);\n__exportStar(require(\"./setting\"), exports);\n__exportStar(require(\"./terminal\"), exports);\n__exportStar(require(\"./user\"), exports);\n__exportStar(require(\"./workspace\"), exports);\n__exportStar(require(\"./nbconvert\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CommHandler = void 0;\nconst disposable_1 = require(\"@lumino/disposable\");\nconst KernelMessage = __importStar(require(\"./messages\"));\n/**\n * Comm channel handler.\n */\nclass CommHandler extends disposable_1.DisposableDelegate {\n /**\n * Construct a new comm channel.\n */\n constructor(target, id, kernel, disposeCb) {\n super(disposeCb);\n this._target = '';\n this._id = '';\n this._id = id;\n this._target = target;\n this._kernel = kernel;\n }\n /**\n * The unique id for the comm channel.\n */\n get commId() {\n return this._id;\n }\n /**\n * The target name for the comm channel.\n */\n get targetName() {\n return this._target;\n }\n /**\n * Get the callback for a comm close event.\n *\n * #### Notes\n * This is called when the comm is closed from either the server or client.\n *\n * **See also:** [[ICommClose]], [[close]]\n */\n get onClose() {\n return this._onClose;\n }\n /**\n * Set the callback for a comm close event.\n *\n * #### Notes\n * This is called when the comm is closed from either the server or client. If\n * the function returns a promise, and the kernel was closed from the server,\n * kernel message processing will pause until the returned promise is\n * fulfilled.\n *\n * **See also:** [[close]]\n */\n set onClose(cb) {\n this._onClose = cb;\n }\n /**\n * Get the callback for a comm message received event.\n */\n get onMsg() {\n return this._onMsg;\n }\n /**\n * Set the callback for a comm message received event.\n *\n * #### Notes\n * This is called when a comm message is received. If the function returns a\n * promise, kernel message processing will pause until it is fulfilled.\n */\n set onMsg(cb) {\n this._onMsg = cb;\n }\n /**\n * Open a comm with optional data and metadata.\n *\n * #### Notes\n * This sends a `comm_open` message to the server.\n *\n * **See also:** [[ICommOpen]]\n */\n open(data, metadata, buffers = []) {\n if (this.isDisposed || this._kernel.isDisposed) {\n throw new Error('Cannot open');\n }\n const msg = KernelMessage.createMessage({\n msgType: 'comm_open',\n channel: 'shell',\n username: this._kernel.username,\n session: this._kernel.clientId,\n content: {\n comm_id: this._id,\n target_name: this._target,\n data: data !== null && data !== void 0 ? data : {}\n },\n metadata,\n buffers\n });\n return this._kernel.sendShellMessage(msg, false, true);\n }\n /**\n * Send a `comm_msg` message to the kernel.\n *\n * #### Notes\n * This is a no-op if the comm has been closed.\n *\n * **See also:** [[ICommMsg]]\n */\n send(data, metadata, buffers = [], disposeOnDone = true) {\n if (this.isDisposed || this._kernel.isDisposed) {\n throw new Error('Cannot send');\n }\n const msg = KernelMessage.createMessage({\n msgType: 'comm_msg',\n channel: 'shell',\n username: this._kernel.username,\n session: this._kernel.clientId,\n content: {\n comm_id: this._id,\n data: data\n },\n metadata,\n buffers\n });\n return this._kernel.sendShellMessage(msg, false, disposeOnDone);\n }\n /**\n * Close the comm.\n *\n * #### Notes\n * This will send a `comm_close` message to the kernel, and call the\n * `onClose` callback if set.\n *\n * This is a no-op if the comm is already closed.\n *\n * **See also:** [[ICommClose]], [[onClose]]\n */\n close(data, metadata, buffers = []) {\n if (this.isDisposed || this._kernel.isDisposed) {\n throw new Error('Cannot close');\n }\n const msg = KernelMessage.createMessage({\n msgType: 'comm_close',\n channel: 'shell',\n username: this._kernel.username,\n session: this._kernel.clientId,\n content: {\n comm_id: this._id,\n data: data !== null && data !== void 0 ? data : {}\n },\n metadata,\n buffers\n });\n const future = this._kernel.sendShellMessage(msg, false, true);\n const onClose = this._onClose;\n if (onClose) {\n const ioMsg = KernelMessage.createMessage({\n msgType: 'comm_close',\n channel: 'iopub',\n username: this._kernel.username,\n session: this._kernel.clientId,\n content: {\n comm_id: this._id,\n data: data !== null && data !== void 0 ? data : {}\n },\n metadata,\n buffers\n });\n // In the future, we may want to communicate back to the user the possible\n // promise returned from onClose.\n void onClose(ioMsg);\n }\n this.dispose();\n return future;\n }\n}\nexports.CommHandler = CommHandler;\n//# sourceMappingURL=comm.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelConnection = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst coreutils_2 = require(\"@lumino/coreutils\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst comm_1 = require(\"./comm\");\nconst KernelMessage = __importStar(require(\"./messages\"));\nconst future_1 = require(\"./future\");\nconst serialize_1 = require(\"./serialize\");\nconst validate = __importStar(require(\"./validate\"));\nconst kernelspec_1 = require(\"../kernelspec\");\nconst restapi = __importStar(require(\"./restapi\"));\nconst KERNEL_INFO_TIMEOUT = 3000;\nconst RESTARTING_KERNEL_SESSION = '_RESTARTING_';\nconst STARTING_KERNEL_SESSION = '';\n/**\n * Implementation of the Kernel object.\n *\n * #### Notes\n * Messages from the server are handled in the order they were received and\n * asynchronously. Any message handler can return a promise, and message\n * handling will pause until the promise is fulfilled.\n */\nclass KernelConnection {\n /**\n * Construct a kernel object.\n */\n constructor(options) {\n var _a, _b, _c, _d;\n /**\n * Create the kernel websocket connection and add socket status handlers.\n */\n this._createSocket = (useProtocols = true) => {\n this._errorIfDisposed();\n // Make sure the socket is clear\n this._clearSocket();\n // Update the connection status to reflect opening a new connection.\n this._updateConnectionStatus('connecting');\n const settings = this.serverSettings;\n const partialUrl = coreutils_1.URLExt.join(settings.wsUrl, restapi.KERNEL_SERVICE_URL, encodeURIComponent(this._id));\n // Strip any authentication from the display string.\n const display = partialUrl.replace(/^((?:\\w+:)?\\/\\/)(?:[^@\\/]+@)/, '$1');\n console.debug(`Starting WebSocket: ${display}`);\n let url = coreutils_1.URLExt.join(partialUrl, 'channels?session_id=' + encodeURIComponent(this._clientId));\n // If token authentication is in use.\n const token = settings.token;\n if (settings.appendToken && token !== '') {\n url = url + `&token=${encodeURIComponent(token)}`;\n }\n // Try opening the websocket with our list of subprotocols.\n // If the server doesn't handle subprotocols,\n // the accepted protocol will be ''.\n // But we cannot send '' as a subprotocol, so if connection fails,\n // reconnect without subprotocols.\n const supportedProtocols = useProtocols ? this._supportedProtocols : [];\n this._ws = new settings.WebSocket(url, supportedProtocols);\n // Ensure incoming binary messages are not Blobs\n this._ws.binaryType = 'arraybuffer';\n let alreadyCalledOnclose = false;\n const getKernelModel = async (evt) => {\n var _a, _b;\n if (this._isDisposed) {\n return;\n }\n this._reason = '';\n this._model = undefined;\n try {\n const model = await restapi.getKernelModel(this._id, settings);\n this._model = model;\n if ((model === null || model === void 0 ? void 0 : model.execution_state) === 'dead') {\n this._updateStatus('dead');\n }\n else {\n this._onWSClose(evt);\n }\n }\n catch (err) {\n // Try again, if there is a network failure\n // Handle network errors, as well as cases where we are on a\n // JupyterHub and the server is not running. JupyterHub returns a\n // 503 (<2.0) or 424 (>2.0) in that case.\n if (err instanceof __1.ServerConnection.NetworkError ||\n ((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) === 503 ||\n ((_b = err.response) === null || _b === void 0 ? void 0 : _b.status) === 424) {\n const timeout = Private.getRandomIntInclusive(10, 30) * 1e3;\n setTimeout(getKernelModel, timeout, evt);\n }\n else {\n this._reason = 'Kernel died unexpectedly';\n this._updateStatus('dead');\n }\n }\n return;\n };\n const earlyClose = async (evt) => {\n // If the websocket was closed early, that could mean\n // that the kernel is actually dead. Try getting\n // information about the kernel from the API call,\n // if that fails, then assume the kernel is dead,\n // otherwise just follow the typical websocket closed\n // protocol.\n if (alreadyCalledOnclose) {\n return;\n }\n alreadyCalledOnclose = true;\n await getKernelModel(evt);\n return;\n };\n this._ws.onmessage = this._onWSMessage;\n this._ws.onopen = this._onWSOpen;\n this._ws.onclose = earlyClose;\n this._ws.onerror = earlyClose;\n };\n // Make websocket callbacks arrow functions so they bind `this`.\n /**\n * Handle a websocket open event.\n */\n this._onWSOpen = (evt) => {\n if (this._ws.protocol !== '' &&\n !this._supportedProtocols.includes(this._ws.protocol)) {\n console.log('Server selected unknown kernel wire protocol:', this._ws.protocol);\n this._updateStatus('dead');\n throw new Error(`Unknown kernel wire protocol: ${this._ws.protocol}`);\n }\n // Remember the kernel wire protocol selected by the server.\n this._selectedProtocol = this._ws.protocol;\n this._ws.onclose = this._onWSClose;\n this._ws.onerror = this._onWSClose;\n this._updateConnectionStatus('connected');\n };\n /**\n * Handle a websocket message, validating and routing appropriately.\n */\n this._onWSMessage = (evt) => {\n // Notify immediately if there is an error with the message.\n let msg;\n try {\n msg = (0, serialize_1.deserialize)(evt.data, this._ws.protocol);\n validate.validateMessage(msg);\n }\n catch (error) {\n error.message = `Kernel message validation error: ${error.message}`;\n // We throw the error so that it bubbles up to the top, and displays the right stack.\n throw error;\n }\n // Update the current kernel session id\n this._kernelSession = msg.header.session;\n // Handle the message asynchronously, in the order received.\n this._msgChain = this._msgChain\n .then(() => {\n // Return so that any promises from handling a message are fulfilled\n // before proceeding to the next message.\n return this._handleMessage(msg);\n })\n .catch(error => {\n // Log any errors in handling the message, thus resetting the _msgChain\n // promise so we can process more messages.\n // Ignore the \"Canceled\" errors that are thrown during kernel dispose.\n if (error.message.startsWith('Canceled future for ')) {\n console.error(error);\n }\n });\n // Emit the message receive signal\n this._anyMessage.emit({ msg, direction: 'recv' });\n };\n /**\n * Handle a websocket close event.\n */\n this._onWSClose = (evt) => {\n if (!this.isDisposed) {\n this._reconnect();\n }\n };\n this._id = '';\n this._name = '';\n this._status = 'unknown';\n this._connectionStatus = 'connecting';\n this._kernelSession = '';\n this._isDisposed = false;\n /**\n * Websocket to communicate with kernel.\n */\n this._ws = null;\n this._username = '';\n this._reconnectLimit = 7;\n this._reconnectAttempt = 0;\n this._reconnectTimeout = null;\n this._supportedProtocols = Object.values(KernelMessage.supportedKernelWebSocketProtocols);\n this._selectedProtocol = '';\n this._futures = new Map();\n this._comms = new Map();\n this._targetRegistry = Object.create(null);\n this._info = new coreutils_2.PromiseDelegate();\n this._pendingMessages = [];\n this._statusChanged = new signaling_1.Signal(this);\n this._connectionStatusChanged = new signaling_1.Signal(this);\n this._disposed = new signaling_1.Signal(this);\n this._iopubMessage = new signaling_1.Signal(this);\n this._anyMessage = new signaling_1.Signal(this);\n this._pendingInput = new signaling_1.Signal(this);\n this._unhandledMessage = new signaling_1.Signal(this);\n this._displayIdToParentIds = new Map();\n this._msgIdToDisplayIds = new Map();\n this._msgChain = Promise.resolve();\n this._hasPendingInput = false;\n this._reason = '';\n this._noOp = () => {\n /* no-op */\n };\n this._name = options.model.name;\n this._id = options.model.id;\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : __1.ServerConnection.makeSettings();\n this._clientId = (_b = options.clientId) !== null && _b !== void 0 ? _b : coreutils_2.UUID.uuid4();\n this._username = (_c = options.username) !== null && _c !== void 0 ? _c : '';\n this.handleComms = (_d = options.handleComms) !== null && _d !== void 0 ? _d : true;\n this._createSocket();\n }\n get disposed() {\n return this._disposed;\n }\n /**\n * A signal emitted when the kernel status changes.\n */\n get statusChanged() {\n return this._statusChanged;\n }\n /**\n * A signal emitted when the kernel status changes.\n */\n get connectionStatusChanged() {\n return this._connectionStatusChanged;\n }\n /**\n * A signal emitted for iopub kernel messages.\n *\n * #### Notes\n * This signal is emitted after the iopub message is handled asynchronously.\n */\n get iopubMessage() {\n return this._iopubMessage;\n }\n /**\n * A signal emitted for unhandled kernel message.\n *\n * #### Notes\n * This signal is emitted for a message that was not handled. It is emitted\n * during the asynchronous message handling code.\n */\n get unhandledMessage() {\n return this._unhandledMessage;\n }\n /**\n * The kernel model\n */\n get model() {\n return (this._model || {\n id: this.id,\n name: this.name,\n reason: this._reason\n });\n }\n /**\n * A signal emitted for any kernel message.\n *\n * #### Notes\n * This signal is emitted when a message is received, before it is handled\n * asynchronously.\n *\n * This message is emitted when a message is queued for sending (either in\n * the websocket buffer, or our own pending message buffer). The message may\n * actually be sent across the wire at a later time.\n *\n * The message emitted in this signal should not be modified in any way.\n */\n get anyMessage() {\n return this._anyMessage;\n }\n /**\n * A signal emitted when a kernel has pending inputs from the user.\n */\n get pendingInput() {\n return this._pendingInput;\n }\n /**\n * The id of the server-side kernel.\n */\n get id() {\n return this._id;\n }\n /**\n * The name of the server-side kernel.\n */\n get name() {\n return this._name;\n }\n /**\n * The client username.\n */\n get username() {\n return this._username;\n }\n /**\n * The client unique id.\n */\n get clientId() {\n return this._clientId;\n }\n /**\n * The current status of the kernel.\n */\n get status() {\n return this._status;\n }\n /**\n * The current connection status of the kernel connection.\n */\n get connectionStatus() {\n return this._connectionStatus;\n }\n /**\n * Test whether the kernel has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * The cached kernel info.\n *\n * @returns A promise that resolves to the kernel info.\n */\n get info() {\n return this._info.promise;\n }\n /**\n * The kernel spec.\n *\n * @returns A promise that resolves to the kernel spec.\n */\n get spec() {\n if (this._specPromise) {\n return this._specPromise;\n }\n this._specPromise = kernelspec_1.KernelSpecAPI.getSpecs(this.serverSettings).then(specs => {\n return specs.kernelspecs[this._name];\n });\n return this._specPromise;\n }\n /**\n * Clone the current kernel with a new clientId.\n */\n clone(options = {}) {\n return new KernelConnection({\n model: this.model,\n username: this.username,\n serverSettings: this.serverSettings,\n // handleComms defaults to false since that is safer\n handleComms: false,\n ...options\n });\n }\n /**\n * Dispose of the resources held by the kernel.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._disposed.emit();\n this._updateConnectionStatus('disconnected');\n this._clearKernelState();\n this._pendingMessages = [];\n this._clearSocket();\n // Clear Lumino signals\n signaling_1.Signal.clearData(this);\n }\n /**\n * Send a shell message to the kernel.\n *\n * #### Notes\n * Send a message to the kernel's shell channel, yielding a future object\n * for accepting replies.\n *\n * If `expectReply` is given and `true`, the future is disposed when both a\n * shell reply and an idle status message are received. If `expectReply`\n * is not given or is `false`, the future is resolved when an idle status\n * message is received.\n * If `disposeOnDone` is not given or is `true`, the Future is disposed at this point.\n * If `disposeOnDone` is given and `false`, it is up to the caller to dispose of the Future.\n *\n * All replies are validated as valid kernel messages.\n *\n * If the kernel status is `dead`, this will throw an error.\n */\n sendShellMessage(msg, expectReply = false, disposeOnDone = true) {\n return this._sendKernelShellControl(future_1.KernelShellFutureHandler, msg, expectReply, disposeOnDone);\n }\n /**\n * Send a control message to the kernel.\n *\n * #### Notes\n * Send a message to the kernel's control channel, yielding a future object\n * for accepting replies.\n *\n * If `expectReply` is given and `true`, the future is disposed when both a\n * control reply and an idle status message are received. If `expectReply`\n * is not given or is `false`, the future is resolved when an idle status\n * message is received.\n * If `disposeOnDone` is not given or is `true`, the Future is disposed at this point.\n * If `disposeOnDone` is given and `false`, it is up to the caller to dispose of the Future.\n *\n * All replies are validated as valid kernel messages.\n *\n * If the kernel status is `dead`, this will throw an error.\n */\n sendControlMessage(msg, expectReply = false, disposeOnDone = true) {\n return this._sendKernelShellControl(future_1.KernelControlFutureHandler, msg, expectReply, disposeOnDone);\n }\n _sendKernelShellControl(ctor, msg, expectReply = false, disposeOnDone = true) {\n this._sendMessage(msg);\n this._anyMessage.emit({ msg, direction: 'send' });\n const future = new ctor(() => {\n const msgId = msg.header.msg_id;\n this._futures.delete(msgId);\n // Remove stored display id information.\n const displayIds = this._msgIdToDisplayIds.get(msgId);\n if (!displayIds) {\n return;\n }\n displayIds.forEach(displayId => {\n const msgIds = this._displayIdToParentIds.get(displayId);\n if (msgIds) {\n const idx = msgIds.indexOf(msgId);\n if (idx === -1) {\n return;\n }\n if (msgIds.length === 1) {\n this._displayIdToParentIds.delete(displayId);\n }\n else {\n msgIds.splice(idx, 1);\n this._displayIdToParentIds.set(displayId, msgIds);\n }\n }\n });\n this._msgIdToDisplayIds.delete(msgId);\n }, msg, expectReply, disposeOnDone, this);\n this._futures.set(msg.header.msg_id, future);\n return future;\n }\n /**\n * Send a message on the websocket.\n *\n * If queue is true, queue the message for later sending if we cannot send\n * now. Otherwise throw an error.\n *\n * #### Notes\n * As an exception to the queueing, if we are sending a kernel_info_request\n * message while we think the kernel is restarting, we send the message\n * immediately without queueing. This is so that we can trigger a message\n * back, which will then clear the kernel restarting state.\n */\n _sendMessage(msg, queue = true) {\n if (this.status === 'dead') {\n throw new Error('Kernel is dead');\n }\n // If we have a kernel_info_request and we are starting or restarting, send the\n // kernel_info_request immediately if we can, and if not throw an error so\n // we can retry later. On restarting we do this because we must get at least one message\n // from the kernel to reset the kernel session (thus clearing the restart\n // status sentinel).\n if ((this._kernelSession === STARTING_KERNEL_SESSION ||\n this._kernelSession === RESTARTING_KERNEL_SESSION) &&\n KernelMessage.isInfoRequestMsg(msg)) {\n if (this.connectionStatus === 'connected') {\n this._ws.send((0, serialize_1.serialize)(msg, this._ws.protocol));\n return;\n }\n else {\n throw new Error('Could not send message: status is not connected');\n }\n }\n // If there are pending messages, add to the queue so we keep messages in order\n if (queue && this._pendingMessages.length > 0) {\n this._pendingMessages.push(msg);\n return;\n }\n // Send if the ws allows it, otherwise queue the message.\n if (this.connectionStatus === 'connected' &&\n this._kernelSession !== RESTARTING_KERNEL_SESSION) {\n this._ws.send((0, serialize_1.serialize)(msg, this._ws.protocol));\n }\n else if (queue) {\n this._pendingMessages.push(msg);\n }\n else {\n throw new Error('Could not send message');\n }\n }\n /**\n * Interrupt a kernel.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels).\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n *\n * It is assumed that the API call does not mutate the kernel id or name.\n *\n * The promise will be rejected if the kernel status is `Dead` or if the\n * request fails or the response is invalid.\n */\n async interrupt() {\n this.hasPendingInput = false;\n if (this.status === 'dead') {\n throw new Error('Kernel is dead');\n }\n return restapi.interruptKernel(this.id, this.serverSettings);\n }\n /**\n * Request a kernel restart.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels)\n * and validates the response model.\n *\n * Any existing Future or Comm objects are cleared once the kernel has\n * actually be restarted.\n *\n * The promise is fulfilled on a valid server response (after the kernel restarts)\n * and rejected otherwise.\n *\n * It is assumed that the API call does not mutate the kernel id or name.\n *\n * The promise will be rejected if the request fails or the response is\n * invalid.\n */\n async restart() {\n if (this.status === 'dead') {\n throw new Error('Kernel is dead');\n }\n this._updateStatus('restarting');\n this._clearKernelState();\n this._kernelSession = RESTARTING_KERNEL_SESSION;\n await restapi.restartKernel(this.id, this.serverSettings);\n // Reconnect to the kernel to address cases where kernel ports\n // have changed during the restart.\n await this.reconnect();\n this.hasPendingInput = false;\n }\n /**\n * Reconnect to a kernel.\n *\n * #### Notes\n * This may try multiple times to reconnect to a kernel, and will sever any\n * existing connection.\n */\n reconnect() {\n this._errorIfDisposed();\n const result = new coreutils_2.PromiseDelegate();\n // Set up a listener for the connection status changing, which accepts or\n // rejects after the retries are done.\n const fulfill = (sender, status) => {\n if (status === 'connected') {\n result.resolve();\n this.connectionStatusChanged.disconnect(fulfill, this);\n }\n else if (status === 'disconnected') {\n result.reject(new Error('Kernel connection disconnected'));\n this.connectionStatusChanged.disconnect(fulfill, this);\n }\n };\n this.connectionStatusChanged.connect(fulfill, this);\n // Reset the reconnect limit so we start the connection attempts fresh\n this._reconnectAttempt = 0;\n // Start the reconnection process, which will also clear any existing\n // connection.\n this._reconnect();\n // Return the promise that should resolve on connection or reject if the\n // retries don't work.\n return result.promise;\n }\n /**\n * Shutdown a kernel.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels).\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n *\n * On a valid response, disposes this kernel connection.\n *\n * If the kernel is already `dead`, disposes this kernel connection without\n * a server request.\n */\n async shutdown() {\n if (this.status !== 'dead') {\n await restapi.shutdownKernel(this.id, this.serverSettings);\n }\n this.handleShutdown();\n }\n /**\n * Handles a kernel shutdown.\n *\n * #### Notes\n * This method should be called if we know from outside information that a\n * kernel is dead (for example, we cannot find the kernel model on the\n * server).\n */\n handleShutdown() {\n this._updateStatus('dead');\n this.dispose();\n }\n /**\n * Send a `kernel_info_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#kernel-info).\n *\n * Fulfills with the `kernel_info_response` content when the shell reply is\n * received and validated.\n */\n async requestKernelInfo() {\n const msg = KernelMessage.createMessage({\n msgType: 'kernel_info_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content: {}\n });\n let reply;\n try {\n reply = (await Private.handleShellMessage(this, msg));\n }\n catch (e) {\n // If we rejected because the future was disposed, ignore and return.\n if (this.isDisposed) {\n return;\n }\n else {\n throw e;\n }\n }\n this._errorIfDisposed();\n if (!reply) {\n return;\n }\n // Kernels sometimes do not include a status field on kernel_info_reply\n // messages, so set a default for now.\n // See https://github.com/jupyterlab/jupyterlab/issues/6760\n if (reply.content.status === undefined) {\n reply.content.status = 'ok';\n }\n if (reply.content.status !== 'ok') {\n this._info.reject('Kernel info reply errored');\n return reply;\n }\n this._info.resolve(reply.content);\n this._kernelSession = reply.header.session;\n return reply;\n }\n /**\n * Send a `complete_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#completion).\n *\n * Fulfills with the `complete_reply` content when the shell reply is\n * received and validated.\n */\n requestComplete(content) {\n const msg = KernelMessage.createMessage({\n msgType: 'complete_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content\n });\n return Private.handleShellMessage(this, msg);\n }\n /**\n * Send an `inspect_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#introspection).\n *\n * Fulfills with the `inspect_reply` content when the shell reply is\n * received and validated.\n */\n requestInspect(content) {\n const msg = KernelMessage.createMessage({\n msgType: 'inspect_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content: content\n });\n return Private.handleShellMessage(this, msg);\n }\n /**\n * Send a `history_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#history).\n *\n * Fulfills with the `history_reply` content when the shell reply is\n * received and validated.\n */\n requestHistory(content) {\n const msg = KernelMessage.createMessage({\n msgType: 'history_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content\n });\n return Private.handleShellMessage(this, msg);\n }\n /**\n * Send an `execute_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#execute).\n *\n * Future `onReply` is called with the `execute_reply` content when the\n * shell reply is received and validated. The future will resolve when\n * this message is received and the `idle` iopub status is received.\n * The future will also be disposed at this point unless `disposeOnDone`\n * is specified and `false`, in which case it is up to the caller to dispose\n * of the future.\n *\n * **See also:** [[IExecuteReply]]\n */\n requestExecute(content, disposeOnDone = true, metadata) {\n const defaults = {\n silent: false,\n store_history: true,\n user_expressions: {},\n allow_stdin: true,\n stop_on_error: false\n };\n const msg = KernelMessage.createMessage({\n msgType: 'execute_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content: { ...defaults, ...content },\n metadata\n });\n return this.sendShellMessage(msg, true, disposeOnDone);\n }\n /**\n * Send an experimental `debug_request` message.\n *\n * @hidden\n *\n * #### Notes\n * Debug messages are experimental messages that are not in the official\n * kernel message specification. As such, this function is *NOT* considered\n * part of the public API, and may change without notice.\n */\n requestDebug(content, disposeOnDone = true) {\n const msg = KernelMessage.createMessage({\n msgType: 'debug_request',\n channel: 'control',\n username: this._username,\n session: this._clientId,\n content\n });\n return this.sendControlMessage(msg, true, disposeOnDone);\n }\n /**\n * Send an `is_complete_request` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#code-completeness).\n *\n * Fulfills with the `is_complete_response` content when the shell reply is\n * received and validated.\n */\n requestIsComplete(content) {\n const msg = KernelMessage.createMessage({\n msgType: 'is_complete_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content\n });\n return Private.handleShellMessage(this, msg);\n }\n /**\n * Send a `comm_info_request` message.\n *\n * #### Notes\n * Fulfills with the `comm_info_reply` content when the shell reply is\n * received and validated.\n */\n requestCommInfo(content) {\n const msg = KernelMessage.createMessage({\n msgType: 'comm_info_request',\n channel: 'shell',\n username: this._username,\n session: this._clientId,\n content\n });\n return Private.handleShellMessage(this, msg);\n }\n /**\n * Send an `input_reply` message.\n *\n * #### Notes\n * See [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html#messages-on-the-stdin-router-dealer-sockets).\n */\n sendInputReply(content, parent_header) {\n const msg = KernelMessage.createMessage({\n msgType: 'input_reply',\n channel: 'stdin',\n username: this._username,\n session: this._clientId,\n content\n });\n msg.parent_header = parent_header;\n this._sendMessage(msg);\n this._anyMessage.emit({ msg, direction: 'send' });\n this.hasPendingInput = false;\n }\n /**\n * Create a new comm.\n *\n * #### Notes\n * If a client-side comm already exists with the given commId, an error is thrown.\n * If the kernel does not handle comms, an error is thrown.\n */\n createComm(targetName, commId = coreutils_2.UUID.uuid4()) {\n if (!this.handleComms) {\n throw new Error('Comms are disabled on this kernel connection');\n }\n if (this._comms.has(commId)) {\n throw new Error('Comm is already created');\n }\n const comm = new comm_1.CommHandler(targetName, commId, this, () => {\n this._unregisterComm(commId);\n });\n this._comms.set(commId, comm);\n return comm;\n }\n /**\n * Check if a comm exists.\n */\n hasComm(commId) {\n return this._comms.has(commId);\n }\n /**\n * Register a comm target handler.\n *\n * @param targetName - The name of the comm target.\n *\n * @param callback - The callback invoked for a comm open message.\n *\n * @returns A disposable used to unregister the comm target.\n *\n * #### Notes\n * Only one comm target can be registered to a target name at a time, an\n * existing callback for the same target name will be overridden. A registered\n * comm target handler will take precedence over a comm which specifies a\n * `target_module`.\n *\n * If the callback returns a promise, kernel message processing will pause\n * until the returned promise is fulfilled.\n */\n registerCommTarget(targetName, callback) {\n if (!this.handleComms) {\n return;\n }\n this._targetRegistry[targetName] = callback;\n }\n /**\n * Remove a comm target handler.\n *\n * @param targetName - The name of the comm target to remove.\n *\n * @param callback - The callback to remove.\n *\n * #### Notes\n * The comm target is only removed if the callback argument matches.\n */\n removeCommTarget(targetName, callback) {\n if (!this.handleComms) {\n return;\n }\n if (!this.isDisposed && this._targetRegistry[targetName] === callback) {\n delete this._targetRegistry[targetName];\n }\n }\n /**\n * Register an IOPub message hook.\n *\n * @param msg_id - The parent_header message id the hook will intercept.\n *\n * @param hook - The callback invoked for the message.\n *\n * #### Notes\n * The IOPub hook system allows you to preempt the handlers for IOPub\n * messages that are responses to a given message id.\n *\n * The most recently registered hook is run first. A hook can return a\n * boolean or a promise to a boolean, in which case all kernel message\n * processing pauses until the promise is fulfilled. If a hook return value\n * resolves to false, any later hooks will not run and the function will\n * return a promise resolving to false. If a hook throws an error, the error\n * is logged to the console and the next hook is run. If a hook is\n * registered during the hook processing, it will not run until the next\n * message. If a hook is removed during the hook processing, it will be\n * deactivated immediately.\n *\n * See also [[IFuture.registerMessageHook]].\n */\n registerMessageHook(msgId, hook) {\n var _a;\n const future = (_a = this._futures) === null || _a === void 0 ? void 0 : _a.get(msgId);\n if (future) {\n future.registerMessageHook(hook);\n }\n }\n /**\n * Remove an IOPub message hook.\n *\n * @param msg_id - The parent_header message id the hook intercepted.\n *\n * @param hook - The callback invoked for the message.\n *\n */\n removeMessageHook(msgId, hook) {\n var _a;\n const future = (_a = this._futures) === null || _a === void 0 ? void 0 : _a.get(msgId);\n if (future) {\n future.removeMessageHook(hook);\n }\n }\n /**\n * Remove the input guard, if any.\n */\n removeInputGuard() {\n this.hasPendingInput = false;\n }\n /**\n * Handle a message with a display id.\n *\n * @returns Whether the message was handled.\n */\n async _handleDisplayId(displayId, msg) {\n var _a, _b;\n const msgId = msg.parent_header.msg_id;\n let parentIds = this._displayIdToParentIds.get(displayId);\n if (parentIds) {\n // We've seen it before, update existing outputs with same display_id\n // by handling display_data as update_display_data.\n const updateMsg = {\n header: coreutils_2.JSONExt.deepCopy(msg.header),\n parent_header: coreutils_2.JSONExt.deepCopy(msg.parent_header),\n metadata: coreutils_2.JSONExt.deepCopy(msg.metadata),\n content: coreutils_2.JSONExt.deepCopy(msg.content),\n channel: msg.channel,\n buffers: msg.buffers ? msg.buffers.slice() : []\n };\n updateMsg.header.msg_type = 'update_display_data';\n await Promise.all(parentIds.map(async (parentId) => {\n const future = this._futures && this._futures.get(parentId);\n if (future) {\n await future.handleMsg(updateMsg);\n }\n }));\n }\n // We're done here if it's update_display.\n if (msg.header.msg_type === 'update_display_data') {\n // It's an update, don't proceed to the normal display.\n return true;\n }\n // Regular display_data with id, record it for future updating\n // in _displayIdToParentIds for future lookup.\n parentIds = (_a = this._displayIdToParentIds.get(displayId)) !== null && _a !== void 0 ? _a : [];\n if (parentIds.indexOf(msgId) === -1) {\n parentIds.push(msgId);\n }\n this._displayIdToParentIds.set(displayId, parentIds);\n // Add to our map of display ids for this message.\n const displayIds = (_b = this._msgIdToDisplayIds.get(msgId)) !== null && _b !== void 0 ? _b : [];\n if (displayIds.indexOf(msgId) === -1) {\n displayIds.push(msgId);\n }\n this._msgIdToDisplayIds.set(msgId, displayIds);\n // Let the message propagate to the intended recipient.\n return false;\n }\n /**\n * Forcefully clear the socket state.\n *\n * #### Notes\n * This will clear all socket state without calling any handlers and will\n * not update the connection status. If you call this method, you are\n * responsible for updating the connection status as needed and recreating\n * the socket if you plan to reconnect.\n */\n _clearSocket() {\n if (this._ws !== null) {\n // Clear the websocket event handlers and the socket itself.\n this._ws.onopen = this._noOp;\n this._ws.onclose = this._noOp;\n this._ws.onerror = this._noOp;\n this._ws.onmessage = this._noOp;\n this._ws.close();\n this._ws = null;\n }\n }\n /**\n * Handle status iopub messages from the kernel.\n */\n _updateStatus(status) {\n if (this._status === status || this._status === 'dead') {\n return;\n }\n this._status = status;\n Private.logKernelStatus(this);\n this._statusChanged.emit(status);\n if (status === 'dead') {\n this.dispose();\n }\n }\n /**\n * Send pending messages to the kernel.\n */\n _sendPending() {\n // We check to make sure we are still connected each time. For\n // example, if a websocket buffer overflows, it may close, so we should\n // stop sending messages.\n while (this.connectionStatus === 'connected' &&\n this._kernelSession !== RESTARTING_KERNEL_SESSION &&\n this._pendingMessages.length > 0) {\n this._sendMessage(this._pendingMessages[0], false);\n // We shift the message off the queue after the message is sent so that\n // if there is an exception, the message is still pending.\n this._pendingMessages.shift();\n }\n }\n /**\n * Clear the internal state.\n */\n _clearKernelState() {\n this._kernelSession = '';\n this._pendingMessages = [];\n this._futures.forEach(future => {\n future.dispose();\n });\n this._comms.forEach(comm => {\n comm.dispose();\n });\n this._msgChain = Promise.resolve();\n this._futures = new Map();\n this._comms = new Map();\n this._displayIdToParentIds.clear();\n this._msgIdToDisplayIds.clear();\n }\n /**\n * Check to make sure it is okay to proceed to handle a message.\n *\n * #### Notes\n * Because we handle messages asynchronously, before a message is handled the\n * kernel might be disposed or restarted (and have a different session id).\n * This function throws an error in each of these cases. This is meant to be\n * called at the start of an asynchronous message handler to cancel message\n * processing if the message no longer is valid.\n */\n _assertCurrentMessage(msg) {\n this._errorIfDisposed();\n if (msg.header.session !== this._kernelSession) {\n throw new Error(`Canceling handling of old message: ${msg.header.msg_type}`);\n }\n }\n /**\n * Handle a `comm_open` kernel message.\n */\n async _handleCommOpen(msg) {\n this._assertCurrentMessage(msg);\n const content = msg.content;\n const comm = new comm_1.CommHandler(content.target_name, content.comm_id, this, () => {\n this._unregisterComm(content.comm_id);\n });\n this._comms.set(content.comm_id, comm);\n try {\n const target = await Private.loadObject(content.target_name, content.target_module, this._targetRegistry);\n await target(comm, msg);\n }\n catch (e) {\n // Close the comm asynchronously. We cannot block message processing on\n // kernel messages to wait for another kernel message.\n comm.close();\n console.error('Exception opening new comm');\n throw e;\n }\n }\n /**\n * Handle 'comm_close' kernel message.\n */\n async _handleCommClose(msg) {\n this._assertCurrentMessage(msg);\n const content = msg.content;\n const comm = this._comms.get(content.comm_id);\n if (!comm) {\n console.error('Comm not found for comm id ' + content.comm_id);\n return;\n }\n this._unregisterComm(comm.commId);\n const onClose = comm.onClose;\n if (onClose) {\n // tslint:disable-next-line:await-promise\n await onClose(msg);\n }\n comm.dispose();\n }\n /**\n * Handle a 'comm_msg' kernel message.\n */\n async _handleCommMsg(msg) {\n this._assertCurrentMessage(msg);\n const content = msg.content;\n const comm = this._comms.get(content.comm_id);\n if (!comm) {\n return;\n }\n const onMsg = comm.onMsg;\n if (onMsg) {\n // tslint:disable-next-line:await-promise\n await onMsg(msg);\n }\n }\n /**\n * Unregister a comm instance.\n */\n _unregisterComm(commId) {\n this._comms.delete(commId);\n }\n /**\n * Handle connection status changes.\n */\n _updateConnectionStatus(connectionStatus) {\n if (this._connectionStatus === connectionStatus) {\n return;\n }\n this._connectionStatus = connectionStatus;\n // If we are not 'connecting', reset any reconnection attempts.\n if (connectionStatus !== 'connecting') {\n this._reconnectAttempt = 0;\n clearTimeout(this._reconnectTimeout);\n }\n if (this.status !== 'dead') {\n if (connectionStatus === 'connected') {\n let restarting = this._kernelSession === RESTARTING_KERNEL_SESSION;\n // Send a kernel info request to make sure we send at least one\n // message to get kernel status back. Always request kernel info\n // first, to get kernel status back and ensure iopub is fully\n // established. If we are restarting, this message will skip the queue\n // and be sent immediately.\n let p = this.requestKernelInfo();\n // Send any pending messages after the kernelInfo resolves, or after a\n // timeout as a failsafe.\n let sendPendingCalled = false;\n let sendPendingOnce = () => {\n if (sendPendingCalled) {\n return;\n }\n sendPendingCalled = true;\n if (restarting && this._kernelSession === RESTARTING_KERNEL_SESSION) {\n // We were restarting and a message didn't arrive to set the\n // session, but we just assume the restart succeeded and send any\n // pending messages.\n // FIXME: it would be better to retry the kernel_info_request here\n this._kernelSession = '';\n }\n clearTimeout(timeoutHandle);\n if (this._pendingMessages.length > 0) {\n this._sendPending();\n }\n };\n void p.then(sendPendingOnce);\n // FIXME: if sent while zmq subscriptions are not established,\n // kernelInfo may not resolve, so use a timeout to ensure we don't hang forever.\n // It may be preferable to retry kernelInfo rather than give up after one timeout.\n let timeoutHandle = setTimeout(sendPendingOnce, KERNEL_INFO_TIMEOUT);\n }\n else {\n // If the connection is down, then we do not know what is happening\n // with the kernel, so set the status to unknown.\n this._updateStatus('unknown');\n }\n }\n // Notify others that the connection status changed.\n this._connectionStatusChanged.emit(connectionStatus);\n }\n async _handleMessage(msg) {\n var _a, _b;\n let handled = false;\n // Check to see if we have a display_id we need to reroute.\n if (msg.parent_header &&\n msg.channel === 'iopub' &&\n (KernelMessage.isDisplayDataMsg(msg) ||\n KernelMessage.isUpdateDisplayDataMsg(msg) ||\n KernelMessage.isExecuteResultMsg(msg))) {\n // display_data messages may re-route based on their display_id.\n const transient = ((_a = msg.content.transient) !== null && _a !== void 0 ? _a : {});\n const displayId = transient['display_id'];\n if (displayId) {\n handled = await this._handleDisplayId(displayId, msg);\n // The await above may make this message out of date, so check again.\n this._assertCurrentMessage(msg);\n }\n }\n if (!handled && msg.parent_header) {\n const parentHeader = msg.parent_header;\n const future = (_b = this._futures) === null || _b === void 0 ? void 0 : _b.get(parentHeader.msg_id);\n if (future) {\n await future.handleMsg(msg);\n this._assertCurrentMessage(msg);\n }\n else {\n // If the message was sent by us and was not iopub, it is orphaned.\n const owned = parentHeader.session === this.clientId;\n if (msg.channel !== 'iopub' && owned) {\n this._unhandledMessage.emit(msg);\n }\n }\n }\n if (msg.channel === 'iopub') {\n switch (msg.header.msg_type) {\n case 'status': {\n // Updating the status is synchronous, and we call no async user code\n const executionState = msg.content\n .execution_state;\n if (executionState === 'restarting') {\n // The kernel has been auto-restarted by the server. After\n // processing for this message is completely done, we want to\n // handle this restart, so we don't await, but instead schedule\n // the work as a microtask (i.e., in a promise resolution). We\n // schedule this here so that it comes before any microtasks that\n // might be scheduled in the status signal emission below.\n void Promise.resolve().then(async () => {\n this._updateStatus('autorestarting');\n this._clearKernelState();\n // We must reconnect since the kernel connection information may have\n // changed, and the server only refreshes its zmq connection when a new\n // websocket is opened.\n await this.reconnect();\n });\n }\n this._updateStatus(executionState);\n break;\n }\n case 'comm_open':\n if (this.handleComms) {\n await this._handleCommOpen(msg);\n }\n break;\n case 'comm_msg':\n if (this.handleComms) {\n await this._handleCommMsg(msg);\n }\n break;\n case 'comm_close':\n if (this.handleComms) {\n await this._handleCommClose(msg);\n }\n break;\n default:\n break;\n }\n // If the message was a status dead message, we might have disposed ourselves.\n if (!this.isDisposed) {\n this._assertCurrentMessage(msg);\n // the message wouldn't be emitted if we were disposed anyway.\n this._iopubMessage.emit(msg);\n }\n }\n }\n /**\n * Attempt a connection if we have not exhausted connection attempts.\n */\n _reconnect() {\n this._errorIfDisposed();\n // Clear any existing reconnection attempt\n clearTimeout(this._reconnectTimeout);\n // Update the connection status and schedule a possible reconnection.\n if (this._reconnectAttempt < this._reconnectLimit) {\n this._updateConnectionStatus('connecting');\n // The first reconnect attempt should happen immediately, and subsequent\n // attempts should pick a random number in a growing range so that we\n // don't overload the server with synchronized reconnection attempts\n // across multiple kernels.\n const timeout = Private.getRandomIntInclusive(0, 1e3 * (Math.pow(2, this._reconnectAttempt) - 1));\n console.warn(`Connection lost, reconnecting in ${Math.floor(timeout / 1000)} seconds.`);\n // Try reconnection with subprotocols if the server had supported them.\n // Otherwise, try reconnection without subprotocols.\n const useProtocols = this._selectedProtocol !== '' ? true : false;\n this._reconnectTimeout = setTimeout(this._createSocket, timeout, useProtocols);\n this._reconnectAttempt += 1;\n }\n else {\n this._updateConnectionStatus('disconnected');\n }\n // Clear the websocket event handlers and the socket itself.\n this._clearSocket();\n }\n /**\n * Utility function to throw an error if this instance is disposed.\n */\n _errorIfDisposed() {\n if (this.isDisposed) {\n throw new Error('Kernel connection is disposed');\n }\n }\n get hasPendingInput() {\n return this._hasPendingInput;\n }\n set hasPendingInput(value) {\n this._hasPendingInput = value;\n this._pendingInput.emit(value);\n }\n}\nexports.KernelConnection = KernelConnection;\n/**\n * A private namespace for the Kernel.\n */\nvar Private;\n(function (Private) {\n /**\n * Log the current kernel status.\n */\n function logKernelStatus(kernel) {\n switch (kernel.status) {\n case 'idle':\n case 'busy':\n case 'unknown':\n return;\n default:\n console.debug(`Kernel: ${kernel.status} (${kernel.id})`);\n break;\n }\n }\n Private.logKernelStatus = logKernelStatus;\n /**\n * Send a kernel message to the kernel and resolve the reply message.\n */\n async function handleShellMessage(kernel, msg) {\n const future = kernel.sendShellMessage(msg, true);\n return future.done;\n }\n Private.handleShellMessage = handleShellMessage;\n /**\n * Try to load an object from a module or a registry.\n *\n * Try to load an object from a module asynchronously if a module\n * is specified, otherwise tries to load an object from the global\n * registry, if the global registry is provided.\n *\n * #### Notes\n * Loading a module uses requirejs.\n */\n function loadObject(name, moduleName, registry) {\n return new Promise((resolve, reject) => {\n // Try loading the module using require.js\n if (moduleName) {\n if (typeof requirejs === 'undefined') {\n throw new Error('requirejs not found');\n }\n requirejs([moduleName], (mod) => {\n if (mod[name] === void 0) {\n const msg = `Object '${name}' not found in module '${moduleName}'`;\n reject(new Error(msg));\n }\n else {\n resolve(mod[name]);\n }\n }, reject);\n }\n else {\n if (registry === null || registry === void 0 ? void 0 : registry[name]) {\n resolve(registry[name]);\n }\n else {\n reject(new Error(`Object '${name}' not found in registry`));\n }\n }\n });\n }\n Private.loadObject = loadObject;\n /**\n * Get a random integer between min and max, inclusive of both.\n *\n * #### Notes\n * From\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#Getting_a_random_integer_between_two_values_inclusive\n *\n * From the MDN page: It might be tempting to use Math.round() to accomplish\n * that, but doing so would cause your random numbers to follow a non-uniform\n * distribution, which may not be acceptable for your needs.\n */\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n Private.getRandomIntInclusive = getRandomIntInclusive;\n})(Private || (Private = {}));\n//# sourceMappingURL=default.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelShellFutureHandler = exports.KernelControlFutureHandler = exports.KernelFutureHandler = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\nconst disposable_1 = require(\"@lumino/disposable\");\nconst KernelMessage = __importStar(require(\"./messages\"));\n/**\n * Implementation of a kernel future.\n *\n * If a reply is expected, the Future is considered done when both a `reply`\n * message and an `idle` iopub status message have been received. Otherwise, it\n * is considered done when the `idle` status is received.\n *\n */\nclass KernelFutureHandler extends disposable_1.DisposableDelegate {\n /**\n * Construct a new KernelFutureHandler.\n */\n constructor(cb, msg, expectReply, disposeOnDone, kernel) {\n super(cb);\n this._status = 0;\n this._stdin = Private.noOp;\n this._iopub = Private.noOp;\n this._reply = Private.noOp;\n this._done = new coreutils_1.PromiseDelegate();\n this._hooks = new Private.HookList();\n this._disposeOnDone = true;\n this._msg = msg;\n if (!expectReply) {\n this._setFlag(Private.KernelFutureFlag.GotReply);\n }\n this._disposeOnDone = disposeOnDone;\n this._kernel = kernel;\n }\n /**\n * Get the original outgoing message.\n */\n get msg() {\n return this._msg;\n }\n /**\n * A promise that resolves when the future is done.\n */\n get done() {\n return this._done.promise;\n }\n /**\n * Get the reply handler.\n */\n get onReply() {\n return this._reply;\n }\n /**\n * Set the reply handler.\n */\n set onReply(cb) {\n this._reply = cb;\n }\n /**\n * Get the iopub handler.\n */\n get onIOPub() {\n return this._iopub;\n }\n /**\n * Set the iopub handler.\n */\n set onIOPub(cb) {\n this._iopub = cb;\n }\n /**\n * Get the stdin handler.\n */\n get onStdin() {\n return this._stdin;\n }\n /**\n * Set the stdin handler.\n */\n set onStdin(cb) {\n this._stdin = cb;\n }\n /**\n * Register hook for IOPub messages.\n *\n * @param hook - The callback invoked for an IOPub message.\n *\n * #### Notes\n * The IOPub hook system allows you to preempt the handlers for IOPub\n * messages handled by the future.\n *\n * The most recently registered hook is run first. A hook can return a\n * boolean or a promise to a boolean, in which case all kernel message\n * processing pauses until the promise is fulfilled. If a hook return value\n * resolves to false, any later hooks will not run and the function will\n * return a promise resolving to false. If a hook throws an error, the error\n * is logged to the console and the next hook is run. If a hook is\n * registered during the hook processing, it will not run until the next\n * message. If a hook is removed during the hook processing, it will be\n * deactivated immediately.\n */\n registerMessageHook(hook) {\n if (this.isDisposed) {\n throw new Error('Kernel future is disposed');\n }\n this._hooks.add(hook);\n }\n /**\n * Remove a hook for IOPub messages.\n *\n * @param hook - The hook to remove.\n *\n * #### Notes\n * If a hook is removed during the hook processing, it will be deactivated immediately.\n */\n removeMessageHook(hook) {\n if (this.isDisposed) {\n return;\n }\n this._hooks.remove(hook);\n }\n /**\n * Send an `input_reply` message.\n */\n sendInputReply(content, parent_header) {\n this._kernel.sendInputReply(content, parent_header);\n }\n /**\n * Dispose and unregister the future.\n */\n dispose() {\n this._stdin = Private.noOp;\n this._iopub = Private.noOp;\n this._reply = Private.noOp;\n this._hooks = null;\n if (!this._testFlag(Private.KernelFutureFlag.IsDone)) {\n // TODO: Uncomment the following logging code, and check for any tests that trigger it.\n // let status = [];\n // if (!this._testFlag(Private.KernelFutureFlag.GotIdle)) {\n // status.push('idle');\n // }\n // if (!this._testFlag(Private.KernelFutureFlag.GotReply)) {\n // status.push('reply');\n // }\n // console.warn(\n // `*************** DISPOSED BEFORE DONE: K${this._kernel.id.slice(\n // 0,\n // 6\n // )} M${this._msg.header.msg_id.slice(0, 6)} missing ${status.join(' ')}`\n // );\n // Reject the `done` promise, but catch its error here in case no one else\n // is waiting for the promise to resolve. This prevents the error from\n // being displayed in the console, but does not prevent it from being\n // caught by a client who is waiting for it.\n this._done.promise.catch(() => {\n /* no-op */\n });\n this._done.reject(new Error(`Canceled future for ${this.msg.header.msg_type} message before replies were done`));\n }\n super.dispose();\n }\n /**\n * Handle an incoming kernel message.\n */\n async handleMsg(msg) {\n switch (msg.channel) {\n case 'control':\n case 'shell':\n if (msg.channel === this.msg.channel &&\n msg.parent_header.msg_id === this.msg.header.msg_id) {\n await this._handleReply(msg);\n }\n break;\n case 'stdin':\n await this._handleStdin(msg);\n break;\n case 'iopub':\n await this._handleIOPub(msg);\n break;\n default:\n break;\n }\n }\n async _handleReply(msg) {\n const reply = this._reply;\n if (reply) {\n // tslint:disable-next-line:await-promise\n await reply(msg);\n }\n this._replyMsg = msg;\n this._setFlag(Private.KernelFutureFlag.GotReply);\n if (this._testFlag(Private.KernelFutureFlag.GotIdle)) {\n this._handleDone();\n }\n }\n async _handleStdin(msg) {\n this._kernel.hasPendingInput = true;\n const stdin = this._stdin;\n if (stdin) {\n // tslint:disable-next-line:await-promise\n await stdin(msg);\n }\n }\n async _handleIOPub(msg) {\n const process = await this._hooks.process(msg);\n const iopub = this._iopub;\n if (process && iopub) {\n // tslint:disable-next-line:await-promise\n await iopub(msg);\n }\n if (KernelMessage.isStatusMsg(msg) &&\n msg.content.execution_state === 'idle') {\n this._setFlag(Private.KernelFutureFlag.GotIdle);\n if (this._testFlag(Private.KernelFutureFlag.GotReply)) {\n this._handleDone();\n }\n }\n }\n _handleDone() {\n if (this._testFlag(Private.KernelFutureFlag.IsDone)) {\n return;\n }\n this._setFlag(Private.KernelFutureFlag.IsDone);\n this._done.resolve(this._replyMsg);\n if (this._disposeOnDone) {\n this.dispose();\n }\n }\n /**\n * Test whether the given future flag is set.\n */\n _testFlag(flag) {\n // tslint:disable-next-line\n return (this._status & flag) !== 0;\n }\n /**\n * Set the given future flag.\n */\n _setFlag(flag) {\n // tslint:disable-next-line\n this._status |= flag;\n }\n}\nexports.KernelFutureHandler = KernelFutureHandler;\nclass KernelControlFutureHandler extends KernelFutureHandler {\n}\nexports.KernelControlFutureHandler = KernelControlFutureHandler;\nclass KernelShellFutureHandler extends KernelFutureHandler {\n}\nexports.KernelShellFutureHandler = KernelShellFutureHandler;\nvar Private;\n(function (Private) {\n /**\n * A no-op function.\n */\n Private.noOp = () => {\n /* no-op */\n };\n /**\n * Defer a computation.\n *\n * #### NOTES\n * We can't just use requestAnimationFrame since it is not available in node.\n * This implementation is from Phosphor:\n * https://github.com/phosphorjs/phosphor/blob/e88e4321289bb1198f3098e7bda40736501f2ed8/tests/test-messaging/src/index.spec.ts#L63\n */\n const defer = (() => {\n const ok = typeof requestAnimationFrame === 'function';\n return ok ? requestAnimationFrame : setImmediate;\n })();\n class HookList {\n constructor() {\n this._hooks = [];\n }\n /**\n * Register a hook.\n *\n * @param hook - The callback to register.\n */\n add(hook) {\n this.remove(hook);\n this._hooks.push(hook);\n }\n /**\n * Remove a hook, if it exists in the hook list.\n *\n * @param hook - The callback to remove.\n */\n remove(hook) {\n const index = this._hooks.indexOf(hook);\n if (index >= 0) {\n this._hooks[index] = null;\n this._scheduleCompact();\n }\n }\n /**\n * Process a message through the hooks.\n *\n * @returns a promise resolving to false if any hook resolved as false,\n * otherwise true\n *\n * #### Notes\n * The most recently registered hook is run first. A hook can return a\n * boolean or a promise to a boolean, in which case processing pauses until\n * the promise is fulfilled. If a hook return value resolves to false, any\n * later hooks will not run and the function will return a promise resolving\n * to false. If a hook throws an error, the error is logged to the console\n * and the next hook is run. If a hook is registered during the hook\n * processing, it will not run until the next message. If a hook is removed\n * during the hook processing, it will be deactivated immediately.\n */\n async process(msg) {\n // Wait until we can start a new process run.\n await this._processing;\n // Start the next process run.\n const processing = new coreutils_1.PromiseDelegate();\n this._processing = processing.promise;\n let continueHandling;\n // Call the end hook (most recently-added) first. Starting at the end also\n // guarantees that hooks added during the processing will not be run in\n // this process run.\n for (let i = this._hooks.length - 1; i >= 0; i--) {\n const hook = this._hooks[i];\n // If the hook has been removed, continue to the next one.\n if (hook === null) {\n continue;\n }\n // Execute the hook and log any errors.\n try {\n // tslint:disable-next-line:await-promise\n continueHandling = await hook(msg);\n }\n catch (err) {\n continueHandling = true;\n console.error(err);\n }\n // If the hook resolved to false, stop processing and return.\n if (continueHandling === false) {\n processing.resolve(undefined);\n return false;\n }\n }\n // All hooks returned true (or errored out), so return true.\n processing.resolve(undefined);\n return true;\n }\n /**\n * Schedule a cleanup of the list, removing any hooks that have been nulled out.\n */\n _scheduleCompact() {\n if (!this._compactScheduled) {\n this._compactScheduled = true;\n // Schedule a compaction in between processing runs. We do the\n // scheduling in an animation frame to rate-limit our compactions. If we\n // need to compact more frequently, we can change this to directly\n // schedule the compaction.\n defer(() => {\n this._processing = this._processing.then(() => {\n this._compactScheduled = false;\n this._compact();\n });\n });\n }\n }\n /**\n * Compact the list, removing any nulls.\n */\n _compact() {\n let numNulls = 0;\n for (let i = 0, len = this._hooks.length; i < len; i++) {\n const hook = this._hooks[i];\n if (this._hooks[i] === null) {\n numNulls++;\n }\n else {\n this._hooks[i - numNulls] = hook;\n }\n }\n this._hooks.length -= numNulls;\n }\n }\n Private.HookList = HookList;\n /**\n * Bit flags for the kernel future state.\n */\n let KernelFutureFlag;\n (function (KernelFutureFlag) {\n KernelFutureFlag[KernelFutureFlag[\"GotReply\"] = 1] = \"GotReply\";\n KernelFutureFlag[KernelFutureFlag[\"GotIdle\"] = 2] = \"GotIdle\";\n KernelFutureFlag[KernelFutureFlag[\"IsDone\"] = 4] = \"IsDone\";\n KernelFutureFlag[KernelFutureFlag[\"DisposeOnDone\"] = 8] = \"DisposeOnDone\";\n })(KernelFutureFlag = Private.KernelFutureFlag || (Private.KernelFutureFlag = {}));\n})(Private || (Private = {}));\n//# sourceMappingURL=future.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelConnection = exports.KernelAPI = exports.KernelMessage = exports.Kernel = void 0;\n// Namespace some of our modules for convenience and backwards compatibility.\nconst Kernel = __importStar(require(\"./kernel\"));\nexports.Kernel = Kernel;\nconst KernelMessage = __importStar(require(\"./messages\"));\nexports.KernelMessage = KernelMessage;\nconst KernelAPI = __importStar(require(\"./restapi\"));\nexports.KernelAPI = KernelAPI;\nconst default_1 = require(\"./default\");\nObject.defineProperty(exports, \"KernelConnection\", { enumerable: true, get: function () { return default_1.KernelConnection; } });\n__exportStar(require(\"./manager\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=kernel.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelManager = void 0;\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst basemanager_1 = require(\"../basemanager\");\nconst restapi_1 = require(\"./restapi\");\nconst default_1 = require(\"./default\");\n/**\n * An implementation of a kernel manager.\n */\nclass KernelManager extends basemanager_1.BaseManager {\n /**\n * Construct a new kernel manager.\n *\n * @param options - The default options for kernel.\n */\n constructor(options = {}) {\n var _a;\n super(options);\n this._isReady = false;\n this._kernelConnections = new Set();\n this._models = new Map();\n this._runningChanged = new signaling_1.Signal(this);\n this._connectionFailure = new signaling_1.Signal(this);\n // Start model and specs polling with exponential backoff.\n this._pollModels = new polling_1.Poll({\n auto: false,\n factory: () => this.requestRunning(),\n frequency: {\n interval: 10 * 1000,\n backoff: true,\n max: 300 * 1000\n },\n name: `@jupyterlab/services:KernelManager#models`,\n standby: (_a = options.standby) !== null && _a !== void 0 ? _a : 'when-hidden'\n });\n // Initialize internal data.\n this._ready = (async () => {\n await this._pollModels.start();\n await this._pollModels.tick;\n this._isReady = true;\n })();\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._ready;\n }\n /**\n * A signal emitted when the running kernels change.\n */\n get runningChanged() {\n return this._runningChanged;\n }\n /**\n * A signal emitted when there is a connection failure.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._models.clear();\n this._kernelConnections.forEach(x => x.dispose());\n this._pollModels.dispose();\n super.dispose();\n }\n /**\n * Connect to an existing kernel.\n *\n * @returns The new kernel connection.\n *\n * #### Notes\n * This will use the manager's server settings and ignore any server\n * settings passed in the options.\n */\n connectTo(options) {\n var _a;\n const { id } = options.model;\n let handleComms = (_a = options.handleComms) !== null && _a !== void 0 ? _a : true;\n // By default, handle comms only if no other kernel connection is.\n if (options.handleComms === undefined) {\n for (const kc of this._kernelConnections) {\n if (kc.id === id && kc.handleComms) {\n handleComms = false;\n break;\n }\n }\n }\n const kernelConnection = new default_1.KernelConnection({\n handleComms,\n ...options,\n serverSettings: this.serverSettings\n });\n this._onStarted(kernelConnection);\n if (!this._models.has(id)) {\n // We trust the user to connect to an existing kernel, but we verify\n // asynchronously.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n return kernelConnection;\n }\n /**\n * Create an iterator over the most recent running kernels.\n *\n * @returns A new iterator over the running kernels.\n */\n running() {\n return this._models.values();\n }\n /**\n * Force a refresh of the running kernels.\n *\n * @returns A promise that resolves when the running list has been refreshed.\n *\n * #### Notes\n * This is not typically meant to be called by the user, since the\n * manager maintains its own internal state.\n */\n async refreshRunning() {\n await this._pollModels.refresh();\n await this._pollModels.tick;\n }\n /**\n * Start a new kernel.\n *\n * @param createOptions - The kernel creation options\n *\n * @param connectOptions - The kernel connection options\n *\n * @returns A promise that resolves with the kernel connection.\n *\n * #### Notes\n * The manager `serverSettings` will be always be used.\n */\n async startNew(createOptions = {}, connectOptions = {}) {\n const model = await (0, restapi_1.startNew)(createOptions, this.serverSettings);\n return this.connectTo({\n ...connectOptions,\n model\n });\n }\n /**\n * Shut down a kernel by id.\n *\n * @param id - The id of the target kernel.\n *\n * @returns A promise that resolves when the operation is complete.\n */\n async shutdown(id) {\n await (0, restapi_1.shutdownKernel)(id, this.serverSettings);\n await this.refreshRunning();\n }\n /**\n * Shut down all kernels.\n *\n * @returns A promise that resolves when all of the kernels are shut down.\n */\n async shutdownAll() {\n // Update the list of models to make sure our list is current.\n await this.refreshRunning();\n // Shut down all models.\n await Promise.all([...this._models.keys()].map(id => (0, restapi_1.shutdownKernel)(id, this.serverSettings)));\n // Update the list of models to clear out our state.\n await this.refreshRunning();\n }\n /**\n * Find a kernel by id.\n *\n * @param id - The id of the target kernel.\n *\n * @returns A promise that resolves with the kernel's model.\n */\n async findById(id) {\n if (this._models.has(id)) {\n return this._models.get(id);\n }\n await this.refreshRunning();\n return this._models.get(id);\n }\n /**\n * Execute a request to the server to poll running kernels and update state.\n */\n async requestRunning() {\n var _a, _b;\n let models;\n try {\n models = await (0, restapi_1.listRunning)(this.serverSettings);\n }\n catch (err) {\n // Handle network errors, as well as cases where we are on a\n // JupyterHub and the server is not running. JupyterHub returns a\n // 503 (<2.0) or 424 (>2.0) in that case.\n if (err instanceof __1.ServerConnection.NetworkError ||\n ((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) === 503 ||\n ((_b = err.response) === null || _b === void 0 ? void 0 : _b.status) === 424) {\n this._connectionFailure.emit(err);\n }\n throw err;\n }\n if (this.isDisposed) {\n return;\n }\n if (this._models.size === models.length &&\n models.every(model => {\n const existing = this._models.get(model.id);\n if (!existing) {\n return false;\n }\n return (existing.connections === model.connections &&\n existing.execution_state === model.execution_state &&\n existing.last_activity === model.last_activity &&\n existing.name === model.name &&\n existing.reason === model.reason &&\n existing.traceback === model.traceback);\n })) {\n // Identical models list (presuming models does not contain duplicate\n // ids), so just return\n return;\n }\n this._models = new Map(models.map(x => [x.id, x]));\n // For any kernel connection to a kernel that doesn't exist, notify it of\n // the shutdown.\n this._kernelConnections.forEach(kc => {\n if (!this._models.has(kc.id)) {\n kc.handleShutdown();\n }\n });\n this._runningChanged.emit(models);\n }\n /**\n * Handle a kernel starting.\n */\n _onStarted(kernelConnection) {\n this._kernelConnections.add(kernelConnection);\n kernelConnection.statusChanged.connect(this._onStatusChanged, this);\n kernelConnection.disposed.connect(this._onDisposed, this);\n }\n _onDisposed(kernelConnection) {\n this._kernelConnections.delete(kernelConnection);\n // A dispose emission could mean the server session is deleted, or that\n // the kernel JS object is disposed and the kernel still exists on the\n // server, so we refresh from the server to make sure we reflect the\n // server state.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n _onStatusChanged(kernelConnection, status) {\n if (status === 'dead') {\n // We asynchronously update our list of kernels, which asynchronously\n // will dispose them. We do not want to immediately dispose them because\n // there may be other signal handlers that want to be called.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n }\n}\nexports.KernelManager = KernelManager;\n/**\n * The namespace for `KernelManager` class statics.\n */\n(function (KernelManager) {\n /**\n * A no-op kernel manager to be used when starting kernels.\n */\n class NoopManager extends KernelManager {\n constructor() {\n super(...arguments);\n this._readyPromise = new Promise(() => {\n /* no-op */\n });\n }\n /**\n * Whether the manager is active.\n */\n get isActive() {\n return false;\n }\n /**\n * Used for testing.\n */\n get parentReady() {\n return super.ready;\n }\n /**\n * Start a new kernel - throws an error since it is not supported.\n */\n async startNew(createOptions = {}, connectOptions = {}) {\n return Promise.reject(new Error('Not implemented in no-op Kernel Manager'));\n }\n /**\n * Connect to an existing kernel - throws an error since it is not supported.\n */\n connectTo(options) {\n throw new Error('Not implemented in no-op Kernel Manager');\n }\n /**\n * Shut down a kernel by id - throws an error since it is not supported.\n */\n async shutdown(id) {\n return Promise.reject(new Error('Not implemented in no-op Kernel Manager'));\n }\n /**\n * A promise that fulfills when the manager is ready (never).\n */\n get ready() {\n return this.parentReady.then(() => this._readyPromise);\n }\n /**\n * Execute a request to the server to poll running kernels and update state.\n */\n async requestRunning() {\n return Promise.resolve();\n }\n }\n KernelManager.NoopManager = NoopManager;\n})(KernelManager = exports.KernelManager || (exports.KernelManager = {}));\n//# sourceMappingURL=manager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.supportedKernelWebSocketProtocols = exports.isInputReplyMsg = exports.isInputRequestMsg = exports.isDebugReplyMsg = exports.isDebugRequestMsg = exports.isExecuteReplyMsg = exports.isInfoRequestMsg = exports.isCommMsgMsg = exports.isCommCloseMsg = exports.isCommOpenMsg = exports.isDebugEventMsg = exports.isClearOutputMsg = exports.isStatusMsg = exports.isErrorMsg = exports.isExecuteResultMsg = exports.isExecuteInputMsg = exports.isUpdateDisplayDataMsg = exports.isDisplayDataMsg = exports.isStreamMsg = exports.createMessage = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\nfunction createMessage(options) {\n var _a, _b, _c, _d, _e;\n return {\n buffers: (_a = options.buffers) !== null && _a !== void 0 ? _a : [],\n channel: options.channel,\n content: options.content,\n header: {\n date: new Date().toISOString(),\n msg_id: (_b = options.msgId) !== null && _b !== void 0 ? _b : coreutils_1.UUID.uuid4(),\n msg_type: options.msgType,\n session: options.session,\n username: (_c = options.username) !== null && _c !== void 0 ? _c : '',\n version: '5.2'\n },\n metadata: (_d = options.metadata) !== null && _d !== void 0 ? _d : {},\n parent_header: (_e = options.parentHeader) !== null && _e !== void 0 ? _e : {}\n };\n}\nexports.createMessage = createMessage;\n/**\n * Test whether a kernel message is a `'stream'` message.\n */\nfunction isStreamMsg(msg) {\n return msg.header.msg_type === 'stream';\n}\nexports.isStreamMsg = isStreamMsg;\n/**\n * Test whether a kernel message is an `'display_data'` message.\n */\nfunction isDisplayDataMsg(msg) {\n return msg.header.msg_type === 'display_data';\n}\nexports.isDisplayDataMsg = isDisplayDataMsg;\n/**\n * Test whether a kernel message is an `'update_display_data'` message.\n */\nfunction isUpdateDisplayDataMsg(msg) {\n return msg.header.msg_type === 'update_display_data';\n}\nexports.isUpdateDisplayDataMsg = isUpdateDisplayDataMsg;\n/**\n * Test whether a kernel message is an `'execute_input'` message.\n */\nfunction isExecuteInputMsg(msg) {\n return msg.header.msg_type === 'execute_input';\n}\nexports.isExecuteInputMsg = isExecuteInputMsg;\n/**\n * Test whether a kernel message is an `'execute_result'` message.\n */\nfunction isExecuteResultMsg(msg) {\n return msg.header.msg_type === 'execute_result';\n}\nexports.isExecuteResultMsg = isExecuteResultMsg;\n/**\n * Test whether a kernel message is an `'error'` message.\n */\nfunction isErrorMsg(msg) {\n return msg.header.msg_type === 'error';\n}\nexports.isErrorMsg = isErrorMsg;\n/**\n * Test whether a kernel message is a `'status'` message.\n */\nfunction isStatusMsg(msg) {\n return msg.header.msg_type === 'status';\n}\nexports.isStatusMsg = isStatusMsg;\n/**\n * Test whether a kernel message is a `'clear_output'` message.\n */\nfunction isClearOutputMsg(msg) {\n return msg.header.msg_type === 'clear_output';\n}\nexports.isClearOutputMsg = isClearOutputMsg;\n/**\n * Test whether a kernel message is an experimental `'debug_event'` message.\n *\n * @hidden\n *\n * #### Notes\n * Debug messages are experimental messages that are not in the official\n * kernel message specification. As such, this is *NOT* considered\n * part of the public API, and may change without notice.\n */\nfunction isDebugEventMsg(msg) {\n return msg.header.msg_type === 'debug_event';\n}\nexports.isDebugEventMsg = isDebugEventMsg;\n/**\n * Test whether a kernel message is a `'comm_open'` message.\n */\nfunction isCommOpenMsg(msg) {\n return msg.header.msg_type === 'comm_open';\n}\nexports.isCommOpenMsg = isCommOpenMsg;\n/**\n * Test whether a kernel message is a `'comm_close'` message.\n */\nfunction isCommCloseMsg(msg) {\n return msg.header.msg_type === 'comm_close';\n}\nexports.isCommCloseMsg = isCommCloseMsg;\n/**\n * Test whether a kernel message is a `'comm_msg'` message.\n */\nfunction isCommMsgMsg(msg) {\n return msg.header.msg_type === 'comm_msg';\n}\nexports.isCommMsgMsg = isCommMsgMsg;\n/**\n * Test whether a kernel message is a `'kernel_info_request'` message.\n */\nfunction isInfoRequestMsg(msg) {\n return msg.header.msg_type === 'kernel_info_request';\n}\nexports.isInfoRequestMsg = isInfoRequestMsg;\n/**\n * Test whether a kernel message is an `'execute_reply'` message.\n */\nfunction isExecuteReplyMsg(msg) {\n return msg.header.msg_type === 'execute_reply';\n}\nexports.isExecuteReplyMsg = isExecuteReplyMsg;\n/**\n * Test whether a kernel message is an experimental `'debug_request'` message.\n *\n * @hidden\n *\n * #### Notes\n * Debug messages are experimental messages that are not in the official\n * kernel message specification. As such, this is *NOT* considered\n * part of the public API, and may change without notice.\n */\nfunction isDebugRequestMsg(msg) {\n return msg.header.msg_type === 'debug_request';\n}\nexports.isDebugRequestMsg = isDebugRequestMsg;\n/**\n * Test whether a kernel message is an experimental `'debug_reply'` message.\n *\n * @hidden\n *\n * #### Notes\n * Debug messages are experimental messages that are not in the official\n * kernel message specification. As such, this is *NOT* considered\n * part of the public API, and may change without notice.\n */\nfunction isDebugReplyMsg(msg) {\n return msg.header.msg_type === 'debug_reply';\n}\nexports.isDebugReplyMsg = isDebugReplyMsg;\n/**\n * Test whether a kernel message is an `'input_request'` message.\n */\nfunction isInputRequestMsg(msg) {\n return msg.header.msg_type === 'input_request';\n}\nexports.isInputRequestMsg = isInputRequestMsg;\n/**\n * Test whether a kernel message is an `'input_reply'` message.\n */\nfunction isInputReplyMsg(msg) {\n return msg.header.msg_type === 'input_reply';\n}\nexports.isInputReplyMsg = isInputReplyMsg;\n// ///////////////////////////////////////////////\n// Message (de)serialization\n// ///////////////////////////////////////////////\n/**\n * The list of supported kernel wire protocols over websocket.\n */\nvar supportedKernelWebSocketProtocols;\n(function (supportedKernelWebSocketProtocols) {\n supportedKernelWebSocketProtocols[\"v1KernelWebsocketJupyterOrg\"] = \"v1.kernel.websocket.jupyter.org\";\n})(supportedKernelWebSocketProtocols = exports.supportedKernelWebSocketProtocols || (exports.supportedKernelWebSocketProtocols = {}));\n//# sourceMappingURL=messages.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getKernelModel = exports.shutdownKernel = exports.interruptKernel = exports.restartKernel = exports.startNew = exports.listRunning = exports.KERNEL_SERVICE_URL = void 0;\nconst serverconnection_1 = require(\"../serverconnection\");\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst validate_1 = require(\"./validate\");\n/**\n * The url for the kernel service.\n */\nexports.KERNEL_SERVICE_URL = 'api/kernels';\n/**\n * Fetch the running kernels.\n *\n * @param settings - The optional server settings.\n *\n * @returns A promise that resolves with the list of running kernels.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\nasync function listRunning(settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL);\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.validateModels)(data);\n return data;\n}\nexports.listRunning = listRunning;\n/**\n * Start a new kernel.\n *\n * @param options - The options used to create the kernel.\n *\n * @returns A promise that resolves with a kernel connection object.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\nasync function startNew(options = {}, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL);\n const init = {\n method: 'POST',\n body: JSON.stringify(options)\n };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 201) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.validateModel)(data);\n return data;\n}\nexports.startNew = startNew;\n/**\n * Restart a kernel.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response (and thus after a restart) and rejected otherwise.\n */\nasync function restartKernel(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL, encodeURIComponent(id), 'restart');\n const init = { method: 'POST' };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.validateModel)(data);\n}\nexports.restartKernel = restartKernel;\n/**\n * Interrupt a kernel.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\nasync function interruptKernel(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL, encodeURIComponent(id), 'interrupt');\n const init = { method: 'POST' };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 204) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n}\nexports.interruptKernel = interruptKernel;\n/**\n * Shut down a kernel.\n *\n * @param id - The id of the running kernel.\n *\n * @param settings - The server settings for the request.\n *\n * @returns A promise that resolves when the kernel is shut down.\n *\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\nasync function shutdownKernel(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL, encodeURIComponent(id));\n const init = { method: 'DELETE' };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status === 404) {\n const msg = `The kernel \"${id}\" does not exist on the server`;\n console.warn(msg);\n }\n else if (response.status !== 204) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n}\nexports.shutdownKernel = shutdownKernel;\n/**\n * Get a full kernel model from the server by kernel id string.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernels) and validates the response model.\n *\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\nasync function getKernelModel(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.KERNEL_SERVICE_URL, encodeURIComponent(id));\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status === 404) {\n return undefined;\n }\n else if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.validateModel)(data);\n return data;\n}\nexports.getKernelModel = getKernelModel;\n//# sourceMappingURL=restapi.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.deserialize = exports.serialize = void 0;\nconst KernelMessage = __importStar(require(\"./messages\"));\n/**\n * Serialize a kernel message for transport.\n */\nfunction serialize(msg, protocol = '') {\n switch (protocol) {\n case KernelMessage.supportedKernelWebSocketProtocols\n .v1KernelWebsocketJupyterOrg:\n return Private.serializeV1KernelWebsocketJupyterOrg(msg);\n default:\n return Private.serializeDefault(msg);\n }\n}\nexports.serialize = serialize;\n/**\n * Deserialize and return the unpacked message.\n */\nfunction deserialize(data, protocol = '') {\n switch (protocol) {\n case KernelMessage.supportedKernelWebSocketProtocols\n .v1KernelWebsocketJupyterOrg:\n return Private.deserializeV1KernelWebsocketJupyterOrg(data);\n default:\n return Private.deserializeDefault(data);\n }\n}\nexports.deserialize = deserialize;\nvar Private;\n(function (Private) {\n /**\n * Deserialize and return the unpacked message.\n * Protocol `v1.kernel.websocket.jupyter.org`\n */\n function deserializeV1KernelWebsocketJupyterOrg(binMsg) {\n let msg;\n const data = new DataView(binMsg);\n const offsetNumber = Number(data.getBigUint64(0, true /* littleEndian */));\n let offsets = [];\n for (let i = 0; i < offsetNumber; i++) {\n // WARNING: we cast our 64-bit unsigned int to a number!\n // so offsets cannot index up to 2**64 bytes\n offsets.push(Number(data.getBigUint64(8 * (i + 1), true /* littleEndian */)));\n }\n const decoder = new TextDecoder('utf8');\n const channel = decoder.decode(binMsg.slice(offsets[0], offsets[1]));\n const header = JSON.parse(decoder.decode(binMsg.slice(offsets[1], offsets[2])));\n const parent_header = JSON.parse(decoder.decode(binMsg.slice(offsets[2], offsets[3])));\n const metadata = JSON.parse(decoder.decode(binMsg.slice(offsets[3], offsets[4])));\n const content = JSON.parse(decoder.decode(binMsg.slice(offsets[4], offsets[5])));\n let buffers = [];\n for (let i = 5; i < offsets.length - 1; i++) {\n buffers.push(new DataView(binMsg.slice(offsets[i], offsets[i + 1])));\n }\n msg = {\n channel,\n header,\n parent_header,\n metadata,\n content,\n buffers\n };\n return msg;\n }\n Private.deserializeV1KernelWebsocketJupyterOrg = deserializeV1KernelWebsocketJupyterOrg;\n /**\n * Serialize a kernel message for transport.\n * Protocol `v1.kernel.websocket.jupyter.org`\n */\n function serializeV1KernelWebsocketJupyterOrg(msg) {\n const header = JSON.stringify(msg.header);\n const parentHeader = msg.parent_header == null ? '{}' : JSON.stringify(msg.parent_header);\n const metadata = JSON.stringify(msg.metadata);\n const content = JSON.stringify(msg.content);\n const buffers = msg.buffers !== undefined ? msg.buffers : [];\n const offsetNumber = 1 + 4 + buffers.length + 1;\n let offsets = [];\n offsets.push(8 * (1 + offsetNumber));\n offsets.push(msg.channel.length + offsets[offsets.length - 1]);\n const encoder = new TextEncoder();\n const channelEncoded = encoder.encode(msg.channel);\n const headerEncoded = encoder.encode(header);\n const parentHeaderEncoded = encoder.encode(parentHeader);\n const metadataEncoded = encoder.encode(metadata);\n const contentEncoded = encoder.encode(content);\n const binMsgNoBuff = new Uint8Array(channelEncoded.length +\n headerEncoded.length +\n parentHeaderEncoded.length +\n metadataEncoded.length +\n contentEncoded.length);\n binMsgNoBuff.set(channelEncoded);\n binMsgNoBuff.set(headerEncoded, channelEncoded.length);\n binMsgNoBuff.set(parentHeaderEncoded, channelEncoded.length + headerEncoded.length);\n binMsgNoBuff.set(metadataEncoded, channelEncoded.length + headerEncoded.length + parentHeaderEncoded.length);\n binMsgNoBuff.set(contentEncoded, channelEncoded.length +\n headerEncoded.length +\n parentHeaderEncoded.length +\n metadataEncoded.length);\n for (let length of [\n headerEncoded.length,\n parentHeaderEncoded.length,\n metadataEncoded.length,\n contentEncoded.length\n ]) {\n offsets.push(length + offsets[offsets.length - 1]);\n }\n let buffersByteLength = 0;\n for (let buffer of buffers) {\n let length = buffer.byteLength;\n offsets.push(length + offsets[offsets.length - 1]);\n buffersByteLength += length;\n }\n const binMsg = new Uint8Array(8 * (1 + offsetNumber) + binMsgNoBuff.byteLength + buffersByteLength);\n const word = new ArrayBuffer(8);\n const data = new DataView(word);\n data.setBigUint64(0, BigInt(offsetNumber), true /* littleEndian */);\n binMsg.set(new Uint8Array(word), 0);\n for (let i = 0; i < offsets.length; i++) {\n data.setBigUint64(0, BigInt(offsets[i]), true /* littleEndian */);\n binMsg.set(new Uint8Array(word), 8 * (i + 1));\n }\n binMsg.set(binMsgNoBuff, offsets[0]);\n for (let i = 0; i < buffers.length; i++) {\n const buffer = buffers[i];\n binMsg.set(new Uint8Array(ArrayBuffer.isView(buffer) ? buffer.buffer : buffer), offsets[5 + i]);\n }\n return binMsg.buffer;\n }\n Private.serializeV1KernelWebsocketJupyterOrg = serializeV1KernelWebsocketJupyterOrg;\n /**\n * Deserialize and return the unpacked message.\n * Default protocol\n *\n * #### Notes\n * Handles JSON blob strings and binary messages.\n */\n function deserializeDefault(data) {\n let value;\n if (typeof data === 'string') {\n value = JSON.parse(data);\n }\n else {\n value = deserializeBinary(data);\n }\n return value;\n }\n Private.deserializeDefault = deserializeDefault;\n /**\n * Serialize a kernel message for transport.\n * Default protocol\n *\n * #### Notes\n * If there is binary content, an `ArrayBuffer` is returned,\n * otherwise the message is converted to a JSON string.\n */\n function serializeDefault(msg) {\n var _a;\n let value;\n if ((_a = msg.buffers) === null || _a === void 0 ? void 0 : _a.length) {\n value = serializeBinary(msg);\n }\n else {\n value = JSON.stringify(msg);\n }\n return value;\n }\n Private.serializeDefault = serializeDefault;\n /**\n * Deserialize a binary message to a Kernel Message.\n */\n function deserializeBinary(buf) {\n const data = new DataView(buf);\n // read the header: 1 + nbufs 32b integers\n const nbufs = data.getUint32(0);\n const offsets = [];\n if (nbufs < 2) {\n throw new Error('Invalid incoming Kernel Message');\n }\n for (let i = 1; i <= nbufs; i++) {\n offsets.push(data.getUint32(i * 4));\n }\n const jsonBytes = new Uint8Array(buf.slice(offsets[0], offsets[1]));\n const msg = JSON.parse(new TextDecoder('utf8').decode(jsonBytes));\n // the remaining chunks are stored as DataViews in msg.buffers\n msg.buffers = [];\n for (let i = 1; i < nbufs; i++) {\n const start = offsets[i];\n const stop = offsets[i + 1] || buf.byteLength;\n msg.buffers.push(new DataView(buf.slice(start, stop)));\n }\n return msg;\n }\n /**\n * Implement the binary serialization protocol.\n *\n * Serialize Kernel message to ArrayBuffer.\n */\n function serializeBinary(msg) {\n const offsets = [];\n const buffers = [];\n const encoder = new TextEncoder();\n let origBuffers = [];\n if (msg.buffers !== undefined) {\n origBuffers = msg.buffers;\n delete msg['buffers'];\n }\n const jsonUtf8 = encoder.encode(JSON.stringify(msg));\n buffers.push(jsonUtf8.buffer);\n for (let i = 0; i < origBuffers.length; i++) {\n // msg.buffers elements could be either views or ArrayBuffers\n // buffers elements are ArrayBuffers\n const b = origBuffers[i];\n buffers.push(ArrayBuffer.isView(b) ? b.buffer : b);\n }\n const nbufs = buffers.length;\n offsets.push(4 * (nbufs + 1));\n for (let i = 0; i + 1 < buffers.length; i++) {\n offsets.push(offsets[offsets.length - 1] + buffers[i].byteLength);\n }\n const msgBuf = new Uint8Array(offsets[offsets.length - 1] + buffers[buffers.length - 1].byteLength);\n // use DataView.setUint32 for network byte-order\n const view = new DataView(msgBuf.buffer);\n // write nbufs to first 4 bytes\n view.setUint32(0, nbufs);\n // write offsets to next 4 * nbufs bytes\n for (let i = 0; i < offsets.length; i++) {\n view.setUint32(4 * (i + 1), offsets[i]);\n }\n // write all the buffers at their respective offsets\n for (let i = 0; i < buffers.length; i++) {\n msgBuf.set(new Uint8Array(buffers[i]), offsets[i]);\n }\n return msgBuf.buffer;\n }\n})(Private || (Private = {}));\n//# sourceMappingURL=serialize.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateModels = exports.validateModel = exports.validateMessage = void 0;\nconst validate_1 = require(\"../validate\");\n/**\n * Required fields for `IKernelHeader`.\n */\nconst HEADER_FIELDS = ['username', 'version', 'session', 'msg_id', 'msg_type'];\n/**\n * Required fields and types for contents of various types of `kernel.IMessage`\n * messages on the iopub channel.\n */\nconst IOPUB_CONTENT_FIELDS = {\n stream: { name: 'string', text: 'string' },\n display_data: { data: 'object', metadata: 'object' },\n execute_input: { code: 'string', execution_count: 'number' },\n execute_result: {\n execution_count: 'number',\n data: 'object',\n metadata: 'object'\n },\n error: { ename: 'string', evalue: 'string', traceback: 'object' },\n status: {\n execution_state: [\n 'string',\n ['starting', 'idle', 'busy', 'restarting', 'dead']\n ]\n },\n clear_output: { wait: 'boolean' },\n comm_open: { comm_id: 'string', target_name: 'string', data: 'object' },\n comm_msg: { comm_id: 'string', data: 'object' },\n comm_close: { comm_id: 'string' },\n shutdown_reply: { restart: 'boolean' } // Emitted by the IPython kernel.\n};\n/**\n * Validate the header of a kernel message.\n */\nfunction validateHeader(header) {\n for (let i = 0; i < HEADER_FIELDS.length; i++) {\n (0, validate_1.validateProperty)(header, HEADER_FIELDS[i], 'string');\n }\n}\n/**\n * Validate a kernel message object.\n */\nfunction validateMessage(msg) {\n (0, validate_1.validateProperty)(msg, 'metadata', 'object');\n (0, validate_1.validateProperty)(msg, 'content', 'object');\n (0, validate_1.validateProperty)(msg, 'channel', 'string');\n validateHeader(msg.header);\n if (msg.channel === 'iopub') {\n validateIOPubContent(msg);\n }\n}\nexports.validateMessage = validateMessage;\n/**\n * Validate content an kernel message on the iopub channel.\n */\nfunction validateIOPubContent(msg) {\n if (msg.channel === 'iopub') {\n const fields = IOPUB_CONTENT_FIELDS[msg.header.msg_type];\n // Check for unknown message type.\n if (fields === undefined) {\n return;\n }\n const names = Object.keys(fields);\n const content = msg.content;\n for (let i = 0; i < names.length; i++) {\n let args = fields[names[i]];\n if (!Array.isArray(args)) {\n args = [args];\n }\n (0, validate_1.validateProperty)(content, names[i], ...args);\n }\n }\n}\n/**\n * Validate a `Kernel.IModel` object.\n */\nfunction validateModel(model) {\n (0, validate_1.validateProperty)(model, 'name', 'string');\n (0, validate_1.validateProperty)(model, 'id', 'string');\n}\nexports.validateModel = validateModel;\n/**\n * Validate an array of `IModel` objects.\n */\nfunction validateModels(models) {\n if (!Array.isArray(models)) {\n throw new Error('Invalid kernel list');\n }\n models.forEach(d => validateModel(d));\n}\nexports.validateModels = validateModels;\n//# sourceMappingURL=validate.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelSpecAPI = exports.KernelSpec = void 0;\nconst KernelSpec = __importStar(require(\"./kernelspec\"));\nexports.KernelSpec = KernelSpec;\nconst KernelSpecAPI = __importStar(require(\"./restapi\"));\nexports.KernelSpecAPI = KernelSpecAPI;\n__exportStar(require(\"./manager\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=kernelspec.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.KernelSpecManager = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst restapi = __importStar(require(\"./restapi\"));\nconst basemanager_1 = require(\"../basemanager\");\n/**\n * An implementation of a kernel spec manager.\n */\nclass KernelSpecManager extends basemanager_1.BaseManager {\n /**\n * Construct a new kernel spec manager.\n *\n * @param options - The default options for kernel.\n */\n constructor(options = {}) {\n var _a;\n super(options);\n this._isReady = false;\n this._connectionFailure = new signaling_1.Signal(this);\n this._specs = null;\n this._specsChanged = new signaling_1.Signal(this);\n // Initialize internal data.\n this._ready = Promise.all([this.requestSpecs()])\n .then(_ => undefined)\n .catch(_ => undefined)\n .then(() => {\n if (this.isDisposed) {\n return;\n }\n this._isReady = true;\n });\n this._pollSpecs = new polling_1.Poll({\n auto: false,\n factory: () => this.requestSpecs(),\n frequency: {\n interval: 61 * 1000,\n backoff: true,\n max: 300 * 1000\n },\n name: `@jupyterlab/services:KernelSpecManager#specs`,\n standby: (_a = options.standby) !== null && _a !== void 0 ? _a : 'when-hidden'\n });\n void this.ready.then(() => {\n void this._pollSpecs.start();\n });\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._ready;\n }\n /**\n * Get the most recently fetched kernel specs.\n */\n get specs() {\n return this._specs;\n }\n /**\n * A signal emitted when the specs change.\n */\n get specsChanged() {\n return this._specsChanged;\n }\n /**\n * A signal emitted when there is a connection failure.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n this._pollSpecs.dispose();\n super.dispose();\n }\n /**\n * Force a refresh of the specs from the server.\n *\n * @returns A promise that resolves when the specs are fetched.\n *\n * #### Notes\n * This is intended to be called only in response to a user action,\n * since the manager maintains its internal state.\n */\n async refreshSpecs() {\n await this._pollSpecs.refresh();\n await this._pollSpecs.tick;\n }\n /**\n * Execute a request to the server to poll specs and update state.\n */\n async requestSpecs() {\n const specs = await restapi.getSpecs(this.serverSettings);\n if (this.isDisposed) {\n return;\n }\n if (!coreutils_1.JSONExt.deepEqual(specs, this._specs)) {\n this._specs = specs;\n this._specsChanged.emit(specs);\n }\n }\n}\nexports.KernelSpecManager = KernelSpecManager;\n//# sourceMappingURL=manager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getSpecs = void 0;\nconst serverconnection_1 = require(\"../serverconnection\");\nconst validate_1 = require(\"./validate\");\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\n/**\n * The url for the kernelspec service.\n */\nconst KERNELSPEC_SERVICE_URL = 'api/kernelspecs';\n/**\n * Fetch all of the kernel specs.\n *\n * @param settings - The optional server settings.\n * @param useCache - Whether to use the cache. If false, always request.\n *\n * @returns A promise that resolves with the kernel specs.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/kernelspecs).\n */\nasync function getSpecs(settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, KERNELSPEC_SERVICE_URL);\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n return (0, validate_1.validateSpecModels)(data);\n}\nexports.getSpecs = getSpecs;\n//# sourceMappingURL=restapi.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateSpecModels = exports.validateSpecModel = void 0;\nconst validate_1 = require(\"../validate\");\n/**\n * Validate a server kernelspec model to a client side model.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction validateSpecModel(data) {\n const spec = data.spec;\n if (!spec) {\n throw new Error('Invalid kernel spec');\n }\n (0, validate_1.validateProperty)(data, 'name', 'string');\n (0, validate_1.validateProperty)(data, 'resources', 'object');\n (0, validate_1.validateProperty)(spec, 'language', 'string');\n (0, validate_1.validateProperty)(spec, 'display_name', 'string');\n (0, validate_1.validateProperty)(spec, 'argv', 'array');\n let metadata = null;\n if (spec.hasOwnProperty('metadata')) {\n (0, validate_1.validateProperty)(spec, 'metadata', 'object');\n metadata = spec.metadata;\n }\n let env = null;\n if (spec.hasOwnProperty('env')) {\n (0, validate_1.validateProperty)(spec, 'env', 'object');\n env = spec.env;\n }\n return {\n name: data.name,\n resources: data.resources,\n language: spec.language,\n display_name: spec.display_name,\n argv: spec.argv,\n metadata,\n env\n };\n}\nexports.validateSpecModel = validateSpecModel;\n/**\n * Validate a `Kernel.ISpecModels` object.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction validateSpecModels(data) {\n if (!data.hasOwnProperty('kernelspecs')) {\n throw new Error('No kernelspecs found');\n }\n let keys = Object.keys(data.kernelspecs);\n const kernelspecs = Object.create(null);\n let defaultSpec = data.default;\n for (let i = 0; i < keys.length; i++) {\n const ks = data.kernelspecs[keys[i]];\n try {\n kernelspecs[keys[i]] = validateSpecModel(ks);\n }\n catch (err) {\n // Remove the errant kernel spec.\n console.warn(`Removing errant kernel spec: ${keys[i]}`);\n }\n }\n keys = Object.keys(kernelspecs);\n if (!keys.length) {\n throw new Error('No valid kernelspecs found');\n }\n if (!defaultSpec ||\n typeof defaultSpec !== 'string' ||\n !(defaultSpec in kernelspecs)) {\n defaultSpec = keys[0];\n console.warn(`Default kernel not found, using '${keys[0]}'`);\n }\n return {\n default: defaultSpec,\n kernelspecs\n };\n}\nexports.validateSpecModels = validateSpecModels;\n//# sourceMappingURL=validate.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ServiceManager = void 0;\nconst signaling_1 = require(\"@lumino/signaling\");\nconst builder_1 = require(\"./builder\");\nconst contents_1 = require(\"./contents\");\nconst event_1 = require(\"./event\");\nconst kernel_1 = require(\"./kernel\");\nconst kernelspec_1 = require(\"./kernelspec\");\nconst nbconvert_1 = require(\"./nbconvert\");\nconst serverconnection_1 = require(\"./serverconnection\");\nconst session_1 = require(\"./session\");\nconst setting_1 = require(\"./setting\");\nconst terminal_1 = require(\"./terminal\");\nconst user_1 = require(\"./user\");\nconst workspace_1 = require(\"./workspace\");\n/**\n * A Jupyter services manager.\n */\nclass ServiceManager {\n /**\n * Construct a new services provider.\n */\n constructor(options = {}) {\n var _a, _b;\n this._isDisposed = false;\n this._connectionFailure = new signaling_1.Signal(this);\n this._isReady = false;\n const defaultDrive = options.defaultDrive;\n const serverSettings = (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n const standby = (_b = options.standby) !== null && _b !== void 0 ? _b : 'when-hidden';\n const normalized = { defaultDrive, serverSettings, standby };\n this.serverSettings = serverSettings;\n this.contents = options.contents || new contents_1.ContentsManager(normalized);\n this.events = options.events || new event_1.EventManager(normalized);\n this.kernels = options.kernels || new kernel_1.KernelManager(normalized);\n this.sessions =\n options.sessions ||\n new session_1.SessionManager({\n ...normalized,\n kernelManager: this.kernels\n });\n this.settings = options.settings || new setting_1.SettingManager(normalized);\n this.terminals = options.terminals || new terminal_1.TerminalManager(normalized);\n this.builder = options.builder || new builder_1.BuildManager(normalized);\n this.workspaces = options.workspaces || new workspace_1.WorkspaceManager(normalized);\n this.nbconvert = options.nbconvert || new nbconvert_1.NbConvertManager(normalized);\n this.kernelspecs = options.kernelspecs || new kernelspec_1.KernelSpecManager(normalized);\n this.user = options.user || new user_1.UserManager(normalized);\n // Proxy all connection failures from the individual service managers.\n this.kernelspecs.connectionFailure.connect(this._onConnectionFailure, this);\n this.sessions.connectionFailure.connect(this._onConnectionFailure, this);\n this.terminals.connectionFailure.connect(this._onConnectionFailure, this);\n // Define promises that need to be resolved before service manager is ready.\n const readyList = [this.sessions.ready, this.kernelspecs.ready];\n if (this.terminals.isAvailable()) {\n readyList.push(this.terminals.ready);\n }\n this._readyPromise = Promise.all(readyList).then(() => {\n this._isReady = true;\n });\n }\n /**\n * A signal emitted when there is a connection failure with the kernel.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Test whether the service manager is disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._isDisposed = true;\n signaling_1.Signal.clearData(this);\n this.contents.dispose();\n this.events.dispose();\n this.sessions.dispose();\n this.terminals.dispose();\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._readyPromise;\n }\n _onConnectionFailure(sender, err) {\n this._connectionFailure.emit(err);\n }\n}\nexports.ServiceManager = ServiceManager;\n//# sourceMappingURL=manager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NbConvertManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst serverconnection_1 = require(\"../serverconnection\");\nconst coreutils_2 = require(\"@lumino/coreutils\");\n/**\n * The url for the lab nbconvert service.\n */\nconst NBCONVERT_SETTINGS_URL = 'api/nbconvert';\n/**\n * The nbconvert API service manager.\n */\nclass NbConvertManager {\n /**\n * Create a new nbconvert manager.\n */\n constructor(options = {}) {\n var _a;\n this._exportFormats = null;\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n }\n /**\n * Fetch and cache the export formats from the expensive nbconvert handler.\n */\n async fetchExportFormats() {\n this._requestingFormats = new coreutils_2.PromiseDelegate();\n this._exportFormats = null;\n const base = this.serverSettings.baseUrl;\n const url = coreutils_1.URLExt.join(base, NBCONVERT_SETTINGS_URL);\n const { serverSettings } = this;\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, serverSettings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n const exportList = {};\n const keys = Object.keys(data);\n keys.forEach(function (key) {\n const mimeType = data[key].output_mimetype;\n exportList[key] = { output_mimetype: mimeType };\n });\n this._exportFormats = exportList;\n this._requestingFormats.resolve(exportList);\n return exportList;\n }\n /**\n * Get the list of export formats, preferring pre-cached ones.\n */\n async getExportFormats(force = true) {\n if (this._requestingFormats) {\n return this._requestingFormats.promise;\n }\n if (force || !this._exportFormats) {\n return await this.fetchExportFormats();\n }\n return this._exportFormats;\n }\n}\nexports.NbConvertManager = NbConvertManager;\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ServerConnection = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nlet WEBSOCKET;\nif (typeof window === 'undefined') {\n // Mangle the require statements so it does not get picked up in the\n // browser assets.\n WEBSOCKET = require('ws');\n}\nelse {\n WEBSOCKET = WebSocket;\n}\n/**\n * The namespace for ServerConnection functions.\n *\n * #### Notes\n * This is only intended to manage communication with the Jupyter server.\n *\n * The default values can be used in a JupyterLab or Jupyter Notebook context.\n *\n * We use `token` authentication if available, falling back on an XSRF\n * cookie if one has been provided on the `document`.\n *\n * A content type of `'application/json'` is added when using authentication\n * and there is no body data to allow the server to prevent malicious forms.\n */\nvar ServerConnection;\n(function (ServerConnection) {\n /**\n * Create a settings object given a subset of options.\n *\n * @param options - An optional partial set of options.\n *\n * @returns The full settings object.\n */\n function makeSettings(options) {\n return Private.makeSettings(options);\n }\n ServerConnection.makeSettings = makeSettings;\n /**\n * Make an request to the notebook server.\n *\n * @param url - The url for the request.\n *\n * @param init - The initialization options for the request.\n *\n * @param settings - The server settings to apply to the request.\n *\n * @returns a Promise that resolves with the response.\n *\n * @throws If the url of the request is not a notebook server url.\n *\n * #### Notes\n * The `url` must start with `settings.baseUrl`. The `init` settings are\n * merged with `settings.init`, with `init` taking precedence.\n * The headers in the two objects are not merged.\n * If there is no body data, we set the content type to `application/json`\n * because it is required by the Notebook server.\n */\n function makeRequest(url, init, settings) {\n return Private.handleRequest(url, init, settings);\n }\n ServerConnection.makeRequest = makeRequest;\n /**\n * A wrapped error for a fetch response.\n */\n class ResponseError extends Error {\n /**\n * Create a ResponseError from a response, handling the traceback and message\n * as appropriate.\n *\n * @param response The response object.\n *\n * @returns A promise that resolves with a `ResponseError` object.\n */\n static async create(response) {\n try {\n const data = await response.json();\n const { message, traceback } = data;\n if (traceback) {\n console.error(traceback);\n }\n return new ResponseError(response, message !== null && message !== void 0 ? message : ResponseError._defaultMessage(response), traceback !== null && traceback !== void 0 ? traceback : '');\n }\n catch (e) {\n console.debug(e);\n return new ResponseError(response);\n }\n }\n /**\n * Create a new response error.\n */\n constructor(response, message = ResponseError._defaultMessage(response), traceback = '') {\n super(message);\n this.response = response;\n this.traceback = traceback;\n }\n static _defaultMessage(response) {\n return `Invalid response: ${response.status} ${response.statusText}`;\n }\n }\n ServerConnection.ResponseError = ResponseError;\n /**\n * A wrapped error for a network error.\n */\n class NetworkError extends TypeError {\n /**\n * Create a new network error.\n */\n constructor(original) {\n super(original.message);\n this.stack = original.stack;\n }\n }\n ServerConnection.NetworkError = NetworkError;\n})(ServerConnection = exports.ServerConnection || (exports.ServerConnection = {}));\n/**\n * The namespace for module private data.\n */\nvar Private;\n(function (Private) {\n /**\n * Handle the server connection settings, returning a new value.\n */\n function makeSettings(options = {}) {\n var _a;\n const pageBaseUrl = coreutils_1.PageConfig.getBaseUrl();\n const pageWsUrl = coreutils_1.PageConfig.getWsUrl();\n const baseUrl = coreutils_1.URLExt.normalize(options.baseUrl) || pageBaseUrl;\n let wsUrl = options.wsUrl;\n // Prefer the default wsUrl if we are using the default baseUrl.\n if (!wsUrl && baseUrl === pageBaseUrl) {\n wsUrl = pageWsUrl;\n }\n // Otherwise convert the baseUrl to a wsUrl if possible.\n if (!wsUrl && baseUrl.indexOf('http') === 0) {\n wsUrl = 'ws' + baseUrl.slice(4);\n }\n // Otherwise fall back on the default wsUrl.\n wsUrl = wsUrl !== null && wsUrl !== void 0 ? wsUrl : pageWsUrl;\n return {\n init: { cache: 'no-store', credentials: 'same-origin' },\n fetch,\n Headers,\n Request,\n WebSocket: WEBSOCKET,\n token: coreutils_1.PageConfig.getToken(),\n appUrl: coreutils_1.PageConfig.getOption('appUrl'),\n appendToken: typeof window === 'undefined' ||\n (typeof process !== 'undefined' &&\n ((_a = process === null || process === void 0 ? void 0 : process.env) === null || _a === void 0 ? void 0 : _a.JEST_WORKER_ID) !== undefined) ||\n coreutils_1.URLExt.getHostName(pageBaseUrl) !== coreutils_1.URLExt.getHostName(wsUrl),\n ...options,\n baseUrl,\n wsUrl\n };\n }\n Private.makeSettings = makeSettings;\n /**\n * Handle a request.\n *\n * @param url - The url for the request.\n *\n * @param init - The overrides for the request init.\n *\n * @param settings - The settings object for the request.\n *\n * #### Notes\n * The `url` must start with `settings.baseUrl`. The `init` settings\n * take precedence over `settings.init`.\n */\n function handleRequest(url, init, settings) {\n var _a;\n // Handle notebook server requests.\n if (url.indexOf(settings.baseUrl) !== 0) {\n throw new Error('Can only be used for notebook server requests');\n }\n // Use explicit cache buster when `no-store` is set since\n // not all browsers use it properly.\n const cache = (_a = init.cache) !== null && _a !== void 0 ? _a : settings.init.cache;\n if (cache === 'no-store') {\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n url += (/\\?/.test(url) ? '&' : '?') + new Date().getTime();\n }\n const request = new settings.Request(url, { ...settings.init, ...init });\n // Handle authentication. Authentication can be overdetermined by\n // settings token and XSRF token.\n let authenticated = false;\n if (settings.token) {\n authenticated = true;\n request.headers.append('Authorization', `token ${settings.token}`);\n }\n if (typeof document !== 'undefined' && (document === null || document === void 0 ? void 0 : document.cookie)) {\n const xsrfToken = getCookie('_xsrf');\n if (xsrfToken !== undefined) {\n authenticated = true;\n request.headers.append('X-XSRFToken', xsrfToken);\n }\n }\n // Set the content type if there is no given data and we are\n // using an authenticated connection.\n if (!request.headers.has('Content-Type') && authenticated) {\n request.headers.set('Content-Type', 'application/json');\n }\n // Use `call` to avoid a `TypeError` in the browser.\n return settings.fetch.call(null, request).catch((e) => {\n // Convert the TypeError into a more specific error.\n throw new ServerConnection.NetworkError(e);\n });\n // TODO: *this* is probably where we need a system-wide connectionFailure\n // signal we can hook into.\n }\n Private.handleRequest = handleRequest;\n /**\n * Get a cookie from the document.\n */\n function getCookie(name) {\n // From http://www.tornadoweb.org/en/stable/guide/security.html\n const matches = document.cookie.match('\\\\b' + name + '=([^;]*)\\\\b');\n return matches === null || matches === void 0 ? void 0 : matches[1];\n }\n})(Private || (Private = {}));\n//# sourceMappingURL=serverconnection.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SessionConnection = void 0;\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst restapi_1 = require(\"./restapi\");\nconst coreutils_1 = require(\"@lumino/coreutils\");\n/**\n * Session object for accessing the session REST api. The session\n * should be used to start kernels and then shut them down -- for\n * all other kernel operations, the kernel object should be used.\n */\nclass SessionConnection {\n /**\n * Construct a new session.\n */\n constructor(options) {\n var _a, _b, _c, _d;\n this._id = '';\n this._path = '';\n this._name = '';\n this._type = '';\n this._kernel = null;\n this._isDisposed = false;\n this._disposed = new signaling_1.Signal(this);\n this._kernelChanged = new signaling_1.Signal(this);\n this._statusChanged = new signaling_1.Signal(this);\n this._connectionStatusChanged = new signaling_1.Signal(this);\n this._pendingInput = new signaling_1.Signal(this);\n this._iopubMessage = new signaling_1.Signal(this);\n this._unhandledMessage = new signaling_1.Signal(this);\n this._anyMessage = new signaling_1.Signal(this);\n this._propertyChanged = new signaling_1.Signal(this);\n this._id = options.model.id;\n this._name = options.model.name;\n this._path = options.model.path;\n this._type = options.model.type;\n this._username = (_a = options.username) !== null && _a !== void 0 ? _a : '';\n this._clientId = (_b = options.clientId) !== null && _b !== void 0 ? _b : coreutils_1.UUID.uuid4();\n this._connectToKernel = options.connectToKernel;\n this._kernelConnectionOptions = (_c = options.kernelConnectionOptions) !== null && _c !== void 0 ? _c : {};\n this.serverSettings =\n (_d = options.serverSettings) !== null && _d !== void 0 ? _d : __1.ServerConnection.makeSettings();\n this.setupKernel(options.model.kernel);\n }\n /**\n * A signal emitted when the session is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * A signal emitted when the kernel changes.\n */\n get kernelChanged() {\n return this._kernelChanged;\n }\n /**\n * A signal proxied from the connection about the kernel status.\n */\n get statusChanged() {\n return this._statusChanged;\n }\n /**\n * A signal proxied from the kernel about the connection status.\n */\n get connectionStatusChanged() {\n return this._connectionStatusChanged;\n }\n /**\n * A signal proxied from the kernel pending input.\n */\n get pendingInput() {\n return this._pendingInput;\n }\n /**\n * A signal proxied from the kernel about iopub kernel messages.\n */\n get iopubMessage() {\n return this._iopubMessage;\n }\n /**\n * A signal proxied from the kernel for an unhandled kernel message.\n */\n get unhandledMessage() {\n return this._unhandledMessage;\n }\n /**\n * A signal proxied from the kernel emitted for any kernel message.\n *\n * #### Notes\n * The behavior is undefined if the message is modified during message\n * handling. As such, it should be treated as read-only.\n */\n get anyMessage() {\n return this._anyMessage;\n }\n /**\n * A signal emitted when a session property changes.\n */\n get propertyChanged() {\n return this._propertyChanged;\n }\n /**\n * Get the session id.\n */\n get id() {\n return this._id;\n }\n /**\n * Get the session kernel connection object.\n *\n * #### Notes\n * This is a read-only property, and can be altered by [changeKernel].\n */\n get kernel() {\n return this._kernel;\n }\n /**\n * Get the session path.\n */\n get path() {\n return this._path;\n }\n /**\n * Get the session type.\n */\n get type() {\n return this._type;\n }\n /**\n * Get the session name.\n */\n get name() {\n return this._name;\n }\n /**\n * Get the model associated with the session.\n */\n get model() {\n return {\n id: this.id,\n kernel: this.kernel && { id: this.kernel.id, name: this.kernel.name },\n path: this._path,\n type: this._type,\n name: this._name\n };\n }\n /**\n * Test whether the session has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Update the session based on a session model from the server.\n *\n * #### Notes\n * This only updates this session connection instance. Use `setPath`,\n * `setName`, `setType`, and `changeKernel` to change the session values on\n * the server.\n */\n update(model) {\n const oldModel = this.model;\n this._path = model.path;\n this._name = model.name;\n this._type = model.type;\n if ((this._kernel === null && model.kernel !== null) ||\n (this._kernel !== null && model.kernel === null) ||\n (this._kernel !== null &&\n model.kernel !== null &&\n this._kernel.id !== model.kernel.id)) {\n if (this._kernel !== null) {\n this._kernel.dispose();\n }\n const oldValue = this._kernel || null;\n this.setupKernel(model.kernel);\n const newValue = this._kernel || null;\n this._kernelChanged.emit({ name: 'kernel', oldValue, newValue });\n }\n this._handleModelChange(oldModel);\n }\n /**\n * Dispose of the resources held by the session.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._disposed.emit();\n if (this._kernel) {\n this._kernel.dispose();\n const oldValue = this._kernel;\n this._kernel = null;\n const newValue = this._kernel;\n this._kernelChanged.emit({ name: 'kernel', oldValue, newValue });\n }\n signaling_1.Signal.clearData(this);\n }\n /**\n * Change the session path.\n *\n * @param path - The new session path.\n *\n * @returns A promise that resolves when the session has renamed.\n *\n * #### Notes\n * This uses the Jupyter REST API, and the response is validated.\n * The promise is fulfilled on a valid response and rejected otherwise.\n */\n async setPath(path) {\n if (this.isDisposed) {\n throw new Error('Session is disposed');\n }\n await this._patch({ path });\n }\n /**\n * Change the session name.\n */\n async setName(name) {\n if (this.isDisposed) {\n throw new Error('Session is disposed');\n }\n await this._patch({ name });\n }\n /**\n * Change the session type.\n */\n async setType(type) {\n if (this.isDisposed) {\n throw new Error('Session is disposed');\n }\n await this._patch({ type });\n }\n /**\n * Change the kernel.\n *\n * @param options - The name or id of the new kernel.\n *\n * #### Notes\n * This shuts down the existing kernel and creates a new kernel,\n * keeping the existing session ID and session path.\n */\n async changeKernel(options) {\n if (this.isDisposed) {\n throw new Error('Session is disposed');\n }\n await this._patch({ kernel: options });\n return this.kernel;\n }\n /**\n * Kill the kernel and shutdown the session.\n *\n * @returns - The promise fulfilled on a valid response from the server.\n *\n * #### Notes\n * Uses the [Jupyter Notebook API](https://petstore.swagger.io/?url=https://raw.githubusercontent.com/jupyter-server/jupyter_server/main/jupyter_server/services/api/api.yaml#!/sessions), and validates the response.\n * Disposes of the session and emits a [sessionDied] signal on success.\n */\n async shutdown() {\n if (this.isDisposed) {\n throw new Error('Session is disposed');\n }\n await (0, restapi_1.shutdownSession)(this.id, this.serverSettings);\n this.dispose();\n }\n /**\n * Create a new kernel connection and connect to its signals.\n *\n * #### Notes\n * This method is not meant to be subclassed.\n */\n setupKernel(model) {\n if (model === null) {\n this._kernel = null;\n return;\n }\n const kc = this._connectToKernel({\n ...this._kernelConnectionOptions,\n model,\n username: this._username,\n clientId: this._clientId,\n serverSettings: this.serverSettings\n });\n this._kernel = kc;\n kc.statusChanged.connect(this.onKernelStatus, this);\n kc.connectionStatusChanged.connect(this.onKernelConnectionStatus, this);\n kc.pendingInput.connect(this.onPendingInput, this);\n kc.unhandledMessage.connect(this.onUnhandledMessage, this);\n kc.iopubMessage.connect(this.onIOPubMessage, this);\n kc.anyMessage.connect(this.onAnyMessage, this);\n }\n /**\n * Handle to changes in the Kernel status.\n */\n onKernelStatus(sender, state) {\n this._statusChanged.emit(state);\n }\n /**\n * Handle to changes in the Kernel status.\n */\n onKernelConnectionStatus(sender, state) {\n this._connectionStatusChanged.emit(state);\n }\n /**\n * Handle a change in the pendingInput.\n */\n onPendingInput(sender, state) {\n this._pendingInput.emit(state);\n }\n /**\n * Handle iopub kernel messages.\n */\n onIOPubMessage(sender, msg) {\n this._iopubMessage.emit(msg);\n }\n /**\n * Handle unhandled kernel messages.\n */\n onUnhandledMessage(sender, msg) {\n this._unhandledMessage.emit(msg);\n }\n /**\n * Handle any kernel messages.\n */\n onAnyMessage(sender, args) {\n this._anyMessage.emit(args);\n }\n /**\n * Send a PATCH to the server, updating the session path or the kernel.\n */\n async _patch(body) {\n const model = await (0, restapi_1.updateSession)({ ...body, id: this._id }, this.serverSettings);\n this.update(model);\n return model;\n }\n /**\n * Handle a change to the model.\n */\n _handleModelChange(oldModel) {\n if (oldModel.name !== this._name) {\n this._propertyChanged.emit('name');\n }\n if (oldModel.type !== this._type) {\n this._propertyChanged.emit('type');\n }\n if (oldModel.path !== this._path) {\n this._propertyChanged.emit('path');\n }\n }\n}\nexports.SessionConnection = SessionConnection;\n//# sourceMappingURL=default.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SessionAPI = exports.Session = void 0;\nconst Session = __importStar(require(\"./session\"));\nexports.Session = Session;\nconst SessionAPI = __importStar(require(\"./restapi\"));\nexports.SessionAPI = SessionAPI;\n__exportStar(require(\"./manager\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SessionManager = void 0;\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst serverconnection_1 = require(\"../serverconnection\");\nconst basemanager_1 = require(\"../basemanager\");\nconst default_1 = require(\"./default\");\nconst restapi_1 = require(\"./restapi\");\n/**\n * An implementation of a session manager.\n */\nclass SessionManager extends basemanager_1.BaseManager {\n /**\n * Construct a new session manager.\n *\n * @param options - The default options for each session.\n */\n constructor(options) {\n var _a;\n super(options);\n this._isReady = false;\n this._sessionConnections = new Set();\n this._models = new Map();\n this._runningChanged = new signaling_1.Signal(this);\n this._connectionFailure = new signaling_1.Signal(this);\n // We define these here so they bind `this` correctly\n this._connectToKernel = (options) => {\n return this._kernelManager.connectTo(options);\n };\n this._kernelManager = options.kernelManager;\n // Start model polling with exponential backoff.\n this._pollModels = new polling_1.Poll({\n auto: false,\n factory: () => this.requestRunning(),\n frequency: {\n interval: 10 * 1000,\n backoff: true,\n max: 300 * 1000\n },\n name: `@jupyterlab/services:SessionManager#models`,\n standby: (_a = options.standby) !== null && _a !== void 0 ? _a : 'when-hidden'\n });\n // Initialize internal data.\n this._ready = (async () => {\n await this._pollModels.start();\n await this._pollModels.tick;\n if (this._kernelManager.isActive) {\n await this._kernelManager.ready;\n }\n this._isReady = true;\n })();\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._ready;\n }\n /**\n * A signal emitted when the running sessions change.\n */\n get runningChanged() {\n return this._runningChanged;\n }\n /**\n * A signal emitted when there is a connection failure.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._models.clear();\n this._sessionConnections.forEach(x => x.dispose());\n this._pollModels.dispose();\n super.dispose();\n }\n /*\n * Connect to a running session. See also [[connectToSession]].\n */\n connectTo(options) {\n const sessionConnection = new default_1.SessionConnection({\n ...options,\n connectToKernel: this._connectToKernel,\n serverSettings: this.serverSettings\n });\n this._onStarted(sessionConnection);\n if (!this._models.has(options.model.id)) {\n // We trust the user to connect to an existing session, but we verify\n // asynchronously.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n return sessionConnection;\n }\n /**\n * Create an iterator over the most recent running sessions.\n *\n * @returns A new iterator over the running sessions.\n */\n running() {\n return this._models.values();\n }\n /**\n * Force a refresh of the running sessions.\n *\n * @returns A promise that with the list of running sessions.\n *\n * #### Notes\n * This is not typically meant to be called by the user, since the\n * manager maintains its own internal state.\n */\n async refreshRunning() {\n await this._pollModels.refresh();\n await this._pollModels.tick;\n }\n /**\n * Start a new session. See also [[startNewSession]].\n *\n * @param createOptions - Options for creating the session\n *\n * @param connectOptions - Options for connecting to the session\n */\n async startNew(createOptions, connectOptions = {}) {\n const model = await (0, restapi_1.startSession)(createOptions, this.serverSettings);\n await this.refreshRunning();\n return this.connectTo({ ...connectOptions, model });\n }\n /**\n * Shut down a session by id.\n */\n async shutdown(id) {\n await (0, restapi_1.shutdownSession)(id, this.serverSettings);\n await this.refreshRunning();\n }\n /**\n * Shut down all sessions.\n *\n * @returns A promise that resolves when all of the kernels are shut down.\n */\n async shutdownAll() {\n // Update the list of models to make sure our list is current.\n await this.refreshRunning();\n // Shut down all models.\n await Promise.all([...this._models.keys()].map(id => (0, restapi_1.shutdownSession)(id, this.serverSettings)));\n // Update the list of models to clear out our state.\n await this.refreshRunning();\n }\n /**\n * Find a session associated with a path and stop it if it is the only session\n * using that kernel.\n *\n * @param path - The path in question.\n *\n * @returns A promise that resolves when the relevant sessions are stopped.\n */\n async stopIfNeeded(path) {\n try {\n const sessions = await (0, restapi_1.listRunning)(this.serverSettings);\n const matches = sessions.filter(value => value.path === path);\n if (matches.length === 1) {\n const id = matches[0].id;\n await this.shutdown(id);\n }\n }\n catch (error) {\n /* Always succeed. */\n }\n }\n /**\n * Find a session by id.\n */\n async findById(id) {\n if (this._models.has(id)) {\n return this._models.get(id);\n }\n await this.refreshRunning();\n return this._models.get(id);\n }\n /**\n * Find a session by path.\n */\n async findByPath(path) {\n for (const m of this._models.values()) {\n if (m.path === path) {\n return m;\n }\n }\n await this.refreshRunning();\n for (const m of this._models.values()) {\n if (m.path === path) {\n return m;\n }\n }\n return undefined;\n }\n /**\n * Execute a request to the server to poll running kernels and update state.\n */\n async requestRunning() {\n var _a, _b;\n let models;\n try {\n models = await (0, restapi_1.listRunning)(this.serverSettings);\n }\n catch (err) {\n // Handle network errors, as well as cases where we are on a\n // JupyterHub and the server is not running. JupyterHub returns a\n // 503 (<2.0) or 424 (>2.0) in that case.\n if (err instanceof serverconnection_1.ServerConnection.NetworkError ||\n ((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) === 503 ||\n ((_b = err.response) === null || _b === void 0 ? void 0 : _b.status) === 424) {\n this._connectionFailure.emit(err);\n }\n throw err;\n }\n if (this.isDisposed) {\n return;\n }\n if (this._models.size === models.length &&\n models.every(model => {\n var _a, _b, _c, _d;\n const existing = this._models.get(model.id);\n if (!existing) {\n return false;\n }\n return (((_a = existing.kernel) === null || _a === void 0 ? void 0 : _a.id) === ((_b = model.kernel) === null || _b === void 0 ? void 0 : _b.id) &&\n ((_c = existing.kernel) === null || _c === void 0 ? void 0 : _c.name) === ((_d = model.kernel) === null || _d === void 0 ? void 0 : _d.name) &&\n existing.name === model.name &&\n existing.path === model.path &&\n existing.type === model.type);\n })) {\n // Identical models list (presuming models does not contain duplicate\n // ids), so just return\n return;\n }\n this._models = new Map(models.map(x => [x.id, x]));\n this._sessionConnections.forEach(sc => {\n if (this._models.has(sc.id)) {\n sc.update(this._models.get(sc.id));\n }\n else {\n sc.dispose();\n }\n });\n this._runningChanged.emit(models);\n }\n /**\n * Handle a session starting.\n */\n _onStarted(sessionConnection) {\n this._sessionConnections.add(sessionConnection);\n sessionConnection.disposed.connect(this._onDisposed, this);\n sessionConnection.propertyChanged.connect(this._onChanged, this);\n sessionConnection.kernelChanged.connect(this._onChanged, this);\n }\n _onDisposed(sessionConnection) {\n this._sessionConnections.delete(sessionConnection);\n // A session termination emission could mean the server session is deleted,\n // or that the session JS object is disposed and the session still exists on\n // the server, so we refresh from the server to make sure we reflect the\n // server state.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n _onChanged() {\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n}\nexports.SessionManager = SessionManager;\n/**\n * The namespace for `SessionManager` class statics.\n */\n(function (SessionManager) {\n /**\n * A no-op session manager to be used when starting sessions is not supported.\n */\n class NoopManager extends SessionManager {\n constructor() {\n super(...arguments);\n this._readyPromise = new Promise(() => {\n /* no-op */\n });\n }\n /**\n * Whether the manager is active.\n */\n get isActive() {\n return false;\n }\n /**\n * Used for testing.\n */\n get parentReady() {\n return super.ready;\n }\n /**\n * Start a new session - throw an error since it is not supported.\n */\n async startNew(createOptions, connectOptions = {}) {\n return Promise.reject(new Error('Not implemented in no-op Session Manager'));\n }\n /*\n * Connect to a running session - throw an error since it is not supported.\n */\n connectTo(options) {\n throw Error('Not implemented in no-op Session Manager');\n }\n /**\n * A promise that fulfills when the manager is ready (never).\n */\n get ready() {\n return this.parentReady.then(() => this._readyPromise);\n }\n /**\n * Shut down a session by id - throw an error since it is not supported.\n */\n async shutdown(id) {\n return Promise.reject(new Error('Not implemented in no-op Session Manager'));\n }\n /**\n * Execute a request to the server to poll running sessions and update state.\n */\n async requestRunning() {\n return Promise.resolve();\n }\n }\n SessionManager.NoopManager = NoopManager;\n})(SessionManager = exports.SessionManager || (exports.SessionManager = {}));\n//# sourceMappingURL=manager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.updateSession = exports.startSession = exports.getSessionModel = exports.shutdownSession = exports.getSessionUrl = exports.listRunning = exports.SESSION_SERVICE_URL = void 0;\nconst serverconnection_1 = require(\"../serverconnection\");\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst validate_1 = require(\"./validate\");\n/**\n * The url for the session service.\n */\nexports.SESSION_SERVICE_URL = 'api/sessions';\n/**\n * List the running sessions.\n */\nasync function listRunning(settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.SESSION_SERVICE_URL);\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n if (!Array.isArray(data)) {\n throw new Error('Invalid Session list');\n }\n data.forEach(m => {\n (0, validate_1.updateLegacySessionModel)(m);\n (0, validate_1.validateModel)(m);\n });\n return data;\n}\nexports.listRunning = listRunning;\n/**\n * Get a session url.\n */\nfunction getSessionUrl(baseUrl, id) {\n return coreutils_1.URLExt.join(baseUrl, exports.SESSION_SERVICE_URL, id);\n}\nexports.getSessionUrl = getSessionUrl;\n/**\n * Shut down a session by id.\n */\nasync function shutdownSession(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n var _a;\n const url = getSessionUrl(settings.baseUrl, id);\n const init = { method: 'DELETE' };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status === 404) {\n const data = await response.json();\n const msg = (_a = data.message) !== null && _a !== void 0 ? _a : `The session \"${id}\"\" does not exist on the server`;\n console.warn(msg);\n }\n else if (response.status === 410) {\n throw new serverconnection_1.ServerConnection.ResponseError(response, 'The kernel was deleted but the session was not');\n }\n else if (response.status !== 204) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n}\nexports.shutdownSession = shutdownSession;\n/**\n * Get a full session model from the server by session id string.\n */\nasync function getSessionModel(id, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = getSessionUrl(settings.baseUrl, id);\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.updateLegacySessionModel)(data);\n (0, validate_1.validateModel)(data);\n return data;\n}\nexports.getSessionModel = getSessionModel;\n/**\n * Create a new session, or return an existing session if the session path\n * already exists.\n */\nasync function startSession(options, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.SESSION_SERVICE_URL);\n const init = {\n method: 'POST',\n body: JSON.stringify(options)\n };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 201) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.updateLegacySessionModel)(data);\n (0, validate_1.validateModel)(data);\n return data;\n}\nexports.startSession = startSession;\n/**\n * Send a PATCH to the server, updating the session path or the kernel.\n */\nasync function updateSession(model, settings = serverconnection_1.ServerConnection.makeSettings()) {\n const url = getSessionUrl(settings.baseUrl, model.id);\n const init = {\n method: 'PATCH',\n body: JSON.stringify(model)\n };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n (0, validate_1.updateLegacySessionModel)(data);\n (0, validate_1.validateModel)(data);\n return data;\n}\nexports.updateSession = updateSession;\n//# sourceMappingURL=restapi.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=session.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateModels = exports.updateLegacySessionModel = exports.validateModel = void 0;\nconst validate_1 = require(\"../kernel/validate\");\nconst validate_2 = require(\"../validate\");\n/**\n * Validate an `Session.IModel` object.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction validateModel(data) {\n (0, validate_2.validateProperty)(data, 'id', 'string');\n (0, validate_2.validateProperty)(data, 'type', 'string');\n (0, validate_2.validateProperty)(data, 'name', 'string');\n (0, validate_2.validateProperty)(data, 'path', 'string');\n (0, validate_2.validateProperty)(data, 'kernel', 'object');\n (0, validate_1.validateModel)(data.kernel);\n}\nexports.validateModel = validateModel;\n/**\n * Update model from legacy session data.\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction updateLegacySessionModel(data) {\n if (data.path === undefined && data.notebook !== undefined) {\n data.path = data.notebook.path;\n data.type = 'notebook';\n data.name = '';\n }\n}\nexports.updateLegacySessionModel = updateLegacySessionModel;\n/**\n * Validate an array of `Session.IModel` objects.\n */\nfunction validateModels(models) {\n if (!Array.isArray(models)) {\n throw new Error('Invalid session list');\n }\n models.forEach(d => validateModel(d));\n}\nexports.validateModels = validateModels;\n//# sourceMappingURL=validate.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SettingManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst statedb_1 = require(\"@jupyterlab/statedb\");\nconst serverconnection_1 = require(\"../serverconnection\");\n/**\n * The url for the lab settings service.\n */\nconst SERVICE_SETTINGS_URL = 'api/settings';\n/**\n * The settings API service manager.\n */\nclass SettingManager extends statedb_1.DataConnector {\n /**\n * Create a new setting manager.\n */\n constructor(options = {}) {\n var _a;\n super();\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n }\n /**\n * Fetch a plugin's settings.\n *\n * @param id - The plugin's ID.\n *\n * @returns A promise that resolves if successful.\n */\n async fetch(id) {\n if (!id) {\n throw new Error('Plugin `id` parameter is required for settings fetch.');\n }\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, id);\n const response = await makeRequest(url, {}, serverSettings);\n if (response.status !== 200) {\n const err = await ResponseError.create(response);\n throw err;\n }\n // Assert what type the server response is returning.\n return response.json();\n }\n /**\n * Fetch the list of all plugin setting bundles.\n *\n * @returns A promise that resolves if successful.\n */\n async list(query) {\n var _a, _b, _c, _d;\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, '', query === 'ids');\n const response = await makeRequest(url, {}, serverSettings);\n if (response.status !== 200) {\n throw new ResponseError(response);\n }\n const json = await response.json();\n const ids = (_b = (_a = json === null || json === void 0 ? void 0 : json['settings']) === null || _a === void 0 ? void 0 : _a.map((plugin) => plugin.id)) !== null && _b !== void 0 ? _b : [];\n let values = [];\n if (!query) {\n values =\n (_d = (_c = json === null || json === void 0 ? void 0 : json['settings']) === null || _c === void 0 ? void 0 : _c.map((plugin) => {\n plugin.data = { composite: {}, user: {} };\n return plugin;\n })) !== null && _d !== void 0 ? _d : [];\n }\n return { ids, values };\n }\n /**\n * Save a plugin's settings.\n *\n * @param id - The plugin's ID.\n *\n * @param raw - The user setting values as a raw string of JSON with comments.\n *\n * @returns A promise that resolves if successful.\n */\n async save(id, raw) {\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, id);\n // NOTE: 'raw' is JSON5 (not valid JSON), so we encode it as a string in a valid JSON body\n const init = { body: JSON.stringify({ raw }), method: 'PUT' };\n const response = await makeRequest(url, init, serverSettings);\n if (response.status !== 204) {\n throw new ResponseError(response);\n }\n }\n}\nexports.SettingManager = SettingManager;\n/**\n * A namespace for private data.\n */\nvar Private;\n(function (Private) {\n /**\n * Get the url for a plugin's settings.\n */\n function url(base, id, idsOnly) {\n const idsOnlyParam = idsOnly\n ? coreutils_1.URLExt.objectToQueryString({ ids_only: true })\n : '';\n return `${coreutils_1.URLExt.join(base, SERVICE_SETTINGS_URL, id)}${idsOnlyParam}`;\n }\n Private.url = url;\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","\"use strict\";\n/*\n * Copyright (c) Jupyter Development Team.\n * Distributed under the terms of the Modified BSD License.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = WebSocket;\n//# sourceMappingURL=ws.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TerminalConnection = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst coreutils_2 = require(\"@lumino/coreutils\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst restapi_1 = require(\"./restapi\");\n/**\n * An implementation of a terminal interface.\n */\nclass TerminalConnection {\n /**\n * Construct a new terminal session.\n */\n constructor(options) {\n var _a;\n /**\n * Create the terminal websocket connection and add socket status handlers.\n *\n * #### Notes\n * You are responsible for updating the connection status as appropriate.\n */\n this._createSocket = () => {\n this._errorIfDisposed();\n // Make sure the socket is clear\n this._clearSocket();\n // Update the connection status to reflect opening a new connection.\n this._updateConnectionStatus('connecting');\n const name = this._name;\n const settings = this.serverSettings;\n let url = coreutils_1.URLExt.join(settings.wsUrl, 'terminals', 'websocket', encodeURIComponent(name));\n // If token authentication is in use.\n const token = settings.token;\n if (settings.appendToken && token !== '') {\n url = url + `?token=${encodeURIComponent(token)}`;\n }\n this._ws = new settings.WebSocket(url);\n this._ws.onmessage = this._onWSMessage;\n this._ws.onclose = this._onWSClose;\n this._ws.onerror = this._onWSClose;\n };\n // Websocket messages events are defined as variables to bind `this`\n this._onWSMessage = (event) => {\n if (this._isDisposed) {\n return;\n }\n const data = JSON.parse(event.data);\n // Handle a disconnect message.\n if (data[0] === 'disconnect') {\n this.dispose();\n }\n if (this._connectionStatus === 'connecting') {\n // After reconnection, ignore all messages until a 'setup' message\n // before we are truly connected. Setting the connection status to\n // connected only then means that if we do not get a setup message\n // before our retry timeout, we will delete the websocket and try again.\n if (data[0] === 'setup') {\n this._updateConnectionStatus('connected');\n }\n return;\n }\n this._messageReceived.emit({\n type: data[0],\n content: data.slice(1)\n });\n };\n this._onWSClose = (event) => {\n console.warn(`Terminal websocket closed: ${event.code}`);\n if (!this.isDisposed) {\n this._reconnect();\n }\n };\n this._connectionStatus = 'connecting';\n this._connectionStatusChanged = new signaling_1.Signal(this);\n this._isDisposed = false;\n this._disposed = new signaling_1.Signal(this);\n this._messageReceived = new signaling_1.Signal(this);\n this._reconnectTimeout = null;\n this._ws = null;\n this._noOp = () => {\n /* no-op */\n };\n this._reconnectLimit = 7;\n this._reconnectAttempt = 0;\n this._pendingMessages = [];\n this._name = options.model.name;\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : __1.ServerConnection.makeSettings();\n this._createSocket();\n }\n /**\n * A signal emitted when the session is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * A signal emitted when a message is received from the server.\n */\n get messageReceived() {\n return this._messageReceived;\n }\n /**\n * Get the name of the terminal session.\n */\n get name() {\n return this._name;\n }\n /**\n * Get the model for the terminal session.\n */\n get model() {\n return { name: this._name };\n }\n /**\n * Test whether the session is disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the resources held by the session.\n */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._disposed.emit();\n this._updateConnectionStatus('disconnected');\n this._clearSocket();\n signaling_1.Signal.clearData(this);\n }\n /**\n * Send a message to the terminal session.\n *\n * #### Notes\n * If the connection is down, the message will be queued for sending when\n * the connection comes back up.\n */\n send(message) {\n this._sendMessage(message);\n }\n /**\n * Send a message on the websocket, or possibly queue for later sending.\n *\n * @param queue - whether to queue the message if it cannot be sent\n */\n _sendMessage(message, queue = true) {\n if (this._isDisposed || !message.content) {\n return;\n }\n if (this.connectionStatus === 'connected' && this._ws) {\n const msg = [message.type, ...message.content];\n this._ws.send(JSON.stringify(msg));\n }\n else if (queue) {\n this._pendingMessages.push(message);\n }\n else {\n throw new Error(`Could not send message: ${JSON.stringify(message)}`);\n }\n }\n /**\n * Send pending messages to the kernel.\n */\n _sendPending() {\n // We check to make sure we are still connected each time. For\n // example, if a websocket buffer overflows, it may close, so we should\n // stop sending messages.\n while (this.connectionStatus === 'connected' &&\n this._pendingMessages.length > 0) {\n this._sendMessage(this._pendingMessages[0], false);\n // We shift the message off the queue after the message is sent so that\n // if there is an exception, the message is still pending.\n this._pendingMessages.shift();\n }\n }\n /**\n * Reconnect to a terminal.\n *\n * #### Notes\n * This may try multiple times to reconnect to a terminal, and will sever\n * any existing connection.\n */\n reconnect() {\n this._errorIfDisposed();\n const result = new coreutils_2.PromiseDelegate();\n // Set up a listener for the connection status changing, which accepts or\n // rejects after the retries are done.\n const fulfill = (sender, status) => {\n if (status === 'connected') {\n result.resolve();\n this.connectionStatusChanged.disconnect(fulfill, this);\n }\n else if (status === 'disconnected') {\n result.reject(new Error('Terminal connection disconnected'));\n this.connectionStatusChanged.disconnect(fulfill, this);\n }\n };\n this.connectionStatusChanged.connect(fulfill, this);\n // Reset the reconnect limit so we start the connection attempts fresh\n this._reconnectAttempt = 0;\n // Start the reconnection process, which will also clear any existing\n // connection.\n this._reconnect();\n // Return the promise that should resolve on connection or reject if the\n // retries don't work.\n return result.promise;\n }\n /**\n * Attempt a connection if we have not exhausted connection attempts.\n */\n _reconnect() {\n this._errorIfDisposed();\n // Clear any existing reconnection attempt\n clearTimeout(this._reconnectTimeout);\n // Update the connection status and schedule a possible reconnection.\n if (this._reconnectAttempt < this._reconnectLimit) {\n this._updateConnectionStatus('connecting');\n // The first reconnect attempt should happen immediately, and subsequent\n // attempts should pick a random number in a growing range so that we\n // don't overload the server with synchronized reconnection attempts\n // across multiple kernels.\n const timeout = Private.getRandomIntInclusive(0, 1e3 * (Math.pow(2, this._reconnectAttempt) - 1));\n console.error(`Connection lost, reconnecting in ${Math.floor(timeout / 1000)} seconds.`);\n this._reconnectTimeout = setTimeout(this._createSocket, timeout);\n this._reconnectAttempt += 1;\n }\n else {\n this._updateConnectionStatus('disconnected');\n }\n // Clear the websocket event handlers and the socket itself.\n this._clearSocket();\n }\n /**\n * Forcefully clear the socket state.\n *\n * #### Notes\n * This will clear all socket state without calling any handlers and will\n * not update the connection status. If you call this method, you are\n * responsible for updating the connection status as needed and recreating\n * the socket if you plan to reconnect.\n */\n _clearSocket() {\n if (this._ws !== null) {\n // Clear the websocket event handlers and the socket itself.\n this._ws.onopen = this._noOp;\n this._ws.onclose = this._noOp;\n this._ws.onerror = this._noOp;\n this._ws.onmessage = this._noOp;\n this._ws.close();\n this._ws = null;\n }\n }\n /**\n * Shut down the terminal session.\n */\n async shutdown() {\n await (0, restapi_1.shutdownTerminal)(this.name, this.serverSettings);\n this.dispose();\n }\n /**\n * Clone the current terminal connection.\n */\n clone() {\n return new TerminalConnection(this);\n }\n /**\n * Handle connection status changes.\n */\n _updateConnectionStatus(connectionStatus) {\n if (this._connectionStatus === connectionStatus) {\n return;\n }\n this._connectionStatus = connectionStatus;\n // If we are not 'connecting', stop any reconnection attempts.\n if (connectionStatus !== 'connecting') {\n this._reconnectAttempt = 0;\n clearTimeout(this._reconnectTimeout);\n }\n // Send the pending messages if we just connected.\n if (connectionStatus === 'connected') {\n this._sendPending();\n }\n // Notify others that the connection status changed.\n this._connectionStatusChanged.emit(connectionStatus);\n }\n /**\n * Utility function to throw an error if this instance is disposed.\n */\n _errorIfDisposed() {\n if (this.isDisposed) {\n throw new Error('Terminal connection is disposed');\n }\n }\n /**\n * A signal emitted when the terminal connection status changes.\n */\n get connectionStatusChanged() {\n return this._connectionStatusChanged;\n }\n /**\n * The current connection status of the terminal connection.\n */\n get connectionStatus() {\n return this._connectionStatus;\n }\n}\nexports.TerminalConnection = TerminalConnection;\nvar Private;\n(function (Private) {\n /**\n * Get the url for a terminal.\n */\n function getTermUrl(baseUrl, name) {\n return coreutils_1.URLExt.join(baseUrl, restapi_1.TERMINAL_SERVICE_URL, encodeURIComponent(name));\n }\n Private.getTermUrl = getTermUrl;\n /**\n * Get a random integer between min and max, inclusive of both.\n *\n * #### Notes\n * From\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random#Getting_a_random_integer_between_two_values_inclusive\n *\n * From the MDN page: It might be tempting to use Math.round() to accomplish\n * that, but doing so would cause your random numbers to follow a non-uniform\n * distribution, which may not be acceptable for your needs.\n */\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n Private.getRandomIntInclusive = getRandomIntInclusive;\n})(Private || (Private = {}));\n//# sourceMappingURL=default.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TerminalAPI = exports.Terminal = void 0;\nconst Terminal = __importStar(require(\"./terminal\"));\nexports.Terminal = Terminal;\nconst TerminalAPI = __importStar(require(\"./restapi\"));\nexports.TerminalAPI = TerminalAPI;\n__exportStar(require(\"./manager\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TerminalManager = void 0;\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst __1 = require(\"..\");\nconst basemanager_1 = require(\"../basemanager\");\nconst restapi_1 = require(\"./restapi\");\nconst default_1 = require(\"./default\");\n/**\n * A terminal session manager.\n */\nclass TerminalManager extends basemanager_1.BaseManager {\n /**\n * Construct a new terminal manager.\n */\n constructor(options = {}) {\n var _a;\n super(options);\n this._isReady = false;\n // As an optimization, we unwrap the models to just store the names.\n this._names = [];\n this._terminalConnections = new Set();\n this._runningChanged = new signaling_1.Signal(this);\n this._connectionFailure = new signaling_1.Signal(this);\n // Check if terminals are available\n if (!this.isAvailable()) {\n this._ready = Promise.reject('Terminals unavailable');\n this._ready.catch(_ => undefined);\n return;\n }\n // Start polling with exponential backoff.\n this._pollModels = new polling_1.Poll({\n auto: false,\n factory: () => this.requestRunning(),\n frequency: {\n interval: 10 * 1000,\n backoff: true,\n max: 300 * 1000\n },\n name: `@jupyterlab/services:TerminalManager#models`,\n standby: (_a = options.standby) !== null && _a !== void 0 ? _a : 'when-hidden'\n });\n // Initialize internal data.\n this._ready = (async () => {\n await this._pollModels.start();\n await this._pollModels.tick;\n this._isReady = true;\n })();\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._ready;\n }\n /**\n * A signal emitted when the running terminals change.\n */\n get runningChanged() {\n return this._runningChanged;\n }\n /**\n * A signal emitted when there is a connection failure.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._names.length = 0;\n this._terminalConnections.forEach(x => x.dispose());\n this._pollModels.dispose();\n super.dispose();\n }\n /**\n * Whether the terminal service is available.\n */\n isAvailable() {\n return (0, restapi_1.isAvailable)();\n }\n /*\n * Connect to a running terminal.\n *\n * @param options - The options used to connect to the terminal.\n *\n * @returns The new terminal connection instance.\n *\n * #### Notes\n * The manager `serverSettings` will be used.\n */\n connectTo(options) {\n const terminalConnection = new default_1.TerminalConnection({\n ...options,\n serverSettings: this.serverSettings\n });\n this._onStarted(terminalConnection);\n if (!this._names.includes(options.model.name)) {\n // We trust the user to connect to an existing session, but we verify\n // asynchronously.\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n return terminalConnection;\n }\n /**\n * Create an iterator over the most recent running terminals.\n *\n * @returns A new iterator over the running terminals.\n */\n running() {\n return this._models[Symbol.iterator]();\n }\n /**\n * Force a refresh of the running terminals.\n *\n * @returns A promise that with the list of running terminals.\n *\n * #### Notes\n * This is intended to be called only in response to a user action,\n * since the manager maintains its internal state.\n */\n async refreshRunning() {\n await this._pollModels.refresh();\n await this._pollModels.tick;\n }\n /**\n * Create a new terminal session.\n *\n * @param options - The options used to create the terminal.\n *\n * @returns A promise that resolves with the terminal connection instance.\n *\n * #### Notes\n * The manager `serverSettings` will be used unless overridden in the\n * options.\n */\n async startNew(options) {\n const model = await (0, restapi_1.startNew)(this.serverSettings, options === null || options === void 0 ? void 0 : options.name, options === null || options === void 0 ? void 0 : options.cwd);\n await this.refreshRunning();\n return this.connectTo({ model });\n }\n /**\n * Shut down a terminal session by name.\n */\n async shutdown(name) {\n await (0, restapi_1.shutdownTerminal)(name, this.serverSettings);\n await this.refreshRunning();\n }\n /**\n * Shut down all terminal sessions.\n *\n * @returns A promise that resolves when all of the sessions are shut down.\n */\n async shutdownAll() {\n // Update the list of models to make sure our list is current.\n await this.refreshRunning();\n // Shut down all models.\n await Promise.all(this._names.map(name => (0, restapi_1.shutdownTerminal)(name, this.serverSettings)));\n // Update the list of models to clear out our state.\n await this.refreshRunning();\n }\n /**\n * Execute a request to the server to poll running terminals and update state.\n */\n async requestRunning() {\n var _a, _b;\n let models;\n try {\n models = await (0, restapi_1.listRunning)(this.serverSettings);\n }\n catch (err) {\n // Handle network errors, as well as cases where we are on a\n // JupyterHub and the server is not running. JupyterHub returns a\n // 503 (<2.0) or 424 (>2.0) in that case.\n if (err instanceof __1.ServerConnection.NetworkError ||\n ((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) === 503 ||\n ((_b = err.response) === null || _b === void 0 ? void 0 : _b.status) === 424) {\n this._connectionFailure.emit(err);\n }\n throw err;\n }\n if (this.isDisposed) {\n return;\n }\n const names = models.map(({ name }) => name).sort();\n if (names === this._names) {\n // Identical models list, so just return\n return;\n }\n this._names = names;\n this._terminalConnections.forEach(tc => {\n if (!names.includes(tc.name)) {\n tc.dispose();\n }\n });\n this._runningChanged.emit(this._models);\n }\n /**\n * Handle a session starting.\n */\n _onStarted(terminalConnection) {\n this._terminalConnections.add(terminalConnection);\n terminalConnection.disposed.connect(this._onDisposed, this);\n }\n /**\n * Handle a session terminating.\n */\n _onDisposed(terminalConnection) {\n this._terminalConnections.delete(terminalConnection);\n // Update the running models to make sure we reflect the server state\n void this.refreshRunning().catch(() => {\n /* no-op */\n });\n }\n get _models() {\n return this._names.map(name => {\n return { name };\n });\n }\n}\nexports.TerminalManager = TerminalManager;\n/**\n * The namespace for TerminalManager statics.\n */\n(function (TerminalManager) {\n /**\n * A no-op terminal manager to be used when starting terminals is not supported.\n */\n class NoopManager extends TerminalManager {\n constructor() {\n super(...arguments);\n this._readyPromise = new Promise(() => {\n /* no-op */\n });\n }\n /**\n * Whether the manager is active.\n */\n get isActive() {\n return false;\n }\n /**\n * Used for testing.\n */\n get parentReady() {\n return super.ready;\n }\n /**\n * A promise that fulfills when the manager is ready (never).\n */\n get ready() {\n return this.parentReady.then(() => this._readyPromise);\n }\n /**\n * Create a new terminal session - throw an error since it is not supported.\n *\n */\n async startNew(options) {\n return Promise.reject(new Error('Not implemented in no-op Terminal Manager'));\n }\n /*\n * Connect to a running terminal - throw an error since it is not supported.\n */\n connectTo(options) {\n throw Error('Not implemented in no-op Terminal Manager');\n }\n /**\n * Shut down a session by id - throw an error since it is not supported.\n */\n async shutdown(id) {\n return Promise.reject(new Error('Not implemented in no-op Terminal Manager'));\n }\n /**\n * Execute a request to the server to poll running sessions and update state.\n */\n async requestRunning() {\n return Promise.resolve();\n }\n }\n TerminalManager.NoopManager = NoopManager;\n})(TerminalManager = exports.TerminalManager || (exports.TerminalManager = {}));\n//# sourceMappingURL=manager.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.shutdownTerminal = exports.listRunning = exports.startNew = exports.isAvailable = exports.TERMINAL_SERVICE_URL = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst serverconnection_1 = require(\"../serverconnection\");\n/**\n * The url for the terminal service.\n */\nexports.TERMINAL_SERVICE_URL = 'api/terminals';\n/**\n * Whether the terminal service is available.\n */\nfunction isAvailable() {\n const available = String(coreutils_1.PageConfig.getOption('terminalsAvailable'));\n return available.toLowerCase() === 'true';\n}\nexports.isAvailable = isAvailable;\n/**\n * Start a new terminal session.\n *\n * @param settings - The server settings to use.\n *\n * @param name - The name of the target terminal.\n *\n * @param cwd - The path in which the terminal will start.\n *\n * @returns A promise that resolves with the session model.\n */\nasync function startNew(settings = serverconnection_1.ServerConnection.makeSettings(), name, cwd) {\n Private.errorIfNotAvailable();\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.TERMINAL_SERVICE_URL);\n const init = {\n method: 'POST',\n body: JSON.stringify({ name, cwd })\n };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n // TODO: Validate model\n return data;\n}\nexports.startNew = startNew;\n/**\n * List the running terminal sessions.\n *\n * @param settings - The server settings to use.\n *\n * @returns A promise that resolves with the list of running session models.\n */\nasync function listRunning(settings = serverconnection_1.ServerConnection.makeSettings()) {\n Private.errorIfNotAvailable();\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.TERMINAL_SERVICE_URL);\n const response = await serverconnection_1.ServerConnection.makeRequest(url, {}, settings);\n if (response.status !== 200) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n const data = await response.json();\n if (!Array.isArray(data)) {\n throw new Error('Invalid terminal list');\n }\n // TODO: validate each model\n return data;\n}\nexports.listRunning = listRunning;\n/**\n * Shut down a terminal session by name.\n *\n * @param name - The name of the target session.\n *\n * @param settings - The server settings to use.\n *\n * @returns A promise that resolves when the session is shut down.\n */\nasync function shutdownTerminal(name, settings = serverconnection_1.ServerConnection.makeSettings()) {\n var _a;\n Private.errorIfNotAvailable();\n const url = coreutils_1.URLExt.join(settings.baseUrl, exports.TERMINAL_SERVICE_URL, name);\n const init = { method: 'DELETE' };\n const response = await serverconnection_1.ServerConnection.makeRequest(url, init, settings);\n if (response.status === 404) {\n const data = await response.json();\n const msg = (_a = data.message) !== null && _a !== void 0 ? _a : `The terminal session \"${name}\"\" does not exist on the server`;\n console.warn(msg);\n }\n else if (response.status !== 204) {\n const err = await serverconnection_1.ServerConnection.ResponseError.create(response);\n throw err;\n }\n}\nexports.shutdownTerminal = shutdownTerminal;\nvar Private;\n(function (Private) {\n /**\n * Throw an error if terminals are not available.\n */\n function errorIfNotAvailable() {\n if (!isAvailable()) {\n throw new Error('Terminals Unavailable');\n }\n }\n Private.errorIfNotAvailable = errorIfNotAvailable;\n})(Private || (Private = {}));\n//# sourceMappingURL=restapi.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isAvailable = void 0;\nconst restapi_1 = require(\"./restapi\");\nObject.defineProperty(exports, \"isAvailable\", { enumerable: true, get: function () { return restapi_1.isAvailable; } });\n//# sourceMappingURL=terminal.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UserManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst coreutils_2 = require(\"@lumino/coreutils\");\nconst polling_1 = require(\"@lumino/polling\");\nconst signaling_1 = require(\"@lumino/signaling\");\nconst serverconnection_1 = require(\"../serverconnection\");\nconst basemanager_1 = require(\"../basemanager\");\n/**\n * The url for the lab workspaces service.\n */\nconst SERVICE_USER_URL = 'api/me';\n/**\n * The service's ID.\n * Used to uniquely identify the poll, and\n * the item in local storage.\n */\nconst SERVICE_ID = '@jupyterlab/services:UserManager#user';\n/**\n * The user API service manager.\n */\nclass UserManager extends basemanager_1.BaseManager {\n /**\n * Create a new user manager.\n */\n constructor(options = {}) {\n var _a;\n super(options);\n this._isReady = false;\n this._userChanged = new signaling_1.Signal(this);\n this._connectionFailure = new signaling_1.Signal(this);\n // Initialize internal data.\n this._ready = this.requestUser()\n .then(() => {\n if (this.isDisposed) {\n return;\n }\n this._isReady = true;\n })\n .catch(_ => \n // Return a promise that will never resolve, so user service is never ready\n // This typically occurs when the backend has no user service\n new Promise(() => {\n // no-op\n }));\n this._pollSpecs = new polling_1.Poll({\n auto: false,\n factory: () => this.requestUser(),\n frequency: {\n interval: 61 * 1000,\n backoff: true,\n max: 300 * 1000\n },\n name: SERVICE_ID,\n standby: (_a = options.standby) !== null && _a !== void 0 ? _a : 'when-hidden'\n });\n void this.ready.then(() => {\n void this._pollSpecs.start();\n });\n }\n /**\n * Test whether the manager is ready.\n */\n get isReady() {\n return this._isReady;\n }\n /**\n * A promise that fulfills when the manager is ready.\n */\n get ready() {\n return this._ready;\n }\n /**\n * Get the most recently fetched identity.\n */\n get identity() {\n return this._identity;\n }\n /**\n * Get the most recently fetched permissions.\n */\n get permissions() {\n return this._permissions;\n }\n /**\n * A signal emitted when the user changes.\n */\n get userChanged() {\n return this._userChanged;\n }\n /**\n * A signal emitted when there is a connection failure.\n */\n get connectionFailure() {\n return this._connectionFailure;\n }\n /**\n * Dispose of the resources used by the manager.\n */\n dispose() {\n this._pollSpecs.dispose();\n super.dispose();\n }\n /**\n * Force a refresh of the specs from the server.\n *\n * @returns A promise that resolves when the specs are fetched.\n *\n * #### Notes\n * This is intended to be called only in response to a user action,\n * since the manager maintains its internal state.\n */\n async refreshUser() {\n await this._pollSpecs.refresh();\n await this._pollSpecs.tick;\n }\n /**\n * Execute a request to the server to poll the user and update state.\n */\n async requestUser() {\n if (this.isDisposed) {\n return;\n }\n const { baseUrl } = this.serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const url = coreutils_1.URLExt.join(baseUrl, SERVICE_USER_URL);\n const response = await makeRequest(url, {}, this.serverSettings);\n if (response.status !== 200) {\n const err = await ResponseError.create(response);\n throw err;\n }\n const oldUser = {\n identity: this._identity,\n permissions: this._permissions\n };\n const newUser = await response.json();\n const identity = newUser.identity;\n // store the color and initials for the user\n // this info is not provided by the server\n const { localStorage } = window;\n const data = localStorage.getItem(SERVICE_ID);\n if (data && (!identity.initials || !identity.color)) {\n const localUser = JSON.parse(data);\n identity.initials =\n identity.initials ||\n localUser.initials ||\n identity.name.substring(0, 1);\n identity.color =\n identity.color || localUser.color || Private.getRandomColor();\n }\n if (!coreutils_2.JSONExt.deepEqual(newUser, oldUser)) {\n this._identity = identity;\n this._permissions = newUser.permissions;\n localStorage.setItem(SERVICE_ID, JSON.stringify(identity));\n this._userChanged.emit(newUser);\n }\n }\n}\nexports.UserManager = UserManager;\n/**\n * A namespace for module-private functionality.\n *\n * Note: We do not want to export this function\n * to move it to css variables in the Theme.\n */\nvar Private;\n(function (Private) {\n /**\n * Predefined colors for users\n */\n const userColors = [\n 'var(--jp-collaborator-color1)',\n 'var(--jp-collaborator-color2)',\n 'var(--jp-collaborator-color3)',\n 'var(--jp-collaborator-color4)',\n 'var(--jp-collaborator-color5)',\n 'var(--jp-collaborator-color6)',\n 'var(--jp-collaborator-color7)'\n ];\n /**\n * Get a random color from the list of colors.\n */\n Private.getRandomColor = () => userColors[Math.floor(Math.random() * userColors.length)];\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.validateProperty = void 0;\n/**\n * Validate a property as being on an object, and optionally\n * of a given type and among a given set of values.\n */\nfunction validateProperty(\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nobject, name, typeName, values = []) {\n if (!object.hasOwnProperty(name)) {\n throw Error(`Missing property '${name}'`);\n }\n const value = object[name];\n if (typeName !== void 0) {\n let valid = true;\n switch (typeName) {\n case 'array':\n valid = Array.isArray(value);\n break;\n case 'object':\n valid = typeof value !== 'undefined';\n break;\n default:\n valid = typeof value === typeName;\n }\n if (!valid) {\n throw new Error(`Property '${name}' is not of type '${typeName}'`);\n }\n if (values.length > 0) {\n let valid = true;\n switch (typeName) {\n case 'string':\n case 'number':\n case 'boolean':\n valid = values.includes(value);\n break;\n default:\n valid = values.findIndex(v => v === value) >= 0;\n break;\n }\n if (!valid) {\n throw new Error(`Property '${name}' is not one of the valid values ${JSON.stringify(values)}`);\n }\n }\n }\n}\nexports.validateProperty = validateProperty;\n//# sourceMappingURL=validate.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WorkspaceManager = void 0;\nconst coreutils_1 = require(\"@jupyterlab/coreutils\");\nconst statedb_1 = require(\"@jupyterlab/statedb\");\nconst serverconnection_1 = require(\"../serverconnection\");\n/**\n * The url for the lab workspaces service.\n */\nconst SERVICE_WORKSPACES_URL = 'api/workspaces';\n/**\n * The workspaces API service manager.\n */\nclass WorkspaceManager extends statedb_1.DataConnector {\n /**\n * Create a new workspace manager.\n */\n constructor(options = {}) {\n var _a;\n super();\n this.serverSettings =\n (_a = options.serverSettings) !== null && _a !== void 0 ? _a : serverconnection_1.ServerConnection.makeSettings();\n }\n /**\n * Fetch a workspace.\n *\n * @param id - The workspace's ID.\n *\n * @returns A promise that resolves if successful.\n */\n async fetch(id) {\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, id);\n const response = await makeRequest(url, {}, serverSettings);\n if (response.status !== 200) {\n const err = await ResponseError.create(response);\n throw err;\n }\n return response.json();\n }\n /**\n * Fetch the list of workspace IDs that exist on the server.\n *\n * @returns A promise that resolves if successful.\n */\n async list() {\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, '');\n const response = await makeRequest(url, {}, serverSettings);\n if (response.status !== 200) {\n const err = await ResponseError.create(response);\n throw err;\n }\n const result = await response.json();\n return result.workspaces;\n }\n /**\n * Remove a workspace from the server.\n *\n * @param id - The workspaces's ID.\n *\n * @returns A promise that resolves if successful.\n */\n async remove(id) {\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, id);\n const init = { method: 'DELETE' };\n const response = await makeRequest(url, init, serverSettings);\n if (response.status !== 204) {\n const err = await ResponseError.create(response);\n throw err;\n }\n }\n /**\n * Save a workspace.\n *\n * @param id - The workspace's ID.\n *\n * @param workspace - The workspace being saved.\n *\n * @returns A promise that resolves if successful.\n */\n async save(id, workspace) {\n const { serverSettings } = this;\n const { baseUrl, appUrl } = serverSettings;\n const { makeRequest, ResponseError } = serverconnection_1.ServerConnection;\n const base = baseUrl + appUrl;\n const url = Private.url(base, id);\n const init = { body: JSON.stringify(workspace), method: 'PUT' };\n const response = await makeRequest(url, init, serverSettings);\n if (response.status !== 204) {\n const err = await ResponseError.create(response);\n throw err;\n }\n }\n}\nexports.WorkspaceManager = WorkspaceManager;\n/**\n * A namespace for private data.\n */\nvar Private;\n(function (Private) {\n /**\n * Get the url for a workspace.\n */\n function url(base, id) {\n return coreutils_1.URLExt.join(base, SERVICE_WORKSPACES_URL, id);\n }\n Private.url = url;\n})(Private || (Private = {}));\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DataConnector = void 0;\n/**\n * An abstract class that adheres to the data connector interface.\n *\n * @typeparam T - The basic entity response type a service's connector.\n *\n * @typeparam U - The basic entity request type, which is conventionally the\n * same as the response type but may be different if a service's implementation\n * requires input data to be different from output responses. Defaults to `T`.\n *\n * @typeparam V - The basic token applied to a request, conventionally a string\n * ID or filter, but may be set to a different type when an implementation\n * requires it. Defaults to `string`.\n *\n * @typeparam W - The type of the optional `query` parameter of the `list`\n * method. Defaults to `string`.\n *\n * #### Notes\n * The only abstract method in this class is the `fetch` method, which must be\n * reimplemented by all subclasses. The `remove` and `save` methods have a\n * default implementation that returns a promise that will always reject. This\n * class is a convenience superclass for connectors that only need to `fetch`.\n */\nclass DataConnector {\n /**\n * Retrieve the list of items available from the data connector.\n *\n * @param query - The optional query filter to apply to the connector request.\n *\n * @returns A promise that always rejects with an error.\n *\n * #### Notes\n * Subclasses should reimplement if they support a back-end that can list.\n */\n async list(query) {\n throw new Error('DataConnector#list method has not been implemented.');\n }\n /**\n * Remove a value using the data connector.\n *\n * @param id - The identifier for the data being removed.\n *\n * @returns A promise that always rejects with an error.\n *\n * #### Notes\n * Subclasses should reimplement if they support a back-end that can remove.\n */\n async remove(id) {\n throw new Error('DataConnector#remove method has not been implemented.');\n }\n /**\n * Save a value using the data connector.\n *\n * @param id - The identifier for the data being saved.\n *\n * @param value - The data being saved.\n *\n * @returns A promise that always rejects with an error.\n *\n * #### Notes\n * Subclasses should reimplement if they support a back-end that can save.\n */\n async save(id, value) {\n throw new Error('DataConnector#save method has not been implemented.');\n }\n}\nexports.DataConnector = DataConnector;\n//# sourceMappingURL=dataconnector.js.map","\"use strict\";\n/* -----------------------------------------------------------------------------\n| Copyright (c) Jupyter Development Team.\n| Distributed under the terms of the Modified BSD License.\n|----------------------------------------------------------------------------*/\n/**\n * @packageDocumentation\n * @module statedb\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./dataconnector\"), exports);\n__exportStar(require(\"./interfaces\"), exports);\n__exportStar(require(\"./restorablepool\"), exports);\n__exportStar(require(\"./statedb\"), exports);\n__exportStar(require(\"./tokens\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=interfaces.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RestorablePool = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\nconst properties_1 = require(\"@lumino/properties\");\nconst signaling_1 = require(\"@lumino/signaling\");\n/**\n * An object pool that supports restoration.\n *\n * @typeparam T - The type of object being tracked.\n */\nclass RestorablePool {\n /**\n * Create a new restorable pool.\n *\n * @param options - The instantiation options for a restorable pool.\n */\n constructor(options) {\n this._added = new signaling_1.Signal(this);\n this._current = null;\n this._currentChanged = new signaling_1.Signal(this);\n this._hasRestored = false;\n this._isDisposed = false;\n this._objects = new Set();\n this._restore = null;\n this._restored = new coreutils_1.PromiseDelegate();\n this._updated = new signaling_1.Signal(this);\n this.namespace = options.namespace;\n }\n /**\n * A signal emitted when an object object is added.\n *\n * #### Notes\n * This signal will only fire when an object is added to the pool.\n * It will not fire if an object injected into the pool.\n */\n get added() {\n return this._added;\n }\n /**\n * The current object.\n *\n * #### Notes\n * The restorable pool does not set `current`. It is intended for client use.\n *\n * If `current` is set to an object that does not exist in the pool, it is a\n * no-op.\n */\n get current() {\n return this._current;\n }\n set current(obj) {\n if (this._current === obj) {\n return;\n }\n if (obj !== null && this._objects.has(obj)) {\n this._current = obj;\n this._currentChanged.emit(this._current);\n }\n }\n /**\n * A signal emitted when the current widget changes.\n */\n get currentChanged() {\n return this._currentChanged;\n }\n /**\n * Test whether the pool is disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * A promise resolved when the restorable pool has been restored.\n */\n get restored() {\n return this._restored.promise;\n }\n /**\n * The number of objects held by the pool.\n */\n get size() {\n return this._objects.size;\n }\n /**\n * A signal emitted when an object is updated.\n */\n get updated() {\n return this._updated;\n }\n /**\n * Add a new object to the pool.\n *\n * @param obj - The object object being added.\n *\n * #### Notes\n * The object passed into the pool is added synchronously; its existence in\n * the pool can be checked with the `has()` method. The promise this method\n * returns resolves after the object has been added and saved to an underlying\n * restoration connector, if one is available.\n */\n async add(obj) {\n var _a, _b;\n if (obj.isDisposed) {\n const warning = 'A disposed object cannot be added.';\n console.warn(warning, obj);\n throw new Error(warning);\n }\n if (this._objects.has(obj)) {\n const warning = 'This object already exists in the pool.';\n console.warn(warning, obj);\n throw new Error(warning);\n }\n this._objects.add(obj);\n obj.disposed.connect(this._onInstanceDisposed, this);\n if (Private.injectedProperty.get(obj)) {\n return;\n }\n if (this._restore) {\n const { connector } = this._restore;\n const objName = this._restore.name(obj);\n if (objName) {\n const name = `${this.namespace}:${objName}`;\n const data = (_b = (_a = this._restore).args) === null || _b === void 0 ? void 0 : _b.call(_a, obj);\n Private.nameProperty.set(obj, name);\n await connector.save(name, { data });\n }\n }\n // Emit the added signal.\n this._added.emit(obj);\n }\n /**\n * Dispose of the resources held by the pool.\n *\n * #### Notes\n * Disposing a pool does not affect the underlying data in the data connector,\n * it simply disposes the client-side pool without making any connector calls.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._current = null;\n this._isDisposed = true;\n this._objects.clear();\n signaling_1.Signal.clearData(this);\n }\n /**\n * Find the first object in the pool that satisfies a filter function.\n *\n * @param - fn The filter function to call on each object.\n */\n find(fn) {\n const values = this._objects.values();\n for (const value of values) {\n if (fn(value)) {\n return value;\n }\n }\n return undefined;\n }\n /**\n * Iterate through each object in the pool.\n *\n * @param fn - The function to call on each object.\n */\n forEach(fn) {\n this._objects.forEach(fn);\n }\n /**\n * Filter the objects in the pool based on a predicate.\n *\n * @param fn - The function by which to filter.\n */\n filter(fn) {\n const filtered = [];\n this.forEach(obj => {\n if (fn(obj)) {\n filtered.push(obj);\n }\n });\n return filtered;\n }\n /**\n * Inject an object into the restorable pool without the pool handling its\n * restoration lifecycle.\n *\n * @param obj - The object to inject into the pool.\n */\n inject(obj) {\n Private.injectedProperty.set(obj, true);\n return this.add(obj);\n }\n /**\n * Check if this pool has the specified object.\n *\n * @param obj - The object whose existence is being checked.\n */\n has(obj) {\n return this._objects.has(obj);\n }\n /**\n * Restore the objects in this pool's namespace.\n *\n * @param options - The configuration options that describe restoration.\n *\n * @returns A promise that resolves when restoration has completed.\n *\n * #### Notes\n * This function should almost never be invoked by client code. Its primary\n * use case is to be invoked by a layout restorer plugin that handles\n * multiple restorable pools and, when ready, asks them each to restore their\n * respective objects.\n */\n async restore(options) {\n if (this._hasRestored) {\n throw new Error('This pool has already been restored.');\n }\n this._hasRestored = true;\n const { command, connector, registry, when } = options;\n const namespace = this.namespace;\n const promises = when\n ? [connector.list(namespace)].concat(when)\n : [connector.list(namespace)];\n this._restore = options;\n const [saved] = await Promise.all(promises);\n const values = await Promise.all(saved.ids.map(async (id, index) => {\n const value = saved.values[index];\n const args = value && value.data;\n if (args === undefined) {\n return connector.remove(id);\n }\n // Execute the command and if it fails, delete the state restore data.\n return registry\n .execute(command, args)\n .catch(() => connector.remove(id));\n }));\n this._restored.resolve();\n return values;\n }\n /**\n * Save the restore data for a given object.\n *\n * @param obj - The object being saved.\n */\n async save(obj) {\n var _a, _b;\n const injected = Private.injectedProperty.get(obj);\n if (!this._restore || !this.has(obj) || injected) {\n return;\n }\n const { connector } = this._restore;\n const objName = this._restore.name(obj);\n const oldName = Private.nameProperty.get(obj);\n const newName = objName ? `${this.namespace}:${objName}` : '';\n if (oldName && oldName !== newName) {\n await connector.remove(oldName);\n }\n // Set the name property irrespective of whether the new name is null.\n Private.nameProperty.set(obj, newName);\n if (newName) {\n const data = (_b = (_a = this._restore).args) === null || _b === void 0 ? void 0 : _b.call(_a, obj);\n await connector.save(newName, { data });\n }\n if (oldName !== newName) {\n this._updated.emit(obj);\n }\n }\n /**\n * Clean up after disposed objects.\n */\n _onInstanceDisposed(obj) {\n this._objects.delete(obj);\n if (obj === this._current) {\n this._current = null;\n this._currentChanged.emit(this._current);\n }\n if (Private.injectedProperty.get(obj)) {\n return;\n }\n if (!this._restore) {\n return;\n }\n const { connector } = this._restore;\n const name = Private.nameProperty.get(obj);\n if (name) {\n void connector.remove(name);\n }\n }\n}\nexports.RestorablePool = RestorablePool;\n/*\n * A namespace for private data.\n */\nvar Private;\n(function (Private) {\n /**\n * An attached property to indicate whether an object has been injected.\n */\n Private.injectedProperty = new properties_1.AttachedProperty({\n name: 'injected',\n create: () => false\n });\n /**\n * An attached property for an object's ID.\n */\n Private.nameProperty = new properties_1.AttachedProperty({\n name: 'name',\n create: () => ''\n });\n})(Private || (Private = {}));\n//# sourceMappingURL=restorablepool.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StateDB = void 0;\nconst signaling_1 = require(\"@lumino/signaling\");\n/**\n * The default concrete implementation of a state database.\n */\nclass StateDB {\n /**\n * Create a new state database.\n *\n * @param options - The instantiation options for a state database.\n */\n constructor(options = {}) {\n this._changed = new signaling_1.Signal(this);\n const { connector, transform } = options;\n this._connector = connector || new StateDB.Connector();\n if (!transform) {\n this._ready = Promise.resolve(undefined);\n }\n else {\n this._ready = transform.then(transformation => {\n const { contents, type } = transformation;\n switch (type) {\n case 'cancel':\n return;\n case 'clear':\n return this._clear();\n case 'merge':\n return this._merge(contents || {});\n case 'overwrite':\n return this._overwrite(contents || {});\n default:\n return;\n }\n });\n }\n }\n /**\n * A signal that emits the change type any time a value changes.\n */\n get changed() {\n return this._changed;\n }\n /**\n * Clear the entire database.\n */\n async clear() {\n await this._ready;\n await this._clear();\n }\n /**\n * Retrieve a saved bundle from the database.\n *\n * @param id - The identifier used to retrieve a data bundle.\n *\n * @returns A promise that bears a data payload if available.\n *\n * #### Notes\n * The `id` values of stored items in the state database are formatted:\n * `'namespace:identifier'`, which is the same convention that command\n * identifiers in JupyterLab use as well. While this is not a technical\n * requirement for `fetch()`, `remove()`, and `save()`, it *is* necessary for\n * using the `list(namespace: string)` method.\n *\n * The promise returned by this method may be rejected if an error occurs in\n * retrieving the data. Non-existence of an `id` will succeed with the `value`\n * `undefined`.\n */\n async fetch(id) {\n await this._ready;\n return this._fetch(id);\n }\n /**\n * Retrieve all the saved bundles for a namespace.\n *\n * @param filter - The namespace prefix to retrieve.\n *\n * @returns A promise that bears a collection of payloads for a namespace.\n *\n * #### Notes\n * Namespaces are entirely conventional entities. The `id` values of stored\n * items in the state database are formatted: `'namespace:identifier'`, which\n * is the same convention that command identifiers in JupyterLab use as well.\n *\n * If there are any errors in retrieving the data, they will be logged to the\n * console in order to optimistically return any extant data without failing.\n * This promise will always succeed.\n */\n async list(namespace) {\n await this._ready;\n return this._list(namespace);\n }\n /**\n * Remove a value from the database.\n *\n * @param id - The identifier for the data being removed.\n *\n * @returns A promise that is rejected if remove fails and succeeds otherwise.\n */\n async remove(id) {\n await this._ready;\n await this._remove(id);\n this._changed.emit({ id, type: 'remove' });\n }\n /**\n * Save a value in the database.\n *\n * @param id - The identifier for the data being saved.\n *\n * @param value - The data being saved.\n *\n * @returns A promise that is rejected if saving fails and succeeds otherwise.\n *\n * #### Notes\n * The `id` values of stored items in the state database are formatted:\n * `'namespace:identifier'`, which is the same convention that command\n * identifiers in JupyterLab use as well. While this is not a technical\n * requirement for `fetch()`, `remove()`, and `save()`, it *is* necessary for\n * using the `list(namespace: string)` method.\n */\n async save(id, value) {\n await this._ready;\n await this._save(id, value);\n this._changed.emit({ id, type: 'save' });\n }\n /**\n * Return a serialized copy of the state database's entire contents.\n *\n * @returns A promise that resolves with the database contents as JSON.\n */\n async toJSON() {\n await this._ready;\n const { ids, values } = await this._list();\n return values.reduce((acc, val, idx) => {\n acc[ids[idx]] = val;\n return acc;\n }, {});\n }\n /**\n * Clear the entire database.\n */\n async _clear() {\n await Promise.all((await this._list()).ids.map(id => this._remove(id)));\n }\n /**\n * Fetch a value from the database.\n */\n async _fetch(id) {\n const value = await this._connector.fetch(id);\n if (value) {\n return JSON.parse(value).v;\n }\n }\n /**\n * Fetch a list from the database.\n */\n async _list(namespace = '') {\n const { ids, values } = await this._connector.list(namespace);\n return {\n ids,\n values: values.map(val => JSON.parse(val).v)\n };\n }\n /**\n * Merge data into the state database.\n */\n async _merge(contents) {\n await Promise.all(Object.keys(contents).map(key => contents[key] && this._save(key, contents[key])));\n }\n /**\n * Overwrite the entire database with new contents.\n */\n async _overwrite(contents) {\n await this._clear();\n await this._merge(contents);\n }\n /**\n * Remove a key in the database.\n */\n async _remove(id) {\n return this._connector.remove(id);\n }\n /**\n * Save a key and its value in the database.\n */\n async _save(id, value) {\n return this._connector.save(id, JSON.stringify({ v: value }));\n }\n}\nexports.StateDB = StateDB;\n/**\n * A namespace for StateDB statics.\n */\n(function (StateDB) {\n /**\n * An in-memory string key/value data connector.\n */\n class Connector {\n constructor() {\n this._storage = {};\n }\n /**\n * Retrieve an item from the data connector.\n */\n async fetch(id) {\n return this._storage[id];\n }\n /**\n * Retrieve the list of items available from the data connector.\n *\n * @param namespace - If not empty, only keys whose first token before `:`\n * exactly match `namespace` will be returned, e.g. `foo` in `foo:bar`.\n */\n async list(namespace = '') {\n return Object.keys(this._storage).reduce((acc, val) => {\n if (namespace === '' ? true : namespace === val.split(':')[0]) {\n acc.ids.push(val);\n acc.values.push(this._storage[val]);\n }\n return acc;\n }, { ids: [], values: [] });\n }\n /**\n * Remove a value using the data connector.\n */\n async remove(id) {\n delete this._storage[id];\n }\n /**\n * Save a value using the data connector.\n */\n async save(id, value) {\n this._storage[id] = value;\n }\n }\n StateDB.Connector = Connector;\n})(StateDB = exports.StateDB || (exports.StateDB = {}));\n//# sourceMappingURL=statedb.js.map","\"use strict\";\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IStateDB = void 0;\nconst coreutils_1 = require(\"@lumino/coreutils\");\n/**\n * The default state database token.\n */\nexports.IStateDB = new coreutils_1.Token('@jupyterlab/coreutils:IStateDB', `A service for the JupyterLab state database.\n Use this if you want to store data that will persist across page loads.\n See \"state database\" for more information.`);\n//# sourceMappingURL=tokens.js.map","// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * The namespace for array-specific algorithms.\n */\nvar ArrayExt;\n(function (ArrayExt) {\n /**\n * Find the index of the first occurrence of a value in an array.\n *\n * @param array - The array-like object to search.\n *\n * @param value - The value to locate in the array. Values are\n * compared using strict `===` equality.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the first occurrence of the value, or `-1`\n * if the value is not found.\n *\n * #### Notes\n * If `stop < start` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = ['one', 'two', 'three', 'four', 'one'];\n * ArrayExt.firstIndexOf(data, 'red'); // -1\n * ArrayExt.firstIndexOf(data, 'one'); // 0\n * ArrayExt.firstIndexOf(data, 'one', 1); // 4\n * ArrayExt.firstIndexOf(data, 'two', 2); // -1\n * ArrayExt.firstIndexOf(data, 'two', 2, 1); // 1\n * ```\n */\n function firstIndexOf(array, value, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return -1;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let span;\n if (stop < start) {\n span = stop + 1 + (n - start);\n }\n else {\n span = stop - start + 1;\n }\n for (let i = 0; i < span; ++i) {\n let j = (start + i) % n;\n if (array[j] === value) {\n return j;\n }\n }\n return -1;\n }\n ArrayExt.firstIndexOf = firstIndexOf;\n /**\n * Find the index of the last occurrence of a value in an array.\n *\n * @param array - The array-like object to search.\n *\n * @param value - The value to locate in the array. Values are\n * compared using strict `===` equality.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the last occurrence of the value, or `-1`\n * if the value is not found.\n *\n * #### Notes\n * If `start < stop` the search will wrap at the front of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = ['one', 'two', 'three', 'four', 'one'];\n * ArrayExt.lastIndexOf(data, 'red'); // -1\n * ArrayExt.lastIndexOf(data, 'one'); // 4\n * ArrayExt.lastIndexOf(data, 'one', 1); // 0\n * ArrayExt.lastIndexOf(data, 'two', 0); // -1\n * ArrayExt.lastIndexOf(data, 'two', 0, 1); // 1\n * ```\n */\n function lastIndexOf(array, value, start = -1, stop = 0) {\n let n = array.length;\n if (n === 0) {\n return -1;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let span;\n if (start < stop) {\n span = start + 1 + (n - stop);\n }\n else {\n span = start - stop + 1;\n }\n for (let i = 0; i < span; ++i) {\n let j = (start - i + n) % n;\n if (array[j] === value) {\n return j;\n }\n }\n return -1;\n }\n ArrayExt.lastIndexOf = lastIndexOf;\n /**\n * Find the index of the first value which matches a predicate.\n *\n * @param array - The array-like object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the first matching value, or `-1` if no\n * matching value is found.\n *\n * #### Notes\n * If `stop < start` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [1, 2, 3, 4, 3, 2, 1];\n * ArrayExt.findFirstIndex(data, isEven); // 1\n * ArrayExt.findFirstIndex(data, isEven, 4); // 5\n * ArrayExt.findFirstIndex(data, isEven, 6); // -1\n * ArrayExt.findFirstIndex(data, isEven, 6, 5); // 1\n * ```\n */\n function findFirstIndex(array, fn, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return -1;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let span;\n if (stop < start) {\n span = stop + 1 + (n - start);\n }\n else {\n span = stop - start + 1;\n }\n for (let i = 0; i < span; ++i) {\n let j = (start + i) % n;\n if (fn(array[j], j)) {\n return j;\n }\n }\n return -1;\n }\n ArrayExt.findFirstIndex = findFirstIndex;\n /**\n * Find the index of the last value which matches a predicate.\n *\n * @param object - The array-like object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the last matching value, or `-1` if no\n * matching value is found.\n *\n * #### Notes\n * If `start < stop` the search will wrap at the front of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [1, 2, 3, 4, 3, 2, 1];\n * ArrayExt.findLastIndex(data, isEven); // 5\n * ArrayExt.findLastIndex(data, isEven, 4); // 3\n * ArrayExt.findLastIndex(data, isEven, 0); // -1\n * ArrayExt.findLastIndex(data, isEven, 0, 1); // 5\n * ```\n */\n function findLastIndex(array, fn, start = -1, stop = 0) {\n let n = array.length;\n if (n === 0) {\n return -1;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let d;\n if (start < stop) {\n d = start + 1 + (n - stop);\n }\n else {\n d = start - stop + 1;\n }\n for (let i = 0; i < d; ++i) {\n let j = (start - i + n) % n;\n if (fn(array[j], j)) {\n return j;\n }\n }\n return -1;\n }\n ArrayExt.findLastIndex = findLastIndex;\n /**\n * Find the first value which matches a predicate.\n *\n * @param array - The array-like object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The first matching value, or `undefined` if no matching\n * value is found.\n *\n * #### Notes\n * If `stop < start` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [1, 2, 3, 4, 3, 2, 1];\n * ArrayExt.findFirstValue(data, isEven); // 2\n * ArrayExt.findFirstValue(data, isEven, 2); // 4\n * ArrayExt.findFirstValue(data, isEven, 6); // undefined\n * ArrayExt.findFirstValue(data, isEven, 6, 5); // 2\n * ```\n */\n function findFirstValue(array, fn, start = 0, stop = -1) {\n let index = findFirstIndex(array, fn, start, stop);\n return index !== -1 ? array[index] : undefined;\n }\n ArrayExt.findFirstValue = findFirstValue;\n /**\n * Find the last value which matches a predicate.\n *\n * @param object - The array-like object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The last matching value, or `undefined` if no matching\n * value is found.\n *\n * #### Notes\n * If `start < stop` the search will wrap at the front of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [1, 2, 3, 4, 3, 2, 1];\n * ArrayExt.findLastValue(data, isEven); // 2\n * ArrayExt.findLastValue(data, isEven, 4); // 4\n * ArrayExt.findLastValue(data, isEven, 0); // undefined\n * ArrayExt.findLastValue(data, isEven, 0, 1); // 2\n * ```\n */\n function findLastValue(array, fn, start = -1, stop = 0) {\n let index = findLastIndex(array, fn, start, stop);\n return index !== -1 ? array[index] : undefined;\n }\n ArrayExt.findLastValue = findLastValue;\n /**\n * Find the index of the first element which compares `>=` to a value.\n *\n * @param array - The sorted array-like object to search.\n *\n * @param value - The value to locate in the array.\n *\n * @param fn - The 3-way comparison function to apply to the values.\n * It should return `< 0` if an element is less than a value, `0` if\n * an element is equal to a value, or `> 0` if an element is greater\n * than a value.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the first element which compares `>=` to the\n * value, or `length` if there is no such element. If the computed\n * index for `stop` is less than `start`, then the computed index\n * for `start` is returned.\n *\n * #### Notes\n * The array must already be sorted in ascending order according to\n * the comparison function.\n *\n * #### Complexity\n * Logarithmic.\n *\n * #### Undefined Behavior\n * Searching a range which is not sorted in ascending order.\n *\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function numberCmp(a: number, b: number): number {\n * return a - b;\n * }\n *\n * let data = [0, 3, 4, 7, 7, 9];\n * ArrayExt.lowerBound(data, 0, numberCmp); // 0\n * ArrayExt.lowerBound(data, 6, numberCmp); // 3\n * ArrayExt.lowerBound(data, 7, numberCmp); // 3\n * ArrayExt.lowerBound(data, -1, numberCmp); // 0\n * ArrayExt.lowerBound(data, 10, numberCmp); // 6\n * ```\n */\n function lowerBound(array, value, fn, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return 0;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let begin = start;\n let span = stop - start + 1;\n while (span > 0) {\n let half = span >> 1;\n let middle = begin + half;\n if (fn(array[middle], value) < 0) {\n begin = middle + 1;\n span -= half + 1;\n }\n else {\n span = half;\n }\n }\n return begin;\n }\n ArrayExt.lowerBound = lowerBound;\n /**\n * Find the index of the first element which compares `>` than a value.\n *\n * @param array - The sorted array-like object to search.\n *\n * @param value - The value to locate in the array.\n *\n * @param fn - The 3-way comparison function to apply to the values.\n * It should return `< 0` if an element is less than a value, `0` if\n * an element is equal to a value, or `> 0` if an element is greater\n * than a value.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the first element which compares `>` than the\n * value, or `length` if there is no such element. If the computed\n * index for `stop` is less than `start`, then the computed index\n * for `start` is returned.\n *\n * #### Notes\n * The array must already be sorted in ascending order according to\n * the comparison function.\n *\n * #### Complexity\n * Logarithmic.\n *\n * #### Undefined Behavior\n * Searching a range which is not sorted in ascending order.\n *\n * A `start` or `stop` which is non-integral.\n *\n * Modifying the length of the array while searching.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function numberCmp(a: number, b: number): number {\n * return a - b;\n * }\n *\n * let data = [0, 3, 4, 7, 7, 9];\n * ArrayExt.upperBound(data, 0, numberCmp); // 1\n * ArrayExt.upperBound(data, 6, numberCmp); // 3\n * ArrayExt.upperBound(data, 7, numberCmp); // 5\n * ArrayExt.upperBound(data, -1, numberCmp); // 0\n * ArrayExt.upperBound(data, 10, numberCmp); // 6\n * ```\n */\n function upperBound(array, value, fn, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return 0;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let begin = start;\n let span = stop - start + 1;\n while (span > 0) {\n let half = span >> 1;\n let middle = begin + half;\n if (fn(array[middle], value) > 0) {\n span = half;\n }\n else {\n begin = middle + 1;\n span -= half + 1;\n }\n }\n return begin;\n }\n ArrayExt.upperBound = upperBound;\n /**\n * Test whether two arrays are shallowly equal.\n *\n * @param a - The first array-like object to compare.\n *\n * @param b - The second array-like object to compare.\n *\n * @param fn - The comparison function to apply to the elements. It\n * should return `true` if the elements are \"equal\". The default\n * compares elements using strict `===` equality.\n *\n * @returns Whether the two arrays are shallowly equal.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * Modifying the length of the arrays while comparing.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let d1 = [0, 3, 4, 7, 7, 9];\n * let d2 = [0, 3, 4, 7, 7, 9];\n * let d3 = [42];\n * ArrayExt.shallowEqual(d1, d2); // true\n * ArrayExt.shallowEqual(d2, d3); // false\n * ```\n */\n function shallowEqual(a, b, fn) {\n // Check for object identity first.\n if (a === b) {\n return true;\n }\n // Bail early if the lengths are different.\n if (a.length !== b.length) {\n return false;\n }\n // Compare each element for equality.\n for (let i = 0, n = a.length; i < n; ++i) {\n if (fn ? !fn(a[i], b[i]) : a[i] !== b[i]) {\n return false;\n }\n }\n // The array are shallowly equal.\n return true;\n }\n ArrayExt.shallowEqual = shallowEqual;\n /**\n * Create a slice of an array subject to an optional step.\n *\n * @param array - The array-like object of interest.\n *\n * @param options - The options for configuring the slice.\n *\n * @returns A new array with the specified values.\n *\n * @throws An exception if the slice `step` is `0`.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start`, `stop`, or `step` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 3, 4, 7, 7, 9];\n * ArrayExt.slice(data); // [0, 3, 4, 7, 7, 9]\n * ArrayExt.slice(data, { start: 2 }); // [4, 7, 7, 9]\n * ArrayExt.slice(data, { start: 0, stop: 4 }); // [0, 3, 4, 7]\n * ArrayExt.slice(data, { step: 2 }); // [0, 4, 7]\n * ArrayExt.slice(data, { step: -1 }); // [9, 7, 7, 4, 3, 0]\n * ```\n */\n function slice(array, options = {}) {\n // Extract the options.\n let { start, stop, step } = options;\n // Set up the `step` value.\n if (step === undefined) {\n step = 1;\n }\n // Validate the step size.\n if (step === 0) {\n throw new Error('Slice `step` cannot be zero.');\n }\n // Look up the length of the array.\n let n = array.length;\n // Set up the `start` value.\n if (start === undefined) {\n start = step < 0 ? n - 1 : 0;\n }\n else if (start < 0) {\n start = Math.max(start + n, step < 0 ? -1 : 0);\n }\n else if (start >= n) {\n start = step < 0 ? n - 1 : n;\n }\n // Set up the `stop` value.\n if (stop === undefined) {\n stop = step < 0 ? -1 : n;\n }\n else if (stop < 0) {\n stop = Math.max(stop + n, step < 0 ? -1 : 0);\n }\n else if (stop >= n) {\n stop = step < 0 ? n - 1 : n;\n }\n // Compute the slice length.\n let length;\n if ((step < 0 && stop >= start) || (step > 0 && start >= stop)) {\n length = 0;\n }\n else if (step < 0) {\n length = Math.floor((stop - start + 1) / step + 1);\n }\n else {\n length = Math.floor((stop - start - 1) / step + 1);\n }\n // Compute the sliced result.\n let result = [];\n for (let i = 0; i < length; ++i) {\n result[i] = array[start + i * step];\n }\n // Return the result.\n return result;\n }\n ArrayExt.slice = slice;\n /**\n * Move an element in an array from one index to another.\n *\n * @param array - The mutable array-like object of interest.\n *\n * @param fromIndex - The index of the element to move. Negative\n * values are taken as an offset from the end of the array.\n *\n * @param toIndex - The target index of the element. Negative\n * values are taken as an offset from the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `fromIndex` or `toIndex` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from from '@lumino/algorithm';\n *\n * let data = [0, 1, 2, 3, 4];\n * ArrayExt.move(data, 1, 2); // [0, 2, 1, 3, 4]\n * ArrayExt.move(data, 4, 2); // [0, 2, 4, 1, 3]\n * ```\n */\n function move(array, fromIndex, toIndex) {\n let n = array.length;\n if (n <= 1) {\n return;\n }\n if (fromIndex < 0) {\n fromIndex = Math.max(0, fromIndex + n);\n }\n else {\n fromIndex = Math.min(fromIndex, n - 1);\n }\n if (toIndex < 0) {\n toIndex = Math.max(0, toIndex + n);\n }\n else {\n toIndex = Math.min(toIndex, n - 1);\n }\n if (fromIndex === toIndex) {\n return;\n }\n let value = array[fromIndex];\n let d = fromIndex < toIndex ? 1 : -1;\n for (let i = fromIndex; i !== toIndex; i += d) {\n array[i] = array[i + d];\n }\n array[toIndex] = value;\n }\n ArrayExt.move = move;\n /**\n * Reverse an array in-place.\n *\n * @param array - The mutable array-like object of interest.\n *\n * @param start - The index of the first element in the range to be\n * reversed, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * reversed, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` index which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 1, 2, 3, 4];\n * ArrayExt.reverse(data, 1, 3); // [0, 3, 2, 1, 4]\n * ArrayExt.reverse(data, 3); // [0, 3, 2, 4, 1]\n * ArrayExt.reverse(data); // [1, 4, 2, 3, 0]\n * ```\n */\n function reverse(array, start = 0, stop = -1) {\n let n = array.length;\n if (n <= 1) {\n return;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n while (start < stop) {\n let a = array[start];\n let b = array[stop];\n array[start++] = b;\n array[stop--] = a;\n }\n }\n ArrayExt.reverse = reverse;\n /**\n * Rotate the elements of an array in-place.\n *\n * @param array - The mutable array-like object of interest.\n *\n * @param delta - The amount of rotation to apply to the elements. A\n * positive value will rotate the elements to the left. A negative\n * value will rotate the elements to the right.\n *\n * @param start - The index of the first element in the range to be\n * rotated, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * rotated, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `delta`, `start`, or `stop` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 1, 2, 3, 4];\n * ArrayExt.rotate(data, 2); // [2, 3, 4, 0, 1]\n * ArrayExt.rotate(data, -2); // [0, 1, 2, 3, 4]\n * ArrayExt.rotate(data, 10); // [0, 1, 2, 3, 4]\n * ArrayExt.rotate(data, 9); // [4, 0, 1, 2, 3]\n * ArrayExt.rotate(data, 2, 1, 3); // [4, 2, 0, 1, 3]\n * ```\n */\n function rotate(array, delta, start = 0, stop = -1) {\n let n = array.length;\n if (n <= 1) {\n return;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n if (start >= stop) {\n return;\n }\n let length = stop - start + 1;\n if (delta > 0) {\n delta = delta % length;\n }\n else if (delta < 0) {\n delta = ((delta % length) + length) % length;\n }\n if (delta === 0) {\n return;\n }\n let pivot = start + delta;\n reverse(array, start, pivot - 1);\n reverse(array, pivot, stop);\n reverse(array, start, stop);\n }\n ArrayExt.rotate = rotate;\n /**\n * Fill an array with a static value.\n *\n * @param array - The mutable array-like object to fill.\n *\n * @param value - The static value to use to fill the array.\n *\n * @param start - The index of the first element in the range to be\n * filled, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * filled, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * #### Notes\n * If `stop < start` the fill will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * A `start` or `stop` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = ['one', 'two', 'three', 'four'];\n * ArrayExt.fill(data, 'r'); // ['r', 'r', 'r', 'r']\n * ArrayExt.fill(data, 'g', 1); // ['r', 'g', 'g', 'g']\n * ArrayExt.fill(data, 'b', 2, 3); // ['r', 'g', 'b', 'b']\n * ArrayExt.fill(data, 'z', 3, 1); // ['z', 'z', 'b', 'z']\n * ```\n */\n function fill(array, value, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let span;\n if (stop < start) {\n span = stop + 1 + (n - start);\n }\n else {\n span = stop - start + 1;\n }\n for (let i = 0; i < span; ++i) {\n array[(start + i) % n] = value;\n }\n }\n ArrayExt.fill = fill;\n /**\n * Insert a value into an array at a specific index.\n *\n * @param array - The array of interest.\n *\n * @param index - The index at which to insert the value. Negative\n * values are taken as an offset from the end of the array.\n *\n * @param value - The value to set at the specified index.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * An `index` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 1, 2];\n * ArrayExt.insert(data, 0, -1); // [-1, 0, 1, 2]\n * ArrayExt.insert(data, 2, 12); // [-1, 0, 12, 1, 2]\n * ArrayExt.insert(data, -1, 7); // [-1, 0, 12, 1, 7, 2]\n * ArrayExt.insert(data, 6, 19); // [-1, 0, 12, 1, 7, 2, 19]\n * ```\n */\n function insert(array, index, value) {\n let n = array.length;\n if (index < 0) {\n index = Math.max(0, index + n);\n }\n else {\n index = Math.min(index, n);\n }\n for (let i = n; i > index; --i) {\n array[i] = array[i - 1];\n }\n array[index] = value;\n }\n ArrayExt.insert = insert;\n /**\n * Remove and return a value at a specific index in an array.\n *\n * @param array - The array of interest.\n *\n * @param index - The index of the value to remove. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The value at the specified index, or `undefined` if the\n * index is out of range.\n *\n * #### Complexity\n * Linear.\n *\n * #### Undefined Behavior\n * An `index` which is non-integral.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 12, 23, 39, 14, 12, 75];\n * ArrayExt.removeAt(data, 2); // 23\n * ArrayExt.removeAt(data, -2); // 12\n * ArrayExt.removeAt(data, 10); // undefined;\n * ```\n */\n function removeAt(array, index) {\n let n = array.length;\n if (index < 0) {\n index += n;\n }\n if (index < 0 || index >= n) {\n return undefined;\n }\n let value = array[index];\n for (let i = index + 1; i < n; ++i) {\n array[i - 1] = array[i];\n }\n array.length = n - 1;\n return value;\n }\n ArrayExt.removeAt = removeAt;\n /**\n * Remove the first occurrence of a value from an array.\n *\n * @param array - The array of interest.\n *\n * @param value - The value to remove from the array. Values are\n * compared using strict `===` equality.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the removed value, or `-1` if the value\n * is not contained in the array.\n *\n * #### Notes\n * If `stop < start` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 12, 23, 39, 14, 12, 75];\n * ArrayExt.removeFirstOf(data, 12); // 1\n * ArrayExt.removeFirstOf(data, 17); // -1\n * ArrayExt.removeFirstOf(data, 39, 3); // -1\n * ArrayExt.removeFirstOf(data, 39, 3, 2); // 2\n * ```\n */\n function removeFirstOf(array, value, start = 0, stop = -1) {\n let index = firstIndexOf(array, value, start, stop);\n if (index !== -1) {\n removeAt(array, index);\n }\n return index;\n }\n ArrayExt.removeFirstOf = removeFirstOf;\n /**\n * Remove the last occurrence of a value from an array.\n *\n * @param array - The array of interest.\n *\n * @param value - The value to remove from the array. Values are\n * compared using strict `===` equality.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The index of the removed value, or `-1` if the value\n * is not contained in the array.\n *\n * #### Notes\n * If `start < stop` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [0, 12, 23, 39, 14, 12, 75];\n * ArrayExt.removeLastOf(data, 12); // 5\n * ArrayExt.removeLastOf(data, 17); // -1\n * ArrayExt.removeLastOf(data, 39, 2); // -1\n * ArrayExt.removeLastOf(data, 39, 2, 3); // 3\n * ```\n */\n function removeLastOf(array, value, start = -1, stop = 0) {\n let index = lastIndexOf(array, value, start, stop);\n if (index !== -1) {\n removeAt(array, index);\n }\n return index;\n }\n ArrayExt.removeLastOf = removeLastOf;\n /**\n * Remove all occurrences of a value from an array.\n *\n * @param array - The array of interest.\n *\n * @param value - The value to remove from the array. Values are\n * compared using strict `===` equality.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The number of elements removed from the array.\n *\n * #### Notes\n * If `stop < start` the search will conceptually wrap at the end of\n * the array, however the array will be traversed front-to-back.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * let data = [14, 12, 23, 39, 14, 12, 19, 14];\n * ArrayExt.removeAllOf(data, 12); // 2\n * ArrayExt.removeAllOf(data, 17); // 0\n * ArrayExt.removeAllOf(data, 14, 1, 4); // 1\n * ```\n */\n function removeAllOf(array, value, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return 0;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let count = 0;\n for (let i = 0; i < n; ++i) {\n if (start <= stop && i >= start && i <= stop && array[i] === value) {\n count++;\n }\n else if (stop < start &&\n (i <= stop || i >= start) &&\n array[i] === value) {\n count++;\n }\n else if (count > 0) {\n array[i - count] = array[i];\n }\n }\n if (count > 0) {\n array.length = n - count;\n }\n return count;\n }\n ArrayExt.removeAllOf = removeAllOf;\n /**\n * Remove the first occurrence of a value which matches a predicate.\n *\n * @param array - The array of interest.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The removed `{ index, value }`, which will be `-1` and\n * `undefined` if the value is not contained in the array.\n *\n * #### Notes\n * If `stop < start` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [0, 12, 23, 39, 14, 12, 75];\n * ArrayExt.removeFirstWhere(data, isEven); // { index: 0, value: 0 }\n * ArrayExt.removeFirstWhere(data, isEven, 2); // { index: 3, value: 14 }\n * ArrayExt.removeFirstWhere(data, isEven, 4); // { index: -1, value: undefined }\n * ```\n */\n function removeFirstWhere(array, fn, start = 0, stop = -1) {\n let value;\n let index = findFirstIndex(array, fn, start, stop);\n if (index !== -1) {\n value = removeAt(array, index);\n }\n return { index, value };\n }\n ArrayExt.removeFirstWhere = removeFirstWhere;\n /**\n * Remove the last occurrence of a value which matches a predicate.\n *\n * @param array - The array of interest.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The removed `{ index, value }`, which will be `-1` and\n * `undefined` if the value is not contained in the array.\n *\n * #### Notes\n * If `start < stop` the search will wrap at the end of the array.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * let data = [0, 12, 23, 39, 14, 12, 75];\n * ArrayExt.removeLastWhere(data, isEven); // { index: 5, value: 12 }\n * ArrayExt.removeLastWhere(data, isEven, 2); // { index: 1, value: 12 }\n * ArrayExt.removeLastWhere(data, isEven, 2, 1); // { index: -1, value: undefined }\n * ```\n */\n function removeLastWhere(array, fn, start = -1, stop = 0) {\n let value;\n let index = findLastIndex(array, fn, start, stop);\n if (index !== -1) {\n value = removeAt(array, index);\n }\n return { index, value };\n }\n ArrayExt.removeLastWhere = removeLastWhere;\n /**\n * Remove all occurrences of values which match a predicate.\n *\n * @param array - The array of interest.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @param start - The index of the first element in the range to be\n * searched, inclusive. The default value is `0`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @param stop - The index of the last element in the range to be\n * searched, inclusive. The default value is `-1`. Negative values\n * are taken as an offset from the end of the array.\n *\n * @returns The number of elements removed from the array.\n *\n * #### Notes\n * If `stop < start` the search will conceptually wrap at the end of\n * the array, however the array will be traversed front-to-back.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { ArrayExt } from '@lumino/algorithm';\n *\n * function isEven(value: number): boolean {\n * return value % 2 === 0;\n * }\n *\n * function isNegative(value: number): boolean {\n * return value < 0;\n * }\n *\n * let data = [0, 12, -13, -9, 23, 39, 14, -15, 12, 75];\n * ArrayExt.removeAllWhere(data, isEven); // 4\n * ArrayExt.removeAllWhere(data, isNegative, 0, 3); // 2\n * ```\n */\n function removeAllWhere(array, fn, start = 0, stop = -1) {\n let n = array.length;\n if (n === 0) {\n return 0;\n }\n if (start < 0) {\n start = Math.max(0, start + n);\n }\n else {\n start = Math.min(start, n - 1);\n }\n if (stop < 0) {\n stop = Math.max(0, stop + n);\n }\n else {\n stop = Math.min(stop, n - 1);\n }\n let count = 0;\n for (let i = 0; i < n; ++i) {\n if (start <= stop && i >= start && i <= stop && fn(array[i], i)) {\n count++;\n }\n else if (stop < start && (i <= stop || i >= start) && fn(array[i], i)) {\n count++;\n }\n else if (count > 0) {\n array[i - count] = array[i];\n }\n }\n if (count > 0) {\n array.length = n - count;\n }\n return count;\n }\n ArrayExt.removeAllWhere = removeAllWhere;\n})(ArrayExt || (ArrayExt = {}));\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Chain together several iterables.\n *\n * @deprecated\n *\n * @param objects - The iterable objects of interest.\n *\n * @returns An iterator which yields the values of the iterables\n * in the order in which they are supplied.\n *\n * #### Example\n * ```typescript\n * import { chain } from '@lumino/algorithm';\n *\n * let data1 = [1, 2, 3];\n * let data2 = [4, 5, 6];\n *\n * let stream = chain(data1, data2);\n *\n * Array.from(stream); // [1, 2, 3, 4, 5, 6]\n * ```\n */\nfunction* chain(...objects) {\n for (const object of objects) {\n yield* object;\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Create an empty iterator.\n *\n * @returns A new iterator which yields nothing.\n *\n * #### Example\n * ```typescript\n * import { empty } from '@lumino/algorithm';\n *\n * let stream = empty();\n *\n * Array.from(stream); // []\n * ```\n */\n// eslint-disable-next-line require-yield\nfunction* empty() {\n return;\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Enumerate an iterable object.\n *\n * @param object - The iterable object of interest.\n *\n * @param start - The starting enum value. The default is `0`.\n *\n * @returns An iterator which yields the enumerated values.\n *\n * #### Example\n * ```typescript\n * import { enumerate } from '@lumino/algorithm';\n *\n * let data = ['foo', 'bar', 'baz'];\n *\n * let stream = enumerate(data, 1);\n *\n * Array.from(stream); // [[1, 'foo'], [2, 'bar'], [3, 'baz']]\n * ```\n */\nfunction* enumerate(object, start = 0) {\n for (const value of object) {\n yield [start++, value];\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Filter an iterable for values which pass a test.\n *\n * @param object - The iterable object of interest.\n *\n * @param fn - The predicate function to invoke for each value.\n *\n * @returns An iterator which yields the values which pass the test.\n *\n * #### Example\n * ```typescript\n * import { filter } from '@lumino/algorithm';\n *\n * let data = [1, 2, 3, 4, 5, 6];\n *\n * let stream = filter(data, value => value % 2 === 0);\n *\n * Array.from(stream); // [2, 4, 6]\n * ```\n */\nfunction* filter(object, fn) {\n let index = 0;\n for (const value of object) {\n if (fn(value, index++)) {\n yield value;\n }\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Find the first value in an iterable which matches a predicate.\n *\n * @param object - The iterable object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @returns The first matching value, or `undefined` if no matching\n * value is found.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { find } from '@lumino/algorithm';\n *\n * interface IAnimal { species: string, name: string };\n *\n * function isCat(value: IAnimal): boolean {\n * return value.species === 'cat';\n * }\n *\n * let data: IAnimal[] = [\n * { species: 'dog', name: 'spot' },\n * { species: 'cat', name: 'fluffy' },\n * { species: 'alligator', name: 'pocho' }\n * ];\n *\n * find(data, isCat).name; // 'fluffy'\n * ```\n */\nfunction find(object, fn) {\n let index = 0;\n for (const value of object) {\n if (fn(value, index++)) {\n return value;\n }\n }\n return undefined;\n}\n/**\n * Find the index of the first value which matches a predicate.\n *\n * @param object - The iterable object to search.\n *\n * @param fn - The predicate function to apply to the values.\n *\n * @returns The index of the first matching value, or `-1` if no\n * matching value is found.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { findIndex } from '@lumino/algorithm';\n *\n * interface IAnimal { species: string, name: string };\n *\n * function isCat(value: IAnimal): boolean {\n * return value.species === 'cat';\n * }\n *\n * let data: IAnimal[] = [\n * { species: 'dog', name: 'spot' },\n * { species: 'cat', name: 'fluffy' },\n * { species: 'alligator', name: 'pocho' }\n * ];\n *\n * findIndex(data, isCat); // 1\n * ```\n */\nfunction findIndex(object, fn) {\n let index = 0;\n for (const value of object) {\n if (fn(value, index++)) {\n return index - 1;\n }\n }\n return -1;\n}\n/**\n * Find the minimum value in an iterable.\n *\n * @param object - The iterable object to search.\n *\n * @param fn - The 3-way comparison function to apply to the values.\n * It should return `< 0` if the first value is less than the second.\n * `0` if the values are equivalent, or `> 0` if the first value is\n * greater than the second.\n *\n * @returns The minimum value in the iterable. If multiple values are\n * equivalent to the minimum, the left-most value is returned. If\n * the iterable is empty, this returns `undefined`.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { min } from '@lumino/algorithm';\n *\n * function numberCmp(a: number, b: number): number {\n * return a - b;\n * }\n *\n * min([7, 4, 0, 3, 9, 4], numberCmp); // 0\n * ```\n */\nfunction min(object, fn) {\n let result = undefined;\n for (const value of object) {\n if (result === undefined) {\n result = value;\n continue;\n }\n if (fn(value, result) < 0) {\n result = value;\n }\n }\n return result;\n}\n/**\n * Find the maximum value in an iterable.\n *\n * @param object - The iterable object to search.\n *\n * @param fn - The 3-way comparison function to apply to the values.\n * It should return `< 0` if the first value is less than the second.\n * `0` if the values are equivalent, or `> 0` if the first value is\n * greater than the second.\n *\n * @returns The maximum value in the iterable. If multiple values are\n * equivalent to the maximum, the left-most value is returned. If\n * the iterable is empty, this returns `undefined`.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { max } from '@lumino/algorithm';\n *\n * function numberCmp(a: number, b: number): number {\n * return a - b;\n * }\n *\n * max([7, 4, 0, 3, 9, 4], numberCmp); // 9\n * ```\n */\nfunction max(object, fn) {\n let result = undefined;\n for (const value of object) {\n if (result === undefined) {\n result = value;\n continue;\n }\n if (fn(value, result) > 0) {\n result = value;\n }\n }\n return result;\n}\n/**\n * Find the minimum and maximum values in an iterable.\n *\n * @param object - The iterable object to search.\n *\n * @param fn - The 3-way comparison function to apply to the values.\n * It should return `< 0` if the first value is less than the second.\n * `0` if the values are equivalent, or `> 0` if the first value is\n * greater than the second.\n *\n * @returns A 2-tuple of the `[min, max]` values in the iterable. If\n * multiple values are equivalent, the left-most values are returned.\n * If the iterable is empty, this returns `undefined`.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { minmax } from '@lumino/algorithm';\n *\n * function numberCmp(a: number, b: number): number {\n * return a - b;\n * }\n *\n * minmax([7, 4, 0, 3, 9, 4], numberCmp); // [0, 9]\n * ```\n */\nfunction minmax(object, fn) {\n let empty = true;\n let vmin;\n let vmax;\n for (const value of object) {\n if (empty) {\n vmin = value;\n vmax = value;\n empty = false;\n }\n else if (fn(value, vmin) < 0) {\n vmin = value;\n }\n else if (fn(value, vmax) > 0) {\n vmax = value;\n }\n }\n return empty ? undefined : [vmin, vmax];\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Create an array from an iterable of values.\n *\n * @deprecated\n *\n * @param object - The iterable object of interest.\n *\n * @returns A new array of values from the given object.\n *\n * #### Example\n * ```typescript\n * import { toArray } from '@lumino/algorithm';\n *\n * let stream = [1, 2, 3, 4, 5, 6][Symbol.iterator]();\n *\n * toArray(stream); // [1, 2, 3, 4, 5, 6];\n * ```\n */\nfunction toArray(object) {\n return Array.from(object);\n}\n/**\n * Create an object from an iterable of key/value pairs.\n *\n * @param object - The iterable object of interest.\n *\n * @returns A new object mapping keys to values.\n *\n * #### Example\n * ```typescript\n * import { toObject } from '@lumino/algorithm';\n *\n * let data: [string, number][] = [['one', 1], ['two', 2], ['three', 3]];\n *\n * toObject(data); // { one: 1, two: 2, three: 3 }\n * ```\n */\nfunction toObject(object) {\n const result = {};\n for (const [key, value] of object) {\n result[key] = value;\n }\n return result;\n}\n/**\n * Invoke a function for each value in an iterable.\n *\n * @deprecated\n *\n * @param object - The iterable object of interest.\n *\n * @param fn - The callback function to invoke for each value.\n *\n * #### Notes\n * Iteration can be terminated early by returning `false` from the\n * callback function.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { each } from '@lumino/algorithm';\n *\n * let data = [5, 7, 0, -2, 9];\n *\n * each(data, value => { console.log(value); });\n * ```\n */\nfunction each(object, fn) {\n let index = 0;\n for (const value of object) {\n if (false === fn(value, index++)) {\n return;\n }\n }\n}\n/**\n * Test whether all values in an iterable satisfy a predicate.\n *\n * @param object - The iterable object of interest.\n *\n * @param fn - The predicate function to invoke for each value.\n *\n * @returns `true` if all values pass the test, `false` otherwise.\n *\n * #### Notes\n * Iteration terminates on the first `false` predicate result.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { every } from '@lumino/algorithm';\n *\n * let data = [5, 7, 1];\n *\n * every(data, value => value % 2 === 0); // false\n * every(data, value => value % 2 === 1); // true\n * ```\n */\nfunction every(object, fn) {\n let index = 0;\n for (const value of object) {\n if (false === fn(value, index++)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Test whether any value in an iterable satisfies a predicate.\n *\n * @param object - The iterable object of interest.\n *\n * @param fn - The predicate function to invoke for each value.\n *\n * @returns `true` if any value passes the test, `false` otherwise.\n *\n * #### Notes\n * Iteration terminates on the first `true` predicate result.\n *\n * #### Complexity\n * Linear.\n *\n * #### Example\n * ```typescript\n * import { some } from '@lumino/algorithm';\n *\n * let data = [5, 7, 1];\n *\n * some(data, value => value === 7); // true\n * some(data, value => value === 3); // false\n * ```\n */\nfunction some(object, fn) {\n let index = 0;\n for (const value of object) {\n if (fn(value, index++)) {\n return true;\n }\n }\n return false;\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Transform the values of an iterable with a mapping function.\n *\n * @param object - The iterable object of interest.\n *\n * @param fn - The mapping function to invoke for each value.\n *\n * @returns An iterator which yields the transformed values.\n *\n * #### Example\n * ```typescript\n * import { map } from '@lumino/algorithm';\n *\n * let data = [1, 2, 3];\n *\n * let stream = map(data, value => value * 2);\n *\n * Array.from(stream); // [2, 4, 6]\n * ```\n */\nfunction* map(object, fn) {\n let index = 0;\n for (const value of object) {\n yield fn(value, index++);\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Create an iterator of evenly spaced values.\n *\n * @param start - The starting value for the range, inclusive.\n *\n * @param stop - The stopping value for the range, exclusive.\n *\n * @param step - The distance between each value.\n *\n * @returns An iterator which produces evenly spaced values.\n *\n * #### Notes\n * In the single argument form of `range(stop)`, `start` defaults to\n * `0` and `step` defaults to `1`.\n *\n * In the two argument form of `range(start, stop)`, `step` defaults\n * to `1`.\n *\n * #### Example\n * ```typescript\n * import { range } from '@lumino/algorithm';\n *\n * let stream = range(2, 4);\n *\n * Array.from(stream); // [2, 3]\n * ```\n */\nfunction* range(start, stop, step) {\n if (stop === undefined) {\n stop = start;\n start = 0;\n step = 1;\n }\n else if (step === undefined) {\n step = 1;\n }\n const length = Private.rangeLength(start, stop, step);\n for (let index = 0; index < length; index++) {\n yield start + step * index;\n }\n}\n/**\n * The namespace for the module implementation details.\n */\nvar Private;\n(function (Private) {\n /**\n * Compute the effective length of a range.\n *\n * @param start - The starting value for the range, inclusive.\n *\n * @param stop - The stopping value for the range, exclusive.\n *\n * @param step - The distance between each value.\n *\n * @returns The number of steps need to traverse the range.\n */\n function rangeLength(start, stop, step) {\n if (step === 0) {\n return Infinity;\n }\n if (start > stop && step > 0) {\n return 0;\n }\n if (start < stop && step < 0) {\n return 0;\n }\n return Math.ceil((stop - start) / step);\n }\n Private.rangeLength = rangeLength;\n})(Private || (Private = {}));\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\nfunction reduce(object, fn, initial) {\n // Setup the iterator and fetch the first value.\n const it = object[Symbol.iterator]();\n let index = 0;\n let first = it.next();\n // An empty iterator and no initial value is an error.\n if (first.done && initial === undefined) {\n throw new TypeError('Reduce of empty iterable with no initial value.');\n }\n // If the iterator is empty, return the initial value.\n if (first.done) {\n return initial;\n }\n // If the iterator has a single item and no initial value, the\n // reducer is not invoked and the first item is the return value.\n let second = it.next();\n if (second.done && initial === undefined) {\n return first.value;\n }\n // If iterator has a single item and an initial value is provided,\n // the reducer is invoked and that result is the return value.\n if (second.done) {\n return fn(initial, first.value, index++);\n }\n // Setup the initial accumlated value.\n let accumulator;\n if (initial === undefined) {\n accumulator = fn(first.value, second.value, index++);\n }\n else {\n accumulator = fn(fn(initial, first.value, index++), second.value, index++);\n }\n // Iterate the rest of the values, updating the accumulator.\n let next;\n while (!(next = it.next()).done) {\n accumulator = fn(accumulator, next.value, index++);\n }\n // Return the final accumulated value.\n return accumulator;\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Create an iterator which repeats a value a number of times.\n *\n * @deprecated\n *\n * @param value - The value to repeat.\n *\n * @param count - The number of times to repeat the value.\n *\n * @returns A new iterator which repeats the specified value.\n *\n * #### Example\n * ```typescript\n * import { repeat } from '@lumino/algorithm';\n *\n * let stream = repeat(7, 3);\n *\n * Array.from(stream); // [7, 7, 7]\n * ```\n */\nfunction* repeat(value, count) {\n while (0 < count--) {\n yield value;\n }\n}\n/**\n * Create an iterator which yields a value a single time.\n *\n * @deprecated\n *\n * @param value - The value to wrap in an iterator.\n *\n * @returns A new iterator which yields the value a single time.\n *\n * #### Example\n * ```typescript\n * import { once } from '@lumino/algorithm';\n *\n * let stream = once(7);\n *\n * Array.from(stream); // [7]\n * ```\n */\nfunction* once(value) {\n yield value;\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Create an iterator for a retroable object.\n *\n * @param object - The retroable or array-like object of interest.\n *\n * @returns An iterator which traverses the object's values in reverse.\n *\n * #### Example\n * ```typescript\n * import { retro } from '@lumino/algorithm';\n *\n * let data = [1, 2, 3, 4, 5, 6];\n *\n * let stream = retro(data);\n *\n * Array.from(stream); // [6, 5, 4, 3, 2, 1]\n * ```\n */\nfunction* retro(object) {\n if (typeof object.retro === 'function') {\n yield* object.retro();\n }\n else {\n for (let index = object.length - 1; index > -1; index--) {\n yield object[index];\n }\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Topologically sort an iterable of edges.\n *\n * @param edges - The iterable object of edges to sort.\n * An edge is represented as a 2-tuple of `[fromNode, toNode]`.\n *\n * @returns The topologically sorted array of nodes.\n *\n * #### Notes\n * If a cycle is present in the graph, the cycle will be ignored and\n * the return value will be only approximately sorted.\n *\n * #### Example\n * ```typescript\n * import { topologicSort } from '@lumino/algorithm';\n *\n * let data = [\n * ['d', 'e'],\n * ['c', 'd'],\n * ['a', 'b'],\n * ['b', 'c']\n * ];\n *\n * topologicSort(data); // ['a', 'b', 'c', 'd', 'e']\n * ```\n */\nfunction topologicSort(edges) {\n // Setup the shared sorting state.\n let sorted = [];\n let visited = new Set();\n let graph = new Map();\n // Add the edges to the graph.\n for (const edge of edges) {\n addEdge(edge);\n }\n // Visit each node in the graph.\n for (const [k] of graph) {\n visit(k);\n }\n // Return the sorted results.\n return sorted;\n // Add an edge to the graph.\n function addEdge(edge) {\n let [fromNode, toNode] = edge;\n let children = graph.get(toNode);\n if (children) {\n children.push(fromNode);\n }\n else {\n graph.set(toNode, [fromNode]);\n }\n }\n // Recursively visit the node.\n function visit(node) {\n if (visited.has(node)) {\n return;\n }\n visited.add(node);\n let children = graph.get(node);\n if (children) {\n for (const child of children) {\n visit(child);\n }\n }\n sorted.push(node);\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Iterate over an iterable using a stepped increment.\n *\n * @param object - The iterable object of interest.\n *\n * @param step - The distance to step on each iteration. A value\n * of less than `1` will behave the same as a value of `1`.\n *\n * @returns An iterator which traverses the iterable step-wise.\n *\n * #### Example\n * ```typescript\n * import { stride } from '@lumino/algorithm';\n *\n * let data = [1, 2, 3, 4, 5, 6];\n *\n * let stream = stride(data, 2);\n *\n * Array.from(stream); // [1, 3, 5];\n * ```\n */\nfunction* stride(object, step) {\n let count = 0;\n for (const value of object) {\n if (0 === count++ % step) {\n yield value;\n }\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * The namespace for string-specific algorithms.\n */\nvar StringExt;\n(function (StringExt) {\n /**\n * Find the indices of characters in a source text.\n *\n * @param source - The source text which should be searched.\n *\n * @param query - The characters to locate in the source text.\n *\n * @param start - The index to start the search.\n *\n * @returns The matched indices, or `null` if there is no match.\n *\n * #### Complexity\n * Linear on `sourceText`.\n *\n * #### Notes\n * In order for there to be a match, all of the characters in `query`\n * **must** appear in `source` in the order given by `query`.\n *\n * Characters are matched using strict `===` equality.\n */\n function findIndices(source, query, start = 0) {\n let indices = new Array(query.length);\n for (let i = 0, j = start, n = query.length; i < n; ++i, ++j) {\n j = source.indexOf(query[i], j);\n if (j === -1) {\n return null;\n }\n indices[i] = j;\n }\n return indices;\n }\n StringExt.findIndices = findIndices;\n /**\n * A string matcher which uses a sum-of-squares algorithm.\n *\n * @param source - The source text which should be searched.\n *\n * @param query - The characters to locate in the source text.\n *\n * @param start - The index to start the search.\n *\n * @returns The match result, or `null` if there is no match.\n * A lower `score` represents a stronger match.\n *\n * #### Complexity\n * Linear on `sourceText`.\n *\n * #### Notes\n * This scoring algorithm uses a sum-of-squares approach to determine\n * the score. In order for there to be a match, all of the characters\n * in `query` **must** appear in `source` in order. The index of each\n * matching character is squared and added to the score. This means\n * that early and consecutive character matches are preferred, while\n * late matches are heavily penalized.\n */\n function matchSumOfSquares(source, query, start = 0) {\n let indices = findIndices(source, query, start);\n if (!indices) {\n return null;\n }\n let score = 0;\n for (let i = 0, n = indices.length; i < n; ++i) {\n let j = indices[i] - start;\n score += j * j;\n }\n return { score, indices };\n }\n StringExt.matchSumOfSquares = matchSumOfSquares;\n /**\n * A string matcher which uses a sum-of-deltas algorithm.\n *\n * @param source - The source text which should be searched.\n *\n * @param query - The characters to locate in the source text.\n *\n * @param start - The index to start the search.\n *\n * @returns The match result, or `null` if there is no match.\n * A lower `score` represents a stronger match.\n *\n * #### Complexity\n * Linear on `sourceText`.\n *\n * #### Notes\n * This scoring algorithm uses a sum-of-deltas approach to determine\n * the score. In order for there to be a match, all of the characters\n * in `query` **must** appear in `source` in order. The delta between\n * the indices are summed to create the score. This means that groups\n * of matched characters are preferred, while fragmented matches are\n * penalized.\n */\n function matchSumOfDeltas(source, query, start = 0) {\n let indices = findIndices(source, query, start);\n if (!indices) {\n return null;\n }\n let score = 0;\n let last = start - 1;\n for (let i = 0, n = indices.length; i < n; ++i) {\n let j = indices[i];\n score += j - last - 1;\n last = j;\n }\n return { score, indices };\n }\n StringExt.matchSumOfDeltas = matchSumOfDeltas;\n /**\n * Highlight the matched characters of a source text.\n *\n * @param source - The text which should be highlighted.\n *\n * @param indices - The indices of the matched characters. They must\n * appear in increasing order and must be in bounds of the source.\n *\n * @param fn - The function to apply to the matched chunks.\n *\n * @returns An array of unmatched and highlighted chunks.\n */\n function highlight(source, indices, fn) {\n // Set up the result array.\n let result = [];\n // Set up the counter variables.\n let k = 0;\n let last = 0;\n let n = indices.length;\n // Iterator over each index.\n while (k < n) {\n // Set up the chunk indices.\n let i = indices[k];\n let j = indices[k];\n // Advance the right chunk index until it's non-contiguous.\n while (++k < n && indices[k] === j + 1) {\n j++;\n }\n // Extract the unmatched text.\n if (last < i) {\n result.push(source.slice(last, i));\n }\n // Extract and highlight the matched text.\n if (i < j + 1) {\n result.push(fn(source.slice(i, j + 1)));\n }\n // Update the last visited index.\n last = j + 1;\n }\n // Extract any remaining unmatched text.\n if (last < source.length) {\n result.push(source.slice(last));\n }\n // Return the highlighted result.\n return result;\n }\n StringExt.highlight = highlight;\n /**\n * A 3-way string comparison function.\n *\n * @param a - The first string of interest.\n *\n * @param b - The second string of interest.\n *\n * @returns `-1` if `a < b`, else `1` if `a > b`, else `0`.\n */\n function cmp(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n }\n StringExt.cmp = cmp;\n})(StringExt || (StringExt = {}));\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Take a fixed number of items from an iterable.\n *\n * @param object - The iterable object of interest.\n *\n * @param count - The number of items to take from the iterable.\n *\n * @returns An iterator which yields the specified number of items\n * from the source iterable.\n *\n * #### Notes\n * The returned iterator will exhaust early if the source iterable\n * contains an insufficient number of items.\n *\n * #### Example\n * ```typescript\n * import { take } from '@lumino/algorithm';\n *\n * let stream = take([5, 4, 3, 2, 1, 0, -1], 3);\n *\n * Array.from(stream); // [5, 4, 3]\n * ```\n */\nfunction* take(object, count) {\n if (count < 1) {\n return;\n }\n const it = object[Symbol.iterator]();\n let item;\n while (0 < count-- && !(item = it.next()).done) {\n yield item.value;\n }\n}\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * Iterate several iterables in lockstep.\n *\n * @param objects - The iterable objects of interest.\n *\n * @returns An iterator which yields successive tuples of values where\n * each value is taken in turn from the provided iterables. It will\n * be as long as the shortest provided iterable.\n *\n * #### Example\n * ```typescript\n * import { zip } from '@lumino/algorithm';\n *\n * let data1 = [1, 2, 3];\n * let data2 = [4, 5, 6];\n *\n * let stream = zip(data1, data2);\n *\n * Array.from(stream); // [[1, 4], [2, 5], [3, 6]]\n * ```\n */\nfunction* zip(...objects) {\n const iters = objects.map(obj => obj[Symbol.iterator]());\n let tuple = iters.map(it => it.next());\n for (; every(tuple, item => !item.done); tuple = iters.map(it => it.next())) {\n yield tuple.map(item => item.value);\n }\n}\n\nexport { ArrayExt, StringExt, chain, each, empty, enumerate, every, filter, find, findIndex, map, max, min, minmax, once, range, reduce, repeat, retro, some, stride, take, toArray, toObject, topologicSort, zip };\n//# sourceMappingURL=index.es6.js.map\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.lumino_coreutils = {}));\n})(this, (function (exports) { 'use strict';\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * The namespace for JSON-specific functions.\n */\n exports.JSONExt = void 0;\n (function (JSONExt) {\n /**\n * A shared frozen empty JSONObject\n */\n JSONExt.emptyObject = Object.freeze({});\n /**\n * A shared frozen empty JSONArray\n */\n JSONExt.emptyArray = Object.freeze([]);\n /**\n * Test whether a JSON value is a primitive.\n *\n * @param value - The JSON value of interest.\n *\n * @returns `true` if the value is a primitive,`false` otherwise.\n */\n function isPrimitive(value) {\n return (value === null ||\n typeof value === 'boolean' ||\n typeof value === 'number' ||\n typeof value === 'string');\n }\n JSONExt.isPrimitive = isPrimitive;\n function isArray(value) {\n return Array.isArray(value);\n }\n JSONExt.isArray = isArray;\n function isObject(value) {\n return !isPrimitive(value) && !isArray(value);\n }\n JSONExt.isObject = isObject;\n /**\n * Compare two JSON values for deep equality.\n *\n * @param first - The first JSON value of interest.\n *\n * @param second - The second JSON value of interest.\n *\n * @returns `true` if the values are equivalent, `false` otherwise.\n */\n function deepEqual(first, second) {\n // Check referential and primitive equality first.\n if (first === second) {\n return true;\n }\n // If one is a primitive, the `===` check ruled out the other.\n if (isPrimitive(first) || isPrimitive(second)) {\n return false;\n }\n // Test whether they are arrays.\n let a1 = isArray(first);\n let a2 = isArray(second);\n // Bail if the types are different.\n if (a1 !== a2) {\n return false;\n }\n // If they are both arrays, compare them.\n if (a1 && a2) {\n return deepArrayEqual(first, second);\n }\n // At this point, they must both be objects.\n return deepObjectEqual(first, second);\n }\n JSONExt.deepEqual = deepEqual;\n /**\n * Create a deep copy of a JSON value.\n *\n * @param value - The JSON value to copy.\n *\n * @returns A deep copy of the given JSON value.\n */\n function deepCopy(value) {\n // Do nothing for primitive values.\n if (isPrimitive(value)) {\n return value;\n }\n // Deep copy an array.\n if (isArray(value)) {\n return deepArrayCopy(value);\n }\n // Deep copy an object.\n return deepObjectCopy(value);\n }\n JSONExt.deepCopy = deepCopy;\n /**\n * Compare two JSON arrays for deep equality.\n */\n function deepArrayEqual(first, second) {\n // Check referential equality first.\n if (first === second) {\n return true;\n }\n // Test the arrays for equal length.\n if (first.length !== second.length) {\n return false;\n }\n // Compare the values for equality.\n for (let i = 0, n = first.length; i < n; ++i) {\n if (!deepEqual(first[i], second[i])) {\n return false;\n }\n }\n // At this point, the arrays are equal.\n return true;\n }\n /**\n * Compare two JSON objects for deep equality.\n */\n function deepObjectEqual(first, second) {\n // Check referential equality first.\n if (first === second) {\n return true;\n }\n // Check for the first object's keys in the second object.\n for (let key in first) {\n if (first[key] !== undefined && !(key in second)) {\n return false;\n }\n }\n // Check for the second object's keys in the first object.\n for (let key in second) {\n if (second[key] !== undefined && !(key in first)) {\n return false;\n }\n }\n // Compare the values for equality.\n for (let key in first) {\n // Get the values.\n let firstValue = first[key];\n let secondValue = second[key];\n // If both are undefined, ignore the key.\n if (firstValue === undefined && secondValue === undefined) {\n continue;\n }\n // If only one value is undefined, the objects are not equal.\n if (firstValue === undefined || secondValue === undefined) {\n return false;\n }\n // Compare the values.\n if (!deepEqual(firstValue, secondValue)) {\n return false;\n }\n }\n // At this point, the objects are equal.\n return true;\n }\n /**\n * Create a deep copy of a JSON array.\n */\n function deepArrayCopy(value) {\n let result = new Array(value.length);\n for (let i = 0, n = value.length; i < n; ++i) {\n result[i] = deepCopy(value[i]);\n }\n return result;\n }\n /**\n * Create a deep copy of a JSON object.\n */\n function deepObjectCopy(value) {\n let result = {};\n for (let key in value) {\n // Ignore undefined values.\n let subvalue = value[key];\n if (subvalue === undefined) {\n continue;\n }\n result[key] = deepCopy(subvalue);\n }\n return result;\n }\n })(exports.JSONExt || (exports.JSONExt = {}));\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * An object which stores MIME data for general application use.\n *\n * #### Notes\n * This class does not attempt to enforce \"correctness\" of MIME types\n * and their associated data. Since this class is designed to transfer\n * arbitrary data and objects within the same application, it assumes\n * that the user provides correct and accurate data.\n */\n class MimeData {\n constructor() {\n this._types = [];\n this._values = [];\n }\n /**\n * Get an array of the MIME types contained within the dataset.\n *\n * @returns A new array of the MIME types, in order of insertion.\n */\n types() {\n return this._types.slice();\n }\n /**\n * Test whether the dataset has an entry for the given type.\n *\n * @param mime - The MIME type of interest.\n *\n * @returns `true` if the dataset contains a value for the given\n * MIME type, `false` otherwise.\n */\n hasData(mime) {\n return this._types.indexOf(mime) !== -1;\n }\n /**\n * Get the data value for the given MIME type.\n *\n * @param mime - The MIME type of interest.\n *\n * @returns The value for the given MIME type, or `undefined` if\n * the dataset does not contain a value for the type.\n */\n getData(mime) {\n let i = this._types.indexOf(mime);\n return i !== -1 ? this._values[i] : undefined;\n }\n /**\n * Set the data value for the given MIME type.\n *\n * @param mime - The MIME type of interest.\n *\n * @param data - The data value for the given MIME type.\n *\n * #### Notes\n * This will overwrite any previous entry for the MIME type.\n */\n setData(mime, data) {\n this.clearData(mime);\n this._types.push(mime);\n this._values.push(data);\n }\n /**\n * Remove the data entry for the given MIME type.\n *\n * @param mime - The MIME type of interest.\n *\n * #### Notes\n * This is a no-op if there is no entry for the given MIME type.\n */\n clearData(mime) {\n let i = this._types.indexOf(mime);\n if (i !== -1) {\n this._types.splice(i, 1);\n this._values.splice(i, 1);\n }\n }\n /**\n * Remove all data entries from the dataset.\n */\n clear() {\n this._types.length = 0;\n this._values.length = 0;\n }\n }\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * A class which wraps a promise into a delegate object.\n *\n * #### Notes\n * This class is useful when the logic to resolve or reject a promise\n * cannot be defined at the point where the promise is created.\n */\n class PromiseDelegate {\n /**\n * Construct a new promise delegate.\n */\n constructor() {\n this.promise = new Promise((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n }\n /**\n * Resolve the wrapped promise with the given value.\n *\n * @param value - The value to use for resolving the promise.\n */\n resolve(value) {\n let resolve = this._resolve;\n resolve(value);\n }\n /**\n * Reject the wrapped promise with the given value.\n *\n * @reason - The reason for rejecting the promise.\n */\n reject(reason) {\n let reject = this._reject;\n reject(reason);\n }\n }\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * A runtime object which captures compile-time type information.\n *\n * #### Notes\n * A token captures the compile-time type of an interface or class in\n * an object which can be used at runtime in a type-safe fashion.\n */\n class Token {\n /**\n * Construct a new token.\n *\n * @param name - A human readable name for the token.\n * @param description - Token purpose description for documentation.\n */\n constructor(name, description) {\n this.name = name;\n this.description = description !== null && description !== void 0 ? description : '';\n this._tokenStructuralPropertyT = null;\n }\n }\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n // Fallback\n function fallbackRandomValues(buffer) {\n let value = 0;\n for (let i = 0, n = buffer.length; i < n; ++i) {\n if (i % 4 === 0) {\n value = (Math.random() * 0xffffffff) >>> 0;\n }\n buffer[i] = value & 0xff;\n value >>>= 8;\n }\n }\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * The namespace for random number related functionality.\n */\n exports.Random = void 0;\n (function (Random) {\n /**\n * A function which generates random bytes.\n *\n * @param buffer - The `Uint8Array` to fill with random bytes.\n *\n * #### Notes\n * A cryptographically strong random number generator will be used if\n * available. Otherwise, `Math.random` will be used as a fallback for\n * randomness.\n *\n * The following RNGs are supported, listed in order of precedence:\n * - `window.crypto.getRandomValues`\n * - `window.msCrypto.getRandomValues`\n * - `require('crypto').randomFillSync\n * - `require('crypto').randomBytes\n * - `Math.random`\n */\n Random.getRandomValues = (() => {\n // Look up the crypto module if available.\n const crypto = (typeof window !== 'undefined' && (window.crypto || window.msCrypto)) ||\n null;\n // Modern browsers and IE 11\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return function getRandomValues(buffer) {\n return crypto.getRandomValues(buffer);\n };\n }\n // Fallback\n return fallbackRandomValues;\n })();\n })(exports.Random || (exports.Random = {}));\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * A function which creates a function that generates UUID v4 identifiers.\n *\n * @returns A new function that creates a UUID v4 string.\n *\n * #### Notes\n * This implementation complies with RFC 4122.\n *\n * This uses `Random.getRandomValues()` for random bytes, which in\n * turn will use the underlying `crypto` module of the platform if\n * it is available. The fallback for randomness is `Math.random`.\n */\n function uuid4Factory(getRandomValues) {\n // Create a 16 byte array to hold the random values.\n const bytes = new Uint8Array(16);\n // Create a look up table from bytes to hex strings.\n const lut = new Array(256);\n // Pad the single character hex digits with a leading zero.\n for (let i = 0; i < 16; ++i) {\n lut[i] = '0' + i.toString(16);\n }\n // Populate the rest of the hex digits.\n for (let i = 16; i < 256; ++i) {\n lut[i] = i.toString(16);\n }\n // Return a function which generates the UUID.\n return function uuid4() {\n // Get a new batch of random values.\n getRandomValues(bytes);\n // Set the UUID version number to 4.\n bytes[6] = 0x40 | (bytes[6] & 0x0f);\n // Set the clock sequence bit to the RFC spec.\n bytes[8] = 0x80 | (bytes[8] & 0x3f);\n // Assemble the UUID string.\n return (lut[bytes[0]] +\n lut[bytes[1]] +\n lut[bytes[2]] +\n lut[bytes[3]] +\n '-' +\n lut[bytes[4]] +\n lut[bytes[5]] +\n '-' +\n lut[bytes[6]] +\n lut[bytes[7]] +\n '-' +\n lut[bytes[8]] +\n lut[bytes[9]] +\n '-' +\n lut[bytes[10]] +\n lut[bytes[11]] +\n lut[bytes[12]] +\n lut[bytes[13]] +\n lut[bytes[14]] +\n lut[bytes[15]]);\n };\n }\n\n // Copyright (c) Jupyter Development Team.\n // Distributed under the terms of the Modified BSD License.\n /*-----------------------------------------------------------------------------\n | Copyright (c) 2014-2017, PhosphorJS Contributors\n |\n | Distributed under the terms of the BSD 3-Clause License.\n |\n | The full license is in the file LICENSE, distributed with this software.\n |----------------------------------------------------------------------------*/\n /**\n * The namespace for UUID related functionality.\n */\n exports.UUID = void 0;\n (function (UUID) {\n /**\n * A function which generates UUID v4 identifiers.\n *\n * @returns A new UUID v4 string.\n *\n * #### Notes\n * This implementation complies with RFC 4122.\n *\n * This uses `Random.getRandomValues()` for random bytes, which in\n * turn will use the underlying `crypto` module of the platform if\n * it is available. The fallback for randomness is `Math.random`.\n */\n UUID.uuid4 = uuid4Factory(exports.Random.getRandomValues);\n })(exports.UUID || (exports.UUID = {}));\n\n exports.MimeData = MimeData;\n exports.PromiseDelegate = PromiseDelegate;\n exports.Token = Token;\n\n}));\n//# sourceMappingURL=index.js.map\n","import { Signal } from '@lumino/signaling';\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * @packageDocumentation\n * @module disposable\n */\n/**\n * A disposable object which delegates to a callback function.\n */\nclass DisposableDelegate {\n /**\n * Construct a new disposable delegate.\n *\n * @param fn - The callback function to invoke on dispose.\n */\n constructor(fn) {\n this._fn = fn;\n }\n /**\n * Test whether the delegate has been disposed.\n */\n get isDisposed() {\n return !this._fn;\n }\n /**\n * Dispose of the delegate and invoke the callback function.\n */\n dispose() {\n if (!this._fn) {\n return;\n }\n let fn = this._fn;\n this._fn = null;\n fn();\n }\n}\n/**\n * An observable disposable object which delegates to a callback function.\n */\nclass ObservableDisposableDelegate extends DisposableDelegate {\n constructor() {\n super(...arguments);\n this._disposed = new Signal(this);\n }\n /**\n * A signal emitted when the delegate is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * Dispose of the delegate and invoke the callback function.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n super.dispose();\n this._disposed.emit(undefined);\n Signal.clearData(this);\n }\n}\n/**\n * An object which manages a collection of disposable items.\n */\nclass DisposableSet {\n constructor() {\n this._isDisposed = false;\n this._items = new Set();\n }\n /**\n * Test whether the set has been disposed.\n */\n get isDisposed() {\n return this._isDisposed;\n }\n /**\n * Dispose of the set and the items it contains.\n *\n * #### Notes\n * Items are disposed in the order they are added to the set.\n */\n dispose() {\n if (this._isDisposed) {\n return;\n }\n this._isDisposed = true;\n this._items.forEach(item => {\n item.dispose();\n });\n this._items.clear();\n }\n /**\n * Test whether the set contains a specific item.\n *\n * @param item - The item of interest.\n *\n * @returns `true` if the set contains the item, `false` otherwise.\n */\n contains(item) {\n return this._items.has(item);\n }\n /**\n * Add a disposable item to the set.\n *\n * @param item - The item to add to the set.\n *\n * #### Notes\n * If the item is already contained in the set, this is a no-op.\n */\n add(item) {\n this._items.add(item);\n }\n /**\n * Remove a disposable item from the set.\n *\n * @param item - The item to remove from the set.\n *\n * #### Notes\n * If the item is not contained in the set, this is a no-op.\n */\n remove(item) {\n this._items.delete(item);\n }\n /**\n * Remove all items from the set.\n */\n clear() {\n this._items.clear();\n }\n}\n/**\n * The namespace for the `DisposableSet` class statics.\n */\n(function (DisposableSet) {\n /**\n * Create a disposable set from an iterable of items.\n *\n * @param items - The iterable object of interest.\n *\n * @returns A new disposable initialized with the given items.\n */\n function from(items) {\n let set = new DisposableSet();\n for (const item of items) {\n set.add(item);\n }\n return set;\n }\n DisposableSet.from = from;\n})(DisposableSet || (DisposableSet = {}));\n/**\n * An observable object which manages a collection of disposable items.\n */\nclass ObservableDisposableSet extends DisposableSet {\n constructor() {\n super(...arguments);\n this._disposed = new Signal(this);\n }\n /**\n * A signal emitted when the set is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * Dispose of the set and the items it contains.\n *\n * #### Notes\n * Items are disposed in the order they are added to the set.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n super.dispose();\n this._disposed.emit(undefined);\n Signal.clearData(this);\n }\n}\n/**\n * The namespace for the `ObservableDisposableSet` class statics.\n */\n(function (ObservableDisposableSet) {\n /**\n * Create an observable disposable set from an iterable of items.\n *\n * @param items - The iterable object of interest.\n *\n * @returns A new disposable initialized with the given items.\n */\n function from(items) {\n let set = new ObservableDisposableSet();\n for (const item of items) {\n set.add(item);\n }\n return set;\n }\n ObservableDisposableSet.from = from;\n})(ObservableDisposableSet || (ObservableDisposableSet = {}));\n\nexport { DisposableDelegate, DisposableSet, ObservableDisposableDelegate, ObservableDisposableSet };\n//# sourceMappingURL=index.es6.js.map\n","import { PromiseDelegate, JSONExt } from '@lumino/coreutils';\nimport { Signal } from '@lumino/signaling';\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/**\n * A class that wraps an asynchronous function to poll at a regular interval\n * with exponential increases to the interval length if the poll fails.\n *\n * @typeparam T - The resolved type of the factory's promises.\n * Defaults to `any`.\n *\n * @typeparam U - The rejected type of the factory's promises.\n * Defaults to `any`.\n *\n * @typeparam V - An optional type to extend the phases supported by a poll.\n * Defaults to `standby`, which already exists in the `Phase` type.\n */\nclass Poll {\n /**\n * Instantiate a new poll with exponential backoff in case of failure.\n *\n * @param options - The poll instantiation options.\n */\n constructor(options) {\n var _a;\n this._disposed = new Signal(this);\n this._lingered = 0;\n this._tick = new PromiseDelegate();\n this._ticked = new Signal(this);\n this._factory = options.factory;\n this._linger = (_a = options.linger) !== null && _a !== void 0 ? _a : Private.DEFAULT_LINGER;\n this._standby = options.standby || Private.DEFAULT_STANDBY;\n this._state = { ...Private.DEFAULT_STATE, timestamp: new Date().getTime() };\n // Normalize poll frequency `max` to be the greater of\n // default `max`, `options.frequency.max`, or `options.frequency.interval`.\n const frequency = options.frequency || {};\n const max = Math.max(frequency.interval || 0, frequency.max || 0, Private.DEFAULT_FREQUENCY.max);\n this.frequency = { ...Private.DEFAULT_FREQUENCY, ...frequency, ...{ max } };\n this.name = options.name || Private.DEFAULT_NAME;\n if ('auto' in options ? options.auto : true) {\n setTimeout(() => this.start());\n }\n }\n /**\n * A signal emitted when the poll is disposed.\n */\n get disposed() {\n return this._disposed;\n }\n /**\n * The polling frequency parameters.\n */\n get frequency() {\n return this._frequency;\n }\n set frequency(frequency) {\n if (this.isDisposed || JSONExt.deepEqual(frequency, this.frequency || {})) {\n return;\n }\n let { backoff, interval, max } = frequency;\n interval = Math.round(interval);\n max = Math.round(max);\n if (typeof backoff === 'number' && backoff < 1) {\n throw new Error('Poll backoff growth factor must be at least 1');\n }\n if ((interval < 0 || interval > max) && interval !== Poll.NEVER) {\n throw new Error('Poll interval must be between 0 and max');\n }\n if (max > Poll.MAX_INTERVAL && max !== Poll.NEVER) {\n throw new Error(`Max interval must be less than ${Poll.MAX_INTERVAL}`);\n }\n this._frequency = { backoff, interval, max };\n }\n /**\n * Whether the poll is disposed.\n */\n get isDisposed() {\n return this.state.phase === 'disposed';\n }\n /**\n * Indicates when the poll switches to standby.\n */\n get standby() {\n return this._standby;\n }\n set standby(standby) {\n if (this.isDisposed || this.standby === standby) {\n return;\n }\n this._standby = standby;\n }\n /**\n * The poll state, which is the content of the current poll tick.\n */\n get state() {\n return this._state;\n }\n /**\n * A promise that resolves when the poll next ticks.\n */\n get tick() {\n return this._tick.promise;\n }\n /**\n * A signal emitted when the poll ticks and fires off a new request.\n */\n get ticked() {\n return this._ticked;\n }\n /**\n * Return an async iterator that yields every tick.\n */\n async *[Symbol.asyncIterator]() {\n while (!this.isDisposed) {\n yield this.state;\n await this.tick.catch(() => undefined);\n }\n }\n /**\n * Dispose the poll.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this._state = {\n ...Private.DISPOSED_STATE,\n timestamp: new Date().getTime()\n };\n this._tick.promise.catch(_ => undefined);\n this._tick.reject(new Error(`Poll (${this.name}) is disposed.`));\n this._disposed.emit(undefined);\n Signal.clearData(this);\n }\n /**\n * Refreshes the poll. Schedules `refreshed` tick if necessary.\n *\n * @returns A promise that resolves after tick is scheduled and never rejects.\n *\n * #### Notes\n * The returned promise resolves after the tick is scheduled, but before\n * the polling action is run. To wait until after the poll action executes,\n * await the `poll.tick` promise: `await poll.refresh(); await poll.tick;`\n */\n refresh() {\n return this.schedule({\n cancel: ({ phase }) => phase === 'refreshed',\n interval: Poll.IMMEDIATE,\n phase: 'refreshed'\n });\n }\n /**\n * Schedule the next poll tick.\n *\n * @param next - The next poll state data to schedule. Defaults to standby.\n *\n * @param next.cancel - Cancels state transition if function returns `true`.\n *\n * @returns A promise that resolves when the next poll state is active.\n *\n * #### Notes\n * This method is not meant to be invoked by user code typically. It is public\n * to allow poll instances to be composed into classes that schedule ticks.\n */\n async schedule(next = {}) {\n if (this.isDisposed) {\n return;\n }\n // Check if the phase transition should be canceled.\n if (next.cancel && next.cancel(this.state)) {\n return;\n }\n // Update poll state.\n const pending = this._tick;\n const scheduled = new PromiseDelegate();\n const state = {\n interval: this.frequency.interval,\n payload: null,\n phase: 'standby',\n timestamp: new Date().getTime(),\n ...next\n };\n this._state = state;\n this._tick = scheduled;\n // Clear the schedule if possible.\n clearTimeout(this._timeout);\n // Emit ticked signal, resolve pending promise, and await its settlement.\n this._ticked.emit(this.state);\n pending.resolve(this);\n await pending.promise;\n if (state.interval === Poll.NEVER) {\n this._timeout = undefined;\n return;\n }\n // Schedule next execution and cache its timeout handle.\n const execute = () => {\n if (this.isDisposed || this.tick !== scheduled.promise) {\n return;\n }\n this._execute();\n };\n // Cache the handle in case it needs to be unscheduled.\n this._timeout = setTimeout(execute, state.interval);\n }\n /**\n * Starts the poll. Schedules `started` tick if necessary.\n *\n * @returns A promise that resolves after tick is scheduled and never rejects.\n */\n start() {\n return this.schedule({\n cancel: ({ phase }) => phase !== 'constructed' && phase !== 'standby' && phase !== 'stopped',\n interval: Poll.IMMEDIATE,\n phase: 'started'\n });\n }\n /**\n * Stops the poll. Schedules `stopped` tick if necessary.\n *\n * @returns A promise that resolves after tick is scheduled and never rejects.\n */\n stop() {\n return this.schedule({\n cancel: ({ phase }) => phase === 'stopped',\n interval: Poll.NEVER,\n phase: 'stopped'\n });\n }\n /**\n * Whether the poll is hidden.\n *\n * #### Notes\n * This property is only relevant in a browser context.\n */\n get hidden() {\n return Private.hidden;\n }\n /**\n * Execute a new poll factory promise or stand by if necessary.\n */\n _execute() {\n let standby = typeof this.standby === 'function' ? this.standby() : this.standby;\n // Check if execution should proceed, linger, or stand by.\n if (standby === 'never') {\n standby = false;\n }\n else if (standby === 'when-hidden') {\n if (this.hidden) {\n standby = ++this._lingered > this._linger;\n }\n else {\n this._lingered = 0;\n standby = false;\n }\n }\n // If in standby mode schedule next tick without calling the factory.\n if (standby) {\n void this.schedule();\n return;\n }\n const pending = this.tick;\n this._factory(this.state)\n .then((resolved) => {\n if (this.isDisposed || this.tick !== pending) {\n return;\n }\n void this.schedule({\n payload: resolved,\n phase: this.state.phase === 'rejected' ? 'reconnected' : 'resolved'\n });\n })\n .catch((rejected) => {\n if (this.isDisposed || this.tick !== pending) {\n return;\n }\n void this.schedule({\n interval: Private.sleep(this.frequency, this.state),\n payload: rejected,\n phase: 'rejected'\n });\n });\n }\n}\n/**\n * A namespace for `Poll` types, interfaces, and statics.\n */\n(function (Poll) {\n /**\n * An interval value in ms that indicates the poll should tick immediately.\n */\n Poll.IMMEDIATE = 0;\n /**\n * Delays are 32-bit integers in many browsers so intervals need to be capped.\n *\n * #### Notes\n * https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout#Maximum_delay_value\n */\n Poll.MAX_INTERVAL = 2147483647;\n /**\n * An interval value that indicates the poll should never tick.\n */\n Poll.NEVER = Infinity;\n})(Poll || (Poll = {}));\n/**\n * A namespace for private module data.\n */\nvar Private;\n(function (Private) {\n /**\n * The default backoff growth rate if `backoff` is `true`.\n */\n Private.DEFAULT_BACKOFF = 3;\n /**\n * The default polling frequency.\n */\n Private.DEFAULT_FREQUENCY = {\n backoff: true,\n interval: 1000,\n max: 30 * 1000\n };\n /**\n * The default number of times to `linger` when a poll is hidden.\n */\n Private.DEFAULT_LINGER = 1;\n /**\n * The default poll name.\n */\n Private.DEFAULT_NAME = 'unknown';\n /**\n * The default poll standby behavior.\n */\n Private.DEFAULT_STANDBY = 'when-hidden';\n /**\n * The first poll tick state's default values superseded in constructor.\n */\n Private.DEFAULT_STATE = {\n interval: Poll.NEVER,\n payload: null,\n phase: 'constructed',\n timestamp: new Date(0).getTime()\n };\n /**\n * The disposed tick state values.\n */\n Private.DISPOSED_STATE = {\n interval: Poll.NEVER,\n payload: null,\n phase: 'disposed',\n timestamp: new Date(0).getTime()\n };\n /**\n * Returns the number of milliseconds to sleep before the next tick.\n *\n * @param frequency - The poll's base frequency.\n * @param last - The poll's last tick.\n */\n function sleep(frequency, last) {\n const { backoff, interval, max } = frequency;\n if (interval === Poll.NEVER) {\n return interval;\n }\n const growth = backoff === true ? Private.DEFAULT_BACKOFF : backoff === false ? 1 : backoff;\n const random = getRandomIntInclusive(interval, last.interval * growth);\n return Math.min(max, random);\n }\n Private.sleep = sleep;\n /**\n * Keep track of whether the document is hidden. This flag is only relevant in\n * a browser context.\n *\n * Listen to `visibilitychange` event to set the `hidden` flag.\n *\n * Listening to `pagehide` is also necessary because Safari support for\n * `visibilitychange` events is partial, cf.\n * https://developer.mozilla.org/docs/Web/API/Document/visibilitychange_event\n */\n Private.hidden = (() => {\n if (typeof document === 'undefined') {\n return false;\n }\n document.addEventListener('visibilitychange', () => {\n Private.hidden = document.visibilityState === 'hidden';\n });\n document.addEventListener('pagehide', () => {\n Private.hidden = document.visibilityState === 'hidden';\n });\n return document.visibilityState === 'hidden';\n })();\n /**\n * Get a random integer between min and max, inclusive of both.\n *\n * #### Notes\n * From\n * https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Math/random#Getting_a_random_integer_between_two_values_inclusive\n *\n * From the MDN page: It might be tempting to use Math.round() to accomplish\n * that, but doing so would cause your random numbers to follow a non-uniform\n * distribution, which may not be acceptable for your needs.\n */\n function getRandomIntInclusive(min, max) {\n min = Math.ceil(min);\n max = Math.floor(max);\n return Math.floor(Math.random() * (max - min + 1)) + min;\n }\n})(Private || (Private = {}));\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/**\n * A base class to implement rate limiters with different invocation strategies.\n *\n * @typeparam T - The resolved type of the underlying function.\n *\n * @typeparam U - The rejected type of the underlying function.\n *\n * @typeparam V - Arguments for the underlying function.\n */\nclass RateLimiter {\n /**\n * Instantiate a rate limiter.\n *\n * @param fn - The function to rate limit.\n *\n * @param limit - The rate limit; defaults to 500ms.\n */\n constructor(fn, limit = 500) {\n /**\n * Arguments for the underlying function.\n */\n this.args = undefined;\n /**\n * A promise that resolves on each successful invocation.\n */\n this.payload = null;\n this.limit = limit;\n this.poll = new Poll({\n auto: false,\n factory: async () => {\n const { args } = this;\n this.args = undefined;\n return fn(...args);\n },\n frequency: { backoff: false, interval: Poll.NEVER, max: Poll.NEVER },\n standby: 'never'\n });\n this.payload = new PromiseDelegate();\n this.poll.ticked.connect((_, state) => {\n const { payload } = this;\n if (state.phase === 'resolved') {\n this.payload = new PromiseDelegate();\n payload.resolve(state.payload);\n return;\n }\n if (state.phase === 'rejected' || state.phase === 'stopped') {\n this.payload = new PromiseDelegate();\n payload.promise.catch(_ => undefined);\n payload.reject(state.payload);\n return;\n }\n }, this);\n }\n /**\n * Whether the rate limiter is disposed.\n */\n get isDisposed() {\n return this.payload === null;\n }\n /**\n * Disposes the rate limiter.\n */\n dispose() {\n if (this.isDisposed) {\n return;\n }\n this.args = undefined;\n this.payload = null;\n this.poll.dispose();\n }\n /**\n * Stop the function if it is mid-flight.\n */\n async stop() {\n return this.poll.stop();\n }\n}\n/**\n * Wraps and debounces a function that can be called multiple times and only\n * executes the underlying function one `interval` after the last invocation.\n *\n * @typeparam T - The resolved type of the underlying function. Defaults to any.\n *\n * @typeparam U - The rejected type of the underlying function. Defaults to any.\n *\n * @typeparam V - Arguments for the underlying function. Defaults to any[].\n */\nclass Debouncer extends RateLimiter {\n /**\n * Invokes the function and only executes after rate limit has elapsed.\n * Each invocation resets the timer.\n */\n invoke(...args) {\n this.args = args;\n void this.poll.schedule({ interval: this.limit, phase: 'invoked' });\n return this.payload.promise;\n }\n}\n/**\n * Wraps and throttles a function that can be called multiple times and only\n * executes the underlying function once per `interval`.\n *\n * @typeparam T - The resolved type of the underlying function. Defaults to any.\n *\n * @typeparam U - The rejected type of the underlying function. Defaults to any.\n *\n * @typeparam V - Arguments for the underlying function. Defaults to any[].\n */\nclass Throttler extends RateLimiter {\n /**\n * Instantiate a throttler.\n *\n * @param fn - The function being throttled.\n *\n * @param options - Throttling configuration or throttling limit in ms.\n *\n * #### Notes\n * The `edge` defaults to `leading`; the `limit` defaults to `500`.\n */\n constructor(fn, options) {\n super(fn, typeof options === 'number' ? options : options && options.limit);\n this._trailing = false;\n if (typeof options !== 'number' && options && options.edge === 'trailing') {\n this._trailing = true;\n }\n this._interval = this._trailing ? this.limit : Poll.IMMEDIATE;\n }\n /**\n * Throttles function invocations if one is currently in flight.\n */\n invoke(...args) {\n const idle = this.poll.state.phase !== 'invoked';\n if (idle || this._trailing) {\n this.args = args;\n }\n if (idle) {\n void this.poll.schedule({ interval: this._interval, phase: 'invoked' });\n }\n return this.payload.promise;\n }\n}\n\nexport { Debouncer, Poll, RateLimiter, Throttler };\n//# sourceMappingURL=index.es6.js.map\n","// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * @packageDocumentation\n * @module properties\n */\n/**\n * A class which attaches a value to an external object.\n *\n * #### Notes\n * Attached properties are used to extend the state of an object with\n * semantic data from an unrelated class. They also encapsulate value\n * creation, coercion, and notification.\n *\n * Because attached property values are stored in a hash table, which\n * in turn is stored in a WeakMap keyed on the owner object, there is\n * non-trivial storage overhead involved in their use. The pattern is\n * therefore best used for the storage of rare data.\n */\nclass AttachedProperty {\n /**\n * Construct a new attached property.\n *\n * @param options - The options for initializing the property.\n */\n constructor(options) {\n this._pid = Private.nextPID();\n this.name = options.name;\n this._create = options.create;\n this._coerce = options.coerce || null;\n this._compare = options.compare || null;\n this._changed = options.changed || null;\n }\n /**\n * Get the current value of the property for a given owner.\n *\n * @param owner - The property owner of interest.\n *\n * @returns The current value of the property.\n *\n * #### Notes\n * If the value has not yet been set, the default value will be\n * computed and assigned as the current value of the property.\n */\n get(owner) {\n let value;\n let map = Private.ensureMap(owner);\n if (this._pid in map) {\n value = map[this._pid];\n }\n else {\n value = map[this._pid] = this._createValue(owner);\n }\n return value;\n }\n /**\n * Set the current value of the property for a given owner.\n *\n * @param owner - The property owner of interest.\n *\n * @param value - The value for the property.\n *\n * #### Notes\n * If the value has not yet been set, the default value will be\n * computed and used as the previous value for the comparison.\n */\n set(owner, value) {\n let oldValue;\n let map = Private.ensureMap(owner);\n if (this._pid in map) {\n oldValue = map[this._pid];\n }\n else {\n oldValue = map[this._pid] = this._createValue(owner);\n }\n let newValue = this._coerceValue(owner, value);\n this._maybeNotify(owner, oldValue, (map[this._pid] = newValue));\n }\n /**\n * Explicitly coerce the current property value for a given owner.\n *\n * @param owner - The property owner of interest.\n *\n * #### Notes\n * If the value has not yet been set, the default value will be\n * computed and used as the previous value for the comparison.\n */\n coerce(owner) {\n let oldValue;\n let map = Private.ensureMap(owner);\n if (this._pid in map) {\n oldValue = map[this._pid];\n }\n else {\n oldValue = map[this._pid] = this._createValue(owner);\n }\n let newValue = this._coerceValue(owner, oldValue);\n this._maybeNotify(owner, oldValue, (map[this._pid] = newValue));\n }\n /**\n * Get or create the default value for the given owner.\n */\n _createValue(owner) {\n let create = this._create;\n return create(owner);\n }\n /**\n * Coerce the value for the given owner.\n */\n _coerceValue(owner, value) {\n let coerce = this._coerce;\n return coerce ? coerce(owner, value) : value;\n }\n /**\n * Compare the old value and new value for equality.\n */\n _compareValue(oldValue, newValue) {\n let compare = this._compare;\n return compare ? compare(oldValue, newValue) : oldValue === newValue;\n }\n /**\n * Run the change notification if the given values are different.\n */\n _maybeNotify(owner, oldValue, newValue) {\n let changed = this._changed;\n if (changed && !this._compareValue(oldValue, newValue)) {\n changed(owner, oldValue, newValue);\n }\n }\n}\n/**\n * The namespace for the `AttachedProperty` class statics.\n */\n(function (AttachedProperty) {\n /**\n * Clear the stored property data for the given owner.\n *\n * @param owner - The property owner of interest.\n *\n * #### Notes\n * This will clear all property values for the owner, but it will\n * **not** run the change notification for any of the properties.\n */\n function clearData(owner) {\n Private.ownerData.delete(owner);\n }\n AttachedProperty.clearData = clearData;\n})(AttachedProperty || (AttachedProperty = {}));\n/**\n * The namespace for the module implementation details.\n */\nvar Private;\n(function (Private) {\n /**\n * A weak mapping of property owner to property map.\n */\n Private.ownerData = new WeakMap();\n /**\n * A function which computes successive unique property ids.\n */\n Private.nextPID = (() => {\n let id = 0;\n return () => {\n let rand = Math.random();\n let stem = `${rand}`.slice(2);\n return `pid-${stem}-${id++}`;\n };\n })();\n /**\n * Lookup the data map for the property owner.\n *\n * This will create the map if one does not already exist.\n */\n function ensureMap(owner) {\n let map = Private.ownerData.get(owner);\n if (map) {\n return map;\n }\n map = Object.create(null);\n Private.ownerData.set(owner, map);\n return map;\n }\n Private.ensureMap = ensureMap;\n})(Private || (Private = {}));\n\nexport { AttachedProperty };\n//# sourceMappingURL=index.es6.js.map\n","import { find, ArrayExt } from '@lumino/algorithm';\nimport { PromiseDelegate } from '@lumino/coreutils';\n\n// Copyright (c) Jupyter Development Team.\n// Distributed under the terms of the Modified BSD License.\n/*-----------------------------------------------------------------------------\n| Copyright (c) 2014-2017, PhosphorJS Contributors\n|\n| Distributed under the terms of the BSD 3-Clause License.\n|\n| The full license is in the file LICENSE, distributed with this software.\n|----------------------------------------------------------------------------*/\n/**\n * @packageDocumentation\n * @module signaling\n */\n/**\n * A concrete implementation of `ISignal`.\n *\n * #### Example\n * ```typescript\n * import { ISignal, Signal } from '@lumino/signaling';\n *\n * class SomeClass {\n *\n * constructor(name: string) {\n * this.name = name;\n * }\n *\n * readonly name: string;\n *\n * get valueChanged: ISignal {\n * return this._valueChanged;\n * }\n *\n * get value(): number {\n * return this._value;\n * }\n *\n * set value(value: number) {\n * if (value === this._value) {\n * return;\n * }\n * this._value = value;\n * this._valueChanged.emit(value);\n * }\n *\n * private _value = 0;\n * private _valueChanged = new Signal(this);\n * }\n *\n * function logger(sender: SomeClass, value: number): void {\n * console.log(sender.name, value);\n * }\n *\n * let m1 = new SomeClass('foo');\n * let m2 = new SomeClass('bar');\n *\n * m1.valueChanged.connect(logger);\n * m2.valueChanged.connect(logger);\n *\n * m1.value = 42; // logs: foo 42\n * m2.value = 17; // logs: bar 17\n * ```\n */\nclass Signal {\n /**\n * Construct a new signal.\n *\n * @param sender - The sender which owns the signal.\n */\n constructor(sender) {\n this.sender = sender;\n }\n /**\n * Connect a slot to the signal.\n *\n * @param slot - The slot to invoke when the signal is emitted.\n *\n * @param thisArg - The `this` context for the slot. If provided,\n * this must be a non-primitive object.\n *\n * @returns `true` if the connection succeeds, `false` otherwise.\n */\n connect(slot, thisArg) {\n return Private.connect(this, slot, thisArg);\n }\n /**\n * Disconnect a slot from the signal.\n *\n * @param slot - The slot to disconnect from the signal.\n *\n * @param thisArg - The `this` context for the slot. If provided,\n * this must be a non-primitive object.\n *\n * @returns `true` if the connection is removed, `false` otherwise.\n */\n disconnect(slot, thisArg) {\n return Private.disconnect(this, slot, thisArg);\n }\n /**\n * Emit the signal and invoke the connected slots.\n *\n * @param args - The args to pass to the connected slots.\n *\n * #### Notes\n * Slots are invoked synchronously in connection order.\n *\n * Exceptions thrown by connected slots will be caught and logged.\n */\n emit(args) {\n Private.emit(this, args);\n }\n}\n/**\n * The namespace for the `Signal` class statics.\n */\n(function (Signal) {\n /**\n * Remove all connections between a sender and receiver.\n *\n * @param sender - The sender object of interest.\n *\n * @param receiver - The receiver object of interest.\n *\n * #### Notes\n * If a `thisArg` is provided when connecting a signal, that object\n * is considered the receiver. Otherwise, the `slot` is considered\n * the receiver.\n */\n function disconnectBetween(sender, receiver) {\n Private.disconnectBetween(sender, receiver);\n }\n Signal.disconnectBetween = disconnectBetween;\n /**\n * Remove all connections where the given object is the sender.\n *\n * @param sender - The sender object of interest.\n */\n function disconnectSender(sender) {\n Private.disconnectSender(sender);\n }\n Signal.disconnectSender = disconnectSender;\n /**\n * Remove all connections where the given object is the receiver.\n *\n * @param receiver - The receiver object of interest.\n *\n * #### Notes\n * If a `thisArg` is provided when connecting a signal, that object\n * is considered the receiver. Otherwise, the `slot` is considered\n * the receiver.\n */\n function disconnectReceiver(receiver) {\n Private.disconnectReceiver(receiver);\n }\n Signal.disconnectReceiver = disconnectReceiver;\n /**\n * Remove all connections where an object is the sender or receiver.\n *\n * @param object - The object of interest.\n *\n * #### Notes\n * If a `thisArg` is provided when connecting a signal, that object\n * is considered the receiver. Otherwise, the `slot` is considered\n * the receiver.\n */\n function disconnectAll(object) {\n Private.disconnectAll(object);\n }\n Signal.disconnectAll = disconnectAll;\n /**\n * Clear all signal data associated with the given object.\n *\n * @param object - The object for which the data should be cleared.\n *\n * #### Notes\n * This removes all signal connections and any other signal data\n * associated with the object.\n */\n function clearData(object) {\n Private.disconnectAll(object);\n }\n Signal.clearData = clearData;\n /**\n * Get the signal exception handler.\n *\n * @returns The current exception handler.\n *\n * #### Notes\n * The default exception handler is `console.error`.\n */\n function getExceptionHandler() {\n return Private.exceptionHandler;\n }\n Signal.getExceptionHandler = getExceptionHandler;\n /**\n * Set the signal exception handler.\n *\n * @param handler - The function to use as the exception handler.\n *\n * @returns The old exception handler.\n *\n * #### Notes\n * The exception handler is invoked when a slot throws an exception.\n */\n function setExceptionHandler(handler) {\n let old = Private.exceptionHandler;\n Private.exceptionHandler = handler;\n return old;\n }\n Signal.setExceptionHandler = setExceptionHandler;\n})(Signal || (Signal = {}));\n/**\n * A concrete implementation of `IStream`.\n *\n * #### Example\n * ```typescript\n * import { IStream, Stream } from '@lumino/signaling';\n *\n * class SomeClass {\n *\n * constructor(name: string) {\n * this.name = name;\n * }\n *\n * readonly name: string;\n *\n * get pings(): IStream {\n * return this._pings;\n * }\n *\n * ping(value: string) {\n * this._pings.emit(value);\n * }\n *\n * private _pings = new Stream(this);\n * }\n *\n * let m1 = new SomeClass('foo');\n *\n * m1.pings.connect((_, value: string) => {\n * console.log('connect', value);\n * });\n *\n * void (async () => {\n * for await (const ping of m1.pings) {\n * console.log('iterator', ping);\n * }\n * })();\n *\n * m1.ping('alpha'); // logs: connect alpha\n * // logs: iterator alpha\n * m1.ping('beta'); // logs: connect beta\n * // logs: iterator beta\n * ```\n */\nclass Stream extends Signal {\n constructor() {\n super(...arguments);\n this._pending = new PromiseDelegate();\n }\n /**\n * Return an async iterator that yields every emission.\n */\n async *[Symbol.asyncIterator]() {\n let pending = this._pending;\n while (true) {\n try {\n const { args, next } = await pending.promise;\n pending = next;\n yield args;\n }\n catch (_) {\n return; // Any promise rejection stops the iterator.\n }\n }\n }\n /**\n * Emit the signal, invoke the connected slots, and yield the emission.\n *\n * @param args - The args to pass to the connected slots.\n */\n emit(args) {\n const pending = this._pending;\n const next = (this._pending = new PromiseDelegate());\n pending.resolve({ args, next });\n super.emit(args);\n }\n /**\n * Stop the stream's async iteration.\n */\n stop() {\n this._pending.promise.catch(() => undefined);\n this._pending.reject('stop');\n this._pending = new PromiseDelegate();\n }\n}\n/**\n * The namespace for the module implementation details.\n */\nvar Private;\n(function (Private) {\n /**\n * The signal exception handler function.\n */\n Private.exceptionHandler = (err) => {\n console.error(err);\n };\n /**\n * Connect a slot to a signal.\n *\n * @param signal - The signal of interest.\n *\n * @param slot - The slot to invoke when the signal is emitted.\n *\n * @param thisArg - The `this` context for the slot. If provided,\n * this must be a non-primitive object.\n *\n * @returns `true` if the connection succeeds, `false` otherwise.\n */\n function connect(signal, slot, thisArg) {\n // Coerce a `null` `thisArg` to `undefined`.\n thisArg = thisArg || undefined;\n // Ensure the sender's array of receivers is created.\n let receivers = receiversForSender.get(signal.sender);\n if (!receivers) {\n receivers = [];\n receiversForSender.set(signal.sender, receivers);\n }\n // Bail if a matching connection already exists.\n if (findConnection(receivers, signal, slot, thisArg)) {\n return false;\n }\n // Choose the best object for the receiver.\n let receiver = thisArg || slot;\n // Ensure the receiver's array of senders is created.\n let senders = sendersForReceiver.get(receiver);\n if (!senders) {\n senders = [];\n sendersForReceiver.set(receiver, senders);\n }\n // Create a new connection and add it to the end of each array.\n let connection = { signal, slot, thisArg };\n receivers.push(connection);\n senders.push(connection);\n // Indicate a successful connection.\n return true;\n }\n Private.connect = connect;\n /**\n * Disconnect a slot from a signal.\n *\n * @param signal - The signal of interest.\n *\n * @param slot - The slot to disconnect from the signal.\n *\n * @param thisArg - The `this` context for the slot. If provided,\n * this must be a non-primitive object.\n *\n * @returns `true` if the connection is removed, `false` otherwise.\n */\n function disconnect(signal, slot, thisArg) {\n // Coerce a `null` `thisArg` to `undefined`.\n thisArg = thisArg || undefined;\n // Lookup the list of receivers, and bail if none exist.\n let receivers = receiversForSender.get(signal.sender);\n if (!receivers || receivers.length === 0) {\n return false;\n }\n // Bail if no matching connection exits.\n let connection = findConnection(receivers, signal, slot, thisArg);\n if (!connection) {\n return false;\n }\n // Choose the best object for the receiver.\n let receiver = thisArg || slot;\n // Lookup the array of senders, which is now known to exist.\n let senders = sendersForReceiver.get(receiver);\n // Clear the connection and schedule cleanup of the arrays.\n connection.signal = null;\n scheduleCleanup(receivers);\n scheduleCleanup(senders);\n // Indicate a successful disconnection.\n return true;\n }\n Private.disconnect = disconnect;\n /**\n * Remove all connections between a sender and receiver.\n *\n * @param sender - The sender object of interest.\n *\n * @param receiver - The receiver object of interest.\n */\n function disconnectBetween(sender, receiver) {\n // If there are no receivers, there is nothing to do.\n let receivers = receiversForSender.get(sender);\n if (!receivers || receivers.length === 0) {\n return;\n }\n // If there are no senders, there is nothing to do.\n let senders = sendersForReceiver.get(receiver);\n if (!senders || senders.length === 0) {\n return;\n }\n // Clear each connection between the sender and receiver.\n for (const connection of senders) {\n // Skip connections which have already been cleared.\n if (!connection.signal) {\n continue;\n }\n // Clear the connection if it matches the sender.\n if (connection.signal.sender === sender) {\n connection.signal = null;\n }\n }\n // Schedule a cleanup of the senders and receivers.\n scheduleCleanup(receivers);\n scheduleCleanup(senders);\n }\n Private.disconnectBetween = disconnectBetween;\n /**\n * Remove all connections where the given object is the sender.\n *\n * @param sender - The sender object of interest.\n */\n function disconnectSender(sender) {\n // If there are no receivers, there is nothing to do.\n let receivers = receiversForSender.get(sender);\n if (!receivers || receivers.length === 0) {\n return;\n }\n // Clear each receiver connection.\n for (const connection of receivers) {\n // Skip connections which have already been cleared.\n if (!connection.signal) {\n continue;\n }\n // Choose the best object for the receiver.\n let receiver = connection.thisArg || connection.slot;\n // Clear the connection.\n connection.signal = null;\n // Cleanup the array of senders, which is now known to exist.\n scheduleCleanup(sendersForReceiver.get(receiver));\n }\n // Schedule a cleanup of the receivers.\n scheduleCleanup(receivers);\n }\n Private.disconnectSender = disconnectSender;\n /**\n * Remove all connections where the given object is the receiver.\n *\n * @param receiver - The receiver object of interest.\n */\n function disconnectReceiver(receiver) {\n // If there are no senders, there is nothing to do.\n let senders = sendersForReceiver.get(receiver);\n if (!senders || senders.length === 0) {\n return;\n }\n // Clear each sender connection.\n for (const connection of senders) {\n // Skip connections which have already been cleared.\n if (!connection.signal) {\n continue;\n }\n // Lookup the sender for the connection.\n let sender = connection.signal.sender;\n // Clear the connection.\n connection.signal = null;\n // Cleanup the array of receivers, which is now known to exist.\n scheduleCleanup(receiversForSender.get(sender));\n }\n // Schedule a cleanup of the list of senders.\n scheduleCleanup(senders);\n }\n Private.disconnectReceiver = disconnectReceiver;\n /**\n * Remove all connections where an object is the sender or receiver.\n *\n * @param object - The object of interest.\n */\n function disconnectAll(object) {\n // Remove all connections where the given object is the sender.\n disconnectSender(object);\n // Remove all connections where the given object is the receiver.\n disconnectReceiver(object);\n }\n Private.disconnectAll = disconnectAll;\n /**\n * Emit a signal and invoke its connected slots.\n *\n * @param signal - The signal of interest.\n *\n * @param args - The args to pass to the connected slots.\n *\n * #### Notes\n * Slots are invoked synchronously in connection order.\n *\n * Exceptions thrown by connected slots will be caught and logged.\n */\n function emit(signal, args) {\n // If there are no receivers, there is nothing to do.\n let receivers = receiversForSender.get(signal.sender);\n if (!receivers || receivers.length === 0) {\n return;\n }\n // Invoke the slots for connections with a matching signal.\n // Any connections added during emission are not invoked.\n for (let i = 0, n = receivers.length; i < n; ++i) {\n let connection = receivers[i];\n if (connection.signal === signal) {\n invokeSlot(connection, args);\n }\n }\n }\n Private.emit = emit;\n /**\n * A weak mapping of sender to array of receiver connections.\n */\n const receiversForSender = new WeakMap();\n /**\n * A weak mapping of receiver to array of sender connections.\n */\n const sendersForReceiver = new WeakMap();\n /**\n * A set of connection arrays which are pending cleanup.\n */\n const dirtySet = new Set();\n /**\n * A function to schedule an event loop callback.\n */\n const schedule = (() => {\n let ok = typeof requestAnimationFrame === 'function';\n return ok ? requestAnimationFrame : setImmediate;\n })();\n /**\n * Find a connection which matches the given parameters.\n */\n function findConnection(connections, signal, slot, thisArg) {\n return find(connections, connection => connection.signal === signal &&\n connection.slot === slot &&\n connection.thisArg === thisArg);\n }\n /**\n * Invoke a slot with the given parameters.\n *\n * The connection is assumed to be valid.\n *\n * Exceptions in the slot will be caught and logged.\n */\n function invokeSlot(connection, args) {\n let { signal, slot, thisArg } = connection;\n try {\n slot.call(thisArg, signal.sender, args);\n }\n catch (err) {\n Private.exceptionHandler(err);\n }\n }\n /**\n * Schedule a cleanup of a connection array.\n *\n * This will add the array to the dirty set and schedule a deferred\n * cleanup of the array contents. On cleanup, any connection with a\n * `null` signal will be removed from the array.\n */\n function scheduleCleanup(array) {\n if (dirtySet.size === 0) {\n schedule(cleanupDirtySet);\n }\n dirtySet.add(array);\n }\n /**\n * Cleanup the connection lists in the dirty set.\n *\n * This function should only be invoked asynchronously, when the\n * stack frame is guaranteed to not be on the path of user code.\n */\n function cleanupDirtySet() {\n dirtySet.forEach(cleanupConnections);\n dirtySet.clear();\n }\n /**\n * Cleanup the dirty connections in a connections array.\n *\n * This will remove any connection with a `null` signal.\n *\n * This function should only be invoked asynchronously, when the\n * stack frame is guaranteed to not be on the path of user code.\n */\n function cleanupConnections(connections) {\n ArrayExt.removeAllWhere(connections, isDeadConnection);\n }\n /**\n * Test whether a connection is dead.\n *\n * A dead connection has a `null` signal.\n */\n function isDeadConnection(connection) {\n return connection.signal === null;\n }\n})(Private || (Private = {}));\n\nexport { Signal, Stream };\n//# sourceMappingURL=index.es6.js.map\n","'use strict';\n\nvar isMergeableObject = function isMergeableObject(value) {\n\treturn isNonNullObject(value)\n\t\t&& !isSpecial(value)\n};\n\nfunction isNonNullObject(value) {\n\treturn !!value && typeof value === 'object'\n}\n\nfunction isSpecial(value) {\n\tvar stringValue = Object.prototype.toString.call(value);\n\n\treturn stringValue === '[object RegExp]'\n\t\t|| stringValue === '[object Date]'\n\t\t|| isReactElement(value)\n}\n\n// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25\nvar canUseSymbol = typeof Symbol === 'function' && Symbol.for;\nvar REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;\n\nfunction isReactElement(value) {\n\treturn value.$$typeof === REACT_ELEMENT_TYPE\n}\n\nfunction emptyTarget(val) {\n\treturn Array.isArray(val) ? [] : {}\n}\n\nfunction cloneUnlessOtherwiseSpecified(value, options) {\n\treturn (options.clone !== false && options.isMergeableObject(value))\n\t\t? deepmerge(emptyTarget(value), value, options)\n\t\t: value\n}\n\nfunction defaultArrayMerge(target, source, options) {\n\treturn target.concat(source).map(function(element) {\n\t\treturn cloneUnlessOtherwiseSpecified(element, options)\n\t})\n}\n\nfunction getMergeFunction(key, options) {\n\tif (!options.customMerge) {\n\t\treturn deepmerge\n\t}\n\tvar customMerge = options.customMerge(key);\n\treturn typeof customMerge === 'function' ? customMerge : deepmerge\n}\n\nfunction getEnumerableOwnPropertySymbols(target) {\n\treturn Object.getOwnPropertySymbols\n\t\t? Object.getOwnPropertySymbols(target).filter(function(symbol) {\n\t\t\treturn Object.propertyIsEnumerable.call(target, symbol)\n\t\t})\n\t\t: []\n}\n\nfunction getKeys(target) {\n\treturn Object.keys(target).concat(getEnumerableOwnPropertySymbols(target))\n}\n\nfunction propertyIsOnObject(object, property) {\n\ttry {\n\t\treturn property in object\n\t} catch(_) {\n\t\treturn false\n\t}\n}\n\n// Protects from prototype poisoning and unexpected merging up the prototype chain.\nfunction propertyIsUnsafe(target, key) {\n\treturn propertyIsOnObject(target, key) // Properties are safe to merge if they don't exist in the target yet,\n\t\t&& !(Object.hasOwnProperty.call(target, key) // unsafe if they exist up the prototype chain,\n\t\t\t&& Object.propertyIsEnumerable.call(target, key)) // and also unsafe if they're nonenumerable.\n}\n\nfunction mergeObject(target, source, options) {\n\tvar destination = {};\n\tif (options.isMergeableObject(target)) {\n\t\tgetKeys(target).forEach(function(key) {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(target[key], options);\n\t\t});\n\t}\n\tgetKeys(source).forEach(function(key) {\n\t\tif (propertyIsUnsafe(target, key)) {\n\t\t\treturn\n\t\t}\n\n\t\tif (propertyIsOnObject(target, key) && options.isMergeableObject(source[key])) {\n\t\t\tdestination[key] = getMergeFunction(key, options)(target[key], source[key], options);\n\t\t} else {\n\t\t\tdestination[key] = cloneUnlessOtherwiseSpecified(source[key], options);\n\t\t}\n\t});\n\treturn destination\n}\n\nfunction deepmerge(target, source, options) {\n\toptions = options || {};\n\toptions.arrayMerge = options.arrayMerge || defaultArrayMerge;\n\toptions.isMergeableObject = options.isMergeableObject || isMergeableObject;\n\t// cloneUnlessOtherwiseSpecified is added to `options` so that custom arrayMerge()\n\t// implementations can use it. The caller may not replace it.\n\toptions.cloneUnlessOtherwiseSpecified = cloneUnlessOtherwiseSpecified;\n\n\tvar sourceIsArray = Array.isArray(source);\n\tvar targetIsArray = Array.isArray(target);\n\tvar sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;\n\n\tif (!sourceAndTargetTypesMatch) {\n\t\treturn cloneUnlessOtherwiseSpecified(source, options)\n\t} else if (sourceIsArray) {\n\t\treturn options.arrayMerge(target, source, options)\n\t} else {\n\t\treturn mergeObject(target, source, options)\n\t}\n}\n\ndeepmerge.all = function deepmergeAll(array, options) {\n\tif (!Array.isArray(array)) {\n\t\tthrow new Error('first argument should be an array')\n\t}\n\n\treturn array.reduce(function(prev, next) {\n\t\treturn deepmerge(prev, next, options)\n\t}, {})\n};\n\nvar deepmerge_1 = deepmerge;\n\nmodule.exports = deepmerge_1;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.attributeNames = exports.elementNames = void 0;\nexports.elementNames = new Map([\n [\"altglyph\", \"altGlyph\"],\n [\"altglyphdef\", \"altGlyphDef\"],\n [\"altglyphitem\", \"altGlyphItem\"],\n [\"animatecolor\", \"animateColor\"],\n [\"animatemotion\", \"animateMotion\"],\n [\"animatetransform\", \"animateTransform\"],\n [\"clippath\", \"clipPath\"],\n [\"feblend\", \"feBlend\"],\n [\"fecolormatrix\", \"feColorMatrix\"],\n [\"fecomponenttransfer\", \"feComponentTransfer\"],\n [\"fecomposite\", \"feComposite\"],\n [\"feconvolvematrix\", \"feConvolveMatrix\"],\n [\"fediffuselighting\", \"feDiffuseLighting\"],\n [\"fedisplacementmap\", \"feDisplacementMap\"],\n [\"fedistantlight\", \"feDistantLight\"],\n [\"fedropshadow\", \"feDropShadow\"],\n [\"feflood\", \"feFlood\"],\n [\"fefunca\", \"feFuncA\"],\n [\"fefuncb\", \"feFuncB\"],\n [\"fefuncg\", \"feFuncG\"],\n [\"fefuncr\", \"feFuncR\"],\n [\"fegaussianblur\", \"feGaussianBlur\"],\n [\"feimage\", \"feImage\"],\n [\"femerge\", \"feMerge\"],\n [\"femergenode\", \"feMergeNode\"],\n [\"femorphology\", \"feMorphology\"],\n [\"feoffset\", \"feOffset\"],\n [\"fepointlight\", \"fePointLight\"],\n [\"fespecularlighting\", \"feSpecularLighting\"],\n [\"fespotlight\", \"feSpotLight\"],\n [\"fetile\", \"feTile\"],\n [\"feturbulence\", \"feTurbulence\"],\n [\"foreignobject\", \"foreignObject\"],\n [\"glyphref\", \"glyphRef\"],\n [\"lineargradient\", \"linearGradient\"],\n [\"radialgradient\", \"radialGradient\"],\n [\"textpath\", \"textPath\"],\n]);\nexports.attributeNames = new Map([\n [\"definitionurl\", \"definitionURL\"],\n [\"attributename\", \"attributeName\"],\n [\"attributetype\", \"attributeType\"],\n [\"basefrequency\", \"baseFrequency\"],\n [\"baseprofile\", \"baseProfile\"],\n [\"calcmode\", \"calcMode\"],\n [\"clippathunits\", \"clipPathUnits\"],\n [\"diffuseconstant\", \"diffuseConstant\"],\n [\"edgemode\", \"edgeMode\"],\n [\"filterunits\", \"filterUnits\"],\n [\"glyphref\", \"glyphRef\"],\n [\"gradienttransform\", \"gradientTransform\"],\n [\"gradientunits\", \"gradientUnits\"],\n [\"kernelmatrix\", \"kernelMatrix\"],\n [\"kernelunitlength\", \"kernelUnitLength\"],\n [\"keypoints\", \"keyPoints\"],\n [\"keysplines\", \"keySplines\"],\n [\"keytimes\", \"keyTimes\"],\n [\"lengthadjust\", \"lengthAdjust\"],\n [\"limitingconeangle\", \"limitingConeAngle\"],\n [\"markerheight\", \"markerHeight\"],\n [\"markerunits\", \"markerUnits\"],\n [\"markerwidth\", \"markerWidth\"],\n [\"maskcontentunits\", \"maskContentUnits\"],\n [\"maskunits\", \"maskUnits\"],\n [\"numoctaves\", \"numOctaves\"],\n [\"pathlength\", \"pathLength\"],\n [\"patterncontentunits\", \"patternContentUnits\"],\n [\"patterntransform\", \"patternTransform\"],\n [\"patternunits\", \"patternUnits\"],\n [\"pointsatx\", \"pointsAtX\"],\n [\"pointsaty\", \"pointsAtY\"],\n [\"pointsatz\", \"pointsAtZ\"],\n [\"preservealpha\", \"preserveAlpha\"],\n [\"preserveaspectratio\", \"preserveAspectRatio\"],\n [\"primitiveunits\", \"primitiveUnits\"],\n [\"refx\", \"refX\"],\n [\"refy\", \"refY\"],\n [\"repeatcount\", \"repeatCount\"],\n [\"repeatdur\", \"repeatDur\"],\n [\"requiredextensions\", \"requiredExtensions\"],\n [\"requiredfeatures\", \"requiredFeatures\"],\n [\"specularconstant\", \"specularConstant\"],\n [\"specularexponent\", \"specularExponent\"],\n [\"spreadmethod\", \"spreadMethod\"],\n [\"startoffset\", \"startOffset\"],\n [\"stddeviation\", \"stdDeviation\"],\n [\"stitchtiles\", \"stitchTiles\"],\n [\"surfacescale\", \"surfaceScale\"],\n [\"systemlanguage\", \"systemLanguage\"],\n [\"tablevalues\", \"tableValues\"],\n [\"targetx\", \"targetX\"],\n [\"targety\", \"targetY\"],\n [\"textlength\", \"textLength\"],\n [\"viewbox\", \"viewBox\"],\n [\"viewtarget\", \"viewTarget\"],\n [\"xchannelselector\", \"xChannelSelector\"],\n [\"ychannelselector\", \"yChannelSelector\"],\n [\"zoomandpan\", \"zoomAndPan\"],\n]);\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n/*\n * Module dependencies\n */\nvar ElementType = __importStar(require(\"domelementtype\"));\nvar entities_1 = require(\"entities\");\n/**\n * Mixed-case SVG and MathML tags & attributes\n * recognized by the HTML parser.\n *\n * @see https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inforeign\n */\nvar foreignNames_1 = require(\"./foreignNames\");\nvar unencodedElements = new Set([\n \"style\",\n \"script\",\n \"xmp\",\n \"iframe\",\n \"noembed\",\n \"noframes\",\n \"plaintext\",\n \"noscript\",\n]);\n/**\n * Format attributes\n */\nfunction formatAttributes(attributes, opts) {\n if (!attributes)\n return;\n return Object.keys(attributes)\n .map(function (key) {\n var _a, _b;\n var value = (_a = attributes[key]) !== null && _a !== void 0 ? _a : \"\";\n if (opts.xmlMode === \"foreign\") {\n /* Fix up mixed-case attribute names */\n key = (_b = foreignNames_1.attributeNames.get(key)) !== null && _b !== void 0 ? _b : key;\n }\n if (!opts.emptyAttrs && !opts.xmlMode && value === \"\") {\n return key;\n }\n return key + \"=\\\"\" + (opts.decodeEntities !== false\n ? entities_1.encodeXML(value)\n : value.replace(/\"/g, \""\")) + \"\\\"\";\n })\n .join(\" \");\n}\n/**\n * Self-enclosing tags\n */\nvar singleTag = new Set([\n \"area\",\n \"base\",\n \"basefont\",\n \"br\",\n \"col\",\n \"command\",\n \"embed\",\n \"frame\",\n \"hr\",\n \"img\",\n \"input\",\n \"isindex\",\n \"keygen\",\n \"link\",\n \"meta\",\n \"param\",\n \"source\",\n \"track\",\n \"wbr\",\n]);\n/**\n * Renders a DOM node or an array of DOM nodes to a string.\n *\n * Can be thought of as the equivalent of the `outerHTML` of the passed node(s).\n *\n * @param node Node to be rendered.\n * @param options Changes serialization behavior\n */\nfunction render(node, options) {\n if (options === void 0) { options = {}; }\n var nodes = \"length\" in node ? node : [node];\n var output = \"\";\n for (var i = 0; i < nodes.length; i++) {\n output += renderNode(nodes[i], options);\n }\n return output;\n}\nexports.default = render;\nfunction renderNode(node, options) {\n switch (node.type) {\n case ElementType.Root:\n return render(node.children, options);\n case ElementType.Directive:\n case ElementType.Doctype:\n return renderDirective(node);\n case ElementType.Comment:\n return renderComment(node);\n case ElementType.CDATA:\n return renderCdata(node);\n case ElementType.Script:\n case ElementType.Style:\n case ElementType.Tag:\n return renderTag(node, options);\n case ElementType.Text:\n return renderText(node, options);\n }\n}\nvar foreignModeIntegrationPoints = new Set([\n \"mi\",\n \"mo\",\n \"mn\",\n \"ms\",\n \"mtext\",\n \"annotation-xml\",\n \"foreignObject\",\n \"desc\",\n \"title\",\n]);\nvar foreignElements = new Set([\"svg\", \"math\"]);\nfunction renderTag(elem, opts) {\n var _a;\n // Handle SVG / MathML in HTML\n if (opts.xmlMode === \"foreign\") {\n /* Fix up mixed-case element names */\n elem.name = (_a = foreignNames_1.elementNames.get(elem.name)) !== null && _a !== void 0 ? _a : elem.name;\n /* Exit foreign mode at integration points */\n if (elem.parent &&\n foreignModeIntegrationPoints.has(elem.parent.name)) {\n opts = __assign(__assign({}, opts), { xmlMode: false });\n }\n }\n if (!opts.xmlMode && foreignElements.has(elem.name)) {\n opts = __assign(__assign({}, opts), { xmlMode: \"foreign\" });\n }\n var tag = \"<\" + elem.name;\n var attribs = formatAttributes(elem.attribs, opts);\n if (attribs) {\n tag += \" \" + attribs;\n }\n if (elem.children.length === 0 &&\n (opts.xmlMode\n ? // In XML mode or foreign mode, and user hasn't explicitly turned off self-closing tags\n opts.selfClosingTags !== false\n : // User explicitly asked for self-closing tags, even in HTML mode\n opts.selfClosingTags && singleTag.has(elem.name))) {\n if (!opts.xmlMode)\n tag += \" \";\n tag += \"/>\";\n }\n else {\n tag += \">\";\n if (elem.children.length > 0) {\n tag += render(elem.children, opts);\n }\n if (opts.xmlMode || !singleTag.has(elem.name)) {\n tag += \"\";\n }\n }\n return tag;\n}\nfunction renderDirective(elem) {\n return \"<\" + elem.data + \">\";\n}\nfunction renderText(elem, opts) {\n var data = elem.data || \"\";\n // If entities weren't decoded, no need to encode them back\n if (opts.decodeEntities !== false &&\n !(!opts.xmlMode &&\n elem.parent &&\n unencodedElements.has(elem.parent.name))) {\n data = entities_1.encodeXML(data);\n }\n return data;\n}\nfunction renderCdata(elem) {\n return \"\";\n}\nfunction renderComment(elem) {\n return \"\";\n}\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Doctype = exports.CDATA = exports.Tag = exports.Style = exports.Script = exports.Comment = exports.Directive = exports.Text = exports.Root = exports.isTag = exports.ElementType = void 0;\n/** Types of elements found in htmlparser2's DOM */\nvar ElementType;\n(function (ElementType) {\n /** Type for the root element of a document */\n ElementType[\"Root\"] = \"root\";\n /** Type for Text */\n ElementType[\"Text\"] = \"text\";\n /** Type for */\n ElementType[\"Directive\"] = \"directive\";\n /** Type for */\n ElementType[\"Comment\"] = \"comment\";\n /** Type for With so many different ways of configuring Manim, it can be difficult to know when each config option is being set. In fact, this will depend on how Manim is being used. If Manim is imported from a module, then the configuration system will follow these steps: 1. The library-wide config file is loaded. 2. The user-wide and folder-wide files are loaded if they exist. 3. All files found in the previous two steps are parsed in a single :class:`ConfigParser` object, called ``parser``. This is where *cascading* happens. 4. :class:`logging.Logger` is instantiated to create Manim's global ``logger`` object. It is configured using the "logger" section of the parser, i.e. ``parser['logger']``. 5. :class:`ManimConfig` is instantiated to create the global ``config`` object. 6. The ``parser`` from step 3 is fed into the ``config`` from step 5 via :meth:`ManimConfig.digest_parser`. 7. Both ``logger`` and ``config`` are exposed to the user. If Manim is being invoked from the command line, all of the previous steps happen, and are complemented by: 8. The CLI flags are parsed and fed into ``config`` via :meth:`~ManimConfig.digest_args`. 9. If the ``--config_file`` flag was used, a new :class:`ConfigParser` object is created with the contents of the library-wide file, the user-wide file if it exists, and the file passed via ``--config_file``. In this case, the folder-wide file, if it exists, is ignored. 10. The new parser is fed into ``config``. 11. The rest of the CLI flags are processed. To summarize, the order of precedence for configuration options, from lowest to highest precedence is: 1. Library-wide config file, 2. user-wide config file, if it exists, 3. folder-wide config file, if it exists OR custom config file, if passed via ``--config_file``, 4. other CLI flags, and 5. any programmatic changes made after the config system is set. A list of all config options **************************** .. code:: ['aspect_ratio', 'assets_dir', 'background_color', 'background_opacity', 'bottom', 'custom_folders', 'disable_caching', 'dry_run', 'ffmpeg_loglevel', 'flush_cache', 'frame_height', 'frame_rate', 'frame_size', 'frame_width', 'frame_x_radius', 'frame_y_radius', 'from_animation_number', `fullscreen`, 'images_dir', 'input_file', 'left_side', 'log_dir', 'log_to_file', 'max_files_cached', 'media_dir', 'media_width', 'movie_file_extension', 'notify_outdated_version', 'output_file', 'partial_movie_dir', 'pixel_height', 'pixel_width', 'plugins', 'preview', 'progress_bar', 'quality', 'right_side', 'save_as_gif', 'save_last_frame', 'save_pngs', 'scene_names', 'show_in_file_browser', 'sound', 'tex_dir', 'tex_template', 'tex_template_file', 'text_dir', 'top', 'transparent', 'upto_animation_number', 'use_opengl_renderer', 'verbosity', 'video_dir', 'window_position', 'window_monitor', 'window_size', 'write_all', 'write_to_movie', 'enable_wireframe', 'force_window'] Accessing CLI command options ***************************** Entering ``manim``, or ``manim --help``, will open the main help page. .. code:: Usage: manim [OPTIONS] COMMAND [ARGS]... Animation engine for explanatory math videos. Options: --version Show version and exit. --help Show this message and exit. Commands: cfg Manages Manim configuration files. init Sets up a new project in current working directory with default settings. It copies files from templates directory and pastes them in the current working dir. new Create a new project or insert a new scene. plugins Manages Manim plugins. render Render SCENE(S) from the input FILE. See 'manim ' to read about a specific subcommand. Made with <3 by Manim Community developers. Each of the subcommands has its own help page which can be accessed similarly: .. code:: manim render manim render --help ManimCommunity-manim-1157b74/docs/source/guides/deep_dive.rst000066400000000000000000001466141515024150700242350ustar00rootroot00000000000000A deep dive into Manim's internals ================================== **Author:** `Benjamin Hackl `__ .. admonition:: Disclaimer This guide reflects the state of the library as of version ``v0.16.0`` and primarily treats the Cairo renderer. The situation in the latest version of Manim might be different; in case of substantial deviations we will add a note below. Introduction ------------ Manim can be a wonderful library, if it behaves the way you would like it to, and/or the way you expect it to. Unfortunately, this is not always the case (as you probably know if you have played with some manimations yourself already). To understand where things *go wrong*, digging through the library's source code is sometimes the only option -- but in order to do that, you need to know where to start digging. This article is intended as some sort of life line through the render process. We aim to give an appropriate amount of detail describing what happens when Manim reads your scene code and produces the corresponding animation. Throughout this article, we will focus on the following toy example:: from manim import * class ToyExample(Scene): def construct(self): orange_square = Square(color=ORANGE, fill_opacity=0.5) blue_circle = Circle(color=BLUE, fill_opacity=0.5) self.add(orange_square) self.play(ReplacementTransform(orange_square, blue_circle, run_time=3)) small_dot = Dot() small_dot.add_updater(lambda mob: mob.next_to(blue_circle, DOWN)) self.play(Create(small_dot)) self.play(blue_circle.animate.shift(RIGHT)) self.wait() self.play(FadeOut(blue_circle, small_dot)) Before we go into details or even look at the rendered output of this scene, let us first describe verbally what happens in this *manimation*. In the first three lines of the ``construct`` method, a :class:`.Square` and a :class:`.Circle` are initialized, then the square is added to the scene. The first frame of the rendered output should thus show an orange square. Then the actual animations happen: the square first transforms into a circle, then a :class:`.Dot` is created (Where do you guess the dot is located when it is first added to the scene? Answering this already requires detailed knowledge about the render process.). The dot has an updater attached to it, and as the circle moves right, the dot moves with it. In the end, all mobjects are faded out. Actually rendering the code yields the following video: .. manim:: ToyExample :hide_source: class ToyExample(Scene): def construct(self): orange_square = Square(color=ORANGE, fill_opacity=0.5) blue_circle = Circle(color=BLUE, fill_opacity=0.5) self.add(orange_square) self.play(ReplacementTransform(orange_square, blue_circle, run_time=3)) small_dot = Dot() small_dot.add_updater(lambda mob: mob.next_to(blue_circle, DOWN)) self.play(Create(small_dot)) self.play(blue_circle.animate.shift(RIGHT)) self.wait() self.play(FadeOut(blue_circle, small_dot)) For this example, the output (fortunately) coincides with our expectations. Overview -------- Because there is a lot of information in this article, here is a brief overview discussing the contents of the following chapters on a very high level. - `Preliminaries`_: In this chapter we unravel all the steps that take place to prepare a scene for rendering; right until the point where the user-overridden ``construct`` method is ran. This includes a brief discussion on using Manim's CLI versus other means of rendering (e.g., via Jupyter notebooks, or in your Python script by calling the :meth:`.Scene.render` method yourself). - `Mobject Initialization`_: For the second chapter we dive into creating and handling Mobjects, the basic elements that should be displayed in our scene. We discuss the :class:`.Mobject` base class, how there are essentially three different types of Mobjects, and then discuss the most important of them, vectorized Mobjects. In particular, we describe the internal point data structure that governs how the mechanism responsible for drawing the vectorized Mobject to the screen sets the corresponding Bรฉzier curves. We conclude the chapter with a tour into :meth:`.Scene.add`, the bookkeeping mechanism controlling which mobjects should be rendered. - `Animations and the Render Loop`_: And finally, in the last chapter we walk through the instantiation of :class:`.Animation` objects (the blueprints that hold information on how Mobjects should be modified when the render loop runs), followed by a investigation of the infamous :meth:`.Scene.play` call. We will see that there are three relevant parts in a :meth:`.Scene.play` call; a part in which the passed animations and keyword arguments are processed and prepared, followed by the actual "render loop" in which the library steps through a time line and renders frame by frame. The final part does some post-processing to save a short video segment ("partial movie file") and cleanup for the next call to :meth:`.Scene.play`. In the end, after all of :meth:`.Scene.construct` has been run, the library combines the partial movie files to one video. And with that, let us get *in medias res*. Preliminaries ------------- Importing the library ^^^^^^^^^^^^^^^^^^^^^ Independent of how exactly you are telling your system to render the scene, i.e., whether you run ``manim -qm -p file_name.py ToyExample``, or whether you are rendering the scene directly from the Python script via a snippet like :: with tempconfig({"quality": "medium_quality", "preview": True}): scene = ToyExample() scene.render() or whether you are rendering the code in a Jupyter notebook, you are still telling your python interpreter to import the library. The usual pattern used to do this is :: from manim import * which (while being a debatable strategy in general) imports a lot of classes and functions shipped with the library and makes them available in your global name space. I explicitly avoided stating that it imports **all** classes and functions of the library, because it does not do that: Manim makes use of the practice described in `Section 6.4.1 of the Python tutorial `__, and all module members that should be exposed to the user upon running the ``*``-import are explicitly declared in the ``__all__`` variable of the module. Manim also uses this strategy internally: taking a peek at the file that is run when the import is called, ``__init__.py`` (see `here `__), you will notice that most of the code in that module is concerned with importing members from various different submodules, again using ``*``-imports. .. hint:: If you would ever contribute a new submodule to Manim, the main ``__init__.py`` is where it would have to be listed in order to make its members accessible to users after importing the library. In that file, there is one particular import at the beginning of the file however, namely:: from ._config import * This initializes Manim's global configuration system, which is used in various places throughout the library. After the library runs this line, the current configuration options are set. The code in there takes care of reading the options in your ``.cfg`` files (all users have at least the global one that is shipped with the library) as well as correctly handling command line arguments (if you used the CLI to render). You can read more about the config system in the :doc:`corresponding thematic guide `, and if you are interested in learning more about the internals of the configuration system and how it is initialized, follow the code flow starting in `the config module's init file `__. Now that the library is imported, we can turn our attention to the next step: reading your scene code (which is not particularly exciting, Python just creates a new class ``ToyExample`` based on our code; Manim is virtually not involved in that step, with the exception that ``ToyExample`` inherits from ``Scene``). However, with the ``ToyExample`` class created and ready to go, there is a new excellent question to answer: how is the code in our ``construct`` method actually executed? Scene instantiation and rendering ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The answer to this question depends on how exactly you are running the code. To make things a bit clearer, let us first consider the case that you have created a file ``toy_example.py`` which looks like this:: from manim import * class ToyExample(Scene): def construct(self): orange_square = Square(color=ORANGE, fill_opacity=0.5) blue_circle = Circle(color=BLUE, fill_opacity=0.5) self.add(orange_square) self.play(ReplacementTransform(orange_square, blue_circle, run_time=3)) small_dot = Dot() small_dot.add_updater(lambda mob: mob.next_to(blue_circle, DOWN)) self.play(Create(small_dot)) self.play(blue_circle.animate.shift(RIGHT)) self.wait() self.play(FadeOut(blue_circle, small_dot)) with tempconfig({"quality": "medium_quality", "preview": True}): scene = ToyExample() scene.render() With such a file, the desired scene is rendered by simply running this Python script via ``python toy_example.py``. Then, as described above, the library is imported and Python has read and defined the ``ToyExample`` class (but, read carefully: *no instance of this class has been created yet*). At this point, the interpreter is about to enter the ``tempconfig`` context manager. Even if you have not seen Manim's ``tempconfig`` before, its name already suggests what it does: it creates a copy of the current state of the configuration, applies the changes to the key-value pairs in the passed dictionary, and upon leaving the context the original version of the configuration is restored. TL;DR: it provides a fancy way of temporarily setting configuration options. Inside the context manager, two things happen: an actual ``ToyExample``-scene object is instantiated, and the ``render`` method is called. Every way of using Manim ultimately does something along of these lines, the library always instantiates the scene object and then calls its ``render`` method. To illustrate that this really is the case, let us briefly look at the two most common ways of rendering scenes: **Command Line Interface.** When using the CLI and running the command ``manim -qm -p toy_example.py ToyExample`` in your terminal, the actual entry point is Manim's ``__main__.py`` file (located `here `__. Manim uses `Click `__ to implement the command line interface, and the corresponding code is located in Manim's ``cli`` module (https://github.com/ManimCommunity/manim/tree/main/manim/cli). The corresponding code creating the scene class and calling its render method is located `here `__. **Jupyter notebooks.** In Jupyter notebooks, the communication with the library is handled by the ``%%manim`` magic command, which is implemented in the ``manim.utils.ipython_magic`` module. There is :meth:`some documentation <.ManimMagic.manim>` available for the magic command, and the code creating the scene class and calling its render method is located `here `__. Now that we know that either way, a :class:`.Scene` object is created, let us investigate what Manim does when that happens. When instantiating our scene object :: scene = ToyExample() the ``Scene.__init__`` method is called, given that we did not implement our own initialization method. Inspecting the corresponding code (see `here `__) reveals that ``Scene.__init__`` first sets several attributes of the scene objects that do not depend on any configuration options set in ``config``. Then the scene inspects the value of ``config.renderer``, and based on its value, either instantiates a ``CairoRenderer`` or an ``OpenGLRenderer`` object and assigns it to its ``renderer`` attribute. The scene then asks its renderer to initialize the scene by calling :: self.renderer.init_scene(self) Inspecting both the default Cairo renderer and the OpenGL renderer shows that the ``init_scene`` method effectively makes the renderer instantiate a :class:`.SceneFileWriter` object, which basically is Manim's interface to ``libav`` (FFMPEG) and actually writes the movie file. The Cairo renderer (see the implementation `here `__) does not require any further initialization. The OpenGL renderer does some additional setup to enable the realtime rendering preview window, which we do not go into detail further here. .. warning:: Currently, there is a lot of interplay between a scene and its renderer. This is a flaw in Manim's current architecture, and we are working on reducing this interdependency to achieve a less convoluted code flow. After the renderer has been instantiated and initialized its file writer, the scene populates further initial attributes (notable mention: the ``mobjects`` attribute which keeps track of the mobjects that have been added to the scene). It is then done with its instantiation and ready to be rendered. The rest of this article is concerned with the last line in our toy example script:: scene.render() This is where the actual magic happens. Inspecting the `implementation of the render method `__ reveals that there are several hooks that can be used for pre- or postprocessing a scene. Unsurprisingly, :meth:`.Scene.render` describes the full *render cycle* of a scene. During this life cycle, there are three custom methods whose base implementation is empty and that can be overwritten to suit your purposes. In the order they are called, these customizable methods are: - :meth:`.Scene.setup`, which is intended for preparing and, well, *setting up* the scene for your animation (e.g., adding initial mobjects, assigning custom attributes to your scene class, etc.), - :meth:`.Scene.construct`, which is the *script* for your screen play and contains programmatic descriptions of your animations, and - :meth:`.Scene.tear_down`, which is intended for any operations you might want to run on the scene after the last frame has already been rendered (for example, this could run some code that generates a custom thumbnail for the video based on the state of the objects in the scene -- this hook is more relevant for situations where Manim is used within other Python scripts). After these three methods are run, the animations have been fully rendered, and Manim calls :meth:`.CairoRenderer.scene_finished` to gracefully complete the rendering process. This checks whether any animations have been played -- and if so, it tells the :class:`.SceneFileWriter` to close the output file. If not, Manim assumes that a static image should be output which it then renders using the same strategy by calling the render loop (see below) once. **Back in our toy example,** the call to :meth:`.Scene.render` first triggers :meth:`.Scene.setup` (which only consists of ``pass``), followed by a call of :meth:`.Scene.construct`. At this point, our *animation script* is run, starting with the initialization of ``orange_square``. Mobject Initialization ---------------------- Mobjects are, in a nutshell, the Python objects that represent all the *things* we want to display in our scene. Before we follow our debugger into the depths of mobject initialization code, it makes sense to discuss Manim's different types of Mobjects and their basic data structure. What even is a Mobject? ^^^^^^^^^^^^^^^^^^^^^^^ :class:`.Mobject` stands for *mathematical object* or *Manim object* (depends on who you ask ๐Ÿ˜„). The Python class :class:`.Mobject` is the base class for all objects that should be displayed on screen. Looking at the `initialization method `__ of :class:`.Mobject`, you will find that not too much happens in there: - some initial attribute values are assigned, like ``name`` (which makes the render logs mention the name of the mobject instead of its type), ``submobjects`` (initially an empty list), ``color``, and some others. - Then, two methods related to *points* are called: ``reset_points`` followed by ``generate_points``, - and finally, ``init_colors`` is called. Digging deeper, you will find that :meth:`.Mobject.reset_points` simply sets the ``points`` attribute of the mobject to an empty NumPy vector, while the other two methods, :meth:`.Mobject.generate_points` and :meth:`.Mobject.init_colors` are just implemented as ``pass``. This makes sense: :class:`.Mobject` is not supposed to be used as an *actual* object that is displayed on screen; in fact the camera (which we will discuss later in more detail; it is the class that is, for the Cairo renderer, responsible for "taking a picture" of the current scene) does not process "pure" :class:`Mobjects <.Mobject>` in any way, they *cannot* even appear in the rendered output. This is where different types of mobjects come into play. Roughly speaking, the Cairo renderer setup knows three different types of mobjects that can be rendered: - :class:`.ImageMobject`, which represent images that you can display in your scene, - :class:`.PMobject`, which are very special mobjects used to represent point clouds; we will not discuss them further in this guide, - :class:`.VMobject`, which are *vectorized mobjects*, that is, mobjects that consist of points that are connected via curves. These are pretty much everywhere, and we will discuss them in detail in the next section. ... and what are VMobjects? ^^^^^^^^^^^^^^^^^^^^^^^^^^^ As just mentioned, :class:`VMobjects <.VMobject>` represent vectorized mobjects. To render a :class:`.VMobject`, the camera looks at the ``points`` attribute of a :class:`.VMobject` and divides it into sets of four points each. Each of these sets is then used to construct a cubic Bรฉzier curve with the first and last entry describing the end points of the curve ("anchors"), and the second and third entry describing the control points in between ("handles"). .. hint:: To learn more about Bรฉzier curves, take a look at the excellent online textbook `A Primer on Bรฉzier curves `__ by `Pomax `__ -- there is a playground representing cubic Bรฉzier curves `in ยง1 `__, the red and yellow points are "anchors", and the green and blue points are "handles". In contrast to :class:`.Mobject`, :class:`.VMobject` can be displayed on screen (even though, technically, it is still considered a base class). To illustrate how points are processed, consider the following short example of a :class:`.VMobject` with 8 points (and thus made out of 8/4 = 2 cubic Bรฉzier curves). The resulting :class:`.VMobject` is drawn in green. The handles are drawn as red dots with a line to their closest anchor. .. manim:: VMobjectDemo :save_last_frame: class VMobjectDemo(Scene): def construct(self): plane = NumberPlane() my_vmobject = VMobject(color=GREEN) my_vmobject.points = [ np.array([-2, -1, 0]), # start of first curve np.array([-3, 1, 0]), np.array([0, 3, 0]), np.array([1, 3, 0]), # end of first curve np.array([1, 3, 0]), # start of second curve np.array([0, 1, 0]), np.array([4, 3, 0]), np.array([4, -2, 0]), # end of second curve ] handles = [ Dot(point, color=RED) for point in [[-3, 1, 0], [0, 3, 0], [0, 1, 0], [4, 3, 0]] ] handle_lines = [ Line( my_vmobject.points[ind], my_vmobject.points[ind+1], color=RED, stroke_width=2 ) for ind in range(0, len(my_vmobject.points), 2) ] self.add(plane, *handles, *handle_lines, my_vmobject) .. warning:: Manually setting the points of your :class:`.VMobject` is usually discouraged; there are specialized methods that can take care of that for you -- but it might be relevant when implementing your own, custom :class:`.VMobject`. Squares and Circles: back to our Toy Example ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ With a basic understanding of different types of mobjects, and an idea of how vectorized mobjects are built we can now come back to our toy example and the execution of the :meth:`.Scene.construct` method. In the first two lines of our animation script, the ``orange_square`` and the ``blue_circle`` are initialized. When creating the orange square by running :: Square(color=ORANGE, fill_opacity=0.5) the initialization method of :class:`.Square`, ``Square.__init__``, is called. `Looking at the implementation `__, we can see that the ``side_length`` attribute of the square is set, and then :: super().__init__(height=side_length, width=side_length, **kwargs) is called. This ``super`` call is the Python way of calling the initialization function of the parent class. As :class:`.Square` inherits from :class:`.Rectangle`, the next method called is ``Rectangle.__init__``. There, only the first three lines are really relevant for us:: super().__init__(UR, UL, DL, DR, color=color, **kwargs) self.stretch_to_fit_width(width) self.stretch_to_fit_height(height) First, the initialization function of the parent class of :class:`.Rectangle` -- :class:`.Polygon` -- is called. The four positional arguments passed are the four corners of the polygon: ``UR`` is up right (and equal to ``UP + RIGHT``), ``UL`` is up left (and equal to ``UP + LEFT``), and so forth. Before we follow our debugger deeper, let us observe what happens with the constructed polygon: the remaining two lines stretch the polygon to fit the specified width and height such that a rectangle with the desired measurements is created. The initialization function of :class:`.Polygon` is particularly simple, it only calls the initialization function of its parent class, :class:`.Polygram`. There, we have almost reached the end of the chain: :class:`.Polygram` inherits from :class:`.VMobject`, whose initialization function mainly sets the values of some attributes (quite similar to ``Mobject.__init__``, but more specific to the Bรฉzier curves that make up the mobject). After calling the initialization function of :class:`.VMobject`, the constructor of :class:`.Polygram` also does something somewhat odd: it sets the points (which, you might remember above, should actually be set in a corresponding ``generate_points`` method of :class:`.Polygram`). .. warning:: In several instances, the implementation of mobjects does not really stick to all aspects of Manim's interface. This is unfortunate, and increasing consistency is something that we actively work on. Help is welcome! Without going too much into detail, :class:`.Polygram` sets its ``points`` attribute via :meth:`.VMobject.start_new_path`, :meth:`.VMobject.add_points_as_corners`, which take care of setting the quadruples of anchors and handles appropriately. After the points are set, Python continues to process the call stack until it reaches the method that was first called; the initialization method of :class:`.Square`. After this, the square is initialized and assigned to the ``orange_square`` variable. The initialization of ``blue_circle`` is similar to the one of ``orange_square``, with the main difference being that the inheritance chain of :class:`.Circle` is different. Let us briefly follow the trace of the debugger: The implementation of :meth:`.Circle.__init__` immediately calls the initialization method of :class:`.Arc`, as a circle in Manim is simply an arc with an angle of :math:`\tau = 2\pi`. When initializing the arc, some basic attributes are set (like ``Arc.radius``, ``Arc.arc_center``, ``Arc.start_angle``, and ``Arc.angle``), and then the initialization method of its parent class, :class:`.TipableVMobject`, is called (which is a rather abstract base class for mobjects which a arrow tip can be attached to). Note that in contrast to :class:`.Polygram`, this class does **not** preemptively generate the points of the circle. After that, things are less exciting: :class:`.TipableVMobject` again sets some attributes relevant for adding arrow tips, and afterwards passes to the initialization method of :class:`.VMobject`. From there, :class:`.Mobject` is initialized and :meth:`.Mobject.generate_points` is called, which actually runs the method implemented in :meth:`.Arc.generate_points`. After both our ``orange_square`` and the ``blue_circle`` are initialized, the square is actually added to the scene. The :meth:`.Scene.add` method is actually doing a few interesting things, so it is worth to dig a bit deeper in the next section. Adding Mobjects to the Scene ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The code in our ``construct`` method that is run next is :: self.add(orange_square) From a high-level point of view, :meth:`.Scene.add` adds the ``orange_square`` to the list of mobjects that should be rendered, which is stored in the ``mobjects`` attribute of the scene. However, it does so in a very careful way to avoid the situation that a mobject is being added to the scene more than once. At a first glance, this sounds like a simple task -- the problem is that ``Scene.mobjects`` is not a "flat" list of mobjects, but a list of mobjects which might contain mobjects themselves, and so on. Stepping through the code in :meth:`.Scene.add`, we see that first it is checked whether we are currently using the OpenGL renderer (which we are not) -- adding mobjects to the scene works slightly different (and actually easier!) for the OpenGL renderer. Then, the code branch for the Cairo renderer is entered and the list of so-called foreground mobjects (which are rendered on top of all other mobjects) is added to the list of passed mobjects. This is to ensure that the foreground mobjects will stay above of the other mobjects, even after adding the new ones. In our case, the list of foreground mobjects is actually empty, and nothing changes. Next, :meth:`.Scene.restructure_mobjects` is called with the list of mobjects to be added as the ``to_remove`` argument, which might sound odd at first. Practically, this ensures that mobjects are not added twice, as mentioned above: if they were present in the scene ``Scene.mobjects`` list before (even if they were contained as a child of some other mobject), they are first removed from the list. The way :meth:`.Scene.restructure_mobjects` works is rather aggressive: It always operates on a given list of mobjects; in the ``add`` method two different lists occur: the default one, ``Scene.mobjects`` (no extra keyword argument is passed), and ``Scene.moving_mobjects`` (which we will discuss later in more detail). It iterates through all of the members of the list, and checks whether any of the mobjects passed in ``to_remove`` are contained as children (in any nesting level). If so, **their parent mobject is deconstructed** and their siblings are inserted directly one level higher. Consider the following example:: >>> from manim import Scene, Square, Circle, Group >>> test_scene = Scene() >>> mob1 = Square() >>> mob2 = Circle() >>> mob_group = Group(mob1, mob2) >>> test_scene.add(mob_group) >>> test_scene.mobjects [Group] >>> test_scene.restructure_mobjects(to_remove=[mob1]) >>> test_scene.mobjects [Circle] Note that the group is disbanded and the circle moves into the root layer of mobjects in ``test_scene.mobjects``. After the mobject list is "restructured", the mobject to be added are simply appended to ``Scene.mobjects``. In our toy example, the ``Scene.mobjects`` list is actually empty, so the ``restructure_mobjects`` method does not actually do anything. The ``orange_square`` is simply added to ``Scene.mobjects``, and as the aforementioned ``Scene.moving_mobjects`` list is, at this point, also still empty, nothing happens and :meth:`.Scene.add` returns. We will hear more about the ``moving_mobject`` list when we discuss the render loop. Before we do that, let us look at the next line of code in our toy example, which includes the initialization of an animation class, :: ReplacementTransform(orange_square, blue_circle, run_time=3) Hence it is time to talk about :class:`.Animation`. Animations and the Render Loop ------------------------------ Initializing animations ^^^^^^^^^^^^^^^^^^^^^^^ Before we follow the trace of the debugger, let us briefly discuss the general structure of the (abstract) base class :class:`.Animation`. An animation object holds all the information necessary for the renderer to generate the corresponding frames. Animations (in the sense of animation objects) in Manim are *always* tied to a specific mobject; even in the case of :class:`.AnimationGroup` (which you should actually think of as an animation on a group of mobjects rather than a group of animations). Moreover, except for in a particular special case, the run time of animations is also fixed and known beforehand. The initialization of animations actually is not very exciting, :meth:`.Animation.__init__` merely sets some attributes derived from the passed keyword arguments and additionally ensures that the ``Animation.starting_mobject`` and ``Animation.mobject`` attributes are populated. Once the animation is played, the ``starting_mobject`` attribute holds an unmodified copy of the mobject the animation is attached to; during the initialization it is set to a placeholder mobject. The ``mobject`` attribute is set to the mobject the animation is attached to. Animations have a few special methods which are called during the render loop: - :meth:`.Animation.begin`, which is called (as hinted by its name) at the beginning of every animation, so before the first frame is rendered. In it, all the required setup for the animation happens. - :meth:`.Animation.finish` is the counterpart to the ``begin`` method which is called at the end of the life cycle of the animation (after the last frame has been rendered). - :meth:`.Animation.interpolate` is the method that updates the mobject attached to the animation to the corresponding animation completion percentage. For example, if in the render loop, ``some_animation.interpolate(0.5)`` is called, the attached mobject will be updated to the state where 50% of the animation are completed. We will discuss details about these and some further animation methods once we walk through the actual render loop. For now, we continue with our toy example and the code that is run when initializing the :class:`.ReplacementTransform` animation. The initialization method of :class:`.ReplacementTransform` only consists of a call to the constructor of its parent class, :class:`.Transform`, with the additional keyword argument ``replace_mobject_with_target_in_scene`` set to ``True``. :class:`.Transform` then sets attributes that control how the points of the starting mobject are deformed into the points of the target mobject, and then passes on to the initialization method of :class:`.Animation`. Other basic properties of the animation (like its ``run_time``, the ``rate_func``, etc.) are processed there -- and then the animation object is fully initialized and ready to be played. The ``play`` call: preparing to enter Manim's render loop ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ We are finally there, the render loop is in our reach. Let us walk through the code that is run when :meth:`.Scene.play` is called. .. hint:: Recall that this article is specifically about the Cairo renderer. Up to here, things were more or less the same for the OpenGL renderer as well; while some base mobjects might be different, the control flow and lifecycle of mobjects is still more or less the same. There are more substantial differences when it comes to the rendering loop. As you will see when inspecting the method, :meth:`.Scene.play` almost immediately passes over to the ``play`` method of the renderer, in our case :class:`.CairoRenderer.play`. The one thing :meth:`.Scene.play` takes care of is the management of subcaptions that you might have passed to it (see the the documentation of :meth:`.Scene.play` and :meth:`.Scene.add_subcaption` for more information). .. warning:: As has been said before, the communication between scene and renderer is not in a very clean state at this point, so the following paragraphs might be confusing if you don't run a debugger and step through the code yourself a bit. Inside :meth:`.CairoRenderer.play`, the renderer first checks whether it may skip rendering of the current play call. This might happen, for example, when ``-s`` is passed to the CLI (i.e., only the last frame should be rendered), or when the ``-n`` flag is passed and the current play call is outside of the specified render bounds. The "skipping status" is updated in form of the call to :meth:`.CairoRenderer.update_skipping_status`. Next, the renderer asks the scene to process the animations in the play call so that renderer obtains all of the information it needs. To be more concrete, :meth:`.Scene.compile_animation_data` is called, which then takes care of several things: - The method processes all animations and the keyword arguments passed to the initial :meth:`.Scene.play` call. In particular, this means that it makes sure all arguments passed to the play call are actually animations (or ``.animate`` syntax calls, which are also assembled to be actual :class:`.Animation`-objects at that point). It also propagates any animation-related keyword arguments (like ``run_time``, or ``rate_func``) passed to :class:`.Scene.play` to each individual animation. The processed animations are then stored in the ``animations`` attribute of the scene (which the renderer later reads...). - It adds all mobjects to which the animations that are played are bound to to the scene (provided the animation is not an mobject-introducing animation -- for these, the addition to the scene happens later). - In case the played animation is a :class:`.Wait` animation (this is the case in a :meth:`.Scene.wait` call), the method checks whether a static image should be rendered, or whether the render loop should be processed as usual (see :meth:`.Scene.should_update_mobjects` for the exact conditions, basically it checks whether there are any time-dependent updater functions and so on). - Finally, the method determines the total run time of the play call (which at this point is computed as the maximum of the run times of the passed animations). This is stored in the ``duration`` attribute of the scene. After the animation data has been compiled by the scene, the renderer continues to prepare for entering the render loop. It now checks the skipping status which has been determined before. If the renderer can skip this play call, it does so: it sets the current play call hash (which we will get back to in a moment) to ``None`` and increases the time of the renderer by the determined animation run time. Otherwise, the renderer checks whether or not Manim's caching system should be used. The idea of the caching system is simple: for every play call, a hash value is computed, which is then stored and upon re-rendering the scene, the hash is generated again and checked against the stored value. If it is the same, the cached output is reused, otherwise it is fully rerendered again. We will not go into details of the caching system here; if you would like to learn more, the :func:`.get_hash_from_play_call` function in the :mod:`.utils.hashing` module is essentially the entry point to the caching mechanism. In the event that the animation has to be rendered, the renderer asks its :class:`.SceneFileWriter` to open an output container. The process is started by a call to ``libav`` and opens a container to which rendered raw frames can be written. As long as the output is open, the container can be accessed via the ``output_container`` attribute of the file writer. With the writing process in place, the renderer then asks the scene to "begin" the animations. First, it literally *begins* all of the animations by calling their setup methods (:meth:`.Animation._setup_scene`, :meth:`.Animation.begin`). In doing so, the mobjects that are newly introduced by an animation (like via :class:`.Create` etc.) are added to the scene. Furthermore, the animation suspends updater functions being called on its mobject, and it sets its mobject to the state that corresponds to the first frame of the animation. After this has happened for all animations in the current ``play`` call, the Cairo renderer determines which of the scene's mobjects can be painted statically to the background, and which ones have to be redrawn every frame. It does so by calling :meth:`.Scene.get_moving_and_static_mobjects`, and the resulting partition of mobjects is stored in the corresponding ``moving_mobjects`` and ``static_mobjects`` attributes. .. NOTE:: The mechanism that determines static and moving mobjects is specific for the Cairo renderer, the OpenGL renderer works differently. Basically, moving mobjects are determined by checking whether they, any of their children, or any of the mobjects "below" them (in the sense of the order in which mobjects are processed in the scene) either have an update function attached, or whether they appear in one of the current animations. See the implementation of :meth:`.Scene.get_moving_mobjects` for more details. Up to this very point, we did not actually render any (partial) image or movie files from the scene yet. This is, however, about to change. Before we enter the render loop, let us briefly revisit our toy example and discuss how the generic :meth:`.Scene.play` call setup looks like there. For the call that plays the :class:`.ReplacementTransform`, there is no subcaption to be taken care of. The renderer then asks the scene to compile the animation data: the passed argument already is an animation (no additional preparations needed), there is no need for processing any keyword arguments (as we did not specify any additional ones to ``play``). The mobject bound to the animation, ``orange_square``, is already part of the scene (so again, no action taken). Finally, the run time is extracted (3 seconds long) and stored in ``Scene.duration``. The renderer then checks whether it should skip (it should not), then whether the animation is already cached (it is not). The corresponding animation hash value is determined and passed to the file writer, which then also calls ``libav`` to start the writing process which waits for rendered frames from the library. The scene then ``begin``\ s the animation: for the :class:`.ReplacementTransform` this means that the animation populates all of its relevant animation attributes (i.e., compatible copies of the starting and the target mobject so that it can safely interpolate between the two). The mechanism determining static and moving mobjects considers all of the scenes mobjects (at this point only the ``orange_square``), and determines that the ``orange_square`` is bound to an animation that is currently played. As a result, the square is classified as a "moving mobject". Time to render some frames. The render loop (for real this time) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As mentioned above, due to the mechanism that determines static and moving mobjects in the scene, the renderer knows which mobjects it can paint statically to the background of the scene. Practically, this means that it partially renders a scene (to produce a background image), and then when iterating through the time progression of the animation only the "moving mobjects" are re-painted on top of the static background. The renderer calls :meth:`.CairoRenderer.save_static_frame_data`, which first checks whether there are currently any static mobjects, and if there are, it updates the frame (only with the static mobjects; more about how exactly this works in a moment) and then saves a NumPy array representing the rendered frame in the ``static_image`` attribute. In our toy example, there are no static mobjects, and so the ``static_image`` attribute is simply set to ``None``. Next, the renderer asks the scene whether the current animation is a "frozen frame" animation, which would mean that the renderer actually does not have to repaint the moving mobjects in every frame of the time progression. It can then just take the latest static frame, and display it throughout the animation. .. NOTE:: An animation is considered a "frozen frame" animation if only a static :class:`.Wait` animation is played. See the description of :meth:`.Scene.compile_animation_data` above, or the implementation of :meth:`.Scene.should_update_mobjects` for more details. If this is not the case (just as in our toy example), the renderer then calls the :meth:`.Scene.play_internal` method, which is the integral part of the render loop (in which the library steps through the time progression of the animation and renders the corresponding frames). Within :meth:`.Scene.play_internal`, the following steps are performed: - The scene determines the run time of the animations by calling :meth:`.Scene.get_run_time`. This method basically takes the maximum ``run_time`` attribute of all of the animations passed to the :meth:`.Scene.play` call. - Then the *time progression* is constructed via the (internal) :meth:`.Scene._get_animation_time_progression` method, which wraps the actual :meth:`.Scene.get_time_progression` method. The time progression is a ``tqdm`` `progress bar object `__ for an iterator over ``np.arange(0, run_time, 1 / config.frame_rate)``. In other words, the time progression holds the time stamps (relative to the current animations, so starting at 0 and ending at the total animation run time, with the step size determined by the render frame rate) of the timeline where a new animation frame should be rendered. - Then the scene iterates over the time progression: for each time stamp ``t``, :meth:`.Scene.update_to_time` is called, which ... - ... first computes the time passed since the last update (which might be 0, especially for the initial call) and references it as ``dt``, - then (in the order in which the animations are passed to :meth:`.Scene.play`) calls :meth:`.Animation.update_mobjects` to trigger all updater functions that are attached to the respective animation except for the "main mobject" of the animation (that is, for example, for :class:`.Transform` the unmodified copies of start and target mobject -- see :meth:`.Animation.get_all_mobjects_to_update` for more details), - then the relative time progression with respect to the current animation is computed (``alpha = t / animation.run_time``), which is then used to update the state of the animation with a call to :meth:`.Animation.interpolate`. - After all of the passed animations have been processed, the updater functions of all mobjects in the scene, all meshes, and finally those attached to the scene itself are run. At this point, the internal (Python) state of all mobjects has been updated to match the currently processed timestamp. If rendering should not be skipped, then it is now time to *take a picture*! .. NOTE:: The update of the internal state (iteration over the time progression) happens *always* once :meth:`.Scene.play_internal` is entered. This ensures that even if frames do not need to be rendered (because, e.g., the ``-n`` CLI flag has been passed, something has been cached, or because we might be in a *Section* with skipped rendering), updater functions still run correctly, and the state of the first frame that *is* rendered is kept consistent. To render an image, the scene calls the corresponding method of its renderer, :meth:`.CairoRenderer.render` and passes just the list of *moving mobjects* (remember, the *static mobjects* are assumed to have already been painted statically to the background of the scene). All of the hard work then happens when the renderer updates its current frame via a call to :meth:`.CairoRenderer.update_frame`: First, the renderer prepares its :class:`.Camera` by checking whether the renderer has a ``static_image`` different from ``None`` stored already. If so, it sets the image as the *background image* of the camera via :meth:`.Camera.set_frame_to_background`, and otherwise it just resets the camera via :meth:`.Camera.reset`. The camera is then asked to capture the scene with a call to :meth:`.Camera.capture_mobjects`. Things get a bit technical here, and at some point it is more efficient to delve into the implementation -- but here is a summary of what happens once the camera is asked to capture the scene: - First, a flat list of mobjects is created (so submobjects get extracted from their parents). This list is then processed in groups of the same type of mobjects (e.g., a batch of vectorized mobjects, followed by a batch of image mobjects, followed by more vectorized mobjects, etc. -- in many cases there will just be one batch of vectorized mobjects). - Depending on the type of the currently processed batch, the camera uses dedicated *display functions* to convert the :class:`.Mobject` Python object to a NumPy array stored in the camera's ``pixel_array`` attribute. The most important example in that context is the display function for vectorized mobjects, :meth:`.Camera.display_multiple_vectorized_mobjects`, or the more particular (in case you did not add a background image to your :class:`.VMobject`), :meth:`.Camera.display_multiple_non_background_colored_vmobjects`. This method first gets the current Cairo context, and then, for every (vectorized) mobject in the batch, calls :meth:`.Camera.display_vectorized`. There, the actual background stroke, fill, and then stroke of the mobject is drawn onto the context. See :meth:`.Camera.apply_stroke` and :meth:`.Camera.set_cairo_context_color` for more details -- but it does not get much deeper than that, in the latter method the actual Bรฉzier curves determined by the points of the mobject are drawn; this is where the low-level interaction with Cairo happens. After all batches have been processed, the camera has an image representation of the Scene at the current time stamp in form of a NumPy array stored in its ``pixel_array`` attribute. The renderer then takes this array and passes it to its :class:`.SceneFileWriter`. This concludes one iteration of the render loop, and once the time progression has been processed completely, a final bit of cleanup is performed before the :meth:`.Scene.play_internal` call is completed. A TL;DR for the render loop, in the context of our toy example, reads as follows: - The scene finds that a 3 second long animation (the :class:`.ReplacementTransform` changing the orange square to the blue circle) should be played. Given the requested medium render quality, the frame rate is 30 frames per second, and so the time progression with steps ``[0, 1/30, 2/30, ..., 89/30]`` is created. - In the internal render loop, each of these time stamps is processed: there are no updater functions, so effectively the scene updates the state of the transformation animation to the desired time stamp (for example, at time stamp ``t = 45/30``, the animation is completed to a rate of ``alpha = 0.5``). - Then the scene asks the renderer to do its job. The renderer asks its camera to capture the scene, the only mobject that needs to be processed at this point is the main mobject attached to the transformation; the camera converts the current state of the mobject to entries in a NumPy array. The renderer passes this array to the file writer. - At the end of the loop, 90 frames have been passed to the file writer. Completing the render loop ^^^^^^^^^^^^^^^^^^^^^^^^^^ The last few steps in the :meth:`.Scene.play_internal` call are not too exciting: for every animation, the corresponding :meth:`.Animation.finish` and :meth:`.Animation.clean_up_from_scene` methods are called. .. NOTE:: Note that as part of :meth:`.Animation.finish`, the :meth:`.Animation.interpolate` method is called with an argument of 1.0 -- you might have noticed already that the last frame of an animation can sometimes be a bit off or incomplete. This is by current design! The last frame rendered in the render loop (and displayed for a duration of ``1 / frame_rate`` seconds in the rendered video) corresponds to the state of the animation ``1 / frame_rate`` seconds before it ends. To display the final frame as well in the video, we would need to append another ``1 / frame_rate`` seconds to the video -- which would then mean that a 1 second rendered Manim video would be slightly longer than 1 second. We decided against this at some point. In the end, the time progression is closed (which completes the displayed progress bar) in the terminal. With the closing of the time progression, the :meth:`.Scene.play_internal` call is completed, and we return to the renderer, which now orders the :class:`.SceneFileWriter` to close the output container that has been opened for this animation: a partial movie file is written. This pretty much concludes the walkthrough of a :class:`.Scene.play` call, and actually there is not too much more to say for our toy example either: at this point, a partial movie file that represents playing the :class:`.ReplacementTransform` has been written. The initialization of the :class:`.Dot` happens analogous to the initialization of ``blue_circle``, which has been discussed above. The :meth:`.Mobject.add_updater` call literally just attaches a function to the ``updaters`` attribute of the ``small_dot``. And the remaining :meth:`.Scene.play` and :meth:`.Scene.wait` calls follow the exact same procedure as discussed in the render loop section above; each such call produces a corresponding partial movie file. Once the :meth:`.Scene.construct` method has been fully processed (and thus all of the corresponding partial movie files have been written), the scene calls its cleanup method :meth:`.Scene.tear_down`, and then asks its renderer to finish the scene. The renderer, in turn, asks its scene file writer to wrap things up by calling :meth:`.SceneFileWriter.finish`, which triggers the combination of the partial movie files into the final product. And there you go! This is a more or less detailed description of how Manim works under the hood. While we did not discuss every single line of code in detail in this walkthrough, it should still give you a fairly good idea of how the general structural design of the library and at least the Cairo rendering flow in particular looks like. ManimCommunity-manim-1157b74/docs/source/guides/index.rst000066400000000000000000000002461515024150700234060ustar00rootroot00000000000000Thematic Guides =============== .. toctree:: :caption: Table of Contents :maxdepth: 2 :glob: configuration deep_dive using_text add_voiceovers ManimCommunity-manim-1157b74/docs/source/guides/using_text.rst000066400000000000000000000403331515024150700244710ustar00rootroot00000000000000########################### Rendering Text and Formulas ########################### There are two different ways by which you can render **Text** in videos: 1. Using Pango (:mod:`~.text_mobject`) 2. Using LaTeX (:mod:`~.tex_mobject`) If you want to render simple text, you should use either :class:`~.Text` or :class:`~.MarkupText`, or one of its derivatives like :class:`~.Paragraph`. See :ref:`using-text-objects` for more information. LaTeX should be used when you need mathematical typesetting. See :ref:`rendering-with-latex` for more information. .. _using-text-objects: Text Without LaTeX ****************** The simplest way to add text to your animations is to use the :class:`~.Text` class. It uses the `Pango library`_ to render text. With Pango, you can also render non-English alphabets like ไฝ ๅฅฝ or ใ“ใ‚“ใซใกใฏ or ์•ˆ๋…•ํ•˜์„ธ์š” or ู…ุฑุญุจุง ุจุงู„ุนุงู„ู…. Here is a simple *Hello World* animation. .. manim:: HelloWorld :save_last_frame: :ref_classes: Text class HelloWorld(Scene): def construct(self): text = Text("Hello world", font_size=144) self.add(text) You can also use :class:`~.MarkupText` which allows the use of PangoMarkup (see the documentation of :class:`~.MarkupText` for details) to render text. For example: .. manim:: SingleLineColor :save_last_frame: :ref_classes: MarkupText class SingleLineColor(Scene): def construct(self): text = MarkupText( f'all in red except this', color=RED ) self.add(text) .. _Pango library: https://pango.org Working with :class:`~.Text` ============================ This section explains the properties of :class:`~.Text` and how can it be used in your animations. Using Fonts ----------- You can set a different font using :attr:`~.Text.font`. .. note:: The font used must be installed in your system, and Pango should know about it. You can get a list of fonts using :func:`manimpango.list_fonts`. >>> import manimpango >>> manimpango.list_fonts() [...] .. manim:: FontsExample :save_last_frame: class FontsExample(Scene): def construct(self): ft = Text("Noto Sans", font="Noto Sans") self.add(ft) Setting Slant and Weight ------------------------ Slant is the style of the Text, and it can be ``NORMAL`` (the default), ``ITALIC`` or ``OBLIQUE``. Usually, for many fonts both ``ITALIC`` and ``OBLIQUE`` look similar, but ``ITALIC`` uses **Roman Style**, whereas ``OBLIQUE`` uses **Italic Style**. Weight specifies the boldness of a font. You can see a list of weights in :class:`manimpango.Weight`. .. manim:: SlantsExample :save_last_frame: class SlantsExample(Scene): def construct(self): a = Text("Italic", slant=ITALIC) self.add(a) .. manim:: DifferentWeight :save_last_frame: class DifferentWeight(Scene): def construct(self): import manimpango g = VGroup() weight_list = dict( sorted( { weight: manimpango.Weight(weight).value for weight in manimpango.Weight }.items(), key=lambda x: x[1], ) ) for weight in weight_list: g += Text(weight.name, weight=weight.name, font="Open Sans") self.add(g.arrange(DOWN).scale(0.5)) .. _using-colors: Using Colors ------------ You can set the color of the text using :attr:`~.Text.color`: .. manim:: SimpleColor :save_last_frame: class SimpleColor(Scene): def construct(self): col = Text("RED COLOR", color=RED) self.add(col) You can use utilities like :attr:`~.Text.t2c` for coloring specific characters. This may be problematic if your text contains ligatures as explained in :ref:`iterating-text`. :attr:`~Text.t2c` accepts two types of dictionaries, * The keys can contain indices like ``[2:-1]`` or ``[4:8]``, this works similar to how `slicing `_ works in Python. The values should be the color of the Text from :class:`~.Color`. * The keys contain words or characters which should be colored separately and the values should be the color from :class:`~.Color`: .. manim:: Textt2cExample :save_last_frame: class Textt2cExample(Scene): def construct(self): t2cindices = Text('Hello', t2c={'[1:-1]': BLUE}).move_to(LEFT) t2cwords = Text('World',t2c={'rl':RED}).next_to(t2cindices, RIGHT) self.add(t2cindices, t2cwords) If you want to avoid problems when using colors (due to ligatures), consider using :class:`MarkupText`. Using Gradients --------------- You can add a gradient using :attr:`~.Text.gradient`. The value must be an iterable of any length: .. manim:: GradientExample :save_last_frame: class GradientExample(Scene): def construct(self): t = Text("Hello", gradient=(RED, BLUE, GREEN), font_size=96) self.add(t) You can also use :attr:`~.Text.t2g` for gradients with specific characters of the text. It shares a similar syntax to :ref:`the interface for colors `: .. manim:: t2gExample :save_last_frame: class t2gExample(Scene): def construct(self): t2gindices = Text( 'Hello', t2g={ '[1:-1]': (RED,GREEN), }, ).move_to(LEFT) t2gwords = Text( 'World', t2g={ 'World':(RED,BLUE), }, ).next_to(t2gindices, RIGHT) self.add(t2gindices, t2gwords) Setting Line Spacing -------------------- You can set the line spacing using :attr:`~.Text.line_spacing`: .. manim:: LineSpacing :save_last_frame: class LineSpacing(Scene): def construct(self): a = Text("Hello\nWorld", line_spacing=1) b = Text("Hello\nWorld", line_spacing=4) self.add(Group(a,b).arrange(LEFT, buff=5)) .. _disable-ligatures: Disabling Ligatures ------------------- By disabling ligatures you would get a one-to-one mapping between characters and submobjects. This fixes the issues with coloring text. .. warning:: Be aware that using this method with text that heavily depends on ligatures (Arabic text) may yield unexpected results. You can disable ligatures by passing ``disable_ligatures`` to :class:`Text`. For example: .. manim:: DisableLigature :save_last_frame: class DisableLigature(Scene): def construct(self): li = Text("fl ligature",font_size=96) nli = Text("fl ligature", disable_ligatures=True, font_size=96) self.add(Group(li, nli).arrange(DOWN, buff=.8)) .. _iterating-text: Iterating :class:`~.Text` ------------------------- Text objects behave like :class:`VGroups <.VGroup>`. Therefore, you can slice and index the text. For example, you can set each letter to different color by iterating it. .. manim:: IterateColor :save_last_frame: class IterateColor(Scene): def construct(self): text = Text("Colors", font_size=96) for letter in text: letter.set_color(random_bright_color()) self.add(text) .. warning:: Please note that `Ligature`_ can cause problems here. If you need a one-to-one mapping of characters to submobjects you should pass the ``disable_ligatures`` parameter to :class:`~.Text`. See :ref:`disable-ligatures`. .. _Ligature: https://en.wikipedia.org/wiki/Ligature_(writing) Working with :class:`~.MarkupText` ================================== MarkupText is similar to :class:`~.Text`, the only difference between them is that this accepts and processes PangoMarkup (which is similar to html), instead of just rendering plain text. Consult the documentation of :class:`~.MarkupText` for more details and further references about PangoMarkup. .. manim:: MarkupTest :save_last_frame: class MarkupTest(Scene): def construct(self): text = MarkupText( f'double green underline in red text except this', color=RED, font_size=34 ) self.add(text) .. _rendering-with-latex: Text With LaTeX *************** Just as you can use :class:`~.Text` to add text to your videos, you can use :class:`~.Tex` to insert LaTeX. For example, .. manim:: HelloLaTeX :save_last_frame: class HelloLaTeX(Scene): def construct(self): tex = Tex(r"\LaTeX", font_size=144) self.add(tex) .. note:: Note that we are using a raw string (``r'...'``) instead of a regular string (``'...'``). This is because TeX code uses a lot of special characters - like ``\`` for example - that have special meaning within a regular python string. An alternative would have been to write ``\\`` to escape the backslash: ``Tex('\\LaTeX')``. Working with :class:`~.MathTex` =============================== Everything passed to :class:`~.MathTex` is in math mode by default. To be more precise, :class:`~.MathTex` is processed within an ``align*`` environment. You can achieve a similar effect with :class:`~.Tex` by enclosing your formula with ``$`` symbols: ``$\xrightarrow{x^6y^8}$``: .. manim:: MathTeXDemo :save_last_frame: class MathTeXDemo(Scene): def construct(self): rtarrow0 = MathTex(r"\xrightarrow{x^6y^8}", font_size=96) rtarrow1 = Tex(r"$\xrightarrow{x^6y^8}$", font_size=96) self.add(VGroup(rtarrow0, rtarrow1).arrange(DOWN)) LaTeX commands and keyword arguments ==================================== We can use any standard LaTeX commands in the AMS maths packages. Such as the ``mathtt`` math-text type or the ``looparrowright`` arrow. .. manim:: AMSLaTeX :save_last_frame: class AMSLaTeX(Scene): def construct(self): tex = Tex(r'$\mathtt{H} \looparrowright$ \LaTeX', font_size=144) self.add(tex) On the Manim side, the :class:`~.Tex` class also accepts attributes to change the appearance of the output. This is very similar to the :class:`~.Text` class. For example, the ``color`` keyword changes the color of the TeX mobject. .. manim:: LaTeXAttributes :save_last_frame: class LaTeXAttributes(Scene): def construct(self): tex = Tex(r'Hello \LaTeX', color=BLUE, font_size=144) self.add(tex) Extra LaTeX Packages ==================== Some commands require special packages to be loaded into the TeX template. For example, to use the ``mathscr`` script, we need to add the ``mathrsfs`` package. Since this package isn't loaded into Manim's tex template by default, we have to add it manually. .. manim:: AddPackageLatex :save_last_frame: class AddPackageLatex(Scene): def construct(self): myTemplate = TexTemplate() myTemplate.add_to_preamble(r"\usepackage{mathrsfs}") tex = Tex( r"$\mathscr{H} \rightarrow \mathbb{H}$", tex_template=myTemplate, font_size=144, ) self.add(tex) Substrings and parts ==================== The TeX mobject can accept multiple strings as arguments. Afterwards you can refer to the individual parts either by their index (like ``tex[1]``), or by using :func:`~.set_color_by_tex`, which matches the argument exactly against the strings passed to the constructor. In this example, we color the ``\bigstar`` part: .. manim:: LaTeXSubstrings :save_last_frame: class LaTeXSubstrings(Scene): def construct(self): tex = Tex('Hello', r'$\bigstar$', r'\LaTeX', font_size=144) tex.set_color_by_tex(r'$\bigstar$', RED) self.add(tex) Because :func:`~.set_color_by_tex` requires an exact match, it cannot directly target a token inside a string that was passed as a single argument. To color every ``x`` in a formula, use ``substrings_to_isolate`` to split the string at each occurrence first: .. manim:: CorrectLaTeXSubstringColoring :save_last_frame: class CorrectLaTeXSubstringColoring(Scene): def construct(self): equation = MathTex( r"e^{x} = x^0 + x^1 + \frac{1}{2} x^2 + \frac{1}{6} x^3 + \cdots + \frac{1}{n!} x^n + \cdots", substrings_to_isolate="x" ) equation.set_color_by_tex("x", YELLOW) self.add(equation) Each isolated occurrence of ``x`` becomes its own sub-mobject that :meth:`~.set_color_by_tex` can match exactly. If one of the ``substrings_to_isolate`` is in a sub or superscript, it needs to be enclosed by curly brackets. Note that Manim also supports a custom syntax that allows splitting a TeX string into substrings easily: simply enclose parts of your formula that you want to isolate with double braces. In the string ``MathTex(r"{{ a^2 }} + {{ b^2 }} = {{ c^2 }}")``, the rendered mobject will consist of the substrings ``a^2``, ``+``, ``b^2``, ``=``, and ``c^2``. This makes transformations between similar text fragments easy to write using :class:`~.TransformMatchingTex`. For Manim to recognise a ``{{`` as a group opener, it must appear either at the very start of the string or be immediately preceded by a whitespace character. This means that ``{{`` embedded directly after non-whitespace LaTeX โ€” such as ``\frac{{{n}}}{k}`` or ``a^{{2}}`` โ€” is left untouched, which prevents accidental splitting of ordinary nested-brace expressions. To stop a leading ``{{`` from being treated as a group opener, insert a space between the two braces: ``{{ ... }}`` โ†’ ``{ { ... } }``. Using ``index_labels`` to work with complicated strings ======================================================= You might sometimes be working with a very complicated :class:`~.MathTex` mobject that makes it difficult to work with its individual components. This is where the debugging function :func:`.index_labels` is very useful. The method shows the index of a mobject's submobjects, allowing you to easily find the components of the mobject you would like to change. .. manim:: IndexLabelsMathTex :save_last_frame: class IndexLabelsMathTex(Scene): def construct(self): text = MathTex(r"\binom{2n}{n+2}", font_size=96) # index the first (and only) term of the MathTex mob self.add(index_labels(text[0])) text[0][1:3].set_color(YELLOW) text[0][3:6].set_color(RED) self.add(text) LaTeX Maths Fonts - The Template Library ======================================== Changing fonts in LaTeX when typesetting mathematical formulae is trickier than regular text. It requires changing the template that is used to compile the TeX. Manim comes with a collection of :class:`~.TexFontTemplates` ready for you to use. These templates will all work in math mode: .. manim:: LaTeXMathFonts :save_last_frame: class LaTeXMathFonts(Scene): def construct(self): tex = Tex( r"$x^2 + y^2 = z^2$", tex_template=TexFontTemplates.french_cursive, font_size=144, ) self.add(tex) Manim also has a :class:`~.TexTemplateLibrary` containing the TeX templates used by 3Blue1Brown. One example is the ctex template, used for typesetting Chinese script. For this to work, the ctex LaTeX package must be installed on your system. Furthermore, if you are only typesetting Text, you probably do not need :class:`~.Tex` at all, and should use :class:`~.Text` instead. .. manim:: LaTeXTemplateLibrary :save_last_frame: class LaTeXTemplateLibrary(Scene): def construct(self): tex = Tex('Hello ไฝ ๅฅฝ \\LaTeX', tex_template=TexTemplateLibrary.ctex, font_size=144) self.add(tex) Aligning formulae ================= :class:`~.MathTex` mobject is typeset in the LaTeX ``align*`` environment. This means you can use the ``&`` alignment character when typesetting multiline formulae: .. manim:: LaTeXAlignEnvironment :save_last_frame: class LaTeXAlignEnvironment(Scene): def construct(self): tex = MathTex(r'f(x) &= 3 + 2 + 1\\ &= 5 + 1 \\ &= 6', font_size=96) self.add(tex) ManimCommunity-manim-1157b74/docs/source/index.rst000066400000000000000000000141131515024150700221240ustar00rootroot00000000000000.. manim documentation master file, created by sphinx-quickstart on Tue Aug 4 13:58:07 2020. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Manim Community Edition ======================= Animating technical concepts is traditionally pretty tedious since it can be difficult to make the animations precise enough to convey them accurately. Manim relies on Python's simplicity to generate animations programmatically, making it convenient to specify exactly how each one should run. Take a look at the :doc:`Example Gallery <../examples>` for some inspiration on how to create beautiful images and videos with Manim. First Steps ----------- Are you new to Manim and are looking for where to get started? Then you are in the right place! .. note:: Please be aware that there are different, incompatible versions of Manim available. This version, the Community Edition of Manim (`ManimCE `_), is a separate project maintained by the community, but it was forked from `3b1b/manim `_, the original Manim created and open-sourced by Grant Sanderson, creator of `3Blue1Brown `_ educational math videos. Check our :ref:`installation FAQ ` to learn more! - The :doc:`Installation ` section has the latest and up-to-date installation instructions for Windows, macOS, and Linux. You can also find information on Manim's docker images and (online) notebook environments there. - Want to try the library before installing it? Take a look at our interactive online playground at https://try.manim.community in the form of a Jupyter notebook. - In our :doc:`Tutorials ` section you will find a collection of resources that will teach you how to use Manim. In particular, the :doc:`tutorials/quickstart` tutorial teaches you Manim's basics, and in :doc:`tutorials/building_blocks` the classes used to compose your animations are described in more detail. Finding Help ------------ Are you struggling with installing or using Manim? Don't worry, we've all been there. Here are some good resources to help you out: - Perhaps your problem is one that occurs frequently, then chances are it is addressed in our :doc:`collection of FAQs `. - If you are looking for information on some specific class, look for it in the :doc:`reference manual ` and/or use the search feature of the documentation. - Still no luck? Then you are welcome to ask the community for help, together we usually manage to find a solution for your problem! Consult the :doc:`FAQ page on getting help ` for instructions. Navigating the Documentation ---------------------------- Here are some short summaries for all of the sections in this documentation: - The :doc:`Example Gallery ` is a collection of examples (rendered videos and images together with the code they were generated from) that show a few different, simple things that you can do with Manim. - The :doc:`Installation ` section has information on installing Manim. - In :doc:`Tutorials & Guides ` you can find learning resources: proper tutorials that guide you through the process of creating a video are in the :doc:`Tutorial
` section; guides on specific topics are in the :doc:`Guides ` section, and the answers to frequently asked questions can be found in the :doc:`FAQ ` section. - The :doc:`Reference Manual ` contains a comprehensive list of all of Manim's (documented) modules, classes, and functions. If you are somewhat familiar with Manim's module structure, feel free to browse the manual directly. If you are searching for something specific, feel free to use the documentation's search feature in the sidebar. Many classes and methods come with their own illustrated examples too! - The :doc:`Plugins ` page documents how to install, write, and distribute plugins (that is, separate Python packages that extend the feature set of the core library). - Changes between versions are documented in our :doc:`Changelog `. - If you are looking into contributing to the development of Manim, you can find information on how to get involved in our :doc:`Contributing ` section. - And finally, the :doc:`Code of Conduct
` page has a formal description of the rules you should abide by when interacting within our community. Sharing Your Work ----------------- We'd love to hear from you and see your manimations `on Twitter `_, `Reddit `_, or `Discord `_. If you're using Manim in a scientific context, instructions on how to cite a particular release can be found `in our README `_. License Information ------------------- Manim is an open-source library licensed under the **MIT License**, which applies to both the original and the community editions of the software. This means you are free to use, modify, and distribute the code in accordance with the MIT License terms. However, there are some additional points to be aware of: - **Copyrighted Assets:** Specific assets, such as the "Pi creatures" in Grant Sanderson's (3Blue1Brown) videos, are copyrighted and protected. Please avoid using these characters in any derivative works. - **Content Creation and Sharing:** Videos and animations created with Manim can be freely shared, and no attribution to Manim is requiredโ€”although it is much appreciated! You are encouraged to showcase your work online and share it with the Manim community. Index ----- .. toctree:: :maxdepth: 2 examples installation tutorials_guides reference plugins changelog contributing conduct .. image:: _static/crowdin-badge.svg :align: center :alt: Localized with Crowdin :target: https://translate.manim.community ManimCommunity-manim-1157b74/docs/source/installation.rst000066400000000000000000000105401515024150700235160ustar00rootroot00000000000000Installation ============ Depending on your use case, different installation options are recommended: if you just want to play around with Manim for a bit, interactive in-browser notebooks are a really simple way of exploring the library as they require no local installation. Head over to https://try.manim.community to give our interactive tutorial a try. Otherwise, if you intend to use Manim to work on an animation project, we recommend installing the library locally (preferably to some isolated virtual Python environment, or a conda-like environment, or via Docker). .. warning:: Note that there are several different versions of Manim. The instructions on this website are **only** for the *community edition*. Find out more about the :ref:`differences between Manim versions ` if you are unsure which version you should install. #. :ref:`(Recommended) Installing Manim via Python's package manager pip ` #. :ref:`Installing Manim to a conda environment ` #. :ref:`Using Manim via Docker ` #. :ref:`Interactive Jupyter notebooks via Binder / Google Colab ` .. _local-installation: Installing Manim locally via pip ******************************** The recommended way of installing Manim is by using Python's package manager pip. If you already have a Python environment set up, you can simply run ``pip install manim`` to install the library. Our :doc:`local installation guide ` provides more detailed instructions, including best practices for setting up a suitable local environment. .. toctree:: :hidden: installation/uv .. _conda-installation: Installing Manim via Conda and related environment managers *********************************************************** Conda is a package manager for Python that allows creating environments where all your dependencies are stored. Like this, you don't clutter up your PC with unwanted libraries and you can just delete the environment when you don't need it anymore. It is a good way to install manim since all dependencies like ``pycairo``, etc. come with it. Also, the installation steps are the same, no matter if you are on Windows, Linux, Intel Macs or on Apple Silicon. .. NOTE:: There are various popular alternatives to Conda like `mamba `__ / `micromamba `__, or `pixi `__. They all can be used to setup a suitable, isolated environment for your Manim projects. The following pages show how to install Manim in a conda environment: .. toctree:: :maxdepth: 2 installation/conda .. _docker-installation: Using Manim via Docker ********************** `Docker `__ is a virtualization tool that allows the distribution of encapsulated software environments (containers). The following pages contain more information about the docker image maintained by the community, ``manimcommunity/manim``: .. toctree:: installation/docker .. _interactive-online: Interactive Jupyter notebooks for your browser ********************************************** Manim ships with a built-in ``%%manim`` IPython magic command designed for the use within `Jupyter notebooks `__. Our interactive tutorial over at https://try.manim.community illustrates how Manim can be used from within a Jupyter notebook. The following pages explain how you can setup interactive environments like that yourself: .. toctree:: installation/jupyter .. _editor-addons: Editors ******** If you're using Visual Studio Code you can install an extension called *Manim Sideview* which provides automated rendering and an integrated preview of the animation inside the editor. The extension can be installed through the `marketplace of VS Code `__. .. caution:: This extension is not officially maintained by the Manim Community. If you run into issues, please report them to the extension's author. Installation for developers *************************** In order to change code in the library, it is recommended to install Manim in a different way. Please follow the instructions in our :doc:`contribution guide ` if you are interested in that. ManimCommunity-manim-1157b74/docs/source/installation/000077500000000000000000000000001515024150700227645ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/source/installation/conda.rst000066400000000000000000000030341515024150700246020ustar00rootroot00000000000000Conda ===== Required Dependencies --------------------- There are several package managers that work with conda packages, namely `conda `__, `mamba `__ and `pixi `__. After installing your package manager, you can create a new environment and install ``manim`` inside by running .. tab-set:: .. tab-item:: conda / mamba .. code-block:: bash # if you want to use mamba, just replace conda below with mamba conda create -n my-manim-environment conda activate my-manim-environment conda install -c conda-forge manim .. tab-item:: pixi .. code-block:: bash pixi init pixi add manim Since all dependencies (except LaTeX) are handled by conda, you don't need to worry about needing to install additional dependencies. Optional Dependencies --------------------- In order to make use of Manim's interface to LaTeX to, for example, render equations, LaTeX has to be installed as well. Note that this is an optional dependency: if you don't intend to use LaTeX, you don't have to install it. Recommendations on how to install LaTeX on different operating systems can be found :doc:`in our local installation guide `. Working with Manim ------------------ At this point, you should have a working installation of Manim, head over to our :doc:`Quickstart Tutorial <../tutorials/quickstart>` to learn how to make your own *Manimations*! ManimCommunity-manim-1157b74/docs/source/installation/docker.rst000066400000000000000000000055031515024150700247700ustar00rootroot00000000000000Docker ====== The community maintains a docker image, which can be found `on DockerHub `__. For our image ``manimcommunity/manim``, there are the following tags: - ``latest``: the most recent version corresponding to `the main branch `__, - ``stable``: the latest released version (according to `the releases page `__), - ``vX.Y.Z``: any particular released version (according to `the releases page `__). .. note:: When using Manim's CLI within a Docker container, some flags like ``-p`` (preview file) and ``-f`` (show output file in the file browser) are not supported. .. note:: The Docker image ships with a minimal TeX Live installation. In particular, ``ctex`` is not installed by default. If your scenes rely on ``TexTemplateLibrary.ctex``, install it in the container via ``tlmgr install ctex``. Basic usage of the Docker container ----------------------------------- Assuming that you can access the docker installation on your system from a terminal (bash / PowerShell) via ``docker``, you can render a scene ``CircleToSquare`` in a file `test_scenes.py` with the following command. .. code-block:: bash docker run --rm -it -v "/full/path/to/your/directory:/manim" manimcommunity/manim manim -qm test_scenes.py CircleToSquare .. tip:: For Linux users there might be permission problems when letting the user in the container write to the mounted volume. Add ``--user="$(id -u):$(id -g)"`` to the ``docker`` CLI arguments to prevent the creation of output files not belonging to your user. Instead of using the "throwaway container" approach outlined above, you can also create a named container that you can modify to your liking. First, run .. code-block:: sh docker run -it --name my-manim-container -v "/full/path/to/your/directory:/manim" manimcommunity/manim bash to obtain an interactive shell inside your container allowing you to, e.g., install further dependencies (like texlive packages using ``tlmgr``). Exit the container as soon as you are satisfied. Then, before using it, start the container by running .. code-block:: sh docker start my-manim-container which starts the container in the background. Then, to render a scene ``CircleToSquare`` in a file ``test_scenes.py``, run .. code-block:: sh docker exec -it my-manim-container manim -qm test_scenes.py CircleToSquare Running JupyterLab via Docker ----------------------------- Another alternative to using the Docker image is to spin up a local JupyterLab instance. To do that, simply run .. code-block:: sh docker run -it -p 8888:8888 manimcommunity/manim jupyter lab --ip=0.0.0.0 and then follow the instructions in the terminal. ManimCommunity-manim-1157b74/docs/source/installation/jupyter.rst000066400000000000000000000071711515024150700252260ustar00rootroot00000000000000Jupyter Notebooks ================= Binder ------ `Binder `__ is an online platform that hosts shareable and customizable computing environments in the form of Jupyter notebooks. Manim ships with a built-in ``%%manim`` Jupyter magic command which makes it easy to use in these notebooks. To see an example for such an environment, visit our interactive tutorial over at https://try.manim.community/. It is relatively straightforward to prepare your own notebooks in a way that allows them to be shared interactively via Binder as well: #. First, prepare a directory containing one or multiple notebooks which you would like to share in an interactive environment. You can create these notebooks by using Jupyter notebooks with a local installation of Manim, or also by working in our pre-existing `interactive tutorial environment `__. #. In the same directory containing your notebooks, add a file named ``Dockerfile`` with the following content: .. code-block:: dockerfile FROM docker.io/manimcommunity/manim:v0.9.0 COPY --chown=manimuser:manimuser . /manim Don't forget to change the version tag ``v0.9.0`` to the version you were working with locally when creating your notebooks. #. Make the directory with your worksheets and the ``Dockerfile`` available to the public (and in particular: to Binder!). There are `several different options to do so `__, within the community we usually work with GitHub repositories or gists. #. Once your material is publicly available, visit https://mybinder.org and follow the instructions there to generate an interactive environment for your worksheets. .. hint:: The repository containing our `interactive tutorial `__ can be found at https://github.com/ManimCommunity/jupyter_examples. Google Colaboratory ------------------- It is also possible to install Manim in a `Google Colaboratory `__ environment. In contrast to Binder, where you can customize and prepare the environment beforehand (such that Manim is already installed and ready to be used), you will have to take care of that every time you start a new notebook in Google Colab. Fortunately, this is not particularly difficult. After creating a new notebook, paste the following code block in a cell, then execute it. .. code-block:: !sudo apt update !sudo apt install libcairo2-dev \ texlive texlive-latex-extra texlive-fonts-extra \ texlive-latex-recommended texlive-science \ tipa libpango1.0-dev !pip install manim !pip install IPython==8.21.0 You should start to see Colab installing all the dependencies specified in these commands. After the execution has completed, you will be prompted to restart the runtime. Click the "restart runtime" button at the bottom of the cell output. You are now ready to use Manim in Colab! To check that everything works as expected, first import Manim by running .. code-block:: from manim import * in a new code cell. Then create another cell containing the following code:: %%manim -qm -v WARNING SquareToCircle class SquareToCircle(Scene): def construct(self): square = Square() circle = Circle() circle.set_fill(PINK, opacity=0.5) self.play(Create(square)) self.play(Transform(square, circle)) self.wait() Upon running this cell, a short animation transforming a square into a circle should be rendered and displayed. ManimCommunity-manim-1157b74/docs/source/installation/uv.md000066400000000000000000000254521515024150700237500ustar00rootroot00000000000000# Installing Manim locally The standard way of installing Manim is by using Python's package manager `pip` to install the latest release from [PyPI](https://pypi.org/project/manim/). To make it easier for you to follow best practices when it comes to setting up a Python project for your Manim animations, we strongly recommend using a tool for managing Python environments and dependencies. In particular, [we strongly recommend using `uv`](https://docs.astral.sh/uv/#getting-started). For the two main ways of installing Manim described below, we assume that `uv` is available; we think it is particularly helpful if you are new to Python or programming in general. It is not a hard requirement whatsoever; if you know what you are doing you can just use `pip` to install Manim directly. :::::{admonition} Installing the Python management tool `uv` :class: seealso One way to install `uv` is via the dedicated console installer supporting all large operating systems. Simply paste the following snippet into your terminal / PowerShell -- or [consult `uv`'s documentation](https://docs.astral.sh/uv/#getting-started) for alternative ways to install the tool. ::::{tab-set} :::{tab-item} MacOS and Linux ```bash curl -LsSf https://astral.sh/uv/install.sh | sh ``` ::: :::{tab-item} Windows ```powershell powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" ``` ::: :::: ::::: Of course, if you know what you are doing and prefer to setup a virtual environment yourself, feel free to do so! :::{important} If you run into issues when following our instructions below, do not worry: check our [installation FAQs]() to see whether the problem is already addressed there -- and otherwise go and check [how to contact our community]() to get help. ::: ## Installation ### Step 1: Installing Python We first need to check that an appropriate version of Python is available on your machine. Open a terminal to run ```bash uv python install ``` to install the latest version of Python. If this is successful, continue to the next step. (installation-optional-latex)= ### Step 2 (optional): Installing LaTeX [LaTeX](https://en.wikibooks.org/wiki/LaTeX/Mathematics) is a very well-known and widely used typesetting system allowing you to write formulas like \begin{equation*} \frac{1}{2\pi i} \oint_{\gamma} \frac{f(z)}{(z - z_0)^{n+1}}~dz = \frac{f^{(n)}(z_0)}{n!}. \end{equation*} If rendering plain text is sufficient for your needs and you don't want to render any typeset formulas, you can technically skip this step. Otherwise select your operating system from the tab list below and follow the instructions. :::::{tab-set} ::::{tab-item} Windows For Windows we recommend installing LaTeX via the [MiKTeX distribution](https://miktex.org). Simply grab the Windows installer available from their download page, and run it. :::: ::::{tab-item} MacOS If you are running MacOS, we recommend installing the [MacTeX distribution](https://www.tug.org/mactex/). The latest available PKG file can be downloaded from . Get it and follow the standard installation procedure. :::: ::::{tab-item} Linux Given the large number of Linux distributions with different ways of installing packages, we cannot give detailed instructions for all package managers. In general we recommend to install a *TeX Live* distribution (). For most Linux distributions, TeX Live has already been packaged such that it can be installed easily with your system package manager. Search the internet and your usual OS resources for detailed instructions. For example, on Debian-based systems with the package manager `apt`, a full TeX Live distribution can be installed by running ```bash sudo apt install texlive-full ``` For Fedora (managed via `dnf`), the corresponding command is ```bash sudo dnf install texlive-scheme-full ``` As soon as LaTeX is installed, continue with actually installing Manim itself. :::: ::::: :::{dropdown} I know what I am doing and I would like to setup a minimal LaTeX installation You are welcome to use a smaller, more customizable LaTeX distribution like [TinyTeX](https://yihui.org/tinytex/). Manim overall requires the following LaTeX packages to be installed in your distribution: ```text amsmath babel-english cbfonts-fd cm-super count1to ctex doublestroke dvisvgm everysel fontspec frcursive fundus-calligra gnu-freefont jknapltx latex-bin mathastext microtype multitoc physics preview prelim2e ragged2e relsize rsfs setspace standalone tipa wasy wasysym xcolor xetex xkeyval ``` ::: ### Step 3: Installing Manim These steps again differ slightly between different operating systems. Make sure you select the correct one from the tab list below, then follow the instructions below. ::::::{tab-set} :::::{tab-item} Windows The following commands will - create a new directory for a Python project, - and add Manim as a dependency, which installs it into the corresponding local Python environment. The name for the Python project is *manimations*, which you can change to anything you like. ```bash uv init manimations cd manimations uv add manim ``` Manim is now installed in your local project environment! ::::: :::::{tab-item} MacOS Before we can install Manim, we need to make sure that the system utilities `cairo` and `pkg-config` are present. They are needed for the [`pycairo` Python package](https://pycairo.readthedocs.io/en/latest/), a dependency of Manim. The easiest way of installing these utilities is by using [Homebrew](https://brew.sh/), a fairly popular 3rd party package manager for MacOS. Check whether Homebrew is already installed by running ```bash brew --version ``` which will report something along the lines of `Homebrew 4.4.15-54-...` if it is installed, and a message `command not found: brew` otherwise. In this case, use the shell installer [as instructed on Homebrew's website](https://brew.sh/), or get a `.pkg`-installer from [their GitHub release page](https://github.com/Homebrew/brew/releases). Make sure to follow the instructions of the installer carefully, especially when prompted to modify your `.zprofile` to add Homebrew to your system's PATH. With Homebrew available, the required utilities can be installed by running ```bash brew install cairo pkg-config ``` With all of this preparation out of the way, now it is time to actually install Manim itself! The following commands will - create a new directory for a Python project, - and add Manim as a dependency, which installs it into the corresponding local Python environment. The name for the Python project is *manimations*, which you can change to anything you like. ```bash uv init manimations cd manimations uv add manim ``` Manim is now installed in your local project environment! ::::: :::::{tab-item} Linux Practically, the instructions given in the *Windows* tab also apply for Linux -- however, some additional dependencies are required as Linux users need to build [ManimPango](https://github.com/ManimCommunity/ManimPango) (and potentially [pycairo](https://pycairo.readthedocs.io/en/latest/)) from source. More specifically, this includes: - A C compiler, - Python's development headers, - the `pkg-config` tool, - Pango and its development headers, - and Cairo and its development headers. Instructions for popular systems / package managers are given below. ::::{tab-set} :::{tab-item} Debian-based / apt ```bash sudo apt update sudo apt install build-essential python3-dev libcairo2-dev libpango1.0-dev ``` ::: :::{tab-item} Fedora / dnf ```bash sudo dnf install python3-devel pkg-config cairo-devel pango-devel ``` ::: :::{tab-item} Arch Linux / pacman ```bash sudo pacman -Syu base-devel cairo pango ``` ::: :::: As soon as the required dependencies are installed, you can create a Python project (feel free to change the name *manimations* used below to some other name) with a local environment containing Manim by running ```bash uv init manimations cd manimations uv add manim ``` ::::: :::::: To verify that your local Python project is setup correctly and that Manim is available, simply run ```bash uv run manim checkhealth ``` At this point, you can also open your project folder with the IDE of your choice. All modern Python IDEs (for example VS Code with the Python extension, or PyCharm) should automatically detect the local environment created by `uv` such that if you put ```py import manim ``` into a new file `my-first-animation.py`, the import is resolved correctly and autocompletion is available. *Happy Manimating!* :::{dropdown} Alternative: Installing Manim as a global `uv`-managed tool If you have Manim projects in many different directories and you do not want to setup a local project environment for each of them, you could also install Manim as a `uv`-managed tool. See [`uv`'s documentation for more information](https://docs.astral.sh/uv/concepts/tools/) on their tool mechanism. To install Manim as a global `uv` tool, simply run ```bash uv tool install manim ``` after which the `manim` executable will be available on your global system path, without the need to activate any virtual environment or prefixing your commands with `uv run`. Note that when using this approach, setting up your code editor to properly resolve `import manim` requires additional work, as the global tool environment is not automatically detected: the base path of all tool environments can be determined by running ``` uv tool dir ``` which should now contain a directory `manim` in which the appropriate virtual environment is located. Set the Python interpreter of your IDE to this environment to make imports properly resolve themselves. ::: :::{dropdown} Installing Manim for a different version of Python In case you would like to use a different version of Python (for example, due to compatibility issues with other packages), then `uv` allows you to do so in a fairly straightforward way. When initializing the local Python project, simply pass the Python version you want to use as an argument to the `init` command: ``` uv init --python 3.12 manimations cd manimations uv add manim ``` To change the version for an existing package, you will need to edit the `pyproject.toml` file. If you are downgrading the python version, the `requires-python` entry needs to be updated such that your chosen version satisfies the requirement. Change the line to, for example `requires-python = ">=3.12"`. After that, run `uv python pin 3.12` to pin the python version to `3.12`. Finally, run `uv sync`, and your environment is updated! ::: :::{dropdown} Installing the latest development version If you want to install the latest (potentially unstable!) development version of Manim from our source repository [on GitHub](https://github.com/ManimCommunity/manim), then simply run ```bash uv add git+https://github.com/ManimCommunity/manim.git@main ``` ::: ManimCommunity-manim-1157b74/docs/source/plugins.rst000066400000000000000000000076221515024150700225050ustar00rootroot00000000000000.. _plugins: ======= Plugins ======= Plugins are features that extend Manim's core functionality. Since Manim is extensible and not everything belongs in its core, we'll go over how to install, use, and create your own plugins. .. note:: The standard naming convention for plugins is to prefix the plugin with ``manim-``. This makes them easy for users to find on package repositories such as PyPI. .. WARNING:: The plugin feature is new and under active development. Expect updates for the best practices on installing, using, and creating plugins; as well as new subcommands/flags for ``manim plugins`` .. tip:: See https://plugins.manim.community/ for the list of plugins available. Installing Plugins ****************** Plugins can be easily installed via the ``pip`` command: .. code-block:: bash pip install manim-* After installing a plugin, you may use the ``manim plugins`` command to list your available plugins, see the following help output: .. code-block:: bash manim plugins -h Usage: manim plugins [OPTIONS] Manages Manim plugins. Options: -l, --list List available plugins -h, --help Show this message and exit. Made with <3 by Manim Community developers. You can list plugins as such: .. code-block:: bash manim plugins -l Plugins: โ€ข manim_plugintemplate Using Plugins in Projects ************************* For enabling a plugin ``manim.cfg`` or command line parameters should be used. .. important:: The plugins should be module name of the plugin and not PyPi name. Enabling plugins through ``manim.cfg`` .. code-block:: ini [CLI] plugins = manim_rubikscube For specifying multiple plugins, comma-separated values must be used. .. code-block:: ini [CLI] plugins = manim_rubikscube, manim_plugintemplate Creating Plugins **************** Plugins are intended to extend Manim's core functionality. If you aren't sure whether a feature should be included in Manim's core, feel free to ask over on the `Discord server `_. Visit `manim-plugintemplate `_ on PyPI.org which serves as an in-depth tutorial for creating plugins. .. code-block:: bash pip install manim-plugintemplate The only requirement of manim plugins is that they specify an entry point with the group, ``"manim.plugins"``. This allows Manim to discover plugins available in the user's environment. Everything regarding the plugin's directory structure, build system, and naming are completely up to your discretion as an author. The standard way to specify an entry point (see `the Python packaging guide `__ for details) is to include the following in your ``pyproject.toml``: .. code-block:: toml [project.entry-points."manim.plugins"] "name" = "object_reference" .. versionremoved:: 0.18.1 Plugins should be imported explicitly to be usable in user code. The plugin system will probably be refactored in the future to provide a more structured interface. A note on Renderer Compatibility ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Depending on which renderer is currently active, custom mobjects created in your plugin might want to behave differently as the corresponding mobject base classes are (unfortunately) not fully compatible. The currently active renderer can be queried by checking the value of ``manim.config.renderer``. All possible renderer types are given by :class:`.constants.RendererType`. The module :mod:`.manim.mobject.utils` contains utility functions that return the base class for the currently active renderer. A simple form of renderer compatibility (by hot-swapping the class inheritance chain) for Mobjects directly inheriting from :class:`.Mobject` or :class:`.VMobject` can be achieved by using the :class:`.mobject.opengl.opengl_compatibility.ConvertToOpenGL` metaclass. ManimCommunity-manim-1157b74/docs/source/reference.rst000066400000000000000000000056451515024150700227650ustar00rootroot00000000000000Reference Manual ================ This reference manual details modules, functions, and variables included in Manim, describing what they are and what they do. For learning how to use Manim, see :doc:`tutorials/index`. For a list of changes since the last release, see the :doc:`changelog`. .. warning:: The pages linked to here are currently a work in progress. Inheritance Graphs ------------------ Animations ********** .. inheritance-diagram:: manim.animation.animation manim.animation.changing manim.animation.composition manim.animation.creation manim.animation.fading manim.animation.growing manim.animation.indication manim.animation.movement manim.animation.numbers manim.animation.rotation manim.animation.specialized manim.animation.speedmodifier manim.animation.transform manim.animation.transform_matching_parts manim.animation.updaters.mobject_update_utils manim.animation.updaters.update :parts: 1 :top-classes: manim.animation.animation.Animation Cameras ******* .. inheritance-diagram:: manim.camera.camera manim.camera.mapping_camera manim.camera.moving_camera manim.camera.multi_camera manim.camera.three_d_camera :parts: 1 :top-classes: manim.camera.camera.Camera, manim.mobject.mobject.Mobject Mobjects ******** .. inheritance-diagram:: manim.mobject.frame manim.mobject.geometry.arc manim.mobject.geometry.boolean_ops manim.mobject.geometry.line manim.mobject.geometry.polygram manim.mobject.geometry.shape_matchers manim.mobject.geometry.tips manim.mobject.graph manim.mobject.graphing.coordinate_systems manim.mobject.graphing.functions manim.mobject.graphing.number_line manim.mobject.graphing.probability manim.mobject.graphing.scale manim.mobject.logo manim.mobject.matrix manim.mobject.mobject manim.mobject.table manim.mobject.three_d.polyhedra manim.mobject.three_d.three_d_utils manim.mobject.three_d.three_dimensions manim.mobject.svg.brace manim.mobject.svg.svg_mobject manim.mobject.text.code_mobject manim.mobject.text.numbers manim.mobject.text.tex_mobject manim.mobject.text.text_mobject manim.mobject.types.image_mobject manim.mobject.types.point_cloud_mobject manim.mobject.types.vectorized_mobject manim.mobject.value_tracker manim.mobject.vector_field :parts: 1 :top-classes: manim.mobject.mobject.Mobject Scenes ****** .. inheritance-diagram:: manim.scene.moving_camera_scene manim.scene.scene manim.scene.scene_file_writer manim.scene.three_d_scene manim.scene.vector_space_scene manim.scene.zoomed_scene :parts: 1 :top-classes: manim.scene.scene.Scene, manim.scene.scene.RerunSceneHandler Module Index ------------ .. toctree:: :maxdepth: 3 reference_index/animations reference_index/cameras reference_index/configuration reference_index/mobjects reference_index/scenes reference_index/utilities_misc ManimCommunity-manim-1157b74/docs/source/reference_index/000077500000000000000000000000001515024150700234105ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/source/reference_index/animations.rst000066400000000000000000000007211515024150700263040ustar00rootroot00000000000000Animations ========== .. currentmodule:: manim .. autosummary:: :toctree: ../reference ~animation.animation ~animation.changing ~animation.composition ~animation.creation ~animation.fading ~animation.growing ~animation.indication ~animation.movement ~animation.numbers ~animation.rotation ~animation.specialized ~animation.speedmodifier ~animation.transform ~animation.transform_matching_parts ~animation.updaters ManimCommunity-manim-1157b74/docs/source/reference_index/cameras.rst000066400000000000000000000003161515024150700255550ustar00rootroot00000000000000Cameras ======= .. currentmodule:: manim .. autosummary:: :toctree: ../reference ~camera.camera ~camera.mapping_camera ~camera.moving_camera ~camera.multi_camera ~camera.three_d_camera ManimCommunity-manim-1157b74/docs/source/reference_index/configuration.rst000066400000000000000000000002651515024150700270140ustar00rootroot00000000000000Configuration ============= Module Index ------------ .. currentmodule:: manim .. autosummary:: :toctree: ../reference ~_config ~_config.utils ~_config.logger_utils ManimCommunity-manim-1157b74/docs/source/reference_index/mobjects.rst000066400000000000000000000005751515024150700257570ustar00rootroot00000000000000Mobjects ======== .. currentmodule:: manim .. autosummary:: :toctree: ../reference ~mobject.frame ~mobject.geometry ~mobject.graph ~mobject.graphing ~mobject.logo ~mobject.matrix ~mobject.mobject ~mobject.svg ~mobject.table ~mobject.text ~mobject.three_d ~mobject.types ~mobject.utils ~mobject.value_tracker ~mobject.vector_field ManimCommunity-manim-1157b74/docs/source/reference_index/scenes.rst000066400000000000000000000003751515024150700254270ustar00rootroot00000000000000Scenes ====== .. currentmodule:: manim .. autosummary:: :toctree: ../reference ~scene.moving_camera_scene ~scene.section ~scene.scene ~scene.scene_file_writer ~scene.three_d_scene ~scene.vector_space_scene ~scene.zoomed_scene ManimCommunity-manim-1157b74/docs/source/reference_index/utilities_misc.rst000066400000000000000000000011301515024150700271630ustar00rootroot00000000000000Utilities and other modules =========================== Module Index ------------ .. currentmodule:: manim .. autosummary:: :toctree: ../reference ~utils.bezier cli ~utils.color ~utils.commands ~utils.config_ops constants data_structures ~utils.debug ~utils.deprecation ~utils.docbuild ~utils.hashing ~utils.images ~utils.ipython_magic ~utils.iterables ~utils.paths ~utils.rate_functions ~utils.simple_functions ~utils.sounds ~utils.space_ops ~utils.testing ~utils.tex ~utils.tex_file_writing ~utils.tex_templates typing ManimCommunity-manim-1157b74/docs/source/robots.txt000066400000000000000000000001401515024150700223270ustar00rootroot00000000000000User-agent: * Disallow: / Allow: /en/stable/ Sitemap: https://docs.manim.community/sitemap.xml ManimCommunity-manim-1157b74/docs/source/tutorials/000077500000000000000000000000001515024150700223115ustar00rootroot00000000000000ManimCommunity-manim-1157b74/docs/source/tutorials/building_blocks.rst000066400000000000000000000463251515024150700262070ustar00rootroot00000000000000####################### Manim's building blocks ####################### This document explains the building blocks of manim and will give you all the necessary tools to start producing your own videos. Essentially, manim puts at your disposal three different concepts that you can orchestrate together to produce mathematical animations: the **mathematical object** (or **mobject** for short), the **animation**, and the **scene**. As we will see in the following sections, each of these three concepts is implemented in manim as a separate class: the :class:`.Mobject`, :class:`.Animation`, and :class:`.Scene` classes. .. note:: It is recommended that you read the tutorials :doc:`quickstart` and :doc:`output_and_config` before reading this page. ******** Mobjects ******** Mobjects are the basic building blocks for all manim animations. Each class that derives from :class:`.Mobject` represents an object that can be displayed on the screen. For example, simple shapes such as :class:`.Circle`, :class:`.Arrow`, and :class:`.Rectangle` are all mobjects. More complicated constructs such as :class:`.Axes`, :class:`.FunctionGraph`, or :class:`.BarChart` are mobjects as well. If you try to display an instance of :class:`.Mobject` on the screen, you will only see an empty frame. The reason is that the :class:`.Mobject` class is an abstract base class of all other mobjects, i.e. it does not have any pre-determined visual shape that can be displayed on the screen. It is only the skeleton of a thing that *could* be displayed. Therefore, you will rarely need to use plain instances of :class:`.Mobject`; instead, you will most likely create instances of its derived classes. One of these derived classes is :class:`.VMobject`. The ``V`` stands for Vectorized Mobject. In essence, a vmobject is a mobject that uses `vector graphics `_ to be displayed. Most of the time, you will be dealing with vmobjects, though we will continue to use the term "mobject" to refer to the class of shapes that can be displayed on the screen, as it is more general. .. note:: Any object that can be displayed on the screen is a ``mobject``, even if it is not necessarily *mathematical* in nature. .. tip:: To see examples of classes derived from :class:`.Mobject`, see the :mod:`.geometry` module. Most of these are in fact derived from :class:`.VMobject` as well. Creating and displaying mobjects ================================ As explained in :doc:`quickstart`, usually all of the code in a manim script is put inside the :meth:`.construct` method of a :class:`.Scene` class. To display a mobject on the screen, call the :meth:`~.Scene.add` method of the containing :class:`.Scene`. This is the principal way of displaying a mobject on the screen when it is not being animated. To remove a mobject from the screen, simply call the :meth:`~.Scene.remove` method from the containing :class:`.Scene`. .. manim:: CreatingMobjects class CreatingMobjects(Scene): def construct(self): circle = Circle() self.add(circle) self.wait(1) self.remove(circle) self.wait(1) Placing mobjects ================ Let's define a new :class:`.Scene` called ``Shapes`` and :meth:`~.Scene.add` some mobjects to it. This script generates a static picture that displays a circle, a square, and a triangle: .. manim:: Shapes class Shapes(Scene): def construct(self): circle = Circle() square = Square() triangle = Triangle() circle.shift(LEFT) square.shift(UP) triangle.shift(RIGHT) self.add(circle, square, triangle) self.wait(1) By default, mobjects are placed at the center of coordinates, or *origin*, when they are first created. They are also given some default colors. Further, the ``Shapes`` scene places the mobjects by using the :meth:`.shift` method. The square is shifted one unit in the ``UP`` direction from the origin, while the circle and triangle are shifted one unit ``LEFT`` and ``RIGHT``, respectively. .. attention:: Unlike other graphics software, manim places the center of coordinates at the center of the screen. The positive vertical direction is up, and the positive horizontal direction is right. See also the constants ``ORIGIN``, ``UP``, ``DOWN``, ``LEFT``, ``RIGHT``, and others, defined in the :mod:`.constants` module. There are many other possible ways to place mobjects on the screen, for example :meth:`.move_to`, :meth:`.next_to`, and :meth:`.align_to`. The next scene ``MobjectPlacement`` uses all three. .. manim:: MobjectPlacement class MobjectPlacement(Scene): def construct(self): circle = Circle() square = Square() triangle = Triangle() # place the circle two units left from the origin circle.move_to(LEFT * 2) # place the square to the left of the circle square.next_to(circle, LEFT) # align the left border of the triangle to the left border of the circle triangle.align_to(circle, LEFT) self.add(circle, square, triangle) self.wait(1) The :meth:`.move_to` method uses absolute units (measured relative to the ``ORIGIN``), while :meth:`.next_to` uses relative units (measured from the mobject passed as the first argument). :meth:`align_to` uses ``LEFT`` not as measuring units but as a way to determine the border to use for alignment. The coordinates of the borders of a mobject are determined using an imaginary bounding box around it. .. tip:: Many methods in manim can be chained together. For example the two lines .. code-block:: python square = Square() square.shift(LEFT) can be replaced by .. code-block:: python square = Square().shift(LEFT) Technically, this is possible because most methods calls return the modified mobject. Styling mobjects ================ The following scene changes the default aesthetics of the mobjects. .. manim:: MobjectStyling class MobjectStyling(Scene): def construct(self): circle = Circle().shift(LEFT) square = Square().shift(UP) triangle = Triangle().shift(RIGHT) circle.set_stroke(color=GREEN, width=20) square.set_fill(YELLOW, opacity=1.0) triangle.set_fill(PINK, opacity=0.5) self.add(circle, square, triangle) self.wait(1) This scene uses two of the main functions that change the visual style of a mobject: :meth:`.set_stroke` and :meth:`.set_fill`. The former changes the visual style of the mobject's border while the latter changes the style of the interior. By default, most mobjects have a fully transparent interior so you must specify the ``opacity`` parameter to display the color. An opacity of ``1.0`` means fully opaque, while ``0.0`` means fully transparent. Only instances of :class:`.VMobject` implement :meth:`.set_stroke` and :meth:`.set_fill`. Instances of :class:`.Mobject` implement :meth:`.~Mobject.set_color` instead. The vast majority of pre-defined classes are derived from :class:`.VMobject` so it is usually safe to assume that you have access to :meth:`.set_stroke` and :meth:`.set_fill`. Mobject on-screen order ======================= The next scene is exactly the same as the ``MobjectStyling`` scene from the previous section, except for exactly one line. .. manim:: MobjectZOrder class MobjectZOrder(Scene): def construct(self): circle = Circle().shift(LEFT) square = Square().shift(UP) triangle = Triangle().shift(RIGHT) circle.set_stroke(color=GREEN, width=20) square.set_fill(YELLOW, opacity=1.0) triangle.set_fill(PINK, opacity=0.5) self.add(triangle, square, circle) self.wait(1) The only difference here (besides the scene name) is the order in which the mobjects are added to the scene. In ``MobjectStyling``, we added them as ``add(circle, square, triangle)``, whereas in ``MobjectZOrder`` we add them as ``add(triangle, square, circle)``. As you can see, the order of the arguments of :meth:`~.Scene.add` determines the order that the mobjects are displayed on the screen, with the left-most arguments being put in the back. ********** Animations ********** At the heart of manim is animation. Generally, you can add an animation to your scene by calling the :meth:`~.Scene.play` method. .. manim:: SomeAnimations class SomeAnimations(Scene): def construct(self): square = Square() # some animations display mobjects, ... self.play(FadeIn(square)) # ... some move or rotate mobjects around... self.play(Rotate(square, PI/4)) # some animations remove mobjects from the screen self.play(FadeOut(square)) self.wait(1) Put simply, animations are procedures that interpolate between two mobjects. For example, :code:`FadeIn(square)` starts with a fully transparent version of :code:`square` and ends with a fully opaque version, interpolating between them by gradually increasing the opacity. :class:`.FadeOut` works in the opposite way: it interpolates from fully opaque to fully transparent. As another example, :class:`.Rotate` starts with the mobject passed to it as argument, and ends with the same object but rotated by a certain amount, this time interpolating the mobject's angle instead of its opacity. Animating methods ================= Any property of a mobject that can be changed can be animated. In fact, any method that changes a mobject's property can be used as an animation, through the use of :meth:`.animate`. .. manim:: AnimateExample :ref_classes: Animation class AnimateExample(Scene): def construct(self): square = Square().set_fill(RED, opacity=1.0) self.add(square) # animate the change of color self.play(square.animate.set_fill(WHITE)) self.wait(1) # animate the change of position and the rotation at the same time self.play(square.animate.shift(UP).rotate(PI / 3)) self.wait(1) :meth:`.animate` is a property of all mobjects that animates the methods that come afterward. For example, :code:`square.set_fill(WHITE)` sets the fill color of the square, while :code:`square.animate.set_fill(WHITE)` animates this action. Animation run time ================== By default, any animation passed to :meth:`play` lasts for exactly one second. Use the :code:`run_time` argument to control the duration. .. manim:: RunTime class RunTime(Scene): def construct(self): square = Square() self.add(square) self.play(square.animate.shift(UP), run_time=3) self.wait(1) Creating a custom animation =========================== Even though Manim has many built-in animations, you will find times when you need to smoothly animate from one state of a :class:`~.Mobject` to another. If you find yourself in that situation, then you can define your own custom animation. You start by extending the :class:`~.Animation` class and overriding its :meth:`~.Animation.interpolate_mobject`. The :meth:`~.Animation.interpolate_mobject` method receives alpha as a parameter that starts at 0 and changes throughout the animation. So, you just have to manipulate self.mobject inside Animation according to the alpha value in its interpolate_mobject method. Then you get all the benefits of :class:`~.Animation` such as playing it for different run times or using different rate functions. Let's say you start with a number and want to create a :class:`~.Transform` animation that transforms it to a target number. You can do it using :class:`~.FadeTransform`, which will fade out the starting number and fade in the target number. But when we think about transforming a number from one to another, an intuitive way of doing it is by incrementing or decrementing it smoothly. Manim has a feature that allows you to customize this behavior by defining your own custom animation. You can start by creating your own ``Count`` class that extends :class:`~.Animation`. The class can have a constructor with three arguments, a :class:`~.DecimalNumber` Mobject, start, and end. The constructor will pass the :class:`~.DecimalNumber` Mobject to the super constructor (in this case, the :class:`~.Animation` constructor) and will set start and end. The only thing that you need to do is to define how you want it to look at every step of the animation. Manim provides you with the alpha value in the :meth:`~.Animation.interpolate_mobject` method based on frame rate of video, rate function, and run time of animation played. The alpha parameter holds a value between 0 and 1 representing the step of the currently playing animation. For example, 0 means the beginning of the animation, 0.5 means halfway through the animation, and 1 means the end of the animation. In the case of the ``Count`` animation, you just have to figure out a way to determine the number to display at the given alpha value and then set that value in the :meth:`~.Animation.interpolate_mobject` method of the ``Count`` animation. Suppose you are starting at 50 and incrementing until the :class:`~.DecimalNumber` reaches 100 at the end of the animation. * If alpha is 0, you want the value to be 50. * If alpha is 0.5, you want the value to be 75. * If alpha is 1, you want the value to be 100. Generally, you start with the starting number and add only some part of the value to be increment according to the alpha value. So, the logic of calculating the number to display at each step will be ``50 + alpha * (100 - 50)``. Once you set the calculated value for the :class:`~.DecimalNumber`, you are done. .. note:: If you're creating a custom animation and want to use a ``rate_func``, you must explicitly apply ``self.rate_func(alpha)`` to the parameter you're animating. For example, try switching the rate function to ``rate_functions.there_and_back`` to observe how it affects the counting behavior. Once you have defined your ``Count`` animation, you can play it in your :class:`~.Scene` for any duration you want for any :class:`~.DecimalNumber` with any rate function. .. manim:: CountingScene :ref_classes: Animation DecimalNumber :ref_methods: Animation.interpolate_mobject Scene.play class Count(Animation): def __init__(self, number: DecimalNumber, start: float, end: float, **kwargs) -> None: # Pass number as the mobject of the animation super().__init__(number, **kwargs) # Set start and end self.start = start self.end = end def interpolate_mobject(self, alpha: float) -> None: # Set value of DecimalNumber according to alpha value = self.start + (self.rate_func(alpha) * (self.end - self.start)) self.mobject.set_value(value) class CountingScene(Scene): def construct(self): # Create Decimal Number and add it to scene number = DecimalNumber().set_color(WHITE).scale(5) # Add an updater to keep the DecimalNumber centered as its value changes number.add_updater(lambda number: number.move_to(ORIGIN)) self.add(number) self.wait() # Play the Count Animation to count from 0 to 100 in 4 seconds self.play(Count(number, 0, 100), run_time=4, rate_func=linear) self.wait() Using coordinates of a mobject ============================== Mobjects contain points that define their boundaries. These points can be used to add other mobjects respectively to each other, e.g. by methods like :meth:`~.Mobject.get_center` , :meth:`~.Mobject.get_top` and :meth:`~.Mobject.get_start`. Here is an example of some important coordinates: .. manim:: MobjectExample :save_last_frame: class MobjectExample(Scene): def construct(self): p1 = [-1,-1, 0] p2 = [ 1,-1, 0] p3 = [ 1, 1, 0] p4 = [-1, 1, 0] a = Line(p1,p2).append_points(Line(p2,p3).points).append_points(Line(p3,p4).points) point_start = a.get_start() point_end = a.get_end() point_center = a.get_center() self.add(Text(f"a.get_start() = {np.round(point_start,2).tolist()}", font_size=24).to_edge(UR).set_color(YELLOW)) self.add(Text(f"a.get_end() = {np.round(point_end,2).tolist()}", font_size=24).next_to(self.mobjects[-1],DOWN).set_color(RED)) self.add(Text(f"a.get_center() = {np.round(point_center,2).tolist()}", font_size=24).next_to(self.mobjects[-1],DOWN).set_color(BLUE)) self.add(Dot(a.get_start()).set_color(YELLOW).scale(2)) self.add(Dot(a.get_end()).set_color(RED).scale(2)) self.add(Dot(a.get_top()).set_color(GREEN_A).scale(2)) self.add(Dot(a.get_bottom()).set_color(GREEN_D).scale(2)) self.add(Dot(a.get_center()).set_color(BLUE).scale(2)) self.add(Dot(a.point_from_proportion(0.5)).set_color(ORANGE).scale(2)) self.add(*[Dot(x) for x in a.points]) self.add(a) Transforming mobjects into other mobjects ========================================= It is also possible to transform a mobject into another mobject like this: .. manim:: ExampleTransform class ExampleTransform(Scene): def construct(self): self.camera.background_color = WHITE m1 = Square().set_color(RED) m2 = Rectangle().set_color(RED).rotate(0.2) self.play(Transform(m1,m2)) The Transform function maps points of the previous mobject to the points of the next mobject. This might result in strange behaviour, e.g. when the dots of one mobject are arranged clockwise and the other points are arranged counterclockwise. Here it might help to use the `flip` function and reposition the points via the `roll `_ function of numpy: .. manim:: ExampleRotation class ExampleRotation(Scene): def construct(self): self.camera.background_color = WHITE m1a = Square().set_color(RED).shift(LEFT) m1b = Circle().set_color(RED).shift(LEFT) m2a = Square().set_color(BLUE).shift(RIGHT) m2b = Circle().set_color(BLUE).shift(RIGHT) points = m2a.points points = np.roll(points, int(len(points)/4), axis=0) m2a.points = points self.play(Transform(m1a,m1b),Transform(m2a,m2b), run_time=1) ****** Scenes ****** The :class:`.Scene` class is the connective tissue of manim. Every mobject has to be :meth:`added <.Scene.add>` to a scene to be displayed, or :meth:`removed <.Scene.remove>` from it to cease being displayed. Every animation has to be :meth:`played <.Scene.play>` by a scene, and every time interval where no animation occurs is determined by a call to :meth:`~.Scene.wait`. All of the code of your video must be contained in the :meth:`~.Scene.construct` method of a class that derives from :class:`.Scene`. Finally, a single file may contain multiple :class:`.Scene` subclasses if multiple scenes are to be rendered at the same time. ManimCommunity-manim-1157b74/docs/source/tutorials/index.rst000066400000000000000000000002101515024150700241430ustar00rootroot00000000000000Tutorials ========= .. toctree:: :caption: Table of Contents :maxdepth: 2 quickstart output_and_config building_blocks ManimCommunity-manim-1157b74/docs/source/tutorials/output_and_config.rst000066400000000000000000000246661515024150700265700ustar00rootroot00000000000000Manim's Output Settings ======================= This document will focus on understanding manim's output files and some of the main command-line flags available. .. note:: This tutorial picks up where :doc:`quickstart` left off, so please read that document before starting this one. Manim output folders ******************** At this point, you have just executed the following command. .. code-block:: bash manim -pql scene.py SquareToCircle Let's dissect what just happened step by step. First, this command executes manim on the file ``scene.py``, which contains our animation code. Further, this command tells manim exactly which ``Scene`` is to be rendered, in this case, it is ``SquareToCircle``. This is necessary because a single scene file may contain more than one scene. Next, the flag `-p` tells manim to play the scene once it's rendered, and the `-ql` flag tells manim to render the scene in low quality. After the video is rendered, you will see that manim has generated some new files and the project folder will look as follows. .. code-block:: bash project/ โ”œโ”€scene.py โ””โ”€media โ”œโ”€videos | โ””โ”€scene | โ””โ”€480p15 | โ”œโ”€SquareToCircle.mp4 | โ””โ”€partial_movie_files โ”œโ”€text โ””โ”€Tex There are quite a few new files. The main output is in ``media/videos/scene/480p15/SquareToCircle.mp4``. By default, the ``media`` folder will contain all of manim's output files. The ``media/videos`` subfolder contains the rendered videos. Inside of it, you will find one folder for each different video quality. In our case, since we used the ``-l`` flag, the video was generated at 480 resolution at 15 frames per second from the ``scene.py`` file. Therefore, the output can be found inside ``media/videos/scene/480p15``. The additional folders ``media/videos/scene/480p15/partial_movie_files`` as well as ``media/text`` and ``media/Tex`` contain files that are used by manim internally. You can see how manim makes use of the generated folder structure by executing the following command, .. code-block:: bash manim -pqh scene.py SquareToCircle The ``-ql`` flag (for low quality) has been replaced by the ``-qh`` flag, for high quality. Manim will take considerably longer to render this file, and it will play it once it's done since we are using the ``-p`` flag. The output should look like this: .. manim:: SquareToCircle3 :hide_source: :quality: high class SquareToCircle3(Scene): def construct(self): circle = Circle() # create a circle circle.set_fill(PINK, opacity=0.5) # set color and transparency square = Square() # create a square square.flip(RIGHT) # flip horizontally square.rotate(-3 * TAU / 8) # rotate a certain amount self.play(Create(square)) # animate the creation of the square self.play(Transform(square, circle)) # interpolate the square into the circle self.play(FadeOut(square)) # fade out animation And the folder structure should look as follows. .. code-block:: bash project/ โ”œโ”€scene.py โ””โ”€media โ”œโ”€videos | โ””โ”€scene | โ”œโ”€480p15 | | โ”œโ”€SquareToCircle.mp4 | | โ””โ”€partial_movie_files | โ””โ”€1080p60 | โ”œโ”€SquareToCircle.mp4 | โ””โ”€partial_movie_files โ”œโ”€text โ””โ”€Tex Manim has created a new folder ``media/videos/1080p60``, which corresponds to the high resolution and the 60 frames per second. Inside of it, you can find the new ``SquareToCircle.mp4``, as well as the corresponding ``partial_movie_files``. When working on a project with multiple scenes, and trying out multiple resolutions, the structure of the output directories will keep all your videos organized. Further, manim has the option to output the last frame of a scene, when adding the flag ``-s``. This is the fastest option to quickly get a preview of a scene. The corresponding folder structure looks like this: .. code-block:: bash project/ โ”œโ”€scene.py โ””โ”€media โ”œโ”€images | โ””โ”€scene | โ”œโ”€SquareToCircle.png โ”œโ”€videos | โ””โ”€scene | โ”œโ”€480p15 | | โ”œโ”€SquareToCircle.mp4 | | โ””โ”€partial_movie_files | โ””โ”€1080p60 | โ”œโ”€SquareToCircle.mp4 | โ””โ”€partial_movie_files โ”œโ”€text โ””โ”€Tex Saving the last frame with ``-s`` can be combined with the flags for different resolutions, e.g. ``-s -ql``, ``-s -qh`` Sections ******** In addition to the movie output file one can use sections. Each section produces its own output video. The cuts between two sections can be set like this: .. code-block:: python def construct(self): # play the first animations... # you don't need a section in the very beginning as it gets created automatically self.next_section() # play more animations... self.next_section("this is an optional name that doesn't have to be unique") # play even more animations... self.next_section("this is a section without any animations, it will be removed") All the animations between two of these cuts get concatenated into a single output video file. Be aware that you need at least one animation in each section. For example this wouldn't create an output video: .. code-block:: python def construct(self): self.next_section() # this section doesn't have any animations and will be removed # but no error will be thrown # feel free to tend your flock of empty sections if you so desire self.add(Circle()) self.next_section() One way of fixing this is to wait a little: .. code-block:: python def construct(self): self.next_section() self.add(Circle()) # now we wait 1sec and have an animation to satisfy the section self.wait() self.next_section() For videos to be created for each section you have to add the ``--save_sections`` flag to the Manim call like this: .. code-block:: bash manim --save_sections scene.py If you do this, the ``media`` folder will look like this: .. code-block:: bash media โ”œโ”€โ”€ images โ”‚ โ””โ”€โ”€ simple_scenes โ””โ”€โ”€ videos โ””โ”€โ”€ simple_scenes โ””โ”€โ”€ 480p15 โ”œโ”€โ”€ ElaborateSceneWithSections.mp4 โ”œโ”€โ”€ partial_movie_files โ”‚ โ””โ”€โ”€ ElaborateSceneWithSections โ”‚ โ”œโ”€โ”€ 2201830969_104169243_1331664314.mp4 โ”‚ โ”œโ”€โ”€ 2201830969_398514950_125983425.mp4 โ”‚ โ”œโ”€โ”€ 2201830969_398514950_3447021159.mp4 โ”‚ โ”œโ”€โ”€ 2201830969_398514950_4144009089.mp4 โ”‚ โ”œโ”€โ”€ 2201830969_4218360830_1789939690.mp4 โ”‚ โ”œโ”€โ”€ 3163782288_524160878_1793580042.mp4 โ”‚ โ””โ”€โ”€ partial_movie_file_list.txt โ””โ”€โ”€ sections โ”œโ”€โ”€ ElaborateSceneWithSections_0000.mp4 โ”œโ”€โ”€ ElaborateSceneWithSections_0001.mp4 โ”œโ”€โ”€ ElaborateSceneWithSections_0002.mp4 โ””โ”€โ”€ ElaborateSceneWithSections.json As you can see each section receives their own output video in the ``sections`` directory. The JSON file in here contains some useful information for each section: .. code-block:: json [ { "name": "create square", "type": "default.normal", "video": "ElaborateSceneWithSections_0000.mp4", "codec_name": "h264", "width": 854, "height": 480, "avg_frame_rate": "15/1", "duration": "2.000000", "nb_frames": "30" }, { "name": "transform to circle", "type": "default.normal", "video": "ElaborateSceneWithSections_0001.mp4", "codec_name": "h264", "width": 854, "height": 480, "avg_frame_rate": "15/1", "duration": "2.000000", "nb_frames": "30" }, { "name": "fade out", "type": "default.normal", "video": "ElaborateSceneWithSections_0002.mp4", "codec_name": "h264", "width": 854, "height": 480, "avg_frame_rate": "15/1", "duration": "2.000000", "nb_frames": "30" } ] This data can be used by third party applications, like a presentation system or automated video editing tool. You can also skip rendering all animations belonging to a section like this: .. code-block:: python def construct(self): self.next_section(skip_animations=True) # play some animations that shall be skipped... self.next_section() # play some animations that won't get skipped... Some command line flags *********************** When executing the command .. code-block:: bash manim -pql scene.py SquareToCircle it specifies the scene to render. This is not necessary now. When a single file contains only one ``Scene`` class, it will just render the ``Scene`` class. When a single file contains more than one ``Scene`` class, manim will let you choose a ``Scene`` class. If your file contains multiple ``Scene`` classes, and you want to render them all, you can use the ``-a`` flag. As discussed previously, the ``-ql`` specifies low render quality (854x480 15FPS). This does not look very good, but is very useful for rapid prototyping and testing. The other options that specify render quality are ``-qm``, ``-qh``, ``-qp`` and ``-qk`` for medium (1280x720 30FPS), high (1920x1080 60FPS), 2k (2560x1440 60FPS) and 4k quality (3840x2160 60FPS), respectively. The ``-p`` flag plays the animation once it is rendered. If you want to open the file browser at the location of the animation instead of playing it, you can use the ``-f`` flag. You can also omit these two flags. Finally, by default manim will output .mp4 files. If you want your animations in .gif format instead, use the ``--format gif`` flag. The output files will be in the same folder as the .mp4 files, and with the same name, but a different file extension. This was a quick review of some of the most frequent command-line flags. For a thorough review of all flags available, see the :doc:`thematic guide on Manim's configuration system `. ManimCommunity-manim-1157b74/docs/source/tutorials/quickstart.rst000066400000000000000000000361621515024150700252450ustar00rootroot00000000000000========== Quickstart ========== .. note:: Before proceeding, install Manim and make sure it is running properly by following the steps in :doc:`../installation`. For information on using Manim with Jupyterlab or Jupyter notebook, go to the documentation for the :meth:`IPython magic command `, ``%%manim``. .. important:: If you installed Manim in the recommended way, using the Python management tool ``uv``, then you either need to make sure the corresponding virtual environment is activated (follow the instructions printed on running ``uv venv``), or you need to remember to prefix the ``manim`` command in the console with ``uv run``; that is, ``uv run manim ...``. Overview ******** This quickstart guide will lead you through creating a sample project using Manim: an animation engine for precise programmatic animations. First, you will use a command line interface to create a ``Scene``, the class through which Manim generates videos. In the ``Scene`` you will animate a circle. Then you will add another ``Scene`` showing a square transforming into a circle. This will be your introduction to Manim's animation ability. Afterwards, you will position multiple mathematical objects (``Mobject``\s). Finally, you will learn the ``.animate`` syntax, a powerful feature that animates the methods you use to modify ``Mobject``\s. Starting a new project ********************** Start by creating a new folder:: manim init project my-project --default The ``my-project`` folder is the root folder for your project. It contains all the files that Manim needs to function, as well as any output that your project produces. Animating a circle ****************** 1. Open a text editor, such as Notepad. Open the file ``main.py`` in the ``my-project`` folder. It should look something like this: .. code-block:: python from manim import * class CreateCircle(Scene): def construct(self): circle = Circle() # create a circle circle.set_fill(PINK, opacity=0.5) # set the color and transparency self.play(Create(circle)) # show the circle on screen 2. Open the command line, navigate to your project folder, and execute the following command: .. code-block:: bash manim -pql main.py CreateCircle Manim will output rendering information, then create an MP4 file. Your default movie player will play the MP4 file, displaying the following animation. .. manim:: CreateCircle :hide_source: class CreateCircle(Scene): def construct(self): circle = Circle() # create a circle circle.set_fill(PINK, opacity=0.5) # set the color and transparency self.play(Create(circle)) # show the circle on screen If you see an animation of a pink circle being drawn, congratulations! You just wrote your first Manim scene from scratch. If you get an error message instead, you do not see a video, or if the video output does not look like the preceding animation, it is likely that Manim has not been installed correctly. Please refer to our :doc:`FAQ section ` for help with the most common issues. *********** Explanation *********** Let's go over the script you just executed line by line to see how Manim was able to draw the circle. The first line imports all of the contents of the library: .. code-block:: python from manim import * This is the recommended way of using Manim, as a single script often uses multiple names from the Manim namespace. In your script, you imported and used ``Scene``, ``Circle``, ``PINK`` and ``Create``. Now let's look at the next two lines: .. code-block:: python class CreateCircle(Scene): def construct(self): [...] Most of the time, the code for scripting an animation is entirely contained within the :meth:`~.Scene.construct` method of a :class:`.Scene` class. Inside :meth:`~.Scene.construct`, you can create objects, display them on screen, and animate them. The next two lines create a circle and set its color and opacity: .. code-block:: python circle = Circle() # create a circle circle.set_fill(PINK, opacity=0.5) # set the color and transparency Finally, the last line uses the animation :class:`.Create` to display the circle on your screen: .. code-block:: python self.play(Create(circle)) # show the circle on screen .. tip:: All animations must reside within the :meth:`~.Scene.construct` method of a class derived from :class:`.Scene`. Other code, such as auxiliary or mathematical functions, may reside outside the class. Transforming a square into a circle *********************************** With our circle animation complete, let's move on to something a little more complicated. 1. Open ``scene.py``, and add the following code snippet below the ``CreateCircle`` class: .. code-block:: python class SquareToCircle(Scene): def construct(self): circle = Circle() # create a circle circle.set_fill(PINK, opacity=0.5) # set color and transparency square = Square() # create a square square.rotate(PI / 4) # rotate a certain amount self.play(Create(square)) # animate the creation of the square self.play(Transform(square, circle)) # interpolate the square into the circle self.play(FadeOut(square)) # fade out animation 2. Render ``SquareToCircle`` by running the following command in the command line: .. code-block:: bash manim -pql scene.py SquareToCircle The following animation will render: .. manim:: SquareToCircle2 :hide_source: class SquareToCircle2(Scene): def construct(self): circle = Circle() # create a circle circle.set_fill(PINK, opacity=0.5) # set color and transparency square = Square() # create a square square.rotate(PI / 4) # rotate a certain amount self.play(Create(square)) # animate the creation of the square self.play(Transform(square, circle)) # interpolate the square into the circle self.play(FadeOut(square)) # fade out animation This example shows one of the primary features of Manim: the ability to implement complicated and mathematically intensive animations (such as cleanly interpolating between two geometric shapes) with just a few lines of code. Positioning ``Mobject``\s ************************* Next, let's go over some basic techniques for positioning ``Mobject``\s. 1. Open ``scene.py``, and add the following code snippet below the ``SquareToCircle`` method: .. code-block:: python class SquareAndCircle(Scene): def construct(self): circle = Circle() # create a circle circle.set_fill(PINK, opacity=0.5) # set the color and transparency square = Square() # create a square square.set_fill(BLUE, opacity=0.5) # set the color and transparency square.next_to(circle, RIGHT, buff=0.5) # set the position self.play(Create(circle), Create(square)) # show the shapes on screen 2. Render ``SquareAndCircle`` by running the following command in the command line: .. code-block:: bash manim -pql scene.py SquareAndCircle The following animation will render: .. manim:: SquareAndCircle2 :hide_source: class SquareAndCircle2(Scene): def construct(self): circle = Circle() # create a circle circle.set_fill(PINK, opacity=0.5) # set the color and transparency square = Square() # create a square square.set_fill(BLUE, opacity=0.5) # set the color and transparency square.next_to(circle, RIGHT, buff=0.5) # set the position self.play(Create(circle), Create(square)) # show the shapes on screen ``next_to`` is a ``Mobject`` method for positioning ``Mobject``\s. We first specified the pink circle as the square's reference point by passing ``circle`` as the method's first argument. The second argument is used to specify the direction the ``Mobject`` is placed relative to the reference point. In this case, we set the direction to ``RIGHT``, telling Manim to position the square to the right of the circle. Finally, ``buff=0.5`` applied a small distance buffer between the two objects. Try changing ``RIGHT`` to ``LEFT``, ``UP``, or ``DOWN`` instead, and see how that changes the position of the square. Using positioning methods, you can render a scene with multiple ``Mobject``\s, setting their locations in the scene using coordinates or positioning them relative to each other. For more information on ``next_to`` and other positioning methods, check out the list of :class:`.Mobject` methods in our reference manual. Using ``.animate`` syntax to animate methods ******************************************** The final lesson in this tutorial is using ``.animate``, a ``Mobject`` method which animates changes you make to a ``Mobject``. When you prepend ``.animate`` to any method call that modifies a ``Mobject``, the method becomes an animation which can be played using ``self.play``. Let's return to ``SquareToCircle`` to see the differences between using methods when creating a ``Mobject``, and animating those method calls with ``.animate``. 1. Open ``scene.py``, and add the following code snippet below the ``SquareAndCircle`` class: .. code-block:: python class AnimatedSquareToCircle(Scene): def construct(self): circle = Circle() # create a circle square = Square() # create a square self.play(Create(square)) # show the square on screen self.play(square.animate.rotate(PI / 4)) # rotate the square self.play(Transform(square, circle)) # transform the square into a circle self.play( square.animate.set_fill(PINK, opacity=0.5) ) # color the circle on screen 2. Render ``AnimatedSquareToCircle`` by running the following command in the command line: .. code-block:: bash manim -pql scene.py AnimatedSquareToCircle The following animation will render: .. manim:: AnimatedSquareToCircle2 :hide_source: class AnimatedSquareToCircle2(Scene): def construct(self): circle = Circle() # create a circle square = Square() # create a square self.play(Create(square)) # show the square on screen self.play(square.animate.rotate(PI / 4)) # rotate the square self.play(Transform(square, circle)) # transform the square into a circle self.play(square.animate.set_fill(PINK, opacity=0.5)) # color the circle on screen The first ``self.play`` creates the square. The second animates rotating it 45 degrees. The third transforms the square into a circle, and the last colors the circle pink. Although the end result is the same as that of ``SquareToCircle``, ``.animate`` shows ``rotate`` and ``set_fill`` being applied to the ``Mobject`` dynamically, instead of creating them with the changes already applied. Try other methods, like ``flip`` or ``shift``, and see what happens. 3. Open ``scene.py``, and add the following code snippet below the ``AnimatedSquareToCircle`` class: .. code-block:: python class DifferentRotations(Scene): def construct(self): left_square = Square(color=BLUE, fill_opacity=0.7).shift(2 * LEFT) right_square = Square(color=GREEN, fill_opacity=0.7).shift(2 * RIGHT) self.play( left_square.animate.rotate(PI), Rotate(right_square, angle=PI), run_time=2 ) self.wait() 4. Render ``DifferentRotations`` by running the following command in the command line: .. code-block:: bash manim -pql scene.py DifferentRotations The following animation will render: .. manim:: DifferentRotations2 :hide_source: class DifferentRotations2(Scene): def construct(self): left_square = Square(color=BLUE, fill_opacity=0.7).shift(2*LEFT) right_square = Square(color=GREEN, fill_opacity=0.7).shift(2*RIGHT) self.play(left_square.animate.rotate(PI), Rotate(right_square, angle=PI), run_time=2) self.wait() This ``Scene`` illustrates the quirks of ``.animate``. When using ``.animate``, Manim actually takes a ``Mobject``'s starting state and its ending state and interpolates the two. In the ``AnimatedSquareToCircle`` class, you can observe this when the square rotates: the corners of the square appear to contract slightly as they move into the positions required for the first square to transform into the second one. In ``DifferentRotations``, the difference between ``.animate``'s interpretation of rotation and the ``Rotate`` method is far more apparent. The starting and ending states of a ``Mobject`` rotated 180 degrees are the same, so ``.animate`` tries to interpolate two identical objects and the result is the left square. If you find that your own usage of ``.animate`` is causing similar unwanted behavior, consider using conventional animation methods like the right square, which uses ``Rotate``. ``Transform`` vs ``ReplacementTransform`` ***************************************** The difference between ``Transform`` and ``ReplacementTransform`` is that ``Transform(mob1, mob2)`` transforms the points (as well as other attributes like color) of ``mob1`` into the points/attributes of ``mob2``. ``ReplacementTransform(mob1, mob2)`` on the other hand literally replaces ``mob1`` on the scene with ``mob2``. The use of ``ReplacementTransform`` or ``Transform`` is mostly up to personal preference. They can be used to accomplish the same effect, as shown below. .. code-block:: python class TwoTransforms(Scene): def transform(self): a = Circle() b = Square() c = Triangle() self.play(Transform(a, b)) self.play(Transform(a, c)) self.play(FadeOut(a)) def replacement_transform(self): a = Circle() b = Square() c = Triangle() self.play(ReplacementTransform(a, b)) self.play(ReplacementTransform(b, c)) self.play(FadeOut(c)) def construct(self): self.transform() self.wait(0.5) # wait for 0.5 seconds self.replacement_transform() However, in some cases it is more beneficial to use ``Transform``, like when you are transforming several mobjects one after the other. The code below avoids having to keep a reference to the last mobject that was transformed. .. manim:: TransformCycle class TransformCycle(Scene): def construct(self): a = Circle() t1 = Square() t2 = Triangle() self.add(a) self.wait() for t in [t1,t2]: self.play(Transform(a,t)) ************ You're done! ************ With a working installation of Manim and this sample project under your belt, you're ready to start creating animations of your own. To learn more about what Manim is doing under the hood, move on to the next tutorial: :doc:`output_and_config`. For an overview of Manim's features, as well as its configuration and other settings, check out the other :doc:`Tutorials <../tutorials/index>`. For a list of all available features, refer to the :doc:`../reference` page. ManimCommunity-manim-1157b74/docs/source/tutorials_guides.rst000066400000000000000000000002241515024150700244010ustar00rootroot00000000000000Tutorials & Guides ================== .. toctree:: :caption: Table of Contents :maxdepth: 2 tutorials/index guides/index faq/index ManimCommunity-manim-1157b74/example_scenes/000077500000000000000000000000001515024150700210265ustar00rootroot00000000000000ManimCommunity-manim-1157b74/example_scenes/advanced_tex_fonts.py000066400000000000000000000151461515024150700252450ustar00rootroot00000000000000from manim import * # French Cursive LaTeX font example from http://jf.burnol.free.fr/showcase.html # Example 1 Manually creating a Template TemplateForFrenchCursive = TexTemplate( preamble=r""" \usepackage[english]{babel} \usepackage{amsmath} \usepackage{amssymb} \usepackage[T1]{fontenc} \usepackage[default]{frcursive} \usepackage[eulergreek,noplusnominus,noequal,nohbar,% nolessnomore,noasterisk]{mathastext} """, ) def FrenchCursive(*tex_strings, **kwargs): return Tex(*tex_strings, tex_template=TemplateForFrenchCursive, **kwargs) class TexFontTemplateManual(Scene): """An example scene that uses a manually defined TexTemplate() object to create LaTeX output in French Cursive font """ def construct(self): self.add(Tex("Tex Font Example").to_edge(UL)) self.play(Create(FrenchCursive("$f: A \\longrightarrow B$").shift(UP))) self.play(Create(FrenchCursive("Behold! We can write math in French Cursive"))) self.wait(1) self.play( Create( Tex( "See more font templates at \\\\ http://jf.burnol.free.fr/showcase.html", ).shift(2 * DOWN), ), ) self.wait(2) # Example 2, using a Template from the collection class TexFontTemplateLibrary(Scene): """An example scene that uses TexTemplate objects from the TexFontTemplates collection to create sample LaTeX output in every font that will compile on the local system. Please Note: Many of the in the TexFontTemplates collection require that specific fonts are installed on your local machine. For example, choosing the template TexFontTemplates.comic_sans will not compile if the Comic Sans Microsoft font is not installed. This scene will only render those Templates that do not cause a TeX compilation error on your system. Furthermore, some of the ones that do render, may still render incorrectly. This is beyond the scope of manim. Feel free to experiment. """ def construct(self): def write_one_line(template): x = Tex(template.description, tex_template=template).shift(UP) self.play(Create(x)) self.wait(1) self.play(FadeOut(x)) examples = [ TexFontTemplates.american_typewriter, # "American Typewriter" TexFontTemplates.antykwa, # "Antykwa Pรณล‚tawskiego (TX Fonts for Greek and math symbols)" TexFontTemplates.apple_chancery, # "Apple Chancery" TexFontTemplates.auriocus_kalligraphicus, # "Auriocus Kalligraphicus (Symbol Greek)" TexFontTemplates.baskervald_adf_fourier, # "Baskervald ADF with Fourier" TexFontTemplates.baskerville_it, # "Baskerville (Italic)" TexFontTemplates.biolinum, # "Biolinum" TexFontTemplates.brushscriptx, # "BrushScriptX-Italic (PX math and Greek)" TexFontTemplates.chalkboard_se, # "Chalkboard SE" TexFontTemplates.chalkduster, # "Chalkduster" TexFontTemplates.comfortaa, # "Comfortaa" TexFontTemplates.comic_sans, # "Comic Sans MS" TexFontTemplates.droid_sans, # "Droid Sans" TexFontTemplates.droid_sans_it, # "Droid Sans (Italic)" TexFontTemplates.droid_serif, # "Droid Serif" TexFontTemplates.droid_serif_px_it, # "Droid Serif (PX math symbols) (Italic)" TexFontTemplates.ecf_augie, # "ECF Augie (Euler Greek)" TexFontTemplates.ecf_jd, # "ECF JD (with TX fonts)" TexFontTemplates.ecf_skeetch, # "ECF Skeetch (CM Greek)" TexFontTemplates.ecf_tall_paul, # "ECF Tall Paul (with Symbol font)" TexFontTemplates.ecf_webster, # "ECF Webster (with TX fonts)" TexFontTemplates.electrum_adf, # "Electrum ADF (CM Greek)" TexFontTemplates.epigrafica, # Epigrafica TexFontTemplates.fourier_utopia, # "Fourier Utopia (Fourier upright Greek)" TexFontTemplates.french_cursive, # "French Cursive (Euler Greek)" TexFontTemplates.gfs_bodoni, # "GFS Bodoni" TexFontTemplates.gfs_didot, # "GFS Didot (Italic)" TexFontTemplates.gfs_neoHellenic, # "GFS NeoHellenic" TexFontTemplates.gnu_freesans_tx, # "GNU FreeSerif (and TX fonts symbols)" TexFontTemplates.gnu_freeserif_freesans, # "GNU FreeSerif and FreeSans" TexFontTemplates.helvetica_fourier_it, # "Helvetica with Fourier (Italic)" TexFontTemplates.latin_modern_tw_it, # "Latin Modern Typewriter Proportional (CM Greek) (Italic)" TexFontTemplates.latin_modern_tw, # "Latin Modern Typewriter Proportional" TexFontTemplates.libertine, # "Libertine" TexFontTemplates.libris_adf_fourier, # "Libris ADF with Fourier" TexFontTemplates.minion_pro_myriad_pro, # "Minion Pro and Myriad Pro (and TX fonts symbols)" TexFontTemplates.minion_pro_tx, # "Minion Pro (and TX fonts symbols)" TexFontTemplates.new_century_schoolbook, # "New Century Schoolbook (Symbol Greek)" TexFontTemplates.new_century_schoolbook_px, # "New Century Schoolbook (Symbol Greek, PX math symbols)" TexFontTemplates.noteworthy_light, # "Noteworthy Light" TexFontTemplates.palatino, # "Palatino (Symbol Greek)" TexFontTemplates.papyrus, # "Papyrus" TexFontTemplates.romande_adf_fourier_it, # "Romande ADF with Fourier (Italic)" TexFontTemplates.slitex, # "SliTeX (Euler Greek)" TexFontTemplates.times_fourier_it, # "Times with Fourier (Italic)" TexFontTemplates.urw_avant_garde, # "URW Avant Garde (Symbol Greek)" TexFontTemplates.urw_zapf_chancery, # "URW Zapf Chancery (CM Greek)" TexFontTemplates.venturis_adf_fourier_it, # "Venturis ADF with Fourier (Italic)" TexFontTemplates.verdana_it, # "Verdana (Italic)" TexFontTemplates.vollkorn_fourier_it, # "Vollkorn with Fourier (Italic)" TexFontTemplates.vollkorn, # "Vollkorn (TX fonts for Greek and math symbols)" TexFontTemplates.zapf_chancery, # "Zapf Chancery" ] self.add(Tex("Tex Font Template Example").to_edge(UL)) for font in examples: try: write_one_line(font) except Exception: print("FAILURE on ", font.description, " - skipping.") self.play( Create( Tex( "See more font templates at \\\\ http://jf.burnol.free.fr/showcase.html", ).shift(2 * DOWN), ), ) self.wait(2) ManimCommunity-manim-1157b74/example_scenes/assets/000077500000000000000000000000001515024150700223305ustar00rootroot00000000000000ManimCommunity-manim-1157b74/example_scenes/assets/1280px-The_earth_at_night.jpg000066400000000000000000002121141515024150700275530ustar00rootroot00000000000000ุเJFIFHHMFile source: https://commons.wikimedia.org/wiki/File:The_earth_at_night.jpgC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((ภ€"ฤฤB!1A"Qaq‘2ก#Bฑมั3Rbแ๐Cr‚’S๑$ข4csยฤฤ/!1QA"a๐q2B‘กฑมัแ#b๑ฺ ?DE๚„DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DCฐบ'ไ€ˆvํ‡ฉTษ“{>V฿ Š['•ึื"ห๘่ˆ%Œ™๕่ลว4ึูใฯษgไวฺ๖VฤT‡สๆ‚<6๎าG๒UŸmy13ู€โญห๔Hิ”ณxeœนถกvA น2jพ#‡๓N๋~Om4Wh๚Gƒ0๊็ŸๆPA†ัต†‰Uๅ8]๓ู>ฃ๎ซDฃ?6่นเฤ฿หOษiษย๊>…(๗Yห"อ`‚โ'f8ฟ๖ บiz–b่b4Dญ<๙ž[\หวโ7d‚ำ๛Ž?ฬ•›ิ‘{v๔yญษšg๚๒ัค-7๔\šžPG๚@ฃํย“ฉฟn๓[ลี‹Tต‡H hั#ฤขFห\ๆ5ว๊ทฝ}3ฅศจ'(‹—]ฎTๅุ์เk๏ูN๏า้กvขศ๘ฆsต ๏mฟมR1eqใirK์.Wา๖ฯmฮ{Ziฮh>…ภึฯ๓ณ`ฉn;t€เัTiซฟ…Šฯ4Fใo่ฎ๒๔œ'ใEสฯกต/ปnwIŠ"& :H๏Bิ่zP๔yN34~์ฎ๗ldฎxอฟษ0๙ฤTœ(lว;~ฮ?ี@‡mX์>ๅใ๚)vผ&0เา%2_‘?3จ{ฎiqฃ๚.8`C๖ ?า”5—ŽA>(กษฃท่บ2`p?มKI๎ u0Žืํ_๐ชVถ‰0หญด>?/๗Vu-๚.าE<ฐ;)Ž๎ฟTwโโ๓aำ๕ป๏›ํถ"๒ฯQ‘ฎาๆD๊๎าWOTum Aธฌุฏว“ำEๆ;ช?}14|ษSgSiญq{ํ•๙p๖vd๔d9๑P-๓`๛ซเ”LาZา+๗ S'ว^ส/๛ส}ร?๘ฉทฉสผq“๋ธWๆฤ๘๋ีEๆyผ Lี๊ Aิค`๚ูWๅล>:๔ัyฟn๏ ษลtu@Iธ@๗)๓a์๘๒z(ฐวิ˜๊ืฺ;ธn๊8ไ›ึ>mๅkไวฺve้ฑžz›{B๏ซ—ผใ๏ Ÿ๛>\=ฏf^›ัyŽ๊†ฐ๓r๗”ฤึ˜š=มSๆฤ๘๒zจผำิ*mจหž7ญ'ำรชSๆฤ๘๋ิEโ~;'—โ“Fฅ})๓ใ้~:๗Qxc7 ีw่ญgQ• jไw&ญ'_ใฏ]โๆ‹’ เp+๊ฌNl€๚UญNฎำณ/MจฑžกกิxฑHฃ ๅฒ ๖_“iู—ฆฤY†~1จGอฅ]Œ”\OkEY”พ*Ybhˆด‚" "๎“่”} "QBCEธ€sฒ(xัQ>,t9:‚ฉูธอฌำ๒๚)'ฺ๊ด"สz†0แ๎?&ฎ ๘Op>dไง~>ืถ๚kE™ูธโฟjา;€ ?มs๑๘ี#ฏำIด๏วู}5"ฦzŒใ_อHg@E‡ถ #๙)๒c์ํพš\H]๕P;Ue๔)ญๅ-'ูเซhVแkฯ1Lแ0ฦฝ'u6‘Mc1ฏเƒจƒgGบH๎ผสฑตฺื< บ*w๎้ฟใjฮฆV๓K„๔ิ  ฒŽ๔lW?ัiŠf=q$qm"ึxฒ1หc~mืฬ๗Yrs็4cศC@์ะ฿ัt๙;fํป๚zใt^หœฦdvข>หฌฬ•บnI {งฯ='ว^ฺ,x๙‘สแd4ึ๗[{->#.h๔๓ ?Eึe/1‹,M ศu9บE]นรข๋dc5์'ูภญlาHŽีGKmๆ‚เฐ<ๅปrxAิPฦx–3๒p]kตpตŠฟบn "ใކ?สๆ๛,ว;ํฉฮพอi*\ค๓I-jECr๓๛2H3โ?Uฺงhม๙1YdCkฐๅbหฬšDa ‹๓กW+Ž3i7’๗dFะM๔๙ชิc๋ง๚ฌeM6ฯuF์ก9ฉ‡ๆ๊ …๋_งI„๛k“จศ\</ฑฺฉ็.VŒฺOฎมjƒ.มาv๚‹ะOัhkš\‚๕4›VN4฿oำ;` (ษ๎็ู^“ƒF ั]š6ส |ค๙กฝˆuซhฎุcง<ฒูgิฎš๊-ฒ""" """ """ ""8_r>FЇ„ึŠdlฏ๙๚ซ ฅm. w๖R้Q~ฝ>bึœธตฮk็7ี#๘ูๆh!ยFš;zŸ&C,D๘Œhปw›sํยๅžMใM‘#ŸคJๆัฃN?ิฌ๎ู๗จ8››๛ฃจ’Z(vtนทuๆผ๙v๐๎ŸB„m๎ƒ„ฟ]ะr›๊Žc}’า้›ญ€๙+เ†็ไRฉ2<วแ—u๎ขˆŠ"" 1กฮปH๕"้l<ฝคล3>TฑlจVG<‘Ÿ$Žoทeฌn?q›ฟฅฯภ‘ฑุฐkOup้อ|Zฃ•ฤื•บญฒว3ƒฆ”ฒOWYง ^จ๑แ๑K๕_O?ช๋Ž8^~˜ท( `ต„ "šMท,"ฟ…ช+H|ัŸG6ํC'*I๙œึ๖ื฿ีvุดJ฿พ„๚๒ณ๘/ๅฎV๘84IวุXฏัU#1ัพgŸ`((L์w7๖Qนฎ๏ฟ—ํสข9Rู๕"ศ๎’whq%อ5สR,4PJEAส๙ฅuKAสBบˆ:Z6ำ๕hFผ ฆ6วseEX๙KฺCน๖kG๒PฑUCๆ‹ˆ:ว–ธH๙Vxถะ(๛•R&อ.dพ>s~f4Ÿเก$‘มฮ ฦ–† ]ฟt฿ัค4ฅฅฎ–BำศีฑUาX๕VE ฒ‹Ž78zฒy<+ฏEสVษ ‘ˆย฿š…ฆขคะาFงP๕ืl๛|—-\ึƒๅ~ก์)p๏ป‹‰\Dkœ฿สipูํuqCEni4ŽลqJ6k4Xุ๊|šdP€ศฃีฮmผ—4บ๊ท+S+„ณ~^้™ฎj †๏๗*ภG#๕ š}ฏัy…ๅฅี@rH* t๓ธn๕7ๆ™†ผVฌa Œde๏s‡ๅฅั•,6€?–ม็ูC"H†ˆXฦธํuน๛ญ๑31ย฿;Y์ 1™]อ–ูไŸ2#R:Fโ)G๑๙?งQ๙bั–&RNฤ ม4„yฺสjฯาิหฑ๑ฒ\hs๒4ฌ|๔‹*น2ฆ‘š_!-๔ูpม6๗ ›คฎ: [๙ข|ฺV-ส๙jI‹ิ)kvgoฮ๊(ฒาฦฯ3@ –@=Аสœ_ํค๚•J+บšI๏s๋[œ๊๕6ขˆขˆˆ€ˆง ้ฒ@็tM ŠE wฒš`w่จ6G5ฅ ๙NไPWพx]WŒา=’ฬ‰ฝpXdQธH๗[RwR%ึ# vฟูy่ต๒dฯlzƒฉฒ†จ}่TMท ฏ๛—˜A`šโฟ.~ฮฬ^ใงqkYฅ9ๆฏไธู'„7›Eบ๑ZKMดั๖Wๆปๅ;#ิ“6FštnŒšฌ.3จi7ฝ7>๋อ|yทธธ๑dฺŠŸ.^ืฒ=ธณก•มญj=ˆ}m\f‹–?ย๙ๅ6D๗ถฺาGช๋e้/N=ร‘ ฃณ่เWL๐฿๘ั๎‚๖Zเ,sD๙๏ค๘็ทัำžภ่ˆฏZฐT”4ญ๚G๋ฬษd{A…ืิฉ3-ฐ šcเ4๙ญŸy3้้.ึX}ซ•฿0mุwัyŽฬa๒ธๅฏเG1โ๔:Aๆ”๙ก๑ืDฅค9ฺ๎แjƒน‹ค฿(pผ๗—Pjh 8€}+ŽฒmฦฯฉCIM>กM+€eฺกv›๊น~ๅ๖ „W!H}Wl๐škะC\เฤนจํFพ[.นH$ูdhp 8Q๗ A„EKœ]จ’]๋ พy๙."""‹บงNงi๔ฝ—ตปAnงi=ฏeฦ€\5 Zโ ๔ฑไวŠห็s่Sn๘๙(Kž7๐šู๋ฤ“cส-—Zœ16ั.GŒมโ686hถŸ‹Až&yKฺฦW?จ73ถำ,i๕i7k3บtกย‹\%ฝ—&ม|Mึ็F?6žkไณrฮ}/n>ฺN^%๑žOkw๕Y"™ญ|’พ7ŸสะCไI[™ƒ:‡ํwซ่V.ขุใ—Dp๘d &ฯ™LๆRnฎ:ทQึ็ธ;YŠ3'ทˆ:„!คผy ๅiี3๑ร_ฐ?U๊CF ] 6y‡^ส๘ฉœฦ2fๅลฎ๘ษห,==@C…ŽwsDDD@DDE๊ขXB*D๕๕JงM’ห$’Šข5…w๙,Ž–@lผ‡๚8R็s‘ฉŽืd=ึใฅค๚์ฐฟg‹ybน$†หiต์)Tผูeทi4–ืฒแ\E•--@DDQmMฆ้ij -t€ฅ R.‘6\฿ัusuหR**ขR"–บ. ้\Elx‡rEvY6ˆ1ฅฮฆ‚I๔n‡ฆ—4:Y+ิบ–จฑุ$Ÿ๛A 4๙RJ+fทะาLq๓ห;ทรS›ฤk#Vชvd S1#กe‰vิน฿ฉฃทPฮ{$p0๚ถ1jอศๆ™฿M–~R–{๒๖ฝฑื=ฮฤ“๎mrิ˜อfฎ”.ภo๓SVฏ…V›ฉ9…ฆœค4‡n[u่STฺพ๋คฆY[\#IาGส“CžPญฎIุ+ƒXxืC[ซZM ศ์nเ>[ฎˆวr~ŠฮEvJู]Dฺ dc๏บน‰•ช+ธn  &ฃ๊UœZ ์ฐzl-rฺ&(ƒปI?ช 8๑ๆ–ตฮšZบม๗ใ์คษใฃz/ุ’O่ฑ฿ฅ%ืษ;ฺ้ึ2่ำ"~Tฟ๐6`ๆฑj@OI฿}ฑดf:ฟ%๛๊Rฬ=๚Zมฯk\า฿๒เฏษ‘ูฯ•’kฎ๕Vฑญhqล d}ุ>๋•–ท8Œ่ดุxฐขb๔*vีฺกK…^ศด›:]์T‹,~AWู;SlใO{@E๑j๏ัฟu#พ฿$ัต{ŸTฃt๛nธ Šบ705ฟ˜อข˜ZkK๏ญค’ผโIhนrญใ–’อทxธŒท5ผ้ฒ/~9qv†oุชจงšป ฅ ใŒ+nำZVCๅc‡อH2':š]ฟeQ'(xwฟ™g•#Ž;<(˜Kh์Gจ4บจ](;Pไ”ใะWpขZAOš๔YWศบ w]qพTะŠ๋h8ฃม\JE_$อtฅมฃI7ฅิ~๊ทnูญn ฟŠF\ำlq#JaŒญN$zn๒ˆ= ฺ‹{้pQฟูYกšทs๕*`Gv$•‘6<6๗n—USZ?xท~KA\sƒF4๛›Q/$nา]๊JดtIoุชฯ7Tฌ1*Ž”ไE„ฅ•>ฉa);์=QEะ เ)ดF@๓{‚ฌkะ{{ฒต"UMa'อฐ๕ๅ4vื่Ÿขฝฉดdขึ0Fม ๋m๗ป6…lกคUn“\ฒๅnฌฤธธอศษŽ'O yฃ$ฤ†3 ๖๚_ย๘๙ุุฏฤ฿โO;รN>Lำ1๑wท‘`๙พหฤ˜š่^๚ฝ‡uŒฐทลาหฏ+zงL89าใ3/3ร!ฆ\YตฦI5ณˆว#ou„ฑภีZ‡†Z5[ฅภ๑U_rฌรSš–ณ9Žo!EjิอฏUยG๙Dํ6ฬ”UๅฌwฑR;6›คํ]ณ้>‹กงั\ำไqึC๛ ฐG’…}Jh@ตยxVฅž;+คฺฆ๋kKšHoŠนนRฑดสiช$ฦ‘วZาi4=ถI=Rณอ4“ั‘ฺด๑ฐฎƒ!ไ€_3žh6)Z๗ตเjk}Hฃ๗T9Œ'ฝ+ซ.๖›•้1ฯhฟ๙iอYโ;๗ก7ิ9ฅbŠrึ้2N>Nฏก Œjค๙\F’>ฎฝ๒c›zZภธ;ั,mฝข๛ผฯฦK\?๊Bไ™SX/sฮ๊ฑ&้ฦ๘่้โ€ ก— rc ึเlต็MขำWภ๏๎ฆ้Ÿตฒ7ึึI฿฿•>Ifฌ^.โt้วไำ ITƒ&,žWH 9ตว๕Z%™๒0ฐภ6-GฝชCoI0j ’็w๛pนe'.’฿ฒLผ™<๚ะ6๒์ฉ‰m‰ฏถ\-วVซ?5งk! -`ณd}mgษนž4š!ฎัtŸ6ํฮ๓ว…ูPว+<ฌk˜v๙€ผฉc} pZv?%์5’8ฐษAญUฎdFC†ฐP๏วู2รป“ตยจsร…K&‡_>#๘ญ" งลŒƒ๋C๘ช$ฤวnวดด~f๎~ห>3งาZ[EฺN๛zN์๑โ๒ฝธcsผฎีย๛—ผ}ฌ๎ธทท๓›๖Š๙ง`ูเศnฌlฒdอฃ์โฌU…rฝพ*Iฟ->3žหia?B?Rก แ๎ปŒ7ุi%y๑8฿ึม๛คš๛+b2dd4๒ฬ8‹?%ซฺ๔[3๐ึผู๕ูq๘ั‡žMX๛ŠF9ภธX=ส‹^ๆ›"ฝ -\ฤํ๔บ\<“ƒ=จ–\Gณ8๕าีฤ็ByZ$;tฑํkbRแŽS…๎ณหล"‘jŸfฆธzดRฬๆ9Ÿ™ฎ0ธYg—Ie๐โ"(ขฒ#%ำ |•h ‚Bฑš%ˆ‚้ ๎๏_ีnฤ˜พุ๒อ@lZ๋ฐผŸ๎Cคp‡eณงh๑nงำEUWnžZหQฯ)ราDE้qSไG็skธอ๖Rู9ซ9ZณNOˆะtŽ]NฟฅuqT\๏Uฟฉทœn๙“Kgถฆ9zY)ษsk’4ีนY]ใ0T๑Ÿ๙๕QŸ>IEตƒrฒ9ลฦI>๋†Yอ๐้Ž>ำŸรึ<.(XฎuZ"ๅ[tึิธˆ€ˆˆข" """œl/#pึ๗sถzqรำ`—"<ฉŸ–X\ึ;๚Hแึ๖ูi๔ซฏJ^–'|L–ฤใ“ n2Ggฐ=ฺ"ิMš 6๔ตใfx;๒๗ด่tโ@wฏฬ ๙ฺิ๓ย]}&zgƒำ๑๒ณ<>;bร ฉc9ํuัฃตWีQ./†_ๆf?I!ภ•svบศ,N|1ƒขต่sพรp/Ž2b›wcOdฑ8ฦ่๖ิ$š๏`คืVrH๏๓9XrแL|ฬwร3—G#K฿›Mศ;…&[สใ่ผFDVวbธc!ทm&๊ปญX›Aqt๛ฎตบฝ”E'2ธp+ฌฑtJ่CpUฌศ‘ตๆ๖m—d# Ž:hห‡<ส›1%tœE+กcƒ iาืHhะ๏IเแJย(ดชษo๎“๒+v7OŠ| œฦโG,/cˆ๒m]ูM-ก=ญW‰Žอ็š7IŒึธป๖‚=\)<\ำBฯำtนlำ!i๋oeฝ^—ัszฟWฦ้ฝ/ฦอ˜ G+]จ่ึNซกฐ$‚vใ•Œ;`o๕IซuพO ส ๋0ธ–ำiีคุ฿฿พ๊f .ภ ่ฏiถ—Fุqเ‘“ใฝา‡Dาโ๘่ืšภ๒(ฝaใำuX&€q ก+Rณau%ด =ฎีš๗}UNN฿dGๆ)ฏิ(Y@ก`๐UwพE0ื:7a฿’›M ๏aGึ”™ปE|ฝT‹ษYฆ๐4>^Š$z๒ŠฮเWบ4๊ฝ#WธW32A&3€;Cp2ชษ๓ 4ษึ~มj๋=_7ญๅE6kขsฃ‰ฐFุ`Ž4š‘ตญ๎{^๊n์aา๎อ*&•ฌ%ค^–๏uมhqi–‹๗[“lํƒ์ปDญลฑษคGฒฅั–Ku2นj\tL”;๎ปค ํอ&ด•๋S…Lุา]dูWฝ%‘Iฑe:ฏz }าืEPsQฎหtƒตกๅ@C.Tt9ฎ—Žภ’… Sbึฟ{า๗Q‘ทง–Šุีlฃนเ_ั] kCฺPOนW[<(้6]~Š@^ไ_บl”Kถš๔Ppปzฅ)๔*ฦตฮถ์ ฏPจ€ุ%•ืVฤ;ŸDฝ'{๙ ๅ€๏ท(H๖๛nธ฿ฝ.ฺ—7์TM๑Q"ฦƒฎฐ๖Toัจฎ้oก\tu฿•ฺ@=”Wขแ Eฎตญsšำฅถhนršภ$์ >หถเkฬ ู]คo—\าt9ํQฃVšขช5dฒY๗ ๐หผ๑ที4m˜ฎตภr๚าา/u1ทZkไฆ๑`i:ฌฃฯข™าHง0šำaAฑู;ฮึงG็ทbQัc๓PfD6Nก่ๅวฟฤy4zด5\p์๋๚#X็ƒฆพ๋šMmGไTVUo…Gฬ~สMh5ค‚(_ouฦฝ๎n–ตทwuบ็ํx#ž๊๐%Fท)ว+อ๚”&อชŽpH)น’ธMีธw๎‚_3๚ฎ฿  Œcœ๊cKฐต`ˆดธH4บถfJ๒*ฐvฺ€>5๋Mิ&ส้t้ำผ( ฤ๑‹S7›นะ็๙wฉa|… dU๎=ิืฬ7Š“EUำcทฎBๅะฝ ขใzO ฿อKล ašะHl—ฝํBป๏E gฑฏ’Kะ(Y#๕V1ั[škะ›Uk%ฃะ'ีYFจฬzถึ/€_ลZ๏; am ฌต`.ุธ‡ucexฯเต2fโา!›A์F็ไฎdl4^ะk๗yฅ‰Žk…น๘kiIาi Ž46็^ืw์ต2Nึณ4 ึ หe&Jำ๙\ื}@^Sœ{ปYBh[ฎ”๙NฦŒ–~Qฉฏ๔;Wีei{฿ข0๗v?ชงฦƒ๕*9[ํ{\(๛ปฌwwVปu“TDตําx7ธ๛ชgSƒNE’๔ณ&lN'๑W:N ม9อ€๚้;“)ซฉWนฝ3‚ฆว9ฎถ9ภŽํ*.ฎ!ฎธ๎ฆว–`Q฿ๆนฦา๗Ÿ1u_{Wใฤ๚ฐธ‹ )•วฐWE—$bƒ ใ์ทว|ฅ—K':ฆถข€บT59ป‚A๖Z"dr Oyตธ๒น,^5:หAไGชีŸl๏่ƒจ9ฎำ6ํ๕ญีฎl$„1 ๏๕๏jจ"‚IฏCฺFฤŽfx/s์p@'์U๎สNy†ฅผ'`X›gึณข.6ํนภˆŠ+v+[3t™ PWมฆaขQฉป๎รtผถ์เMฃ†D>9€ ๎ื ้vย๏9ๅ4๔Š!E๊pYวท=ฝิทJ”’วฉึžhช?ฮุYฅใ=ล๎.6I๕6ธผืฏ~งN=z™-"&i?ๆ;ฌqs‹œIq’ข‹žY\ผต$žDYhVว d6…ฐU—ใป๒ซต8\ั#„†j‹Z €๏^่:่N u฿Š๙๚+aรt…ญื^๚ะเณ[’h}Vญ}0œ]ห5ขpๆฐ๊uE‡ฐช ;dt ตฦ5 แฒณY'„< ทb่r9ูEั84ธ M‘ๆดœœj?ตปตผชฤHา๏๘aรI 'q้๚+”“ลIส”DYhDDD@DDา(o`๖r ั‚ฏf,าFูผ7ˆžMJเtš็e/FuซJึพWˆฺใM.Kซ‘`m้๕rฝ.Ÿะค›๙O—8โ6C$ฬnฯ 'SษาvทYฒš฿ัใัnๅฒIฅ„ทHฝฎ‡ฐๅgบeuVrฺ:ฤ๐Fศฐค~7ฝฏeฐZIทoๅทKชฎ8‚N‘C็t†๔ึือ๗๙.ผฺœ฿V์Uภ๐"sKXI"‰>fื4=ีGLzา๖๎แซVซŽq๓Z1ˆdytaฌ{mลšฯังb;ฎ~ถK๖ภ ntbตธ4”๓นฎทิ1ฑ1ข9-้c'†ฬ์EœbฝI!ผ~ฆ€!sนฯฉ>!้ Hd่_~=gˆgย่ˆว?5๑ค‘ตุูxำ€๑๘q1“ผasœ้ษ<kตท+์:=Oแ.ฆ์l๎ง…”ู้๐โcหขš ๆ—8yhค๎แธุ/จแt—t.ˆ•™ซ[M4’า(Š>„ ใuE“ฮ้T๎M,{ร›ธข h‹ก๔Qฑ๏kฟDSEัGžWmA"๎บtYxปญ5ฝzชํไwMŽขจ๐/ัQuฤธนฤูฝอ๗+€mฟ๑@ํยเR ฮ๏่ฃH:ูZ๑`ธ;ฝN๊ k”>้ณNžWWj บ‡a๚ Wขœ|๖ฟ๕ ทแIดโี‚๙šืgž ฟบฅกฬvยฯQรAHแvํ๛…mH‘-{O์H<[8Uฺฺ้oๅู\Kใuต๖pๅ.,ื]๕Aœ’่GšŽ๛๖]#ืํK”G!eN๛ž ฒhrบp)ฑšฝ~ˆ์žPฎปU1๛฿ก@ส๎+ูt—jŠ“่ˆุK] ฟšฎะ‚QR.ฟrƒ“จืษp6;oขPน%ฌ‡ ]ทgWบไzใ{d ดุmื•S๕cVŸเฆ์4ฅ6ลฺ\]ปDr—i`~h.aดำ๓ูwถส[ุฅโ{นb,sืๆ–‘ฑeย}].h๏Kค๊ญ l)Q_~๊่ฃl ^ฐvNส`6็๕RฮŠวPฝฮม'์ซฅ๑โhั!h#ฬ(4žวตฏB“ บ๗–GPว=ลแฑยId ั.ืw\7ํkฬม๊9“I,3ร#ุcsขv๎kถsOจ#ทษVกXื ๓:ษ>พห9[oE“Qxฦlฯk6;^โฎ…ชฮร~็eX„ฑอsฃh;ำถwศฌdูเ+า4ืฒฝา๙‰ชข9Z]ฦก`}”_†๚ธด‘ฺฟ๊ณŒ€ๆŸš์xVŽฅ5n]|ืeพ์/–5”๐ฌฑฬ4แNๆˆQk]#ฺฺุ\๗ $žซkrcสkcu2OSฐ'ุฃZYš[!dัำƒฺโื5ภุ#ๅอฅว๎U๎๖ยา*ฯำ ฑUvT.๑KVษๆื{ธžIฝี-ไ๎ว3หS–ˆ'ัmy;nา Žหภดัฑซฑ†yސ+บเc‹€ ญwYฤgถ-‘โ@Hn’;^สซ๔Bว7kี^ศฑ ฮถZv ป’ปต‹}ต"ขFฃWWต๒œ^โื|'Qฆ8้:]@š7ว๑]1=ฏk.{€ฆถ์฿•ฺธํ~ญ.๐มำจ7`yซแ%q{ตวะาฮ6_=๙๙จ]pบ6์ˆแohธ NฏMPŽ๓ัGoบ jMAFŠ็}ำbสnvซšh๛{(Žvๅwpy@ฝล›]$ืฒ„ุูQปIฎ5[œ\mฤ“ฮ่ๆ–๒6ข"(ฎฑลŽc‹VO‘$ไx„Pแ P คWIฅกัxŽ3^ฮีฐ%vaเ๊‰ฎู๊dVฦ F๗WสW ห:๖v฿มU“‡|7›<ุ–จcดธศ ~3ฏkฐ]?<3๙{P๘คŒŸ+€๕ฅุ๒%‹fธ…aš%วๅJ35WQูb๑แฏ>R’_‰c[ ?ป_ัBJ/4ํCึชะ4ž-sb ฆ#nq๊ฆญไ˜‘eกโ‘ั?S*ลจ"#ุลอl”ูKZ๏^ฝูด€ei'Š6ผะHแvk&˜ฝ8๚"v^\‚IXIe๙l๖]TพŽลฎท …:N๙จahˆ‹“ ˆˆˆ€ˆˆˆ€ˆˆ‚""ฅh‘ฆF๊e๎ญ—Aq-A; บ‹ˆ€Šภงฤัภ<_m”uŸ 2…w6,†+\๏6˜ฎK4Mcฅ‰ํkญฎ- 9ถEƒX"ŠไAถใ&ฐมฑำW๚จธŸหจนญุ_ฅฌ๓ตzฝ:Hq"ทccห3ุ<ู .ำซญ;ปญYูน9l™คžzา'˜ีqฟj5}ฟUพlผฯ„บ~t“C,Xำฦฆฦษข\ทžAค~o[—‚ษžfhŒส{ุ๓น฿a๋พ๊t์ีสษณ)|mฏ/:ใมล—&HE๘ณSg๓5ฃwืจพืต/>vสษไ†v–JuฦเCฝ7ย}%ฆOˆŸVKœมBY YqณZ:Aku5ฎ%ฺฦ๛9|vYฦŸ$ถ๎ktดปH$’nอlGํsรญrฮอpียI.ุiKA a;l.ฏห่h]๒ตแu๎ุง|โห3ƒrพ"็BCิำฐ๒ึเ‚ก๛'K;2อฯi,p7`4 ๎AฐOe์bใแ~;ฉๅgแt๙+๑šใ,lAภ–ธF ปjxตq`nตฦอYยI_&โ\KœI'’y+่๙N้“ใ 8ก›ว>6ถi[Z‡ฐPk๙ั๓๚ฃq1๚ค์ภ™™ธฑนฬdๆ'Fู†เ?A6ๆŠ็I๊y]'6,ฮŸ'—ตG+E–Ÿฎ฿pUสwใแ%ี{โไ็ฒL‰ฒŒ™VุŽ4ฦIm€วU8ซ๗ตะ1๒eมฦ. „บG˜๒า้%! นดCh›`นำzGlุ๑DZšืษ&0˜P6Nฏ›ๆอ}–ฏˆz๖_T๋ณu9sขถb๘งƒYuถ/ตญ- kุฦ(;Eo๓ญ1dDู<๙น9s๗g™ฆF’ ๕8_บ๚,ฎง๐๖wยธ].…fฝฺ‡R‹)ดฝ€€Aบ; ข;๎ญทjoํ๑ข‹hv<๓๚+ณ<0่„,•Lšถw'Oฑุš“ฬ,-†6‹qtฌฝNHพยฝgฆ’Iฃ๊?]ง<ฐแ5{ฉF็1ภฑิแฝธVcBูค-’x`ฆนฺฅ.รIญีsนฎCruO4ฐนท~sท”{๏฿ัkq4ญ ’Hฮเw\'~?Tิู/ž฿ษTJ(ผB|ฬ`ษy ?ชˆ ;๏ภ4›๖@,ฝ๛ ดUรย3ษ%’CX์—]‚6๙๛*Iณd›'rwฒฎหวŸ&hs"“!-|RฦXๆwข;*Hฏฒr๘ฃ@~‹งต๎ปUล}ึฌถม๘x4Œ}F)-าเ๒Mด๏ธ7Šถ๋ƒL•`U฿u+sšึ๊:A4 ุ_*ฬvŠ•1—ณb=}ธ๕Tตšด[ูฅัผนฎ แภ^๛XฎOศา๕1 ้yMใชd;ฆ2;'B้‹ฆธถœ;4บ‰ษ ฤc๔๊ถตมภŠpบ๗๙ฎlำ|,m๛YZaร—*ml๑I>Vฑึ๎j€ไ๒;Y_Eึ๊Ÿใโ๔่๑็Jษ|8ฺuG#ุ?f๒Zื5๚KIeํ`ฏ–ฺ]ฎศ-ข(ัพ฿๐-2gM+žูdl…า™|W‹vฒ1wๆ?[Yฯญšผ,ฑ๕๘}'<ฅ›&n$์’_ลโฒงฝD<4<†’ะ $ “Dั7bเcufH์x ฬž"D1dต์kœZ^{Ž’แๅf’็ฑั*๎ฑึzงU!๙™9o ๎ห6ณคQญ‡`ฒว/โ2ห'˜ษ+ษ%๎yชน'€@ซใu็ฝ๙น^ฟแพ๙๕Y๑N)้Yน?7ฅโMีๆt—อ•$yi‹รˆtดlnเแu_%”ั ๘๐6Z!๏/.xpv…Q๎น็‡˜Ÿ.ธƒต;Kๆษ#zƒ๚ัTxl4ๆ9ญcœ@ิw—n–7Yส๎ซEา*ฏdฏEอ]\ตืัwtศ ’x ยๆส!dq`Qญหอ€ฏotฺ  ืHsk[KlXฑV=TCจํ[Šโะoยจ’โHวG#™#\วฐ–นฎA‚;.Yฎษฑ*๗EภwVcฦg™ฌhy๎โฦŽๆ‡ Kxูคม6ไญฯฮŒ๔Ÿ๎่๐pแ9•นพ†AmV’uiำตึ›ซฎย? …„4ํZfศaฦสKo˜บIฏาื4เ5๛Bฐhุ>„RๅโM^ืส›ฺ๛ี&ซš๛ชˆฎ!]:tํW| ๛๒€‹—บฒ(Ÿ1pฅฺZ\ใฐไ‡๛ฆ๔iฎ 1bมษlั>l‰šั ™)k`!นอฏ9"ภ*๏ูdpาโ X๔6ธ–lฺc{: h‘าฯอp‘่ขkุ A-๘?%&ฃ่Tบ๋Iโฯ7ฒฉZข•กแฎc\7$nOอqง‰‘Ž๘fใu c๙k]ฺNืข]! ii€๏RณxgY๐ŽิjฟŸ๊ณxƒ5Žเฉsู1ำChัsI์nM~Š:|งKCธ ีBR,oค๓G•cฆ#Œvd7UXฏ–{ข่ &จ”ๆsZ๗›uŸ+hภจsฌ~c่ซNํ,‹L๖o@ส#Eธื ๅgซZ €ส๚ฺ†ไ๖%ดบˆjิ@a*}‚ไŽ 5•N{ฝพ‰นิšํ%คmฝZฮ^็r~ƒd |งqฆฉ^ šะ ƒ(ะkช‘K•ค‰บW‘ZˆฐGJ๗6‰ฑ๒AQQuqCl‹:Aส๐ฺแdผwdDfึโ๗\Qุ}ku9ฮ6็}สขว<ไužxGHd!านฮ#ิช‘6iื; \DQDD@DD&M<ะฎj๛.kˆLส˜LืI+ค ็y>Qฐ*เ-ถ)ž๗5็Nh…yร• เึŠ:๎๏๙-ฬต4–nฎsCE<ธ;ะŠคิ Qช=ิ$˜Nุ]ฦOูTเ [-ๅคฃ๘R[่าึฮKLRM๕๎"‰ิ.Xž็ฒ1.›ษ‚kธๅv<'ว ` lC‰า[๖ใe.[$าูqgวะ็ว#-ก๑ธ ณƒธซ๚‚ฃ๙"ืใ phฒโAํ\Ÿ่VNฏ,lลš(ฒฑใ Jมช#น!Žญ'q฿n)hŸ.!บseŽ รฌ;r<อ€Hณนs๎ห(งำสศ9kc˜hl , 3N๛ํฑ&ฯ}ห9r;๗^Ÿเ|q3™แZั นฮิIึบฉ ๊&ษcสไlษ๐_ ห‹5–ว ปUyชภ๓W—๎ ณ$ำ{บ_G?Eิ ฯษ—ซ๘ŽŽ|O ฐSถq7จฑอ#ฬฮy|๙ke์t์3“;qๆ’!Š่ศ3ฬ4M]Hภภีuylว•า9ŒŒฝย์F๘ฒjฏะ›๚ฉ…ึๅป[๔ช๗ฺพซฅิ|งaมฎ}ูDŸ7ขฟ-ืฟหuี‡8>ภ)๑๒ฌp€ $(Xฑvo…ฮECฯ6คภ็9ญc\็8€J้w์xwี:๋๘{*๏ิญM‰žแึ=Uz=ิญv•๒ˆQ![vธw็u4ช‘Yคห hDx]kˆ"๎ธฅภ ุS ป”46ไz  จ๓๒\๎kฟษohŸ+„‘cฑRiๆmูwศAปพภ""๊็ผšิI$ ตCภmQพ๗ล }ศ๚””ฑษ[ถชซ๏๊ชW?Nีฯษ@ณำoe›ˆ"้ธฒˆŠ""" """ """ """ ")1Žy.$@^็„๏๔W0โkm์ธ[pzt3F๓“,ŒpŒ=ฌcAฒ]BฯaVข๕ๆฤ? uฎ๘9ฮxญร•š?+f`๒๖ปbืcฐ็z’]}ฌวl˜ุธฝDส๘p๒ ยŽคša6ฆยภ$ุ฿{๙“@//ช?๑๙ ้๎‘ุmqdO“gฝƒ`Hํuufฎทซ_gีพ4๋}แ๗โfๆc(ผว ,ฃ……ฎ๒šcFƒๆuฮโท7โ๕๎‹ำก้]7ฃ๕Vgฯ™—Š!s(.$ ด–้จ฿;K[ฟฯ๕ำW๔๑ฃyฐม‘ำฝฤI.vภŸ๓Y^ว0๙ศฃศ#”yEฺM0œrI|nsฺ Š๔qบRว‚mึ็9Œk_ZH6เ5Ub๋น^t‡[ญฑต›pฏีi้“2 ŽŸ3Hi$ุ6(Š๎ฅฦYฬYVหำŒ]=ณh๒Aาฯ#ƒ+๛/Z>ฉ๘™aว'~!ๆgฃ_๘งp,iกพ๗พ๊ซ–้zh€ฤfฒ0วฆ}-d \…๑ู/$[um@์ฎม๋๙ธ:8ฐz'OnXหภศInขแฌ4้pำจอ.9weี@lEi“œฦFc ‹K€ิh“[๖>หFNv~Dมญtํ1Zศ‹ฉง}๊๖ไือQ฿ํcq h‘ิํ๘5อUำฏ,ึyยf-กษณฦ๊ศa.Pใ!ค9ฑฯ+ำ๊฿f๔ผˆY;ฑไ‚h™;2qฅฤX๋ซ#ƒ`‚ำDว ฉกlcภcฑๆŽ2โˆุๆ๘—คั$]zq฿ีje2๐Yg•x8ึ้g9๐โบ&—ฐฝฮ{ป5บA ๏vh{ฎcdอ‰$rโK$2GaฏŽBื ๋IX4wโีฬ Ž๘๏ะ๖6ใg…นีต“ฑQ~สฉ"ศมุ๓j`$ณp\ด๊q๖๔*๊m˜<&t๐ำmซ๗ญมWnส-ึึkk€E;_น๗V2i.tFšิๆIซ์นแFacฌ๋ ‡UV(s๊ตย $v๚ทM8/ำีic#หš6ห#1ไ–@4ๅๅ›โ,อ์T Mk*GหฉบކV“ฟ”฿๑H%{$…ั๋kฺืgหพ๕]”ฟฃkGLส:C tŽpa`ˆ™ސE ม$7็ต]…6:(ใœeaJ๘ผฅ›†ฎกแgl๎tSธ!œธนถMH ฏCq๊ญถxNnอธูkลล9QJ, 1นŒp!๒Y๓P฿ržส@ตฯˆcAง๊%วbGžห_S’ ์ฆdc~ ฃิc†'ยุศิkrโO7ทก)•พ!๐ฬธ™qอไˆŸฐ–$rQ๎ ยฅิ๒$›-ู kb’hฤ1ฝดI:‰l๋ส8 ;+ฑcnnkb๊9ฮรŽGŸyะEูา—lz‘d/<6?ตบทGฐ๚_ชš›ฺpูั1™‘)‚\œ,oฑ—,ธ2;x๓šสวnUe`ˆ^$oะ๗1ฯa.nซ;U€?#๖๎;`ญ8ุบ3ไ ฝต`‹ฝ7ท*๎ซfเ"ฬlކ๒];ฺๆ:mF*’ด๓eN{ง˜t“ตRะฟีk๊8ะEมdฌpํLF#จมa&จEN๖5[€ wำฟฉ(kคyc<6N‘{ ]{nฺู2I)†8ไw์ใฐฦ‘Zl‹U้ ๊ฏˆi.s^X๐า[คฯฆlN๋f๖กฒHmIaำgŽฑO$Pอ C r–—‚ภui6)ี`|ˆพ๋K"ร8SบIgf`{|&†ูพซ7mpฺถ ๛,๎hบศู5)ต6VA ะ.ช“Mi&Žอ4hภฃสทญอ‰“‘ุaม๏itํ๐›&ฃ๙t์EV๔฿Yƒ@ นฅภึ}9P-T@๗ๅgฒww.๘าฐKw…v6$ู^/แุc‰าผ†ำ[ษ‹ไmสำัก้า๕›ึ2rqฐa๒ใDู^$‹Wธฺึy<8Ÿ#4ฦ๊:uaฑไ}ฝ;”ทAžถo}—(’v69 ๋ฒ?งt์H4ภฬ}|y.˜๊knuCๆo”lI^L3Gˆม"ษ&๊๗๛๊c—qf’)qฬn•’GฉขF๊ถ{{ซ2%—#^Lด๗9ื#๔๗<] ‰฿็EK'&Yใ+๗ธ5ถ]Th๚Ajฬ๋[>h๚—Qสส‹iวŽy5ถ-๎šำฐ/’]๚^F<ฒฦุ้$๑@1ตฦŒ8™ kฟ0|ญ๏i฿๓ถหสอ ‰ํVIR,$ณSlQ฿‘๏ใ2๓ษ.œวŠ€์ƒ’๊4;จ‡Yk8ไฉธ๙ซฐ๗[ˆ›Xdว\Y7^ใpFา๒฿ญ ืžล.k ุฏฒ‰u›แ^|Œa>Cฉ฿=•o`oน๖;*๗;ั6Bพ๊ฯณณkๆ‡‚ํ†็H ๙<๖Pt€ึัYปุW๑ต*ข(๒k่ฅจ้2‡}!@Ÿช่ถWa๔฿ึั7'~W ~‹…แž็ัqฮv๕ฐUืฆ๋6Žนลจข,จˆˆข" )ฑทนแA^ฺฆzฌJ4oM•i“๖b6l\o๓[ํฐ฿ฒ๏ˆาึฦ๗ง`yoร6*‘กป๕๕Uฅš*๗แshDDDEMewIซฃ^ซˆˆํmv>๋…Xู]๑\noๅ-;ชญๆส""ˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ คฺโ"$Gหั^๏Zณ๋๊ณ+ํ$7ธ R๛,wIkซpแ๔W๘ฒษ†`|’:8ec žFาy;qพหบ๎6พvFใศไ฿๊ซ2ํ„žืtญ’๘NQŒฐ uƒฯฑ๙ญ +โFทrIพ{๏ษRลวn\๑Cœ้ๅx๏kZDEฤQvMRฬื€โ5ถ๖ิ(‘ูIeบฅ—ฬzณณ๑-๑bŒ<ฯ‘ฌGp,๓G๊พuฬฎ›๐~GL”๔ 1็ฤtx๚rX[] `pkงcwฅร`ฟ?๖…Œpcศfฉ.™}์ส์ฝฉ๓ฟผฐ:n&'Jƒ'ฎ‡P9K„Žqซ๙รฉา™e1ฮศฮษ#{‹ฤญcหIpาึูo™ิxุM(gทIX๐Gdร“[ƒDj6%R"k…ตแ„0บไpาHฒk้T=mAฏ. ื8ด _*๙.๓ ฝน๗5`tืห‘žแŽqฑ]s อl.5Me๊;d๎ฉ~<@™?โ$ทG”6๖Wb-P๒\๋?ด>คQ+pงœW9“ๅหš%ก` ๘รIีชษi6๔ฉgmฺหพS"y-๐„š๕€ณ@๚๖7B@เ๗k:ˆ&ศ7gึ๛ืฒ1ไ‡6O3cฝ@–‡“ฝy€ฏQนTทŒ9œ<E ฌ’ีฎฯซBัt๒Z U์wซFนอ:šKH๎ ํแtŒฌษ„Q79๑jผŒ˜โ๒ด|ฮ ฑ๒๒@tผฌŒiaศtฤ๘็kฬoŽAฅฬx4Zเx7ุซ7คีPœ๓๗V:3of†‡ฤu8oGrw๏ูVF—lA๗+ฐ(/…!u}‘๛๛#Zาฃ]๗F็SEŸ@นฑจˆ๒ผฦ ฐธ‘ฅฮ:n๖๕๕\.$๖บ์=แำชผทW๎ฆดฎธi4เ5P —ภ'Žข“uศๆดปWฆงPJ€พลkt4x็ๆนบฉT[‘แ9ร๐ยRะ฿7‰VN๖vํยจฝ•cŽษั—ธัˆ^ฆSต~ชถy&ฝ‚ฬชบใnิึ์ํ๏๗Pี๊w๙&ฅv%V ํœT›zwฝ๛.ธป๒Ÿ QDQDD@DDD@DDD@DDD@DDฏฆด๘ฺ„ŒŒ4Y.5{€ฑgูd]kœำmqิRฒ–8pณZ์M†@'ณฦ์wHว ท{yKopM/โ,๘๚ฟVโเaใ†Ef<(œศ ซK‰"ล^๏ตฏ“}VŒ6ฦ็Heษ0ร๙Z\็š _rฑ0ืๅZ๘}฿๖y๑;>๋ytl,‡ฬฦc้หcไ‚C” mฑใe๚ฏล]UฝK .›ี๑๓็มŸ)4xAž ;Bศอ๔7SKwกwถห๑œo3๚n$X}?ชu)1€h๐ฅ‘ฦ(ฺ@679ยลผoท ฏGคhWแน๑๒บ\Sแๅ$2ฝํ>,t) 9žV’ไกT(P^ท๑ฎy’s๘ํ‡Rc5_?ึบ$8qไไท ๘b_&Ž—h€โvช<6ซ^wรจAี๑๚_EฤvV~A-Š&–‚ใD๒H`N๋๋zฎwX๘ƒ2Lฟ‹ฑ4บj?ฤ5ฑM;ร รCƒ@.qุvฒฟT่}[๛4๘[ค๔ษ๒z+ู*s,_6ซูอ{ mบ๋ิF}<8วบ฿\ณNe|๊>โ์ฆo…็ษnsฃ๊0ฤcฌจต๘:‰์qh%”lŽ/ฆG'Qฝ7,œp๏ ร-ญkรฮท4–ำH46$Šgฎ|k‰›ู= แก>อ™๏’O4๊!ฺด๎ปm]ืZฮฬั๚ด๏v`้ธธ๑I3โศศ ‡ กžf5ํiึฯ/ๆ-›๕๓tzk?ผ}G\๚xO๔พ-ํ๊t8๑ ๊=.Xฺืษฆ!Y`Xธœ๐ภ็B\ัฑ$RลM3๕f3ฌu,~˜$๓อ—+s„‚ฦฤEŽw<๓T;ฏl๐แWuฃ—ิdลู9y~l‚!>G‰แฐpฦ๒ทฐa่ฉ-จ_ ศ11–Rเ฿m@อmgัVศ™Oณณ$ุใ่ฝ,LN–:D๙๕,จzƒ\ฬลkล‹sŸซสฝจิ—X<ผรๆu[ห!ญ๎?Š™1J#c€206q๓ั;๗๛ —Zุษœ ‹ฎ=+๋๋๊ฎc Xฯ+ุใOsŒaโท{ฺีะˆ>cผ1$-c๏CžZ๚ฟห~ปืeญธธมšoลน๒j ข#๛at๒็]0ทmˆ7ชํ]ิxIมบ&™ั‘‘,ฅ™ .u‚๖ธX#pu~`oูbv\๏มf+ฒค8‘<ษO‘ลฑน฿™อo บํ\ฌs–ฌ_VWFฯ ‡Sตูิว3`๘?%ุdkย๖‰ำป -ิ/qถัDศฆัŽˆ>W8“ฝvvŸ`บiธ็F้fลคึxŸ”^รqฝ –ผi‚่ฅ‘ป.9Y3$•อ–=ฦ“ฎŽ๎ฅ.l็<ฤฝุQH้ฃ‡ฤ.‰…์ีc๓l>฿UŽญพZิปœ›{Yโไ;t๎™dลแ=อsฅt6Kž฿( ้พQCึถ)ฦ<– ขยo‚โ๔แ฿า์พk+ kฏK]ฑ๑cpG฿เฆ้คs#žc_›KAฐึ฿๛ Y=x.[lf&_Ks3ฆย๕dŽ7ฯŽ็B็–9ฅ ธQsIพ๔[{า๒ื6]-%ฎ๏‚)kdำ6bdฒฅ๎ un,]ชœd^ €ตาx ๖X`์๖p6v๖Zํณšoา3ศษ$อ†(ุฦตŸณบภใd๙๎BใOทP jiเ}‘๏ึ็ปHhqบh ฮภv 4~KRpอฎสๆ=ื~  ตน6OญP๚(้•.ธ’เ{Šd†…ญ&ัi,6ฃZฝk•œแEีฐ%บEmjiผ8~<$NŒ Zใ š๓ถˆง ุ›”ณาํžพ้ค่ฝ$ดฟไฏv3‚ฬฝQˆŸ!ญ๑[ฎภปำฮš๊ซฺํUใมุX<ˆ หƒ+6@ฬLyf•มฮ Œku4[Ž‘ฝ 'ำuWๆq/$“ษ's๕S‘ญm,Pฐ[[๗๋ใ”šตm›Tึ–šh7๚ฉ{ (ds๔Ÿ(กM.DƒตŸoไท8Dไ†FBษ\ฺไ€lr=น^{*รIใŽ็ั_ุใถฤ_ูtฑคwi‘GRฒTf<ํบสะ๘ฅฑฤ#ขชเ‚)R@ฺูชฑ_U+$ู#uงฆ๋zฅAื;SiญkZฐ฿mญWJ์pย\็Hๆ Lบตใ๙๎น0i.sF–฿ๅปคuะFฤจ๗พจN r6; ไRฒ&Aใ—๘[Š&ฝฏe^ฟ4Qญฌ๛•ขcท ,MŽ) fCฑฑไลฮฤพiู Z,O YกB์•ฃhaŠๆŽ0bvฑ‘ ู(KOญVีT}U9sล๘ฃ,!ฯŒส\[)”›๛‘vjฏ…๋ึ๗+–ุgˆร;ใ$ยcิำ`‘ฑข9 ื–ยๆ5ฅ๎ัตbี[๐NืuRเฑบEู๑้บนฏป’0๘lo‡lkAไ›ใsๆ๏g่ง#Cข>ฆฃ4V๔๕แT๎h †ฺŒ‰ฬ๖L{ึ้T9ไ๏๋ว#e|9ฬ’˜รHถ—Y์๗๕]%๖ฮ”iฅ้๔pคุ๊ฟ™mฦฤ2ƒ# ‚.ฺฐ}๎Vgฬ6ุฟจดี[T8-<Tห้จKช๛ŸzOG้๐๔๙:'Zfv.dฏจq˜ะ`ว—0E—mจ ษํ๐Žyqs b.อF0ืz๚ฉไO.Cฺ๙ž^๖ด0:€5~รžwๅs&Gdธ>MแŒ้ฌเPู  ฎžM•วฅาฝjosA:[์เ9ฟu๖]k๛9้?เฒlžฏำ:ค™–รๅด๘/.hi ๎ฮฤ 'ตฎOๅt๑m๒=,ฏ/ฮsMษ‡tผ|ุฒw๑ู,ญ‘„(ถ€#{$4ฒ l€ึป"ห็ฦn0ฟ1ซ์+M๛ฏGโจู! ƒq่˜์x"Œ9บŽฯ1‰]œIไ๎@ รญ}‘[yM>Ÿีtย[‹7Š–†;UHะAqาๆŽ>wน๖UๆEเJ#:uดy‹M๓บฝฑ9‘Y&‰๙ร€n‹4*อ›฿ต)ห;Œ^'-x) %ภy‹Oอต๖Œ^Yฌƒข๋Um~–ธะ จoอ+my"Hห๓f‡ทฟ่T2<gแOศ5๋ฏอซทช:_`~PšถๅดชฅHธ&†๔ฎัข|9™ศsZ#ืแู{u_ทซ๔๙ฌซค“Wูp,จŠNq-›ฐซิUD@DDD@DDD@DDD@DD(๔ko‰ซEZyฎ๕๎ขˆ=๖๔<“+z|Œ•บƒYSTึx๒5sTะw๙ฏI๑ห€๖;ลŠfล#€“pMตอท ๊๊๊ทพ;žWิโu ๚—Lxši%ž ˜ดF7ีฐ5็$ะกf๖ิJๅqี็ร[}Gรe๔<ฦฟ%ั๕ ห๘ธิฤžศ.Aห‹œMzฒQ๘Ÿโ่๚ื_Ÿชbใมำฬฑ5‡aiาaย๖6Z@บ๖๙)ฆ9ฒa’งŽšั;‹ .ผ@๗qd]ะ$ž-ธ๐3ฉหŠ๙ณผ\ษf‘๓7'q €wสใEฎvๆ๘เ›b๔๚s.rฝูYฺ๐ทQส่๓eœHrqใฮล,4@a‘ค?ฮา็c@ฝฟ0u๖๙9}g˜“ร.Už›ิณฑ๏!ฑใ๒aจฮ˜ถo™ภQE€ผพาบlว&nชซƒ q1าบ6–5แภ ธ้ญ่{Œ]' u‹2q'สห›ฅtŒ’q•ืGแช61 jh%ปีY๏kษิธu/ษx“อฟ๖๗฿แใ;~GWหฦ“ซ;<๔้:>\ฯ9QG…%44‚#๐ทบ24ถ่๚e๊!ะckpk฿eผyใlค ฮูโฏ ว“ษุฏNqโFฑ0uตŽpnีฑฝฯ๐๚ญxokq๔ดK’\‘้€๙ดุH6@$๓ถrฉฦŠLยไใฤู!ำเตŽq;j@y8]&IฆV<Lc‹ฤ„jนฤ]ฯ>ˆา@iiปป-m•™Hษ#ศ{ฺ๘ฃ—_˜ฐ(›œ}ฝ–7็@yใv,sN!’Ÿ(Œiญ Is้๊J้ฦูา์๋ษ๎š8|8Wด;k‰๕Yพw*xy]j$08ุ๙๛่ดแK4ฅู8ฑไดฑภF๙ฤy]ๅๆฝ/ๆ’cJฦ9ยS)ฯp๓P&ฑb‰~ซ>"เƒ๚๛ฎำYF-ะฺะ7vฎ.ิจYชๅ2ณ˜qqaŠดลฎ฿@๋. ฿ะช“ชึํํfMบึ‚vบ  ้ิ–ฎชหŸ%ํŠ-o{0\~C•้F_.NTนาฬงjˆ็xšๅีdนฤ›จ“น&’]๘…šgัทe๎Iƒะ‡ยหgT™ ฆว๘-Œ๐KlผluQฑศํฑ^9m๙†โ๖(vณt?‚นaฝsค™i^N-t4฿;&๎าดธj%`‡nkšๅkIตeขฦ๖ฃVZ,{“ภ[13๊ส€dลกรGˆYFถp#ธ๔; †มช๑หห,Pxข อwฟขŸฅg-ฒZืvsx?+Q-ฃ๛ส+•]&ีฒ'สCcayŸ+lะN€์ขตฺฑไ†นมถ@ิ€ถ†นfํM ็าฯ<ฌ๋.ิา@Ÿoบตฬ.ฐา๎ภ^฿๐*๕์—}, …5วz%4Žาyๆย“ ตYuูร๎ดcใŒ‡>Œq1ฯ๕Qฎยทร๕ ?ถ”x:Eตํ?07]vจ็oฮ†ึฏะมๆ` vพdqั\D~”ทฺฮี4๙yฌ{ฎดm^ซ€ 4kูwท eP|{yZฯD“Ck฿~V“ฑ>จ(๒?E,ู.™ฟๅฎ†k฿ีhtmxQ๏_ษNี๎Tcเmcm‚์˜๚เ๑|hK๕้1YืUzธชฝนป์ฎาt%รgs €ƒNp]๒ค"์mhะฏษt0ยv/rฤ^ ๊&€์'๔แ$Gฝ‚ใKจ์@๙+แ<ข๗ytูaaW‘“,ดื9ฤต››ฐ8”7บ„‘†I –นยฟ+ฌoฟ?UŒšลข‰ำํ_ชฒhŽ็G3ญูํ‘ดZ}(๏jๆต€าเ@djีฟๅฎหs] ]๑K‘๙-gš[ผm7ฃ{ิl_‹7†ฅx๓7Hถ;ิXวนอk\็pึ๎OตzฏOฉbใใรˆ\lฉfŒI+!มะ<ฦํB‰ ถ๕vฐA(‚Vพ#ชVแm ฿ƒ`vฅ™–ๆโ๋H27ธlะ~Bะตบํอn่/eฏ-ข7Gา๏ู4ุ\nฮ๔M๋ทm‚ว&–‚.๕o~‰9ƒนo…ู3V=ธฦูๆถ๖๗5U{nนtฏ ฎs ษ๚&๔8๙ ƒAš(P}TžใMฏmย‹#s˜(์ญศ’]"@‰ท๓ฟqท่ณตPˆ€ภ@DDADD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDAn>าjkiค๏฿nกีฒŽC:~;ฌ \Vว.ถ›%๖Nฮอƒบ๓ฑฺ_!kZtธั5ภ'๙-ฬ’yฐร‰;ฟ8„ทXกฉภ๛ปYํทtึ๎วeณŒh`<6๎พgนQcKฟxwkHรuyy'ฒฝฌ6(ศโฝJๅj}O91ำrŸ”วDpŒO7lขN 6๓w๔Y[ืฃKตhว"ฝyV่sHpฆGq`l๏ศศc฿‘4“KฟhDšซฒyฺ”วeฬ…ฐL่รญขŸmญ.ฝ๋ทชณXkใQัเฏCฎ๔‰บ4ุLฯ†x#Ÿ,จฤ นฏีุ[ด๋b‚Rา๗:ถ&ฟEœ,ผสนpE฿โถ&ฝัฏKAvŽ๛ržn–dนั1์ฺ`iา-ข๖q&Žไ~‹<ฏm–๘n s|Wชะุ4Cฮht$ถ๕0นบจ#ƒGq|nผ$ฺผ‘ฅsขŒลิอe๕ฐ๎@<๏๕ฅQ46›ต››‹ฏ €=A<Ÿบษ“Ky$VƒvOm๋t๐ซ1^๘็ฬยx|:X|คš;$‚= wSš=-s@9ทด+dmะ๒฿>ุŠP=ฌi‘ฌฉbี‘ๆท;๙+ท?mย฿ื`๎ˆปฉC•$z2#„wF|=WkNฆ^9_สiนแซโ>ฃE“ฆŒมาค—\๘Œห-dฎำป‹I"๘ํ๛ฃuๆœปŽ>\‡‰k<แํh็สลํmช;- หฦc:|ธฒdCิYฉำJ๐ะฦธ'ถ6ฒ%mบหœl4๙Z@้อ.Z˜๓ฆพ“แ>™ิ๚หbfPสฮ€?ฤศaป4ผa‚šวnฺpWว9า๓ ๊๒Eะ๑%Ÿ49ฒC)๏kCภ^ฦญƒๅ์ฟOอ>&ฤ๘+ญ๔๗|[)ล‰Ž{ “N‰$lndบๆ 8P:บฝืฯAย๕ŒษzW›๕>'โ™ฬkฌ0ถฮฆjาร{เv๏ไL๑ห.=kำงlฒr๐:รณ๕Xฒ<฿ล2'dEแ#ล ฝฌy4KZnaKหฤ่9ฯฮลŠ,—(;๐แฬฃ!iฃ_-K๔†:ซ๘Š ฦ๕!‘ƒำž%NŒภืบ/สMhญAญu7–—\>ใฅึ:งฤฒ> `vg๘VBง5ฎhnง>ฃขภฺ#Šฺึฏ๒nำ็วฟYพ๘?ฃไ๔ !อหg=ํfO๐Y0;—I+šสถ†ำA$นบ{ฏ‹ศ๘จGFK๚< ๐r$C%พ$nnฮkก๑ธ Kึ๘‡แ,ฮ‡‰‰>&&4ธ’๊๐บŽ1–FKจ 2? †Ž๖Mฏ G2gบfb1Ž™฿ฅ †๊คทqชฌ‘ฯkาถ๏9—Ÿ๏ดสk‹๊ฝ7?†4ภย cแ๓a“ฤs€x-าโํ4[๋Uนภฯ™‡—‚ุq3ฃv<บSctD9su4ฏqDsณต๕0|ื$่ใฆม#Ÿœใ ”,๘KงฮงลSI“<ุ๑b`ฑำย๗a7๖zฅก#^๒ฦฐ†‚๔’'lว{งว|ฟ5gL—ฅโรี3›&V3ฦb•๐5ม†J:‡แ’I’๊ฏ”ฤศQc:†NL๘rf™%อtฒ9ยห‹\mฮผฏ?G,บธฬท“yษำ&ย3็ฦ๏ภu>•“3q`dฮkๆ`ภnw 9+gL<ใau–aไeA!‘๐’24๘FB฿;\A<„ดุvV7Z้˜๙ฎฤฯฤม•ฅฌษ3[ญ}8ท^šค‹พ6Xๅษลอลt™Zฮn–ฑฒย[ๆิ^9ใ๒ํตท:yeๆ๎3'ื/B>Ÿ‘‰‘6~wแ๓โ๐]A(หnข%u๊! ฺ๓_aeQ2)_ฤ]AŒ#‰ฅ–w+_ๆ:$]ธ›ฎ*—๐ไRโฯึsฒ๚tทK by^ำE 8ฮฟ@v+็&๊ธJ\8๐ขศ ศ˜ษ![œ/ณwq๒‚ว7.ูถธึ฿Q๑#ฉไ3ช๔Nฉ€ึฯBHrฆ-“ทCh‡4kแjาxz๑พWHภว้ฉddใaบเ™๑˜ฒ\แAลฮm’q๎MYแw๎ตtุfŸ)ฟ‡‰าบ0d-k๔›ํJ3Rew'๗๛“พ๏s‡้?ูลรง"วu~–มG๐:ๆE;Iญ>ฤ† :…“gm•฿E…๑Tอิฅวอ—Kzฦ9ฆd้d๘ๅSBร˜*…~eิ„๑ๆ1๒ษญๅŒs$kุjฏj_e๐ฟลฝ?†ฒ๚Gฤ];!๒บFK›ŒZํควย๏+มฏm‰พ9๔;oษ‡Ÿำx็น“ๆ๚ฎ&GA๋๙ฝ;ญยfŸวเ<‹กMsI[ฆ‹ln๖WE<าดauสูm๓G“qiป&ศu๓๊พ๏ซt"่8=Yู˜Y๘L&dAคf@ยHอ,’ล๛้ฤP_/มนูnฬ่บz”"M& pใ‘เGWษญฏuำงีฦใอ?฿ฆrฦหยธบิะdฦ๘$ธัตบ#ZIำๆข8#Q๖$z๕1๑ 9BmYl‰Ÿ,mcฒฆุpb@;އา$=K> ้๔๘8๎ศŽSทx ็X Hณ}ถ+ัvnwUม‡ ะ(ฃ๐๕kƒœๆ€(šoป ๎Vฎrษแ%บำ ฆlดraŒต็สeฝ-ƒ ทสf๖mทข฿•ึ๒d้3aไI@ฮ™ณฒi๒K‰:๕k]น#อฝ œNฃ†|\็E๋0–แ็=อf—SkM8ppาEึฏ3$fC฿—ะน๘ำdธำบ:6}–๘ตžcTว‰#฿ ใ1รขCช*s|วื`แDอ์ผblฺ๚ฬn…ื3b`๘Ÿฅใส[ y>Hˆ  ึ๊ sx;n86ฑๅ|!ี๐‹ŽlxฐFษ Oๅฤๆ‚5^แิ+ชŽ๕Bษ |ธKซy;m๐๐ •ะMฑ้ึว M=Aช์๓I;หฅqq ฯ4(/G#ฆภำ1ง~Dฟ–F้ !รE@q}ษในCำDฤˆฃ‘์ีZตhh^ฺˆํฟฒ้9ๅ?Lx9ู8s๑'|Eยœเ์~ซvP{ภ๑s 2ฤยุV™˜เOๅงXoฎ๛wุ… บOšC‹—ัมq1>N~ชถ๔œ‡XลิฆŽL`}๎ซoU‹W•๎|ข7 ถ๊ฅึฺุ’tบˆ๎vทnลŠ<งฒ,ูโ[คŠy๔ฑšHq{จ8rh fฏฮ‡วถOฺ‚Mjˆ€6;๎w>”งŠฬxฒขgQว•ุšวˆ!!’–ค›ฃFล‚Iฝn3รา“ฃ–แถv๕.›9š"ๆวKLท{5ฬ;‚{ ฯ/อฦ›*\|ˆฑšs]มพ ๕"ร{˜_„_$Zƒuด‚‡้๒~_wg ฝ9๐™tdผ1กงCƒ/อุccพ๛า๔™#y’6ป๙^ื|๖^>V4๘“ฒเ– Fๅ’ฐตร่U๘o"2ุว˜&ญt้e๔ฮxท‹ีฮื\ึน„7๓Fธ๙กฤ;หUฆป๚ฏC’ #^เPฆF๛–ถOŽ์Iaศลน\๖บ<ˆฅัzh๋ฯฒž๔l,ห~ึข~C์ธ๗9ฮ%๎{œy%ฤ“๗Rv<ภ6ธฅS฿n+R;ภปiพk๗~์บฦI+^ฺ่๙z@$1€ีŸAd™ซ๘WฅŒงdOŸำฑเi•“dFู’ด[# qฃจ๗w—ืe—ฃt\ฑ—X๒ว ๔๘๒Iฅๅฅอ`#b๓Dเน^ฎ3s~'Nqๅ็29$ 1u๑ฅ…ื๖Sฯฤหภ™ัgโไcL(–อa›ฯจ bถ|I๐วV๘zFทฎaœwผ%ฯkตษr7uไตถX6์คฯœ,ฐธ๖๑Zz†0ร‘'}Lcห๑^ึ’/MะXะฺฮEisลv<)Eš†ฝลj&•ัฤอูุ5อ$ป~ี˜ู9Mอ๐ฎI˜ะๆcI(ƒUˆๅงชฝถพT๑๒„nข8Ÿญ…tญ$ณpu #}ปƒษบต‹Sมf๚\แb‡ญทษ[Ÿ‹‡ Cง3ƒฺ๙๙พ{&นัฟต/3งหิฑพฑ%„วงฒR,๙†ป๗ก@,คนั–ณP‹รe&อํ`ŽBKกฬ‰ฑวNk|ๅ๔u;~ฅVถก[ mWขณ —$ืSฃ-#r }Š้ว”FfHb5ฯซh$l †ภŸCบ๎Šoบค๋๙ญi6ญิ๐หˆญ์VาศVM่ip๔…ย*มฺนUฝท,ๅLPฃ@๎ธ@'๘ เw+๕]ํwตาVิุยX๒'@ท8 ธฺ๙็ถ้เ@ ใtQฒใBถ๏~หF^~@‡|น4—่‚'Hํ [MะIชธฬทใๅฬ!,f(kฅ๑ุหA4<ฎ!วVnxฯตํตรูAวศแG]$CึElฐผUHHท<อศฃD๚_ฆ๊œศๆยศ|Q๘S4–นฒ๖?/ฎวƒศต›ž-L*  จ‘T8?e/ธn๔hvRƒ^3bศg…!!ฤฐำ่~_3Hฏ๘…ฒ,X๓] {<3>yุฃd`U_˜ปส{—;œ“uฎฺฦ๊kn>`u $W๕์V๐F>vOUn‘ั5ุวF†ศ็\l‡xrสk*ตโCE u’หภ_Y๐ฤ฿n๊x91bIีq3๒O€h–ศฺุ5mชvม,u2หmลd–๒ฯ—ำฯB๊๙/ซ–ห.;\ฦœ|€ๆxปpๆุ4uqฟ #จะe}U๔ฎa๘ซGใ`๕gด7Xn˜๓g‰f=๛ /˜-–พ)˜่ง‰ล’19ฎGัv่ๅ^\๓Ÿsร‚ {z{)ฦแ ดูพ@๛lตt๎—ี'๐zfู“–>M0นฺX-ๆฝ†ๅeo‚`4็:W‘ธhาz๏ซ๘็บํพuาวไKž฿ษ}WX๊ฎอ๘'แŒfbลŽ0 ๐=๑I!|ฤป[^๖–†ฬ๚ ’h๑Kๅ„a™ฒ,ทึ8วจ4Wํค‚/ืื;„ถ[๔ืwGMqqย๏~kmฏnห ’ฃๅod)็บฟ(ญZAูพทฺฝUั˜ใb ป]ฤštภฎิMX์ฝO†ฐบV_Vล‹ฌ๕h๚~ ไ{%žLwŸ"ว( 6ํ๖ ๊๖ต”็C ยฑ๒›42Gแห~‡้ิฦXp ไฺEะrฑบvSฤศฦ้๙’8ล๖่๑Zสƒปšบซ;žWŸฉ—™n1Šณ:~<=bH0๓ฃษภnCขfXanธรˆ2xwเฏ[แO…ณ~'อM้ณ๔ฦไc๋.’|ฟฏw8;vฺํศ‹ๅUิ0!่ร:3-Xฮะฯhโั,d‚๐ำGS\รzด๏Dย๑`~L™2x. DCˆŒึผoๅ›ฟp|—-ๅž?v๕%ๅ์็ฑ๘G&A…Žึ9ุํ~>™˜็ฟฬ\เ.ตl.ฑa๕? uร•‡J~^[^ฬXๆ…ำ?J–Hก` '[ั[S{X?3 ๛ฝ์‘ณฦะ๘"๖†š #^›ิ@ใbัย๚^!{ๆ’2โoKื my"ฏฯิีทํำหธeft|/‚๒cจ฿๑FNcŸ,oวt_ƒk .๊ข๗Tv`ัF๓|[‘Ÿิๅษ๊™=ฅI๊nvC–๐ู544:8ศ4ใฮซุด๛ไฤv4'ฌเ5าษ• ฮWโš1ฟดc[d:ฺZE cํsรงž7Ÿ๒I–R๏'่y?ฺfn'ยำษ!c_#๔๕/#ณข~กขœZหšเึ>n๎ ๐พฉ?T๊yC,ตู9s?"Rึ†‚๗ธธะํน+wล0bโ๕‰๑บn_ใz|nธ2  ;rKlัสwฏ.หศ]|:SปๅฯฉหŠ""๔นˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆูXศœ๒ภ Fณ@นภฟeZ "ฒ9 Y#<กฏ’ภใทNใ่ซ@DDD@^ฯม/ญ|OำzoS๊0๔,™ƒ%ส™ฺ[w<…ีv‹ฺืŒ‡…œฅฒษtN+๔Ÿzฌ=CญgEƒฃ :ลcN@–?-F‚เีb์Gำๅๆa†ผ7@๗0^–ฐ< ํ|ž฿tR้f }Q๕฿ชๆ๒Fฦ‘ทๅsE๖๎=ป้^I–z{\q๕ๆeI’๙ใi•ล =ฎg์ไhฟ(kถ‡bณำธ๔ฑ˜ศนo+mWึ>$๊cฆเโu\๗O…bฤ๐Ypฒ{๙‹๔;mภปเŸ‹“ีŸ.Lษรฦ†LขM๘,š€ำ ฺ!!ง“CMู—“—ิบ|ํƒ๑sbtm๓X,hฃdd๗๛*๓~1ฯwรy?แผCัfš9Ÿฒ๙มฑqพ8-๔W+๘vแ5D“๒x9Zๅ—&I๒#’Vบ‰M๊ตVU+2ฒ1]แ รM ~นLšŽ เV๖}ฏบณฃu จฬฑbษเƒผŽZ฿™ก^> ๊GQ‘ะฑš]ฅฏq5@บธฑdํFํaฬ่๐ฤ/8Luนด่ส์M๑{ํูje2โkหTš)๓ฅv9•ะฆ<ถฮUตี]lฒ’4ฝฟ๎|Cา%ษ=J8๒b—K ‘‡ฯ›kธปO'ž.ณ๔nทัœ๗t๙Œ/ykตฐ–=ฎiุตํ!ภ๎x=า๎q<ฃ^F~$ฎ๏n‚[๛ย๎ฝ๗ภ_S๑`Jžcไdเg˜†ผvสโ๐็๏.ข+O›nฑWDRณโL>—ิฆมx=Nv๑ฤeืk„ญ•ฅพaNnํ&Žล|k็ธน๎.'น+Ÿmห.|ญ๊i้๕.ท“ีzๆ_V๊zfสห{ฅŸCDBG‘๙ˆhซฟ1๕7๊ฝNœf>= ”โ9ญ้œฐ4ุ'ฤ!ค่ขะhP;๓ฒ๙e๊`๕Bศ_Y‘ั8‡š\เ$oฯฅ-u5<&ำ๋XูzY;ฐ,•ํ%ไ‡Uw;s[ะตฯ‡ก~Vp…˜๏‘ฏำผ8หด‡9๕๙๚ซ๓>%๊2๔์ฎ™Cb้™rG4ุ๑ฦึฦ้kภซs{๏ษตไ=อcุ+`๎A๙ฎสI{uKงูf3ซt,ร“&&~$ฮ|คธย๛#pA,;๏{6ฅ’la,oŽXฑX\ฝx๋FŸ+…฿{Cึไ~>;›“'… ุุฅสdr4ฝญฃฉดNšฎCฝ จ๘๘พ ร/<ใ›o„c…“9ฤbม `ฟkิ๒—ิiว๊~Gส้฿>VK+g3Msถ…S+K"ภ ฌ็ฆธฦํfหZ_๛cแบฺ4๗ฝ ๖>”ณ(ปD4™ƒ˜ง–ึ๎ {~Wm|w*ROำF,QeๆJ้[ฏ๖‚ึ›mH]ๆฝฮ H+ญธษน๖ฤ–(๐ๅษ, lณJ็ตฮทบCP7๛{ฎปXƒู+ %ึXXแR<ฎig#š ๏}๘xลC†ƒ)ะ7%เh.๓$ฒ8hiเํฉ`ŽL<)เ“&P^ืHศ›Cw4๙Hช"‡๙ค๊Lงแใฏ/ทS7ƒ6X &ป›๛m์ตภŽ1ตฎndZYqดนฬ{ด๗ทGqDmุ๏๊uภ&8น’e‚฿+X ๋jๅ7u่;Rฃ3แฃำแ~Tpตุฌ,>8p-{œ50y\|ลป้ไyฎจฅสฤkำฦdRเ๕ lŒ)•คKอ ๓่H#฿‘๒[fœE…4‘แiŒnา๘‹ึ xiญ>Jข๒[rzˆJŸiแŽL๗N1#qp4Mูi$5ฤEึ๖ฒaFฬ‰"๑cnF06L1#š็4‹qe๒ยํ S…ฅทg$๓ง‡›ึz—PหvWRฮŸ;%ั˜Œนo3ปMV๛เฝ;Rี‡ิฑ™าŽ‘Lา$ดฐFA}’\[ฎซ๗uU๎ฝ‰:>>Ce‡3คcฮฯ๚ƒVผฆV4jถฎ}qบ+บf[‹ฎt?“5๐ใk3Kญฎฑฎ2ยvํWžgZtฒ๓ๅk+šว=ผฺพ็ฟั@m/;0ีฺึฅ-sc|๒L็๊I`ฆี‘แY7dQุWำฝ#จMาฒbฯ้ฯ’ ฌwf‰ิๆดŠC฿cฑบ!{ป๗7Œy๛uyyื฿‹/S3ฆฯ‰ˆฮก63Œ้] €•ญs]คปเเ4žฤ๎ข๙โวภส้oม้๓ฬdืteฮš7y|กเ้s๛iไ์U๙7ใ“ท^[บl8จ่๊18แx&f?Ÿฤk๛์ืIิ?04ัP๊A…+๒ฯLฯ"`› ่vขnหYZฺเ6ใิxpH๘ฆcโ{˜เoP฿๔เcสั แ9 ~C s(นึะํธนช๔ฒน•–ต฿ฦ“–nง_G€ฺŒำcqiฐ่ฐ\ฺมฝํfย๊YธดLฬœzฝโ˜ฒฏšขบ้^|I^๖‡นแไ่ไ›ุzoM–jิโOsf๖jaDX“>,|MnศW„ืด]n|ฮi า๐rฦไJุืฐ8†นผ|…๕tl†๚n6Saฦ™แคฤู6yาปnภfฒ,ุ/sภซใ้e฿;ฅ\ฆฎจˆ‹ซ"" """ """ """ """ """ """ """ """ """ ""gค๕(ฑŽ+ไŽ'ษKfmฑํุ‹#}@ป~ท๚&7๖qื:๎#๚ฯMภรv.T’—tอุ๐hnง0Kฉฏ$ fš๏ฒ‰{uืtฝ…•!ศOnDOฬฦ†W3๑ตแลปพึcDpน๕.rway$—Šท#|W3\3c=์๑#๑c‹w‡‰šซ,Gฌ? - ปQฎ@ฟP๕๎ฝ8ฯKN^>DฝEธŒฐdcู)ฎvฐฃm;ั;žX็|Mหt˜ฆgวจพ3‘ฅ๎#ฑw-'น^ผrน9^ฆ#w0 y์1’ํ:{(TŽAŒฝ‘นถ\.ฺมท ้:ฤ=Gใ(ฤจE7Tมฦร,ะ‡Kš ำ-gๆโ ฏk^,c„ฝ 4๓ค๎ใ๓Yยๅfฒ๒ท^c~.V<8™Dc8ๆฝ์J%ฺy‹ฦšง๊ฃ~*๙^vฦƒVใิ/[ฅtlžก‡ิgรˆๅ3ฆม๘œ–5ม…ฐุo‰dูง8X ŽFษ1๚sึ็๔ุ]เlต5ปS”c1b;!ฏeJXๆ1ฬ”†ฑRธ๓UGcwฝDStฟย-f๑ๅ๖!{‘โdราง›$เใหXณ@้ห_.ชsšY`นถโผฃ}B—†[‰(s€๐ga็`Fซพ๛ฌK.ฺผ>‡ฅ๕_๎ผ œŸำ2ๆ๊ั๊v~ วฃโ\nฐwป฿šฦoใฟ2|yLl ถ[|/’ˆh6Mุ Y>–พ—๛3ฯ๘gฆ๕yล=3ฌB#|Œลฤ.9ญ!ลภฐfฒwญูUิฆ่][ฏๆไ่ŸงเๅJ้"ฦkdไผธ€ pท^ศ๏]‰>Ku—ํ&ไๅแtท๔ผžฎf๊๐bโ๔๗dฑ๒39 ฤe็S!ˆ4 D์žodูธl๋ dy.้1ิn ๓ใ‰,ตฯ‹qฃu@‹`ช๊Sbเ”eO’KCDQฦุ่ตญ๕คท‹ฅ.—‹?T‚ z„๘=:iถสv#ฅx ๊~—45คด$ึษลฉฯ‡ฉื๒ฑบ๋.ภpวภ9ะ๔๗J%{K†‹{58*๎๏๗;r …Ÿณง๕จ่‹ค{ฐ๒b3มmสึตy ข(5ฦฟ.฿?,2โ๔ว0?&/ฤู"ก5l๊4Chฒ๏e้ม๑4ูอำฒ:–V8ฮ|˜ุ>ฤวlสหิ4€7ณซPถpW ิ์๑ทI—<พฒ?†~'ฬ๘x็)R้หo”Žกซ๑/ฅค4ดษ{6ญFษฅ“แlž›‹/Hกcžฝ๑’ทัฑŒฦ…ํ.$ด้I#\„9 /:?Š๒Ÿา๒zN>WZส๘dBวIŒเMŸA๐รœ,๊klๆดคW“าฒ๓dม“คโ๕H0:fLฌศž,ึฤ+mov’เไ6‰;ำVธY\o๏Ÿถฆr]ว็๕ๅkPศฤสมล‹(ษ…าฐง%ฬ”ฬย:š๏;ANภ๒?|S—ิqd๒ต™น/|ŽlQ7ล&3ƒจฦ 4/š่_ฬ๕ฎพษโ…˜mpอŠI ๚‹ds]วฑaแภ๋:ลฌฺ๙ 6๔]บ?ล“Vฟlgี๚‰——4ภQD^็\>S{zR""" """ """ """ """v@Enจ dŸˆิmฤ:hUn๏ูT€ˆฌว‹ฦŒฒ;.‚ เโไgfA‰… “ๅL๑QFN{‰ุพ†,<ราไยŽGI„ืj›รอmฒ@‰ช;{ซ๐็ฬม้SE–‘œY@k]2<*%บภ๓ชหl๎nธ^tฬ‡ว”ck’๎m+ธ?๐ญcำถLธแฑpD%ฒม#F’๖ฯธ:ฐ*ฎฌQบ๔ฐ3"่ฅฯ่,ynฬvC๔—6ภ4ัฏQ฿š$,ํAn๗ค5ปูkพf<ฺFฤˆ๕]oK ๆ9๗ึŒ์น33'žF5าHโAuธฯry7ฟ;๎Z้"1ฬX๏(SMozMžM฿ฑำ๔YปWny๎ฎแ†hs2โ็IศณkฐŸrWNู&ขomo๊yc9ฒส$s…:แ` n}ลmตฌaๆF๙ˆชhอ๚s=ฉz?ฃuฎ›‡Œษ๑ฑ NK„ฬ>z๔‡ธj\ ฯz๎ฐO•$๙2dอ&ฉๅ‘าฝ๔ธ›'m†็ถสc1็ดถฎฦห“น(ฅpž bำ –‚เojกจ๓ZAr>iุำถ1†O๑&ƒค๏[˜ฅ๎ตฎcห^าย$นตDn=9๘ฏO a|,ห?โg‘sš์๖4L{4‚ว๏[๗่ผlr—ป]0ณล|kฆ™ะฒK!…„นฑ—-&ฌภบeZ๚Nฏำ:,pห/Mฬ๊DAฬ'คส๋ๆcˆhซ>m๖๗_7ษูb~ๆ›j้Xgจu>9ศ™‘xูัzˆžhำEู4v^ฏ๗N…ฒ0™๒ไะdk„Lkฏr[o[ซ7nคKd๒๑`›ยิ QH(‰cศ๚)dหฆใฦd;LsˆุW~พๅi—ฆธบG@๖hikN Ÿถสว4ภ็ cst$‘ตี๓วฅวW’]๘VM’MYD]h.4ะIขh ุ (ฏKคKา!&Nฉ‹“”tนพ$๐ม'`เ๎Ao4Aฉk๘S ~ญ๑—Oƒฅแต๎vH•˜๏ฃCuปUดCZIถุ๐ผ๛O๖#๐ผn๘kฉ๕ฬ๗3gฯFฤู ‰ั K#Cˆี๛ฌlฎ y๚๙ฮž/|7„น]>Cโ๑e“aบfFE ด็V–฿—}ชฯะ,ฝA๐ฯฒ#f~368นNy‰ยชจ8๖ขชถ[>5๊๕Š3ฒrz›บฃ„Ÿ‡Y ‰~Qฆ€h กพ็บ๑ศ,pcซข;?ภ…๏้c>9ฟ๏ฏž|ํ๎บiหdRๆI๘7‰#>W4z ะถ[lhW /จ่~G|.๎‡ำิใศ{†\kKแ{G์ๆ…฿š=:Kj์—ฦ—๑๘๘{ฆI•ใ๐ 3ใล็:›aาiืณl๖ข{Qว๒qฝ›“z|5าฟ—๙xู:Aีูl=€†ธไ9ข8hดi/๐ฦึ4‘v "ษ*ฌllypค|zfฤ1lŸณn๚o_˜ด ฆ‰7ฒ็8˜]>l๖Œ‰ูLณD๗A ๊iูฯ 6H5บ๕๓๚&@ฯ๊}?ญย&รส’ืcพค `๊wjf—mาลหทSmLw๔ู๐—ฤcแ‘–‘’ื๕ผ5๘ณตนธ๙ถ๒ ‹ดตฬ`4ZIvฒe๑ณ๕2%™แฐฬ{[ญศ>PAาh4X‡;›๕๚}2|่?ช\จz|‰|ฎcญ๚Yd5ถt๏Wฏจ7๛ฦXแšSŒๆ2I{ร5$6ƒอw}ถฅฎž8ฬํื>ฟ฿๚Iœญฒrศฌ)ฤัโXาkMะ'าึžฅำ๒:~nF,๚^่ิ๘žย-ค8(‚=๛ม #œ]คHhา7Cำ๕WขY”ฎVikด4่,Ž˜;Yฃ๋๏๋ฒ†อึ๖=‚ช$;žUŠ๕R2ฤภุฦำฏU๏อVร~`]๎ค‹j:‰q6l๓๎ฃtญlEภ’เมwงำ”|/Œl|dด:ž$(z{ญ#6'๘฿ˆ™ัตฑ—3K5๋~ิv๏ฟฒัับNOW๊1เโพ!+˜d>$ˆ5ญœ\^@ ๛์ณI๙(l8ฒฝJCย‰ฌ๑ฃ–F\เw ฃปj‘ฑบ\บ›ื cญ๒ซ3กgใใ>YุCXเIฒ๖ะ๓ฐ‹h๖๕ .N6F$Œ๑ผ?ฺณล๑ส$m‘`‚{ƒ`๏๊พำแนzค.ุุ้sHqŒฦHุะ็Eฎ๒™ฺฆธ6ษกeชฟŒงt|,ฆcuŸ’ๆท\๓9๎.ื xฃ œ/฿eใŸษธu&9฿/E้Lฑืญปึช็…ฦษU๏ุจธ:3็n—๓xฏkjU[‚พ„ปๆ<ถhs‰์ ๖MBปZแ#ญwๆ๙ŠQ>wS'n ค๓\{(9]ธํฑBโัฯธ\{ƒZG่ช/nh{ฌฅ‘#)??uึศ,Šน.ท _EYu…zณrญicไ$’๛$s>?สMo@๎<šU:๙#๔\ไ–mkรs&๑$ถAhฝ#ุ่z•ฃPษค-สว„Az แ๑บ@ํˆm4ัซ;๕Xกdข6‡ณฯ๐6‹ีtจํฟ RRG๘hคฉ4 \ย$กฐตน๎นewฤjOทาuƒ……ะq๓ฒ:ฯLอŸ7"A๘L<‘<ั† P๗,c/0ใcIš|P๖:yใลe 'Hqfึๅฟ1อฏœ˜U?VๆฦŸข฿€Ygฏะ<…๎Cจ็p8 Ÿจวe“๒ปkบ}>๗8t\nƒ7Pš–็ฮๆGผ65๒ใipc˜โC@ 5Žhc…{’ผž™Ÿrpfn9ฮp:9!tฅลบZ’CI๙lถ๗ ลoQuO$/๑9๐ตsถ;Leถv @ฺ๎้s*;d”Jec้%ฤ”D/m[’'Š\พูwห]๛ผ>’\n™ ™ฺ^๙ Šxโqd‰YNs#t5ฒ๖w”vย๙ˆ,ูฯ|ooแIs ‰Žv˜ุ็‹ไ๓dฺ๛.›ะz„ฟu‡›FŸฆฐๆ น๓|mรA%“ลฉฆBK| gvี๔=o๛-๋2|1wG0๕.— /ส1ฑถ##ฉฦ6G^-€i๗WMกwฮuบ},ง~^ฟใ๛Zธๅ”c๑=ฺh๘VFืm๊บhฎH์ฅ›แส’7Š{\Z@7ธP/ฒ\๏ฬk๋๓^สๅ ใu‘™ำzOE ศ+ๆ ๅ5Œ~Aๅ๚…5„jP^|ต\/ก๘ง๛Hว๋? ftะศฑcฬI—‘ใddM ิm๒’(‚Iา?tZ๙^ฃ“?Yฮrณr:ปCฑs h้--kื€๖ƒๆhงK| oษ_7๐ฯT“ฆuHr1ใkฒXZ่็–˜ฅk้๓ ็N†=Mๅg2๗ํ๕,ใฺ๘~ศ‡$c๕8“ฉคณ4๘zEท\`7ถี7}Cๆฝงbใeฟ๑oฉ rœ๒21โgํX็9ํ2&ธ-O๎๋ษ๘›2I3gžH ๋๐ๅcๆ|K†ุœ์ก&ฌv6g้‘ตคQ`๊;ถr๙ฎŸ๑N่9˜ู]<œœyY<ฯŠ66 #vจาIษ€< พ@นฮ9ฤึยสโณ๘๓๎๘.~ŸW๑๗วฝ{ใฌๆไu์–ฝฌ6ศanˆฺ}kนไYณ[]lพQuร pธอFmทš""าˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆƒfญi u ‹๏์ก คฤ˜jฟ๗บ{_บฬ*๗^‰„ฟ kpyซนฯ™ผ//,๐šAs@!คำ…‚oิX*dฺ™n/ iะณว ๖L\๙กŠ|gอ,M‘บhIธ!ฏฃEถ/{ฬœyqคำ%ธ$cญฎวฟ"ึปๅๆ3ฺฟXKต]ดœ“\๖ธ:7น„เ@ ฿ร่ฃ‹”"sIว‚gฒ่J ›EคV›ช@]3P0‡๘nอFอึ๛๐w!t–+6h2ปQq 9฿˜Ÿษ>ช3 [#cศlฑังฑ@๊6๎;sฒไฬื(‡๊กbอvบ๏Kึ๘~nŸDฏฯ้๘™qร{‘’่&’lฒ๗[4UP๔฿ŸS.ูฝ5Œ฿—ต™ั%๘แ9ฑ๚ค9gจ6œxฺ!•ฟ‚6],„๘๒Dwสะ ‹ฎ|ี!้K?งด=0ส็NXศi+t๙ซQ$St๒.…ฏ uณ๔yโ3btฌv\ฌยƒำ7*@^\I>ฃQ-jฯษdgฯ3%ŒฟD2<=ั7fุบ๛Yะlผ]K,ทW฿๏.๛ฦ^9ค•ฆ:๔ต&Dอt3bโ>‹Nถ๋sตืl4์ู๋}6มRปฉ~.c#suริ2žุฃ#‡›\#ฬยkส ๑้๙_7ฒถ"ๆศำา๐F—T’น๔ฎS]ืdฯWร๋ไ๊*#—ำณ๚›`l‘EFV˜t;U:2ฆ‹qxY>‹๚ืM๘็๛ฯ Œtl๑0{šัณžภัd~๏๊พk]ด๊ฒj‡ PVtdๅ;ซ่ก๋ฬ!ูo‚'็>o๏{uฦๆข Erํถ#gซำ0๐'ลฯvFV@~N4ฌ้ะยุAำqพษ PkE :…Pˆ_ณ๔nณะ๘คK๘žก—6C›‰•mลfnงJฆศฦp6s€fเ\๚๛ฦNษอแฌ9๒aณ๑>$peใecฐณ;™,kฅ9ฎฒGดc่๔–฿+ฦ;rฝ8้ท;ภˆŠ‚" """ """ """ """ """ ""-pอ†1ฒฬุ๏“&@$?K":ฌšไํฐ[›WO.VšN–๙็วŒ<“ฦุ฿uณœะHภพมgป๋Fžr๔:(‹ว•ู!ฌธi:ถ uv๕๎้ฏa'S7s Hp๏ฝญLkCtฐhe‘ูvวง|ึ.qย“U^็๓๎บ  $z^มX4ƒc~Gข๕^9mฯ]ฎwR๘แse6\5+๚/ชฃ„i็•หถTwถ‘w๊;.CทคEB22!‰ข?Iฦน๎ “Bษุไž็%์1า๙ฆk’šโ4—^—๎wณt@#ืe“–Œœฆห‹0๑"tื$Mp|๗Uโ[ˆ5T(J–,ชœ๗hk ๆณ๒ด“Mพhvํ๓Pขืิd…ฯhวtNฒJข-]vำพ๔AุH,v5U‹IvšาAฺN H> ฎ<2hฃŠFAกšดิmi6l๙š,๎;“]ฉMั8Fื›ะโ@pฌvฒ9๙Zใฒฅl’;[้X๗9ฤ—V ๚บซ+<Q3$Jpeน‘ส๓š๐X)ฬ๓0ท๒ธVฎ ^fTŽ“#)ฑbถV:Fkdmบ.-ฃจ49ฦˆ$vY˜๖๓"ฟ,Aปซ`‘‘ {๗jkา=ฦูโ๛[นฒาo–ธข]…ำห+ฒ\ฬน&ศ–W—K$$ธYอz๓.'mื๏ุOวqœัsพยร้ธ‘]›ำ0\[‘A๓จ๏ๆษ฿{<ฏ็เEู‹้> 9ร๘“ฅ‰Uฬ้พ †J|‘๘ฌ3Fึ๙s}-uex›^Ÿ[ฅfSŸทnW,rโทj}{ฅ|[ึฟพบf8ยy%kุ|ฯ’ˆำ+๏๒—[๕ส๑X๊y$E“3ฅ้pIข8K#๐ู!cƒCcชnฤŸ(ฟ<๙M†\–G+ดG'‘ฒ4 šญฌlH๎*๏ตŽsFOแู=ฒ„๑ซS7>ร}ทฺ–๑้๔๚2tตใมrห?ษช™"๑"2ศ์iœำ4Lตณi$‹ํbอ6ตoOฦวษสฯิ`ม‚‰2ฮ๊ะkK‰ชญท#uNTฬšHศ Gรkd>!p’MษwMํๅํ^๊.n“ZšใCv“Ge่๓๚r๐้—ล ึึวฆ0ฺŒWฯฟฉ๖I#าึ—ผXง๓ฑศ?:๖ต่Eา['O#.ฝา›ณๆ7vฝ-?’ลYwX|n;iป5`๗Sฅบ…–s^฿E๋ทจใŠŸ—ิz)ศd๙P—‡ษ&Cฬํภ š6[ทฅ~™๑ืฤั|)๑&4 ๔ญ‰ŸRbb!+าbˆ0ณฮึฬโK7ญภชวไL’!30w‹ษา๛ชญW`ูบญ—า๕ซิ8้˜7จG~gKƒม้๓1–w sฃา.{š65ห=]kมพŽ์๊kนวฃฅิิํท–ฏˆใ่N8zMภษย๊2ไ=™˜B'ณ‘วL|ก๒ๆ3ฤ฿qๅ.ขlQ๙Lž&'Aมฬ’|SXxcZen—bถ ้ศ4}ึ.ฅี๒1:ฯQ€เžŽ็> :k‹Ÿ๘o5บ6™-อ!โฮํ{3เถ™‰ิpบงLฮล™‡๖Ls[<ำฅอ’ ิ :ศ4 ‹ฅzใŽ8ไ๊smำฦลŽ7:ML–FฑฆG๘m๓ฑต๙&น ปฺesŒผJY๛vำ๋A&ศ#s}ฮ+฿>_Q]4๒–Fศ๑ฺโe$ำUd’}9๛ฃฑf้๎•ู t3๋tqJื‰ํหำZฑ#u๋฿>yrื8r{ŽหnT’68ฐๆ†ˆ_ำ.ีๆึแ๙จํ์ฉ>,๓ร#ถ6†ูใตจP"ฺ)ญศ๚ญฐๅู ุรp้ฆ’๛๖p9Uฮฦฎ’ภi]๐;ช:ๆ้|ฒ~”Gฒ๖้ัgGR=ํc5ษ&ˆK‰ ’ฑd“ฐช…X๐อ+ฺืถฬpถๅu๖๓lฺฯ{†lœ–ษq@มE9ฌysค=หต๛๔ธๅoRk?mษฮOด้k ‘บ6Cc9ฃฤp poๆyC€ุ›๑Cฉ1ๆL‘ูภ๑|iƒ^ื 5Nโฮ“ฝj'ž?'†1,OlŽ™†:scl~]>คE๖ t˜q:n_Q–W2นC|ฺa‹่็V‘D๐v_;๙_ฦ้แ;ทหีั๊ๅ•ึธe๘ใแพ›ึz†S$›6ฒ)›ˆมwฉ€“#ฬ(—QำMุ^ม|,์t-%ันญe xาlฅ~ำ๑‹ิq#วม่pโ?ฆฤ าวs๒ |ญsT[ๆyฑUuพี๙ฯ^tD1]นlษฐฑาFq๐@๏mh`บ;ุฝฏ๑:นฬd:ุใm|ร%cœC\I๙mKงaอดปง~%อณ๖Ž s˜\6?#ั#{พยaไย๒ษ_-ykท6ฺ4\เ€?๚^๙ึž+อpฟJ>ป๖D“ุ๙.:vSญ„8*ิŸฅฆ=ˆ fฏ(p๚–๛งถuQ‘Ž_-ีงrพxๆฝิF)อฐ๏ฒ‡œ•วKผHn๎yฯu›uหZXึ5๎ฆฑขlW๑P™†7ค€๙}:|,\\™ไวˆsb5า4X๖ƒmพืศf2‡iฮ๗์คสe8]YQp +ข„HX5ibมบ๘พๅgqฑฯฯjฏ๊ญxg€ว5ฤธ๊ฐชญ๘7~‹ซ๏.๊ธblLN—ะc้;ง1ธฒacH$lาบ๕ฟ]็kq ซกๆX^'Z่™# +.<|Wๆc cgŠ †6Ÿ ๙ง0N k{ำฐ xอ’X่#‚ My๖ly$ดถฌุ;]ทqฝ ,ฤ/๑4~xหN โWฐชใพืวu็รงูฉ<:\ทบชWrึ[Zสk@ ฒ ›5gิ•vเt@>%ฟฎm–ัi;]›ฑ๊ฑ\฿h%มฎqำ@l๗๖๗Sฦ๐ค‘ำ4B^๖Kจ‰KEด฿“wใLr๔บd? ฯ“ซtฉ๒ฑฆว{กiส?ํ7 84๊h!ย€ข@ฃฑX๓aฦfL๙83™pฅฑ‰dฅผด=ƒƒ@]X๗V๕ฆ๔Ÿ :>FKa<&FO=ณi:ร+–j ๏์ก<˜๘๐Iำ฿Š๖L้ ฯLฦ†อฯ•ตฝwKŸสmIŽฅ“$๘8์ธฯ“๖j!๒>ฮ’๒kQmะฝ…ญฤฏฺฟณฯŒเ๘oแฌ)ิฒ๐๚ืQ{!~NV$ำในฑ q4:Jw q ฏรฟๆ0หŒฦEnp.๑Žhvโฏ๒‘fˆwมฅ๎t๎งŽ#Wโ œŒ‰p1ฐe!ฬฒK#อ9Œ mูuPX๓#ฃ:˜้ำ ๛jํ^Wฤน™R๕>›ิฒง/+'ŽŽ'Jใพ๖ด’E;aFอ/“cu8 h๗&€[บ„ธ“ล ’63็sฮฺ‹ผฌg๚Cksฝ฿`1bI6<ณ@ Š!r8ะ฿นwย๖ใซXผื"˜ณ"็5’้4ฤถ๋๘•™คด‚าC†เŽส“Œรxž๙ดตŽV%@cโ๕)บณ'›9แ๒Lfผy_ฆํง`j๖Wdมำก้ฑ?2izƒ&"hD5 Š…9ปุ\กd|Ol,™ฎฑF๗เฟ†๛*d1๋„นŽtlp/h?›ึ`BีๆKฟ ฮŸRฯ่ำ8ศGBn'Se—’2dqบภคyy_.ดd‚ึตฎนYื-Ixo{๒""(ˆˆ ี้f|.•ิzkc‚H3C ษ\๘žวˆถ,$X;R๒€$ะŸe๊vM<฿รiศƒr.F้ Sฺ.ฎ๖ะ๐ณ–พศ๕พ#๊๘y?+าp|C&K“$Œ‰ฅ. ํ lbฯ&๖๕๐ษžู^๓XีeญำจํCุ้lฉศสvƒ@ั#u9ž$k(y›w~‹Xa1œ%ทjขAไ.+$ Ÿ๛HP ดAsh8ˆˆข" """ """ """ """ """ -:H๙ซIยห‹;ฝฝzw^ำุุภB๋ำรwuŒ๒ิะ}ซ•์‡ฝ&ส.ฅะl€ี%ห]A๎ฃพิฆBเnGMi7ฏข˜็่ฆl@ŽA]m๚จจทvƒศบฟuฅนs~ ˜ญ,5ๆM> ธŠิIฦํฺ•.A๎l)5ฟ&&๓ๅ฿UY"ฮรึ•Nป ๕]ไฉp@.ะ๕U—กฺ•‘C๎ฎมฤฺ่6วa@mw๙จ[vPMดH%ญ๕๋่ง฿ Œศ‚wC)˜’|RK‰7ๆ๎ฝ˜๓$#0รFีn ๎N!ยล“‰šึ‚jยใzz–O๖t™sต.ie |Z[$dGศ"œาข{‚l๖ปูN2ๆพ าk2ำำค;ด๚ƒ๖^VIยฬŠgAํcม|ƒข@ ้uhึ๔A๗_Nฉ’<1btฃ3gtMง6G1๎ด๋ ถฎV1๊_ \~ู~ ฌyฦ:FฦM.•ค=ศณ_BคŒ}-"fp+๔ฎVNญำฅ้๓Ž_ร=๎l2ฝ…บดš#ๆุัa^‰ีฌvGฌrฑษ?ด7เญ'ญf^‰“›”ึ:_หœZัn อE๓จ—ซ—ัูeœึฯา๑ฒๅสฦk๘]็ะ(ตลบ@ฬkI#cฐ^{ ‚~•ฌ 5ํDJฟ~^›)ห’8|@ษ#Zึฝแฌณต—8€>คu้7ะ“,‡.8‹^d`: -ึœj่ํVณฑ:ว)Œึูฒtำ†้2$X๑=มฯ"@@{ฦ‹-$š ;w5—ญGซeณฆe;ˆa๑qฃษ15๑S;xŽท ิ $’.ถฟ;ค ^Ÿ›ž yธmsๅวœฑ‡WŠว๓หxX^+~Sฒr๑ไว ร#!ถAขtuึฦผ—9Ÿ3รฟooWใ22บžKz”ั๊\—๛-#ส๚฿`๎y<•sบฮly_Œษ™ฮหิมS|hไak™'๎ธ;›<๑v ่ฬ5ู-œฮK™0๐9ฝn  ๗ญ;ยษัc^v4ฆ<˜Qฬ๗Hภ(‰ €ญ#Š’/฿|_ฆy๖๗qคlะลฮณ ๒ไ|ณ6|—1อu๊ิ๏)ีf่‹>ช:ซฑzŸT-ๅฬŽx฿-ตญนเYต]Oุ“T ืฏŠฬวK+๒2๓1ฆ–Xผ1,๚฿$NดํŽฤUธขv=จ้ฯ…นธรจJ่qCฺู qk%บมuถภw}ถด=rท/ฅณhtmย๖ถ=จ8†พไ~kฝ€We๙q‘‘Bึ9พ1v58sปฮ๏~หึ๐บ(ลc3:Sฦtฑ;&7ถhœ$}!อฏ( l ๖ข_๔ผ‘฿“™?ส€บ=.{ >}์ำ฿ำŽ็9–R.ฌ›x๘ู7 ตุ-๐kNฮ–ธ 7ภฑธญี3ไ:7ธษญpƒK›`ต‹Uฐ>๖[๚‡Q้r3*|.š์\ฃ ฎ“ฤh!€Hเ+pH(YฏŸqyปฬ)๒=ส3ปฬำ6้นาศ้%$นฤนฮu’O;ž๋awะณJsH&ปัๆธ$!ป€,Žjช—^c)šLวสZ๖พร+ส๎ืckฏJซ•–ศ#~>-๑œฦ1`าt ษ5ภ$๗๕^IigจYpต`O…+ศZหc>]ฦวr/ทuŒฅ๓Fร˜ŒฆRเึ๊ๆรoอฮ Kv /&๊sJศ!bˆฑ฿$‘†ใณUผ‚u8‚\lM/=ฺ|ฎธ=‹#๚ีƒมtaคผJI๓`๚=xzคฦ}๒oาฆะ†๊ธnpv๚~หAร•๑5วP`‘$:Žฺ}์ฝ'แfD์ฎ™/„์ฉŸsZcศ{ษ-sยะโ\u๐ เ๎)e‚๗ $<๋83H€u 7ฮภWe;กคzˆtแ™Zง”K~,า๙ƒๅๅิnษ;]๏d•SกŽLน™Ž% ผˆRะใๆQฟอว ๖฿์Kจฟแ>•ี:OV้น๘Rc ์ &๐ˆิ-ฺ i าksK๓.•L%ฝ{-๘Pพ$lย™K(ฐึ›u3{฿š๚.=?ไแิ—ฒ๏MeำธV๔…“ึๆ{qู๘\2+ๆาุ™I!ผ‹‹ ,‘q“ฆทโOŽO่Xy๓A1ำ‹ ๑C–๎šI %eห๘ซซหา1๚,}C5ฝ.fโ fฑGQ]๎าืิ๔่1๑ฟฒ^ฉิ™Žgส๊Y˜’ส5ใDศฤ๎h๎LŽ<› ้c<ณว›๗ฤ฿ื+$ฏ‚๊xS๔Žฃ—“แˆcsขHำ]ฺๆš ๚ฌaคูš๛+2ๆ92สAHiqv‘ุYะก๔U“|ฏL๑หฃ(bส้<ปร{&nฆดธชป‘d‹ฺ่๏K2"k‚"*ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆ N#ฑ]4‡C2˜d‹A•๎ฐ3PsicKu]นวี|fwNื&7๗~>KผXXtธj2<์K‚xฝ๎วeฎžvชhฒ}<•&1ฯxcนฦ€๕+ึwรฝc ผผฎ“—6ฌ(ฯ˜"s‰ฏˆฒQ๊วoUฯ›q๑Ÿ#ผc{ฅlm'fตฯ ฌ๎ทŽS+๘ณfผจษย†)šศฒ›ำ^\YDด ถ๘$*2 Š,xูตK&ข่๔@ฃw฿}ถช๗V1ฎ{UฅญีD๛ีošศใn%kFkภtธถ๙ฅั&วส)AJ2ะ๐^M๎.“zEร2m-kศ‘ญุ5+˜ึๆ9`Œใธklsฐ ๚|ฉaํKt=7:lo &ˆตฮ>žƒE›Šw์ แ7'•ึิOŽ่žๆ๊cภฝฺy฿ะ๎ช|ฦ๗Mำฮc:Y C\ใ@Hr~ๅYLš%tLฉ็aต๒,๛}R#;หKކ–Kตลํ`A‹ืbสhไ”D“xMŒฮฎlทญ๖+อžฦื8M จ€ืj'mวูM๓ฅgE๔ฯ๘โ6tŽด›งฆมsษ1ž!L4ฐ†๊ณaํเิขพtB๓##cuฝ๔ึD“ภฟฒฮ9ใŸ๚nึใg•hˆถ‚" """ """ """ """ ๔:YŒk๑๋Kะ"ไ๔Nอ‰Œcž็-kA&ฯ  ี๏ฮหำาฟŽœs๒เ฿jB๛จ์ฎย่ร…(’บj•ะŽš+ซฅD„ ูแๆะ ้แl ๓UTvฝิ(‘ฝฉ4ุโ’•ะซ. ั*๚๎ขๆ‚7 hW๎S\ า๋.ู๖Ew๊ƒNส ธ}‘8PpืuษŠ‘;ฃฝWิYป$๎v4พฟแพฉ๐ิ รา๚ฯO๊ํสลšIFWNษŒถGGฬoะcถiํ~ซๅ๓"tikZ\ืjพ๕\/0ืlK\=6!yzธ[vย๐๚žงแdyŽ9[ฎ‡ฤQ$‹ท๎ณ2'M"ŽฝฺXฺ๓๖ี}wม๙uาฐ2cgYฦำ7N๑‹แexยร๓Aฏcตฦจ๏mฏๆบพฝ+:^Ÿ—>;ดHว‡]๐C€เ]์-๔บฝึใ|ฯ๎ฟl็†นV“ˆษ‹kšE0‘`ŽFํ๛zJเpบฝศ\บ ƒGB๊ๆ๗บฃญk‹ผ.pฒW[๑๔Weพ'yX้ดX.3–’]@~aพJLว“ภ3ึF๓ZXฏถว‹ฺื“ิ๒cw‹ l?œQ&๊ฏeฯ,ฆ3mIjžฅ’้žศr-‡~ซ"๓[ปบํ8E]‰\ˆๆŒ›kƒช๊่฿๒_O?Y1รs %บผhไx ฦ๒ะ์Nอ{๚ซ3Y‚$–8sdš=คLa่$[ฮ€wm vบ\†&ฬ\็ด4๔(.ฒ๎๙a๕Cฏแ๔(๐บ#„ฑฮภ2#› ฑบV๙gจoแ๙[ฑ>jณฝ/ู‘Mิ™เ;งเ/|ฎ–แฝ๖dาๆ48Uด0 ช ํ‰+ฦcฃcoQำ…vK ~สูZำ+ไ ~๑›ไืถฺOฏ฿3ฅŽSส๗\ผฝ~ฉWBi‘๚›4ํอlN|mฎa:Uz˜เyขื_ycญf๕œถไ๕)฿‘3clM.แฌh ะษฒV ‰ฅศ”ห‘#ๅ๒๗›%V˜อs|ญญPgห๐ฝ๑:‹\cqi- ด‘‚;ƒHะ๗ท๑YU๘๚คsbof‚@+งwถt๔ๆฒดž|0มฌn,ƒm๗งืํˆ€ืัง Zแษ{# ปฦ‰ัฺ่๒Ž,l| XvY๑ฃl๙0ว$Œ…xkฅu้cvฤ ๖ญ๛f@8ถผฐ€๋mุ้‹฿์ซ็Kv|nˆxz$ sหfk@lทลŠ:Nใูclos ฺวด‹!ป โฯฝฒฮ7|ตVbถไฤฬน;œ๙Cu˜วrฝญึบL=72hq:œYQ œึD๖9อีM'P <รsฐxฌh5ฒy[จ๎@฿žฺ๋้๎dpOิ&2ตอบƒๆ์\[จqฟษs๊ๅqๆ5„—Šฏ-ธ๑G‚฿รลๅ‰”ุง.า*‰xฏฮใn๙Pฅง/๏Nธzwม#+:Ya€<:Yคง๊inฬuU๎Z7๙ช™‘ิฆ2ยฬXๅ๒dฝ๓=s “o๐ไ๎@/;;ชศs๒ไลšM3e‘ฅั™๎์บ๏^มrฺื฿๙^6๖zฯU๋ฃข3?ฌสึŒMฤ3๗F้I‘ฎ ฝCฤe‘!ป/˜น‘Jฦ=เ>ƒจ้]ั๗ฏฒ mย-แำํ‰rฺN ็ฝ๗\k‹ZๆƒๅuX๙!$€ ;.ตŽp% 9>‹ข"‹คh์Wใ‘๑GP<ŽA๙…ณ*ม1™ณxไ5ฌ,--"ืชชปฺภŠX=อ ฐ_๒ืะrคะศ๒'tRปฑ‘’8€‰4}ธตๆ"จ๚•Ÿ&>D9ัE8kœY‹Z๒จธ_˜นโฯืหศ.:94$‹iป฿›๎ณโอเNวน‚FๆAรำๆฝXr:\พ3็n\%ฐผBุว\คํจธ%X5g‚คn๔พxy๗๛ฑ4—;ส6ิM๐+ฑ๙*n"รN ;๚—ฝ๘ž“‡™Œืฦโ๑$ฌป'b6ต‡ xฌfG‹e๙แษ&œ‚@ฑยowƒZ1๔+ฬ6Tซ4‚ฒ)ฅˆ8E,‘‡Špcˆิ=้VŠ(w(ˆ€w็tD@ ค๗นไ› >@PQDะาศู6<๒ 7ENงIปฏjk{›฿ูfZzpู‘ณ/ฤ;Ž—๘nk]^ลs\ฌร…'"*ˆ€ˆˆˆ€ˆˆˆ€ˆˆ:ฺฟ5ืฒ4Yซํ—li#Hป็บ"" -ื8๒ทฮGษz—้บหƒ.;CC"xโฯอ€@๒ƒทช“คp+u฿ฅu‹–{ตขPIฟ++eบ๛ฎ‡ึๆซถ๋}ฬ๖ตฺ–ญ–P๛>ลYจ๘|{๐ตšาาํทแ5*šโ ด๏วxฃJ•Š ฑ-[๐Pฦ[œAs‰ ฒJ่"•ุ้(†๓{๎น~}ธไฉŽช‚AK‘}•Zท Zจฯืpด‰VษJแภn๗RีIฐQv้]…‘๘lฬ|€ุe0ผIขfฦํ&๔นงjˆ๎ ,ฺŽภ๏๒ lXTKป๖G ŸTุš‰ๆัถ]ฅ ธ“ฐฺๅุดํg‚j–ข\I%ฦษV;*sŒฬ7O'แD†Vรจ–ตไQpob@ื5บวโqdrณฏ-is€็ฒมžยfkš7{lืจZ|k&อ;`v๙ฉ$hพ–2ึSMOว”~๊1tฮซFToศรึั“ŒืiDV5ว}ญถ/ฒ๚.ปิเOชA๐๛žฮ‡!๐ d๐ดปม9ปบห]`›๛ —ศไใ˜ˆ|vYฯษ{xำห.&Ka:1&lz›Z๚ผป‘ฑูU๛ฎ8แ&[พ[ทsQปKšโ87GƒEY6Dะฯ,0M$XํšFฐ–ฦ “[ชู<กlV€ฺŽวป5๕ใถฟ/†ๆบ72 I‡ต^ฝืง,ต6ๅ&าฝ–y๓c‰๚ \๚  ~ซ™ฒป๒Sท?u˜’I$’Orนeี฿๚Z˜kหะ๋Y๐็fอ&1ฤลtŽ|pL†6“aบˆษyศ‹‹ ˆˆข" "" S_nญ!มฦภ??ำฒ๚l๙ๆ๐ŸƒLาaB bd€h๎ๅXฎ9<’~oฆ็dtึebHY+Zๆ]msK\7–ธช๔๚\F m†ผ7ุ๊ณn๚ี๛ฉ๖>แฮฌ:.h๊#*Lv82ˆฬฐนฺt˜wญ๎n๔ผผxฑ๒โŽS™nี ็vท‘f‡ }•Y~|—ผฦฯฺB3@6hปึ๋'Rัtaโษ# œhอ Hะ พ„W฿ัK„Ÿ”๓I•ผQ™ุ4A?M‘็ฉร&ฑ+ุืฐi"ฉฎ}M—,šWห+๙โ็9ฦห‰6IPEd็fฤDTFไ|ืญ วoฤxฎpa๐t9ฟโXข๋ๅตซ๎ฝึWˆล8<๏fวฏoีcฒฎˆอืภ+[:zพ3๐ใhstมฺ๔ท๒ˆ=์ภูOลุณ1ฯŽ&Hส-ธแฆจั<›; ๛•๖›ึฮ๊b,‰๑1ข“-ฟ„ {ตฦt“จธ— ชฉงrh/Šฮใ=œmโึื‘8yy์[4ุwฟEวฎ9ๅpฦ๏Mๅ’Zล—ld84ผ›๎ี}๘ๅS ๎Xdฯ‡SาZHิำนkซh)ป$xOŒF฿0ขhทฟตŸgIน žอป\ešฌ๘๐ท%๙˜RไโK$ฑนวL์ูีcDq์ฑˆตฆr๏ƒSŒ–‚?1ฟิ๊ณV๛,Iฅญ๖{{ฎ* D1รบ[กเzŸฒฮฝ฿†]ำคจbuG„ธฒบšiยV4บ6๏ถ—;cษ"ชŠ™e6Iพ,ฮ–๐ ฌ18ผพฟ%YชˆŠ""" "")้sctgCม sฃ\ืษAIฏ{E1๎h๖4ทA$sใส%™อ–(ผŒsKBํN๛m๎ผ๕(#\แ`"๊ำภตไ …Gช๖๑›าฒ๑2 ฏสfkw†(ใn‡ดMธ‘N๗ˆ๔^4 qาํM์}Bwwา(ดC…“6,ู0ย๙ †ผWฐ_†  ]่/k;^ฌ็nP‘ภ๗ฟ@m:๔ัๆKะย‘๐t๗๘Q>mQ>R๐uด้!กง๒ัmุฃๅkCตH็บp็Iกไ8๏ณ]cืzณ{$ExmษฮG,Zt9๎t€าN็พIูQ<ƒษ0’9ฺH|oaii๙ย๚NฏzูU‡งผ้'˜๙+H‘‘ซ๗šงj;juฃ cMง6,์œi!ำัถ_`Iุ†Cu8ฑฦ็šืำๅ+d^SJศว7ฅ?๑1ฑพc’^dpsผ๎iุ A€ พทแ…บ^v)“/ชทฅ๔™ lพ&`๑“6ล ฌ~mMkˆ=๗g>ฏdS_฿าฬ{ฎฃ๓VU~nซปR2ผ@`4ฏY‚๎ซšฟฅา๕:|ุxxูoส้‡"|ŒS Bๆ2 uด๘อ ๙ˆhช6-๖^C๏[ฎ๎๗พV็>c5ฤDZD@DDD@DDD@DDD@DDcผ€๖๊ :ฌYฃ^สรฮ๎ี๖YU๘ฏ–6=อcK€ึโ@h;Y _ ต+:^^$/ๅบˆq(]Ž๐Qqiบ\ี่ตํ‘พ Z#p8’f‹k?;ืCฯ;ฌีขผ=^Zจ๘๔VTฑn ฿อb?-,ะ_ชผ๚ชฎ๛WjฎVb๋q/$“ษ๎ธาtธถ€mbฯ๓๛+š]โ8งถ๊qฬ ;{,ฒ๗&ฌ{ฎ ˆ$|ำธำWt ้l)[ร>F1กค‡Mžร๋ฐ๖Y4๋}/๓;€ฏ–9๘1• ˜ะษsๆ;๖Œ. ศ็‚6ห\งyฺทU๗Qป€๚ฌฬpnเkฝ;ท๒u#พ๕ฑ5อnตซZใtH$mwํ์…๛nxU9ภ|‚ƒค จ๚ฺฺ4นำ๎ktŽqbม5สฯม7ฒoบ›ซจิ <Ÿ/๊ฎป'“[฿ e ƒjm•ฮ}…Y๙-L’โฺ๓ “5Ž1ฦ@s€ทลึŠเwU oษซณ{ฅศ˜ดษ%ฤw๚๎7wvบO–”wYทk"tยะmฆพ๛๚ซcqše˜m๊ฎ pxk ;qVไคฅ^ํ…:ˆฎ๛ฺจeษƒ’ัZๆ4ฑ๚$๓5ยรดš;ošฑ’35ป$1ฮฑ๙v+ycrœ3.ผผษค2ศ็ป“๖ฐP็Kึn4"ช6ุเ๎V€เ™าฟuฏ‘ใ$:G7KG๙ถ%Vาะ๏0.o 4ฝ.ค8แปyส๓<็mิkนทMYกCฐป\DYQDD@DD๋`N1ไ6(1YแสภาN‚Oœ๏ชฝซห์ผ•่t๑แ๊ ้[ƒ)๐rL{ธFํ‹€เ–์เฤดZฮ^6Gปซส:fgGุ้ั?ขcหฌไไภศง”‘ฅฌ2>จyตi”†หฯ๘“ซI…๐ว๗\-้๚:ƒฃ3xq‡Jมภjด9ฦ๊์้๔็8ศฮ•Wsแ8ทŒูๅ๐2hWp–ึแxฝg*Lาๆปรhิฦ7K‰3E็:^น<„D]˜uยจใฑฟuฤD‘47ไ๚*ี‘ฅเ’`๛l+ๆŠ๚^‹ืf่“t่b†I:t๒ไFฺู \็U็ต฿bW‹‘<2P@ งoˆ\๋TAฑไh-๑bN‚wใkLฮ2K4Žิ้ws‰ฎๆอvต€)7ฎVบW+ิงจํ^%Mดษีm‰j‹{“ล) œ@qWฝ่็่J-@jvิE ” [l.฿ŸM•ฐพแsiล~๔S&Fห‘ ‡Sbsๆ4ผป@'‹<๖DEuฮsƒCœHh  เ{." """ """ """ """ """ """ """ """ """ """ """ """ """ """ -e>g4ฬึšฐขx‹: ำ>FจฤP—2Eฬฝ‹‡฿๋๊Uqธ8ณW๏๊ชR๓oยDi|ฅ๑€ํDฐSlุhะ๛•่ม‹<MิรˆZใ‹,o‘ลฬึตzgถใ‘Jl%+ฆใ~‰ไ’HกSŸ0d>ฯ็ุ%ฝณd›บcส›ฦ˜ป๗Fอ๙*Q–๒์""(ˆˆˆ€ˆˆˆƒิ—ญๅ?งฟม5๘๏ƒnพ็Hฒ9ก{ู1ลม˜๔ว็๏ฦ9q?พX\๗ฆ•ๆฉว+ฃ z;๛,ษ“{๒žS@~ เuYชช6ฉ]{‹\๎JโาˆŠ""ำ‡4Qxขf=แฬฆivcsํW๚z*รctM-s„€Z†ิน4^kม๎ๆธKศ๔๘ผ0f อnฮ%ฮช฿“๙E ;’ผํโyl‘‘#I:มีุฏ{แโฬ™€^]šL'  o‰,ž&๚]`๊ฃฐปTฒ5๑uฑ๑$‘ๆ—HN’WtDX nเ4 ป{ Ÿu็Kงญฤ[จUU’H]:Œouะ*ชฦฏ่˜๎€D๑6ฐเ<ด,^๗๕แR็นๆโI๗[๒xJP9Žฉƒc฿๏ฝ}hW>ิข‹Q พPni_‰&Lบ!†I]Dมu๎}‚ื?œ)/‘’P{Hvš>jsN—๋ธกๅ4w›็Pyฮ|—ฤ5ัšูืษ=พKธ“œY™'ฬ้นZlžำ?บฑd ฌ13ฆld4i{ท ›4wVW’ท„ฎฯa์งO9ฬasX5:4=Oถใ๎บุฮ‹,โฎฦื๓Vๅ8>I]Myx—ฅ ž’hp,ฺึ“h—1Œ …า m@ใ@›;{Ž9UธOญ ญœ M#œึ0ih;^๚ฒฅhฬcฃ{[)y~†ปฬ €@กฟต{z*@นYE-"œuถภบ๕]q`Hh/ป/ณฐ๔คEึึ๖‡”DDQoeฤDCย.ตฅ๎ h%ฤะป/O•3๑‘`ไAŠแ+์Mนคื5tw\๊V_"หฮฦส—!ม๒2ๆ:แQœŽC@4*…UV ัโ2 mศศ…แๅณท๖/๗\o\ฦ—šI<›์งo<›๔แ$๎ธปษv…{๚z-ฒโๅ) อW8@ซ\<ฎ;ช๔N๋ฟUlฏ‰ัBุเน!๏ึIƒ]จmCัAO&‚–‚สแvๆ…บ/asCชฦ—Qไ}"นฏdฒksถภZ๋4`–ุฐ ;คmอท‹ž่6c 8๙K๒Œ„<3ค3ฮu๒H"€ุok$‘0’cญฆย“/]mT ีพ๊ศb๒™KE์j๕฿๓M}ีbxาโ—ฏ>FD์ล…๎ธq˜่โMลฤmฮไ๎‚ฬุใ“HkF็Yทz5e40ข๖๚Kล๊9ฃ๑‘aิ๓5ยCInฎKuP฿z$^ฏF:7นเh…๓ฅED@DDD@DDD@DDD@DDv)ˆNำ.-๏ŸC\{าฅ๓bฐ าFLฏ{แฉบ(แฺ์Wศฌตgs๗Rฤo‹ ˆฝŒป!ฯบบบุfจ{ฆb“C่ะ๛า\(:๕\oีJ ถ‰฿U7ฬšี‡>K>gฒ7ศCฦดนวไ$๛O6I็บ*G‹ซฎvแrฝQJ\*@Yซqย…Wจ ขแd|žฆฦXฦ’N&฿ฏu™ฬ:ซฑ๚…}ท–]/šWฌ๓;‚I๙-บZจำwี[io ๓ถๅpŠ'}ฯ่ต1ื”น-™ธา“ซฦk˜[ธญ&์ุฒ};*ƒช"mข†’เG#jฟใ\~ชนˆ๐Cš4P-.ขIบฏTฦ&ถอ,žmนฏฒฅ>hน[ทI4""Š""" """ ""dD@DDD@DDD@Aฮ่ˆ‹เ•Œ‚hฬv๗้ง๊ช‘]๏oฒ›4 โุ`w˜DzาสŒw0nโ}ฺำ_U`ๆL~๒Dู^Gˆา๏๕ ัไlซ{ ri{Oc\X"ว่ฝ,ณก˜ฬาึƒ+˜ํ‹ธฃม^ญ์sTฐ–škถำdl.ซOฎWํ6ว0ลtญ.3ไะ|เเ,XฟีVo฿t†3#ภkCท็mฝQ๎า๗488]{ฆ7\%sIโ hไ๚- aŒG$ฬ,€ผ็ƒฟจ‰์๑šfั`;M]wฏzSศt^aต4p8๖๙ซhu,ฟฦ็ไec€J๒แbšภOW a ะ%ญงWจู฿ถสฆ์ํึ‚Ln‰์ช8ฝ๙ิ“ERt™\S‘… ฝ*ีh:;ฎz)ymผR–=?TvƒZlš•๐นฐ*Npw$ซ<๒=ะด…cl๒vp กZ+Iถ†ํWkš/ƒIฃjัtดŽWEะ/ฑ(8ˆˆˆŠ""" "" ˆˆˆŠ""" """ """ """ """ """ """ """ """ """ )D๓x4ZAQDถi3ฯ –ถใm6ภใ็Bซฯst“F€์๎T๐ๆ .ŽW–ย๑พฺ€=~Ÿ%nP:๕บ๕ƒๆ'ีo}ณญ3ธiqฒโ“[d‚เ9—Qฑgถ๕H9ส'ี ฑลฏk›ณšA_ธิฤn,{ร|Œ#Qพ/เ €DBvTWyh฿บซงiu7kึซŠุrw์ฎ…ฬัโถฃ๒[mกื|^็๊~ชฐh;ƒจŽG่Tฦรmม๖k—ค^ส้6œRน“ล.ˆ฿งMตใS_Fรำoถษ+ษ˜ศ(โh ote yฏฐSl… ‹Nไ&?fับœ@งYญฯ>žeฃ!ยv‹ป8s้G~q๏eA“ซŒŠ47rkš๎w้K=Š:–4GŠ๘dq|ฑ—Hยอ!Žณฐ=มma_Q๑&^<"6%๓eษ˜๙\ำึทCFฤ ท&šุ/—\pป›ฎ–hDEคuทcIง^ฦ้}Oฤ9˜}_3 38าcI”้]ค9ำ(ฎyy wwฅ/•^๎6NoSƒ th3%Ši+pcฉ“#ร /m Vip/๊นๅ?)’หล4ั9 ํrม<ฎ4ˆ๚sย˜ƒฐ็•้๒ๆi}ีeปํยณฒWสฦึ‚!„ปKH?^๋ฌุ!Qะ,‹ซๅ!$ฐศไค๏}ซeมbFv49E\@ํ๖Re’pลชภ$ำ7>•บ›Aฐ({๛z•ญณฅoไื#s์ณฮวฺ๗6$4wฎh๑์ตสย pบ'r=~^‹6L’˜c‰าHbcœๆฐธ้ี8ะ๛.ys7œVdDXlDDDA  ฃศ๕\D@DDD@DD]&ฯ|—02™Ž๑ct{K)ฎาE๗แ}S ฯ—แฆuŒ^ทั็ยd†#sดLวP/ธ฿^ข่›ฅ๑+M๊Cฆ=้๙“ใ9ฎ.ศฒZZlp|คpH๎น๕1สฆต“ส=Sงๅtษ1ณฃ๐๒kร†—ด9งP$CUM‹‘Mšh$dr M{˜@p๖ำ3 ,ธg๐ำ๖๘N#ห+t‘eฎัุ‹์^ํrš4ฬา๗ภ๗ฟีAz1ล†)Zั#kKธก]ปQฐ[bะเ็Fsฎ…o๖[ฑ%D+#,kตJย๖Q[ึว่h)VA‡lGbน฿b‚@jvีWส๋\š]ฉมป m๓๛ฃkฅ„ห{ฆ‡^ยา7oU๚+#{ฟ-ฺฝt–ผQ:ชอmJŽ8ึัฎIุ]ะ\ฃฐฺต9วญ†ไ}๗ASFขh”๘ v๎ฃOก๊ะ,์ฌ‰jภbอฎ๘ํUWถๅธฒ(š{.’ะpป#ฝm่ˆˆภƒๆฎxRcษ#ิกmบ๖;’แ ‹h#ฌ3Nป’~ˆ%&ฉ็‡ d๊$๎Mq๔^ซศƒฅŒ์ม‰;${แ ŠF‰Z+ต้ @กWธ๐vU๔6t๙ฒ„=W4โD๗ฑขRืiฬ-๏า  เพ/"OCN.`ูถ+o—eว;{]1š›K7 ๅๅห?…!๎$E!Œๅh$ะT"+เuงKฎ+ ล•ญ'KyีzGญ าZZNฤ]๙฿ๆ„๑T๓RpgˆDv#&†ชฐ=๋บ‹ˆืg4l{"ํN;Užส"มดmขบJ๋Eี’EีŸ5YปเฉmDdŠ๐ƒตจํฟ}—vํอvVš—สdŒHฯ)HmUT7?ฎ•Xd‘Œw๒ษMšp)ใ’‘’ว9อขC‹uๅ J฿ไŽ ๒าAขF฿?Uโ๙ๆ|‡๓ศ จPุvคศ‰ฝแ์>g;P ,์จ•š›_ฏบดQ 'Hฑุ๗Qศญชษภยv(„Q#mฝ•ษฑ\q๊ะ#บ”Lึ๐ ืtEื . ๒(" ”œเแ๙@>กE`nกจ=๋š๖]|–KGkP\M‰=ฎeX m5ศ๕bข-™eรO7ฒAภ ์นKั{^ัž@ Yh…๎6ซพ{RŠ7ศoห๚-vฆุ‘_##c?7oฉ*…<,Iฒ9 €v<ฎพ๖ิ๎ง‰6Loแpl-pq`๎?60ซcŸไชDโลษษป ฅl,๑$๐˜\ุลปo(ณษ๕ฅAใ•๊fuG2NกJ7ฆf ๘mษ2kฎิึฝฦต๊6@๙/0€*มาบฉIฟฒ‘วM๏ย5อ;;สั{ั'‡ิฎHเแห๎ตj5^Ÿฮิhžฦฌ ํ์•b9ฆoOyZˆฎI๕vXึผ cˆ4†๏์l๙Eฮ๙jˆขˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ถแ0หษ๓\]สฤฝ(,แฤ=๑+}9บฦ\Gd5ฤ๚ซU‘พ๖ดGกUท icา7ธ]n,ํFž#ZAV†“๎„)ฅฺท7t๙๎งW{ะย,@ฎถโ้4m8๑\์)๒‡†b‰์Œ“+u‘L'S†CนT แจnํvœโ5V‘ฐฺ๖๖๔[1qไส•์ฤ‚Iห๙ึดธตฮ&ธ ๚ZอบๆŸแˆ9ม ด€ึ›กธฟ—ญ.ผๅs›rFย์๖มO^‡5ื๙H"ภ"Gc๕Uนฌ{Xโโ +ซTฑ\พ-ฤะูJช0o๔6๔TŸ#AuดฯฏษB\‡=šั6Iๅgz]mTš|G๘wขฮ›ๆป(ขฒkyบ 8X‘Pk\š Zผ/:ฑ`Y]eวKA฿j 9D†ฐฟJtึ™ุคƒ์ข„ูEอกDD@DDD@DDD@DDD@DDD@DDD@DDD@D\(;dซ ‹Y%ฤGu8!hq5พึ6^ฎ`„ f‡V9บŒูpธnZvฟuฉฺZฤqใs^6…ƒ{๖\‹Cรl๘ท@จ฿่ฝฌฟจu… ฟˆ—"8bŽ65๏{อ<ิ ษุšญป/>mPฤ์g2&‘!y--qโจ8m5น็Zๅ›แ\ฬl2ห_โ†’ะๆ์ฟษAฯB๙ซ$ธZฏไคt๘u฿ต5ป2(pฟ ,3Lว<ผƒ1`iขŠุึ ะ+w' 9y"Fšซhh^ห*๕ๆ6๖ปฤ#ศๆบ€6,โชศฤั9kภุ€hŽฤ]ูc,nึdล"F’ Š!m1Cl๙ป1'ตTP9ฒjx 8๙ญง_ร ็ฟยื—]^›๕ญีวy-๔๓&Œ2‹MƒูVถJศศvญZซษงน๗๖ๅcXสjต.เˆŠ(ˆˆˆ€ˆˆ:E..‚h€ใบโ ˆˆข.ตฅฮฆ‹(vไZ#ˆˆŠ"ฝ…@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDAงงนใ$5€`ด€.ว?ษocnมo›๕^n%":ฎ’๕คl‘ต,-cเืๅด๚X]บ^ณT๖๊q VณH<ภY-ไƒiy/"๗ rUc^๙ืท๖lทj5ฟ=Uฯƒ/ฒโ\K’ธwๅHŠหฎcš-ุ๐VZsH๒lI#z?e6žn;n +mล๖์ต@๙ ’5’0G ขๆ {‹h5์ช์vH4่4ี๚rขœ ซณฟ๔^–7ฉิ|ฒ3HชญˆตmAjHศวj†aงK๖qwˆEณFวz?E"ชฦ๎-ํวญ/ฆ‚7O#ฆ=?ภหสใฒ-qทQ-:˜สu†์tˆ6 †๘<)ญMhูบ<ฎภฑ฿ื๎้sIwํแnCฬล้๙ำ#†i$€F๙ู๘ฦฃฉ—`Qุ,ํูa‘‘2Ziธ๗ฉ\h้ํถ๕kN4R5.ล™‘น<~R9o๎ƒ@qfซE`โฯ”ๆฑฃAlv3มm†ž57gwŠฯ}›]<ฎตf˜&‰ัMC$k˜Xเ๎Mƒ฿z๚k๊ฆwๆพ|ณ์™ภžGไ’d{นs‰๊$บ๛‚ ศฆ>ผ)w๐|ผท็่ฒ $Fฤn—Wif๘{ yhุlำมฃ{ฎyค‘‘ฑถMฒW1หe„ฝต๎?สTˆไz};/O™รฺท#่นGp6Sิ\ึฐk๋ส้บซฏชhฺถ‡hอฅอ. sƒ|ขv›‚ตฤ]ดP๛จศํB€฿žB-dŽkหX๗5ิโN‘ฐณ่7๊ข.า(Tค :Hhฐ*ฌีnmX๎ฐำฒธmeฮ$๎Cท?5LžXฤ–šช๗บๆฝ ญปXTฮa;X฿ๆฑMEqsฌฎ".m ศ I^กVดใฐจ๎\ฎ>Kแฆ2Z๋ท˜vพUy“1sCใะ|ญ'Aƒ๓ ยCEผตฝ)zA$ป—_ฉ[อœU""ๆุฌlบฬุค0ฑมฎ4้i<{EJ)#f<์| |2BH1ั‡{ใuVงh-:I‹ุ•9DE@ํ๊˜ย๛ซพ฿uป ปfNH.จฺ๖ZเA๚…dทยoO<ใ@Zฒ8$qาั๎ฝž#cšะ#ิqตFˆ๔ุ+bA0tฐxŽถ9ๅ.<;ัปืขร^Y๎๔ชN’"a!ขษ๋ๆดโF%‘๓L‰„9๎๐์Yก‘5cx{ท+ฆ6)›Œ] dwไ๋xฐ)ฮไBซา๑ฑฤ๊1gtgษ‘ฆHฑๅ:Œo.#TopsK6INญใๅ๚ณ[แfๆ>b ™ ศ9XY3cๅG&จฑอ>บมOeWn–บ~~^cๅnน‡ฦถฝN๏ํว ’ื›3พHก{›แฺ๊'8๖ตฺoSEX“Kรš.kƒฺHง มฝืY7vอบเe‹ฌQŸE&44=๚Zโ7ฝAข๗47๗P๎cœึฟKkS€4/‹=ฎ—#๓>‹šŽ๎ุl U๓+{eณํว!ูx^,SBํ-—S.มํpณ…ํฑข หค5ดž#œฦ1ฮqclตบถm๓CตะS`v5พ๛ค๖•ฑ๎ธฟ3๔6‰'Iv๔ko}…๛ฉG๔ ฆœ6*่™ษึำUvw๗<ช'ฦาG‚Kถข o^ฃัoœบI]#ฝ*๖Qcแ๊ ิ(X๏|.wบษไขั’มMsZAฏ9ีvoŸo’ฮธ๋MˆˆŠ"""ฑ Jๆดl๗mนุŸไˆญMƒGฒโ(ˆˆ ฅฤี’hPพหˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆƒ_Mัใผผ8Aฉึ7>ีkะn €.sEV๕น็฿eๆเ •วะ-็ุฮิ)w้xrฯหฌ๓Jฦฬ๗ท“น vณ๖ตDญ0:H$c‚ฺ“ฆ์P4Ÿห๖พU’F่ฮ—ืPำfฎ๘๙ขฃึt ‰ฟ้Jศํฤ5ฮฐ๓ Z฿ŸztxFC9Ÿ๑?‡,ฺƒmŽu๎ภFรต’ตL31‘d;๐๐?S ฏW•ฺ›N5jํD๛,w_Kฆˆ<‘‰ใ{๔] “{‹ธ;๐vUษ“‹๛™45„ฏS€6โฎ}ถ์จy๑!—;Cูกอ_aฟ4ฃ”€ุ›#<รร4ๆ“ปn๎‰h฿๏อหV=‡:ะ้c9ฐM0ฤนx๓:ป!‹๛E๕ฺฦŸ u\ฬnฅั๚vC:ฦLN๐–]ั(:*๒‚๗1ฃฆ€mR๙/Žฑ[ty๔ุบlycฦf<Lศฃm4ษ5N&ศทืe๓+อ๑ใีณจ้qฏฆ๘gใฏˆพ‹.>…ิ#rใ๐งจ"ys}-ํ$sศฅโdgฯ‘42สๆยฦวFึ€ั์N็›ึVšp>†ืYำฦ[”œณปแื8ธ‰'‹&ืะDDD@DDD@DDD@DDD@DDD@DDM}@๖ํAืU์ฏซh.งทญpฑtใ๛g7อ[ \hŠ๔aw‹Ž^]u";5รWฒ฿%m•d ่่ไ๐>/ฤ™ฝX0ร฿‘แมๅd€—ิ{9มรV…ภZ๘ฬุ๚™toeKnห$่ิ l้ง}ˆุุฏ.=_—vKวทnื’< ๏ฒ„ิ#uš$l+•ง6LQ]ˆฬˆฆ๑wipsอ-ช5จปVซฝช—˜w6w+ฅษ™DYhZฑ7mAYT˜๗0M+ีKหkœๆ5ฺ]Fป๗์ฑHํO&์vRtฯwz๙*ีสํ$ะˆ‹-ˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆƒV๒ฝืฑฆาะAซฌธ'Zิำm]ฐ๐็—“[k:ฐN๔}QŽ {Ku4ptศ;๕ณ๗\pตซ1rฆล—ฦวpŽM/`u]1อ?Zq฿ท)R=•าœว Y ‚Y\!…ฏlขˆ%กฏu8ผ;Hณฑiwu ~ฏ>9๐bอ“6Ÿ4ฒ9๑ธVˆมp;š ๛P+๗Ÿ๙n~›:ดนuŒึดผgฮ้™P๘L™บษiํsฆฤPบ^sโล1eๅด>7~ฦ3 ชF—Tใม >ช‹lbดศโาแฎ†Žฺ"ฎd+๑๑฿+š์ผxtฤ้$—"Pะ+}ˆฤŸ(sg}ท“ถ%ๆฒ่๓ตฎ!ค๒]`๙๒๎ข(‹งjฅฏ& 'ž ฐ9ฤ8Sƒรn๔ี€w๗YlH#ืีk*^ใs๖Wษวฉผ๎๊6PฅhญlบHลจธzฅwL๙ถUž?UGw์ ถ|ภฑ5ีว—Kj5ศฎP=ม๚ƒ‰{[ณต๐=ถไWน\ํjGl>b๐ืษีfทqนX'ฌp๐ฉ„ $Uใึท€Z๊.sศเzฮสRผๆ‚ึปฑ}ฃ]ฏ๙,e6ิyจฅ+ Rพ7—5ลคตมรc[ฑแEslDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDŽฆcผ~!ขฺooท#unฏ3@€Fว๗…๚.bi1C 5ฎcIqm‚M๒I<๖ฺธR yว|‚7๘aม…๔t๊#fU‘ธูwวŒc•๒œSˆ$dบ%ฎฃขฮญ%ต์w&๛ึyำรoˆื$6@UวnyIdsฺภ๗ฝมฃH&ƒlš‚ษ5ฦ๋K๚nc:|AุำŒ,‰ S˜๗ดๆ‡UX๔ๅf๋{ญM๋Q•–ห#qZoิ๔ฎฤ–hˆZัฑi.‰ฏnใฬบ;w…ศ ‘๑j,บ›ุปต^xTศ+g‡าฉKซภชaญiบ๔ฒE-y.ศy|ๅฒ†ดดiกญบฐ๔ฒl›;จJวรไ‘…šฺืLงwi6ฑฟกUฐj-œ\hƒลo้5พWk%F_ศาข๙k>ฟU9แอฦฬdrลฆแกบIญล พb–๎น๑ฯ‡๔‡๘l!†+า๓จ—LโM™tIฝ—,ปฅโ55ฅฮศใล้0ไโๆEำ+FV;\!s!ฅวv o$ึ๋ฤDS{f‹v""ะ""" """ """ """ """ """ ”o1ฝฏo ฺ๔ฃ•ฒด=ท่Gข๒ี๘’ๅๆƒถ๚๖[ร-Vr›z:kqCูuรH‚wฐ=>jญDUุR.ํบ๏ท-$|BรZ(เjฯ>‹VKไ.4๓มน6h†๔kุ•‹ทงัsn๏พŸe†—in eาภํ๖โทฺท>ยัฺ]๘hš•อูนuปmฝ{}•O&G‹จ x๙/G ญปฃ๔ุ!wไฑะดOŒืษจ •ซkด๙Fๆต8ีั\๚™Y79k ท“ีฃฮฦxะส\ม#ผ'j .฿I5Dอ|ป,(‹ถ""" """ """ """ """ """ """ """ "" 1อLอภณVM Vภเ๓ึธไญฝn๐ฌๅฟช็w\sEl,มWปซ}ษWช้k ‡ฺเPา G(ƒeง๘l ๋๔๎ZVœผ‰3๓&สภห3ฬฆ5€ธ๎iญ ]์Sสพ‹ใ^ปืุใ8ไSOํYlŽลศฺcGˆํFตž@ส๙ง9บXำๆ`๑ ํฝภช๗ๆ๛.9ข”4๏บฮ9ำวท r๎ปซfษžv@ูๆšVม…{ห„lฒtถ๘Iก๊UqqQk”#nไำ5{h8rฌ}-q_่…ฦภž๋ฆุZ๓ๅญ๖๛}eขท4฿Zพหฎuื๓Pyฝ…ืฒUE–โj๎ฎ€ปจŠป.>ช\.%ขภ…อจแ šเ}ีธ™nลžดG+โ•ฒ .ƒ~mลธTdบXก#DกฺtึญDํทbฑ—†ฃฝ1ฝCฌefถฑฮKผgล5๎๚@ูญีd7ฐ oVผ๕ื็ธ‹›ฎ.RjiฑD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@D]cKB~ศ>ซกdณขอิขี&‡Šgะ`l“4ฝฌ›qกvzึสงฦศ~gTผ๙ฯ้ลฏฦŠdบฟ+ฟxv"ฝี1น‘@ุZ#$5ฒJ๐ะKœ@-ี`wพซ%ว็ฑ๎qpง1ีคYฝช๛ีRึ.ษป๖ฦZ๎J,gไแ€๗9ม‡TŽฝ์4s่ฌ๑šcv‡ต๎s‹๒็๗ิPฝ ข7๛)ดธด’EGU‰ฏฟธ฿๎ทgฒ7tัr |ณอ‹‘ฅ๙ eพ0ฒะ*ศ@๙.๕ข๗uL‰งฮ#อf—gฒiFศq8‡yทXtบ5้ทฟะฏsแžญำ๚ห2๚฿J‡ฌเฝŽnF.D…ฆ@แๆ!รvพ่‡v?5ฯ)gๅ9jzx’†พw๘Qฦฦ๔ฑฤทŽลUv\๋qี฿ž็๔^ฏฤ๛๊Iz>6k:[œืˆ3%kฆป›ญปุฟช๓3ฒฐŸ‘์yโ‡Y๐Y$็EŸฬ@ีqฒณ=Hจ ‡c๑cst๖ปv=ภXWI$’y+Š^nึˆขˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€บะ €qา/sWKˆƒึt.k5ฝ๐€d,-ิ/cบจEnMp*9]c?5˜Œฮส›%ธ‘6 ๅc†4๖h๔เo๊VfไHืS‡ck๎นfใหQ,็๗Fฎดธอsๆi-ฐแฎ๛,MšFนฎ$ท[fFnVL0C‘“4ฐภ!๏%ฑ‡N 6ษ$ืt๙/ฃตฃ"fE? _#ฆhใkฝม฿์ผ๛DY๛QDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@^ฬ]Jf6ฮ—แcถ–sž|bth ฬฯ—‚wํทŒคBš—ส6cฒ‹›ต‹ๆฝU7iฝ]๏ขฌ’y+งrvดธใeวd‘ณGิฌ๖}}น\Sปัฅง"S๛฿ขญฤธ‰'qซงZโ฿สi]ฦ้็eB$บ,o์ฺฏิเZA๙8Xหหภn๕VI0”‘’3uF1‹K|07ึ^9&ด้ฏ{[๏ำ=ฎ๘›ะก;ทฮิ ๔ y.ฤ‹๙Wj[:rF–๎wQ์kt/บื,nๆ-แูKฅ›ว8~อ–โvh6~UสีึฑY‚Zยษq๒dีโแฬ฿>8$๏gsDsvจ™ฐฦ x•’นอ<5ฆโ6Aiฝ‰qธ๗Q๋]S3ญuLžกิ๒&ศหฺŸ$าพWq@jy. ฒvqสfผ7<1""(ˆˆˆ€ˆˆƒ๘Sshw-;Z"ˆŠ""" """ """ """ """ """ """ """ """ """ """ ""๔0_Œ XYโ™[cฦฦŽร ‘ฎ!ฆมิ)ยต_ก;.๖๑ร–™wํ€ไžๆ~JOัฎฺา@Pu๏\๛vตQํทui5ธp.ฟเ]†๖ทC<7๋b^\ํพ๖์ซษศ{Y@e5ฅ ่G}M็uGโfึฌุใบอญHูosฟ;ืะ.w;ว]๗ฎึ{)7zฑk]c7ฯQ'’jฐX๊!}’โว^S{‹ 2=ฮw$ห9pธ{žโ\l•EอกDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDa]m๊-Y'‡ i฿py๔๛*ฬฒผ-n๐ตjั~[ชบ๕๗DADDD@Ed0บgShz“ยีQลeอ๑}€๚wZ˜ฺ–้D1wpio{<๛ึJศ รcๅั–ju$Ÿฬ๖5ถ๗ษV–ฐNำesูกฏq#Aฐu6ปะ#Rฑฌๅซมs‹ŸัqDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DD]ึ๘"๐ขcค#๖œ +L/&ท๎ฝ`FKต๊เ๒๒]zxน็Y_˜๎ฟเ‚ฟย&=B2vขๆš๎6ฏ*ฃ๙Q*ACญX›b™ฎ๑KHkธUZพi๕‚6>ช…ฦ๋้า:ฦน๏kcis@kZ,“่™,1N๘‰kŒdฒฺl=u, y2๓!‚5ฒ=ภ9แพๅฤ€ๆษL์c‰—4ู#X๒ึศอ €ๆžเี‚ณนฝ.ธPˆŠ‚" """ """ """ """ """ """ """ """ """ """ """ """ """ "ถ6ฏ Yhฒ;ชาำG•u๖Ž""Š""" """ """ """ """ """ """ """ """ """ พ9Fอ>@ึ‘`^๕๘R~EูขI,ศฎ๊hDEDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDAd.าyำ๊oทข๔ผFพ(|ฎ ‚)ด๋ylqcญค‹kธ[ฑศ–3อ:ฎ‡๐]pฟLe>{ชฦ๛VSฅaะเๆ4‹ฺ$๊r[ะ็๛บhฑ]ท๕พส!™…Œ-๙E€+ัLญ$dศ ทbต๔ผฦเf ƒs–ตแฌ“๒‡Gz&ู๋d\ทvฺ~#๔้ิt๗ƒ๓๕๚ฉฦ œร#œZา ฝวHไQ๗ฏ๙ูy่ต฿|'l[,sถ`ฟชฉet""(ˆˆˆ€ˆˆˆ€ญŠy#ฉุํฺ~ŠคM๋ย:kฐฅฤDD@Eา*—DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDศˆˆ""(ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆบ \D@BˆŠ""""บI๔๏พส~iGตพรฬPVŠNำuqแsQชc| โ" )5Žu้i? ขˆส.’ธ€ˆˆข" ๗D@DDADD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDDYงPีz{า4€wvจำถGำG•9‹Kมo;U*ะ<ํย"ั$“F้5ƒน๏์’฿ ฝygWใAใ๊๓†้ๅ'๘-˜ุOkŽฟ(:๗'ไ{-ัC ˆฺ๒W\:V๙c,๕แ็7ง=ฺ5ั^byฟ`ญ“š๓พ๎ ๔ูo^t’พrู๖-ุ4pณวœŒใnUd™1˜เƒฦ๛0Wะ๒จ–gสnG—’ฉ•ฎ’hDE•DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDDDI‘พK๐ุ็W:Eาฒ wฬ\ึึกุ์ฌ›๐[ฅ(ฝnžŸฤkขธ๙ญCำ'ๆโบN–V3s‘โ"๖ŸŽๆšii์AXฅ้๒ดŸ9ใิะjeาส9X‘Z์yšH1?okUAฃฑXีiฤ]"น|ื6๕QDDแ๊€‹ะลว‹* oอจ7๛ฉuŠ๛WIาส๓นษๅๆข๖ำ`˜ศ๏ญ*ฒ:mqCธ{ฟš^–ZฺLๆb/Aฝ1ฟ+๖ฉ˜โI33่างลŸฅ๏ว#{๏Cเ9 M(V๕{ุ hห๒๋6OฉK Reฎ#น]> ฆ~Iทฯ•ะ บึๆ—ะG Q‡[|ํส2(ใqtlk\{I:ู๒วฯ"๚ ˆ#ศf™œ9 บXษพํYฝง…I๖๓ooM—Q์ ์yตฎ<ะา๓’T,ชไxจฝฉp`‘ดึxfถ-*‡tฯ'–kwธู[ัสx'R<ฤZวOศฟสั’ทhๅkุœ-qูft๒๔ฝำฯE้ษำFฐcw—ปIข>EXzl'‡ศ> ซ๐ไ๑ไ"๔'้ฎhธ_ฏ$Q‰‚ ˆ‡†Fไ;q๖Sใหzั฿<ผ๔^ม้ฐv2ฟูN8ก‘ฒFdoซ–“ไฑ6RH^ๆธ›<ฉwK7ๅ˜WปVoK%๏ลๆขzdืณใ#ๆB๗~E‘ฅปwิ7Sใหา๗Olhต €&MWผณฝก-.iฎํ6lณสห/„QEIฺjฺOศฎ9ฎmji,Xญ‘DDQu ธำA?!j^ŸไฅOย“oูฟ~<งu$8G  โ่ซฎ—'?Vภ4@md๛ะแrา๋ph “ภ~โ”wบญใp%๚ˆ"ถuoโ)อทxkจํ๖WFโำQ9ฤ‹๏`zาฎ™ง๗ต})mสษlิ o 6๖ูckAีฉมด, ็ุ-Y%ิIปไHYฌF๒ฮoIฅ(เ–GSXโj๊–œผ›cฦฆ‡‹ง๔๎ฝaโiฃ@=๊้o—t9gฺ๒ฟป Ÿบชรhชกวศ”–คฦx.ช?%ํ'ฏบ้z81๒T"admkจน๕SD]ผ0//จ;บQฅ็ m}ญzƒผธฬY20›๏ึ๗\zึศ฿NnฉDEๅw ธำA'ูEงY๎†;ธศบdm7+หว V๑้ๅ—ˆ—9R/`๔์rnคะ9L`ใ๚W๓q[๘2gไ_‹Žr\ๆตมด/~ฌ‹฿8๐^ ๚…??(ฟ๔ั> ์๙:œ๐พˆ1ฌ`๙4.ตญiญh#`C@*ณๅฅ_‚{O–พjั}'{กjŠ'4QŸ›Bฯม๛_—๔๙ไ^๓ฑq฿Zกf‚ฟ‚›b‰ฆm>กก> ์๙#็†ๆ†%ช< ‡€K]ธา๖†ื[_ข-N„๛ฉzท้ใG…!œG#^ัt^c๎ญ—ฆผY‰มโธ;๊"ืรŽดŸ%x'qฬ2๊ฅ‹Œ์‡$…๎Z …๖Y๘&ืๅฌQ๔ุ[Z๗ž‚ฝ˜ฐ0a`>๛r.ณ gˆลสะmภไั™-vฯฉ\D$žMจ0hใ?6‚คˆ !ˆG๖…ŠN˜ &9tŽมยU่"ฮXc—–ฆVxx“แM.-o๙šmpaไi๐GU๎ ธEฯเžฺ๙+หฦ้ฮ.ผ€Z฿@แenf.;?,,๚๏UศทOYนฺเศˆถศˆˆˆŠ"" ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€ˆˆˆ€6แWเลd๘1_ปฑ[]ฑvมi>๋‡ฆC{>@=6+r,|x๚^˜$้‘–อ๏kฟีธ*๎ูฟอzศณz8ี๙2xมศhฟว๚Mฌ๎ค‡์Wัชศfp25p~VoCีju=พ}ด wt๛5ีk‡งcAŸ๛.M|‘ใ"๔ๅ้ƒ”ฟGๆณปงไ ฆƒCเณzyOฆฆrฒ"qส,4""" """ """ "")ฒ)$ศแ๊ึ’ปเMuเษ๖”Ehฎ8™ ส๖๔๙œ6tcึษ๚+1ท่๎ŒHฝำfƒiRgLภพ]B๗ตk~™๏วฬE๎œLzฏฟฏ๕]f, ญ13ๆEฏ‚๛O’<Cท;/กF ˆฃะ)ถZ๘?i๒Ÿ<ศไไ๎้i*ึad?ˆœ>{/t’y$ฎ+:๎งห^`้nะ •ก•c๎ซ=6qมŒไฝtZ๘qO“'Šp2AN ' ัwำu๎"Ÿ>ฯ–ผ‹˜dี‹;.‰๔}ฏy>J|ฺ•๓ฅห>`ญ๘ROถ9œีฟ๛/nฯฉU๘Q๋ิะ๎l ):๙ุ๖8ตอ ƒEtะแ๗฿…๔@‘มฅLธ๐สํRณ[ฝK๕R๔=UOj0ฒX๖–E’76๖ถMึ>๋+p l์kฑN๕ZW\&Rr็•—มgีU,J๐้YฌBiZ‹VKๅ' ‚ฦแoU&โใดP…ŸQล\Švใ่๖ฅุะ–‘แF,rฆล^Y$i๕ๅmDธc~–eczt yŒŽ>ถvมุศ?๒eฑ๘๑๔wๅํ„๔ศจ้’K๗]$Lakฃi>ทkB$ร๔wZศŸŽู๋ใไํ‚ไX")ƒู#จp๕[>ziY7แ-า„^œ}0$…ฎ<€ฏช 1Q_7gŸบ้G+็†/RGˆฬi@lO฿ีดฝ<~ŸsTŽ#px%ฑlz8โล๊Zกธ˜ํ6ุY~๖Šัd Eฤ]$“ร์DEPDDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@P|ฑว๙ไk{ั+>fP€†yญยํตc๎ผนๅtฎ๒8vึlฎ9๕fถฌ๋oŠ๔‘O‡ไษๅvKž:๕ฒธzdŸ๚•๋"|8ฏษ^t]0Uฬ๓~Œใ๎ด7๐ฏธญ(ต:xฯฆny_ดcc"ฒkYhฅ$EถDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@\7{บˆ3ไโว<ึูภ“_E•ฝ4‡้แ|EฏI/OwcS+8dwO€›๓ทุ—ำฑว>#ฟ๒ฅฑใวั฿—ถ3ำ`<@%ำ#ํ+วฬทข|xz;๒๖๓]ำ๎อ๗jฅ; šืPๅ์"อ่ใZJ""๊ๆ"}," """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ ""ูManimCommunity-manim-1157b74/example_scenes/assets/1280px-Whole_world_-_land_and_oceans.jpg000066400000000000000000003302571515024150700316550ustar00rootroot00000000000000ุเJFIFHHWFile source: http://commons.wikimedia.org/wiki/File:Whole_world_-_land_and_oceans.jpgC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((ภ€"ฤ ฤT!1AQa"q2‘ก#BRฑมัแ๐3br‚๑$CSc’ข4sฒยา%t“ร5FTVuƒ„•คณฤฤ4!1AQa"q๐2‘กฑมัแ๑#B3RCฺ ?๙ข”ฅzๅ)JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJUัซK4qFฅๅ‘‚ชจษbx€ถ•2|-โk%ฯ์XFHy…œŒˆGPฬ๋S๛=“_ผ[M?ล๛ษŒษๅ™็lrฑ?>*ฎq]มฤRฝ๊ฯ›ต-ร]xงJ†sศTถ™ฏsฝถNjWKg ฦึ/Wโuk™ฒS๎—q!ฒ๙‘ฑsŸ–3Yผ๐|แUž€ืำ—์็แนU›N๑.ฃl…C+\y(๎฿ŸฮŸย›ำ๙ำ˜W่•ฎ•งคjฟณํ†TธDฯๅ๚`Vต—i#7ร จ@@aดดฺ;`๏*G<๗้๔จ๛Wฐฃ๓r2tศ๕๗}฿‡ตัiฟ์ำ ];_Iฏ้w)ทพ‚๊''ฎ1’;r^”๛D ฃๅ@๊@๙ี7ฏ๓ฏ0ฏฏ๔฿๖{ถัฏฎ/Q๔อ`อ7าZฒwtr2>]Ox?มบญพญต๏† ำlU7:ฺ๒3ดๅPLฝO;=MQ๊aGฤ>b:urlก1nTœซ๔†o M0<ฒฅด.ฒP&รŒ;J=นˆญxผง,’,กgตษJฒU‘Uน๎ ๑๕ฏฺฝ…ž๑่zผˆ๏“จบF–าBฝรม๖ฉAเรแ–—?{_ข‘Enn„ŽคUา vษ8ว@ WํR๔&ฮก๖ใBป‡ƒI–Mี?๐Œ๑/โ็๏k๏ํR6ถ‚3›จ๊?ผ #‚์:ฬd•Fิ๓าขัตdตฏ…c  ํkอE@็ฎ ซ‘ภ๔งฺe่E\xSฤVา,w>ึa‘‰$ฐ•I#ฏkF๏Lิ,—uๅ…ๅบ๕ฬถ๎ƒ๕๚ŸI=แเqัตY[o๋T}ํฃMmuแ2lฎ6ค—3#vม?t+๚ิญDฝŸCโ$—5\J๛U๐ฯ‰๕๗Š็์‹B„งwซช.ล\Dื ็ž2kˆ๛P๛<ัผ5ฅฯ"่ ƒU*+ิoไบœž1J๊IฯN1๋ŽตคsงรB)^‘c๖9ใ ญjO k0M$\6ฟt^A่[t‚D์˜๕jข}‰ ฝๅฝฒ๘rp๓d๎i$c?ฦ๙ฺ:๔šืฬฉyล+ำ˜|rส๊B…ฎ&$~Qbฃu๖}๑FƒjnuMgยฐ[ห6 ะ('ฑ2 ช๙ะ๕x๕+{YำŸJิ$ด–ๆฦๅ“Vส้."a์๊q๔๋Z5ขwส”ฅHฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R„ิ๓5MหŒ๎\zๆ€ญ*คชฤญคŽp{ี:u ญ‹ป๖+cisrภช‘ Lุ,p3ฦ{Tิžีํ•_SK}:'RQฎf1‘ตw๓ ‹Hํ+f๊ฮh.n! e๒_cœิZิญปอ:๚สฺ ‹+ปkyฦ่ešDzซ๚V  ๔ O ฅ*@ฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JกeHZดฉญ7รต๓€-…ฒfKถจพ$|ฎชOฒปต‰ฺ?xzw@ฎัม๗–`„ใw0Œ็ฎ:ฦzŒPโRDจทัwB@๊@๙š๋Yแ‹ \X์ีbีWV๛ฒภั <€๊วฝ5'mจ๘gJ๑w๗>ิ4ป‰ก{{]N๒U“rห็DvŒว^xaศ3ชIJ<ฆCUร<์ศƒซฏะๆชฌ|$‘ฏ ฌพูผ-ฃAi ใ2่ ,๒@ใ๘‚ฌใตyoŒ๕xศฟ‰uK —ำใฬIrถแQ9๘œXไŒฑฯ'Ž8คr7ีPฃ'5i฿ež+ิLBา &F˜1‰FณhZLNะ$9ภ#>๋Œถ๒~๓บYZ฿x๓D฿i Œ๋บถฟฟา๔นใ๐.ฑ5๖™ yฮณhŠ.-KN.@?…วJ™ษฎ"‹ณX\ฯฯ‡5๐(iิ๒0่JŸก5ฅ&,~#ดึ‘๒%ต’4ยt?ป‘>"@|ชzด฿\N’^jบ๕ุ8‡๗ชมr1๘7ห{ๆฆ5๘ŽOษˆ|ืvNกโๆๆ5#๘_(UTไŽW๔วjห~T๊IWณ&‘็s-ผwo4PMฆ,วa”yl๑็€ฬน H๋Œืป}œ}งx;Gั ึ๖บฤSท[๏†wG`ฤ`‰H้€:ืŸ๘Sลž.๐๒[่คํงa‚้ทฒ5šฐc’ฝK‚Oญzฃเ๋T>@& mคึw อœ–ฮวœืืŠฯ4ิ—ฉ์$z‡ฺ๖œ๐ร1ฒึnา`$ฒณ”ฃ’=\.GLvจอWO๛<๑=ฬžฅเ=oฮ”็๏ะ้ำฺ‡ั™ก*X78'š๙ื^ะGเ๑ht;ลฺW™—qs"žˆ้ืš’ฐ๑ฺ5ํŸ์‰5/คŒvGe˜ฦIY่?SŸJลใ•n„ธo๔'ๆzฆฅก_๘Rฦ๖็Kึ$:Uำeบ”ศึ$ฑผฅƒv๘\xษฎ[รzพทฅjบƒท‰พ๔[•ํ–็ฬเŸก“เ‚1ุq\อ†‰๖›โGถ76zค๖Ž’ฤ’Laต•ใ\†Ui?—žLbฝ G๛4๑\ถv๚†” ™Bบ[[[‹w ำxLn$J“œ็&ฐหๆAึ๎ฟ๑eฃฯb.๏ฦ—๗๖ะ<^&๑5ผป๓$C‘œ‚ฑยž`วXฯฝuxŠ_ฝ$ 6ฅz—€HฆำฤŽณ;tํ\{ฎ๎8ไีบพ›โhL‹ไi๚cK—žIoaปd๎<‚@œŒqภญ฿ณญ6็รšี•ร[K}r‹,wo,‰ J‡คชN=1๑uใ๏™5*ฟฏศต&ฌ๊์ผ9ข„‚๗[๐ลฺ][บmGPนฝ™, ฿‚}ˆ๚Vฤพ+ะ๔๙ิXi—[ซฝฝปศฑ<๗อN๊Zต[\ถƒชIjX, n๏'ร–ม๙็W†}ญ}ฐ๘Ÿยพ!K M๎pOn'Xตrพj†้m.ี–๕ฎศยsแ3&ฯCบ๛[ถฑŠYืIิmํa-ฟ6ŠXŽ๚ใ ฯงฏ ชดฎž%eeจศงŸ:Mธ_m„Žz๓ป้^โฏด_๘žกิตผxอจ1+ๆlฑ๙š‡๐ฮชš6ฏไึVฑŽ;๋cp‡สZ:f“rๅ‘l๕ฝcก|Iss๘Zึ+PจC4 ™ป๐น `ตศkhบด๖ืšำ๘Š๖ลdkw’Kh&Pza …๎:Wyแด%ี ™SB๛;ฒŠ;ข’wำšp? E,yๆศ๔ฏN๐ฌ๗‹๘.เบ๎2~ูท–F“*วoฟdๆเ้A~wkป<วภw๓j‹†>ฤดซ‹—9n/n`ธ9็Nไs่+๊ฟQดธY†ฮฺ่จ-ฎJEวแษX้‘€}sžืัlร2๑•„rIŽF็ –<žI51wญcq,iq3ลŽ<ฆฐฯ^2ง’ฃณช]-ƒศ|›+„e๏cย™๘Š`๎ภ็๕ลxฯ‹>าSA๑าพใyชY\ป-คšDํ žT?†`ญฦI=QQ฿kšถ‹โ้Pึ4๛ญYmะIๅลปqo(ณHpX นBฑWฃ$ธ@R”ซJR€R” ฅ()JsHณŽR‚ฺkคณŠC‡น‘า!ฬดw WญY}ƒ_kV๘Sฤšvฑ€SI™K๐@=$ฯ+ว`šX%Y`’Hฅ_ย๑ฑV"*oD๑Ÿ‰t)Dš>ปจYžฅ#”๙lzไก๘OิVY#‘ฟ‘อNญ๖?โ=3F{ป$ฦ3bqๆว ;I<#ืูi?`ึzฮŒ—๚/ˆ๏๎็๒มkYtƒูTviž2ฉอszfฝฃxย๕5๘ฅดํTm%Wซฐ่Wสย ใำฉ้ฝf{ ์๗ร๘˜x’}And ztธk™็๑;tฉž+ๅฬ1hๅฌพษ4฿กท๑„(ำY™ดํFmา๑คญบ็ ’Gฅr^:๛X๑GŠ/ejฺ…Ž–ฌ6ะอๅ™เHSˆ๕ลg๐ฺO“!‡k8“n;€9๏Rš‡ฺฮž๖ะXK …œ-ฯํkฏ0F์IF ศฌ9=@ีๅ๔จ๒ใv,๎ผ9๖‘จxZึ<;eฅภ!fรiฐI#‚I๘ไฦ๒Fp9เqQ๚Eฏ[๋wo๕พแZูAPว$ฉ†้Y5สี7/๓/ๆ)ฒ=Aี๋_h~0ึญคถิ‚ษQV&–pB*Ž:.X๗<ต|ศx8ศ?*ฌqผŽฉ3ปPI'ๅYOŸPtKใ๋]Bั๘ม7ฐศฃ๏0-ไl6๓ฦื9เs๙W–ษ๖Iแฏด]zIดoตผ‘ilฦŸkฟf๎ชะ•Rน8๎8๏_>iปฝถธธษC%๋'ัT๒ว‚g”s$ฌA็ฆ_j็?รวŠˆ๐?‰ฟ๐ลกฉ้šึฅข^ฑฬ–ถ‚ๆ@9T•šE๘Aใก๕็ฅz›เo ้4k–ฒQขย8ืจฺQฦs‘ษ$ใ๋Ÿ<๛Oธาป๗MรึZH„๒ษ)eF0ฌฤ=G$U:lธฒIยO็ข'•ณฆา~๕{-N=Z}Aธึ•'พXžๅˆ%]c!\q@๓ศลwพ๛w๐๎Ÿฅห.ฅd๚=๓ศV[M*ฬตป.r“h<œŒ^แฝHิl&ž๓ฤVš„O๛ฝ>๎)9ะฆ`@\๓ภๆฝGรฺ~.œาKกh>c7๛ุKc*_ฟจ9[U—M?ฏŸ_ภฌbู_ฺฎ๖ขZYYฺ฿ฺฺN—SM/—k*rWb,๎ GŽ8ลf๛,ณ๛<ณŽ+๗๑ๆฏฅ $ถ"f‚อ’cvย–ฐฺ28=+/ˆYmOผั๔“ง€#}๚l{เ 1ฝvโN23มวZะ๛}G๑ฅgqฃฺ๊ำฟ•dd0ช˜ี˜;#?มœ`แฑœ`6x4วŸLocjˆšqj๛‘^3ื฿มž5ำ.)๖กซkZdว2ด7Fimข ŒซฑŽO„’นว#8'่จัฏXช]xขฦh<‘!๓ฎฑAฦ7ไg<zใฅp:฿O‡luxด๛อ.hั˜-”R…“ฃ+จlŸไhŸi:~ฑพระ๔ซ0xปd tyศุB์ุ%ฝวJB๓ืยืนfถž›ฎxW์ฯ]๑k›_ดศož มญต’8‚œ7๏_ƒธ2€ ๑ƒิ0M๖Wเ{MJ;‹ตyญ#Pฤฃ_ภfฮ7_น$๔๙ึณ๏ฐ2?Aซxฺ;›้วš4๋y๖ว dd |EฝyP3ฉ๖™gแ_่๖/ค๘E–Kป$\]o’88๎ขM๎p ภเ`็=*’ิEMcŒ›‡๒Jƒญ‰ ’ล]๋ฟhZŽฏtUƒุ‰™9ย3Ÿ๚ชB_}ˆjR0๑t8X๖ญฤš๒‰P6?ๅททJ๒๋/ xfใX3]ฌz‘2)h๔ูL0ฮ0ฑ๏š้ต๘>KlGฃถšfb‘ณส’FจprGฉฦ}้๖ˆEีฟศ•ฒ ํSาดูdฑะ|uญx ผjฒEv.ํ6ถAdd!wฎยWŒ๑8ช ล{Eฟƒ ž_์Yแ€๙K{ฃ๊‡ ›cพึ๗ œใฅMฺ}˜๘WลึาB๑.ƒ2จ’7นนŠQ(9 อฯ#๙‡ฅucฯช2ฃ็ฺW]โฯณฏ๘a‹๊:Uมด.ย9ำk๎QLจฬS#ึนA้อv))rˆ* H#กบ/ ๘ใฤW]\ผฒWเช0a๙0>•ฮRŽ*]AฺทฺฏŽอw?๘ฃPYRF”m*ชY† (ำวจใตh฿xล๗้t—~'ีๅKญžjๅ€mฟ‡ำีฬRฃd}#ซณ๛G๑ต›‹uภF?ใธใง Oฅv:๛BxMp.ต]F,’Eีช“ฯบmฅ{qgฅjฎธW#jN’ธgUpI'S€Hkร_฿.^]™๋ด1ภ๚TeHhšT๚ฝCDปžGฮv้ืD|%๖ap™ วฑปz{fฒษฉล…ํ“,ข฿CฅojฺlฺT๋ิ’ฮ=pqŠุ‹Mฬ^ยylฯๅํๆ9T๚ใG=A5ฃฯ+แ|ˆช๊DีฮŒ cป†<}:t่jF- Sธๆฺยv Nิ๊ไ|ปึGา[Oิ ฅแณ,<ึxZ๑sฯOZดc์ํŠf{8๔๕ HืๆSธI˜„xใ9Ÿjร 2Nq ๙t฿้๚O‡ฅr,J\69๒๎Ÿv3ำฅnลาw7™c?อ$!ษศฎ)x–8ฺง~๕šyLใฌ<-}y˜&ดDฦ8๙(ฉ oDธ๛ํ์ฌJxฐ๙ท๘W\ึqE–ฐˆฃช™#เเเWOฬ฿ย่ผqฅ๗ˆHผ+กF฿jR๐Gลrซษ๕ฎ–x\i๐ร‘w๗ฝก™คท2qศษnFNs๔ญx๎L ”U๋ŒวฮณZ๙ภ๎d^˜F#๚V/W–]d]FŒQZYb(์!†"?x๑B’(ฦl|…iมญฯM๐—-!‘[%™Ÿ]ู\ผsดIRสา(ฮyฯฮฎŽแ"ธู…AZง›?™jกป-ๅฐŒฑF๒ษฺŽ…‘cl็ถ๔๛‰ฎe,A<ภCa‡]ฤ‚s๚ีซช)ญดปมA‘‚Wะ๛ึฌฺ„^Z+แ6(E๛€=}*”ˆฝIM?Z6ื%l`ruV\Œ๔8 ๔Ee_=›0]'L3ศป{…yIฯมํž๕ฮ่ U$w็Ÿฉ๋๔ซb{†0€ !#ไโฆา"ัะxฎ๊2ฃ๗hpY …U;ฌGืึฃงึ,Œฆ;6บ'",แค `ๅิV„ถ’<Šว|เ๐U๒๔ชฮะ†UดA[ฅN๕Ž{ฟ๕OพCoฤ7ŸyIA-ฬe8bKใ<’Xไ“น*๔kฯุ &ทQ„ ดHภœw$OZท่หรุHโK†#๚ืฉ‡ฤ1c‚?ฏฤษใl๓บWw'†๔™2!Ybsะ3ณ๋Q๒๘9ว_ฤ[$8ฦkข>#†]m|ื๔Uมœฅ2=Eu๖ž’แ–{‹iใ๏‹  ŸญJh๖โ"ย^˜าข~#Š.ฃศุฯ;ฅvวยˆDe`ๆnQ œœz๚ื;ช้ซfอ† ‚x๊ต_ฟGตY-tฅ+ดƒ(x @† Lฎ—RGt็š๋lg๐ื–|คทŒใnT–?<็๔5ว™ฦ#.Jงต#V’EŽ1น…Uอa›šน“U่ษN`๐‚k?;T๑eแนธ“zEฆCi4ฦธg๘GวธุวฯŽ{ฤV}R๊๏Dิ๖{ัY5ฝิRว๊คJ~{‡สขด-7V;ํEŒR…cน˜ผDŽIOฒj,ื0>อสoแ’‚ก~c5ย๒B2ฺๆ{‘j}NoSk›ล‰rฑ๗๓˜}‡๘šูŽF™ธิ๎ญวa5จ8๚ฉคีa]อkน}REoำ9ญูz†฿qบ#ิFH+ฑOข”r~ฉ๖W๐6$ำฌIํ›ภE!ฯ้ลEœdเไv8ฦk$๐อoผC,Y้ๆ!\uŠถ‚i^๋ฟ„Cฅ*เR” ฅ()JJR€R” &fีtู แ๋HุŽ[ฯ~พฃากป๔วทฅv7žทW^8oIฦTิ?ฅA]่ช–{V‘ฦ่Hะs๚W F‘—ๆ฿๓’—r.•SH ‚#ฅvฅ>ธ –k™6[ฤ๒?\(้S๖w‡nb‹vงrณ”ใˆ๐๐HมZ้ฌlฌ4่„Vจ฿ ',ฬ}O๙WŸŸฤ#…~๊‰Qณ‹ท๐ฃ3ะˆ—๙‡๔ธ<-6@๓˜๚‘๔ๆป&‘cBL,๗'~Uz์cตQ—ž˜ฯต็ฯฤณพ”6#•ต กึ่œrสุฯ้Šึo F_)u"ก์ศฎตvR* ๙„ฉ๋ย๓Zeน€๎}สŠฮ:์๋รaวอแนรโ ˜=dสฃ๕ชฟ…5Uเ‰่ฝkฐYญs–›๐3U7Qmฅžฮต^#Ÿุ(&q3๘kU‰‚‹V”ใ˜ภ๖อjIฃ๊qษฑ๔๋ฐั?1ลwzRNย ‘VGy$`fPy๛ร~cำšา>%—บDlG sฆ_.๋‹+˜ำ๙š3ฮดท/จฏG[ฒฤ‘4ชูๅbศวหะUญ< –ธ†Gใ$˜ัฟ\Uใโ}่ค8{žv=j„ิŠ๏n4&๙ทบ"ษŸแ; ธชษฅตซฝตฝจฺ3๐ฏ?i”ƒ_u•ฺัม€N0 ฯตgŽฮๆC๐B็ฟLWQฬ`๘wBฮ3ป‚‘Ÿสฒ Œสา๒ŒœgYx“ํoกหฎ9 6ะO“๚U๚ž‘wง*ผ๊เH‡#>‡ะ๋จG๒ิ์ฉ#ญ^ืฌยc„ฃŒ22ไ0๗š๑›ญฅE–7œ™ิ`ถ’๎อ๎ฃท‚ผฑน เอN๊ยุGZG&ฆqๆ$w็€~•)m%‹ร๗yข!>Z)ุ~bง์eดตH…œฉJ>‡hผvจษญว7sวlผbO2ี๕›hฤu ึa๏-V5EMุฮ๐?*œ๐ˆnึา๎MN๎yR‡หsำBฒ“๙์๕ดำobŽk‹Kนห%ิ#ใ$ฐ๋ื={ h๒M˜-ฆ3า)JFsV๛^ ู(Wๅว์K„“ป:dI#`.ดyHวRCฯี€+vๆ๎(iiZป"(ุ^๎EU๖ร‚ กŸ๎ฺsGฉฏ Q๐+H’=)ศช5๛๋;‰–แ5+๘ฮ rผB7Ols\+ศฤŸๆฟม1.?ฃบ[จข‘ๅwƒi?ˆีททูŽ0๓ํU่ฌรzŒฃšโ—ฤrๅ`าฏพ.F@Ÿ|ŒcŠว?ˆ..,โฐˆถำ4Šาฐ8ใฦ$ฑฏi ปษnฏฝ$ฎ๏BฝxืwR6~๑>(T9๎?ZหฟV‰"wcv3((ฤ~xฯศTยิใ%^ฅธๅžิb|Z˜o#<‚Žใ7๘ึฅฅ†๏มดธ0^!+<2 แ`~ะ\ุ๊’3ฅง˜ฃ)$'vำžOoaZrZNัB๏ yณ Iฆ›{‰๋ภฯง5๋โฮๅฬำฟบ9้๐cฟ๑Š5(ฆœ]ค ธฺฦR>1ห:๒3ฯฅw:tZyำm๏,Hkซจ ‰rp ภqฮxฯ<ึญๅอพ—ฆหx“หข๏)ท‚X๚็็PZาO๗[HEฒช#ส–๗ ‰’1’ใ‚ลpฯ$rว์Kๅส๗้š๎Q๘Ÿ$–ปคX๊t‹6‰zJ๙w c๒ำ†z‚Gc^s{nmฆhd’'๔xrฐ๕ฝzaŽGQ&ฃ6n1ื{1ฦะI๊q฿dฺtwmN# œ๒8๒3Wำk/†\ขา‹|ข{ร฿mz›XCญชฌ7QU–]69Pจแ‡ื?:ืsoโKo#Qปำฅท”V–4A‘ปŽT๓ืƒ\eว…๔eฑeš9 x•‰– ศวถG9็๔ฎOM๐๔๗ฯC5ณวๆ„”ฦ฿ฅฐ@ฯ ๕5+Oฆฯy"kๅ๕๚๎k=JีfH๓ู๊คJ$ O4ŠX(ใ๒—็S‘x๖๖€kซ”‘ฐฆu,?้ม้๙ิDฆ1%*๘o6#ทำฟส |Q๗Iaธ3iัfDย&Y>dpธฎUŠ3’‹]~ฝ‹ผŽ1ณ o\Jฯ:Dเ๘‰p@<‘†ไใ8ๆค<=โอ๓1ฒปŽี[ $–แํNvฺyฮ=2q^kฅอต d•ti[`็=8ฉ%/ต-vเฌ7QฑoRปWฐQƒƒ]OGฑ;u__^ž็/-าGซiZื๚œZuทˆ ˜ 7Nั๐‰ Y}บ’ฎๆซ๖}cฅ]ษ>ทเYฮ*’^ขGsiภธฟz:v“^W๗‘ฎ"E$‘๓ๅ๏฿ŽŸ cŒท=1[wšฆŸๅฯmuwj๑ฑเธhŠNqด๐=k8d”Wืฬัฮ ำแ“๗f๑ฬ“x{T]7๑๑4ƒfั็yl๐ฤม5ร๘ณ์า๓Dน– Kธ5Š0ํฐ€ว$‰<ค’0p:WIค๊SG,2}ๅ]ท†œe๐}๓ืิƒิืก]-ว kYnญ gฺP4HU<ˆร2Iใ${เV๘๕ฒ\6Kว่|ต"‘ฒI มะŠถฝฦ_f^+าฏ็yฌbปYƒOhกํๅ›p:๋\EŸyง2ฎกi=ฑqน|ิ*zƒะ•zษ.% ZR• ?แ›อfIRวJ˜จม–N'ฟz€ฌอ-ป๏‚Y"ๆF ึyaพ5K๑ ำ=Fฮ฿[๐๔Wjญง]ฑ)>คทVๆeeร*ฬANคrFFG8ฏฃ~ยผy6ฝm6‰ซ5Ÿํ+Tะ],฿xก'ิ๗๎{๙"+oRำต๖น{‘๘ึ1ุฤจ*02Tc>•๋฿์ัaโ๛Oพ๋f @F๑ZE๗}‚แ˜๒…ำขฎ ๕์|ว4–ท๕๒'o6ญวJUชยAเีิ,)Jf€R™ชล5i8้Šภ๎FF์7ฏeแ|i๖™คx6แNฏฆ›q$)v โƒฌ ฦHไ็G‘š”›แฆ ๒-ผ„[ษ/ ป`’ฏ๑P†_ฺ$ZะฒŒ3\M%ตส\ฬ฿ร‘ŽNN0rA59}ัž •ญ๎๎n‘ูพU6žN์s;๗ฎWSj;@ฅ4ฝP—เผ™ใˆ๎“‹‚;v๗ญ)พล[ณcฤvhืึฮ|ข๋vฅA„ว{,)ฦ}ๅ˜น๎{t\bน+ฅ๑Ž™งฒ๘ำร—”W ฌฐ …U>fะ9ฮ#<๓P2h?๘‚-–:f›ฅทiฑ็สฟ"รh๙โผVิฏต‹ทบีฏ./n–/;–ไ๕ภ่>Bฎ๔žbฉˆท„๗ฺ<๚ืˆcธ๐ด[Zฝดb{i!๒ฬSจรŽ œg#Žk– ใฅ+ถ+jข)Jฑ"”ฅ’S !Iษwปž8cŠวJP R””ฅฅ)@)Jจ=‡น8)าท,เ†G!หสAไ }jwOัƒL’1ศมŸ˜๑Ž๕ษ—Y nšไŽง8–ำI˜‘1Œœ์Oฅd‚ยๆy6คgท๚น๖๋]ปAŒ‘ฬ›Hu ้Aฃj ฐชCต ฦ่ฏzแ—‰ฯดIฏS›ฒ๐ไ๗2”๓@!‚ฒ์!ณ่๋uถ<(eถškyŸสŒ4…นฮž?_•H›กป2c2Ma3XฦฯSŽq\๏_ปฒiงร6™D7ำD7<๕„‚r{็ข5]-t๐คj6W9`ร่EM*ป1cp์;p3Y “F0 }z}j๐ืๅƒ๘Ÿภg U€ซy‚3J๋็eนQฦษ•Žะ2 'ุ ว๗ 1+Z*ถv’ žภ๕ฎจ๘œkโ‹๚ˆHไ้]=ว‡ญK[I4MุHง๛Š‹ธั/ก„ITu1ธฯไpkงทN’ฏŸ™Jนี‘Šบฒฐ๊`Šา์PwA3Dศป˜ด{—ฎ ืD๒F฿'ภ4)ำญJj:;ฺF]. ›‰แ‡ำฝ]ขL๖๛๖้ |๎FิฃะqŠหํp฿O‹DZ3#ซก*๊C)ˆ๏]›ใ Nอ“|ญ"7v’พž•‰ดKซษZY"ดฐคI“๚ ึE๐1(3ฯ,อป"]ฃ3š็หฉาอษMชษM๖$๏|Oฃ฿[ฎ,.ŠทโSด˜มเื+~ถ †ำๅน*O1ฮƒ(?ๆ!Sหแศdfๆ[`โB*‹แ›`็}์{aฌp๊tุ~ไš๖๊ZMพค5ฦ“{v„IฦH]dU๛O วiรธลuq่ ยษkt๐”ม0Kqำ๚ืC๗งDร€’๑5‹w้•žd=53แ{[ อAขิDฯ๐ๆ8ฃ%Cž๙`1ื฿ิWWumgx1=ผL\จฏZำ:ข~๖ึโ{)@8hไ'ฏ๘ั๘”2Aว˜ฟ_ฏ่m}‰อYใ๓ฅw%L”ฬ๘๘B†ไœšึ™ฎม'ฬŸ%G์š)๒ŽF ๓ํ‚khสาkœr๑ ๚•MWB้ฆ[พ|ฎ็’yศต™#นr6 ๘n•h•X'แ๘qƒŽzLะ*ฅ@่SžjฺฝMˆ๔ปษฃ9๒”ฤีkiฑ[I‹‡ WจŒŽ}ณV}๚dpั;#จ8Bตdปyc*1žsœิrGยLZฤ›Rา ˜อ๓ษ้Yคบ˜‚GvฮชZPง ธk*ห1 ๎'฿4ขสTI=อาŒ qๆดYาใใ9'#๋BฮสA8็9ซHษ[น่0hฑ%ใฬ6Ÿ,Œ็…ไUžsŒlีฎŒp6p=qV•ฺ0@ฯ็C7eํ3:cำ ฌs!Tl@9๘3Xณ…ภวะtฌMฮr!JD]๐]ฤŒDะ$ธOŸZษ6กm ผqถxูมบQ`นึ(ข‹๘ˆมg&‰"T‰๕พ2บฑDx ๏=3๊+[ำ,ต& I†B "วฤ}วCาฑM+กQg๐กO>ุjI~๏ ‚=ธCžFXˆใฑฯjผ$เ๗ล๒Y;\บ†ขำ๎„๗w1ฮ˜ะ'R9ญฦั์nหOqiน๑๘ะํ้œfถฺTฦJlไg…฿ตฅ ๏ผถ์๑มอZY๒ฮ[ฅ'—์E#YดXLPฺดcฑ^Ee‹IจVไฆภ?\fณฦ๎)1^:I๚โคค0ดˆ๎ล1”xฯozง›7ล…ฬ0ม$0์ แp ๏T1ศงธฮ2sYfž-ŒฎO?หŸzิ–๊T#v๖๐q๙ึ|“I„ศTํfๆช'iไ ’ป8aำŸJิ7n8'งsTfSs7fr;๑R7eำŸi (sษ ’G?:„พ๐บฮู‹ศO;แ?1๋๒ญ็š่) ๎ช=ZภW,’ ใ$’Iฎ,น1;ƒข๑๘V0@ž๎_๚#ึห๘Rษ@อ\nว<ฏ๘Vw–hมฺ_๛bซ HIUสŽๅy๚VฯYจ|๏‚Q๔"ๅ๐ยณฒฺน p<ไ:W8แ#‘‘ฅ”• Ž:cฺปๆŠGƒŽs๕๕ฌฮ0๊e‚6ฺs๑ ?J฿ˆฮ?๛9*โป&ๅaMหห๙ืฆG>าฆ8ฃใฐ@:|…ท`D๖–ใน?w•บ๑Uว๋ ๒ืฉ็๐หs(Žฺ)&jXBฎ๛ตวฟๆ๓ฯ2„7ๅึฝ"8ํMV๑ว~$Eุ~ธญผ8ฒ๚ uศฺ ?ˆJ/Mป~กใ}Ž!์ow=าฎ3“ c•bxfŒแแ•Oผdj๕HRfaๆ1‰Fpฐฎ\]€!e~>™ช/—ฉo+๒g6 (Œ0Zฺำ็ฒ„ณ^Y=แใb๙Z˜'๓๋–z|๗ฏฑใ‚D^]ค*Uพz ‰ึ}าณ้ญ’ะ@"S†i&Uวำ9ฌHผ0ฌฐคw2๐Jฎžวž h๒‘๐บžฝมฏI7(V9[๕๋๛Q›:ต๐yL‹ปฑม็หฦ?Zศ4ํfฬ„ณผ๎ช6ฦณ>HผUl๕=V๙K[6|e‹@ืŠฤ$๑4ขhลฒถ๐Tศภ๕มฮ+ห“ฮYeฦฟข#(หก+ฝุ‰Vโ๊ 6แƒ)cƒื#๚RA _w8nู5ซคฆก JบดLŽH#ฮr=้็Uธtธff ไ(#็อTœm?‘c3ศ ‘[<_๐ฌOฒ.๗,๊sœ๋ก†pU3Œ๓zร!,4ฌไยŸ๛UAด VหปขจOวฮkฬฺˆ#NAfๅ‰ี[+I๏&๒lmๆžl~‘œ ทn๔[๋6^[ห ลrcuรเ๗ฺy#žฦ–ฦ` ํlžfฉๅฌj|มŒ๔็5'mแถผUX/ดศไษฤw\฿โใี‡ชูฅV้=นf#•ฉ^น’ำ•bฝHฉาเ}BœbณYFn ๘@œgฉ๊yๆญšใ.wGณžC(อcR#ใqŸ–qQDฅFฤถฒ‰ส๓Œq‘๋Wซ…ตhYdRย@เ๚Šดj.ห‚9]FTqดWŒไ~])VM ฐ;`คR0่ฅFAl‘ศ˜-งก U[ืฮa‰Ž์ž?จ_:ตีึF฿*‘"Žคœุ๗ก*ˆฆwoยใŸJฃฤฎฌ>ฦบ0ณdคx๘X’ง฿Œ็ž๙๏X/โYUม3ฑฆฟ๚โฅ:ๅฎ8 œ|Fชภ์๖้Ÿ|ึ ๕ lโ๘šา6' ฮว฿Œq๔ฉ,ฌ’๙ƒo=3ŒVฌ๐ล+ณ์MCROฆxญqไŠ—ฤŠ‘ะ๊บ‘Vq1฿๘c ?๊ฉ{}BๆI˜Ih‘ฆ9๓_{1๖วฎˆb;า5‰บ“๓=MZ๛N Aภ๚c5ฎLฐษ๗`—ืไG+น*ทnส]จืŽล@qมหr็ฆด#gมมPฝ‡ทงฝe Ctเป๔ลsช-d‰ธŒ(2Œๅ‡OŸฅfD๊FถzT9rฮi๑ศ๖ล‘X2๐ฤ๓žฝ?ญ[‚M่![x –Œpกjส   ฎzŠี‚ไ˜๛mํŽAlฃซวรŒ‘วฅVOิดQ–6d.X!๙G: สน2ผsะs๕อjM-ฝช3ฯ$qจใฤ ๔3ถโœU฿แ๛œฒยฆ ]7QพxีฎงX™๐I$ใ'“Š่ดอ"ึUOŽŸฟ”o8%xึธY'}6H"-ๅ}ฺ3ปh็ฒ‡R}+ฝ๛=๐ท™ใ'๐—Š๔kป๋VYปปY•ฬy็เtม g๐A็#ฏ›ํ&๛ต3ํc`ุi?^ี๋ž„]5Žงoโ}>ษํฅY\\๓!9ญธŽx๖ไWจำฌSNธ/o ๎=6๖๕ชีฑัฉษ9ไŒg้WUBรžkbํ…ษ้UšEPrภcŸ•y฿ฺ't :ฦ๎-WPณ‚#9๛ฤHฏ U6zp=jRทD7GAโ_๘sรr˜uฝrรN˜&.แฐ์พภ๒~•ๅ0ด6‘ห๊wV๖ฐ๙ŸบJn]ะฑUนโ98ใญ|—ฌjw:ฦฅ=๕์ณห$ฎXyำ<ล<(g$=๋Jบึ•wemŸC๘ฏฆต;อ.[Oi+cvูA}4พfฆๅ7q’@๏š๐ B๖๋Rฟธพิ.%บผธs$ณฬุ๗&ต้]วt R”ซ’*OMาลศ]AinlผŠ€๋ด>€‘šŒฌฐฬัฑp”ฌQอg‘Mวเtม-ญh?rป‰4๋ติญฆ]ัหLŒw/8#=‰„ึK ฿สณ–ฺ1‚ฤณŒ๒สษ๓ฉ#ฤ๖ถฯ น‰f ๅฤีX๘"บ8]eW—fM รw8I,`€ล* \ƒ>Rgƒด๎'ฎzื˜๕ธ.?2้E๗8๘+24W7Q.าห๛ฐIศ่yƒ๙ึญ๏‡5 hึHข7Qแ‹4<ํ ิ‘ื#ž•๊ื?k{ „์ู์3฿1ywฦ์o"ผวX๑Uี๘’;+[]*ฺL‡†ำvg bX๎kloVไ›ช๗ใ๖๖9แศฅ)^‰QJR€R” ฅ()Y …ๆpจฬšฌคขฎ]Žค4ญ9ฏœœ-Afม็ญ]i`T๎ธY7 ๏๎MOฺG๗D„gแ!œz“ซอีk’[qพ}Bไ‘X4›hcX๔฿ (รๆfwvไไc฿Žj๋ฝ~ไN๒Yห‰ ๙eำ‡ฺ88็Ž>Uq{,€ฏ!ุpK๕้ำิ|ซF2T ๒m…™e™ๅbฮอ’sฯ^พยจาฌjL„*Žฌีซ-ฬPŸJ๚OๅQ—ณ5จฐE#„เqœ๛ใตo‡N๒พxฉฏํF\}แTŸ๘O๘Vup่)ะކฃญtบํ#‘๊ยคขU๒ำb(ฮ6ฎฯ๙ิfŽบฤ€,๋่~]ฝชู&œ•8๒8๏T …ร2ทqŒึ5efแม8 k|R†๏๙#๐’[ท~8PAญ…ึึB yฅ“iฅŒ’}Hwd๙€‚lฆŸjฒ,Š…H9c๚ึน>ห‹ๅฯF7zš๓ูOypeบhใเฑ๒}ฒk6Ÿk5œฤลpอ.YฦใำŸ•nภb>ภไTŠtQตค็ะŽต„ตY%ฝ()"’ร#fH๏U$Jฺ‚c^\j1€ฝซMคr6žZ‘)ฯฤ ใจฯ5Œ›’ฉ2.+กบ%?ห‘ํV๙์ป0:dœVพrุวว ไUแŠเฦ;๔ฌ่‹6~๐ฤcฟฉaŸ๙ฟ~1šย$กๆฑศไc-ษ์;Q!l฿Šyv&์{gฑ—ƒpc‰[๘ไ<h›™aŠ$ŒNร{8ฮ{U‹pา9๓7n<ๆ”YH‘š๚;pL1 o“ธ๛(๕ฎ๗๗R~ จงิr}ฑZฒ„s๙ึU™ฬjFํษ5W)&gผr2g'ˆฯ็Uสธภว9ว็X#_,•)NsžAซู‰ฦ฿ฅU๛>KXฑ}ภ€Gฏzฯ ฏ)หI>ะ3๐“วไkFโGT, g8ฯašอ ฆ2v๒aTตลކ๔D‡nZช๓‚ Gฮ์ม๖ญUปU๙‚็Tถ…›๗m9ฯoOC๋Y›บ็ €8>ุญ์1ฦGฝV9ŸƒŒ~jlฒ›6๘็ŸLuช„s๐œc€zVฟ™ปโq๏Wฃ€8#๓จฑธส>gp=Wฒจ9<ึมฮ=ชูฉN๓mvใฆ~TM€เgะ๛Vจ|sภ*$้นHxศ๙๓K'yฒภ‡Žี`-‚{๕ฌrH ๅ[>ี‰฿?„ŒRสน™˜เๅŽ>Bฉธฦต๗d๗&ฎR`กืƒŠ‹+บหๅapqŒเ๕๙ีฐฑuร๕์j๖ยƒๅ;…oฤค๑uษ.Fา‘ฑ<๓๕ํWป5๊Y> c1Bฅ ,YM๘QŒ•hว$ˆpัƒ‘ŸLีฦv 6ศษฦ–šกฅิอ"2พ{;โ›Pเr8kธ ๊ภแ†k$Wr ภŽ&œะ•$QฑŸ„/๒€9ฌ๐ศฉ‚ฌ@ก^=z๒ฌzevc๚'O•lEs๎•L๔9๋K%4m_Iส!๒ืy\7–งฝOก๚ิpNHC†=FGZุนQฦโคdu&ฐโปžนฦฅขYzA,€แŸ@ง5`‰ส–C•ว8nlว<–ำ,ฑสฉฎผ{Šศ^Eูฑ†ึU8อEŠLะ"ฉสฉ๗ว๗ฆD…Iนว|ViP6ธษ๊˜ฺk.ย !1ศ๋๒ก›แ„ย7๙˜dŸ๐ซค@ซภเr ้Xฺ62เซ‚FsŸาฎค?;ฑภ8วศๆ…“/C…,rsภ๋*ิ๘”'ุ•œ[จPBถˆฯหฺžR—ไ*Œ’sอ t๊cXIn$#ฆ๋Y’ซn้œ็&ฏf"n@็‘฿a˜ฟโxH๋ƒอดŠแ|ฬ’:€Jฺี\๙g zpyิI฿c\pvŸ๊j๙ขYุํ€1z}jญ‘ฝ›Fเํ! ๎๎O$R0ฉ๙†A /sZถสฎ ๔ข๐ุ‡ฆOญBd๏fw/ไข’v“9๗๕ญ•xƒ‡a88รใฬr*'k—f;‹€9เz๊ลWZฅ Œมq*ูบเ•@ Ÿvว~ีพo4ิซ'ฬฎง!JRพฌภSญ*๙ค นษภฯ๙ะP+bส<ภ`œœfต๊CMิพๆร}ด $RกชdokฺRw_ ิ้“B-ี-ส่่ซŒ๛๕ถำ:ฒ$‘ฦษ#95สMฏLื--ผ[ƒมHฒzฺถ๑™*G$EC7ฎFzWƒ›C™ฝ้_ไLŒjDไชng,ฑฒ p‰ตŽV+เศ?‡ฏ9ญษฎํ-B’%ณcถ~ŸZฒIคน—ฯ‰#[RŠn%s๙ื‹๋\ฏ‚;iธ}ฬ#๙›’jSGำcิ {x<รzrขฃ8(9bp8้Z๗2,ไ2+7 8@~ธ&ถm.5-5dณดพ!2fฬ(คํ๎F๖๔\k\pritOx•๕ฏ ฌ:ปIqmบๆยึ˜wเแI๕ฑ้Pzบิ58แนŠK๙g“$-สฦ๒žเศsื๊{ ๅํตฟj“Mฏ\Nm๎Z$๓d ?”7ๆวJ›ํ-'Pฐธ๐Ÿ‡l4๕ตFGkวkน.‹ .Jฏ<๐ c$s]ฯC•หobฉปถu7^ฐปIŸ๘[Nš?xํ“ฃ“ž223‘Q1๘r๗Lนทฝีtฦผฒสฐ)9Eœw (Ž๔85ๆ๓™ฆyš(Wr์ษ$“€ฝ็ ฉ ;ฤฺึ›qูjW0ลoTŽB€61ธmฦ8ฯZึ^๊โNๆzSุ๘V้bด‰ี`Xึt‰pHž9๕คม‹๓™ษ<๚ ŸฤYv],›2๘ฺO8๙t<ึRค7˜ธน’?ฅUnƒa\’3ุdƒX๕ ฝณˆ‹vฃ8ํ้TถฺLฑช๋ m@iโsศโjYๅ˜๖Gaœเฑ |ช จคŠE\ใ,คsVWัเม~}ฬฑCศๆ”ฎ‚ ๖ฦ๎+ˆฃ…3นVDน์qํ[๚๗ˆupย/คŒCฤPรไ^’j&•GŽJmr…พ„„Si‹กฯ–“พฌ๒ƒม—ฦิ๖็ืญญ฿Jห{3ีภ๎น๚ืDฒแม5 RrไโฉOŸะาป ŠR”ค=ญ^xQบw’' @2ฤฒm=™CวตFRขQRTศ>ฝ๛๛wƒX{=+ล๑Lฉฟ™ฤ# <ฬ#8ฦเ@$๔ฏIึึ<คฯo๋–ทsO๘Rล…ฦ=ุฆBM~|‘‘ƒะี๖๒ฝผŠ๐1Bx้\Rา5{_ๆZฯัอkQต})Dฑ3Au7gf3Ÿ„๔๋_ฅ๊ึฯตKง::สRอ%v`จ:• ศRrFy็šํ#ฤ1๘j็C[}ฮhผฦ3ๆBนษพrป'ž}+ ำOŠQๆD>Xฅ)]@R” ฅ()JUชR€R” ฅ( ˜ึU3&๘๓ศW๕cX•เU(9้ฯสขนฒ+"Dฯษยขเg>žด2ฑbเ %ธ“๏๋Qบ cฅ)V$œา4่'‰Evr~,ฉ*95ฺ%–‹obdท๛ฤžQ?ฟปตhึB?‘rp3วcื5วxnWV\งสHฌJขไFq๊9๔ฉํkR๓ูb‰‹ถ0]˜Fฝpป$š๙อTงๆ8ษู+ิต๏"q•EI8Sู<Šม-าJHVeL๎’>ž๘จ†ผท7H 'kฯ*ณศ }า†E…ใฏฐต‘+\;dnfลร+6Iษตง9‚™ ๚Vx™ƒนฃ%7uรฅf&ูZbท]๘Q๙Uก๐InW]ŠพNdœ’Iษ=Iฉ] FUp6 1'ฅi]ษทZฦปสŸ|U\อnp๛2zมฏkอ7z‹-PqŸ^ุช;ไ|@|ช๓PK๑ฯJกS“Œ“ฑfดฟ—J\๐ใ;ˆ9อlศžZๅYJ’GZฦvธ Gw๋RŸrnŒQฎ’vไ๛{Vtศ๖ฯ~๕b‚ 88ซน :๓І์nไนฃ ๑:ๅqŒ๚Uญภฬnq่yp9V‚Hม$vชe%.๎ƒŽh‹ชf%FLždg?ยkZ[pv˜uB?ZุdlิŽีw@'ตhฅทกmอpQdใ?;IaŸn3อdXงebI้ŸาฒฐไDbAฯ้G6ษse๊„$•ทœt๙zUr07oเŒ0&ฎWnw.แŒcต09+ปj–B‘k4ฌ~วฬŽj๕’Oโn Z๙วp8ํ๊ภ๎~}่ ฒwOฅZzuล{s๓ช“วNŸใPQวิXqวญQeu=วาฐฎๅbc เgŽ•š9ิ€07vอKTU’_“sY๗m็ำ8ญgฮเUNOฅ_ฮะุ๙`ี&อณธไเž€๔rx๔อjy„Ÿp9ๆžg=๓ฝFัh.p8โฏฯภะžkMeฬƒหŠศฬYy'อ*‰ณ:0X†‘ื็Xสฤe.ๅ[pวลศโตŒ€ut๋Vห/,พฝ€ฉI™นๆwaŸZกe<+Gทญ~cฤ‚šณ๙*คๅพ\า‹S๐žต“xฦ=*ฦNแ่xตhฏ`sฯจ#ก˜rr[!ธ>ิQ‚ภ๓๋V(ฏV1อ@ถ\ลW€Uจcž๕rไt#ตdิ8%ฒ>T8Iƒj™-ภ็ฆi+ฤฉ่5h}ภl_nM ศŽGร฿ง=Y@ํ'8๐8ษ๚UAร(ศํ88๔ฌƒะnศ็ฌ‹$-ฎ"†M’DฒnL1'โ-ฮำŸสฏ7Zxฮ๘%,9ยฟOaว๕จถท ฃ๑ี&นmฐฬ’žrQxk\x็—ˆ+4๓:K‰-<คX™‰ฮษ>นญQ IŒ†^ zT๋ึ๛ม+7<จภyช~ืi็ุ€ฝh๔y๘e\ฌ™;›จeฺ;dฺถŒlห’s๚W6$`ฦ8โc ฦIฉo๒ญห}~)]`ภห†ใE%ฃอn"ืrr\:ํไ`‘ื้ZzฎซkงK!—๗’–๘"S๑|ฯทฝB_๊ะอkึŽA•clใkffbฮK1ไ–9&บดพ็ฮN ่tฯโ”yC5œ›ใ`ไ{ uฉ˜๏ญโำในนe•Vpzqิ๛•ภ(,มTcภP2MtzW†w w!ฺ‹–E9 =ฯ๘Vบฝ.ŸMบ[#s6&ิgิฎmํ๔‰&‡sŸ1ฑ‚ื#ถ3๚Tำลถ%Y u/˜Kท๋๊/RิไRMดไๅ”เ*๋ะญB๋—ฯ2, Ÿ‹ษ๐ฏอ‡S ิผAดสฺlๆๆ_ฤYโgŒm–=yเ|๋ ฦฐšฬ–๗พ*ผิoฅˆlX1œ€”z๑\เโฉŠฌtXแ๑๏Qš๎Tšแž(ฺ8ฯแBถžaฅ+ช1QJ+ ฅ*ฤŠR”€G"คญ5อwฒถะT,ํนž5้€sผ“Šฅg—rวlˆjฮำร^"ผะตX•Ÿ๏–ไม=ณHeŒธ €G8ศไ๚ืกฺ๋?‡ucTิดJEา(๎ d;หeกe๑*ไnฮ:๓^i/•(ส๏ฝJ฿ดิฌเรๆFIœo~ีๅๆำM6’ดUZ;MCG—j‹}%ฬ3*!h62ฯฎา6๓ศษ๋Q๏ฒM‘$ˆ๒0\]qุZ•ี๕;ฝkMถิoฏ7Og;ฒlหศrI s–็,{€<อฒฌBค a$์เf๊OpzpzWœโฏ‚สF๚jNึๆฦ[ฎJ7FS๏฿•E๓ๆFมS‚= `/$ฮwnrไjไศ;ฒU๑hโCvoIŠช_,d2MVv•C'p9๙V+™ญัDภ๙ H฿0~ตนจใ+•Pxศ๚V/r์Tิiๅ“jป‰œๅXยNP0^›ฝVLสมกPปฒ_ˆ็=H5ฒ,e๋สก^๋“๒ฉแฬส0Ž‚ฒโ8€bIฦ#}jวตธsย3 n,?.kฺผฑ‚ ”ธไภw้าฆ5ดdัฐ๓3H’ฦชŒภž?< ึ’q2ไณžผOฅ`le‘ูNr ๎๚zี#ŽaฝŽูS“žkJเถ๛,‰สฯp ฟ‡%ฝ2ku&†b8'gšภฏ2`ผ@๚pNH้๒*ฯฦๅcb‡@=ฝ๊g+ๅ…*.hู›ทc,คาฒวฯ<พxVฉW„“r nซYƒทฤฌ8>žี6ูณqฝย์Aธ์๓[๕Xฺ๊‚EXโaฺc™z3า ๕โ”ุ@Mณ)gD็ห#ฏŸาณ๐G—7‹+งฺ๚ฒ7[9๚R•ํ–*ฌศ‘Šทจ8ญหUปิ%0ว)8]ว'JาฉO \5ˆ๙\Hฅz=๋ŸS๐ใ”าMคC3^hsำViZW”ฐๅ&V5ว$๗อdาตuฺฏ ๚็ืฑฉDฮ^ ^. n๐'ฎ๑฿#พk].&i"}OCศl#l๑‚N ๋ส๓ฃœพyแ%๚}Y[(gv‘œ8yภํ๒จฝkqx‹6pะNOน฿cฝผž๖cฝ$@c‡vใฏzบ &๒aปหXม๏+m'้ึบ0iใง’ห–Ik“ไ[e`Fๆsห7s์+{Gำๅธ :ณขฉฺฅษ=๊ำข฿‹กไ5A)๓อtš=ƒ้๖ญ’+nmแ‡8้๊Gึjแrถ™4{ศ๏ึe‘ๆƒ!‹–;ˆกฟฅJGœฏ—ิ/5!$‚$ฮๅŒœ>0{๑ึตุ<งztbkฦษจžj฿ุญูฌb‰C—;?๏Vศ“์ขค ™ฮGก้ว๔จูฅ๒o7นวlqวJž_BฌืPมoFณค%€;Rwg๒กŠKกฟnศษ'ฉ๑[ห ภ`:ŸZ6BD|ฐ€Fบ็"ฎh฿…ˆg๒ใ็[า@_†,9ศล_ †pNzcีYDะฤŽBเ๚๚ี†ิ๐1‚} ฉ?#Uห=pG|าฺุ๏‚#๎'q๓9ซ~๋ %Aษ๗อMฌ]qŒuzFI#;คM2ร(b †ใฝSk8อtRDกsป'<€Zื’ูX2!=w๑M๏น„?,นษเไqW<ฌก๎#%I้RwŽF;K3๖šฃ4qปิไฅส๎ว๘T๎ า’ูฤbOฦคdXปd*ฑภษtฝsnb‰gต•ŒC „mภ{ีถท-$ส—M ศr0M,u4฿| Œไgf1๓ชฬฟนIŒAw๏[ื๖gม%w6>œ~|ิ`šXqา3์่$๘€~Ut…Q˜[‰ฃ!“๙ป8"0XฆGBjทN EUเ€ง<…aŒหŒH8œR˜๙Žz๐รธซฯ™ตT(\g ๐Iญฃqธ ุ`๕๖5ซ5ฏ”์ล0อ๑zœ๚Ž๔M2 เ)ส““ฮzfฎgส`๚ึ07’sะ็ฎk*วๅววRzzT2P‚)mใ Ž๋eŽีS$‚ซำssZ v๒j–03ขว–Ÿฎ9วๅR๎Še`Sfarx๏R7}ปT‘1˜ฌ~lาc/”;๏๋๙ืกคัG%K#ใั/ท๎mGPžฟzBฦB)8๚๚ึUV*ภ†A"…X(bาpc^ไ#qQ’”ฅ*ไŠR”ฅtm)๏f˜bำ‘รa˜๛}j*ป}DhWุฆpsƒŸญpxŽyแลp๊๘+'Hษgcณkn‘ปg?ี‰เV็QกKx‰)2; ๏ำ? 8ๆ{ึŒ๒4…Gยฃ' S‰๕5 mwxศนPwˆวษA=yล|๚Œ๒พํ,ฏศƒ๑ Œv‘n๋Šfrw1ษึก๊ๆ’F]ฏ+บไถ 3๋ƒฎƒส2จธ2วŒ|ฟ*๚œ0–<{dํขษR1าฎ*$:œc=E[[)JP‘JR€นยขณ1เ&ฒ-ตรฃ:ม)E-ฐ€Xฒบ EbชwรมฯฎjŒฬส;ฒŽpX‘P์ƒalghDŸนPวZdV• ]AVff,์ฬวฉ'$ี)Jฑ"”ฅฅ)@)JP R””ฅฅ)@\Œศม•`rํY๎ง7!’$A‚3๚ŠึฅRXิคฅDญžญ2”IดJโA'aa๊+ญฟT๑7”๖QLu!ถจํœ.๏ใ8เ๐y๏ฮงtRK ˆๆำงู,l|ุีศ#y?•yบฝํฝ๑Sv฿บ_$19๖ฎAiI๘wๅ๔ซฒPe]dวF~0=๊Ÿ‰<ฅŒ,„l‰•ธ;€ะŽๆฉŒณo‰dS‚><> ึL`อSิ9Uฦ$ฒมƒ‚SVฒ85ns€…ฒF พ•xUX™F่ฦF7๋บ น,‚ อว^9๚fฎŽก•dมOภฃ<๚๚าำเ•VrKร<ษ๙ี–๖ชN้‚–$.ญoW@ภธ็L’รŒ gฅBฒฉ่:V69`‹ทqn˜ฌƒŽE2 ฉขz˜%M๒ เว$zทฝeฮrs๓ฌ‹vฐ–ฅŠ‚‡้SDจฒ;๎ๅุYbrK{Uuํ‘m!ศษF2: —ดดS+9 Fรœ๑๛dJฯ:8Œ๙qฑ>*w“E9"#ทpปZGrOVšน-ลƒ่ภbถ”ษ~ตžrvกžผ๔ชขTHู`ฺา #งฝEว`๒฿ฌd‘ผ“œcง8โบรaฺฌสUFแฮqƒt~มใฒ=ญB…ฺ0 ๖ไcาฏ๛ถFGN•+{‡ยฌ8เ๔ญซ[ cgเgฉ>ฟ*•M; |  † ฎrzีž[ฌ{‚d‡ึบGถฺศ=ISœ๛bฌ{"K)Sทƒ๒๙Tั/ฬํ•;”ๆ้Ymษ-‰NารJžŸMฺ›• ว!=~ตฉ5ซg%ธ Zซ#หhึQ‘๙xฮฐ%๋Al(AnผŒๆช‘•“เ;ธ์8ญˆ^Er6Žน?น)'ีซH„ธ๘—จษ๘Mkอ +šำ'•ž๖ํ฿พjv’bd่rF:+NM4’I๒‚เnLJต&Dฑฆ@ษgŒKช{œ‚~•ˆ,‘ฮม”y!‘’~ฆท5HฎDก`Œ‡$œิArXg๊p[j‡+แัf ัม)[prjง๛ิrพเIฐ๒Gj฿’สIH‘๙rnr dŽ9อLูi‰n[๗R[‘•*เไ๚Ej•"ัฦไD๋ybตPˆ6†‘ศ==‡ZาO:๘e‡ลŒฃ?.3ษฎ๘hrญPษ5ตœR€ช๖๑‡v็w’psืาฒ้นนŽi็ฝ“Hu”คqK*J๎๑ (ฯิฺHัแmžtˆ๑’T€Oว>„Vไ%ฎไS(Œaนษ`~Uะkพ{ดv™nใ3fO๙€&ฃ,ด๛†nIe •g9]ช.ส์”]3้™ฐ:7?ˆ|๚c็XRGทUฬ9ŒƒลK_iทq›Wสซ$จ่็ƒด|ขั‚๊ผ ฤํฦs๋Іศ’Fซหki$‘G68๕9ีฃq5ล๊+Zฏ–ฒƒต,{(ไs[๐iึrN ย‹Ÿโg๓5%qVQ8ŠŠz๏๊Gนญ!(ร”ญ๛_฿ไUGนฆ้าZํ๎2ˆ“รz๔jP …c-—๊ps’yญ8f:ใ๘Guฟš_ฦy้ว^ตL’–Gบ]E๚n๚๔HL•ฺŠฝYŽ*KJำdธqนdๆ qu/sขตลจ*ช ๒BJธอQDดq6ฌไdเr}Aเ๛ึ&fS๒่+ ”‡฿มโ}+Fลขr{(Z†š๊RP’๊hny [ตMภ ใะีJ@ฑฏฑ๋UดŒฬxFA๐ฏฏN:ฦ๐ย๘Šศ8Ž•นJฬ``ีoฃฺ7J&I4"<• .8ภ็(ร๙€ฐฯz &Lถ ’yตia’ฬ็แv j‰]Lชขkcวฦ1ž~ตlล กแˆ 9#99ญˆRn’ ฑN1ศโฑ1‰$\อๆpNา1ํD฿*มซซZ$ฑ‡1e\)'“๕๙ึพตeomฅ“afUdฤs๔ภญศํ,HBIฉ9ว5ตmuข(9w)‚อ’Gps๓่c฿†๒ส_ ๔-ts”งฬ`๚Rฝ๒โ”ฅฎฃยrฌถ76ฬHxx>วว๋\ฦ3าท!บ6;พๅ3$]ฒ6>ฯ๐ไg>+“Y…็วๅฎฝŠษZ'5ฝEด๙Vo!›v~lW0ํฝูฐโNฝQ‰f,ฤณ’Iษ5Jถ›MX‘mูใ#สaŽIษ$†G=ณ๏R๙Vฬโšgฌค–ŸwwmฉมRไ ๔:Œžๅ’f‰bุ€ํN๐ิ๚Wp[C ์ว๏<ƒด:*? ๔ใืาบ>[Iขkฤ๓DมU$w@AGธฏG๔๙„qท๚ฟ๐Jd„,ชน9ภ=พ•›ฬหY?*ืHฝ‹=ฝŒ๘“ใฟ;>}๋R-F`…ุsๅŒ๔๕ฎWง”xีฏร๕ไŽคฤ{ 1:แ๙Jล$ช@bฟ5‚ํ๎#๓ข`‚ ็zโณว˜>"จ?โฎyGcฉู…ุฐ$Tqฒฎ'ฮ:3๕ญัe&าBชฏฉojห๗4ฬสูJ่[#0ฒ#VŽ Œ็ๅVหk,J๛๐ว~่[๛ bชY#<ใฉdryGs {|ฝLrส<ฤ‹4 ฅผ_‚ะ?จแ›็ฯZ†ิ ฅ"ˆ@๑ไŒ3ŸงJ่โFS$จ˜ฮwฐโต[Oทน๐"ศฒ|{I18ฦUฐr=ˆฎํ&ฃdทeฟื๛ขั~คำM:9ูย๐ v๚ีึq$๓„–XโLdดดbคgำ#ทŸฬ˜mต\ฆPฬไv8วฺฃฏ'ธgƒ;[’6ํ๚้^ถ<ะสถbแWUั^์่–ๆอG๎.mpยศฺ=5U’ีศ%ƒ ๆศ5ห‚qWดา0Œ3’#๔_ฅrKยืi 6ต;wŠO4†ฺ์~#“๒+Fณ\\อrN๛๖gŽy๋ŸZร^†สQŸTฅ)Z’)JP R””ฅฅ)@)JP R””ฅฅ)@*ซด2๏S?ธ๏Šฅ(ฆำM๐๕c‚๒a!#คร่Pkฆดำโดฒކhฃz8'8้าผภŒืกxGW“Qด‘.VX ‚๊1•#ฉ๘ฏ ฤ4๙! ๊mลz๖ ”Y![s,ฒlQ๘YT๕ซ ธ†_/-๘—ižรฏZึบบ 7–rฃฎ:๛V &๖™Aห’ว๐€2 ๚ื|R!หฒ2K1๒เ“ภ๕อiซษบ&…vฯ˜@ฮrะ”ิ]๗ฦ๎%2กIฯฏตVXสฤ#Vyหm20ฤQป[๔ฮGตxว‹!&]-ฬhสแJN๙VฌทR)Pฬจ$๕ฌฉouู ฌ>pษ+†ม=๐รฐฮ:๒Aโต.ˆฑทu ๓๒V8มrวŽงๅZF ดฃห๖&Œฦๆvfแไ ิ4g?žyฉˆV›u’1ๅFภ‰8๘ฑุg๚ิ Pˆ็Emม๒AะŒŒŸ•J, 6ั๘GUม#็ŠฮTˆM#บhD%‚๖1€3ํž๕zู(LJ3ปฎ:็ทJ†^ฅศl๒=}+ใ๙p3PO$ี[&‘p“Z6่:สื๋๋[vix ุส9 QZึืh˜ไทแ>Y8๖อc;˜ไณI<ุ*Žsjีู•&ŒeW ๙ณฐ0@ซtย‘c{sุ‘ํ\ทˆF-ekm3™”๒บฃŒแA๋๓5ฆ <ณOl 8“า/9eX€”px<บhฒ+8U“{18ใำฏ=*3@๑บ†i-mฺsรI%าฤ…q’}นฉ=~k๛Xาm„fไฏ8oJาx%ŽkNฟ4IYqAผ0๔5 ปw๕ฎZาM~}R5บŠF_lˆT*/~v๗๔อu ๘หlq์;vฌ๓a๒š[“๙rE๒fS๒๛๙ภ๘Pฑ…g„ฬ๖.ฬ|ฉ\ƒvJNฝq้Xี†.UฝqชVมเปฃc“วSYซ่!ห5-Lษต๎ ˜ูv™6ชGไํ๙๔๕ลurXDhกe‰€ภ/’x็žโฑูล 2์B๗๙ื๊~>{)ๅ‡H๛บ bช›<ุ“žชO Aว ญกŠYA[:ทGไ๏ญดก2>mูี:…Pv๋4^–HfxmฺHภสœํวนฎKิuฏอkig4ทJ9Ž๖‡l๖Q~+า|)ก฿ู๊~^ฉเ%ยดsค…1ƒฮOยy=ฝปUrcxใฝตœะึร&O.1>฿‰šKผ@. RTภ,@๙ี้คจ>|ี-œเ`|๚ืฃ๏ Yž!&_ฃฦcจฦ8๗=+7์0ถrคฒฺCnปฅvธQิปq€?J็฿ษฑงะ๓หM]Š ;WoV๕ว็S0h๛e>`•ข^T(ษVว^}+–กณ๗ฆMqฅรs’[\\-ๅ+m 2pฤ6A€ฯ8ฎวNH,๏R+’-ึA}UW>๊ #Œqํž•iนDฎ9ยnฃษว฿้(—amœLผไIq๊qฮj*x 89xฦ1่kำา; ‘ฅwg ๒F๎@กิ๔9๔>๑Q𗇄rคสn8Idc9 :๚โจฆkต๖ญง<pI+ –จอ๐’N3Ÿฎ๘่‘•๘ู๗ฦ(:‰ปำ‘.Žั…2~‡ธฉSฒ\=ด๔u%Af<}EQtญห–8ไ‘ƒ๋๙WI ”i6๗m๑r]ฃ แ9่Oฉ้[š\Znฑc6ูnln!pฒXฑDeปถzd+NึูฮฺSุ•ฟำ๋ไr cมIV'‚@>•ญ*ฒ฿'>f?๗ตึkV๑๗าCธจbปreเŒdๆnตHใท1ส๒ฮr€ฮ`@เ๐ฅN๎8ef๋ชข-ฌcบIฒ<™ศ€๊:Vคšd~SGrkvy*๐ž0เœLY๔๙ไ\5อœDCฎ่๖>ยKpGv๋R๖LZ•์kgb_kถ#EŽG\ž)Fj*} ษงƒ=ฆญe:’K*จbุฮBไ ภฮ*๔บนัš%ี,YVFf๓ถƒ๔Ž:๔•๊:…tฅ‰ †7;‰(Hhฦ0T0๓ะ๐z{ึวˆtปh,แŠ๒+T–LํŽBe๋T๓)ํ7Žน‰ลiw"๊cl4{โZํŸมžpวŽ~พี?กXi๚ตรjt" –•€|œ+ป†ลิƒว5ฆi0%โม๗่lŠๅ๖3†G`๓๏RiHZcym4j๛šH%วN>%ฯc฿•Lฝ™ค}ฬš๗†–ึัฺำNxฐแŠฦชฃฉเu๗ฏ9˜I;†๒ู‹Hฯ+ ํํŽผwฏRิYึแคb๋6eœ”=ซ^loผ–ัฦGˆ็œงธขm.Dโค๘เ๒y‹…ยlŒ!zƒ–ิ“๓ญธt™/ขP73|8›9๓๔๕้3x2รYฺ็}ร…tธ๖<เึ•งูๅฦ•3อไศุศnv๊=๓Žีmศลเw์q ก˜ไฤX/ uฆ}*3[ั.ฎdV๒ฃfววฐ‘ŒcฎyฏX]!S%[นหrฬbz๑ํY"า%(ž\{‹HeเSzDžี7†๎หจ,bq35*พ๒•wŸ$ั?ฅz›่Oณฬ‹wAน1“ปพำฺตŽ„PผFฮวŒทC๏M่•ฅHโ์mmฃ<˜]ภTคจ€ดกš>ปฤ=ฒl๋Hl™‘^,‚5ห ๖วาต-ๆธžCกท€š2 zuโงฉ)(๐iอwVาyท ล๒Yใ๓ทลjฺƒห1ใแ๙ื_ชฺ1Œ๙“วธœฝ>ฤ/๚๗ฎeฌP$”œ 0็5พˆไฬแึถ-*๙ฎ@Pใ&ถ$Gˆcn๓าบป=%&† cยGฦฤฮqุ“ำ=+F๚ctธ‰ลŽ1#ก ๗ษจitFo#•น r’ผๅˆkM&s ฺIŒœ๛‘›oA'-๘p3ƒ้Z–TS˜๗4’cp p?ฤิ%F5F4ฐi๙กT@พuŸษ…FJทพz}kfฆšC*า7,G8MijcFY]‹8‚8ปt:onิFศ„ในฮF*9$1ลพ`0$เp*ๆฺŒ€€nmCjWŸy`‘“ๅ/<๑ธ๚โปดบgš[WN์”›1๊7F๒}ไชกŽ+kPธ–8-=ัฑุHไ Ÿaj5Qœํ@Y ฿ิnฆ-๗YเคK…† œc9๏^ิฑ%(F+…eฺๅ ล‰'’zŸZฅ*๘ใy ฃ9$(ฮup‘%•Qษภ๋Y a ‰[ ผL6Oฯฆ*อวiQภ'$Q;่โฅ‚žผ;Šถ”ฉ”ฅ ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” 6tไ2^วމ—'ุsSเตธ๛ตQื#žO5ฯXไฦชปทdํ]V™<)~uผ“สนU@T@x%›ฎ:u๔๗ฏฤฏฬ_/์„ฎ\ืฮกgฤnสฮกB–a฿8ฯำฎj?HH&ธ๓fy$ูฦ=ช(ไพ-n$ูยFมl l๔ซชปำeด‘bk‹fฟฤ‘ธ`นˆ~#ุž€๔้^[tz 7ห8ซษ1†๎ีญูpHศ๊7~œึฮ`aŠ๎P[ชก&X๙ƒื>ผิภIQศ„ฌ1ซณžฃ๕๋Sึน“ร๗šษะฦลูWkHw…[ฆrp็ศ๔+ต.‡™๋1D.3 ‘L€๎9'œ๚๕8ไfบ๏ณwšฦy5ณณašีไ"Bม๕๊)4ัz๒j *ฺf7v!็wแ์Oqํ]žฃแSUIญผ๒ฌglŒฅHฦpGึขOแขธ—{"WJMึ/ู"0ฺIƒบHRCษ+ƒ€*]ฒšHŒถทMส€“}En๋> ฑ7าY G–4lLK,วนฯงปV Gท–ฬy<ุFvHวvW5D›ไ™5ั`n…’3ฯดo ผ:ๆดd^๏€‚ว??ฮฅ๑Q7’9น๙zT}ํิjๅY8๊BEMหก;)แม9Ÿแ๓oโešา8ฤ‘†ะ_Žผ็ํS๑ขํๅ็๔จห๛+BI๏’;\†d…6ณu'๑ํQฆสเฅิš๚่ ››8l#-ž้ Tpcภ๙wญ [QE;4h#†3†๛๓TM:$WE๓ฆ๚ณ6๒1ฺ้ถcg-ตน2[W’)๐ท{ป$E๛ ร@ƒaดไgใฺฑa•PพํวฎOaำ๛ึG,W* ƒี€Yฌท lqr|8ษ#๓๋อgๆ๊(Šlลuqฟ™(ษc…U๊~U qฌสไลถ%่‘๕ฌšŽกm|จŒ’จL•l๕ใาขGJ๖๔Z((๎ห‹ฒFๅฤIvำ^)•ˆแˆษึฏปี.&sๅศ๑ฆ1Œ๒}ษ๕๙V…+น้ฑน๏je๘คU‰vไณzฑอ*”ญษฅ()JJR€R” ฅ()JJR€R” ฅ()JUPY‚จห€=MR๘Oส€–M๔ยฮ\l?ŽN>•Cก^mZ'8Pไิbป-พถ~#บ$r;๎œs]ง‡-ํฃถ?s,ผ๐>|์ผO<[บ!qโ๏ก฿ข1!ฮxGตNxnฮk(ูže†glเrEz๋ล{rลฤ>Q"i#E17ช็ฆ~Bฅ–หKิญQ๏–%ยฒฅสฉ ใม6:็OJว?ˆeอ ’Jฝ‹, ๔gพสl~ย€ูsํ้Q7๗66žIิฆyŸ†ณฏbqภ๗ษญฟหข้ำฌMs2หทzคj\=1๋ะrqลpšฎ u !>^ล… jIห0ษ<|ี}…ๆ–้'ดษฦŸ'a6ฉฃMบkkตG •8๚ƒ่*็ฤ๓ฦtึhAbยLŒ๕ภํ\ํniV๗77๑-ณสŒหA’@5๊Gร๐โนKš๕gKแmjๆ๊vถžๅ‘ฑฝNอแฑ๋ฮj[[าNน+<๑[I !f^bb฿ฮแฆผํF‚{+E๐อhห™qcO•gP#*คฑไ๔ฺqŠะฟ†K"Ž๓Zฆ>Ž|L ๒y+oIธณปœ"ู„ดฟw ธ=ณX8Jท%ม)3Sลฺ์Vบ$ถpฬย๚เ.ึQั3ƒฯn2+อษ$’I$๕$ไš๊]iฆjฌึ:ฝซJWI™ฒ1ะnฉ?*…“Dฟrษ3Ž&S๕๋าพƒC,Xq-ฮ›๕ใ๗์นดRค‘2’ม85š๒๒ๆ๖G{นไ•˜ไ๎n?.•?ง๘`\/2K+๗X—h๚g“๒ญัเี™H€ฦwd4Š3ด~๕ ดผCMบ฿Uพ˜Iณถž[W/m+ฤฤ`”8ศ๗๕ฉซ z}.&*{?8๚Žีฏw _@ฤ"ฌหž n:๛Vท์ซพ๋&ห?•_/ูu ๅ%๓ตeZL๎,ต”!’H><แฬGๆฅญ๕3i˜ๅS๊F๕pkะ4ห๛hๅYc_.L3!๘‚๛š™Ÿ๗XKH?vว UJเ{`๓_?›1อจ;๗ 8๒Ž—๖ไถX*ๆ9๐ฎสvฑ‡L๑^?ชฤฐj—ฎ์G+/ฤ0NZ๔ซ-ๅ‡๏eสLx˜q๊G๗จc@—Z‘พ๏ ฃUŠ O๗ร๙1๕ม#ฺบ|?S 9๗รใไ]ฆอฑ_้z/ˆ๔๛OZญ‡˜ฦ=G&ตr8,เQ๕H8‘้_XIควฅ[\ป’H2ใะใ \cŠ๘Dxคจ่ใชบGะืต}‡kฺตง†nด iฒ›จฏ|๛้ฃŒ?›(ุ2I‘Žใฝv๋ด oอฦ้Ÿ3Ly–$ํp}Aคุฦ๑แBฤaŠžŸ"zึฦฏฃXi7š\๖ฆ{Ky-คุ™H!ฝ3ุ๚ำGีอ„rอmqlธeKฦ8<เg๚ิnฃฯŠเิ-๕T:]1ญร+สXโP๙qŽFึผHวkwรGc“WFyฟ† ฐฏf’ล%ฟ“‘ไอ fPฟ๚xžIฯL =kัใา์l,R(แ‚8๏๒ c]วฏŠๆ$๐ฦ“3Oแ๋๐“’wGp ฃŒœ ๕ฆ-eน{Xh„*คธOภ฿":ศึ2ŸVป—รงŒ-%VS\Žึๅ?fYฯqŸp~•๛VิJฏ ไฦddP žx9sœึึค“D ฯ3K๐…Sณiไ{Œu5ศI%F๏,๐@%-ระจ–๚`zšErฬง’บ{๊ัD„ ณ7œโ’ปอ'–ฏ€Žv๛†8?.1Wฅิษe“โ&๖ฉซฤ๎ฐ_!ทœฒบฐ8๎y๚เ๋Eฒ;ซแ˜Cศ=1Œ†ตji:™ . ึJ๗SF‰n^LpzๅŽ9วU9aฆi๖–k๗ฅฑsp$’ิ4จsซน€ฺsิŒqŠีฦ+ฃ๚J|o–ˆ๕cNถo:&Ueˆ๔๏œ๓[ถ:ๅํอ่I–5bป‰ธ ว=ฦ่๚g#ช๖ฺ?ƒaKAuc ึ‘๛ฌฦa^ปฑฺ:ต#ง›iR$w3Z๊V[@GxoQ–้๔ตฏ™+๏ฉฤ่~+บฒ•ฃฯnฮ7 ีลย(=8เ€;œ“^ี๏โH๎4‰ฏ#9lยIqŽ฿ฆŸม[ob †D‹)ๅOq%ยƒร3`•8๋ำœิํพ˜–ถ‘ญลŒ–ฎวjฌ ฮpz •Z1Œน5Š’โฮ-า+฿,hz„บ–’9™็ีJ๗๙๑ZRX‹[หaqไฏไ|cA็ก๊O่OคMผุ‹๎๑-ถAŽผ~ธ'ชิธทN“^ฦŸยนnฃ=y๙U๖%ะณไๅtมน<๛9ไ K`ฬฉใาทถฬฒH‘:*Že!ฑื$cทฯš“ธš%Š1mjฮกr`ุ['ถy8ลmฝผk๓O˜>wI–ศ=3ภธ๋Š6ฝ J๛‘ฟ|ด6โKฉ|้ณ˜๓aฎี^ๆ๏*๚@"<็หYvFฤ๕%H'ฏ\ ‚+c$hจณ‡&4gQ‘๎เีZึห๏&8cxˆ}ŒnํCT“Š๊i๏ƒO๖๋ฌป$ด๛ปn’6?ˆ ณบkวูค;รณœ UรLi๎—ฬ8bฎ’(8วSƒำ>ีฺ†ปฆ้REbถ7W—’daq'ฎ ๚tฌžศฝตฬŸๅญช@ยYงYฆ\พsc๊zY›ู~ˆฝrลrทพ&^VX#ด#แ1/–ใ่O?JŽoจ…"ฒ&A๕จQo”G™tบŽ…jฎXG็ทRฬ3šๆ5๓qซF7ศภ‘ˆิ…^เNzึ•๗Š..žKะ+'_aอqฺฏ‰ฎ"Œล˜‚Ÿผใ>rE^1kฉ†lัฎXj3IบA"ฐŒFฎปqžงœฯฝJแ‰์!ฮณ-(่ฆqžฯซˆฐิdดœ์eฺไ๏=I?๗ญษuG๒รXภ=B๙š–(ugI=อฏ˜๗1ฌ!2 0[N•ล]›–”ุ€8็h๔๙uซnฎไrมรง,O_๏QฆG/ฮเฆ†s–\น`1@H๊3“ชˆ^$!ฑR3(.=?สฐ;n|g“‹ฎ+[Sป’าอž' ์มcษๅฒN[OึตวŠY$กฌฦฌ“ดิRอษหนpv’Kgญi^\คj ำˆ๓ษู'ไ+”–GšFyXปทRjฬ ๕ฃแTพเถรwQพ7Mฒ0R z๛šาฅ+ีวŽ8ขฃมtจำ์&ฝ’?-3!lŽิืE{i เ!ใw็sฉร'?ฏสข@ธธาั‘$@ˆWxbs€ฃฟZั7๗-ฤำ3+€ฌOโ#9ฦ}+ฮห‹.ฆ{ฃ$ถบ?TQฆอป>า•.Rอฤlใp๘ีฮJํy*8Zฐ:)]๘๑ธฏŽVห%๊)JVฅ…)JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€บ7h:1 =+า.ยโฦ่&ื†ํเ3ผFมๆU?เa๔ฝN4fv™ถ0w!ž7ำ็๋Š๓CL๒รtzขะu#บ๐์ำ่บึ—3ธ‚Cฬ‚B„.>๙`๛xฏMิeŽX"’ษc•ู€f@ณำ~a์:dืy`ทQว2Lฐ]B ว(ภ฿๐‘าฆ'1‚Dสค๖นธS ส๕Ucพ๏๒yก•๎Z;ฐcqๅ‘ผภงŽ้฿)ณŽœj&fŒFฤ’A8jฌร"ฆi?ศsำšฑŽ๖ย๕ฮ9โ’๙~fํ‘ืGํ๎+%ภ0๏มcƒศวZทแ$6เ{| ไฎ* ดพcbwddž:Xd•ฅbQA่ฌฏ1u๒€>คzึ c ิํ' จDYc;`!`ฤžŠฝ+$E#P_›<‘Ÿ๕ำ๕ซDgvNแวโUสคฉฮ6ŒG้Vฑะีพิ๏aฯ•ธห‚#*{>ีว9฿#ศภov,Hษญe™.จ`b‡‘ด๐I็?้Q๕๔บ :ลr๊nฦ‘้ศฅ)]ๅ…)JJR€R” ฅ()JJR€R” ฅ( œgŒใฎฑ xŽ'ฌฅA•rถ .ช‚Gหาญฉ$R” ฅ(li๐Eu}oฤห28W•บ(๎k^Œ2คzІญRฐูi๑G#อใฺeพANkvM3ษคŽฺ€ฒ0,ˆcqž;Km.3ฅ™–57Lแ {WUmฏxv=2ฮ๖ใ-ฃ;^BStฺใื9่:s_)—IŸ2^cช.ƒง‚๛O—KโKxๅ €ไ(๊;}=ซKVำ ž•-อ›ฃ@"y•ไ‘V8ๅ„ฐ\๕ฯญs_t†;ป๙# ํรัTŒŽ{๗๋\วŒ|qyญมqงAๅมฃ4ชส…’Mฝ Byฺ8u#5ฎ iอ\i{–žXํ9iไ–โY็นœI;6]˜๎2pH=?หฅfธžอญํVึษข™–w’_1e'ก ททl|-ฎ฿ฺ}๊ำIป{bฒ์VกฦGธฉ;๋SBd?uB3น<ย์z|#๙^๔๓เ‡’ใ฿๘G*ŒŸc“ฉ_ ^[i ฒปพ฿๗x™‹์]ฤ$c๕๋Sึfพ%šC›=|โ R=Gs}›๋>lQF๐ศ๎น8Š@žไฏOzฯ&ฏM8ธJ}W๎J„—4sพ"ิ#ี5ynกY–" ˜‚ภ\qQ„ิ๓ฏB๑?ูส่z4Z„šฒข))8ž,|[rŠ€rK`€=zWขj๓้<Ck/˜ก]'ˆ?Cุ๕S๎*๘2ยxฟเๅ.=ขโ#Jฺ๊[Y|Yš)1ศy#ำบO๊๙lห{uk Jซ r0ฺ%˜0<ฦzVฮกฏ่ท~บKM9๔ฝQŠ์0จeq‘ŸˆืŒgง5ศห#ห+I+ณศว,ฬrMV0yฆฒN;ZฟvมWวFo~ูผ:ิšซศ>๕#o—`ฏ๊`ใšํtฝN'˜;[อ๐ห8ส0๒; c๓็55 ๋ษ็KฌผR…่€’ภ€77\mอeญา,ส‚|™ผCay ”ฦทGJZ1X๚๔ฦOoZลแนvHu๓Nี‰6รผ!b719;A๋มๆฎีต‰คž[{Y‚i๒m}‘ฉE้Brนมว^j$บซ#ฤH$ภ| lื9Kษ๗๚ไ:Oƒืแา@"ท6์่ๅคcตOงฆAใถ*KLาญC˜๏#mจฤ6โะ๑Œ`เŽœž็ŠแtGฝ›OแO”.2ุr'ืŒŽy๋อN๘›ลvEd#ฟyฅ92y8ฆ$ู#=+ภ–—,eถขใVz’xb นหiB !nBฤฬใ฿ิิMึ—[ผพ`๓ฮซภvฝตi}ž๘็O‚ฺ'K˜•“๗พkฌlฯ๕๙ื3โŸ้—๚ต๔k}<6สIQm ร`๒ฮ:’N; wฌ#งอ)8จพ=އ((ูาI [ษjeEŠI”rSŽ~ฆฃ&ท’ึ]ฐD ใ.ฌ@๔ภ๙๔ฯญHxcOš{ื^|A๒ไ3 ศแ r}1u=€๎๎Qๅ‚ ‰ยดo*แ†ะzไaฒqŽโณm.ฌynJโŽ.o)Qฬ๛Fีห\ไwยŽฟJา–โฮŒHฺ|ฏ๐Jbๅ๓๐๐คds๒#าบ9ช•Œย8’WVlzใ็กฎ๔ฏi?ฟvปยW‚3Œใ>•1q|w#ห”yhŒีผ?ŸซZ-ู์ม,Y=™AรgŸฮถ๕z? คz‚ญมU]ั€๘แp=๐A<โบ *h๐มeqrV$"mB1%y8$๒Oz‰๑ท…hh‰ธ›kŸ6D—แ;๚gถ:;Uึื5ปก[ุ3็ปหป้Œื๗SฮrL“H]‰''“๏^‰๖โ๛๘๎=ษำo<หh ;฿์@Fxๆ ผAเ}GN’/&+ ,๛ฐๆภซ|'ง^้ž!ำ๏๎ขโ•–ึMฮ๒ี๔Y3้๒แjีz97ม7๖”ะอฆy]๎๓ไ;ะ๛F;‚F~uฆ๊หsฝ,ฅVทฐ๋฿EsZ‡‰˜้ึดPQVฬl๊n™mึI์ฒก฿‡ง "šŠ\้‘ล"ฺป)ๅไicžธฺ{žๆขด5ดแžmˆ๎w๙ัํ98ศเžsวOZธี๒gqqง<c์ศ<@็#SฯฅEัnY}จb4ท•-Q6–ผร ๘ฒy9>ฃŽž•ส^xžาูํไ…<ฟjฤ{t9ใิฯึบk๙๎a'"ท“lมeFSะเ๚T6ณแ๘ŸNiใผe๓1v้Œ‘Ž๙>• ฎๅZuม“C๑V…ช›DYาF]ห๑ฌO๔ม;XuๅIํลtIฐ5ฝ๓Hซ๐๒ปc๋ยตoฺJ‘[ ‹ใส^ฺสฒวผ๒เ2=FAํถ<+ช๋vzตฐCn๑•lญหถ"8รeI วTสะฯฅงตฃ>๒ฒบม#:ฃ0ไฤ|๊&ฯฤ ซ%ลอดRZม`ชdlXว#น๙๛Žฐ๒กS:B@ๆXc<๒ตC๊w๋งมฝ„jม‹Hญœ์ฤ“๕$œ๛ึqŒบ3ชybWTKหคโxห$ˆ8๑\^ฏ šˆŒ{LqลมU8'แ๔๕5ฅ?Šษ–ฬ< A”ฯRqŒ๔๋Q^!x๖yษ*ร‰หeŽC{ [Em8๒eMZ.ธึวDVั RCLชส\ๅQ1‰e•žแ„ฬAฺ[Cžยฉq1ž่น๒ใCโQpIวL๗็ฉฌ8Fฺ# FryชษœY&ฃ๓วฆจyก‘‹ มU[+Œž๚๊ๆH…ม[3;แ ๙๑ฏDถน”a‡ˆ็‡‚1*็Lา,์gŸPdฬ~,ŽxTฯ๕ฎญ&HAิฃm/๐1qw์Cj$‰H‹KทZtys๕ภๆฒ่:„ฺคิ1•‰wyŠ๙:Tฆ4เb–nHมg?–8ฌVwื6Eดฌ›ฟ z๒ะใžฑฦคz–ฎ8:หุ. พๆฮ m.๏Žู๔อqืK,ฮ๗ อ.pลบซธŠdฝำažFV“oXมŸO˜ฎoฤv๋ฑศฃไซ{ใฟฯตr๘nU —/ฟ๑๒!้JฉuฏtนJVๆ™dืทzDฃ.ไเ8๗ฉอ3J๛ปฬณศฤ์@ ชถ:Œ๕#+“Qฌว‚ำ๋่Uบ3ุร๗]= ลUฃsฦ๙๓\”„4Žส0ฅ‰ะfบ?"ย8%BฒJม‡>ƒ?฿๓5อW?†มธห3๋&DPฅ)^™qJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ(#šR€๏ใeำt#S3Nฑ’˜ ฯ”GPAฯำฝ_ภฺๆˆFกu—,n›6วฦฌ๚๎ฺึืXำโ}9แ๒1y†‘เ€ฅA ๕์Mrฺๅ…ฺฌฅพZ1•}ปŸยู็๋šษเ ;ฝ2 >lฐ’๊ฦSเ“‚9ะแฒvไyฎพ๏H‡OำVโ+™/ุฤัKl3ขเgpศ๏ื‚GLใŽ๘ฝห“ห๔?Mข๊Wf๎ฎ,๎ฦv•<ถ99ฺ;๛ึถ๎ต}2yึ‡ช=ต้œ๏๋ะ dO8ฦs[)ŽูกPโ(๎ฃฦ79๘ม8ใ?ˆgฑ๔ํPฐ๘rฦ๒g 8ถบ$;3มษไว< ]4๙e^ๅ๐u$๎LzœpOt‘ม7ฦฯ- 8ร*` ฝ=ฯญG้บLvะ}ูq.ุ๓œc9ใ=+ฌาtmฅ.๎ax%T•2นr„+๑๘˜ŸNน็‡K๐๔ึZLZsผฯO=Wh“’พA8๔9จSK‚|ทjัห]yฯ#ฒฤซœ€Bzี0I"ฎเ ๛๔๋จ:|๊ŽเnศฝAb—ny g<็ากล4RXิyd6ฃลWภp9rๆ?&tX๋ข|oฬธ“y8ำชN<ฦฺB๒qว๔ฌา8ฒ๒์‰•“ฬbEฤฃRV๎‹ค9รจk—ชYหศoQ[ขxญขŠ4$†\ฑ#ืž*ํp`ูuฬ0แƒ€๕ชž#ฒ@เj4๛Q†ศว&ฒฅ0ฒg'#+ิ้Ui•๊Qƒ•ย'=OฝYข6G๏$่vŽƒ๛ึฤQ4 €ุSฯLUงlฟ Œ๑ŸŸต Q–ฒ•fŽ=ลG๊บด6๑"6C7!P=j#Rึห,‘Zไ–๘Z\>ƒ๛ิ`;‚ฝ}/†9yธ^‚ฌฯypnd U@QŒ๛šมJWนจ-ฑ่Y*ฅ*ฤŠRชp…5ดBo\0๓8ฦA๎qฺง4™8B•ภ=ฎkf๎h j๒F“9Pสฏ=*ก\œ3ษ%=ฉ)๖ญh๐\ฺ^ฅง›๋ญ^)EฅŸ‘ผQฬฬz.†เ๎้๓ ’ฝ‰$W่–ณ ฝ๊ษQอn๊r’(e9:ž}๋ล๕๏ฐ\฿G6™wชX[ํๅฌ2 WงUgฏิš๕ผ7_‡Oงฯโc›Lญ4|ซ’T)'hไ ๐*•ํ~;๛พะด[ํ_Fีโพตดฎ%ทž"“^[i\ซ`d๓ކผPz~U๏เิcิGv7g๑สค)[ZU…ฮซชY้ึ1๙—ws%ผ)7;“ำ“_Bxs™ๅž&ฝญผบ[F2ถ{|๑Uิj๑i๋ฬ}I†9O”|๑m:BฎฒZม8lผวกbณj3œู้ฦำงyiฟQ^ซโ๏๖๑n—ชJž‰5ํ;แ1ฯ‘ล'#ัณvฑŠ2˜ฮ -่ช_อษI\๑Ž?>๕๑าGณ n_$dทe๒ภ™6Bโ<Qำ8๋Ž๙ํQ—:}ุธ จ˜าym›ห"DlŒ๎gมd™‚ ‰ัBxวz‰๑Uสกิ"’‚;ˆฅŽ8รy‘ปXฐ$ซsท#š…ศษ'ซกๅ๚๖ŠบVณZ2ก+ผ+ uํœ๕\ึZศนhาํH‹๑ฦจ็ฟฆqWwจ[Aฌร jpy-BAtŸคœr:g๒ฎ/R๐หฯ/Šuถ0ฌŽหีXŽAํลi'ฤŒฺไูตŠฺๆ๎;]^A-ฉmฑ๎ืโ =ึฅ-๔อ)ฅ6‘A4œฮ๏ƒถๅ3๚fนM2๎D๓l5$Œอ’ฒC(ยœyุŽkขšอ .แบy4เUDLwด'ŒŸแ๚Šั+โษOฝัX[+ .งบพฺB$rJJฉ# =๓Zw–๖f’)n#ƒ๐p๋ฑ็ (WsjŽคLdฏฒ€‘วฅm\สปฃ*ล"X‚#!\€~Y$|๊๊=…๗4ม\Dึ77 บ'$–^Ažx๙๔ญปฯ*ส฿…g^็uว…9ภ?ึด๒ฯr“BUX0ฺTํv<`๑Rฉc>ฌ…ฆwhคQๅ+“ม,ภŽ:๑T”=Iป๙nฎม๗๛taฤdจOŸ&กnฆXฎšC<’ขไ๗eœ๑“ฮ ํ]4^ฟŠแแv๑[ุ๎‰I’F๔๕วญEท†ผณ+}ูT3I#ค๐0Š9'ำ ษ5 “*9ปศ.ไนบi$’าี!๓%*ม๖ํ ŸCฯo\๕5ษ๊:<ืh๕› ั—s%ฉฬฎๅY:Œ rz๓^ฑโซTm ;L‚|ซK?ยฮไr uมุ`bต๔ๆืMxํญฆิn2TวตSษN>็็V๓6ซ0šณม๕S}ฆ๏Œฮช1๏ฺzp๒*sรz„พa[(็ถบ^BE1lงsŽ๘ม=+ญ๑E‡ๆž+ซUฤd๎XุeHเ๗็w–iทฑY]หฬ$rAN1มี1ฮำฉ’“ƒ็ก๋–zใ]iปgX–ํห๓!ฬeมแ‹`aH เไ๒1ฮ{OM1ูชลฬัฒ,r(c!9ลA้ภไฺธ›Xอrัฦ—fUYเVู†ฺ?xƒ๘Aไp=ฎถ(’ๅ”‚%ซ…ร~#ว8ฯ๘๔ดๆำณช%Kกทsv<เ ‡2nŽสNNF3ำ<ึ๔Wน‹o“d^‡(์๊-ง…ณธคืGฦปPƒ๊sม:pขูXbR€‡7—๏=+ ษพYดR\qOi –R๓ศใ’{sŠะฝ‡cฌ‘lqทใP๛ถ“ภษ์:๔ฅลรˆ๖4‘…+ฤ ฎ=ฝ}0+Z9bนqh&บ•’฿~>ิƒŽ9ฯ๖ฌำo”^าโศใ6cŽ'ฬl_‚\เgŒƒง?•_5แ‚ูุใ9๘๗เ>Oห ƒกญ=b๑lํผ‚ัN๏,aถ’?›ฎ s—ฺ„2งฤแ9|60>ž•7f2ศ—ท)๒ฬˆะฦฑฮ๎คใน5X5๘คนpฺใ=ฤ?<‚™ฦ+šีd’Hˆคะ๐กลทc# *1geˆy,มX€กศใ๛}jส';อ$ษKZ๊ ้ๅŽHอbYํษไŒเG๊75g˜&ํฤ“œ`็=~ตซ-มa’ŠŽ8ฦƒ๋ศ๋Z’]ฦa“+–^0ยหj}ŽyI฿ ์ดฟy–nค všHQฐ=}:๖จsโ|\”o3๏Q1+ืฎ=9ฎbุส๏"Zซ,oมฯ8๚žžต{Aๅณ…[KjอะyeDt–žโๆแฺแ'cบ$`ผ๚€9๋“ž+=ฮฃm5ช[Jถฑ!9“iCO@;๐xฎb3ถุ็ฅoXึi7‰7ŽCMQพๅ<รpย ์ู#oย =ธชศ7dqœ ๓Ї๎*}แ™cมjsฯฆ;}jข8 ผi*KŽr d฿ฉFŸSVi€มu^A4๖ถเภt8ว๔ฦjท—‘‘›y2”‘W๏Tู!P“ะkฮผ;t๏4#bHฮไุx>ผvo’ไDฅ•๗•O!๐y๓Ÿc$“:แ=ศ฿ฝีฎ๎VH`{xค*sดrฟฏ?ญpบญFพ[< ƒะ)#๓ฉฯ้อ{iž๙%&$eU1ศC+๘s๘๘`GNจซฎ๔๕Xร๘w็ฎ >ŽุจTŒ๒9Hไ า"ๅrGUศฦ=Oส ๕ wš6‘^5D๘ˆfร|Uะ๘†™ง\\ูไ`d’@5ไฺถทwฉณ‰ ล ้F8#ถOS]:]MCตย]ฮ,œ:'ญงำ็ห{ุƒ ฦr ๔[ทŠŠXŠท? 1ฺฅ#าธุํW+2 #ฒ@ฤ ๔งแ)ปŒ3'ฃฝี"ถ-ญ‰^แ˜ใฅR?ฦณ“๗G“๘ท‚ภ|ฑƒ\๋32จfbaA9ภ๖ซkxxnšท๘„ŽฮOโ52‚5/ฬึ]R6 ฒ3yˆL\ŽN:Wz๔=ห—@ต1ท™…? v|๓Lg๕็๋4qา(ไ‡<๗yเม)RZ‘ถีไ†$๘dรฦ็ žkBX s#ฦใชบkว5’*kน6บR”ซ’)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)YwBRR่kcaS„^yใฉใฅgŠkk;ษไŒ=ส"ฐyd6>๒ฝ@ฯP3U์(ำฏE๛ ถฟX–Ž(lM:Œผy จAŸ‰ษP1้“ฺป/ณๅงงY๊~$ึ>็ ฐญหู[ยZ}ฌ7.ุ ฤ`ž3าฝwAะด›m3๎z40้๖…ฒถ‘Gต— ป‰‰ไœš๒5#‰มใ‡7๙บm4ฅ5&A~ห–[“<ทW‹%์‚EฯศŒsžžี7ฅhฒ;ฉL‘"แUH`q]ฅ†‰k‡."  HGO๘GaŸ๋Wด6ถศ…$Rผ๒_€}+็ๅ–—ฃทDQŠ8ก_= ฃvsŒใฐ53h–๓ฦ<…Wm+Ž?ตh…ง`%น='ำาง#ทHํ„‡*ซุ<‘้ŸJมท. ešTau†า;จวJล–๒‚w`๑nํQzƒ^ห*q2>fฦล๕ฐฌถv7h้–FKg็ฎ;šŸ-zดพ&O-ฤ_w €?ˆtญW’I&ูL็ปv3Wl†&XใๆO?๚Vณ1zcb๒ชญ€k9Gิฦ1็แMนQDZD2ฯ~*=g&Lyx,kV)ุMๆRุ้‘€+,r fUlƒN9โญqGBวณ‡ษฟม— H๔ฎj๛์หม:๒M๗†ดด,ํเIŸPัํ5:ฺ_ฃkw’ๆ"๒’ฒFลNฯแ็9้ืŠึ|Q‡ตํ|‰๎ Q’๏ิtฮ}F+|[“ธ:๙น’เ๓[O๖hำํuMํเPฃhใ่kง6yๅiไwG ีคY‚.๒ n~!ำ้YcVP๋uๅษรpk<าˆ—;๘EืP๘#<Šยโ‹9ษซgž๋ฟf~ ๑“>ฃแ]6'›?พŒ“ูŒs๎k๑งู'‡t:+q|า$qC-ม)>8`3๑3เ็ฉd๗จฏดป›Pำฏด๘ัต qfกฬaูะ‡…ฑƒ‰9สบฦŒŠ๑]ํ6ย๏ํspฺ ธนxa‚kคŽ/(ฆ๏บๅ|๕วรŒึ๐ล<ะn<ืSHฦไฏ‹>€ธฝŠฺ๚vy๛Ÿฤ•F:เ๐};ŠูตX#คำP.Fษ_Qž:ๆญ๕aซ-ซม4wฎฬˆษิ๒O|qฺป$ำึ u๛ย–›ฒœ็๋Š{า;œฑล{™RKv\-ศ๖๔ๆถc‘‡ธวฑ๕ฎvๆ๊ปx˜ขฦ[wย ่นoo•n$ามNๅ=C๒๗ชฉ5๗‘W‰Ipอํ2ส๖.AE;—lGV์ตp~.๑fเA j-‘ofมร๘,sœ๑œืyฒสQก)ฯรธ|'Š๒฿๖‹๛5ป๑‡‡muMMฎ้ภƒบโ๒Wฉ๘€๗`95ืงX๒MG/Fqg฿Ž ไ‰Sั|qmuฏxNi”NR้'‘1์•ฯ€ศ<๗EI้—ฺ…ปสaE1”!€ฉวUaฦๅศฏ›พห<\|โฏ:๗๏JนVติ`‹—)ุ€‰}Gs_Ex7Xะn—Z–—zd’6&{{ˆยHRฦ0วvF#=วc]Zอ$ด๒๘Uรณ3)ช}Ik›‰-`’{FŠHB๎karsฦ3มญm R…๏R5ัั‹‘ๅI#“ะ‚G~ึลฒ„eำงธP๎๒Aฮ=\นฦะ}ณ๒จ+m _๊ศท$rฃ i|ล">2งฬ6H#ืW4_vnๅL›„สท2Cธญ‘ภˆฐฦeมฯะtฎขฯQ‰,ขณด,T(K#rอป๙rN*K-jอ#ฺุ˜#qฑเ˜็HœŸzมk$2ธ3๙ฯํฎdฦ๕9;วQำไEm(ูKๆษ่๕๛า[™D“น))ฬqำฉฎJ๖บ[ไ:0&X‹m!ŽBƒ{gzำXด๘็ฬ\ไๅCŒใถ[กจอJ๎2;` 4๋บ?0ฑ`ค|%9ฦy=KXyj์ป›jปtฉm*๊ดz‡โลนSœc‡ห๋Zjฒi๙ยtดqูๆ6แ•๖RrGฝNถตฏ๊zํ๚ูAbmc‘ฃDš-ธUb?sิ7'ฎ8ทaฒ[iไฝฝ•.๎ฆuq*€ Š‹ cๆxฌฅ#s\z๚eษ'ฐA)๓Fา;.Gฉ๗็“ลqšต…รn7สเ’Fz็ฏสฝวYพŠณน 6s๐ใ๚ืโMSฮนX๎–3ฉไง8๙Rฌห.%\ณศ&ำๅ‚็๏vL๑ฬŸŽn~u=งxฦโ%Š;่”ฤ7,qช,ไ~7',NI๚WIuฆ}๊A,Dะปเทฏศื;ฉhแ${’ฎ~u1สใร่s'<t้tsN–Kศcนf‘๒$ว”b เ๎วรŒc~!“[wRว—ฬo!I]ปท pp๐ฏ#Ÿ๋^|4๋›kจ…ค~rD๙ ุ9 ๓ศฦ+`๘‹P@A 1น>cพWAแ+KŒนNcฉU๑5ีฬ~YšKฃ-า)ฺZO‡|€Iเ็้ZฃP`BฤHY–$>,p?๋5Vึผ9yง=ไ‘‹[ก0?w๒‹œ’ํ’๋ŽEWTป๐LMตไทpซm}‹๘พb0{๒Wๆ5/~‰ฏ›ฬะิฆQvPห5อฑUvภ3ภ˜“๋Šค–๐GjcนดwImาmdมBœƒƒำžฝ*ณ^hr๊"$™&!”M>,Y=6ใJzะึntปg6๚8ทนศ’gˆF์x$Gิ๚แ|๑ลkmw*0”า]Kฌ๔ุ๕Kทตำ-o"บPฌbšQ,lฌrH|#๓๔อEฺ๊si๒Mo42ฦ‡$!#‚z`ŽชH๘ฌ๚Vงsก฿Ewv~๐จา‚GeW2pKฒ๒O—ฟฌ_Cu!'iGว$ฒฐe;‰8๒Tแqฦ[nO57 ซLขศบ3™นC’4&)ƒคใŒใฏญk])[ญŒbLขGษษ xวทLฅ_9ic‰œทcƒ์=ฯSW๙Bฒ-ศฬ™๘OP;๏ลWง(I฿Cj6Hก!# ƒ€ฃน๕ซfฐภu5Š4š1ตนn ž๕q‘สI$๓‘\ฦW\๏‚ญฐdc;Uฺ|qณ’๊F? ฮ1๔ชป,•ก๋๕ฅขธM๊[nˆu:ต๐Vษุซu๛ษeu๙Vvkxc*ื-ฯRีTซกy/ค!ฑยŽ€žMHุ]ล–n|ๆุู,ื฿฿นจ0ณnEฺไ๕'qฌ†hฃŠI๏ๆhกŒgฆๆŸแ๕ข†ๆฃศNน4าฏmฏukcj\ชEฟจ\๑Ÿึน ุฟนkหูฎ\`ศูะvฏ_YฆลไโŽ7ู๒ล]‘\ œ‚๙Uตyฺ%ฯ9ฯVเบๆfž]๎ฬวrวž+)P•*@R”ฉ$R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JU#๗ชUsB Rชqž2ฟ5JJR„ŠR””ฅฅ)@)JP R””ฅฅ)@)JP R”ค๔-wRะง๓4หษaBs$9ฬ2๑‚ยรŽj2•YEIT• rF๛Bะง›รZˆcฑญอขห6žฦ9์ธใธVœT_…u›I4ัฆjืs$ซ.mค™|ศั6ใหชŒ:tจ๘ฒ๓Kำๅาn๗฿๘zs™๔้ yฮไnจูธ=มญ/ลฆGฌK๛e’สEYฎHˆžฉ“๘ฑว>๘ํ^ูœ ๔๙:uM}}zšMฉ|K๑:ไiฌ.Œ.าD $๑Ÿj๕ ๘‹๎2คฆฺ;…สญ๏Œ…9Bผ#Gีไ-–ฃ78ฤ3ปrec้่ON+ต๐ ะท•ัฆดยฺซอ*„‘<จ€/&๐P^™'ฐแตขHRยฮ฿ษ0ฤ.ข^(ƒฉฎพƒยแท๏W?ƒ†r์R”ฏHจฅWงZฅฉฯ \ลy$้ๆ,ร•ภศnฤfกเ†[‰pF๒ศ…MKมคk&‘ฐEฮึ‹๏Jง๊นฎmKล(KXzเŸฮดำB xผฮ‡ฏ#ะ๓ฺฆlๆƒ&}า*๏| =ฟยฎŽ๊4\v1่?ฝ|โkน้ฉ8๑Y-lฟบคN6nฯ๚อ๊ึ๖์~๎๓๊rvŽ๔ต!4ำ’ษb'9ฬ็๔๗จุาฺฺA๗‰๛ƒOภช9จป๎oญื&ฦ–dชŠฌ์8Ž1ีDŸธb๙F>udะ.ษฅlŒไ9ฯ๙Tฃ1‘)$็็Y7nู†กถา9J๏๎rlF`d้ƒ๑‡น’้กŽ[V‘ถ6ึไ‚N๘~ติYฦ๑ฑ˜# ไgึ ขf™ฤ์หวQวCŽ€โฏ’4๓ 4i ”ฬšœŠs"e’6bpd9}*&๊฿Rำoพ้ๆฦๅd*ฅ€PHษวnต9yฉ,WIj›า8ศ$ถแ๘‰ FsžO็RZc]ล9Yคyrฉ"ธมnฃุl๋บ*œขบฺ{‰l ŠIQฅธ}›ป$˜ญ0ห5ยณ#ค[ถฌQ(ํž๕%ญ้0K›u\,ˆ็oBภไŸฏZฯฅหน๓N_$ž2ร<เZๆษWวr|็(qษžt[@ำ™\*อœไ(ไไ๒Oสก๕Ku๘7\@ฐ+ต—ŽN}:|อm4ƒQิ#ŠO1"Nผใ9"บ)Bฃฏซcพฆ3o'ฬ™mคQB Œ"จ @้ลf1ฉ&๛ฺ†6บ ๛ฯฤwm”๒ใ=๓รb;Wื ีPึ์mฌผฉฌ‡˜ื7ศศ`6ชœdrXŒ{˜ฏ<๛Q๐รkž ปฒำ์~๑ษ%’–oŽXม ็xS'ฤใœืฉ ฮ๐ๅOณ๊NHoล๒9/ณoโ/ษ{y?ํDŽYYทDวlrgฉlๅO=y้]•ืˆui"k8๎dธƒzฎไสฐPrOฉ=|นแฟ๊ีgŸL“๎๗{˜.!ฒ(`Lr#U๖#ฺพ…าต๘uฝLื4่ใŠ)™Lะนmๆ\,ฑิŽŒ;เƒ]zอ*ว-้pสaฬฺซ=3H˜K๗ถ_#;y9ไu$c?ตฅดฦKณสž ๕วฮน฿‰<ูV่LB๓,ƒ๗[[๕5>Vโ โ6F*๊@มถGงฎOZ๒rE>ํหโIˆnYXžฯฆ๔ซƒq+‚$Œแ์jKfž(%’๋๑มศเ{ิถŸ๓บ๗‰A๗95”cRฃ<๒R‹Oฑเ฿jdฐxํ]ฝน‡๎ฒiRjPฺฐYฃTO-ีพC|Lู ฃ‚ซๅห;‹อ:๊ ปIงดปŒๆ9กbŽง˜sะื้ญamซiw6„^uิfข,T:0ร) ƒ‚+หฃ๛๐—ล.™stK’๒ฯ{&Hศ!า้œwฏcKโQว ษะ๒น|‚x_ด_Yอ ๑ฅ‡lc"๊V<ฯ–ฎ็็ืŒœ`Vฏูทt i7:ˆ,ต#o๔“ม5ฃ,† หต‘‘ศฮ ƒมNk๊๙ด๋,4]&าM)chR๐…l็๕$็ึพ}๑ทูMœ๚คณ=ญฤK]ฺ[ฌสq๘<‚ฎF3ƒษํ“šœzฬYฅ(ไUี๛O8EIu&-พั>ฯ'€8ืoleh๒ษqe6G_‡)ผ?.zš้[]๐ ตด7_๘ืI00R<ฉI—žฦ1๑๓็ฺพ[๑o‡o<1ฌ=็ฦŒ7ม8Rซ4}›{<ƒ‘Pฝ๓ปึƒา”d้˜ผ’\3๋ >ั<'›/ณhmFํŸp~ฑ}}s๙V๏‚ผCแOkbรš‡ตKe>S[ษ<`€ุ.*H8๏๏ไ<ŸZฯงหง๊ทถ๛<๛yT2คƒœ้Uษแ‘qj/ณI;>ไฝน’วฤํ C$rs\1วไœใฯตuww๊ึซxถํฮภปzใœ๗ฎzๆ๑2KศB~=ซ)*tˆœbŽZA ศBจ$ฐฒ+:\๎cBXฃ9๕ฝl\…–ใthุุ \`฿ฅhู+ฮfnXm%ฟงๅšา4๘g3\า3\ย๓4v๐ปpน‘Gฤža9nใษ๖ซ'|‡iŠˆˆXำ,•SŸ—\ฅfM„2ปฦ.@]๘{uใ8๕จ้" ม•Yสฤธ+ฯ๗็๔ญ๏”K[]žFีsผๅ3๒ฃศQWŒ9<Œ}k4๋ๅˆ„`์๕'ๅอRฺผ^ภ๒ gห๚zdเฅYrZ๘0˜™v •_4ŠP@๋ื5šๆ;Pค ธ8๓*Aฑ๋วสฌx#‰6ซๆN2P}=พUœ‘I2>EtBฃ%Ÿœ็ŠชศหY Œใุ ’๒ฯแ+นวfฉ5ฃษn3ำ# ฆW“J]ฯ2“สgึฒmวโflๅณœึไบL฿wYCFaภ,เ๐้ด็ธฒŠ๗wE‚@B฿ะญๆา‚ฟvYmndบ*ใปR{z็uื}CW–๗˜ฦr3ŽNx๊อg\–๚!onฬcฬ‡ีฑ+EKX;<แWอi„RHx*€๔ฯ?๘ซ:œžMR• ญR”ก"”ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@>€ึo1%ไนS†STรcŽ1ŒzŠรJ†ฌƒ+ฤ”M@+œ0?/Ozล[šU้ฐป๓ย>[ฆ๑ wโตd`า3*,jNB.pพร5Tๅนฆธ๕$ถ”ฅ\ R””ฅฅ)@)JP R””ฅฅ)@)JP U}j”เฉปอ&i'‚ฺiY‚(mค๖ใฟ|uฎบ#_คpซธQ:๕ ุ0๏^ฟ:๓ผK๒ม8+h‡๊z.‘ฌษ`าn Io‰Xไcะ{sV๊ป๏cœุฑ‘eดˆรฉ^›ื8ฎz'YF๘ๅ.rIสŸLJษณร"$รฦpฮHใต|โmpหฌฎถหกงโ”}OIbั7ฌ๐มGP8Žใ+„๙WซLฯsauzัฃNชม ไm๘ณ‘๋ž+‹ึ4 ้nld†๒€เฉ=@๋ื๐\qฏ+#ฅ๚(๘3ฌ๖vฒ\,0ธ๗c€>užืIพนๅ-คD๎๒ช+กา4ƒงošic‘xรฯธ๋^ŽงYR[ฝ=สJuะึร–สูธพ–AŽ|ธย๖๕9จ^า 9ขKy^Lฉ/ป…v–ถฏq"ฦ˜็$}ณซƒพ•n/gUes U่็ลแู๓g›”ๅi|ˆŒญ™-5 ซ8ž;Y| ไ*>#๕๚ิˆ๑‹gˆฺุณ˜ด•ษ/บŸ^ผŽjช1‘‘‘๓ฏUโƒmื_ื็๋๘““ไฦิ%๋ั G›3๋zVฃkrMรไจษ•9#’F{็ฟzำIฃCuvํ|าKๆ\@๎๊\ฮ็๕>ฃฅกฐม๗•B@*า•๗๔ฉศC+j๖๖mm/&Vt%xศ;รd)๔๗อj๒O /3M๛qŸ๐[jช!ตi,ฆิฎeาํฅตฒg&($“ฬd_M๛ึกโป›ํ7G9แฒ‰ ๎GI6ธQม-ษฯ๗ฎ_Tำ ด‚9ํต[จŠ์F๘ืŒไŒtจำ๋a›แIฏšBUมJ:F ,อูด”[ๆqŒ‡ญi•คึ5*๑ข'ญ.Q#กษลsz•ูทบอผqฬฉ‰ฃ1 ฎจ๛ั''B0๘l์'e๊& ๏ฌd’๕.bS *ct๘Xล๏ฦาฆ4mG๖•ŸœฐIPฌƒำธ๕ึถขถHๆy9g^฿*(ณexพค"ขฺGlT—D%ค เœ๖ฎG\ืu 'šฮkน7G(ฦ,๊ ๗9็๔ฏI’ึ60๐ตฌi6ทึปnถป$‚Deu=๙ฝ iƒ‰"ห2“๗8 อ5ฌฟณฐว^1๙“วถญuืฃปœ๑H๘G!qษฯญhX่‡Nิeฝ‡(&%ถž66{หฯ!s} 9"i ลy_qว&ฒฬ๗Kƒฒ ฿›x $ป๏;?ปtSว tชXฦ๊ัฤA๘ฯ&ด์ieU$dny‚็ืžต;rข0uว็Tำ0สิ^ญ™๗9Q๓=*&๓โŽH-้e‰-‚G๑N+ “tlrศฤ๋Zำฯ%ฝโ1UT6ž๙ฯ5xตี™C่;อ6ุ,Vถ๐Bฒ+"ฦ>๔t=อBIkจ[K,K‘๗ล&ี%@Žใฟ'8ฎš{คšrผ‚นเไŒ๖เ~ฝ8จํ\H )k#Kชpชpง#9>ตัF”ไ’}—ฺ Jลฦ—ฎ8Oผด–ืช?zภ ™†78Wฺsฮy5/๖{eจ๘XะษSชู\56่˜yใeUfฯ๑*=๚tl> ิต„ำ#IoํฎMโ๏-› ฯ,0ค๚Wอ?ฝถนี‚ๆ๗Gมมพ‹Oชำywส๚GŸ’๑ไณํ้ฦSิถ๗?๛A๘๕˜๋๕ฃ&อฎษBญด;}OzใuฟลuK q+€Ž๛G'๊k’ีumCW•$ิ๏&บd_1ธ_่+Fฝอ?…b„o*น~'<พ'wมีŸ_ษ$+4%š‘ๆE ฐ๕ษ?งJ้e„2# mๅ ":=ื?C^_]„๕tถfณฟžQj๘X”หไ๕๘GzฎทA›๐ชkทฉFซ“็ศh‘žง!0*fvpธlt^฿๋็_;๊i’JnัW‹๏o+ฤ0 œํ>ุ๋Xvซจc‚น9ฺOLsY ; )Xา4๘่8๋ฐดc†ŽN์ีิฌม™onแ”ว็ๅ‰'s–ห?ก9๏QzๅฎŒ‰&ํฦ\”Daฝฑึืย้ ภFชwaŽ:๔๚Wœ๊os&ก3_๎๛ฦ์0=‡l{zW~‹Jต9>'ย~ป–Šณฒ๐พบ•เดžั"๊มึCฏsตตฏ MB{k;D.Tด๒ ๎BŽŸ™ฌuพ”.|๋qvผ๏:A”ม8 พ˜มฯ95ฌญ๖ฅ,ัขฌ…6ฎจ่OนฎZ<3ิษ(=ฉ{ี„ญตุุี5ํCRŒล4-๒uย฿อ๕จฅQž)J๕๑ใ†8ํ‚ค]*่*๔‘‘$E8Y =pr*สุณดž๑mใ/ฐnn@ภฮ;ิษฦ*ๅะ3๋TฌทKm/—XยญzัG.ซv–Vาก‘ƒศŒซ€I$ŒึธลG‘สคmปฒ…$ื~@‹สฐ sป;ณYา W%œ็฿ฉฉาkพอภŠฎO8duฦ๔uฯMสFj„`เ๕ฎํbkv[่„e€~U}๋ˆพ6๏v฿t`ใ๋^ึW๖”๘ช%JJ๚{ŠผJัซ$4j฿ˆoภ?AXฝ)]’ลX–$ฑ%$“œีปG ชดก%า;ษณฬf}Šwเ€Uดฅ:y๊I๙“U$œgทJPUwร)a rภu>ฟJลY-๑็*พv?ยุ ŸŒญB๋D R•$ŠR””ฅฅ)@)JP R””ฅte5Y“!NN+$ๆXข;™”‘œ/!IฦIท\ึสา!Asธๅ˜ t–zT;์ C‘šR• ๎>ลด่๏ัดน' aำหj ฉ1 หาฺOฐ5๕žฏ%ย#o*rG8๔อ|แ๖ ซ้šoํhš บฌ๊จn็0s•\~@'ืฝ๊แbQlSภŒ็#พq_)โ๙7๊Z่v้๓ฌ1๙ž‡uฉษ ‡๏ฤ„o<k=ŸฏY22N6<~uๆs๘อฆhU~-อ๘ไdZ‰ฑืฃ[ฌ) แŽนฯ$ืตKY3ฅ๑3Lั—หุ~6 =OตLวโa .๘ศฯ?‘่kฤโึ็š6”ษœ เŽ;gjr+หฑฅส๊๒—*vƒศRGงงต{ขห,%‡งIฌฦัn$);Sณ?@?_สตฦณnH<็Š๓ไพiํ‡™vฎaยn‰v8ฺGl;VwฬัykpาFฝBBŸpsGhJ)t'เึฎผ“ ฎ๛ส v@่วงj•ถี“#k|[~ ๛ิŸqC!ู”`p=ฑท…ฤ3N‚Q8'๋๙{Tt่mีrm^5ฦBชรkWJะ^s2ฬ3 ๎Žธ๖จ‹ฅuืไทำ#‚H„าHฟ เm๕ำู›hUฺs#ใ%คใฏSŠถ็มmญจ๊์ใX!T\mŠอซ,J่2+ƒปwโยพcFวp;ฯ<๛Tฟ%†ึึโ[˜็"šm‘วฝ@ฯยทญ_IGƒ‡&ฬŽ”กqษ๒จฝb฿S•V=)ฌ c๘ฆนคง!A๏ม#9ŒsฅxยWำ-ต uทŸ? ห‡8่1๏าฒโ@๙{9(7rp9ฯ ๗ซ)ฦ2ๅrQc•Z6์!ฝ‹Kถ]zK9ต฿rฃˆœŸยฌฬGฮMGk‰ค)๏m2๖…ศ=;๛ิฑโ๔–„S ‘N8๓๎~•ฮษฎI’mยฎOฤมs€x๋Xพdูด$กื“าt€!Y]ถเาHXœ|๊๙o"žq‚วฺO \d"ึ๋$ยUD`ŽฤไN3๚ึ์จืํk™a‰1h\ซœžเีvฮ˜ย3n]ฮพ$Q Fตฆ5|™อGฺทŽ๘ฎOฤ๚รลu !d~6 eใŒŸะื}ฏJ$‰/Šุ^ฃื&ทว‘ž\๑NขzฑcYห1’`'Qๆพ~8ืœใำ ๐ทKฟฺ้ญ”Iu;&’็ษไ4ะedo๙ŠcŽไž๕'Œง7 ’\๙l m ช;uuฟ‘ญMo˜๖๒สผƒH™—ฃ<l 1ž+ฏIช–›?&HๆUงŒxฤcรฟํšc๘R[L&๎~8ค็ŒŽ‡ ๚‡รถgMึฎ!ำ@‘ํ$!VC€ัH7จ?๑ J๙รํม‡รWฉ{ฃ\ห}ฅH|ฤ•ภg€‚GNT‡ภ@"ฝJZmNใLีžiฆ‹UฐŠYŠ1โq๐พ{ :ž๕โ9vๆวสvŸฯŽ?q‚๑ษฉ}}p}˜หป  œcโฯงตE]C๖ิw‚49‘Šไ๖ฺน]ลท+–ฐM Fห๑&€[žไื1โ฿ถ-CŽE†k}KPˆึะศๅƒๅK(๎A8๗้^V=<ง*„mพdcห|สuHdทY ธ‡ny]มHเ๒+ห>ัพ4฿ kZMถ›qจ๊Vเ Jซ l@;Kเ–8#8็ฏ ื>ูผU~ไi๒มฅEŒๅใ †Gn€W]\ฯys-อไ๓\\สลไšg.๎วฉ,y&ฝญ/…;ผ=™ใCะา>ื๕i๖–WQลงร+J๋i+จ”‘…3ุg๊{W›า•์โล QHๆrrvล)JะJR€R” ;ณ[ฃก}oปHD g(ใ่MzฤSKs๏ƒIpน๋ญ|eu%•ไ7Pผ‰ƒ๋๊>Dd}k<{ลc*–W_ํ8m˜8๚๐ฏŸ๑L;r๙Ÿ๎Ž>J{YาXXZY<—Y ฯ\x๊~œไZZœะผ^d !ต8eg’3มญMMg–E-ฆgY?ฦ@๊1ื๚๋ฮ~ึ„ฟ๘B)™R๙!•UฑœvlืŸ‡›5 ๊tf[bs^(๑ฃxUท—Xใ@๒ๅFy๊9เ{ื7cช [N{๋lร$ฒฐ’X=7{ƒŸฮผผ?ฅuพ›1฿[3 คแB็<๋๕เ็๐ศ`ำน'rU๕Dถvฒฐ‡1ํŽ๕lc<ำ„’ป3FD *sZ4ทRKb๒c๑ฯืญgฒฒˆาะ์มเ‘฿kล๖&I๒mKn.foผฏ–qร‘ภ๊qฺธฟ้P^4Nฑ  | >็้๒้Wd3D`!๑ณ$๒2}=*>H$™ยƒ#คŒ{ถำๆž))'Lคซง˜อร3G4e%C†VƒTPrqึบZ{“œ๘GืŸ‘>ีมโJoNิฯๅิ‰t"y4ŽFŸ ]’ ™Wf๔Œž8QŽิพโป‹ํ]พ ฟฯžใ?–=ซ–ิ>๋ๅฯ*,๗~'‡Žฝj?ิฑณซ3ญะ(ฦ:ZŠR,ณN/ฏ [๊ $ ้+mม;ภRG๐€3X“ฤื6ๅK;8l๑g่y๖๋\่ธI?tฤ*ํ๓ท r9๙ญ ฐ๒}ึF",๎๓9 ๔$๖ชJ5ะทŸ]G]x^ฬฎื๐ว’{q๒๋Žzš%ฝฬŒn#jๅ†Ž™ฮp9๙WงG%น!€u*$ŽLwว๔ศฌ—oสgxNูNึˆฐพYํJdK,šฒRส๖฿Lิ„๖แ ไi#mุP@c€s[ท~ ๓-คi.คฺูU˜ภ+˜นธŽXHN๕ๅฦ7ƒฏNต.ฆ$ญฤn‹Hr:๗้ำ*˜ฆs๏”z >|ฟvู!l ขเ™๊ฝ#๑d@ญไœ8ๅ“W'ๆˆไ-! ทL ํ=ซ Nฑ‚\n$ไ็วึฆน)็Nฮ๒#&งq‹ซ‡{Hสฒฐr$ ?*ํŸT–I…ฦุ๙f-ษ?Ÿๅ^1ท,WบJ€ฎR2 ๚:ๅฐฑŽไง ฯZฒ๔:q๊”กจ๊Q@‹q1(yPpr[ถzๆd๑œ‘]ด จ f$๕ภ\ื+?ˆnๆณŽญบ00[,‚+@N Q&ใ8#lœšนะ๋ตอjMRฮ7—ส_,–@ฝy๋วงตr7๗D0“v7/ลโ=*๖;c$0ž9ฮ*2๛dฒคnCะ็ฏญฏƒ—&id6!XdถyZT2ซฑAa็ วฝJhzดะ๊Z|BaQไ(%qำ5 ๘UX†Vๅ1๒5ณm{›eฑƒะŒr~CŽตh*/แVŽ๏Sฺ–ข)YgW€ฌ๊เฑt'โ:œ๐}:Wœ฿๘โ็ย:ƒiš…ผ–รu—ํ[W2[ซ์Š€สvึaะkัด}oG@โ๎โkซลฦ#’rร9b:t้่*c]๐–ใ๋K?ฺั4ุง—ล“๙Sดy'สlฃ+ ’sŒ‚N:œ๖้ณc„ฟๅWฎOAลๅKห๊|ลซ๊๚†ฑ{=ๆงw,๓ฮ‘‰ฺคƒhภvภญฦ#Rร | žOAล}_ฆ—๘;๗Gก@“Fงห™็yฮ์๕|เ1วb0A]๕žŸงYฒษgeoชฤณG”2ฬงใ$w<ืtผg5XแeVƒ#๛ฬ๘มผฎลแหญrๆมํt๛vE-u๛—“qฦcVมp ใื็QZ{Y%์gRŠๆk>|ฤถ•b๑ฦ•‡G#าพ™hF฿G๛5]:ฺ?^*•šfvEONsรวล๎+ๅส๏ัj%ชฤ็5V๘๙ู๑ฌSฺŒ“˜Œ๒d‘!-๐,Ž€๗ OะV:RปŒE)JJR€R” +าป๏kq%ตด3็อฑ,8<ด,zpMp,rs[บ%฿ukYศ…pz<:ไึเ๓๑5rพd[\ฃY1<ฌ‰ๆ@‰‘NxgฏนํŠโ>ำ5‹iง0-5ษYภ 6งb=rJ๋ด››‹co"{f๒มxศ ฿‰วOOฯ5ฤ๘๐~ฺGk@wYK!]ํฬศp>ฃ<Œ๔ฏE๓FR่พ—๊o—*QV๚žyJ‘‘J๚“JR€VๆคP}ฮ4 ˜ญ‘Xๅm๙ึ™ๆฎrKUW<แFCVำ ถบOว ิžI%)"ทจ=ืZๆ๊wมฌซชถ๎Š…ษว?ธฌ5_๚g๒er+‰!โMํum7ห,ถdสCgiหeAว=Ozูำ|JทาbโR๋'lg&9Tƒsศ8๔ฎwฤ6๗Qjฯzชฏ;ณ*‚ ฺ:p: bฃข‘โ‘d‰ŠบœฉrGC‹&ž1๏]_สยฆญงk๊pศbbP<ด๙cž'๐z๕๋Iล'เม้ป;ฟยก<+ญฯzฒูฏ_efNฌรแ=GZรโ]tู2ฺYI ๒เ™€p„๑B—ู๑,w`Rชธฯ=)ุW@)R]฿์๙ึFhฅFYก#Œvฮx๔5ซข3JmิเฐเฑUฯS*—2โโIv*9ภ$๙ึSK-ม๔๏๕๚๙เณYเ6๗eฎR ๙่ข@งx่0{U๓YA5ไLโHvิ•'\๓๙๔ลl้7!๔‹จงx @ $;~>O/่qŸ˜$V ง[‚--e’A#Tdชฃ;ิt็พ+‰สnoต>ฝฉsฯเฏxไˆฅTŒ=:bฉ^‘qJR€R•SำiUIฯaœs้๒ฌฏk4Lซ4lฌGแoOQ[ใ“ล-ัtสต/ผqsร%ผ๒C:–6ฺส{ว]~ข–๗jซq‘ิ`Jงkฏq๓ญSi`กah\ƒ๑bฤz๕ฦkฺวโq[ข๏‘ธๆฉR๗š3*๎ฒ/)ba๑ำŽฟ.ตA†pA"ป๑f†epvY;)JRต$R” ฅ()JJR€R” ฅ(8=sjR€๎=ฏB๖ฉ\q€›$KŸcำำŠ•C<ๅ•ิฦŠIี?jiลๆukศุ#ฉSืณqุิ๊5]Nๆสุรvโ{ณ“3F7"๔ภ์œw"ผุๅŽn rŠฆั‡Xี…ฃ๙ G-ภยแO*}ป•s“฿ห/๛ยKๆืฝkน-9ุeiแท’s๊?ญ<ฝ“…l†$‡ศฮฺฆา%'.ฆX๏[xV*ศ2:_=๑fQmว|โตคŽ5*๋ง9s๐็้ZŠ’มนไ—ฅJ^„]}•,ฤเ๔ๆด3#สvน O5ฐš2Xฅ …ˆeN}วARlช€ƒอส6'ๅXวฆ1้G*F่ศ>ธ=M>ไ2H\ณลฑ๒FF2ีBลฅRภn0NN{jŽR@ืฏฮทbœบํ-Œœ๗ช๒‰Œ™ณ>>49ฯZล2ฑธD_„ธ๊'๋Yโ‹$‚K?แU?าค-ดฉ/d๒๑ฑ๓Œ7ฏJช‹|ข๐ว)ฟ„Œท_U›*x*ฝnศ๋ยฐฆฤเฬOยXg‘ืกฌฆ]Yฬชฑสใ JcนกC๔ฌMb‚yZYIธ ๑uํŠบดอฃ ว†‰ํส+๖yDKœi’๑Œ7ศŽOๅš๋…โiฉ$ +Gp˜฿โRxa้๎*ย{‚ๆItว‰"ุ<๕*` ฮ {s]ค‰oqoW๐™P๙14ŸŠOง มฦO4“ไ๖4ัp[‘ง๊7ฐฌ๖ลห/„n๖ไWcoฎ๊Rฑถ-PเผฒHกDjฃ%nN{bน $Kms1ซquPxฦjํทฦ6ฺ?„Eฑ\j:ผ[[ |oŸF  ๕๘ฝ*qแyฒ(Eu:ตa<’๊x฿ฺ‹ค๑—‹'ฝ >แ6ึJษ Hb๑6w˜ซ‘ฅ+์๑ใŽ((Gข>rRsnOซฅ*ไ R””ฅฅ)@Whlนฦ}*„d`ึN ไ@๔้X่B&ฤZƒ๘~m!ูWFw`Kฝฎ1ภฯsR> 1%๙„ศ๊หฯ„ใŽฤ`๓\ตmi๗๓ุ<oฐ๏0uศเไWฃJง†X๑ชพT&ฯˆญcถิ‰„.e…I<–Gฦฃ+5ๅิื—=ห๏‘บ์เ ร]c(มFnฺ$R”ญฌˆ›แ“ldฒ|lู่นวO™Ž” V๎•~ฺmหฬ‘‰ FSi8ต]kง‹ซ1,3(})วฑ?ยฐYMiดสซก‘ฒ2:Šมไล‘ผM๓าˆแ๐t๚p๊บ*ุ!yีถใ,Œ7ไ@ศฎ@‚ Aม`Š่|/< FVฤjญcฎKrA>ดี-๕DƒjIo็ภเ๋่kƒuค›ำฯ๎๖?_์ชuร!-ฏ.-c•-ฆh–Q‡Œ‘๓๊>•€p0:Pr)^ชI;Eล)J’J๓@ $ž0:ัAb‚ฬz3Sz]Ÿษ–Rขq•Uฦv๚ž:šรQจŽ๋่Uบ"ฏC6ษ8 Š ไ(๔‚งตKh'A;ศa›ษBCcื TDq"‚‚™9qฯฅWMž9`šDE๐nุฮถeพWžVŒบฤ0TsŸ~3ํ]Ÿomiง,๑ƒl——ˆ=3๙ื๎ฯฤœ(Q์j฿MZqง=”ฉฑ๖)eๅ}?*ๆี่๒fKlŸ/ž{{.ฦฬขชjW!+ผžkVชI$’rIษ5J๏วฑQ}‹!Wฦป‹d€ช $Oฮฌฅ\ ฏzฅ(Hชี)@Wฟ4้๏Tฅylูภn1ŽีNvpW“Œcšถ” ญS‡ฺ”ฉ‘ž๕JR€RซฺฉBJŽ˜ํN‡ƒTชžƒŒc๕ก\ไใžxซjน๘@ภ๙๗ชP R”$R” ฅ()JJR€UIฯ`>UJP Uา9’Fvฦๆ%ŽOฐซh@ฅ)BE)JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()U3B R”ก"”ฅ< ์ผ!c{ฆ5อ์rA$J2า็โ\ศ็Z๐œฺฮŸ&ชืยสึใdะ–ฬฅUC3`เmมฦsœ๑Š์n&†โqˆ™Xฉ9iม'ƒ๋๚ื‘โ:ค“รฤฏWFนo#3สฟ๎ศDB‡–ๅˆ๙๔5Š ศู ฯลœฑe๗ไึŸ฿UทฤŽIษ์น๋๕šิk€e|ทฑื„ใ|ๅ่nอ}+–P๘L0y"ตe“ฬ –๘G๕‚IWโ)Œ0็'ทตaIี0โ$‚q๋VŒx*฿ฉ{Œnexm$s๏WFD‹~,|Cนฌ/0y71ฦG/z,เใ(Ž+JtE’บL05~vีSฦโz{ิ–ฆc•RXš;Kป็q<ฃธโนฤŸ‚ญWฯp>ซ}J๏นKฦแUx|๗ ก…ตัข+Ÿ5Kนr๎ํฯcŠ“ทส"G*ศฉœž9ต|–งo-ช•‘E'˜!}๒3ž„Žq้ลCคŒำˆใˆ[๒“  0qาตUF7Q‚j‘ŠH†HA16ปeใ-žฟค’ษ-ษK(ภฺOJั$ฒ๚๕5\*Œ“์EUยRRCภs๒ฌI8N=qฒฝŽO5ญ:4S:c>ฟJผR|0ัš…ฮ_oฤp9๋Rถ.๒U๒Iศุ;๚W<ฅErqท5)๗RฐF˜dหnuVๅว`H่8้“„mYT‘&ล•ู๐ุ yื"ฝภฑฎญ บ|ื)๒ZE”cwnN0OตๆfQ +Ipฐ&y @คญฏdดdตq'*๛นรp@๙‚?*ษ&Ž<ทl๎V๏V+)CuhหฤŽvฃภ-่Oธ?ะิB[ตฬM/fQ!\>ธ๚uญํ?S…mๅ{๙ํล›–Œฃ๗€„•้ธใoc]Dฯeqฆ‰` ]”7’ผ™8ว'ๅR๘vzธฃQ งj_ณุZ\ฌฬœ/'๑ณ}โ b็SีeฮูbีPTvP0์iMu;ฯu4“ฮŠIณฉฌU๔z- tชน>ัม›4ฒพE)J๏2ฅ()JJR€R” 2<“ฯ'Œ}G๚๚V:ธga็Œ๔ซhBฅ(Hฅ)@)JP R”อŒ“ร#ษlA`ธd'๑/~;ิ˜ัjฏ๗•ฌœŽ{`๚๛ื/[‰8ˆ[Mo$฿x_†Hษ$`wะŽฑ\Zญ7›ฬx—g}Š4IลงOaฉม5‹I4ฐf –E‹ uภ็>ี*ByFX'‡ ฌŠ1ž90N=ช่0งลผ>Uม๋ฯ๚ๆฎต‚5ฟhฤ†/5‹nC” ใไ1ว<๕ฏ.wšผฯผป๚ฟผณŠ’'…นWkŽ ๖ช0€0๎qลJ๘๎ํtฯ(๑นำ|=5_I‡#ษ7ล—‹ตe๒ว~C๐ฏ๚V{K๎ิด!6†ฺK69ฦkwEถ‚{YŒˆฏ.๐0ว:}O๔ฉsn-โdถa\ใ๗}[žIฯๅ\:ŸX›ว๑/^…\ซƒFฮี,เlํ’gแ˜๔rผ63ฯjสปคฦJ„Oฅl[[y๒ํ^"QนŽ:ŒโผŒ™e&็7ห+๎CksJณขฦ๎ฦŽ9๊ Dิบ๖ฑ—ถg›๏Œ€B็}1Q6๖๑ฒซLฑ#ดw8๏๒๋๙Wนคศฃ‚-ช:—‹เึชŒwโถ้ ๖ฤ๚0`ยฑ$1DฑฃฌำนคS๐จQ๋๓ฎ•–2tฏ๒k๗-fฤชƒัzU]YซฉVA๊+=†ฯ=ท๔ุpsŒ{Yฌw ฿nJ๕ถโ}๓Rง๑์ก|ัŠ•R1ŽAศฯ5Jะ R”$R” ฅ()JJR€R” ฅ()Jฃไใ้Tซโ`ฒ)a•šด‚ธื ฅ)J)JP Rซ@R”ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฌ๑ฮ,ฦฎw–9วL wมฮ{ มJฌขฅิ8ใ<๕>ตJRฌQŽŸAšญ_O<ฉ 1ด’ศมdณน4ด๘SN๒ผโ‹d*Y้ˆอEฐi‘‹ทmศ9๋€:๖ไตIถ2+HธP{``sค๔อF๏J๐ญ›q}u5ํฬ่ืDณษŒ1๏ฮ็หท=ฐƒ๋\ร1d—ŒWฏพS3R“ง}y[!๐Š๏ƒะ wซณavฯฆMby–ศช,ฤว’1ž+$™…@vท9มษเีผจ; ;zีQฐB2x8ก1ํ`๋บLrj‘ิยปœ จ'fฏs๑dc๘ี‘—9ฮ1ญ••ิไํ?ฆjnุ.wa€ž ฑุ–ed Aช*€ธ,ค‘ฯzปrฦwqมbsธิQ#i*ธฮ;ึฬp8+งทฮฑ#•ภAฦ8๗ฌˆฯถpฌnI้U•“ม‘c+&Xฦps๚Pฮล‡–Y@๔8คLŠป2ภ็ŽA“wม  งVE›S๙Z„ลpTRJฦฬJ๑๋Qwz ฃƒไ-ฆA™๗‘๔5 ป„สธ  ใ๘ฒ*๛ebฒ€ฌป๘Pฯฏฮฏ‹>\?rTฝ vœNกl๖7rA)ฉแ‡Fกฌ่1^Mos ˆU!ต2ŠุเไA9=}kU4๋X3X[๓ฯB1๔ฝ|^-’.พ‘ktqฎฯU๐๕ญส†ฑ m?;ป|๋ธ†Kyšะค‹ีMz}V=Bธ?รธLวJRบ R””ฅฅ)@)JP R””ฅฅ)@)JP ช]ส+œdzfฉJถ[ˆDA-ณ๙a เ—๖ข\c๚W‰โZg~tWฯ๛(ั—Qท บ-Œtœฐ^[ฮqาน๛ห)-๎ฦzืkดฑกXศ>žีฎอw0;Fฅc zถG๔๕ ิไใซIทๅหŽไ6‘p"wŒ“๛าป@ฦ2=kฆˆOฝ”ฉฺ cŠใฆ‘Zไหj‹ปpNยฆOˆศF๊ก#“Ÿ^ยญฏัO,ทใ]z›5อ’ณF–์สFOโษมA0ทVg[ฦฆ_‡’ร๋Q๋(๗{ฅท น€ ๐Sž+6ซฉ@๖๗1nrข0TpFyวฯœืtYทฦฏา!ฆC๊wf๚๒[“ฃ>>็ ลoหฆ‰ŒQยXีe(AR1Tฅ(Hฅ)@)JP R””ฅฅ)@)JP R””ฅฅ* œq@R”ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R”ณY\Kgyosn\ะศฒ#๓๐Aฯ\ึT5j๎hถ:{\Yj:5๕•xˆRK'๘%H๊˜ฯแ`๏\ก $Rศx'ha‚Oสข|#ซวง]ฯmz[๖u๒ˆฆมภณ”—“œ๛]Nฟe4J›.l˜G6q๒ํ๔>ใš๙ญF•้งตt์]ญ้ฒl;mภ็œ๚V)z…fด’?+ฯ;ปฃXศ#žว=+ิ` ‘WE๘ˆnไšฟn;ีฌน๘}Zตุ*2`cจุœ๕ซ–3Aฆ*ฅ %˜‹Œ๛TpŒŽO^•f2๊8๋ภซˆ%Yม'“๒ซT’ุ่@ํR ™ฮp8ฯ‘X€ ไšท99ม^œUไf r8=U‚ไVbกqฯlึยBฦแbx8 žรซ]NyวฅH้๒ํูฅ;‰ใqฯ้๓โณvJไฮฉๅ0*n€่+ Dฦf‘H;ˆcธ๐ฟ*!€Uธ็ะีŽฬJ‘งๅUŠ6Œxไั—ยฉ็ฎGถŠEศ# Ž}E[ฟห&pวŒZ‘ำ๖‚|GOjฝŒ;ฃSpเฆ๔Q:วปyฅุ฿Z4š…ข๙c*ํ#ŽA้ล`XeŸ|ค…Aมcภ_~ี”ษ( ตXฦษœn็ะuคdเ๗Eำ4pKชเ๓ฯ้ฑi๗ะ›hึ8ฅ%Tไœ}โ kช๑ค๊ะD0Xป88็ว๊Mrต๔ฺ’ษ‚2Ÿ_๒s/aJRบษฅ()JJUh R” ฅ()JJR€R” ึ๘F๗v5คƒw’ลœ ช‡~น๋’ญ gƒUท๒ัฅ๓สhะdธn0๊{+—[‡ฮยใ฿จGn๒&NโUr1XQ$น.yฺ;กU M๋DF2T๗ฺข$b7์>D‰ิWฬWื<›/5ผ…Ÿw™๐ฎ;}*Š–ษใ๕ม-4ฐท=2Iพท๕มG i๚w0หk'—sD๘ฮ’C,q$ฒF๋ƒ(ๅp๋S๘Š„’rฯŸะŒTค~%ด๒Ddฬ€ ผyงาขZDผW๒w๛Yegนs๘๚ำ5ั฿ม{ ย-๙E9e‡สURGร’=บิPฑžPV)b™R1&Cpเ{๓าทวฉRW5ท็สBอศ uฉ F๗๏๐ล&4…pv๏แไ๔๖jฆ\ขๅฺุ.โญ วฟศU–๖72GๆEๅrr†#ุf&5=หŽœ๚’๙ฅ’U.ฮภด›พ"8'่+Pใ'nHํšฬึ์ค‰Zกqฯๅšบฮ[–m๛็ฒฦย=I< ผ^›หฝqzZษ{฿อ$6ค๑ใ]ฬฐฎ„หฃุผ‹cr…qๆแ™ุuไvฎ/ลวˆปRสษ๓Tt+gcq+ุž๋ว>ฟโ*สt”>j–`:zgาฌฒนYaIa‘Yฦ`ƒ่EKAr\Hฯ*DKฑ#$0Oๅฺผ6ฅ mk’iา[ ณoฟf๕ใvb=๊๗K–อYไษNgฆAใ๒5/qโKK‹o&M?iษ"ua๙ํวืญk๊–-t•ฬ“*f2Dฉ๕้i],ิr๑„ึ2)-~#๘s‰ƒŸN๙ฌSFฑ,6aี ฮN ‘฿นญ@sŒตtˆQู‡#๓ฏQa๘ฎRo็&‹ ดกf}ˆฦvŸZญฤLัฮฅ]z๚sำ๓ฌUž HbB ผหB+InOr้๕๕๕ฬณ๋Tฌๅ#Qุ'u‘~%วธ๋•Œฃ๗๑ทq_ฎ3Rค˜ฒสR•bE)JJR€ญR•Z”ฅTsำญ)UชR„ŠR””ฅฅ)@)JP R””ฅฅ)@T๖วJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€FJ๕ ๕ตฯฺฬ|ห‹`–y๊pคDวdr{ฅy}N๘?\&จZ็ฬ}:ๅ qฃvŽBศ~!ŸLwฎ]f?.ซกhKk&5Mฝรล%QF3ฯ\ึ’๕ ƒฺป[NkซWE’&ž 6M ฝ ‚A ึธ้mfKงทภ2ฉวญ|ุห‰ลฺ108ใฝf‚4Bnc๙Jร$RFปeR่๓ขD(uิ๑FŒK‡$ฦค)?‰จ…˜vb ๋b;`ม76FyตŽX ™†W?Q๔ช๛ ฏฉ}๕Ÿ–‘ห ๔aZP€ฮ@ษcภไิญร2Wbžฬ>‚ฐวl๋p=ยl๓Žูขm*dU•EP11LVฬ๐[ฅป4M–~ŠH๋‹&๔ŽF+ŒŽร฿fี`ู$i aq‚Wน๗๙zU–QโอHb(ุ€ubkiWห)ป#h–/๒ฌ66๒ท(ฌ8๊+|Fd”*ํูื๒ซ๗6ถ๙l2Tฐศ?ึท5โ€#4\0ฦ๋5‚\o 8ภ{ึฺH–๛ฑ๓หŽv‘œ‘ตTtวบ#lโ77A‘K>0ผ๕็ตL๎1"2E‰Ž|ย3€ฝO^๘5{V]ภ*ฆzdUnีแtณŠFd ธฦr2สฌ๘Eโถซ7ไน’XธŒ(`\๐ ึฃ๕^;S็ฐ+’z–olV+ํA,ํษšPกHVnใีภ๊๗ํจ^4คŸ-x@}=~ตฎF๕S๘พ๊๚ฃ ฒrเร}w-๕รM9หz ืฅ+๊#Kข3่)JT’)JP R””ฅฅ)@)JP R””ฅฅ)@+bย๎K ๋{ธ ๓ pใวQ๕ฏ[๚•qฌ๊ ilU>๒J๙ฌุฝษฉ7ฟงpน|ป4Eๆ!พ9@db9ฺภ๕ๆฐผฮฌYv็iRคuฌหoไy!ฦ3NrNƒŠบไ ‰˜œ็ต|žีกฌc๐ูซวoย02Iใ5’W.mrqาฉฐฃtฯ5’ฎ"ศ”๙หมBผ|ลJDวะิrwaH ์ e€cjศCgœ+๔5‰ฃ‘do€ไpGฮช๒ู$Ž™จ ฌ‘-อสasด๎Aงี$qDpฬ„† ‚T๚UˆKƒ" . Ž8๕๗ชย†5’Eฦ็bB‘ิ๚^j~dฅอ™”พฦF‹๑ ็๐+Jุษ,7K'รo;Fงใ†}๙วาฆ-#XฎaP7บ#โ>พยน(ฺKV2ณ<สP’zmว^ีh$ใ/eฅ‰ฦ|‚‘จ`8๋๓ญm{Mkศ63ช6C+p}?ZดF๘przฬ้ๆHฎA๖อg ผo|_(ฅZ<ัVea†RAโฉW?๛ววMว๚ะถ@ฯaŽ+๋ฬสg‚8ม๖ง^ƒ#Œƒ๎;ิ†ƒงSSŽ.#9ge๋ลVsP‹œบ"H๑ฉY๏mคฒปšฺmฆH›i*rธ๖ฌdำV€ฅ)R)JJR€R” ฅ()JJR€R” ฅ()U8ษว€ฅ)JJR€R” ภฯJR€ชแ\6ีbpร ๋n๎ๆฺๆีAฑŽฅตปg~aส™ZHว)ตฐPqํZ=i]1ว,vอZ7h‘žๆฺแ‹เล(3&เG๒ใ8๚ึฒo‹)q‘ฌtชใรj—AB•{ศ๏๘ุšฒตAมโณ™ผำดˆแVbฺ} ฑ๋Z๕ssž=1U”Saˆศ8=Aศ5T]ฤไใ5m*ภRชูwu้J”ฅV„”ฅVฉ@)W6#ž|Uด Uc๙{ สvg/Jฒ• 'ิ๚U)J)JP‘JR€R•Z”ช‚0r?#U J์:๓Bฬดซ{ขจh  jค๐3‚Oง๗ -ฅ\zqลR€ฅ)J)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@(FAดฅํพ๑›โญฦมึ vยีmŒ@*E}Œ)@?ศ๕ษgฝ…˜œ‹—h$E2sษŸๆใ๒ฏ#5๘Wํ7UาQ-uh-ตฝ4พUฺ,`$˜ศ<๗อxฺŸ v็‹๒ŽˆfUR:ืณเ’+•ŠHฃF*ฮ2TIม๔ภฎ#QดKiN&†eW†TๅX็š๕ซi4ฝ{GTะ ณ้ฒGฒ‘Tษdgpษ;x๚ƒQฏเซyดุ,ภ‹๏Nฒ„.4”ณฯvํ^Wn2๊m“˜พฮํฎ”ผql€มKน‚’:‡5#{แ+๛)dว2ยIef น{'ฟตhฺฦณ\4sฑIฐ†ึฯจํUi.Qม(ฮ<3C + ษ9ฉญ?r0e\๐C(|วshm6a‘มฏC๕ญtธxd๘[kภFข๏ ŠฺษCตถย๑€(็^ต|p#?ฦ ๘น ylzใญG[]Os1UFช9}H๖ฉ hX~๊\n ท=?:“D์ฬม”ฒลตw.Wเฮ=*‰ศษ๒7 8ํYย ม ฯVBนม-–a;๋Rอ(าฉ0–;x9็งฮทDkaK6 2s๋Vฦฒ*€น;ŽO\๖๙ีๅฐปย‘-ž:q๋DหEpRูทLๅแ– 9ฟ1ZะBสZH๗,TžO^?Cฉw/—ๆํ`†ะ๚๕๚ŠำDพ\`้“ะTษ๑dนธ๔!ฌ˜๕มฏ4k่ ว(๛๐r/˜ะห สษ$r(ุฆๆCŽ~_Š๓|Rn8R]฿๙ ฐGtŸศใฎ#DV๒. ฑร|1ฌzu'bดฬ$žK9ุ่ž๛๙hีDŽ?R9>ฟLšถ๓Kบฑyฃธˆฃฦ์qภ>•แ&<ทไลŒ€kœzŸAY4๘%[œฒฐUR\1เŽŸZœ๛ปmRCำ 8๗ญrุ‘I˜ ไฎpรึฅต&E฿Y,า;’Q”ํใ“ํZ’ASžŒcบัA'แห๑Œ๒>˜ญ8ฬD 0ปHสžsƒฯ้Bvฆศ˜ฃ‰b’Eš9๑€Fใœ๓ฯญDฎูwdเcยท!Š๊๒`ุ†clชด`ณฏsŽ๛~•—Wrฺ›€$ใฏ๋hŠพ†กบ•pะฦฐข็ A๘ฟ:ฤ๐Cu+^"ศฆวQฝศภ๕ฯzฟfRf*’ญ^๙QQๅˆˆ•eน๔๚zT]“k†cE โ3ิๅkmdชไ€Œcž?ตDษ<6ถล๎ฅXใv$ไŸš…ี5๖žูญญCฌlw~คภvญp้ฒjยธ๕์gผ‡ฝ๒พ๛q๗bLkl'๙sลaฅO๘GNŽ๚๎vž4–(ำ[rOC๒ฏฅษ‘aฦๅ.ลทH†ณตž๒_.ึ6‘€ษภแGฉ=…w้?ณดจ๖Nห:!.่p ษ๚ใฏ๕ัฺูE ดjL์BไœqศจvRะฦ#ฤ^c…`=0I>xZญlณ๑T‘ัไ์‹”Ž]ร‰C$Aะ็‘ลGV[ฉDืH ชณ๖ษอbฏw1ฦ/ฑฬบ R•ฉ"•\ธวลžนํ้Šฅฅ(Hฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R”•Zก่Arซ9ยฉ'ะ ่|5 5๋ดทBDˆ)(S๎นฉ่+}`ณด๋ต]~Y?าปk 2+`cถG๒Kn ว9ก๖เtฏ+WฏPผp๊_)M๒ธ"O†,5;ข…›–ŽP>%?>:VยvถฮH๗`|Aะa8้ืš๋ข‹ส…๎ ’8๏X™|ฝล]F$ว$d๔๖วj๒eฉษตรw ๋๛<NบฒAๅ+U;ธ$ c*ึ h๘‡o_Jิ vณQ็v์๕ |ช1ํ๎ ฦ่Hnรำ>ใuฌข์ผ•ฯ‰cฝโE–ŒฐฯS๊‚ธ^kฺxUU™$#€จO=ลBxkNผธYฅปdภฯZ๕๔zุcŽษช๗8ง‚PnQๆ3…๐ฬluปFฺHL๕๖ฎ๎๊ีvlsภ;‰๏้ว็V่~ŸOฟ–๖๎ฺKXก%#ูบ`๘ฑœไTป.ื€•แ99?฿5–ฟ4g‘8>ˆ4\ิฅ%I๐yว‰4˜ฌ›ฬƒ!Oc฿5^‡ใ L สวแQœƒž~+ฯHฺฤี่่s<ธพ'm(์“‰JUi]ฅJR”ก"”ฅก้JPย๑ „ซ(h`zƒZ๕š,พPE<6B2+ V7ั…)Jฑ"•’žy–(”ณฑภฝm4BศนตJG _+QŽฟZฮY^œn0~๋๏Vีj•ก%qœ ฅUฐOย„ๆฉ@WŒ{ี)J)JP ฏสฉUก)JP‘JR€Uj” +NีJPUฅ( R”ก"”ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅ}Œ๊7ฺ>ถ๒ฒฅใตคฑ๏*’‡FUŽ 1้^ำgๅYฯ*฿ุง”e๒ๅ”œ๎วuฏ๛<2/Ž๔‡ึ๑ ศฯย?้š๚gT eชช›‰ญeh“g*qุx๗๊+ภ๑X'•|ฟณะา}ว๓9ุรw'˜๗m#\H1#yeษ'9เ +ฮ5h~๏ชC๙‡ใ}‹ ๑ฯ็^ทโ๚ฯ--mW}ดc” ~็^Eฌห"ป๒%i;Hเชภ@๕ํ๙ื”Fฅ$‹n`;Žโฤuฅqๅฒ๐>!ค\‘GbUH ๔๊+^kgXผู#;:ไtฃUะใศปฃY*$Rnn๘F๕๗%k f%U‚๔ซV6–"r@' ฯ๋z*๊T-ะK์DM•Xว ๎งท๚ํBฏ„๐=ปึ/ฐฉ!7_$ค}' ฐX$ฒจkจœœ1๘Iม็9•ฮ๊š„ฤโk้KcโWb๖Q‚K|ฮ~+ผ๐ ณ๑gูๅึฑj๐’\ฃX็-m((X๕~!ฦ#œƒ\„๖ํg~แฃ5? ๖ฏ–IยN rŽ๙ำงมทga;X+J n่pธษฮ}j2อฯ˜ฐๅpv็€}Nz๛Š‘†๎โไ*Jอ‘ำ'Šธ8ยฐย<s๒56์‡ัฮุ‹‰lวํV  จษฯห๛Vฅ์dฦีQ‚ออtoo Œ-#“™ๅณ๊อ_Wนฟำ%‚dท Qยฦ|ฐ€€‘ษ?>hพv9 า[ขร$,`p<ฐ๕ฯjฒ€f—rคnไ8\๗ใ>วš—lํสŸ1@ฺq•Qฮr^kR๑d‰r ;ฬc `qฺฎ~พA=ข$ฦe;ˆX†0qวึก5[คำแŽi wฮU˜j™บฮฺ๋๒[žkŸ๑< >œ๎Uํฐเ๗ฺx#๕้Wมฯ,c>Œๆหหณ˜ิ/%พบiๆภ'€ฃขAZิชืำฦ* F=‘J›๐หมจผkปฆ~ ฉศ?ึก+ท๐f™Vqน2Kr 8ุ œ ๛ใ?•skงแj]๘/คuADM,˜๘\๏๋ฯ=ซ‘๑Mึ$บ‘+มˆ๔ๆปMFๆ?"Yf D ๐{z๓/Iปย2ษ๓=3๚ื‡ฅลๆeŒ_ี}QพกาQD(เb”ฅ}9ฬ*กIRภฃ8เgฅUJ…pษธ‘๐œใi๔ม0F •‚GLิrAm)J’J‘ƒิ‘อR” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJฺฐฐบิึฮ##&ใ๑0UREz.เปm8Gqฎค7R.UcŒ“9ฮ[กcฮ=>uอจีใภพ'ฯกฆยฝSIGฐ฿ฅญฝžโ[pฉ้ษ1ว๓:aฃO๏K๒๚ tอ-;Oทถณ@ฐF#“Ÿโ&ถ%ณX› ฎX‚v๖o‘ฌˆ๎qๅ2‡$เžงุŠษ๗ถฺŠ๛on้^;”คํž’ลชIcnP“ะ๋Z@Dร,p๘hี'pŸw…d‹!G5ฏ ‘Jd”„–ฯDข๕),J้™mm!i๒rญะŽ‚ดฎ"ฬฺม<ถโ€s่{vๆณฝะ๙sศWฏ๙ฅ[]fตข šๅPฒฦQd#๙›8#ุใ้\ณํ-๐เuอ}ฑห8œ N_TYJRต.WตR”ก๑ฃHe@:šณ็U‚ ’‚:ƒ[ๅแพ ณos’ฤ|์j“žk‚:jๆวzc฿ƒWJฅXฌ‹ถE๋โ$็Ÿ๒ฌud๏”Hฅ)RIUbฌI :qWษ!‘fvใqฯ๚Ž•ฎศฅ*Iฅ()JJR€R” ฅ(WตR””ฅฅ)@)JP๏Tฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()Jฝ๛ถ‚ใวะˆั„V๒JฎฬWหaธcŽ๘็œ๕ฝืS_)ฆK–๓n™ ฑไฑ๓ Žz๒9+ย~ว-L%บ”+–†ีถ๕ู–`ธlvว={Wฐด—2หh้u mช‘ษ8bpOC‘๋พฤzŠ^‡ฃฆฅŽอฟjV๚]•ๅียH’ตป˜žญฦFOฐ9ฦyj๑{Užๅฆ‰!w“{„1†%ถ{ืค}กฦษa1–=ฏm–฿Ud็œ8๗ gฅyเŒมn#ฺ่๎รu'ฆ๏l๚W I#=Tญข้ๅส€์ d•งY-ยผŽp฿‡lz๔ซ lฬ เฏr*ๆถ6๒ว๐๚‘ปRŽGeฑ€ฺ8=ฉวzฒนEˆ+@็ตjฦกAƒธ~ตŠโC -"€ฏ ว๑Pี•V‰—ธHa R๙–^I๕จ๙.1;dศท/Aฝ+06๋&๖b8cิ|๛VŸ (— ’ูQžฑ๖ข‰=M๑ฉ@ฌฮกไศฮะ˜๚š‡ฝ๑$ฦศšipwฦภภpGOZŠื&u"e@_h'งLTEzบMg3'r76H6ณจv๛ษŽqด9ฯซus=‹%ฬญ+ชํฑภ๔k +ึ†,p๛ฑH R• ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€๚˜ฏญญ|5โp๑ร$ฟzƒpbw d`ญŽใ;‡๕ฉ^าื๏๓จž@ฦvฦCsŽไ๕ฏ?fจืว7ฺtŒMKN– 1YdํUำฝ[ฤzeอ–ขะศ๑ศ ”H3ธ.์dqš๙}t\5Rพ๔ฯSŒฐฏTECn ู‘XบŒ:ใฟาถฆำไHRG“h<('<Žผ๕ท;ยgn„๗˜๏RSษ’Kธ+œpT ใทฯ๔ฎ77f๏”meั1ฯน9ศ?ƒขuK”ภc$3Sz˜,|ภB…ษ๔ Z็๏ฌ’9C…ศ$๑œๆต‰ษ(ตะิ๛ิM*๐Laพ"‡$๑ฺฐฬ…/ไYRPS˜Œœ ฯmา ช’2A ํŠŽึ"tžู„Ÿผ_ˆnษษ>ภZu)+ซeก^&+๐ใ9ชฤซ=ัi%‘e?ศศU*ฟธฒณGดว!”+> cŒzt5รM,“ศdžG•ฯ๑;kปEคy++|'๛ฒ—bฺฅ)^้A]ูฑค• Šrซ๔€y๚๎ซ€ญอ3Rปา็3Xอๅนภ`T2ฐ# ๑\๚ฌ/>7ิด%ถVzŸˆ’h,ฆUp4Y๑๑๎ภ:๒ฝVqsจJง*[ ๒jิGฉjฌ’G XฦศS๓9?ญCื>‹G, ส}Keš›ด)JW f)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP™๖?hV฿Sฟyยฤ๒Giๅ€I'–.G Z๔+ป9อd„Fสฅs‘Uๆ_fŽจ&0HมY \วผ1ส7ฏ\ใฏฦ}7Mผ’k!ะฉ$t้kๆ5๗็ษžพฉbฺBภ’ส็ocฏฑ‹เmค^I>ฟJ฿ฟXZ"Wg˜ฟˆN๎:|๊7อ-3(V`d™ฎkm(ค์˜…ใ #ธ9.A#ไyญ+๛†’็‘ทำŒึ+gEŒ*31+‚ญ>•ภ(ฮกถ๔ชฃLผงqคL4˜|—Rแ9 Œฎตฉ คJ_(ฌ์s€F>~งตUฅT+ธ€y'ž0ฅF งalŽใ๚TฅD9)vY]จHธs๚๗ชC †;•ธ๔ภชฯรi$Œ‘kfีใlญดA<๕=*n‘žฤูผˆ€l)#jgDต7SJป ™๘{ึตขLะ…!ผฬบฦา"ักŽ[าžD‡uๅ]v๗ใ?Lื<ฅุ้q„`๒BำYGs๘\&๑ ?๑zv๊ ค‘f9*ศŸงาบอ^M’ษ$„mb,&จเcฯN๕อด๙w๓!ภ•8ใœ™ฮ~ต0๗1œ{‹ฌˆสก”Œ๋๔ฎrํํๅEelชฏ–ฬ{ถyม้ำ%sZ\็2แไ,rwc็้P—–p฿]#2ๅ_$• ฎkช Ž,–™šX<๕™|“ต8 ทp:W™kzaฐ™š3ๆ[3žG|0์kิ^ี-–|=ฬำ1B8=ฑะw5 ซ*ผ,ณ"ƒ'Œ3ŸLฅui๕O-หฃ๊seซ๎yนมJษ9c<…ใŸฮฑืั.‡0ฅ)RHฅ)@Tฑ=I5JR„ R”$R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJUs์?*•\œž3์?*gุ~T)UฯฐฉŸa@R”ฅฅ)@)JP R””ฅฅ)@)JPล๖Cm%ฏ…ฏ™ญษฉฦ!8$:ฆ@œ’ฤdc_F้~+ฒ๑wตm;ฯG๎.์ฯว,,9U-‘นO๐ž๘์r+ๆ:๊พฮตลั๕ฉ"šO.ฺ๙,็คns๕เ๛1ฏ;ฤ4‹4<ฤพ%๛|ฎk่ฯกfำ].โ฿hš@ยแิ'G๓็žk๒ฝฌล.# žIีžAq*ลCะoฮ๙…Eฬศ๗2@knง4ธvRโ๎+eS#0WแB๗ว_๛ิE๔ศเfI1•!ณฝปีg>u๓ณ4Šเ…้ฦ=‡S\ฏŠo…œFyWb๛5ถ,O$”#ี˜ไžิG๘ฦ๚+‹จํญไ๓"Yศ9o|s๙ื=Aภโ•๔xq,0P]Ž1JRต”ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R”Ÿ†๏“Nึ`น—>O)&-฿ไ {ญฺฺฉvpั6๋ฯฎyๆผ(Œ‚+ี<1จA6bร—๒“Žผ.?—ใxฎ*“๐7ม™ใ~วIs20i2eใ9๙vล`๓B&วˆ`N8ฌ7VI$Q&rAว”ใŽzแ$ิhQ$’I[อGฺ๙RสT9ฯไ๒’Oก่yถOA8–แxM๏ยดฃŽ*่JดŽค ๘ป}1้Q rm็…nSqSตะ2;ฉ็ฏ=ซf;ƒtโUู ใcื๊6๒_อฃuว†7]รีb2–`›Š๔๕Z)$ชOBO_zmfหเใพj"VeิฺU^w‰€qฯๅ[>f7าE*จGŒํY:n:ฑž'็q@n฿ใ๒ญจŠd‘ฐ๐FA้้Tl่‹Œ๘ณดั`[MJฺyUู)€T็>;WUโิ:„ถ๖ลข‰<“ ฮp8 ำฆ@๕อpZฤ&(โฐู(ส็GฟQX๕iฎ;{t๓fšFŒ4„b6^[ @|ึ[[)8จ๓dวŠehU`e“อE๑?H๒?,ิAฅ}ํโi-C,H N8ฯ ฉ^๏{ฺB$IdXU<ฬ‚ ๕๙…szตษ˜y 4ซmล ๊a} j’"<ัsq๛ยr๊H#กใญ9mc%ส``Ž@ใ๋V๊rรlใ+ๆ•็แ8ํะŸํVญแนณ…ส,|ฒ”^€ s๙WRเเษ3 ฯดอ0—+น ŸJ‚ผธXญเ1ž g~ƒฆkašๆXU"นหeXwก๕ถZ(pnญŸร€@ม?งตJ็†rN\Yษ๋+ทUนแA-ธ… €H้‘ZU|ฮešI2ฬO:ฒพง\`ข๛$sกJRฎHฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฌถ๐›‰ึ%ู๊จ””Uพ„ญ๖@ษ๗ห;;ฅVŽ๊ญมู่|• pyใี9ข-ou บดห2ช–\€c๘r๔9๚๑Wimuฎ๊Z™ WJฒ!}ฅ๔ฦd๛‘Qบ™,ญuํณซฏๅ:žง3o,กŽืวb{ณาถaษทd}์ฯปโ=1ภ็ไkŒวผจ๘”`ฏCVO1•Pzํ๙ล–oป6$(หห`‘CPโๆ$CxพDั€uG ึ๎ๅ†it1–9฿ฦฆj้n#U$ะ(ƒปี9ณnx‚ƒ๓๋Zํ‹%ุ';}*๋ฝKO‚ฦๆy%’ูโQฑ3ธHzm^๙ฎR_;f7y?จตรฆห›˜"%ม!ซ๊pท2Zๆ+ถ?บ$ไ๚nวท๕ฎ*Gydi%v’G9gs’วิšบy^โwšf#œ“X๋่4บeงw}JŠR•ิ)JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JBเ๐ZR€๕ํ๒–๐\Lณร๗5H็ไภ 6zŒ๚TคW;ฃ+t่๛ U9qžฝทJ๒=']บำูrฉqจUŽN€g8ี}฿‰ตK”t๓ฃ…๘`Œ&฿‘๊+ยฦๅีช๕7Žj\žฑu%“E,๒ ฎโKƒปน>•s~๛|ศไXxิ๔๙Ž+สcปนŽA"\Ls็ว4ฒNAžGŒใqฮ2rZีx\ฏ™,ํ๔;=oลf’ลข’cม™FBzŒqD’IbK’Iษ&ฉJ๔piแTLœœนb”ฅn@ฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@+จ๐ก’(แYC–$ฏP–Mr๕!gชฯnม‰$€0๋ุื&ท๒โA๋ษ"5ฃศ๛Wjๅฒ็Žู๖ฎr่Hฮ‘จ™฿Ÿฤ2Iฯ9่sš็ค๑•ส[ํbCมi*9๔~ตฮMws39’yNใธไห5ๅ`๐ฏ™pmๆ๑ม,๖๗,dWhPช+์๘H๖ญmGฦ oพ `ำดณŸH๔ญqฆโrปL๓ำaล]ุผ:1w‘฿่G›"zO๋0.=ึ1ว็Q7WทWS4ท73K!๊KŸ่:Vฝ+ถ1ใ๛ฑHฃ“}Yตeจ^XศาZ\ห0!ฐsŸกฎงร^,˜\๙:‹ VP#hืa/ะŽ9ฮrkŒกU3iฑๆMIs๋˜ฮQ่ฯnตีฏ"Iท[‰K‚9!Šํ๏฿Ž~Yซtํ_๏ืฉscปGฯโ วึผฒMZ๋P‚ึฤ*พภ\พ:S๒ฎŸIิ฿ึฺWKxัcHVRฒโเๆผ,บIcลื๘้๕่~ื+I๔=jฑ4ข9๎`v…?๋ฝ'บ…ฃ•#Mณ2Œฬ6zoืЁš๒+e’DuINาๅ•›ฎs?ฦฏ‹€ํธ๓ตF6๑ŒŒ๔<Ÿฮน]Nืจณกั ™ฮUึฐสญd‘Œ๕อH<๖ำ˜ัŽๆห~,tี}wคฎOยน8ฦr>Ugฯ&Yฆธ#uyๅณด3ว6ArNs=น&นmb๚ ฮฐD๑ฯ(ฤ๐|พุฏ๗ฉํz๚ยM> …ˆฌฅึBญหŒ๕์Hว๔ฎ&โi.n$šgg‘ุฑf9'๋^–ƒNฒ=า\# ๚้JWธTR” ฅ()JJบ=กืฬฆyวฅgปณktŽ@ยHd.3๔ช9ลIE๕d_cZ”ฅ\‘JR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ(L่ฑศ.:I่ฝฑPี=แๆxํฆ•ข๓yŸOฺ๋ธตํฌ<{7„5sก}žุว>fซ-ุ™ัฟxฎ6m##„„๑†ขfyBDๆ28๘N๑“ม?ญZ/งตาlดซซE๓ฃธK’›๐m rF1ด฿EZฬ“ไT9ใcœcพGNพ•โe|ืก|&„๎ฯlฎโXถๅc฿ถ+ แFรœgƒมฌ—29ุK ŽpEฤ,W$6qฯJญYœDŒ€ณ:eฑTbฃMดชสz๓ฦ*ณฤzฃ้–ผQ‡y[j‰€้ฯzไ.|AฉOาq ๔ฤKืญoƒE“4w.‹’n‰ฝ~โ;==ญF๙‘•#ฦp|๚ ใ๊็v‘หศฬ๎zณ“๕ซkฺำiึmปe)J้$R” ฅ()JJR€R” ฅ()JJR€ญR•\qžิ)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@*่ขp่pร๕ซiBพง{ฆk)=Œ>\ลd8Yฐ ~;Š–Žๆ้ƒ@๎6Lห๋๓อyh$0e$0่Gถ`ฝป|คบ•#b.p=๋วหแvฑห๓!nFw—ฺœ๐Bํๅ<’p8๐ฮ„ž2=•ฬ]Ky4?xพg…~๏$ žF8จ›kซIท[8 ž๙ ๔=j’<ืณๅˆ/‚T€1ฮฟ๕ฉ‡‡8;mWจถok:งํใ j๊Š™Sœใ9้ภฯ•Dา•้aร1฿1JRต”ฅฅ)@)JP •ัG฿ุLอๅผŒเ`z|Žj*ฅtYกŽH’2ษs#์b็แ`xยใก๙ื6ฎฆา็๖๗)>†ฝ๖Ÿ4*&๘ม8*s๏้ZณDั0W’psมฎT‹๖tktา $IBCŽฝษใฎ+žน™๎'yd9f9๙{Vz<น2ล9Uz๚ˆถbฅ*แณหl–๓21้ŽZํ,[JR„ŠR””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R”ืSแ๓4—ฺN™ Lำ!2ฎpr ว#k—PY€ฝwŸe–o?‹K2ฤา$,ฑI.R8Ÿฎโรฆ8ศ ’ฎ-ZN“ํฟ’ฌ๋oถ^Nณก’',เงโ;vc$“‘“ฯLtซคณeณiใšFษรวจใn1฿ ๛Vฮตง› Nt0ฯ232y…aธ๒ฅN6ไqำำžตŽษ"˜ฦ“FyษBรj‘žน้๔ฏ +๘™่A|(าถบฌอธc Ÿ/าธ 'ึญQ–D–ถาเดฅeฺ q๕วj๔MZaKฐCY™†๊OฟJ๑๛ห๋›้ค–โV&C–Q๐ฉ๔เWw‡ใy7pšใฏ&p…๕ํอซ%ไอ+(ย็€ฐVต)^ฺŠŠคŽqJRค‘JR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JjCBฑ:+ช@#ื฿ญJอgm›๗ˆใ–|cq ƒ‚oOส ‘Š6ๅ๋W<ฮ้ฐถ๙GC\94ู%’ใ*rดc)J๎,)JP R””ฅฅoi]ึญv ดƒRJแ#Ovcภฎรฐำ’Y๏์RบW(ข@หัฑี๓#iวz็อฉ†๑0“}WBำdนv"Hc@นv˜•SฦI>ร๔ฌokesฏœ๑d9? ƒ u3ซx†!q4i :ƒ‘XFจG ฦ;tฎO็ษ๏X`ว<ไษi>ลi3b๚๎[–šlxUz ืฅ+ถ1QJ1่‰ฅ*ฤŠR””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅžำส+1ƒัO&ฝ๏ภO„ํ/ต›™ญY+=จ†uUT!๖yฤแFBI!wWŽ๘KA“\še†&•โสฉภ ๓์q๎k๋]2ม๔3GบพปสK ฮ,bเYฤTเB’ฃ=kฮฯR๚๑WEปาต—R[๙€ศฉ%ฬ7“ต‹DJเe๕ภญwic6ภƒท-…฿ฯงฆ*]šอ๕ คAงGfค6ึ฿vฯRU8 =O จ™ฆW{๐‘†แOc^ ไœ‚_'j๖ฺฤทrพฃ ห:ฑษ9(3้ำƒ]—‰ผX—&[k(ทFx.ใ•qŸ:๚m,ง(-๑ฺp?ผฺ้ฅ+ค R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R”@'8วžN*”ฅฅ)@)JP๔กฦx9ชR€R” ฅ()U )J”ัtO\‡R—Jตkกง๊แP‚๋เฅ‚๕8$g5<2ษๅฯG&ฺyจฎŽ”ฅHฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” : W†ฬ&ahhSฮŒn$ถwgๆ0>@T–ฝใ9ฎึanQๆ˜๓y"28Œ`{๐5ฦาธž‡งบ\๛v ตัภฅ)] R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€้< |,5F•๎>ํฉye,pScM ลƒ`zWั๚ง‰๔[x}ว฿ส๊‚Xฃฤf6 mi“ธ–Qศ๖ฏ•ด๋ษlnLอ,AัขวŒ”nฃƒ๒ฏ`๐[k”.โ}:เ^๙ญrํRB๑;aI=๙Sภ9&ธuP—5ฏ ๒mjบƒ",P#u\‚6๎`NrJ๕<ื โfืhทุถ๓ฆ๘;ทต/ฌอsงiถ๗'Miob๓ทY3L"Jข2ฦ0$$ด + ˜ท๖yŠj!t†Hศpวฑฯ ๛W‘ƒร•<ซƒ|๙ก๐v<ะ’NO$ี*็FŽFิซฉมV"ญฏคF+ุV๊i:ƒค–SฒNH‰‚ไHG]พตฆฌUƒ)!‡B+uumA@—“(pเใุzaŠฆO3ฮฟ$ีž`”วา.ห~ฬะเตGภ‘vฒผœrมทงง#Ž+อ)XOMŽ}BUส&ตf+๙ษk™Gฮ๏ฬC’6€:œžjฺV˜๑GจJRด$R” ฅ()JJR€WAขxปXาmอš )๑ๆ้ทรฯถแ™J‘ุื?J†“๊Eb 1U $($…ƒ<ี)J’E)WฃฒทnAฯ*ะ๚n” ฒ•ฑ{ ‰ข/หIขYQp๘ไu`7r##ะ๑Z๔”ฅ ฅ()JJR€R” \๑ŽzU)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R”sมใžโฉJP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ_o#mE$๕๔ภฮ2OaฯZ๛‡•4K}qผo‚J8™‚๚ํByใก#ทNต VkฅถYถูห<ฑใฌัˆุŸ๙C7ZฦฒกRnฦsว^บPาซฉRdŽeb W;Gฉฌt๎qะ๚P Ž ˜ชUI'ฉ'็T ฅ()JWยbฉธI/โX#;1•YJ$๒™œ;$i„T ํ^3Sิ๚’Mcฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJR€R” ฅ()JJWIแฟ๋> าตRฮ‹Kฑ\หw9+?h“ŽCฃงฦECiu7าค495rdพทณH#2*ป๔ O9๕ภx3์ำYพีžึ๎ฺ;0!_ผ็k9…๓™!ฅP€คnc‘ปฑฏc๐ื‚๔/-ผบUผ๒]ฬDพuห`H œ"…็[ทAอa“:”ำฮผAจฦa=ท˜†Y^๎1วœ‘โ`T.2,1มอu‹เ๏xM๗ฤ฿|ผXศAŽ<—˜ฉ`›b๘NIeŒ๛|๚B_2 ’JCHขBๅ˜ž'€q๋_/จ๊ื:‡Šฎญdิ-/m,คxเ6aผฅษไe€,ร€[qม"ฒ†Iๆ•'Hšขบๆทฅ6๖๚Šยธ…ดxขeว!–mฯ&A์_ใ“\ฑญj:ฬŠ๚ั”’>P1ภTu+ญE"ข”ฅX R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R”•ณงX^jw ™is{:ก‘ฃถ‰ฅ`ฃซ œZ๐฿‡/GscงUผK47Sฌ ภpB๏ฦX(ๆฉ,‘V(†ฅzgƒพฬ…ไถ~,MOฟIถ-ตตdtวQ6Hฮr8๕๋6dg|ททM7[ปr€Ÿผ]:#1={ƒX}ช>ŒงหTฏฎuฏฐIฆฬซgฉ่w[K$ข๐สช@ฯGศe๕่z๒+รu๏ฒ=~ี<[฿kถ?ywชย…ฒ0y…œŽp9์zีแจ„ฝƒ‹GœRทฎtNึ๖k+ญ6๚ศม%ป‰ฟฤธศญ๊ เŽใpCะืั~๛+ิผ?ิ)}พtŠeiI7(#*0N9๏ฯฝโ_ณGึ!๒uHญฎฺฬ&2ศุ๎gSิŠฯํwฐเ๙T:>fฒม5ห2ล$ฌจา‹ธ…Q’~@s_Bh{X3ข&‘i{–นv? Gก้๙ึ&๛8๐์r๙’ุศื“%ผฏฯช…เ~Uฌr9:ฏุอไŠWgฯtฏx›์gIน…ฅด—VถฅาEB ตq๖rอ$^"ดส ˆฅท`็žŸ #8ซนจ๕ษ9J๎๘›๏ฯn๑ูคJ2ท-7๎Œ๐๙Ž+ฏั>ฬด›XV-fๆ่ได‘\ใ๖๙็>*“สฃูEำO›_™โีJ๚W^๛!๐t๚ฅขฯค๊>VfdฤV,XEม๗ฏ9ิ~วu8eู๚ฦ™y\กd–fฯแร)็œTฌ‰‘นaJํ์ซฦแKS8”Oร๒;ช๋Oฒฏ0Xฺฉ8-5าพไ)'๒ซoฉ6އŽผWฏi_bwrอฟึ-ˆ7วlน“๘ถปเŽ™ฏf๐_ูฏ†lฺศx_Iิ“ห๗ืL&cŸฤฬF์๚`ยณyข•‘|า>;„‘อ+๏Msภ^พ๐V—pWเ ohจQ3ื W๒๋^Oฏˆxr๗Xทถำฌum"5-$ฬผ‰ž[.ƒะิG–M>งสTฏฃ๕ฐลq์ฏjะฆ๏฿E=ชN@ว๐ฐฺ8>ฟŸฏ)จ†ฮ—r.™โKYํวแ’ๆฮH˜๑ำ [ฟซy๐๕าฝF/ฐฟN๒‘้— 7-฿–๕๘ภ8กq๖5ใ๋qxา๘}ึa–”Eฑวm‡wลŸoฎ*V|oค‰qkฉ็ดฎ| โ5y๗`ถยปžโ๚โ;x:d‘˜+ำ O5ฬฎj๊J]”ฅX R””ฅฅ\๛(z|$็ท'?>ุฃฃ#aฦุ๋ŒŠฺR””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP R””ฅฅ)@)JP U๖๑ฝฬข+tyฅ=5.OะV่ั5f WIิHoยEฌœ๗ใІา}*Rkv๗_uŸEี"บศKูศฏ“ำแ+žr?:ะบทžาแ ป‚X'P ŽT(ภpyไhš}Šฎ@งv๖…$|9ษ์=ณ๋TชTJR€R” ฅpp( PpHญฝ2ย๋Tธh4๋yndD28‰ ์A๘‚‚vŽคใ^ก๖gๆห …ง๑nซmY.lเฐดŽ-ฬภ •ไ œซม8ฝำร†ขฑJ๚ฯ‡,ผ?sๆตค'ฮŠv”(RcPŽxเŽœ ๅษจpmQ)Yเ)๖3ญKษjiL๐ฺ5jžiYB–ปŠ€ฅJใ-…ษ=k”ฒะ[}๗ญึT“๖tธ–รฬ` ‘˜้“€KsŽqžq_[jRJalC}เ"ฎBถK+1ว …^yฬ<:+EqJ- ิœb[˜T4ฌชธ‹•}ซ๐ฤ๐?,cฉmrYฦOx{Q๐-๋+F<๛ธแ3)$็“’=*๊nโ˜ฟ๏-์F๏5๑ำ;ˆ๔๏=k‡sp‚gธš~^ศ>๎ปpY{n๏่H›ึ–Kaๅศ˜๒ฏ8วŽฃถs๙W+Ÿ4หํตg4!”ห!ต' sธ€Žน็๓ฯ๘W†xฦพื..๘r]GRุaK๗”F@l!๘€๋ศว5๎š6ฺ ปดปธ๓กน‰ก’7\• ’ษŽC๋_*๘๗G]ฦฎŸ ี•คsฟcธbฬะ†!X1rœงj้ำEJ\™ห‚tๆ”ฅz%E)JJR€R” ฅ()JJR€R” ฅ(*ธซK(๊ห๙ะฅt๐†ฑโษฅM F›ฺk‡๒ข๊ะํมnsทฎ๔ฏSะู๊๖๖ษต ฟY‹$%Hด„ผŽG ฤฮFOๅYO4!๗˜Iพแ”ฏฅt๏ฐ ๊V๊'๑ Ymาอ$h ํฮฬ็9ฦr*r๖๐ฟ,ึšฉŠ1Œพฆช_งฤFฯ‡ฟ์+ฌฦ‹(6|TfU8b๗ฏญดŸฑGpeDบพฺ2‚โํคN3ะ ็฿#ฺง๔ธ4O ขXฺ่Bูตฯฦ๑Yฺ $`;Ÿbp3๋ภช=jr6[หฏผฯŠท/๓/็Uฏดแั๔ZWบŸยvaƒ–๓๕ ฃg$`ถ –<0ฌ ๖yแ กxฯ‡|<ะพCcfnผเ‚ Ÿ‘งkฌHู}๑™ใฏ:ฆเI๙ืูP}ŸxRLvพัHฺฑ‘$ ๅนศD๒Oqษ้Y์7แ I‡ดฃๆFVGŠีd\r9ฦ8ิตz ‡ล—๙—๓ฆๅa๙ืูw^๐ฅีผฑุ่๚%ดy์ศ]Qˆ:ฎO8ฯสน›ฺฯP76Zn‘ws1†Hดeฑxไ๐‰Iูฟฎ?*ฒีล•qkฑ๓J้›Yลำ/ฺะ)s8ถ,(๊wc๗ญ0ฌฤG$ใCฮzvฏฑ‘๏0ฒ:โD ๗o49 N3๐๑Œ๛โค-กฟši๎.gcf#Œฏยzgฆyไ“œั๊ZW_ฉๅั๑6๕a๕4 งฃ๕ฏฏ5›]N[‘=ฎ›ฆ๙ศ qห—*ว'งaภๆขn|/&ฅb฿ถt-*๎6๘`ศ‰}1๐ไž:ีVณ‹k๕-ณš>ZํB@๊@ฏค.<แ[ซ Nซ ููFส|เ^ โR‡'Jฤผ7Njj}ลโSqๆ19%ๅ~Gฟื๚ึSึพส‰Xฯ|=๖Wwจj76ฆฑงi๗ษ– HeKฉ๎2 ฺช่?ศลkkŸgGJ‘,Y‰ต™)`๖ฬค`d†|งุ๗ฏข๔ฝรึqEฃ[EyžhธPK3v;‰$ž;๚V๏‰goข[ฆก&8ุBŽฬƒf์€Nๆ\๕ฦqœโชตSmQl๘ซkm ฑยœ”8ๆค|7ฆ&ทฎู้ญ{—d‰ๆVeRx($๒k์>๗K๑]•ฬn๙บU3๋*มNv–่q“วAŸZุ๐๏‡ผ?แใr4[WดŽrเ˜หtศSœ21]?i์ั›บเ๒]Ÿt“m_ฤ—sอž#ณทX“้นษ<n=๋ฟฒ๛๛=ีฃะc฿ม&๊YK|ร1๙าปmิG~€Uaƒรœๅฌ%’Oป ึำ+g€hzMถ“ นF7P*G4๛ShVNม์{’k'ˆด-Zษ.แญfV'|xgœX ๕ว9เjJฤ\ซ๋šสo๒;–วnีสๅ$์ู$ื'/e บZจถถฉม•ค™žyXCp-๓๗ๆฆํ,Eอ่ธพผž%ํๅ0CƒศN[>ธวZฺE9ฮฤ็ืฝd{[v ๆ:.๏…G?RR/™u๑i4pซฉ C’.‡๋Q:fšถไ„˜€zไแzqว๗๗ฉ/25)”๘ื9ซๅผำ?dฌฮN๛ึ[฿CMซฉฯ๊V๖;†ปh~e|•RsŒ๕<“Z3รฆ๊^d:ตฏญๅ`๒ ๅศ่I=๊jk“พย๎ภ`ึœณ้ธ+ ตผ@(ฦฯต]dhฃ‚e—ฺFƒuio๒ฉๅneูYN+›“์๓รฒศาišlŒูษจง ้[ทณฦคฮ=เŽ ่ZใUฉM๗9ั๕)aˆf,๋ื'็ ๎=ณอiอ๐™GฎฆKŸ ๘7I3ลeแหšEp&˜o<Œ0L‚๚W”฿}’ชฬๆวYฤ๘#šณโ ๚Tว‡5้๏.t๗Rฺ‰ส฿ลžYˆฮ8ษฺ๋W\ึ Šป๎yฎe!RŠF๙ะV๑ษ(ซLงz<›ฤ ิด{y.|ห{ซh๓ฝขmฌ˜๕Vูจ{TฟทŽโหMผž ]ฃŽDˆ•‘ิUO๑0N9้_W๘M}ฤ๗rEu%ึ—%ฐHวแZ๊ ฆœ๖่าุXใ$€ะ„ฦzใŽx๊=+_ตJ คฌช]–H๗"“>h‡์M๎์ฎ @Zj+ฬ้มŽnผ„1žคž˜<พฃ๖?ใซฬmก5ยf๓ญงIc!s“•>ฤใ๖ฏฌต”ปผดภ๔€kvฮๆk4๒กี^q*Vฎq๊Nรโ xŽไะต‚U’E ‘Xc'•ฯN5A สA ง‚ก๗ฮ•งG ญฐษๆส๎9๊0r2sŸฮผ฿ํ#มฺงdทณi6’j๎ๆ;—ee–Vฦw _ รx้ษญฑ๊๗}ไDฃGษด้าฝชร์ใDืา8ดSLิ„?ธbqี$หไฉ Ž„๔็Šอo๖9ฆ<‹ีกแท0†XๅVe‘N฿ฦ8๊z~uฏฺ`บŒ๐๚Wซx—์~M:ฤOฅ๋v๗L€ดซtฟwpœ’ุecธ็ตp๚ฏƒEฅO$Wบ=ุ1๎๑ฏ™ยปฦนkHๅ„๚2Z๊@าƒ‘‘JะJR€R” ฅ()JJR€R” ฅ()RF‹ช๋OณGำ/ฏpL[[ผ˜' ศ ฅิ๔ฏGาฦW{7_ณ4ฉฐ๊[%lภกˆ๚ืSoฯZŽQ/MฅศํฑDq<กŽ2pAฯเfฒyเปŠg‡าพˆŸ›ฟfˆ๎om…ิn=๖ฑAจ้Q๑–xึIcAuœ…" .aI~#๐9๕๕Mฦ „yPy‚ภ,’ฯศ๑ว้Zฏ;B@IกyC รž>d๕็Žต_ตMv'j>cบ๛'๑ํฌj๓๘[Q กX๕ว 6ECj~ ๑F—4ฑ_๘wW…ข8bm—ๆ๗พฏšโ๏n๋s!"HL\็5ฑฅ\Cu%ตฬrย\ [kฑ€@๋฿ ซ-Tค|…จxWฤ:uฒ_่:ตด ›ฤ’ฺHซทิœq๕ฌZฯ‡๕(ฅึtBย)๎mูŸL‘Œ๗ว\s_`ลจE<ฤ%•ูW’›…U ิ bO๋ิzึVšwดŽ๒ใตต‹หX%ยช ^0I่0q๓qšทฺZ๊Šˆฤa๙ีูฮF=kํ]&ึ{๕บธำ‡ท—nษอถไ†"<‹ฐa๕อA}•่Q๘‚ phห:’ฯ0kiค?ฤึไศ`wลYj—tM3ไPสN}fฤ!€ม็-ภ ๆaท9๘J`dqŒ็< ๛U๐ฎ‡ฌุ=–ฃแFๅX›[Hํ\๘ฟ.dเqŽ:๕ฎR๛๐ญอไ“[jt‡ืญx๖‘๖aแโๆH/ฎn@Tyำซเt9๋๚Tไš]ฬ๑…ฉpcMช ^ณƒŒm&<(ใๅ\™$ํ2Vๅุ๕{IฆšxืฬปiฤežัฃRGฃ๒O้Ї๑_ƒtฯOn|GแCจญ™- ,๎งœgภทAรqฺกl5 c35บœ*อปใ๒ซfืฮค[ฮ7฿@สGัฐq\้ษ>งGฏุฯ‚าK[ยึzLLp>๑ฌKผsวลs์ ญU๛๐dฑสl|>oฮ๕1ฒjฮ‹œซ๙ฺxเ Œpyโrุ้ˆgL‚)“dชF<็9=+ฦ‹d๗Ksayum8ฺrHฮU๑ฑšำอ›}HฺˆO์/ยwL๒iณX4ชGง๊,V6มรzถFHภวozๆฏ?ู๋G‘โ‚วYึmžR?๓Pม$i๊ปAWs ^หkจGADq/ยyq’Oฮk4๗qษ๋!้ด5UŸ"่ษฺ–5ฐฏZดi๛2Xcฮ7Šธภ,ผqษ8๕ฎj๛์ล–7โฺใGœก ธ‹Dภ67#ธ่M}ewงXฮVIโ†Aล#เŸlfดฎ,ฌไ"ฒ†%ว#1๋Œใ9ฎ…ชหฃŒOะฦm^ิ^Kโ›wo(u… ฿๊NC)h๐?™dt"ปฝ์๗ยšญƒkำ-<้™˜^ฮฌXล๘–A9ฺชนฦGOถีƒ(kQ"3ฬ@ฟ ์N?:ะผ† 5upไm. ? 6Cใฑม๕ฌžlฉ5Š_ฑ^๊ทOฟืlขPฬVฺU‘UAภ˜ฯ‹ ิรŽฝซ-’k–ุ๓c%๎™eช[ดZ‹หq {™ฎ"ณ่๖๖:M„VzlBส์‰Iฺ2y๋ืšี–๒("=ฅ”ŒดŸฉวjืง„XมPบปw~ฝ}x๔WVเ•%{ซ“ฅ๛เ#PŸaXงป๓"ฆะ 9ร dj^YdŽ8ๅm์8Œžซ+ผาถูฅS&2C7=;8ลC‰*L฿ธ พ9/nUc_…-ก9งึชฺ…ดAแg^1ท?่AลGKeu•,แ‰k fต”K7k`๕ŠงN…ฏิ™7ฉฟx ํฯ%ฑลamAcศŽ€=BDl๒rๆต"บฦ@ำวาฎ,ูmจ@ใšบ•v*ใ}หึ๖ๅีSjํ h๚vฌqฝไLฦ2’vวฎตณช@"!ŸnsT7œmใฺ–(ื+s35ุ–ไ็knสใn•s"=ภน๊ฆjวธ‘?ล>คjาB#ปy…ค-+ฑฬ>๘=?ืJ•&Wj7ใณŒ˜โนC‘“†๊ค฿,๓jส4;hำ๗Qฉ'†$NI็žน๊ห{†“ส-‹จ*IaŸjูKนห,€we9?•Wt‹ิHป IŒ) ฦ%o‡ๅƒŽๆฃฎ|1,žW“q,"'฿[‡๘N1ฦ{cOญฅ‰ฒ‡Nด–ถซ,ึ้+Yพ#ฦFI๏[Iเ6ใLHฏ๔9$^ป D็‰vŒ/@q๔ฎศ4ๅ†@ žฎ›I1ล๎มใท•VY&๘-E๔:-•ตลvVb๒เ(–hใ?ฝวw๘ŽO$๒~”ฟด–oผ8xข{Œ %ƒ|rนฮpNN9'ฅM•s˜o—9ฌฎนส‘ษ:ิ''ห DŒ๛ฌ ช–-!$๔ง5โOkถ‚ฺ็แˆ2บ€ภžGแ ๓jda’ไ๕ญ[™<ศœd?๔ญเฺvŒd•Q—IถK[uI7+ฐ!bqะc=ชA‘€}ชufG-œฑ๕R*VTŠE_?tLaม๙ญท™m6>๎O%ธ์3V˜รqืญ[&ฃjฃ๑lžส@kฝYs๗qฟำฝUถJHฮญ!B<ฬฯ&ฏเeฮ=: ี++Œ์*™ไ‘Šึ–)a`Zmจz๓=๊ญ2้ขUค ฿๏ใŽ•apwbw 1ฤžON?ภิMิฏ”3^„Oำฅ@๊ฬ๑>ฦ–2ผœƒึNิัNบ]อฦุิ‰J$วง็Eศ%•]ๅHXท^Hศ้๕ฎQ๏5•ใI'I๎ม๕ฉวดถ๒ ็ฟ>๔PH‡&ษKขเ \๕ษ$๒ว้P๗บฆฅ k[i฿vC}่จ/„Ÿ '้[ฦๆPŠfw2๒ๅXc,r23฿ฎถต’_‰ํว“ท?ฺ๋ฅpC8S^๑I™โX๒Hv„ฟิ๎##ไ+ƒ๑(ืต‹่ํา8Yฆ‡ฮŒNZES๑@qœ7ฅ{„๚lŽลคยŽ@ 3Nฝz ษ + 7ฺT ฬO|็ื5ช’ชฃ:wg›๘3รmฌZ5ๆปฅ๙WM.๘ๅ22.ำJชrใ‚0s^ xzหK•งฒ‚(ู†ํั d๔๙žzุŽh<ฝถลP„ํS€ว`•]$\œ cฐว8ว$vงšตืBพคัปน,พRฌc‰ฮqž3_NŒึนH๏ฤื2ห<{X `˜’2Xg#ภ๊s๙h?“–‰™Oย1rwŸ‹ืŠด.ฤX๘]{ผv๗๚*>Cšชwิ—วCฐตšึIHTูน†โŽpzžr>*Eมโ5Uไย๖๋ฮฟ5สZLcŒฌR5ฮค†ไŒu็Sฯ^jUnขŽ@ฌUœ ฐŒ๕้๕Aซ๒ฒyฮ@fpsQ7: HหFŠ?ฯ\?หึฃjn„N๙โP>7m๋๓โฃoก7๊Mผค๗ซUไœVˆผF$W Œ :zbฑฝB]zqQ@ุ}งไ้Zา:Žธ™ฌ-pใqญg%JŸ™ซ4ศMžuวึ#1็ดdบใ‘ํXเH็ˆ2V;ฆC–#๊kq5ฏ( ็ง ๕ฮซป ช1ใYc‰rHค๋ฎฆSi65‡”|D69เโฎk™ฎFฃณ…kYฅชaฅ^ฝI%jn๔๕1งsUyซฑeŠ๛š6้;Œจ8ษ?แS:t๘˜0„VX'ำภฒพ฿ํ[๐Kbย['๙ฎ@ช<ญ—X’2มฅ*U=qษญฤตU๎d#ีม๋Z๐^ZFr—sฦรc๒ตกlุ๒ๅ.9ฌพฅบt*‡MT$ช ฺฌ}TYทศ๑ญ ฝ]๓"F?•cBM™_ƒฝฒ;Uqrค8'ิrsZฑศHkคว*[ŸG\ไeฤ™#@+šPฒdธษษภ"ก/ฎf’ใjEฮ$ ๛ซIญIS‰ๅฦ9ˆฯ๋Xล”$ฏฦ๘˜x๚ีถ‘ธมuu vˆ~๗œ,OฮชำภFŒƒŸ„ุ๖?Lึeณ…GBOJฯ%‡žฃ2ม‡#ŸJTWฉmช™7Vร(8ว8จ4ฑ1๎$n@[–๛-U#ฟn/ิzŸาฒ›กท+รไcก๏ลie(ฒาั"€ฒ‡๓๘˜ ็่ีณ+พ2์A่3œ๊ฝว…‹q’O๒ช-ส€รŒฎ•6E’ฃฐcอ^!ภ'j“œาชทH?—๛ฏ๋ํWฌ‚ํฑFฌ–า9;~ตXt้ทeœL๖ฌอrเqŒ๖ฌm|เž9_ๅJฑะŽฬฉไb`+j•๏'ฎ๖8๙ิ,šคแˆXุ่Ek~฿\˜žCคrฌ0s๋ื‘Ÿฮ› g] ร@ Bคœgฃ5ํR{c"4ฏค`7๙}ิเ ํ ำŽsPk7k+‹{;ซ†ศฺC€œไp}@#•‡Rี๏็ตพ‚๖+K}?๎งอ7qดŒ2F` c6z{,l—4aƒVำuK‰ฆim๎ฆ?u,i6ชฑY๛‰Ž9ฦxเ‘ZZŸ‹lฌ๔ๅฒฟKK)-$;lsฟ๗ืโ8$+ษ|qซษแ]jm.-GQG\C< ฐย…iHฟฮCw™>kฏjjWqษ5ํ๘$—ช Q†nฯ้]8๔๛ฒ๘ค{คพ<๐งฃ๛็‰Zโ๊%,c‡N’D’ESp /|qฦ@Koณฟ.sแฝKHม๕F๛=๑‚’†5|Žยš๚ุษo!ภe>ูซลpๆใoถM[ํ ๙xชฏŸแฝ^ ฤ.็ต`ฃ>ญŒ๎kขท๛๑lศŽcำ"Žฝ๚๙ Ÿาพ™–๑&่:`Tิu‹ูํผ‹ใk%พํv*~@T=D๛ภmม|B๑๎ธึดX๔]๓?๊#ฎ‡ย_aถvzž3ิํn๔ฏปOธ๙ซ"ศH๘๒@hฯ]ภ็ฅw/r@ฦ›ƒโมฤ˜~„ึ“^_ฬ$ฉv๔ช<ำ|Y$H๛<๛2ธ[ˆํ<9ฌห"ยH๎ไไ@ (S๏ศ๖จแ๖Eแซุ็šืKผณ‘Jถนฝ`W‚[s ๎‘œ็ฅK‰โ`dwVเฑ๋ฉwu%ษอHdP0ฑž>D-UJ~ค9#HxCGฯ[jหœมuvาYR™ไgโฯv๚X‰m!O=,-F๎a!ื>งง5ศO|Jช++ศห89*ำ}# ฯศ1๒ไЉ|]XR~‡ค^[E1พท๗ศก,ส^ห, ํใงlใ<ึxoด”@หD๒?˜ๅmป‡$ddr=๋สdฝ]รtLฤ`WMŸะUR?w ้!^qTQŠ่[sgฎพฟงภ‘˜๎nd(y$`๗๕้ศ๔จ ๕น•ฅเจเฐํ“ฮz๕ฎ=TฏG…rrI H2y5Oฺ›Qvว<ฑ‘ฟฅ) gnท*ถA‘‚ฃาณฅ๎มฐˆ{ŽUAลp฿ด๗.ึ’0ง‚rzา++๊ท`‰ะFV^ฃนอZขส‘วซคจภฏ Q>^•Šใ_€gสวภ?S\lz‚ฑ~2y๒มวๆEmG}IัŸธ,ฃ*}ุvจ๒โN๙rk“HธทHฃสœg† ๏ฆพพm“?’สTข6ษŸ.k.หfฬฉ˜yฯ\œจ'ฒD๖ฐฆ6K1็๔ใจๆฅE.ˆ‹oจx.&ทW ๐เฎ0‡‚Ž๖ซฬW-†ฌ2๔>ยฏWŽv1$LญŒฐฺ๕9ชƒ,ํJษP yนwไqRศF•ฤือผษqUYT=ม๎:s๓ฌฉiพ๛ บถบุษ ‰ภn๛2W<œqŠอฒ6Qo0X6ใฟๅœ๓฿๛ี‘ฦ0ัซ6?ˆว_oZคฏฑu]ฬ๑M2‚ฅฺWฦึi—โ?–Vy&ป•JM&ี‡'ฟ๑ยœ’้ำ7{N+o๏;TหŒ๖k'hคhหU+•uˆ3:gญ\ืNฬIYณะ† ฅ^๗ศฤ‰#b=๏XL–ุ%บ(<’ช๑Tุ[qtทฦปค ว #œ`Vช_E+„ยฎฑ๋#Elไ Q—=k Y[๎ROย7^๔ูCušื7—/ฬf™OEญ๛)ต~Œc+ธF็โ๚ŽีFŠ$dVcธ2sดtฮyฌ‘]$g€7ลำ๋ššข,†๓Sฺ|ศTƒะ็n>•YT—2ๅpH'#๔ญ95 ส|*6๕์j\jrDศนaีSโbI๔ิะณuฐญ‰ฟˆ^x๗๚ ีš๊ตท]–@Aล๚IeTŠ}ฌ6ก๏ŽŸึชb’`ZๆG. ?.็jดMšฎj๊อถล<  ็žH๗ดฆ๑5rFfณ"B฿หLƒ•fศ tPGeอL][[’ \หศฃเผrjึhๆ‘ R^Msผฎp๛aิ๑ืŽ็šดx|อMo-ห้๑ค€เ>อภ$t ฏึฌปีกšื๎ทmnbศ[ฮแfM]&›>Yแฝ(]ทymE#,:Œ8๕'ญkห ลฑCถrค1ถะNz/ฆ9่kT“่fํบFก ฐKx.ๅc•mจ8์0*V๓Yškt†’$~•ค(ห฿แ#าธ;ป;—2 ษ€$f(U~d๒ฦค๔๕„ฦ ฤ์ส:ผฑ…2Fj๊4Qสอู5/9Z(ิ็yษ#ŸQVศึ’ Tิคธ—9? UO^OSำตG^\$s0hฺ5์ฌwฮด//nFŽว ฎ[>ชh‹%ๅ„G๋ช8+ฐŸˆLะิ|pฦ.„/:n—H=^ฟ•AภาGxื@๚Ep๏ๅ้…"ฏธปผY`ปŽยะณทXฃุR2>y๙ิืนŽžKึาๅx.(รฉ‰ฦ~ œ–3IŸเiๅEvd™ต.งฎL2๚ดcด>c]ต.ฃซ,฿^ฟ ม ™>Me๛ป…มSŽ๘a)%X„Ÿ–?:บImฒ6่ลv฿a{๒ฝ ็๏ฑ๒Z/ขh2‚๗Z OSผ$|ถœสบฅIษ๒mไr  ,I๗vซฎ4-OQท ชฤ™ ฦwx9ษฦฎ›^ลy์pšฏ…<>ศํd๚ตฅม0Yำ=ณฌๆ}ซŸ๖Yฌ๊1oดฝฒ๑ฬวŠ์“CีC๕@หq$Sฃะไ~Uั่šeW oตaไƒ’“MฝO#9๙UžYEpหEพ็–\’๘Žิ#Oคคล#•nฤุ เ*รP+$fหๅผZ†ฐฟผ1ยL„๚ ž˜q^๒ืฅณคž]ื˜JBถ€ๅN๒ เเ๕+šŽHูว™.๖ภ eฒ{ใ‹<ฺไ—์yฯู|m)6zฤ‹๒Z1#๊1Ÿสตn>ห๎ใM้ซู”T.ํ$2* I<เWฏอง=ึŸ0€\ศ฿ ศสศS`๋Z!‚[‡ฒทื[PธŠ3ๆฃ0,6&#ถ;Œ๛ีVyL๑}+มWšŒ“,wv1ํ†A็ฉ๊WrŒcงลŠ๔ ฒm6+F–๎g’BกLr…!ป•ู๓]บXE!ทK๛?aEม89้‘Ž8ฌ&ู๊$t‚Y ภWc7#นใ€=i,น%ำย๊ศย~าณ$š|—E8g@ŸLœc๒ฎ‚;ฝ:ูYm๔{๕Œwb/ำญhk—wฦ"ูž"ลSmุศฯ@8เžฒk^ฦIญ๖ษ>ƒช|๋‹ทn“’X ๏ไ8#จโฺทฯโV๙ใ๖&V๒+…O&@Q€ฃว.jฟwžT\.ภ๏๙fถ^ฺุม<ŒdvตนI;`ถUH=1•'fณหqlbถ1วดอ็$ใทกใธ'’ตQูd‘ˆ๒รท‚๘j‡VบIบยคq–8๛๓Xeพาไ%.^PBuQๅ๖ไ~"KธฅGดะ‡Xห7Œi™ี๚0=็ฆOึก ‹Qฝ๏0ย$เJสXn3๙Vฤwyl๏็๗Qฐงฏ ื6’นExญ์Ÿ0Fแ€8ศg้ืฎxลm}ฺg@’ร*กPฎNrคœ\vวิ7๊J^‡MopพYigy“‘ŸOO_—^*Z;ญ)L`[’ว‚ $W,š<, ‘0‹qศ ’qŒง8d—Až๊ศึฌั@&๓{ไ`ฉฌฃ๊h“๔:hฎtทป‰ฃlฏœ24ัท๙ฐH'ท^ี[ษ๎$฿ๆย…’)ๅ“แlu ฐฐฯOหญqื:mํท๎ๆี-5ฬล-ผR‚Wฆ7 tฺ๋ป ^ตIฌดKW บีย0เpศ@<žœU%๊น-่๘.D–6ข”0^7ฦsŒ๐ร๕ญ›6v‘ลไ’๐์E$~ตdบœ2]2ร-ฌงC"Žฃ“ำกม๖9อjหซZMท˜ O,nต™dTŸ\)ลkMpแิvwl๔!I๙๗ตcK๒œ™พ#ะ3†5)ษ!:0ฤiนวไuฌืVๅw1dไŒฐฯ?1Z“๋ŠAQ+ใ8OืŒbต$ิX๊zŒธŠ–จชd๔ฉŒล"Hœƒjอ๗Bเฃ`๑œfนQ|zAฯaW. Rฤ๔๔ฉHYิๅ0฿บ@z?๏(ฅU๑Aƒะg๑`ๆำTUq๎jแฌIศฮzš–ฝ‚gVเg*ืชึชอธ6 ิึ{oซ†ฐ;ตQฏbษฃ E  nz UX1ลsรVSC๓ ีฑjญHฒq&]ry ้X_ษ^ฌฤ๛T[j>ใšร%๊ฑ่ tใญWk'r$'•œmภ๊ษ+ํc&H‰ng๋D`aqZฯ3Hฦ~u4ั‰ธดk+]Cว”้ŸrG๋Pฤ’9ว็VŸ ฉM‘Dœ๚ฌ๑‘ฑฒฟ_•]ชอฬฒฦล\•ฯฏฝ_อnI…‚UZnb‘? ์เๅD*ว8*?ะฉํ#ธ‹™"ผŒื ๗ณท ฬGธซEร๕'*TˆฺvฅZใ๗เ์ชz|ฝ?ฅa}.ั™|ž6ใ8ฯฟ?ฺนqu'E|ชฆiฯโ‘ฐ{f›†ำจ๛ด ƒ.฿SŸห๔ฌRว๘Uีk™๓X๊ž:ีฅ™ZnI็Ž#œHฮV&‚#๐ฒFภšกึ9$~\ี0 $rดฑFล }ฃ๓๑nมฯO—Jภ–6๑ฃ  ๋ฝฮO็าต๖1ˆใฎถผv๖ฉศุŒะวo;Is€Jp0ตQฎIว ร,z๓฿‹ศวVณV>ลoŠS๒งxุmyฒ’Hน'=ฮ;…bLžB6•ม8s฿้๓ฌ[ca๘sะ“U ๆฯฉจ6™าe 2[ qด๒z~|๓Uขข@Tษœƒ๐๕ฑญV๓Ns๓ช์rq•E“Fi.ไ~‘ฉ9'‘ะSฯ™ธ .?ZขใŽฝ:bฒ"n?ƒ๏š[ย ฿†๎5eR ฦ‘ะœsžตsฺ‚ฤฆc็ฒ็u๔ญีYNG ๋อ^ถษyอZูjAf‹๑Icิ““[Tg๐วๅฺถฤjo–+"ฤ3ยŒิ‘ญ l *(ฒ+4lู๛bณคg9ุ˜๖ๆฏhTŽƒถjคฃYไ”.เฮ„ำ#็XึYีJก<๐ o€ไ‘Œ๐{ึxู๑Žy้oj•ม’่ฃ€rอ€y๒Mf๛ฝณƒด‡=ษZฦ% Ÿƒi๎1อ มมฝ๚T6 ดแŠ๚œŠถเศ!ร/ฎใภญนสŒ’I'๔ซ>๐ผ๐F89ใ:šฒ,ส๒‚ฏวUชาar8็Žž๕tฒขฉซ๋ฯ๗ฃ˜ฒw• ˜Ž>ฝชv‘ธมๆศ\ขoaเซา+ฒrbqด๊6ึtน†฿9c’3Œํ•ฏwจm\ล๑gปฮj6ภ™pL…ฯ๑vซ ^กN88ฮqำตFษชdบ-ษเ)ไะc๓ฌฤป ‘ัฝิ๑มฏฯฅ^š+vnKz|ษ7z็ƒำ9๚fฎK‡โฦvใใ๋Qฅ61เ‡ํลุ)> Tั™ธษ=G๙ืc๎$e‰ไ๔เaFคจGอkข ษ็ }k7‚A€z|‰ใœ“ม‘ไไROรืŸ˜มญ)]Žๆ;น๘A$qYž๖ิŸฝ8g8่M`k'8ŠEf#$เไ”ฉhธZC•6ึ<๕ไŠอgjช์้x๎ร๘Q๙T|ฒล-ค†+่กœฦPC) @ ใฟ@~Uลฺ๋•‡˜๏—4“(v’ ษ•รŒ สฒ๖ฮภp=อ^0”ธ!ษ#ำ. Jอkฤปฟ+นGC’Oว#<๑^wโm#ฤZcกh‘j[ร{\‡' ใณe๎ฃิcูํๅs$[Žผีบgุ_†แพ๑ฎ๊—1ํโ4Hขมฯ_3'?, ๕ิ7rcG๑1$ึŒืM#ด}?ํT๓rzฒx8น?ูยD–msU€…Q,ožVดggํ ‡WฤฺŒg=dถว๕฿G4ฑพ่ั@ฦ9็๊พuู9Rซ฿ก?žfOQh๒CŸา4cgโ๋}เpทVe๚ฃ1•sา„๘น๙3่— ี^;กพŽ จํw rf2ŒFš]nety๏มu›*๎EฤŒ ผSVHO๊\ิ.ฏg.“›Sทkx#oอ็†X“๙Žc8gฏน+oiW7ฆึี็–L2ฉ ว2>ะธ๕#ษญ# ่b์๔fศ ฮr:์5D,ฯ„g-๏๕ส&พญ$ซ %ี$(d!Mนภ$‚y่v๕ลHฺjw†ๆืEีnaะ[HWๆ…{ิํขผ fnžbใV@e€ใานXตฆk…ถธ…์๎]ถˆ.ๆXŸงR ๘~DƒฯJฌ>$ฑkป—KŒๅ๕9ฮ0Hเ็ฉ 6Xถu‚โeyลkO OIขY๐C๓u‚ังบ“ห†B_ํ,™ z`œึ้ฐิ’!!yL8`๋ƒ๕ฯ_nตZฉ7/CฮXเฬXใขถkZY%ฑo)๔-ฯ๔5ปqฆฑYBฬร H0HวQŸjฑtซจ‘Lzrฦ˜เƒว็VปคDฌย#JŽใ#๛ีฏ4m†y _g‹ฏศง9๊Pูเmด@CuญyVh๒ฎ&\upย›,oฃEfYwโfว๒;œ+ ๛ดเg฿๕ญ้หํ?yฑธa๊ฮฤํZอscoค!€ไ๙AฟSœ~u_$ทšjบฌ$ K•–dฌbฟ๛›_Lฟเks๖ลคMต ดlx ืhขjPอ˜ล์LW9Ÿ‡ุ๚cซไ2|ใEw๛Bจฒ iHษ‰>ศP+~3)U๒๎ฃ”6@หZสัศFmขuqกy=บ๕จxI๓HฤLˆศฒษวๆ+$@ย2ฐ>ภg๓ลJ˜'I cL’Gฟoลƒ๐็ถqšว‰รˆฦ™w@8(>~•>Qi…–P๗8ฯAœUR2c†เ็าทใฑšQ Žอทt$ฉ๘Gฉฯ๊e(  1*ฮn:฿@iฐo5U Nฆ0กมŸ_ŸZI0v๕#?‘ๆฏŠาโฮะ*ฏ9+•ฮqฮykbUxๆh bฆsาญถˆcRก0ช]๓ูปึฬjฤ€c 3€HเsZ|ตŠ๗ZKพKตQŸ™=k:๊* ธนcz‡๋ึฃlูO;-™ะq6ณ๛žY*ซ…œc(Rผ๗๏ศFจบŒเ,ร Ÿด˜ฯง"ญ›Vฎะฑ†lLภ„ม้€GJฃEำ/Ž=ญ‚ฏ ษ9f>วณT’F‹Hธ๘z’T~]ฯjี}]„กโอHƒ๎Rฮ9ษไŸO๏Wลs|ฮศื–ใ ~%h‚ใ็๛cZซ‹-hฮญvNEป๚ีwฮ…ไr''ิ๐y5ˆห0\ฬ†U' <ลๅ}ถ๐>DึฝŸs‘o6 …ษ๋Qด›2ผ—.๙d™๘8ฺ™wศชจWsŒภ ภ6Byญ&ิ๏fUK{†Us…pฝม Jฮซจ\6๙m2Oุdz@๙š‡™”BA\ฉ้ท{6Gnุkiดูึ#ไJฌถฏcท ฦI$„0ฦ lŸฬšศ๗ ™เ`yI๗9>•›4F9๔็,๏ว'i๙q๒ซN o-ฦฮ‹h็็ŒVฦ๛ŒfYํ"Ÿฐ @?ฅf๒ยศๆ;คeฺหธ†ใ< }1iBหkt‘ฮ]๕๚tซf„ป+fE,ม›ศฏjฬย(™ฅผ*–`‘ฑžz๛zีึษk8aนvF BภvŒŒ็yฯ\ใๅา‰ 5cV‰ืˆษƒ–#็ไpX๗(ฺพNาค’วศ?ญmผqดŒ‹&๒ธค.FLำ5ซ4L";Z5p฿ mฟ\๒y๖ซ$E‘ฒ+สร5,;‡ยO8้๋อk”ฆ9Ÿ๙ีo%ecฐ:b.ไTC-๔ค์๎สมŒ‘ล]"–IฌฒISวRXc>•v๙ cq'<ŸO๑เ๚ิ2้Z“๒ะฮ™ไr?ฆZศบ๛ถ$i ๑ •ZŠูต5ณปมุ็ื<{~œVณูNpจม|''๕ซฯ‡nๆK‰ฮ0คc๚ี๋แ๙v.๏0ฃ?Š๖ไqSDYฌtŒา\ศฤ@ฝ๋vล#‘D™‘6’IวฏJฃ้ถ๖Hฯwyxจ9'ฮŒrxผVีฃูศ์ฐC{:จปอต{ŒŸสงkDZf•อ“€หmDcฃSลkษc$๔ใณŽjdสŽ %Œฑ‚–L€{‘“ฯิ!ดิ๏ešาฺ ไ6r,w/ƒ6ณฒ$d*Aใ=*หŠ๔1N!…Iw*2โnไเPGg ธธ:มeฅx‚+฿ื„š(BŸ.XฎญฆpHใ$ศq๏Š™›Iีี|ฤท฿)๘๑œ+ฑbžฌ ;ŠทคS๎ˆwžฦ3&f1ฎ๗รr@ษ๎?1Yข+$[โณธ#8๘—a๖8bฯจญ_IธบดI#‘kจNฎJiศ์แ1ษ๋ฦyภ8๏[พ๙R4ฏ=ๅญฬ“วxว%ฮ@/ยWoฮ?ไt‚VaJท& -n"eณซmฮ2=czถาDฦ›‰da๐9Œ’Gdฑ๘T1 ฃุc๒ซJwช‹] ๔ 6-3(’^์%B็' FฏM4-บF–ขKxไ๓GHUฝwIวNs[ฐx"7~5 ใœu๕ตiเ›>f{ปผ”0ฯศqYนKิบHƒ0Mา2<นษฺ-ุ9 Œdž>ž๕|6rJUผ๖Vธ ธ๚ํ๕ฎฆ ํŠ,7JิI+`รฐ?*ห%ฆฅ๐[NOแหŒ๗#5W9.ล”"๛œผ:Sว4o$SนHยF<อŠ„gNI๏R๖6–ษฃ!X6๕ษ9#9ษ}ลbผาu‹‹”1B@bเวf8ใ%๒1ํ๋X“Kึ„ฒ›'šโlrฐ.1ๅF\Žใ#T96JŠEืบrส$ว1nHนห1ะแไ็ืถyซfำmฅ‰กนณŠHŒf"~๕ตŠ‘ฟฦz—JพLomtใฮฐซ์N{•DาgFณBฑ—ศ๒฿y“p์cษ žว zTndํFž›คฺX^Myh'ŽIใ™ˆ๘sœใ?รำŽ8ฉ›๛ำ/—g%ฦ2d^ žy็ๆy๙ŒbตL฿{ฃคPอ$Nแœไ.฿๘Fn;๚๑ฯ5ฃc,q0(ฬ–ฤห็v็`๗5 n๊Jเ้`ึ—3G‘๗ุ#•3dˆ`Œใ่zึๅ‡‰Bฯnd1\4พฮ๕C ฯย๘ซ–ฤ/#ฒ‹#Žฟฅ7ฤŒึ26> ฯเีพy์ทฮถอšุ#tขช€ŒgฎqQๆ!ฑš๋,„pน5‘|า;cถ0œm?*ษด ๒ูฯฅUไ๖, k'™ฮ3๓Ÿโโ"ฎฮ}xช†psต>็Trlฒ@ฮ2*พUvvฉf๒ีGSฟŠฦ[-€TƒลTฑq$๔Šท#5’&ˆ“ฝศ=8zลVR้ล„{3S<ึs'cŽนภˆ!๓ษ 1๎ฺฤO\ธ’z~]kฎชู'ป[5F“p  N854ศฒ็<เ๐1้“Xฮใ8E๑ธศ฿8ฦ:๐9'฿ฝUœไํŽฅc'•Zgv˜;ะฟงtŸกVืฉdำcVf”– โ8šB…๔žfณ4็kํฯ๑ž~”๓ฃภ!ศฯ@Qน๚Uส๑ฟแ$เํท๘Uถ๛ฟrฬ๘Iม8ฮ2{ ี@l…}ณวฒˆฌ;๎+ ˆw ŠจฬำVn›_ๆ1Šผ—ฮŽ>|VะŒะbซฑ@่)ฑฝšžVฦI๙šช[Ž0H€Vษุ=?:กeื๋Sๅกฝ˜ึœ–lzgตd๊$๛T3฿๓ก—ํษ4๒ะฬฟwBzฦ0 ณยnวVฌฎา*q‡ƒN(ฌAcผ^•;PnจXฦ1ุ pฆkEๅrคq•b๓วจ์?ทฅ(‹%DQm$ƒ๑:uช,ฌ\nVcŽ„TQ6JๅFrBžuช›ฅ๕๔พตอ ็‘އc;|dธ ึข‰ฒk๏K9ฯn?ตP_ # xอCn๎%”๓ตcฒเ!3p$Gิvอ6ฤป_`.3๊Jึ:ƒก ดcZัY๏; ‡ิUUส-ˆะNาy์:g็Mฃqธ—ำศว;rภ,็งจ๖ซ๖้nVต$’@จง วลว9เ+NูยยG'™ห:หc‚ฌงŒzt5l#aทTŒิ๙’3ฮrNsžGฏZฒ‰Vอฯฝe0ฬฎฐ๑ณdฦ:€“ฮi5ร+บ4๋ภTฐW<แตEฏ ’ๅc'!ท6฿'*ุณ&%>eบ ธ8Vใo9#฿ุŒTํข7ฉi4ะศษ,จL7–zฏ๛U-ํ]ี7\๏ฮ'#มไิb3–๒ eท,‰!ใพ6ๆค~๐’DUขesaท}‰ๆกฆJh฿N-ฦ“แ9ศ=r;๛Uฒ ฅ$ํ$๋๋Q~|ฮr ั’ฌ=s๋๓ใๅWฅล๔qฒญใ|dNF=1€ญ)‹Fร[ฤฝ f^ฬ‰Ÿ.;๚UKN๔E-ทไ๕๔ซลหศๆb;จ ๓*ฬ“ศห$`‚x?J‚KไfDi-๖ฦไ3ƒ‘(<†จ#ฆ8๙ฌ’ZY3ซB๊C.2#Šื๒cv `Œธ‹`้TDvจŒ ผaGzTฺ ุ0จaฤ$O!€๗ึH#ฯ๏Aมฮzuโฉไ!ฤ ๔#8๖ฌข๓œศ\–5‰ไ/–ฌqิ)ว็T”u†่rH๚ชแaƒ*ร `cZบ8Jเ7รวcฯ๕ฅ“Fฃy๖ฃฑ$ )ฏ{qŽตl3[fโGถ1ฦG<J฿HT€_“ิะ.sฝน๖ๆฃqAพ‘ƒบ&กภว'{V ด dSป๎แr R์Gหžs]ต็ •mNsกซZอฯำิ๒?:ถ๗๊Fี่rmkgbZๆโฺาแข๏b๙ฮ0ƒฯ=zึลฎฝข\ฬว๏–>\žQ’| ฯ\†${cตt ฆยpZฺล˜q—ท'?\ๆฑษฃF๊AทฒB–สฅ‰โญพ/ฉ 5ะใ5ํ^ภ๋ื๚Mฮฉsฌสแ๎#ฒˆฑ`mฤปlฮาง๋ŒqZ’๋/ษ%Ÿˆ‘‘dทMลภœ็ฐใwฏ‘]ฌZ@šZูล๑"EE%บž0GะŠิผาฏVัaำu G&แt.A}็ ฟ=wgถsZ)ภŽ{œ๕Žฝ๒Z›จ`žL๔มมฺ๙๖ซล๑ ๅXตหZ-ฬขำ%†mซบfŽV™FๆภmชชฃŒพkv๎รฤVาBธ˜*,ท6cœ๎ ภzgTqK‚jDะฝ‰ภ๖งŸ ?Œ็ิkฺ๊…นฆๆ๛ฒ ๖e€ํlืsฯ5eึซF๒5ซJŠ์พ`€ฤธ†๘˜$|ทj…ทิ5#ฆŸรํ;บ›{džaG๕วฅfต๐๖“iyVจ ผP8ว'Ž•ี๘ฬSหว<~bน<ษZ ,4› %Žž๐L8YB(-žผŽŸZ‘/#ฐอซ;šฏ^}ol>ƒ๓P„zจชน_RTkก+สกื๎1ศ ร๔๘yตซจGyqo$)mg"9๘ฃ•฿kื€ุี9ƒˆฆื=ฟQE*์l๓อ_์๛Mฟ3 k[;“aฬ;Jฐ๊wศ๐Ž=ช+มw:NำcจF๛ฒฮ“l8้๐แ~3žNkัB7pฟฅWหnมGิVž|บๅฃฯWม๖ึฺKXY้ั๛–V›S,ป ลz๎ม๕๙bนอ์’ฦ…ฦฅคข[h์f]ฑ๑‚2สๅŽ1†๋ž+ู<ฃๆ*ึ‡=ศ”ŽjหQ4G”;์๖oQปปึ5 ˆ"eถI๎› Xs‘Œg85ฉ๘ M[ศิZห9ษ]J๒ ฯ8Rึไ๕๕ม๗ฏ]6j˜|˜VDท 1ห/ฃ0"กg’%ใGู๘"่อ‹%ดำ- lญmข๎W$๎]€ ๚…ฯึถด ]7ตผšP†฿<อ,ส็*œยวฏ:๕Vถ†ส๚ตAi่ลB3R๕}J๙ISจ๘/]ิฌ๗ฺใPR xู]ุจvhmไ๔๋วZŸำ;gnำฺุ๊ฅฒMยHฉJ…๋ฮpงๅ]”–0ผฬ@0G*>  dษœ์C์ภ๚ิ<๒d๙H‚–ฮฬFๆึฮๅxสท–ำB=Jศ~}ภฅsh.#C{“ํ‘spIุะีOถS‘o o\็๚šฏšษ๒ัฤลฆiซtำฆ“z’ศtYสฃ็ฉd๛‘[& 9 ำ[Œ1˜†L)\m๚๋คฒ†N8ภ๖TโฐอUlคŽฟ"ƒ๛Sอll9 ;Oฝš)Z฿QYbmสั๊3}วCXeฦDzดoัžK‘+2.้ˆWtถกz7ื+Yะ\Œ๛’*Vi!ๅฃฮ฿รึW๎lbBํXไJŒc k#่vขะ[ivF `Œ [=C;†ศฏ@d 0ัฦ๋?ใT๘B/สC4๓ค<ดqVYZ„MKตE]Dฬ=92~bถ?ij2(Yด๑"น๊ฑ(?\c๓ฎปร3/สZฑ’r0o.1ๅๅQๆ'ี w8๙ด๘.Ksฃซ?\ํฯฬšึ}6ม8}0ฦOฌ๊๊ยปwด๓l’ณ๘ค EkษŒม๓dRj<มฐใM…Ÿร‹›œท+ม๋diw …แดพ๘ป  ฑบ—าทฏ2 >ซตตk?‡eไฑ“ฯqMใaฮฆ‡ฉ66ูOดw{ฬŸึถcะoŒƒฬM™9ๆBU/‡žบญวศ„?ฺท˜6แ็๎ัว6ฑ๘Me•šโ๊ๅˆ%TlCBMmCเ1ผ็8ฦ$“ฯ5พบLAƒy: ~Xซๆฑ?฿๒DQผ†ผ.št6๕+6?๊ญฅำtแ-d“œส‡โ=ฮ?ํZF71Ÿฬ0ญู๓เmฟq้+๙ฉˆฺห…•’ดmmhฑly ๅ’=8'#็Šยฐ[[yึถจม’๎u ฦk’201Ž>ฆฒ~ฯธเผ„นd• ฌ๑[฿ฏโิํฺ๏!ฆไ6ณRุlvy๏๓…|"d(‡้Zolฎห [r~ณ0*iํg‘vฝๅฃ#kต…่Š๚ภ/ฃY?ฅNไ6ฒ]ฺdc๗X'฿ˆษPฎsŸหฏzึ“Bฑi๗ฬ?‰฿๕lUะOฆ_Hฟ๏t—>ฆูื๔V/ู๚ภPขmh้—a•5๊Wc โาmา0Šจง๘dLS๊ 9?Zป๎1G0-q3ํ๑กวชz[-O”่ฮ=ั…fKY†<ศ๔ร์ฌร๛T๏DldฺE'(ายXWo๖'้ล`dŒ(‰l/$\ฝyO'ะ‚y'ืึ d๏’็ˆอ…\,-"kU?‹?›ะุฮEt{ •I9&ึQพ˜>ภšฒ[mAเ„yIp๋q#:m๔ฺธษ๙•>˜ŒูV˜์๗U_ูฑ๏ร๔ถ[ฮDyL๒๛ญV{ˆยหb–ภๅZHไ\r9.3ฯ~ U๗ž73ฦำ%ซ„_F๊H‰๓’สz๓่kาฮš๘eตชุ่๕–=9?๕&ท๒C๊j|๒<“อโั๎ัฅ ฑpงธ่3ฺถ•4Ÿฬทฟซ3ซะ[L๘'ถ๓B๔5‰ดืS˜๎,ณ๏?ฝGž<“ˆ6nาฒฒ๚oภ+์ฬๅDญ๏Œuญฮ~94๖ ึOน1#qฑ8๎*พoนo/ุเุฆิ๓bฎ^!ฯภc^ๆR>˜๊+พ๛œ˜ภkฤสฎK,~/น๙qQๆ{“ณุแโ•เ\›(ˆ๋ฐLvท้ŠูŽโG Eขgจไcุ+ฒ๛จแ6ภ๛๓ซZู†– |ฟฮฃน;^ ไฐE&ี |?‡฿Žง฿"ซRฌAUdsŸฒQ่ฃ?๙bบfณsฉl~iŸ๏Ai!R[|ฦG๗ง˜Nย9„ญณq~‘ดŸ'๕ญˆว‘V†9dE[ฏ_~ต(t๔-––฿wฎ*๏บzห ๚Šใi#4†(เ)lW—i๓๓๘›๔ซํฅ0Fมฃ‰ิœไนmฟR3R_rBy•๙๑U€t‘b›†า\ ฤyF,Yc!พ\โ‹h$qyy`>gT๒ภธรy_pีฏi๕t๚7๙ำwธ์s’ฺรqฐ?ลป'”๏XcำาH๐ึืืƒq์XŒืPถQใb๎ไzฏกว๛ิ#Šo๗]๔ลIP{์rO๔ชIfฉ๘คq<๘วท8ใฺบฟบลŒPU-`Oมrส›ฝฦ฿c˜๛ฃชๅf)็v์/่qUส|ซู”Žw ถ:]G“ษk„s๎?#T๒‹]‚่ษl๛+ฑ ซํทŒ—ƒw<ืฆืฉ|[ค˜UŠึBง ํ@ภ*“้~k-ถจศlc1ฯnีิดฑทฃŸœ+5E1๎ฮT๙6CMั๕Hh;พ๎ศ&‰ขbลั™8ฦŒ}3T›รฉr’Dc1‰8฿ๆm‘xว ž>cุ8…ฮw๙qV2วŒ๋ษjwฤฒ8ท๐เ๓ึƒ๙J‚?ฦู8๏ป<Ÿ๘บี_ร@‰ˆ*ปFzŸฮบ๖H๖เJ1้Šฐ„ว2า›ข6ณ: ฉา@{uซ?d\ฎF>ตู‡ผฟฺฉไ“0๙’iบ#lŽ)ด›…ๅีฒ~uci๒๓A๖#+นŽีr~๓๙Gตด<๙๙>ใช7Gะฒ8cbใฉq๓ๆจlไS๐–c้ŒWhlเฯษ*ัe0Xฐ๙ฉp๔"คqžDุ้ƒT๒f'๐“ž+ด๛•ง9>๎ตZlm ฯ๎G5MระTŽ.[Nr฿ zžsCm7#ใๅว๕ฎอl,ม$ดŸPฦจt๋ตฯ ?ใQp&คq‚ฺ"0จA๋นชญจใi9๔ลv#Lฒช“Wฯฒฮr€ŸY3K€ฉiถd้*)=ธีฦไa‡-๊uๆยุ/มpซ๒'*ีฑƒ|ิท๕งย>#6!ฯ;X๖ไชXพํŠƒv: ์~ๅkŒฒ=@ -ด*N'ฦzๆ>ฟญGย*G!๗7 wๆcฐ=>ฝชัhTๅcl7๒ฐฦ}>uฺ}ฬ๗’–๚c๒ซฮ<ป‰๚…อ>y8ีถ;ภ0บทNO๚อ\ถŒ๋•†V็?ตuwp> ฉ3๊ษšฐYณ>้Œ๚/kฎ*mLไำ ˆๅ8ช‹x‹–ศq— n๋ต๑Œ๎ˆถ}e Uฆ˜3:?ืฝ7!ตœw—n$’p1ิ๕ชู๗nฺ ฦ=xฎมญ,ูํ,s’^5oํX…ฑ#๗GhsSผ‡'ๅJ…:bฌ0ุ๙ื`m F&( ๅ.ุŠษ(V\๚ส[ฅ7‡‘๘LcๅYO,ง๊EuาE ƒ๐[gะ1Uนตgะอป0G˜ํiผl9Qlไ๒bŸ๘ีโอ‰๊‡ๅz๊ คdpF:ญี>โ8หกถjos๎„uฅ>้์?*้™”UEป(แข'ืTo'aอ ?Eล\-=ซฃ6ลฟวTภฤฟJo|Zฐ๕_ป7กฎ‡๎ซยฉ๗Eeฆ๑ฐ็พ่{Š}ฯ๔ฎ‡๎ƒิU~่=W๓ฆ๑ฐ็>็์jฟs•ั}ั™:}ิ2~b›ฦร๛˜ช}อkฃ๛ฐdลW๎ใ๙—๓6ัฒSุUCbพ‡๒ฎ—๎หษ๙Šง—๙“๔จ6œ฿Wาซ๗๔ฎ๎ษŸฤด๛ฒ2ำq;No๎+่*๔lืI๗e๕_ฮŸu_U้ธm9“d6ฟ>ตฌำ๙ ืU๗U๕Z}ี™:n#iส‹Eคะ๓Oบ ๋ปฅkช๛ช2uOบGห๙ิ๏TBŠzฅ6ชŸLWS๗(]†ญ:uน๊‘Ÿ ฆ๑ฐๅฤRPOฆ('PIุrzr+ฆ•kทS๖Mท๒ง้Sนตœ็ŸpXd๗ศอ\f…ฦ.>ซญOถjU1Vยณฯแ_ฮ›ฺศˆ]6๐Hเ+ZูF\pXŸ|fทbูƒยง็T:%ก๎Gษ๊-2išซ$A8ๆฏX˜–'œ๚ ู‘m๗ฯOุ๖ฃฃทั๊-Lยใ๐~Ukญ›`ึา้6ภไ3gBj๕ำโ^Ž๙๊8อ//=:{ก‰ˆNๆฉธฤ?ˆญ]๗Hฑร:Xข<#g8Žแฒj1'เ฿Š’‘าซพ๎ƒฃ๔ฉdัccœ"ฑฦ?ฃ@ƒ2฿๒ใ๛Tฏะ๕?*ธ@ฃฃฮ–(ƒOถˆn†"qศhโMรไqšค๖ขTุษ.]ฮภŸž5:`S~uOป ๙ิฉฒ6ฃœ6N#XกgHP|* ฏLึดบUผลคธาm๎ษฦ้%Bลฑำ9ฮq]`ทNปETซ~!Ÿ™ซyŒ-ว!w๛6‰ม;Q@>‡XFh๒—[\d–(าศP“ิใv3]b"Ÿ„cชฟสYง˜ืAๅฎ็†™gy “หVฦ่ษ0ฤz๓้y โ\ร4Q˜๒ร†|uฺว๛ืgๅoฮยއฝ<ูๅDูManimCommunity-manim-1157b74/example_scenes/basic.py000066400000000000000000000122511515024150700224620ustar00rootroot00000000000000#!/usr/bin/env python from manim import * # To watch one of these scenes, run the following: # python --quality m manim -p example_scenes.py SquareToCircle # # Use the flag --quality l for a faster rendering at a lower quality. # Use -s to skip to the end and just save the final frame # Use the -p to have preview of the animation (or image, if -s was # used) pop up once done. # Use -n to skip ahead to the nth animation of a scene. # Use -r to specify a resolution (for example, -r 1920,1080 # for a 1920x1080 video) class OpeningManim(Scene): def construct(self): title = Tex(r"This is some \LaTeX") basel = MathTex(r"\sum_{n=1}^\infty \frac{1}{n^2} = \frac{\pi^2}{6}") VGroup(title, basel).arrange(DOWN) self.play( Write(title), FadeIn(basel, shift=DOWN), ) self.wait() transform_title = Tex("That was a transform") transform_title.to_corner(UP + LEFT) self.play( Transform(title, transform_title), LaggedStart(*(FadeOut(obj, shift=DOWN) for obj in basel)), ) self.wait() grid = NumberPlane() grid_title = Tex("This is a grid", font_size=72) grid_title.move_to(transform_title) self.add(grid, grid_title) # Make sure title is on top of grid self.play( FadeOut(title), FadeIn(grid_title, shift=UP), Create(grid, run_time=3, lag_ratio=0.1), ) self.wait() grid_transform_title = Tex( r"That was a non-linear function \\ applied to the grid", ) grid_transform_title.move_to(grid_title, UL) grid.prepare_for_nonlinear_transform() self.play( grid.animate.apply_function( lambda p: p + np.array( [ np.sin(p[1]), np.sin(p[0]), 0, ], ), ), run_time=3, ) self.wait() self.play(Transform(grid_title, grid_transform_title)) self.wait() class SquareToCircle(Scene): def construct(self): circle = Circle() square = Square() square.flip(RIGHT) square.rotate(-3 * TAU / 8) circle.set_fill(PINK, opacity=0.5) self.play(Create(square)) self.play(Transform(square, circle)) self.play(FadeOut(square)) class WarpSquare(Scene): def construct(self): square = Square() self.play( ApplyPointwiseFunction( lambda point: complex_to_R3(np.exp(R3_to_complex(point))), square, ), ) self.wait() class WriteStuff(Scene): def construct(self): example_text = Tex("This is a some text", tex_to_color_map={"text": YELLOW}) example_tex = MathTex( "\\sum_{k=1}^\\infty {1 \\over k^2} = {\\pi^2 \\over 6}", ) group = VGroup(example_text, example_tex) group.arrange(DOWN) group.width = config["frame_width"] - 2 * LARGE_BUFF self.play(Write(example_text)) self.play(Write(example_tex)) self.wait() class UpdatersExample(Scene): def construct(self): decimal = DecimalNumber( 0, show_ellipsis=True, num_decimal_places=3, include_sign=True, ) square = Square().to_edge(UP) decimal.add_updater(lambda d: d.next_to(square, RIGHT)) decimal.add_updater(lambda d: d.set_value(square.get_center()[1])) self.add(square, decimal) self.play( square.animate.to_edge(DOWN), rate_func=there_and_back, run_time=5, ) self.wait() class SpiralInExample(Scene): def construct(self): logo_green = "#81b29a" logo_blue = "#454866" logo_red = "#e07a5f" font_color = "#ece6e2" pi = MathTex(r"\pi").scale(7).set_color(font_color) pi.shift(2.25 * LEFT + 1.5 * UP) circle = Circle(color=logo_green, fill_opacity=0.7, stroke_width=0).shift(LEFT) square = Square(color=logo_blue, fill_opacity=0.8, stroke_width=0).shift(UP) triangle = Triangle(color=logo_red, fill_opacity=0.9, stroke_width=0).shift( RIGHT ) pentagon = Polygon( *[ [np.cos(2 * np.pi / 5 * i), np.sin(2 * np.pi / 5 * i), 0] for i in range(5) ], color=PURPLE_B, fill_opacity=1, stroke_width=0, ).shift(UP + 2 * RIGHT) shapes = VGroup(triangle, square, circle, pentagon, pi) self.play(SpiralIn(shapes, fade_in_fraction=0.9)) self.wait() self.play(FadeOut(shapes)) Triangle.set_default(stroke_width=20) class LineJoints(Scene): def construct(self): t1 = Triangle() t2 = Triangle(joint_type=LineJointType.ROUND) t3 = Triangle(joint_type=LineJointType.BEVEL) grp = VGroup(t1, t2, t3).arrange(RIGHT) grp.set(width=config.frame_width - 1) self.add(grp) # See many more examples at https://docs.manim.community/en/stable/examples.html ManimCommunity-manim-1157b74/example_scenes/custom_template.tex000066400000000000000000000002621515024150700247550ustar00rootroot00000000000000\documentclass[preview]{standalone} \usepackage[english]{babel} \usepackage{amsmath} \usepackage{amssymb} \usepackage[f]{esvect} \begin{document} YourTextHere \end{document} ManimCommunity-manim-1157b74/example_scenes/customtex.py000066400000000000000000000026621515024150700234410ustar00rootroot00000000000000from manim import * class TexTemplateFromCLI(Scene): """This scene uses a custom TexTemplate file. The path of the TexTemplate _must_ be passed with the command line argument `--tex_template `. For this scene, you can use the custom_template.tex file next to it. This scene will fail to render if a tex_template.tex that doesn't import esvect is passed, and will throw a LaTeX error in that case. """ def construct(self): text = MathTex(r"\vv{vb}") self.play(Write(text)) self.wait(1) class InCodeTexTemplate(Scene): """This example scene demonstrates how to modify the tex template for a particular scene from the code for the scene itself. """ def construct(self): # Create a new template myTemplate = TexTemplate() # Add packages to the template myTemplate.add_to_preamble(r"\usepackage{esvect}") # Set the compiler and output format (default: latex and .dvi) # possible tex compilers: "latex", "pdflatex", "xelatex", "lualatex", "luatex" # possible output formats: ".dvi", ".pdf", and ".xdv" myTemplate.tex_compiler = "latex" myTemplate.output_format = ".dvi" # To use this template in a Tex() or MathTex() object # use the keyword argument tex_template text = MathTex(r"\vv{vb}", tex_template=myTemplate) self.play(Write(text)) self.wait(1) ManimCommunity-manim-1157b74/example_scenes/manim.cfg000066400000000000000000000005151515024150700226110ustar00rootroot00000000000000 #This is some custom configuration just as an example [logger] logging_keyword = magenta logging_level_notset = dim logging_level_debug = yellow logging_level_info = dim green logging_level_warning = dim red logging_level_error = red logging_level_critical = red log_level = log_time = dim yellow log_message = green log_path = dim ManimCommunity-manim-1157b74/example_scenes/manim_jupyter_example.ipynb000066400000000000000000000030051515024150700264650ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from manim import *" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING --disable_caching -ql -s Example1\n", "\n", "class Example1(Scene):\n", " def construct(self):\n", " self.add(Circle())" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%%manim -v WARNING --disable_caching -qm HelloManim\n", "\n", "# set the maximum width for video outputs to a predefined value\n", "config.media_width = \"20vw\"\n", "# embed video\n", "config.media_embed = True\n", "\n", "class HelloManim(Scene):\n", " def construct(self):\n", " self.camera.background_color = \"#ece6e2\"\n", " banner_large = ManimBanner(dark_theme=False).scale(0.7)\n", " self.play(banner_large.create())\n", " self.play(banner_large.expand())" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.1" } }, "nbformat": 4, "nbformat_minor": 4 } ManimCommunity-manim-1157b74/example_scenes/opengl.py000066400000000000000000000363201515024150700226700ustar00rootroot00000000000000from pathlib import Path import manim.utils.opengl as opengl from manim import * from manim.opengl import * # Copied from https://3b1b.github.io/manim/getting_started/example_scenes.html#surfaceexample. # Lines that do not yet work with the Community Version are commented. def get_plane_mesh(context): shader = Shader(context, name="vertex_colors") attributes = np.zeros( 18, dtype=[ ("in_vert", np.float32, (4,)), ("in_color", np.float32, (4,)), ], ) attributes["in_vert"] = np.array( [ # xy plane [-1, -1, 0, 1], [-1, 1, 0, 1], [1, 1, 0, 1], [-1, -1, 0, 1], [1, -1, 0, 1], [1, 1, 0, 1], # yz plane [0, -1, -1, 1], [0, -1, 1, 1], [0, 1, 1, 1], [0, -1, -1, 1], [0, 1, -1, 1], [0, 1, 1, 1], # xz plane [-1, 0, -1, 1], [-1, 0, 1, 1], [1, 0, 1, 1], [-1, 0, -1, 1], [1, 0, -1, 1], [1, 0, 1, 1], ], ) attributes["in_color"] = np.array( [ # xy plane [1, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1], # yz plane [0, 1, 0, 1], [0, 1, 0, 1], [0, 1, 0, 1], [0, 1, 0, 1], [0, 1, 0, 1], [0, 1, 0, 1], # xz plane [0, 0, 1, 1], [0, 0, 1, 1], [0, 0, 1, 1], [0, 0, 1, 1], [0, 0, 1, 1], [0, 0, 1, 1], ], ) return Mesh(shader, attributes) class TextTest(Scene): def construct(self): import string text = Text(string.ascii_lowercase, stroke_width=4, stroke_color=BLUE).scale(2) text2 = ( Text(string.ascii_uppercase, stroke_width=4, stroke_color=BLUE) .scale(2) .next_to(text, DOWN) ) # self.add(text, text2) self.play(Write(text)) self.play(Write(text2)) self.interactive_embed() class GuiTest(Scene): def construct(self): mesh = get_plane_mesh(self.renderer.context) # mesh.attributes["in_vert"][:, 0] self.add(mesh) def update_mesh(mesh, dt): mesh.model_matrix = np.matmul( opengl.rotation_matrix(z=dt), mesh.model_matrix, ) mesh.add_updater(update_mesh) self.interactive_embed() class GuiTest2(Scene): def construct(self): mesh = get_plane_mesh(self.renderer.context) mesh.attributes["in_vert"][:, 0] -= 2 self.add(mesh) mesh2 = get_plane_mesh(self.renderer.context) mesh2.attributes["in_vert"][:, 0] += 2 self.add(mesh2) def callback(sender, data): mesh2.attributes["in_color"][:, 3] = dpg.get_value(sender) self.widgets.append( { "name": "mesh2 opacity", "widget": "slider_float", "callback": callback, "min_value": 0, "max_value": 1, "default_value": 1, }, ) self.interactive_embed() class ThreeDMobjectTest(Scene): def construct(self): # config["background_color"] = "#333333" s = Square(fill_opacity=0.5).shift(2 * RIGHT) self.add(s) sp = Sphere().shift(2 * LEFT) self.add(sp) mesh = get_plane_mesh(self.renderer.context) self.add(mesh) def update_mesh(mesh, dt): mesh.model_matrix = np.matmul( opengl.rotation_matrix(z=dt), mesh.model_matrix, ) mesh.add_updater(update_mesh) self.interactive_embed() class NamedFullScreenQuad(Scene): def construct(self): surface = FullScreenQuad(self.renderer.context, fragment_shader_name="design_3") surface.shader.set_uniform( "u_resolution", (config["pixel_width"], config["pixel_height"], 0.0), ) surface.shader.set_uniform("u_time", 0) self.add(surface) t = 0 def update_surface(surface, dt): nonlocal t t += dt surface.shader.set_uniform("u_time", t / 4) surface.add_updater(update_surface) # self.wait() self.interactive_embed() class InlineFullScreenQuad(Scene): def construct(self): surface = FullScreenQuad( self.renderer.context, """ #version 330 #define TWO_PI 6.28318530718 uniform vec2 u_resolution; uniform float u_time; out vec4 frag_color; // Function from Iรฑigo Quiles // https://www.shadertoy.com/view/MsS3Wc vec3 hsb2rgb( in vec3 c ){ vec3 rgb = clamp(abs(mod(c.x*6.0+vec3(0.0,4.0,2.0), 6.0)-3.0)-1.0, 0.0, 1.0 ); rgb = rgb*rgb*(3.0-2.0*rgb); return c.z * mix( vec3(1.0), rgb, c.y); } void main(){ vec2 st = gl_FragCoord.xy/u_resolution; vec3 color = vec3(0.0); // Use polar coordinates instead of cartesian vec2 toCenter = vec2(0.5)-st; float angle = atan(toCenter.y,toCenter.x); angle += u_time; float radius = length(toCenter)*2.0; // Map the angle (-PI to PI) to the Hue (from 0 to 1) // and the Saturation to the radius color = hsb2rgb(vec3((angle/TWO_PI)+0.5,radius,1.0)); frag_color = vec4(color,1.0); } """, ) surface.shader.set_uniform( "u_resolution", (config["pixel_width"], config["pixel_height"]), ) shader_time = 0 def update_surface(surface): nonlocal shader_time surface.shader.set_uniform("u_time", shader_time) shader_time += 1 / 60.0 surface.add_updater(update_surface) self.add(surface) # self.wait(5) self.interactive_embed() class SimpleInlineFullScreenQuad(Scene): def construct(self): surface = FullScreenQuad( self.renderer.context, """ #version 330 uniform float v_red; uniform float v_green; uniform float v_blue; out vec4 frag_color; void main() { frag_color = vec4(v_red, v_green, v_blue, 1); } """, ) surface.shader.set_uniform("v_red", 0) surface.shader.set_uniform("v_green", 0) surface.shader.set_uniform("v_blue", 0) increase = True val = 0.5 surface.shader.set_uniform("v_red", val) surface.shader.set_uniform("v_green", val) surface.shader.set_uniform("v_blue", val) def update_surface(mesh, dt): nonlocal increase nonlocal val if increase: val += dt else: val -= dt if val >= 1: increase = False elif val <= 0: increase = True surface.shader.set_uniform("v_red", val) surface.shader.set_uniform("v_green", val) surface.shader.set_uniform("v_blue", val) surface.add_updater(update_surface) self.add(surface) self.wait(5) class InlineShaderExample(Scene): def construct(self): config["background_color"] = "#333333" c = Circle(fill_opacity=0.7).shift(UL) self.add(c) shader = Shader( self.renderer.context, source={ "vertex_shader": """ #version 330 in vec4 in_vert; in vec4 in_color; out vec4 v_color; uniform mat4 u_model_view_matrix; uniform mat4 u_projection_matrix; void main() { v_color = in_color; vec4 camera_space_vertex = u_model_view_matrix * in_vert; vec4 clip_space_vertex = u_projection_matrix * camera_space_vertex; gl_Position = clip_space_vertex; } """, "fragment_shader": """ #version 330 in vec4 v_color; out vec4 frag_color; void main() { frag_color = v_color; } """, }, ) shader.set_uniform("u_model_view_matrix", opengl.view_matrix()) shader.set_uniform( "u_projection_matrix", opengl.orthographic_projection_matrix(), ) attributes = np.zeros( 6, dtype=[ ("in_vert", np.float32, (4,)), ("in_color", np.float32, (4,)), ], ) attributes["in_vert"] = np.array( [ [-1, -1, 0, 1], [-1, 1, 0, 1], [1, 1, 0, 1], [-1, -1, 0, 1], [1, -1, 0, 1], [1, 1, 0, 1], ], ) attributes["in_color"] = np.array( [ [0, 0, 1, 1], [0, 0, 1, 1], [0, 0, 1, 1], [0, 0, 1, 1], [0, 0, 1, 1], [0, 0, 1, 1], ], ) mesh = Mesh(shader, attributes) self.add(mesh) self.wait(5) # self.embed_2() class NamedShaderExample(Scene): def construct(self): shader = Shader(self.renderer.context, "manim_coords") shader.set_uniform("u_color", (0.0, 1.0, 0.0, 1.0)) view_matrix = self.camera.formatted_view_matrix shader.set_uniform("u_model_view_matrix", view_matrix) shader.set_uniform( "u_projection_matrix", opengl.perspective_projection_matrix(), ) attributes = np.zeros( 6, dtype=[ ("in_vert", np.float32, (4,)), ], ) attributes["in_vert"] = np.array( [ [-1, -1, 0, 1], [-1, 1, 0, 1], [1, 1, 0, 1], [-1, -1, 0, 1], [1, -1, 0, 1], [1, 1, 0, 1], ], ) mesh = Mesh(shader, attributes) self.add(mesh) self.wait(5) class InteractiveDevelopment(Scene): def construct(self): circle = Circle() circle.set_fill(BLUE, opacity=0.5) circle.set_stroke(BLUE_E, width=4) square = Square() self.play(Create(square)) self.wait() # This opens an iPython terminal where you can keep writing # lines as if they were part of this construct method. # In particular, 'square', 'circle' and 'self' will all be # part of the local namespace in that terminal. # self.embed() # Try copying and pasting some of the lines below into # the interactive shell self.play(ReplacementTransform(square, circle)) self.wait() self.play(circle.animate.stretch(4, 0)) self.play(Rotate(circle, 90 * DEGREES)) self.play(circle.animate.shift(2 * RIGHT).scale(0.25)) # text = Text( # """ # In general, using the interactive shell # is very helpful when developing new scenes # """ # ) # self.play(Write(text)) # # In the interactive shell, you can just type # # play, add, remove, clear, wait, save_state and restore, # # instead of self.play, self.add, self.remove, etc. # # To interact with the window, type touch(). You can then # # scroll in the window, or zoom by holding down 'z' while scrolling, # # and change camera perspective by holding down 'd' while moving # # the mouse. Press 'r' to reset to the standard camera position. # # Press 'q' to stop interacting with the window and go back to # # typing new commands into the shell. # # In principle you can customize a scene to be responsive to # # mouse and keyboard interactions # always(circle.move_to, self.mouse_point) class SurfaceExample(Scene): def construct(self): # surface_text = Text("For 3d scenes, try using surfaces") # surface_text.fix_in_frame() # surface_text.to_edge(UP) # self.add(surface_text) # self.wait(0.1) torus1 = Torus(major_radius=1, minor_radius=1) torus2 = Torus(major_radius=3, minor_radius=1) sphere = Sphere(radius=3, resolution=torus1.resolution) # You can texture a surface with up to two images, which will # be interpreted as the side towards the light, and away from # the light. These can be either urls, or paths to a local file # in whatever you've set as the image directory in # the custom_config.yml file script_location = Path(__file__).resolve().parent day_texture = ( script_location / "assets" / "1280px-Whole_world_-_land_and_oceans.jpg" ) night_texture = script_location / "assets" / "1280px-The_earth_at_night.jpg" surfaces = [ OpenGLTexturedSurface(surface, day_texture, night_texture) for surface in [sphere, torus1, torus2] ] for mob in surfaces: mob.shift(IN) mob.mesh = OpenGLSurfaceMesh(mob) mob.mesh.set_stroke(BLUE, 1, opacity=0.5) # Set perspective frame = self.renderer.camera frame.set_euler_angles( theta=-30 * DEGREES, phi=70 * DEGREES, ) surface = surfaces[0] self.play( FadeIn(surface), Create(surface.mesh, lag_ratio=0.01, run_time=3), ) for mob in surfaces: mob.add(mob.mesh) surface.save_state() self.play(Rotate(surface, PI / 2), run_time=2) for mob in surfaces[1:]: mob.rotate(PI / 2) self.play(Transform(surface, surfaces[1]), run_time=3) self.play( Transform(surface, surfaces[2]), # Move camera frame during the transition frame.animate.increment_phi(-10 * DEGREES), frame.animate.increment_theta(-20 * DEGREES), run_time=3, ) # Add ambient rotation frame.add_updater(lambda m, dt: m.increment_theta(-0.1 * dt)) # Play around with where the light is # light_text = Text("You can move around the light source") # light_text.move_to(surface_text) # light_text.fix_in_frame() # self.play(FadeTransform(surface_text, light_text)) light = self.camera.light_source self.add(light) light.save_state() self.play(light.animate.move_to(3 * IN), run_time=5) self.play(light.animate.shift(10 * OUT), run_time=5) # drag_text = Text("Try moving the mouse while pressing d or s") # drag_text.move_to(light_text) # drag_text.fix_in_frame() ManimCommunity-manim-1157b74/lgtm.yml000066400000000000000000000003231515024150700175170ustar00rootroot00000000000000queries: - exclude: py/init-calls-subclass - exclude: py/unexpected-raise-in-special-method - exclude: py/modification-of-locals - exclude: py/multiple-calls-to-init - exclude: py/missing-call-to-init ManimCommunity-manim-1157b74/logo/000077500000000000000000000000001515024150700167735ustar00rootroot00000000000000ManimCommunity-manim-1157b74/logo/cropped.png000066400000000000000000000403131515024150700211360ustar00rootroot00000000000000‰PNG  IHDRyปุขี pHYsรรวoจdtEXtSoftwarewww.inkscape.org›๎< IDATxœํwx็น6๐{vWeีP/ Foข๗$$Œ{ม5Ž'๖๙NI์—8'ลŽ—$วqœโ—๘8qว TAH DEขจ€:๊าถ๙ภ๘;+ํ๎ฬ๎ฌF๗๏บฮuผป3๓ึ่™๗}^2‰ข(ด6ิLถ‰บYฤฉ&B I‚{"""" ้ะ  ‚x"๊กB„pD€๕@๔ศิcr/ ธsะ…๊๊‹Ÿn=€๋q%€น…ั%b +ฯ –MฃG_p๕ .…ผ–†ชีขU๗  เFฎ^Œˆˆˆˆ\ึ/ุhƒ๎ี˜„ฤBgr*ไ57T_+ุ„_˜็vyDDDD$ื› :6!i๓`o0ไ5ีึŽื้ล—ฌUฌ4""""’ErDซ๐ƒุคคJG๏q๒Z๊ซ๏…(O‘o้ >52ๅR/ฺ…๖5฿๖xiDDDD$€7ฃโ›„นๆ+‡/#–—๛ทD„~*๋ผ[นK€ฐ)ฒญใfa๊Tำฅ1ฅGEก%<๔<"""ขกE„ธพ52๔mQฟน๗Mศkiจฑ `ƒ:ฅ‘ขˆ;Z๋kบ๔ฟh>wnข Xฝ๏ˆˆˆˆ†ฒ~ัฆ›“˜XกAฐ><"""ขก.@ะู~ ย…†ชั›๎โŒˆˆˆˆ|Šhี‹ใt›๎n0เi… ท w่ฌPป""""RิrLQป """"RTš"ขิฎ‚ˆˆˆˆญ vDDDDคจเ๏!"""ขก†!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ๒ˆˆˆˆ4ˆ!ˆˆˆHƒ jเ ‡A๙‘r466ม&ฺTญ% “&Nภ๊U+!่†WฆถX,ุบu**+a2™ิ.:A‡๘๘8คฅฅ!-mŠฺๅy”ะRW#ช]„’ ถโ•W_Wป ;ทz3n฿pซฺexี‹/ %;Kี.Cาฟ๛ƒXตr…ฺeyŒๆn-ํ๐ัP‘ฝ9}}}j—แ5UีีุYบKํ2ฺYโ›Ÿ"""ฅh.ไ๙|๓ twOถ๏Pป ฏ๙๒หอE฿ฝIl4ช]‘Gi.ไeฌM๗ูนo9y๙j—เ(๑แ;e:k3ิ.ƒˆˆศฃ|๓ถ— ๓ๆฮม๓ฯ{๖์C… ่๎๎F_ošš›ัิิ ณู์๒9'OšˆQ‰ฃ\:ฆพพๅๅGฏซฉฉEy๙QLชํI[ aฑX}฿๒eKแเ๏๖uŽ;Žs็๊}Ÿ@’G!.. ๑๑XธhRSRพ.ัP นฉฉฉHMMตm6446โ๔้3จฌ<‰ฒฒƒจoh๔| ๘มัััNืะึv‹ลzลxnnžฆCžีjE~^S๏ฝ็žป๎ึu***QTดแ๋aกกXฑjฮŸ‡ฑcว@ฏืปu""ขกJ“!ฯAงCBBฐdษbw฿ฝจฏฏวร?zVซีแqmm๐ ภ3O?ƒมนฐŽ๓็ญ.ณw?ฮทถ"*2Rึฯโซ๖๏/Cห๙๓ฝF?^ใŸ$๏ส ztใ ธแ†๋เั:ˆˆˆ|™oN^๓ข„„‚0่๛ฮœฉย'Ÿlt้™YkํฦฌV+๒๓ทธtžก$;'ืใืุธ๑347ทุเ็O<Ž neภ#"ขaoุ‡O||l6›ฌีิ‚e$_‹ŒŒฤysป–ีม#rƒaX๕๔&""r Cžฒ2ืJ6Lฮuแnž ำ!Sโัoำ!i(ศอuRืfฌแvbDDD*aศsBbโ(Lž<ษn|๛Žtuu9}žีkVI๎ฤเ๊ฃ__aฑXPXT$๙šม ว๊ี+ฝY]†!ฯIRsหL& ]˜S„eK>|ฤแย_ถ}G :ฺ;$_[ฐ`"""ผ\]ย็ค ๆ!22าn<7/ข s๊2ืู/ภฌ‰ฏจๆ,‰}{‰ˆˆศ{๒œคื๋‘พf•xcC#:์๔yRSR0iโป๑mEล่•ุฎหWUTTเิฉำ’ฏฅ8๘‰ˆˆศ{๒\žพƒB‚\ฉHๅ๊ํํE๑vฯo ฆ”œ\วป~dIญ$"""๏b๏ DD„c9(ต็Š๑ฒ_กฉฑ ฑqฑN็โ|ตwัึึvลxNN๎ล1$V๒๚’ŽŽ”–๎’|อัผCขกจซซ ๛๗@yy9ฮทถมd6#*2ใวลผ๙๓ญv‰DD1ไน(sm†]ศm6ไๆเ[๗ๅิ9 †‹~?่“+ฦฯžซCy๙1คฅMQฌ^Oศห+pธญ๊ี+%W %&“ ?_~น}}}vฏ—”์ฤ๏ผ‹•ห—แ๎ป๎ภ๗g&"R ืบhjฺT$''ูoRSฟำ็ษศH—|๔›ใโฃ_oณZญ((ุ*๙š ศศXใๅŠˆ”ีึึ†_๊)|๔ั'’๏ัfCแถ"<๖๘ฯQUํ|ct""oaศsCF๚jปฑฎ๎n””:ฟŸmDD8ๆอ›k7พw๏>45ทศชฯ“๖์๓ญญ’ฏอœ1 ^ฎˆH9ฝฝฝx๚้็p๊ไ)งi9O>๙ ›š=X‘๋๒ฐbลrƒ์๗ณอœําyค๖ณตูlุRฐลํฺnฦŒ้ธ๛๎;=P‘๛๒ฒาม~ถ›ณs\:ฯบkฒ$ว๓Uุฯv วอYY\pAฺ#~๐ƒภuืญ—ัF๊kำ๑ุฃ?Qm,‘# y 1X*ฑŸmmํY;~ย้๓ŒNMม„ ใํฦทm+F๛o?QำงฯHพ–i-_ˆด@งำแo็ž}๓็ฯ“œBแ๏๏ys็เ™งŸฤ฿๛. ฎa#"฿ร™ด.s- ๒ทุmk”›“‡ษ[ 9’™™ŠŠส+ฦ๚๚๚PT\ŒuY™Šิ:˜ฆฌ“ท—HKFNลO๒0L&ชชชัั†ิิ๘๛๛ซZั`x'OAII‰˜(ๆv๏ูƒึึVงฯณxัBษ†ชู›sฝฒ/fG{;v_ีๆ€,_พิใ5๙ L˜0๓ๆฮมผนs0aยx<"๒–%นŸญ[ถns๚ƒ้ซWูื74เ๐‘r9ๅ9%7 ,‹ไk+V,CHpฐวk """y๒ถ`|DDDุ็็ุํŠ1ฬฬ  ๖นs=NลjตbKมV‡ฏgJ๔๒#"""฿รง0ƒAีซWฺทต]ภ}๛>ODDๆฬฑ฿m฿2ป]1”ด{๗^œw๐hy๒ไIHIN๖ุต‰ˆˆH9 yน6]๚.\ฎkwแค๖…ตูl(๐`;•œjไ>ตDDDCCžDDD`๖l๛=,หหขฺ…ฆฦiiS’œd7พuK!ฬfณฌฅิึžลqํ^""ย1<ลฏIDDDžม*’•ต{๖์ตฯหหว๗ฟ๗]งฯ“‘‘ŽืๆcุQRŠU+—หฎ๓r›ณsฎMO_#yw’คY,๔๔๖ขฏง]่ํํ…ัhDPฦ@#ŒAFฎะะูู‰ฮฮN๔๖๔ข฿dB`` ยF„!*"‚Ž฿Aฝฉปง่ํ้ๆ๓j 2"|ฤ๎๏้๋,ซีŠึึ6tuuกฏฏƒˆ‰๖ส๕‰ดˆ!ฯCฆฅMERR"jkฯ^1^\ผw฿u'‚œ}ลŠe๘็ฟณk„œฝ9[ัืำใp 6ฝ^๔5๖ซ} E5ตgq๚๔TWWฃชบีgชะี=่ฑƒฑฑq92ฉฉ)˜0n,&Lšˆเ  /TฎŽฎฎ.์ฺณe๛สpฆช---’๏๓๓๓รธฑc–6‹-”šไ้hoวžฝ๛QVvีีีhj–ป1ฑ17v .X€9sf)๖ๅฬ™*์,…ร‡ ฆฆึแŠ่จ(Lœ8s็ฮฦนsจศ๕‰ดŽ!ฯƒาำืเอ7฿พbฌฏฏลลลศrฒฉq`` V,_Ž์œ+ฦฯTUฃขขRrw wกฟฟ_๒ต… ๆ#22R‘๋hEeๅIl+*ฦพ}e.๕@ผœลbE]]๊๊๊ฐ๏๋E9zฝ“&Mฤ๙๓ฐl้b„††*Y6๓{คืโํnล๒eŽ๛'656แƒ>FIIฉร๖<—3›อ8vŽ??๚Sำฆbรญ7cส”ษฒkญญ=‹gŸ์๓Hน;๗a๖์™Nฝ๗ก‡ณฎzไง?pTUu5>๚h#๖๎›อ6่๙DQDScš›ฐs็.„„„เึ[n๚บ€{ฟB |๐Nž<ๅิ๛[ฮŸGหฮR”์,EpP2ึฆใฆop๚ห2ัpล็AซV.ว{๏}€+๏ยๅๆๆ#3sญำปFฌป&9นy๖;iไๆ+๒DQxŸZ‰ร‘hณaืž}ุ๘ษFœฉช๖ศ5ฌV+สหขผ(y็],[บ7|#โใ9Sc“GB^Owไธลbม{๏}ˆM›7ปิB่jๅGส๑ห#ๅXฑb๎๎}ฒ฿Y,456น}@z๛œ฿zฐฑฑษฉภ๋*‹I๚nXwO|๓m๏๕่๊๊ย[oฟƒยmลxไ‘#6&ฺ้cฺ.เoฏผŠฒฒƒn_ฟปงŸ~๚9 ทแ=๘}ฬ™c?™ˆ.bศ๓ ฃัˆ%Kกเชพsgฯีกผาาฆ8už„๘xLK›ŠC‡\1พณt๎ึ’ปcธโเมฏP__/๙šฃ]<†›ชช*ผ๖๚›vอ]-(ศˆqใฦ!qิHƒ‚`ตXะำƒึึVTVœDGgงำืดX,(VŒโํ%ศสฬภํท฿&n’ ^ุ5๊๋๋๑๛?ผ„๊jๅqQัvœ:uO<๑ขฃข;‰lษ็อญ;Ž?พ๔gดœ?ฏุ9ซซซ๑๘cOเ‰'ร˜1ฃ}YูA้ๅฟ ซซK‘๋ท_hวsฯnปทzณ"็$า†<หสZk๒€‹ญJœ y™ตึ.ไY,l-ฤ-7฿(ซฦฺฆฌหโ>ต_nสฦป๏kภป.ฉฉฉธํึ›0{๖ฌa๘แb์ธฑ. —ผฦkจฎฎฦแ#ๅุQRŠบบ:ทฯ5SงNใ™฿>Žฏ๗{Uาูณ็๐ซ_>‰฿ๆI„ป๑gtj ^๚ใ๏q่ะ:|ee‚Mฑแถ[=7‘p๙š‡ฅ$'cาฤ vใ{๗๎Cณƒ‰ฮRๆฮ™-๙X$77_ึcฐฦ†F8xH๒5ฃัˆฅKป}๎กฮfณแีื฿ภoฟ3เ/ศ๔ีซ๐gžย๙๓ฃ4nX<๔ะแัŸศๅ๙Dออ-๘๙/~-นjYฦ #&Mž„nป/แyw฿ฝะ)ผŠตฒ๒$~ิำ x—465ใ…฿Vซ{Ÿ„„dffเง?y~๙Eฬš=Kแ ˆ๑ใวแฦฎร ฯ?ƒพ?๔zeWฐo฿พ๘Ÿ—<b/ดใน็^px>๘ใ-ลๅ>๚่”–๎๖ุ๙‰†*†—ปA@Fฦฌ_ฟNฑs–)ว_๚ชGรี%ตตg๑๛ฺษง๘๐ฃO<~}Q๑ฺ๋o BปวฏE4”0ไyม‚๓%็อๅlu้๖š๔ี๐๓๓ณฯษอwซ.“ษ„ยย"ษืAภฺaผOmQัvปอRๆฮใ๖ฐ™3ฆปีšฦjตโ/gฯ)๓จ5Sก…5x๖ู็ััn/,, iiSฐjๅ ฬŸ7ื๙tWู๘้็hkป ๛<ƒืฎฟFŠไษThW™††ผ๐ป‘๗%:* ณfอฤšีซ0ผณบโ๓/6กชช๊›ฝ9;๏ฝ๗๛A@jj*-Z€+–aZฺTษื\ีูู‰?๖| $J8'ฯ าWฏยวŸ|zลxGGvํฺฅK—8užฐะP,^ผEEฏ/?RŽ๊šZษ1Rผฃฤแ$่iำา0rไH—ฮงx๋ญ8๕††FYืZอ:luyตcoo/๖ืW๐ิ“ฟ”48>>!มมN๕๖ศ?ygฯžปbl๚๔iธv:LŸ>ํŠG‘ขอ†ปvใ๕ื฿”5ฟฟฟ›ณsp๗]wธ}ŽK&*ิŽHŽุ˜h„“ สฮฒฺl๘ำหCwฯญx ๆฯร5๋ืaาฤ v๓l;Žฟฝ๒บฌ9š6› ็๛๘ูฯลex๛ํwฎx= ๋ฏษย๊5ซํ‚eoo/>๘S|ล—ฒVnูRˆnนY๖b4"ญเQQ‰ำงฯ8}žัฃS%WW๏ฐc วŽŸpx่่hษZ‡ซีŠญ[ท9~›อ†—^ซ]/DWศY-๛ล—›>๖r~2w0ุฟฟ์›;0ณgฯฤ /3gL๔ธqใฦโšuYฒฎััแpฯeW ล>ธ#@ๆ฿ลฅฦฺฐhั<3’‹ฟฎ>wฑAึตเญท฿A__€‹ฆ>๐=่G!""|ะcoบู้=!ๅ,L"า†- II‰vใ[ถl…Iโ›lUu5Ž9h5ŠฅK9}mญJ“1้|๊ไษ V2ผ๘๛@ฐ ‹”ุ}Bฎม๖€&"็0ไฉDชŠhณ!7฿ตv*๖๛ูvuwcวฮRป๑œว “WฏZ้ธซ-1qฆNโ๒q:Nฑํมˆ†;_heCค y*Yดhกไใฝญ[ %๏ย9ฒrลr%Vgfg_๙Xถปง;v”HžCะ้1Œ๗ฉฝฺwพs/]|\t๓อ7bฬ˜ัชˆˆˆศu y*1 X#ฑญซป%ฅป>ัhฤ๒eKํฦซชชpขข๒›ฝuK!๚„วูณf*ถIนค$'ใฌxฑ IDATัŸศฉ†พzฝทoธU๖vLDDDJcศSQ†ƒ6(ู.๖[หสส”|ผqฉŠ(Šศ/ุ:ภ๑รปmŠ”้ำงแx๋ืฏCคฤ^ขแแ#พz^xทธ๕ึ›Uจˆˆh`œชขK๛ู๎ฝlฏI8SUสส“?~œS็I5SฆNA๙U[;ํฺต ๗~๋.œ9S๚๚zษcใโใ0รอฆฅZŽ๛พ-๗ํoกๅytvtBE„Ct”อ์- Ž”Eaแ6๙ล]…!Oe™™v!rr๓œy•™a๒.5>ฎฌ<9ภqke๏:DGE)์ฺ/ดcุฟ:อF๎DDDJcศSู๔้ำ`wงญดt7พ}๏= ณ฿ฃVสผนs‰๓W5:ฮษฮEgwทไ1Xนrน{…“ำš›[ฐg๏>”ํ/C๙ัclฺKDD^มงฒK๛ูพ๖;WŒ›อflบ 7xฝS็ั๋๕ศศXƒ๗๐Š๑ŽฮN‡ว,[บฤฉลไบ††”””b๗žฝ8sฆJํrˆˆhbศ๓ซVญภ{๏}`ท๚57ฏื_ญไโ )k๐๑'Ÿ:๙?“mSีำำ‹าาRlVŒ•Eqภ๗ ‚€ัฃS‚C.liGDDไ †<„eKฃ`kแใ---(+;€นs็8užฐฐ0,]ฒ…Š}๏ค‰0ztช๋ลาDQฤ‘๒ฃุฒฅ{๗๎ƒษd๔˜ไไ$dคฏฦys…- yD*ณŠ"ฺ๛บั฿‹อณี†~ซ f› ]!ํˆ™ค‡อXM"ฌ& ฟS„นGฤ ฿ๅˆTล็#ึfญต y“›๏tศ€nป;Jvz7ป3ศcฑXฐญx;ฒ7็ ฆฆึฉcfอœkฏ[iiSูัŸHEVQDcWฮvถขฉปm่์๏u|๗=9ืฅอ ๔wˆ่๏ฐกปYDWฃ }ํL}ฮฒ5žƒ.n”ฺehCžš‚ & ขขโŠ๑C‡ฃพพ N'&&฿๛w๐ส+ฏรfณIพgD๘,\ธ@vอร‘ลbAaa>ู๘ZZZœ:&>>฿ฮฝ˜5kฆ‡ซ#"Gzอจhm@u{๊ป.ภb“ฟJงŒŒz„ง\3๗‰่jั^cEg \F›,f๔~๖&‚๎!„เPตซั,†<’™™n๒DQDnn>๎ป๏^งฯณzีJค$'ใŸ|‡ฑ{=}อjn๎†ฒฒƒx๋ํw๖”’ฑ6฿ฝ๏^yฉภ&ฺpบญ 'Zฯกฆd๑ข…๘ว;๏ขB๛ใ…Šp็ท#ภ…TวŽƒะP๛oG—Vแ’๓ฺ/ดใoฏพŽ} ั้tธ๏พoa]Vฆ+#")6ุ๐Uc54œAทYฝ^” jœQใ๔่mัrยŠถ3Vฮใ€ฏง™€!m๔q‰*คM์‚๋C VK์gำำ‹ํK\:W[[v๏ูc7>ล~zไœฒฒƒ๘ัOu)เภw๐ˆTsผฅ;jฉ๐ฎfŒดะ€ ๋‘ขงๅ~Maฺž &_ฯ`ศ๓1k3ึHถLูœใาyฒs๒`ฑุOษฬไ>ตฮ๚โหอx๖๙฿กฃฝรฅใึฎMG‘jฌ><.0\‡ไ%~›๎ใ&=ฐ6ิภRษžภ็cขฃฃ1{๖,ป๑ฺฺณ8~์ธS็0™LุRฐีn-;v๗นuฌฟฟ?–ฏXฆpEDคuมฦฆ๛#zข~Xฯี3•ํ€ญใ‚ฺeh CžArฌลbล–ญ<๖ศ‘ฃจฎฉฑ_ฑb9ŒAFฅJิคพพ>ผง?;์/8˜ดด).ญ€&"บDงFอ1 y‰ฝฺีจฤb†iงk๓ฯi` y>j๕๊•’!?ฟ@rAล%›6gKŽgคฏVจ2ํสห+@Sณs ŽฅLš8Qมjˆh8 Oึa?ีฎD–“ๅฐž;ฃvšม็ฃ‚ƒ‚ฐtษbป๑ถถ ุ๋ GS๓ลฝnฏ6-m*’““ฏQK, พ$ฎP5D4œE๋06ร~Aร๓ูm๖อ€›OT่J y้<๗1๔G 0rs๓$วณ7gK>jT{ŸZพี‰hkk“uŽ0‰ๆำDD๎!`\บŒพ๏งาl- 0uญ7)I๖!OEXญา฿›ฅ”ัฃS1aยxป๑๒๒ฃจญ={ลXoo/ถnณ{oTd$ๆฮใ™dณJ?^ึ๋]๛๘้๔าUฌฮ๏Šฏษ๏ัd2™eŸƒˆ่cV†ๅฃ[Si>ฤ^ตห๒†}ศ๋๎้qxวฎซซหีุห\๋จส•w๓ถฃงว?ˆŒต้ะ;Gาูี%9๎g๐s้<~๖ํ๎–๗TSS+๛ญ2๏]-0\‡ั+ 3 ฏ;zb/ฬ{ทฉ]ฦ7์C^๋yว-Iš[Ÿ„ฏ”ล‹",,ฬn|๛๖๔~๊D› ูู๖p าWฏ๒xƒ9ผ˜ม`@@ k+Qแ/ฑฅฅลฎ๊”่+่ช“'Oนu\}}ฝ์k‘vE๋ผp๘ตW1ฺ [k“ฺe iร>ไUVV:|ํิ้3ฐX,^ฌฦžม`ภ๊ี+ํฦ{{{QT\ 8p๐dPXดh!F„๐lNจจ8i7+น}@A@B\œ๘ฑใวeฯŸ์ํ•Xเ@ู˜Lฎulฯฮษล_n–}m"าถษzDfฝUlV๔๓฿G9†}ศปฏฬแkฆ~ษีช–‘‘.ˆrs๓!Šขร}mี^p\bํะW‡์ฦใใใ:_bโ(ปฑŽ๖œ8~ยญ๓]"uทิU==ศห฿โ๔๛๓๒ ๐ๆ›}]%ˆขผ๙งฺู[\ฤ&๓SŸ@ขตŽ…*ั–‘s Š^ฟถญgOมZUกvCึ๐๚ด\ฅพกe๘ž?ฺจ๚*ุ˜hฬš5ำn์น:lฮฮล!‰EฃSS0Qbั†ทm+–bm๊ิ)noฺ๔4ษ๑๗?ศญ๓]ฎL๛“๗฿gชช|ูlฦซฏฏฝ†"Ÿ-‹YfSฟผ=#อ2๗œ์๋๏—u<ูwm6€=(แ๊\)f™็0™ๅ-๊WโgQC}ืดuKฯใu–จ๒O eฑ:ืฆ3y}7 ,ฐކmศณXฌ๘๓หt๚ชช*|ฒ๑3/Uๅ˜ฃปroฝ๕ษ ™ตึำ% ชพก๏๓=ปqN‡… ๆปuฮ๓็I6‰>rไ(๒๓ :'Œ7ึํc/ืืื‡งžzปw๏ฑ{อfณกtื<๘#฿…;~ƒinnฒ 'mmฎm $ฤ]ั!๏๘ ํฒŽ€n‰…Gฎ่่?/S‰Ÿใ‚‹wW๋’๙wฉฤBฆŽ๗>6ั†ขšr˜๛ไ…~sฟvWบ๛‡ˆŸ.ฝMซฤ๖๓0ฺฅvCา๐๚ค|อfณแีW_ว‰ ว๓๑.๗๛Btใ๕Tš๙:s๚4ฤววฃกกaะ๗†c™D#eojmmล๓ฯ=๖]ๆอ›‹˜˜hทฮ‚5ซWbsถผฏฟ๑lข่ึc๊ys็เญท฿qซฆซuvvโwฟ#GŽฤไIh DScNŸ>ƒ๓{GGGฃEฦ"Ÿžž^|๖๙ธๅๆงOŸมož~>p?8ฆ;;;qแ‚ผ`q๚ดผ๕งd ˆ‹q๛๘๊๊๏ภ:ใไฉำฒŽ๏่่ฝJปVๆJ๑s็๊dีีตHMMu๙ธƒUh้๊@ปผ;y}m๒ป/‹ž Gi+z|แแผw˜๖ย0a„เตKR†ผ๚†๚ษงQธญH๒๕ภภ@ป1Q๑ฏฝ_?๕ฬ โ[๎ผใvฬ›7Wึต‘œœ„’’Rษ_ˆ๕๕๕ศอ/ภ‰0[ฬ1b‚ŒฦAฯ;2!มa๘WšNงรํท฿†o฿{q๐เ!ษV3ฎ่์์Dssห7MผฐtษbŒฤ—=z ฏผ๚บ"๓๚*+Obัข’ำEฏฝ๖NTศŸX][S‹ล‹บูทูl๘๘ใศษอ—]ƒอfCuu -\เrส๒#ๅxๅต7Yั_S]ƒฅKA๏ ทค#%%;‘-q—U ๕ 5j$’“œ฿NฑฐบMm8ถฉฆ.๙ /,fDำ๎vŽ~AL]@฿…กy7/Loฦโฐf—Žฑติร:Bฐ…rร…ะRW34?!ˆขˆ๒๒c8qโ๊๊๋QWWชชjงแœ3g6’Gแ๐‘rœr๒ฑKXh(’S’๘„ฬŸ?‰ฃFส1๚ห_^0ˆฬš5?{]:ฺฑw฿~ิž=‡††Fิิิ นy๐วศ\›กXฏงฝ๛๖;}ว.<|’““ฟ{Šวโ… k๗พ?พ๔g์ุQขLิ๒ราาo๑I~^^} ลฎŠ_๗ใ’ฬบบปQ~คฅฅปฑsื๎A็ฅบ":* ทmธ‹,€1hเ`}๊ไ)ผ๗‡8(ฑ๚ฺ]แแ#pื]wbฑa๓์น:์฿ฟ……EŠ<ขผ\RR"6lธsfฯ‚ŸŸใY๒VซGGaaJJv*บหNJJ ๎ผcfฬ˜ƒaเภู~ก9y๙ุธ๑3Evฝ^๕๋ืแškฒ9เ{zป๐—์pชจ ๕ส๕'Ÿ2)‹งรฉอPะื.โฤ&๙ eิ0สฟ?N<๊๒q๚๘$o๙>†]ำ@7i.ไ้ๅฟ ธx‡jื๗๓๓รฏ~๙&L˜เ‘๓Ÿ>}>๖„รื์ฬžmฟW)gชช๑๋_=%9ืn(1๑ฬำOูr“ษ„_๚7จฌด๏ํง„ ๆใ๛๗วฎaoO/๓ป=arฑ1ั๘ูฯร(‰/?{โ8u๊ดวท์3 HNNยฟšrลkoพ๙6v๏๋ิฃd๗ฏฏGbbาฆNฦทฟญ+^kjlย“O ป%š‚วAW…'Ÿ|•'ัฏภสโ1qโDษ/๙ห+8QQ‰๚๚zuฃF&`บ,ฌ]›~ลkฅป๖`ำ—›pบฆF๖b‹„ม†คyS56ัcืQCี ฺk†สSwCdm€฿ธi WคMšš“w๎\ชธ๘h๘ำOฟ๐ุ๙วŒํp๎X\|fอœ๎ฑkภgŸ}1ไp1Tm๚b“ธฟฟ?{ไว˜}$Tž<ๅั€w๑๚VTUUแ˜Dฤ๎žฏ<่๏๏ว๑’mQŽ?แ๑€\\˜s๔่1ษืŽ”—ฃฎฎฮฃmขDQฤูsuจฉตŸ'Xw๎NTTz4เ@g.ิ4 งU—(_7u๎„ฑ#ูถiธะTศsดGชทต+ะŠa ฿น๏^ษ‰๚7^™๘ำๅ#ฦJhk—ž 6b~๑‹Ÿใบkฏ‘ฝ๏oLL4๘x๑ล฿cฮœูพwีสธv:ทฎc 2โ{๏มqŸุๅ„ˆผร! 8FSฟส%vตรtภณำjดBSkM&z๘'Nอ๓ค;๎ุ๐M; O๙เร๑แ‡๓ฟG‰฿ฝ๐ soไสฯ฿‚W_๛ปGฏแ-|~d ฒbนพกผ%%ฅNOˆ ฦŒำฑbๅrฬ˜>อๅ•ณ…Š๑๎?ๅTฯตะะPฌYฝ๋ื_ƒp'ย]Sฃw๗ aทาปตตU‘…ฮ0๘yี|0‹ล2เžีžm๗9hlj†เฅF๋ข Hถ—iiiอ๊๙;ปdDXh่c]xg฿๔˜=G A0๘kฏ“p๋)+jwญะrื ~บ๛‡ะ…๒Kํ@4๒€‹M`ทlูŠ๊๊ดตตม์ฅฮ็ˆ‹ลไ)Sฐr๙R฿Q€œœ<์,…˜˜hyวDGปื{ฮU{๗ํวƒ_กฑกqศู3Hˆ‹Cฺ๔4,Yผศ้ใL(/?ŠรGกญต m. ฏฏมF#Fฤลฦ !>cฦŽม่ัฉฒ[ขX,Vฉ4ฆเj*Rตพ–SGa7UํRTรวตDDไU~:ฝฺ%h–ฟ^ฝฑฝ ฆƒฅ Tฃ>ำŽlภ2|๚0ไ‘W1ไyŽ!ฏฟ$ะศโ[W;LJิ.C5 yDDไU~\๊1~zyฺz๖ ,ง)To0ํ/†ญsx๎•ฬGDD^`เtpO ะษะ6๚ทoRฎ_a1รTZ vช`ศ#""ฏคv š5"ะ?[๓‘=ฐoTฐ฿aฉ<[ะ^Hโ†<""๒ชˆ€`ตKะ$ C˜ฟ{!O์๏…iOกย๙QD฿๖M€(ช]‰W1ไ‘W…๒ชตต6ร|dŸยี๘&Siฤ~ตห๐WFDD^%โ‚ริ.CsโC้ยดc3`ปˆ=0ํ/Rป ฏaศ#""ฏฅv š3*4าๅc,งยRsาี๘.หมฐ]hQป ฏ`ศ#""ฏcศS–Ÿ€ุ .#ฺฌ่/ษ๓PEพKดYa&?7Cy]Bh8๔œ—ง˜Qก./บ0(ุ~C๙6ห™cฐิTช]†ว๑ฟ0""๒:ฝ C๒ˆhตหะŒัแฑ.ฝ_์้†yฑ‡ชLณ!Zmj—แQ yDDคЉQ#ี.A๔‚c#\:ฦTš ั4|V™Jฑต5รRพGํ2<Š!ˆˆT‘‡@ƒฟฺe yฃ#b w~ซ8[Sฬวzฐขกรด{+ฤพnตห๐†<""R…^06"Nํ2†ผ‰‘ฃœณ(ข๛ๆaท๓ƒ#b/LปตปำCฉfZLฒฺ% iaAHแJeห‰ฏ`ญ~{ธฤ\พึ๓ j—แ yDDคšจ P— ะ™7ฺ๙C,f˜vxถ กศfƒi{ถฺUxCฉjศqj—0$…๘bbtขำ๏7ํ+‚ญซƒ ]ึณงa9uTํ2วGDDชŠ Crฉธjvยh่็zใู:ฺ`:PโแІ6SI`ตจ]†ข„–บฮพ$""Uต๖vแc%ฐู๘+ษแมธ3m‰ำjES?ะใแช†>!$paฅฒฏำฮOBDDCVค1ำcSqฐแŒฺฅ +Rฆ:?€เ๘xฐ"๒E|\KDD>a~ยX„๘ช]†ฯ›9‰a‘j—ACC๙?ฝหSฆจ]†O3ฑ$iขฺeะมGDD>ctx,ฆวฆจ]†ฯZ•š† ?>v%็0ไ‘OY’8 ๑!แj—แsๆ$ŒaOAr C๙N@ฦ่ะ๛ฉ]ŠฯH‰ภ|๖$1ไ‘ฯ 0โฺ๑s`ะ้ี.Eu#‚ฑn์L—Vำ yDDไฃโCย‘9vฦฐ7ม~ธaโ<90|ห!""Ÿ—:"+R&ซ]†*๕~ธ~ย\„๚ณญ น‡อ‰ˆศงM‰N‚^ะck๕แaณ#Fฎ?‘ฦตKก!Œ!ˆˆ|ฤจ‘ะ๛!๗๔AXlVตห๑จฐภ 0n.ยƒิ.…†8>ฎ%"ข!!5<ืO˜ฃม_ํR<&!$ทMZศ€GŠZ๊j†วฝo""า„nsrO}…๚ฎ6ตKQิ๔ุ,Nšฝ จ] iC 9ข(b_)์ญ?Qฺฟฦ ฌJ™†qqj—BรGDDCึนฮVU—ฃญฏ[ํR2&<ห’'#„+hษ๒ˆˆhHณูDnฎม๎บJ˜ญตหqJX€ห“ฆ %jลh๐วŒธTฬŒO…~7y&๏`ศ#""M้4๕แ`ร”ทœ…ีGฺญ1-&3โRแฏg๗2๒†<""าคS?Ž?‡็ฯฉ2gO$†Fbbิ(ŒŒึณ‘:๒ˆˆH๓šบqโ|ชฺ›ะั฿๋ฑ๋‚€ุ 0Œˆร„จ‘๖ใ‚ RC +ฆ>œํ<ณ็ัิีŽss๘๔„adhF…FaTH$ |Kพ!ˆˆ†5›MD‡ฉm}h๏๏ษjูf…ษj†ูb ำมOงG€ฝ๔„ƒŒฉ#ฦฏDD4ฌ้tย/†6"-แ,P"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า †<"""" bศ#"""า €~ต‹ """"E๕๋ เผฺU‘ขZtQฎvDDDDค8ฌPคv!DDDDคbฑะV&ี*๊O‹0ˆˆˆˆดภฆ‡eŒ."at€ฯิฎ†ˆˆˆˆ” |1rLตD›๎1p•-ัPืoณโgภืhc+เquk"""""yฤGb“’*@๘fH…๓๕ต เ.ี๊"""""7‰•|ฏ "pูb Aฤจ„ฆ๛ เ ๕Š#""""— ๘<*ก๙ป—ลกซˆขhhฉฏ›๏๊ˆˆˆˆศUฤื"’]หๅใvmSAฐฤŒL๑บฝV!นขW€๘Pิศ”ฎx€ฤผห5ีึŽ๔โKฐฮs๕‘+›,z๑‡qqษงฟว ็๋jณDQ%,Tฎ<""""rฐS€๘๋จ‘ษyƒพำ•ำ6ีี,ืธ@€ปๅ‘ำ๚๑#„WcG&ow๖ —B%็ฯW†ู๚ึC‡+ฤนs""""’ิ ุfณแ3๘7ลฤฤtบzทBีš”8@IDATฯ›Xg าa€QO `จฤuˆˆˆˆ4ข@/ tˆฯ ๊๑„ โˆMิˆILฌ{ฉžU@H้]-IENDฎB`‚ManimCommunity-manim-1157b74/logo/dark/000077500000000000000000000000001515024150700177145ustar00rootroot00000000000000ManimCommunity-manim-1157b74/logo/dark/dark_background.svg000066400000000000000000000126011515024150700235550ustar00rootroot00000000000000 image/svg+xml ManimCommunity-manim-1157b74/logo/dark/transparent_background.svg000066400000000000000000000120351515024150700251760ustar00rootroot00000000000000 image/svg+xml ManimCommunity-manim-1157b74/logo/light/000077500000000000000000000000001515024150700201025ustar00rootroot00000000000000ManimCommunity-manim-1157b74/logo/light/light_background.svg000066400000000000000000000126031515024150700241330ustar00rootroot00000000000000 image/svg+xml ManimCommunity-manim-1157b74/logo/light/transparent_background.svg000066400000000000000000000122141515024150700253630ustar00rootroot00000000000000 image/svg+xml ManimCommunity-manim-1157b74/logo/monochromatic/000077500000000000000000000000001515024150700216355ustar00rootroot00000000000000ManimCommunity-manim-1157b74/logo/monochromatic/monochromatic_black.svg000066400000000000000000000313671515024150700263660ustar00rootroot00000000000000 image/svg+xml ManimCommunity-manim-1157b74/logo/monochromatic/monochromatic_white.svg000066400000000000000000000313651515024150700264300ustar00rootroot00000000000000 image/svg+xml ManimCommunity-manim-1157b74/manim/000077500000000000000000000000001515024150700171345ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/__init__.py000066400000000000000000000075211515024150700212520ustar00rootroot00000000000000#!/usr/bin/env python from __future__ import annotations from importlib.metadata import PackageNotFoundError, version # Use installed distribution version if available; otherwise fall back to a # sensible default so that importing from a source checkout works without an # editable install (pip install -e .). try: __version__ = version(__name__) except PackageNotFoundError: # Package is not installed; provide a fallback version string. __version__ = "0.0.0+unknown" # isort: off # Importing the config module should be the first thing we do, since other # modules depend on the global config dict for initialization. from ._config import * # many scripts depend on this -> has to be loaded first from .utils.commands import * # isort: on import numpy as np from .animation.animation import * from .animation.changing import * from .animation.composition import * from .animation.creation import * from .animation.fading import * from .animation.growing import * from .animation.indication import * from .animation.movement import * from .animation.numbers import * from .animation.rotation import * from .animation.specialized import * from .animation.speedmodifier import * from .animation.transform import * from .animation.transform_matching_parts import * from .animation.updaters.mobject_update_utils import * from .animation.updaters.update import * from .camera.camera import * from .camera.mapping_camera import * from .camera.moving_camera import * from .camera.multi_camera import * from .camera.three_d_camera import * from .constants import * from .mobject.frame import * from .mobject.geometry.arc import * from .mobject.geometry.boolean_ops import * from .mobject.geometry.labeled import * from .mobject.geometry.line import * from .mobject.geometry.polygram import * from .mobject.geometry.shape_matchers import * from .mobject.geometry.tips import * from .mobject.graph import * from .mobject.graphing.coordinate_systems import * from .mobject.graphing.functions import * from .mobject.graphing.number_line import * from .mobject.graphing.probability import * from .mobject.graphing.scale import * from .mobject.logo import * from .mobject.matrix import * from .mobject.mobject import * from .mobject.opengl.dot_cloud import * from .mobject.opengl.opengl_point_cloud_mobject import * from .mobject.svg.brace import * from .mobject.svg.svg_mobject import * from .mobject.table import * from .mobject.text.code_mobject import * from .mobject.text.numbers import * from .mobject.text.tex_mobject import * from .mobject.text.text_mobject import * from .mobject.three_d.polyhedra import * from .mobject.three_d.three_d_utils import * from .mobject.three_d.three_dimensions import * from .mobject.types.image_mobject import * from .mobject.types.point_cloud_mobject import * from .mobject.types.vectorized_mobject import * from .mobject.value_tracker import * from .mobject.vector_field import * from .renderer.cairo_renderer import * from .scene.moving_camera_scene import * from .scene.scene import * from .scene.scene_file_writer import * from .scene.section import * from .scene.three_d_scene import * from .scene.vector_space_scene import * from .scene.zoomed_scene import * from .utils import color, rate_functions, unit from .utils.bezier import * from .utils.color import * from .utils.config_ops import * from .utils.debug import * from .utils.file_ops import * from .utils.images import * from .utils.iterables import * from .utils.paths import * from .utils.rate_functions import * from .utils.simple_functions import * from .utils.sounds import * from .utils.space_ops import * from .utils.tex import * from .utils.tex_templates import * try: from IPython import get_ipython from .utils.ipython_magic import ManimMagic except ImportError: pass else: ipy = get_ipython() if ipy is not None: ipy.register_magics(ManimMagic) from .plugins import * ManimCommunity-manim-1157b74/manim/__main__.py000066400000000000000000000050211515024150700212240ustar00rootroot00000000000000from __future__ import annotations import click import cloup from manim import __version__ from manim._config import cli_ctx_settings, console from manim.cli.cfg.group import cfg from manim.cli.checkhealth.commands import checkhealth from manim.cli.default_group import DefaultGroup from manim.cli.init.commands import init from manim.cli.plugins.commands import plugins from manim.cli.render.commands import render from manim.constants import EPILOG def show_splash(ctx: click.Context, param: click.Option, value: str | None) -> None: """When giving a value by console, show an initial message with the Manim version before executing any other command: ``Manim Community vA.B.C``. Parameters ---------- ctx The Click context. param A Click option. value A string value given by console, or None. """ if value: console.print(f"Manim Community [green]v{__version__}[/green]\n") def print_version_and_exit( ctx: click.Context, param: click.Option, value: str | None ) -> None: """Same as :func:`show_splash`, but also exit when giving a value by console. Parameters ---------- ctx The Click context. param A Click option. value A string value given by console, or None. """ show_splash(ctx, param, value) if value: ctx.exit() @cloup.group( context_settings=cli_ctx_settings, cls=DefaultGroup, default="render", no_args_is_help=True, help="Animation engine for explanatory math videos.", epilog="See 'manim ' to read about a specific subcommand.\n\n" "Note: the subcommand 'manim render' is called if no other subcommand " "is specified. Run 'manim render --help' if you would like to know what the " f"'-ql' or '-p' flags do, for example.\n\n{EPILOG}", ) @cloup.option( "--version", is_flag=True, help="Show version and exit.", callback=print_version_and_exit, is_eager=True, expose_value=False, ) @click.option( "--show-splash/--hide-splash", is_flag=True, default=True, help="Print splash message with version information.", callback=show_splash, is_eager=True, expose_value=False, ) @cloup.pass_context def main(ctx: click.Context) -> None: """The entry point for Manim. Parameters ---------- ctx The Click context. """ pass main.add_command(checkhealth) main.add_command(cfg) main.add_command(plugins) main.add_command(init) main.add_command(render) if __name__ == "__main__": main() ManimCommunity-manim-1157b74/manim/_config/000077500000000000000000000000001515024150700205405ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/_config/__init__.py000066400000000000000000000051771515024150700226630ustar00rootroot00000000000000"""Set the global config and logger.""" from __future__ import annotations import logging from collections.abc import Generator from contextlib import contextmanager from typing import Any from .cli_colors import parse_cli_ctx from .logger_utils import make_logger from .utils import ManimConfig, ManimFrame, make_config_parser __all__ = [ "logger", "console", "error_console", "config", "frame", "tempconfig", "cli_ctx_settings", ] parser = make_config_parser() # Logger usage: accessible globally as `manim.logger` or via `logging.getLogger("manim")`. # For printing, use `manim.console.print()` instead of the built-in `print()`. # For error output, use `error_console`, which prints to stderr. logger, console, error_console = make_logger( parser["logger"], parser["CLI"]["verbosity"], ) cli_ctx_settings = parse_cli_ctx(parser["CLI_CTX"]) # TODO: temporary to have a clean terminal output when working with PIL or matplotlib logging.getLogger("PIL").setLevel(logging.INFO) logging.getLogger("matplotlib").setLevel(logging.INFO) config = ManimConfig().digest_parser(parser) # TODO: to be used in the future - see PR #620 # https://github.com/ManimCommunity/manim/pull/620 frame = ManimFrame(config) # This has to go here because it needs access to this module's config @contextmanager def tempconfig(temp: ManimConfig | dict[str, Any]) -> Generator[None, None, None]: """Temporarily modifies the global ``config`` object using a context manager. Inside the ``with`` statement, the modified config will be used. After context manager exits, the config will be restored to its original state. Parameters ---------- temp Object whose keys will be used to temporarily update the global ``config``. Examples -------- Use ``with tempconfig({...})`` to temporarily change the default values of certain config options. .. code-block:: pycon >>> config["frame_height"] 8.0 >>> with tempconfig({"frame_height": 100.0}): ... print(config["frame_height"]) 100.0 >>> config["frame_height"] 8.0 """ global config original = config.copy() temp = {k: v for k, v in temp.items() if k in original} # In order to change the config that every module has access to, use # update(), DO NOT use assignment. Assigning config = some_dict will just # make the local variable named config point to a new dictionary, it will # NOT change the dictionary that every module has a reference to. config.update(temp) try: yield finally: config.update(original) # update, not assignment! ManimCommunity-manim-1157b74/manim/_config/cli_colors.py000066400000000000000000000042341515024150700232450ustar00rootroot00000000000000"""Parses CLI context settings from the configuration file and returns a Cloup Context settings dictionary. This module reads configuration values for help formatting, theme styles, and alignment options used when rendering command-line interfaces in Manim. """ from __future__ import annotations import configparser from typing import Any from cloup import Context, HelpFormatter, HelpTheme, Style __all__ = ["parse_cli_ctx"] def parse_cli_ctx(parser: configparser.SectionProxy) -> dict[str, Any]: formatter_settings: dict[str, str | int | None] = { "indent_increment": int(parser["indent_increment"]), "width": int(parser["width"]), "col1_max_width": int(parser["col1_max_width"]), "col2_min_width": int(parser["col2_min_width"]), "col_spacing": int(parser["col_spacing"]), "row_sep": parser["row_sep"] if parser["row_sep"] else None, } theme_settings = {} theme_keys = { "command_help", "invoked_command", "heading", "constraint", "section_help", "col1", "col2", "epilog", } # Extract and apply any style-related keys defined in the config section. for k, v in parser.items(): if k in theme_keys and v: theme_settings.update({k: Style(v)}) formatter = {} theme = parser["theme"] if parser["theme"] else None if theme is None: formatter = HelpFormatter.settings( theme=HelpTheme(**theme_settings), **formatter_settings, ) elif theme.lower() == "dark": formatter = HelpFormatter.settings( theme=HelpTheme.dark().with_(**theme_settings), **formatter_settings, ) elif theme.lower() == "light": formatter = HelpFormatter.settings( theme=HelpTheme.light().with_(**theme_settings), **formatter_settings, ) return_val: dict[str, Any] = Context.settings( align_option_groups=parser["align_option_groups"].lower() == "true", align_sections=parser["align_sections"].lower() == "true", show_constraints=True, formatter_settings=formatter, ) return return_val ManimCommunity-manim-1157b74/manim/_config/default.cfg000066400000000000000000000123211515024150700226440ustar00rootroot00000000000000# manim.cfg # Default configuration for manim # Configure how manim behaves when called from the command line without # specifying any flags [CLI] # Each of the following will be set to True if the corresponding CLI flag # is present when executing manim. If the flag is not present, they will # be set to the value found here. For example, running manim with the -w # flag will set WRITE_TO_MOVIE to True. However, since the default value # of WRITE_TO_MOVIE defined in this file is also True, running manim # without the -w value will also output a movie file. To change that, set # WRITE_TO_MOVIE = False so that running manim without the -w flag will not # generate a movie file. Note all of the following accept boolean values. # --notify_outdated_version notify_outdated_version = True # -w, --write_to_movie write_to_movie = True format = mp4 # -s, --save_last_frame # setting save_last_frame to True forces write_to_movie to False save_last_frame = False # -a, --write_all write_all = False # -g, --save_pngs save_pngs = False # -0, --zero_pad zero_pad = 4 # -i, --save_as_gif save_as_gif = False # --save_sections save_sections = False # -p, --preview preview = False # -f, --show_in_file_browser show_in_file_browser = False # -v, --verbosity verbosity = INFO # --progress_bar progress_bar = display # -o, --output_file output_file = # --log_to_file log_to_file = False # -c, --background_color background_color = BLACK # --background_opacity background_opacity = 1 # The following two are both set by the -n (or --from_animation_number) # flag. See manim -h for more information. from_animation_number = 0 # Use -1 to render all animations upto_animation_number = -1 # The following are meant to be paths relative to the point of execution. # Set them at the CLI with the corresponding flag, or set their default # values here. # --media_dir media_dir = ./media # --log_dir log_dir = {media_dir}/logs # --assets_dir assets_dir = ./ # the following do not have CLI arguments but depend on media_dir video_dir = {media_dir}/videos/{module_name}/{quality} sections_dir = {video_dir}/sections images_dir = {media_dir}/images/{module_name} tex_dir = {media_dir}/Tex text_dir = {media_dir}/texts partial_movie_dir = {video_dir}/partial_movie_files/{scene_name} # --renderer [cairo|opengl] renderer = cairo # --enable_gui enable_gui = False # --gui_location gui_location = 0,0 # --fullscreen fullscreen = False # "Set the position of preview window. You can use directions, e.g. UL/DR/LEFT/ORIGIN # or the position (pixel) of the upper left corner of the window, e.g. '960,540'", # --window_position window_position = UR # Manually adjust the size of the window, or use default to automatically scale the window based on # the dimensions of the monitor. # --window_size window_size = default # --window_monitor window_monitor = 0 # --force_window force_window = False # --use_projection_fill_shaders use_projection_fill_shaders = False # --use_projection_stroke_shaders use_projection_stroke_shaders = False movie_file_extension = .mp4 # These now override the --quality option. frame_rate = 60 pixel_height = 1080 pixel_width = 1920 # Use -1 to set max_files_cached to infinity. max_files_cached = 100 #Flush cache will delete all the cached partial-movie-files. flush_cache = False disable_caching = False # Disable the warning when there are too much submobjects to hash. disable_caching_warning = False # --enable_wireframe enable_wireframe = False # --dry_run dry_run = False # Default tex_template # --tex_template tex_template = # specify the plugins as comma separated values # manim will load that plugin if it specified here. plugins = # CLI Context/Formatter # Visit the cloup documentation to understand the formatting options available: # https://cloup.readthedocs.io/en/latest/index.html#a-simple-example [CLI_CTX] # CTX settings align_option_groups = True align_sections = True show_constraints = True # Formatter settings indent_increment = 2 width = 80 col1_max_width = 30 col2_min_width = 35 col_spacing = 2 row_sep = # Dark/Light, or leave empty theme = # Theme Settings - The following options override the theme colors. command_help = invoked_command = heading = constraint = section_help = col1 = col2 = epilog = # Overrides the default output folders, NOT the output file names. Note that # if the custom_folders flag is present, the Tex and text files will not be put # under media_dir, as is the default. [custom_folders] media_dir = videos video_dir = {media_dir} sections_dir = {media_dir} images_dir = {media_dir} text_dir = {media_dir}/temp_files tex_dir = {media_dir}/temp_files log_dir = {media_dir}/temp_files partial_movie_dir = {media_dir}/partial_movie_files/{scene_name} # Rich settings [logger] logging_keyword = bold yellow logging_level_notset = dim logging_level_debug = green logging_level_info = green logging_level_warning = red logging_level_error = red bold logging_level_critical = red bold reverse log_level = log_time = cyan dim log_message = log_path = dim log_width = -1 log_height = -1 log_timestamps = True repr_number = green [ffmpeg] # Uncomment the following line to manually set the loglevel for ffmpeg. See # ffmpeg manpage for accepted values loglevel = ERROR [jupyter] media_embed = False media_width = 60%% ManimCommunity-manim-1157b74/manim/_config/logger_utils.py000066400000000000000000000131641515024150700236160ustar00rootroot00000000000000"""Utilities to create and set the logger. Manim's logger can be accessed as ``manim.logger``, or as ``logging.getLogger("manim")``, once the library has been imported. Manim also exports a second object, ``console``, which should be used to print on screen messages that need not be logged. Both ``logger`` and ``console`` use the ``rich`` library to produce rich text format. """ from __future__ import annotations import configparser import copy import json import logging from typing import TYPE_CHECKING, Any from rich import color, errors from rich import print as printf from rich.console import Console from rich.logging import RichHandler from rich.theme import Theme if TYPE_CHECKING: from pathlib import Path __all__ = ["make_logger", "parse_theme", "set_file_logger", "JSONFormatter"] HIGHLIGHTED_KEYWORDS = [ # these keywords are highlighted specially "Played", "animations", "scene", "Reading", "Writing", "script", "arguments", "Invalid", "Aborting", "module", "File", "Rendering", "Rendered", ] WRONG_COLOR_CONFIG_MSG = """ [logging.level.error]Your colour configuration couldn't be parsed. Loading the default color configuration.[/logging.level.error] """ def make_logger( parser: configparser.SectionProxy, verbosity: str, ) -> tuple[logging.Logger, Console, Console]: """Make the manim logger and console. Parameters ---------- parser A parser containing any .cfg files in use. verbosity The verbosity level of the logger. Returns ------- :class:`logging.Logger`, :class:`rich.Console`, :class:`rich.Console` The manim logger and consoles. The first console outputs to stdout, the second to stderr. All use the theme returned by :func:`parse_theme`. See Also -------- :func:`~._config.utils.make_config_parser`, :func:`parse_theme` Notes ----- The ``parser`` is assumed to contain only the options related to configuring the logger at the top level. """ # Throughout the codebase, use console.print() instead of print() theme = parse_theme(parser) console = Console(theme=theme) error_console = Console(theme=theme, stderr=True) # set the rich handler rich_handler = RichHandler( console=console, show_time=parser.getboolean("log_timestamps", fallback=False), keywords=HIGHLIGHTED_KEYWORDS, ) # finally, the logger logger = logging.getLogger("manim") logger.addHandler(rich_handler) logger.setLevel(verbosity) logger.propagate = False if not (libav_logger := logging.getLogger()).hasHandlers(): libav_logger.addHandler(rich_handler) libav_logger.setLevel(verbosity) return logger, console, error_console def parse_theme(parser: configparser.SectionProxy) -> Theme | None: """Configure the rich style of logger and console output. Parameters ---------- parser A parser containing any .cfg files in use. Returns ------- :class:`rich.Theme` The rich theme to be used by the manim logger. See Also -------- :func:`make_logger`. """ theme: dict[str, Any] = {key.replace("_", "."): parser[key] for key in parser} theme["log.width"] = None if theme["log.width"] == "-1" else int(theme["log.width"]) theme["log.height"] = ( None if theme["log.height"] == "-1" else int(theme["log.height"]) ) theme["log.timestamps"] = False try: custom_theme = Theme( { k: v for k, v in theme.items() if k not in ["log.width", "log.height", "log.timestamps"] }, ) except (color.ColorParseError, errors.StyleSyntaxError): printf(WRONG_COLOR_CONFIG_MSG) custom_theme = None return custom_theme def set_file_logger(scene_name: str, module_name: str, log_dir: Path) -> None: """Add a file handler to manim logger. The path to the file is built using ``config.log_dir``. Parameters ---------- scene_name The name of the scene, used in the name of the log file. module_name The name of the module, used in the name of the log file. log_dir Path to the folder where log files are stored. """ # Note: The log file name will be # _.log, gotten from config. So it # can differ from the real name of the scene. would only # appear if scene name was provided when manim was called. log_file_name = f"{module_name}_{scene_name}.log" log_file_path = log_dir / log_file_name file_handler = logging.FileHandler(log_file_path, mode="w") file_handler.setFormatter(JSONFormatter()) logger = logging.getLogger("manim") logger.addHandler(file_handler) logger.info("Log file will be saved in %(logpath)s", {"logpath": log_file_path}) class JSONFormatter(logging.Formatter): """A formatter that outputs logs in a custom JSON format. This class is used internally for testing purposes. """ def format(self, record: logging.LogRecord) -> str: """Format the record in a custom JSON format.""" record_c = copy.deepcopy(record) if record_c.args: if isinstance(record_c.args, dict): for arg in record_c.args: record_c.args[arg] = "<>" else: record_c.args = ("<>",) * len(record_c.args) return json.dumps( { "levelname": record_c.levelname, "module": record_c.module, "message": super().format(record_c), }, ) ManimCommunity-manim-1157b74/manim/_config/utils.py000066400000000000000000001744541515024150700222710ustar00rootroot00000000000000"""Utilities to create and set the config. The main class exported by this module is :class:`ManimConfig`. This class contains all configuration options, including frame geometry (e.g. frame height/width, frame rate), output (e.g. directories, logging), styling (e.g. background color, transparency), and general behavior (e.g. writing a movie vs writing a single frame). See :doc:`/guides/configuration` for an introduction to Manim's configuration system. """ from __future__ import annotations import argparse import configparser import copy import errno import logging import os import re import sys from collections.abc import Iterator, Mapping, MutableMapping from pathlib import Path from typing import TYPE_CHECKING, Any, ClassVar, NoReturn import numpy as np from manim import constants from manim.constants import RendererType from manim.utils.color import ManimColor from manim.utils.tex import TexTemplate if TYPE_CHECKING: from enum import EnumMeta from typing import Self from manim.typing import StrPath, Vector3D __all__ = ["config_file_paths", "make_config_parser", "ManimConfig", "ManimFrame"] logger = logging.getLogger("manim") def config_file_paths() -> list[Path]: """The paths where ``.cfg`` files will be searched for. When manim is first imported, it processes any ``.cfg`` files it finds. This function returns the locations in which these files are searched for. In ascending order of precedence, these are: the library-wide config file, the user-wide config file, and the folder-wide config file. The library-wide config file determines manim's default behavior. The user-wide config file is stored in the user's home folder, and determines the behavior of manim whenever the user invokes it from anywhere in the system. The folder-wide config file only affects scenes that are in the same folder. The latter two files are optional. These files, if they exist, are meant to loaded into a single :class:`configparser.ConfigParser` object, and then processed by :class:`ManimConfig`. Returns ------- List[:class:`Path`] List of paths which may contain ``.cfg`` files, in ascending order of precedence. See Also -------- :func:`make_config_parser`, :meth:`ManimConfig.digest_file`, :meth:`ManimConfig.digest_parser` Notes ----- The location of the user-wide config file is OS-specific. """ library_wide = Path.resolve(Path(__file__).parent / "default.cfg") if sys.platform.startswith("win32"): user_wide = Path.home() / "AppData" / "Roaming" / "Manim" / "manim.cfg" else: user_wide = Path.home() / ".config" / "manim" / "manim.cfg" folder_wide = Path("manim.cfg") return [library_wide, user_wide, folder_wide] def make_config_parser( custom_file: StrPath | None = None, ) -> configparser.ConfigParser: """Make a :class:`ConfigParser` object and load any ``.cfg`` files. The user-wide file, if it exists, overrides the library-wide file. The folder-wide file, if it exists, overrides the other two. The folder-wide file can be ignored by passing ``custom_file``. However, the user-wide and library-wide config files cannot be ignored. Parameters ---------- custom_file Path to a custom config file. If used, the folder-wide file in the relevant directory will be ignored, if it exists. If None, the folder-wide file will be used, if it exists. Returns ------- :class:`ConfigParser` A parser containing the config options found in the .cfg files that were found. It is guaranteed to contain at least the config options found in the library-wide file. See Also -------- :func:`config_file_paths` """ library_wide, user_wide, folder_wide = config_file_paths() # From the documentation: "An application which requires initial values to # be loaded from a file should load the required file or files using # read_file() before calling read() for any optional files." # https://docs.python.org/3/library/configparser.html#configparser.ConfigParser.read parser = configparser.ConfigParser() logger.info(f"Reading config file: {library_wide}") with library_wide.open() as file: parser.read_file(file) # necessary file other_files = [user_wide, Path(custom_file) if custom_file else folder_wide] for path in other_files: if path.exists(): logger.info(f"Reading config file: {path}") parser.read(other_files) # optional files return parser def _determine_quality(qual: str | None) -> str: for quality, values in constants.QUALITIES.items(): if values["flag"] is not None and values["flag"] == qual: return quality return qual class ManimConfig(MutableMapping): """Dict-like class storing all config options. The global ``config`` object is an instance of this class, and acts as a single source of truth for all of the library's customizable behavior. The global ``config`` object is capable of digesting different types of sources and converting them into a uniform interface. These sources are (in ascending order of precedence): configuration files, command line arguments, and programmatic changes. Regardless of how the user chooses to set a config option, she can access its current value using :class:`ManimConfig`'s attributes and properties. Notes ----- Each config option is implemented as a property of this class. Each config option can be set via a config file, using the full name of the property. If a config option has an associated CLI flag, then the flag is equal to the full name of the property. Those that admit an alternative flag or no flag at all are documented in the individual property's docstring. Examples -------- We use a copy of the global configuration object in the following examples for the sake of demonstration; you can skip these lines and just import ``config`` directly if you actually want to modify the configuration: .. code-block:: pycon >>> from manim import config as global_config >>> config = global_config.copy() Each config option allows for dict syntax and attribute syntax. For example, the following two lines are equivalent, .. code-block:: pycon >>> from manim import WHITE >>> config.background_color = WHITE >>> config["background_color"] = WHITE The former is preferred; the latter is provided mostly for backwards compatibility. The config options are designed to keep internal consistency. For example, setting ``frame_y_radius`` will affect ``frame_height``: .. code-block:: pycon >>> config.frame_height 8.0 >>> config.frame_y_radius = 5.0 >>> config.frame_height 10.0 There are many ways of interacting with config options. Take for example the config option ``background_color``. There are three ways to change it: via a config file, via CLI flags, or programmatically. To set the background color via a config file, save the following ``manim.cfg`` file with the following contents. .. code-block:: [CLI] background_color = WHITE In order to have this ``.cfg`` file apply to a manim scene, it needs to be placed in the same directory as the script, .. code-block:: bash project/ โ”œโ”€scene.py โ””โ”€manim.cfg Now, when the user executes .. code-block:: bash manim scene.py the background of the scene will be set to ``WHITE``. This applies regardless of where the manim command is invoked from. Command line arguments override ``.cfg`` files. In the previous example, executing .. code-block:: bash manim scene.py -c BLUE will set the background color to BLUE, regardless of the contents of ``manim.cfg``. Finally, any programmatic changes made within the scene script itself will override the command line arguments. For example, if ``scene.py`` contains the following .. code-block:: python from manim import * config.background_color = RED class MyScene(Scene): ... the background color will be set to RED, regardless of the contents of ``manim.cfg`` or the CLI arguments used when invoking manim. """ _OPTS = { "assets_dir", "background_color", "background_opacity", "custom_folders", "disable_caching", "disable_caching_warning", "dry_run", "enable_wireframe", "ffmpeg_loglevel", "format", "flush_cache", "frame_height", "frame_rate", "frame_width", "frame_x_radius", "frame_y_radius", "from_animation_number", "images_dir", "input_file", "media_embed", "media_width", "log_dir", "log_to_file", "max_files_cached", "media_dir", "movie_file_extension", "notify_outdated_version", "output_file", "partial_movie_dir", "pixel_height", "pixel_width", "plugins", "preview", "progress_bar", "quality", "save_as_gif", "save_sections", "save_last_frame", "save_pngs", "scene_names", "seed", "show_in_file_browser", "tex_dir", "tex_template", "tex_template_file", "text_dir", "upto_animation_number", "renderer", "enable_gui", "gui_location", "use_projection_fill_shaders", "use_projection_stroke_shaders", "verbosity", "video_dir", "sections_dir", "fullscreen", "window_position", "window_size", "window_monitor", "write_all", "write_to_movie", "zero_pad", "force_window", "no_latex_cleanup", "preview_command", } def __init__(self) -> None: self._d: dict[str, Any | None] = dict.fromkeys(self._OPTS) # behave like a dict def __iter__(self) -> Iterator[str]: return iter(self._d) def __len__(self) -> int: return len(self._d) def __contains__(self, key: object) -> bool: try: assert isinstance(key, str) self.__getitem__(key) return True except AttributeError: return False def __getitem__(self, key: str) -> Any: return getattr(self, key) def __setitem__(self, key: str, val: Any) -> None: getattr(ManimConfig, key).fset(self, val) # fset is the property's setter def update(self, obj: ManimConfig | dict[str, Any]) -> None: # type: ignore[override] """Digest the options found in another :class:`ManimConfig` or in a dict. Similar to :meth:`dict.update`, replaces the values of this object with those of ``obj``. Parameters ---------- obj The object to copy values from. Returns ------- None Raises ----- :class:`AttributeError` If ``obj`` is a dict but contains keys that do not belong to any config options. See Also -------- :meth:`~ManimConfig.digest_file`, :meth:`~ManimConfig.digest_args`, :meth:`~ManimConfig.digest_parser` """ if isinstance(obj, ManimConfig): self._d.update(obj._d) if obj.tex_template: self.tex_template = obj.tex_template elif isinstance(obj, dict): # First update the underlying _d, then update other properties _dict = {k: v for k, v in obj.items() if k in self._d} for k, v in _dict.items(): self[k] = v _dict = {k: v for k, v in obj.items() if k not in self._d} for k, v in _dict.items(): self[k] = v # don't allow to delete anything def __delitem__(self, key: str) -> NoReturn: raise AttributeError("'ManimConfig' object does not support item deletion") def __delattr__(self, key: str) -> NoReturn: raise AttributeError("'ManimConfig' object does not support item deletion") # copy functions def copy(self) -> Self: """Deepcopy the contents of this ManimConfig. Returns ------- :class:`ManimConfig` A copy of this object containing no shared references. See Also -------- :func:`tempconfig` Notes ----- This is the main mechanism behind :func:`tempconfig`. """ return copy.deepcopy(self) def __copy__(self) -> Self: """See ManimConfig.copy().""" return copy.deepcopy(self) def __deepcopy__(self, memo: dict[str, Any]) -> Self: """See ManimConfig.copy().""" c = type(self)() # Deepcopying the underlying dict is enough because all properties # either read directly from it or compute their value on the fly from # values read directly from it. c._d = copy.deepcopy(self._d, memo) # type: ignore[arg-type] return c # helper type-checking methods def _set_from_list(self, key: str, val: Any, values: list[Any]) -> None: """Set ``key`` to ``val`` if ``val`` is contained in ``values``.""" if val in values: self._d[key] = val else: raise ValueError(f"attempted to set {key} to {val}; must be in {values}") def _set_from_enum(self, key: str, enum_value: Any, enum_class: EnumMeta) -> None: """Set ``key`` to the enum object with value ``enum_value`` in the given ``enum_class``. Tests:: >>> from enum import Enum >>> class Fruit(Enum): ... APPLE = 1 ... BANANA = 2 ... CANTALOUPE = 3 >>> test_config = ManimConfig() >>> test_config._set_from_enum("fruit", 1, Fruit) >>> test_config._d['fruit'] >>> test_config._set_from_enum("fruit", Fruit.BANANA, Fruit) >>> test_config._d['fruit'] >>> test_config._set_from_enum("fruit", 42, Fruit) Traceback (most recent call last): ... ValueError: 42 is not a valid Fruit """ self._d[key] = enum_class(enum_value) def _set_boolean(self, key: str, val: Any) -> None: """Set ``key`` to ``val`` if ``val`` is Boolean.""" if val in [True, False]: self._d[key] = val else: raise ValueError(f"{key} must be boolean") def _set_tuple(self, key: str, val: tuple[Any]) -> None: if isinstance(val, tuple): self._d[key] = val else: raise ValueError(f"{key} must be tuple") def _set_str(self, key: str, val: Any) -> None: """Set ``key`` to ``val`` if ``val`` is a string.""" if isinstance(val, str): self._d[key] = val elif not val: self._d[key] = "" else: raise ValueError(f"{key} must be str or falsy value") def _set_between(self, key: str, val: float, lo: float, hi: float) -> None: """Set ``key`` to ``val`` if lo <= val <= hi.""" if lo <= val <= hi: self._d[key] = val else: raise ValueError(f"{key} must be {lo} <= {key} <= {hi}") def _set_int_between(self, key: str, val: int, lo: int, hi: int) -> None: """Set ``key`` to ``val`` if lo <= val <= hi.""" if lo <= val <= hi: self._d[key] = val else: raise ValueError( f"{key} must be an integer such that {lo} <= {key} <= {hi}", ) def _set_pos_number(self, key: str, val: int, allow_inf: bool) -> None: """Set ``key`` to ``val`` if ``val`` is a positive integer.""" if isinstance(val, int) and val > -1: self._d[key] = val elif allow_inf and val in [-1, float("inf")]: self._d[key] = float("inf") else: raise ValueError( f"{key} must be a non-negative integer (use -1 for infinity)", ) def __repr__(self) -> str: rep = "" for k, v in sorted(self._d.items(), key=lambda x: x[0]): rep += f"{k}: {v}, " return rep # builders def digest_parser(self, parser: configparser.ConfigParser) -> Self: """Process the config options present in a :class:`ConfigParser` object. This method processes arbitrary parsers, not only those read from a single file, whereas :meth:`~ManimConfig.digest_file` can only process one file at a time. Parameters ---------- parser An object reflecting the contents of one or many ``.cfg`` files. In particular, it may reflect the contents of multiple files that have been parsed in a cascading fashion. Returns ------- self : :class:`ManimConfig` This object, after processing the contents of ``parser``. See Also -------- :func:`make_config_parser`, :meth:`~.ManimConfig.digest_file`, :meth:`~.ManimConfig.digest_args`, Notes ----- If there are multiple ``.cfg`` files to process, it is always more efficient to parse them into a single :class:`ConfigParser` object first, and then call this function once (instead of calling :meth:`~.ManimConfig.digest_file` multiple times). Examples -------- To digest the config options set in two files, first create a ConfigParser and parse both files and then digest the parser: .. code-block:: python parser = configparser.ConfigParser() parser.read([file1, file2]) config = ManimConfig().digest_parser(parser) In fact, the global ``config`` object is initialized like so: .. code-block:: python parser = make_config_parser() config = ManimConfig().digest_parser(parser) """ self._parser = parser # boolean keys for key in [ "notify_outdated_version", "write_to_movie", "save_last_frame", "write_all", "save_pngs", "save_as_gif", "save_sections", "preview", "show_in_file_browser", "log_to_file", "disable_caching", "disable_caching_warning", "flush_cache", "custom_folders", "enable_gui", "fullscreen", "use_projection_fill_shaders", "use_projection_stroke_shaders", "enable_wireframe", "force_window", "no_latex_cleanup", "dry_run", ]: setattr(self, key, parser["CLI"].getboolean(key, fallback=False)) # int keys for key in [ "from_animation_number", "upto_animation_number", "max_files_cached", # the next two must be set BEFORE digesting frame_width and frame_height "pixel_height", "pixel_width", "seed", "window_monitor", "zero_pad", ]: setattr(self, key, parser["CLI"].getint(key)) # str keys for key in [ "assets_dir", "verbosity", "media_dir", "log_dir", "video_dir", "sections_dir", "images_dir", "text_dir", "tex_dir", "partial_movie_dir", "input_file", "output_file", "movie_file_extension", "background_color", "renderer", "window_position", "preview_command", ]: setattr(self, key, parser["CLI"].get(key, fallback="", raw=True)) # float keys for key in [ "background_opacity", "frame_rate", # the next two are floats but have their own logic, applied later # "frame_width", # "frame_height", ]: setattr(self, key, parser["CLI"].getfloat(key)) # tuple keys gui_location = tuple( map(int, re.split(r"[;,\-]", parser["CLI"]["gui_location"])), ) self.gui_location = gui_location window_size = parser["CLI"][ "window_size" ] # if not "default", get a tuple of the position if window_size != "default": window_size_numbers = tuple(map(int, re.split(r"[;,\-]", window_size))) self.window_size = window_size_numbers else: self.window_size = window_size # plugins plugins = parser["CLI"].get("plugins", fallback="", raw=True) plugin_list = [] if plugins is None or plugins == "" else plugins.split(",") self.plugins = plugin_list # the next two must be set AFTER digesting pixel_width and pixel_height self["frame_height"] = parser["CLI"].getfloat("frame_height", 8.0) width = parser["CLI"].getfloat("frame_width", None) if width is None: self["frame_width"] = self["frame_height"] * self["aspect_ratio"] else: self["frame_width"] = width # other logic tex_template_file = parser["CLI"].get("tex_template_file") if tex_template_file: self.tex_template_file = Path(tex_template_file) progress_bar = parser["CLI"].get("progress_bar") if progress_bar: self.progress_bar = progress_bar ffmpeg_loglevel = parser["ffmpeg"].get("loglevel") if ffmpeg_loglevel: self.ffmpeg_loglevel = ffmpeg_loglevel try: media_embed = parser["jupyter"].getboolean("media_embed") except ValueError: media_embed = None self.media_embed = media_embed media_width = parser["jupyter"].get("media_width") if media_width: self.media_width = media_width quality = parser["CLI"].get("quality", fallback="", raw=True) if quality: self.quality = _determine_quality(quality) return self def digest_args(self, args: argparse.Namespace) -> Self: """Process the config options present in CLI arguments. Parameters ---------- args An object returned by :func:`.main_utils.parse_args()`. Returns ------- self : :class:`ManimConfig` This object, after processing the contents of ``parser``. See Also -------- :func:`.main_utils.parse_args()`, :meth:`~.ManimConfig.digest_parser`, :meth:`~.ManimConfig.digest_file` Notes ----- If ``args.config_file`` is a non-empty string, ``ManimConfig`` tries to digest the contents of said file with :meth:`~ManimConfig.digest_file` before digesting any other CLI arguments. """ # if the input file is a config file, parse it properly if args.file.suffix == ".cfg": args.config_file = args.file # if args.file is `-`, the animation code has to be taken from STDIN, so the # input file path shouldn't be absolute, since that file won't be read. if str(args.file) == "-": self.input_file = args.file # if a config file has been passed, digest it first so that other CLI # flags supersede it if args.config_file: self.digest_file(args.config_file) # read input_file from the args if it wasn't set by the config file if not self.input_file: self.input_file = Path(args.file).absolute() self.scene_names = args.scene_names if args.scene_names is not None else [] self.output_file = args.output_file for key in [ "notify_outdated_version", "preview", "show_in_file_browser", "write_to_movie", "save_last_frame", "save_pngs", "save_as_gif", "save_sections", "write_all", "disable_caching", "format", "flush_cache", "progress_bar", "transparent", "scene_names", "verbosity", "renderer", "background_color", "enable_gui", "fullscreen", "use_projection_fill_shaders", "use_projection_stroke_shaders", "zero_pad", "enable_wireframe", "force_window", "dry_run", "no_latex_cleanup", "preview_command", "seed", ]: if hasattr(args, key): attr = getattr(args, key) # if attr is None, then no argument was passed and we should # not change the current config if attr is not None: self[key] = attr for key in [ "media_dir", # always set this one first "log_dir", "log_to_file", # always set this one last ]: if hasattr(args, key): attr = getattr(args, key) # if attr is None, then no argument was passed and we should # not change the current config if attr is not None: self[key] = attr if self["save_last_frame"]: self["write_to_movie"] = False # Handle the -n flag. nflag = args.from_animation_number if nflag: self.from_animation_number = nflag[0] try: self.upto_animation_number = nflag[1] except Exception: logger.info( f"No end scene number specified in -n option. Rendering from {nflag[0]} onwards...", ) # Handle the quality flags self.quality = _determine_quality(getattr(args, "quality", None)) # Handle the -r flag. rflag = args.resolution if rflag: self.pixel_width = int(rflag[0]) self.pixel_height = int(rflag[1]) fps = args.frame_rate if fps: self.frame_rate = float(fps) # Handle --custom_folders if args.custom_folders: for opt in [ "media_dir", "video_dir", "sections_dir", "images_dir", "text_dir", "tex_dir", "log_dir", "partial_movie_dir", ]: self[opt] = self._parser["custom_folders"].get(opt, raw=True) # --media_dir overrides the default.cfg file if hasattr(args, "media_dir") and args.media_dir: self.media_dir = args.media_dir # Handle --tex_template if args.tex_template: self.tex_template = TexTemplate.from_file(args.tex_template) if self.renderer == RendererType.OPENGL and args.write_to_movie is None: # --write_to_movie was not passed on the command line, so don't generate video. self["write_to_movie"] = False # Handle --gui_location flag. if args.gui_location is not None: self.gui_location = args.gui_location return self def digest_file(self, filename: StrPath) -> Self: """Process the config options present in a ``.cfg`` file. This method processes a single ``.cfg`` file, whereas :meth:`~ManimConfig.digest_parser` can process arbitrary parsers, built perhaps from multiple ``.cfg`` files. Parameters ---------- filename Path to the ``.cfg`` file. Returns ------- self : :class:`ManimConfig` This object, after processing the contents of ``filename``. See Also -------- :meth:`~ManimConfig.digest_file`, :meth:`~ManimConfig.digest_args`, :func:`make_config_parser` Notes ----- If there are multiple ``.cfg`` files to process, it is always more efficient to parse them into a single :class:`ConfigParser` object first and digesting them with one call to :meth:`~ManimConfig.digest_parser`, instead of calling this method multiple times. """ if not Path(filename).is_file(): raise FileNotFoundError( errno.ENOENT, "Error: --config_file could not find a valid config file.", str(filename), ) return self.digest_parser(make_config_parser(filename)) # config options are properties @property def preview(self) -> bool: """Whether to play the rendered movie (-p).""" return self._d["preview"] or self._d["enable_gui"] @preview.setter def preview(self, value: bool) -> None: self._set_boolean("preview", value) @property def show_in_file_browser(self) -> bool: """Whether to show the output file in the file browser (-f).""" return self._d["show_in_file_browser"] @show_in_file_browser.setter def show_in_file_browser(self, value: bool) -> None: self._set_boolean("show_in_file_browser", value) @property def progress_bar(self) -> str: """Whether to show progress bars while rendering animations.""" return self._d["progress_bar"] @progress_bar.setter def progress_bar(self, value: str) -> None: self._set_from_list("progress_bar", value, ["none", "display", "leave"]) @property def log_to_file(self) -> bool: """Whether to save logs to a file.""" return self._d["log_to_file"] @log_to_file.setter def log_to_file(self, value: bool) -> None: self._set_boolean("log_to_file", value) @property def notify_outdated_version(self) -> bool: """Whether to notify if there is a version update available.""" return self._d["notify_outdated_version"] @notify_outdated_version.setter def notify_outdated_version(self, value: bool) -> None: self._set_boolean("notify_outdated_version", value) @property def write_to_movie(self) -> bool: """Whether to render the scene to a movie file (-w).""" return self._d["write_to_movie"] @write_to_movie.setter def write_to_movie(self, value: bool) -> None: self._set_boolean("write_to_movie", value) @property def save_last_frame(self) -> bool: """Whether to save the last frame of the scene as an image file (-s).""" return self._d["save_last_frame"] @save_last_frame.setter def save_last_frame(self, value: bool) -> None: self._set_boolean("save_last_frame", value) @property def write_all(self) -> bool: """Whether to render all scenes in the input file (-a).""" return self._d["write_all"] @write_all.setter def write_all(self, value: bool) -> None: self._set_boolean("write_all", value) @property def save_pngs(self) -> bool: """Whether to save all frames in the scene as images files (-g).""" return self._d["save_pngs"] @save_pngs.setter def save_pngs(self, value: bool) -> None: self._set_boolean("save_pngs", value) @property def save_as_gif(self) -> bool: """Whether to save the rendered scene in .gif format (-i).""" return self._d["save_as_gif"] @save_as_gif.setter def save_as_gif(self, value: bool) -> None: self._set_boolean("save_as_gif", value) @property def save_sections(self) -> bool: """Whether to save single videos for each section in addition to the movie file.""" return self._d["save_sections"] @save_sections.setter def save_sections(self, value: bool) -> None: self._set_boolean("save_sections", value) @property def enable_wireframe(self) -> bool: """Whether to enable wireframe debugging mode in opengl.""" return self._d["enable_wireframe"] @enable_wireframe.setter def enable_wireframe(self, value: bool) -> None: self._set_boolean("enable_wireframe", value) @property def force_window(self) -> bool: """Whether to force window when using the opengl renderer.""" return self._d["force_window"] @force_window.setter def force_window(self, value: bool) -> None: self._set_boolean("force_window", value) @property def no_latex_cleanup(self) -> bool: """Prevents deletion of .aux, .dvi, and .log files produced by Tex and MathTex.""" return self._d["no_latex_cleanup"] @no_latex_cleanup.setter def no_latex_cleanup(self, value: bool) -> None: self._set_boolean("no_latex_cleanup", value) @property def preview_command(self) -> str: return self._d["preview_command"] @preview_command.setter def preview_command(self, value: str) -> None: self._set_str("preview_command", value) @property def verbosity(self) -> str: """Logger verbosity; "DEBUG", "INFO", "WARNING", "ERROR", or "CRITICAL" (-v).""" return self._d["verbosity"] @verbosity.setter def verbosity(self, val: str) -> None: self._set_from_list( "verbosity", val, ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], ) logger.setLevel(val) @property def format(self) -> str | None: """File format; "png", "gif", "mp4", "webm" or "mov".""" return self._d["format"] @format.setter def format(self, val: str) -> None: self._set_from_list( "format", val, [None, "png", "gif", "mp4", "mov", "webm"], ) self.resolve_movie_file_extension(self.transparent) if self.format == "webm": logger.warning( "Output format set as webm, this can be slower than other formats", ) @property def ffmpeg_loglevel(self) -> str: """Verbosity level of ffmpeg (no flag).""" return self._d["ffmpeg_loglevel"] @ffmpeg_loglevel.setter def ffmpeg_loglevel(self, val: str) -> None: self._set_from_list( "ffmpeg_loglevel", val, ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], ) logging.getLogger("libav").setLevel(self.ffmpeg_loglevel) @property def media_embed(self) -> bool | None: """Whether to embed videos in Jupyter notebook.""" return self._d["media_embed"] @media_embed.setter def media_embed(self, value: bool) -> None: self._set_boolean("media_embed", value) @property def media_width(self) -> str: """Media width in Jupyter notebook.""" return self._d["media_width"] @media_width.setter def media_width(self, value: str) -> None: self._set_str("media_width", value) @property def pixel_width(self) -> int: """Frame width in pixels (--resolution, -r).""" return self._d["pixel_width"] @pixel_width.setter def pixel_width(self, value: int) -> None: self._set_pos_number("pixel_width", value, False) @property def pixel_height(self) -> int: """Frame height in pixels (--resolution, -r).""" return self._d["pixel_height"] @pixel_height.setter def pixel_height(self, value: int) -> None: self._set_pos_number("pixel_height", value, False) @property def aspect_ratio(self) -> float: """Aspect ratio (width / height) in pixels (--resolution, -r).""" assert isinstance(self._d["pixel_width"], int) assert isinstance(self._d["pixel_height"], int) return self._d["pixel_width"] / self._d["pixel_height"] @property def frame_height(self) -> float: """Frame height in logical units (no flag).""" return self._d["frame_height"] @frame_height.setter def frame_height(self, value: float) -> None: self._d.__setitem__("frame_height", value) @property def frame_width(self) -> float: """Frame width in logical units (no flag).""" return self._d["frame_width"] @frame_width.setter def frame_width(self, value: float) -> None: self._d.__setitem__("frame_width", value) @property def frame_y_radius(self) -> float: """Half the frame height (no flag).""" return self._d["frame_height"] / 2 # type: ignore[operator] @frame_y_radius.setter def frame_y_radius(self, value: float) -> None: self._d.__setitem__("frame_y_radius", value) or self._d.__setitem__( # type: ignore[func-returns-value] "frame_height", 2 * value ) @property def frame_x_radius(self) -> float: """Half the frame width (no flag).""" return self._d["frame_width"] / 2 # type: ignore[operator] @frame_x_radius.setter def frame_x_radius(self, value: float) -> None: self._d.__setitem__("frame_x_radius", value) or self._d.__setitem__( # type: ignore[func-returns-value] "frame_width", 2 * value ) @property def top(self) -> Vector3D: """Coordinate at the center top of the frame.""" return self.frame_y_radius * constants.UP @property def bottom(self) -> Vector3D: """Coordinate at the center bottom of the frame.""" return self.frame_y_radius * constants.DOWN @property def left_side(self) -> Vector3D: """Coordinate at the middle left of the frame.""" return self.frame_x_radius * constants.LEFT @property def right_side(self) -> Vector3D: """Coordinate at the middle right of the frame.""" return self.frame_x_radius * constants.RIGHT @property def frame_rate(self) -> float: """Frame rate in frames per second.""" return self._d["frame_rate"] @frame_rate.setter def frame_rate(self, value: float) -> None: self._d.__setitem__("frame_rate", value) # TODO: This was parsed before maybe add ManimColor(val), but results in circular import @property def background_color(self) -> ManimColor: """Background color of the scene (-c).""" return self._d["background_color"] @background_color.setter def background_color(self, value: Any) -> None: self._d.__setitem__("background_color", ManimColor(value)) @property def from_animation_number(self) -> int: """Start rendering animations at this number (-n).""" return self._d["from_animation_number"] @from_animation_number.setter def from_animation_number(self, value: int) -> None: self._d.__setitem__("from_animation_number", value) @property def upto_animation_number(self) -> int: """Stop rendering animations at this number. Use -1 to avoid skipping (-n).""" return self._d["upto_animation_number"] @upto_animation_number.setter def upto_animation_number(self, value: int) -> None: self._set_pos_number("upto_animation_number", value, True) @property def max_files_cached(self) -> int: """Maximum number of files cached. Use -1 for infinity (no flag).""" return self._d["max_files_cached"] @max_files_cached.setter def max_files_cached(self, value: int) -> None: self._set_pos_number("max_files_cached", value, True) @property def window_monitor(self) -> int: """The monitor on which the scene will be rendered.""" return self._d["window_monitor"] @window_monitor.setter def window_monitor(self, value: int) -> None: self._set_pos_number("window_monitor", value, True) @property def flush_cache(self) -> bool: """Whether to delete all the cached partial movie files.""" return self._d["flush_cache"] @flush_cache.setter def flush_cache(self, value: bool) -> None: self._set_boolean("flush_cache", value) @property def disable_caching(self) -> bool: """Whether to use scene caching.""" return self._d["disable_caching"] @disable_caching.setter def disable_caching(self, value: bool) -> None: self._set_boolean("disable_caching", value) @property def disable_caching_warning(self) -> bool: """Whether a warning is raised if there are too much submobjects to hash.""" return self._d["disable_caching_warning"] @disable_caching_warning.setter def disable_caching_warning(self, value: bool) -> None: self._set_boolean("disable_caching_warning", value) @property def movie_file_extension(self) -> str: """Either .mp4, .webm or .mov.""" return self._d["movie_file_extension"] @movie_file_extension.setter def movie_file_extension(self, value: str) -> None: self._set_from_list("movie_file_extension", value, [".mp4", ".mov", ".webm"]) @property def background_opacity(self) -> float: """A number between 0.0 (fully transparent) and 1.0 (fully opaque).""" return self._d["background_opacity"] @background_opacity.setter def background_opacity(self, value: float) -> None: self._set_between("background_opacity", value, 0, 1) if self.background_opacity < 1: self.resolve_movie_file_extension(is_transparent=True) @property def frame_size(self) -> tuple[int, int]: """Tuple with (pixel width, pixel height) (no flag).""" return (self._d["pixel_width"], self._d["pixel_height"]) @frame_size.setter def frame_size(self, value: tuple[int, int]) -> None: self._d.__setitem__("pixel_width", value[0]) or self._d.__setitem__( # type: ignore[func-returns-value] "pixel_height", value[1] ) @property def quality(self) -> str | None: """Video quality (-q).""" keys = ["pixel_width", "pixel_height", "frame_rate"] q = {k: self[k] for k in keys} for qual in constants.QUALITIES: if all(q[k] == constants.QUALITIES[qual][k] for k in keys): # type: ignore[literal-required] return qual return None @quality.setter def quality(self, value: str | None) -> None: if value is None: return if value not in constants.QUALITIES: raise KeyError(f"quality must be one of {list(constants.QUALITIES.keys())}") q = constants.QUALITIES[value] self.frame_size = q["pixel_width"], q["pixel_height"] self.frame_rate = q["frame_rate"] @property def transparent(self) -> bool: """Whether the background opacity is less than 1.0 (-t).""" assert isinstance(self._d["background_opacity"], float) return self._d["background_opacity"] < 1.0 @transparent.setter def transparent(self, value: bool) -> None: self._d["background_opacity"] = float(not value) self.resolve_movie_file_extension(value) @property def dry_run(self) -> bool: """Whether dry run is enabled.""" return self._d["dry_run"] @dry_run.setter def dry_run(self, val: bool) -> None: self._d["dry_run"] = val if val: self.write_to_movie = False self.write_all = False self.save_last_frame = False self.format = None @property def renderer(self) -> RendererType: """The currently active renderer. Populated with one of the available renderers in :class:`.RendererType`. Tests:: >>> test_config = ManimConfig() >>> test_config.renderer is None # a new ManimConfig is unpopulated True >>> test_config.renderer = 'opengl' >>> test_config.renderer >>> test_config.renderer = 42 Traceback (most recent call last): ... ValueError: 42 is not a valid RendererType Check that capitalization of renderer types is irrelevant:: >>> test_config.renderer = 'OpenGL' >>> test_config.renderer = 'cAirO' """ return self._d["renderer"] @renderer.setter def renderer(self, value: str | RendererType) -> None: """The setter of the renderer property. Takes care of switching inheritance bases using the :class:`.ConvertToOpenGL` metaclass. """ if isinstance(value, str): value = value.lower() renderer = RendererType(value) try: from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VMobject for cls in ConvertToOpenGL._converted_classes: if renderer == RendererType.OPENGL: conversion_dict = { Mobject: OpenGLMobject, VMobject: OpenGLVMobject, } else: conversion_dict = { OpenGLMobject: Mobject, OpenGLVMobject: VMobject, } cls.__bases__ = tuple( conversion_dict.get(base, base) for base in cls.__bases__ ) except ImportError: # The renderer is set during the initial import of the # library for the first time. The imports above cause an # ImportError due to circular imports. However, the # metaclass sets stuff up correctly in this case, so we # can just do nothing. pass self._set_from_enum("renderer", renderer, RendererType) @property def media_dir(self) -> str: """Main output directory. See :meth:`ManimConfig.get_dir`.""" return self._d["media_dir"] @media_dir.setter def media_dir(self, value: str | Path) -> None: self._set_dir("media_dir", value) @property def window_position(self) -> str: """Set the position of preview window. You can use directions, e.g. UL/DR/ORIGIN/LEFT...or the position(pixel) of the upper left corner of the window, e.g. '960,540'.""" return self._d["window_position"] @window_position.setter def window_position(self, value: str) -> None: self._d.__setitem__("window_position", value) @property def window_size(self) -> str | tuple[int, ...]: """The size of the opengl window. 'default' to automatically scale the window based on the display monitor.""" return self._d["window_size"] @window_size.setter def window_size(self, value: str | tuple[int, ...]) -> None: self._d.__setitem__("window_size", value) def resolve_movie_file_extension(self, is_transparent: bool) -> None: prev_file_extension = self.movie_file_extension if is_transparent: self.movie_file_extension = ".webm" if self.format == "webm" else ".mov" elif self.format == "webm": self.movie_file_extension = ".webm" elif self.format == "mov": self.movie_file_extension = ".mov" else: self.movie_file_extension = ".mp4" if self.movie_file_extension != prev_file_extension: logger.warning( f"Output format changed to '{self.movie_file_extension}' " "to support transparency", ) @property def enable_gui(self) -> bool: """Enable GUI interaction.""" return self._d["enable_gui"] @enable_gui.setter def enable_gui(self, value: bool) -> None: self._set_boolean("enable_gui", value) @property def gui_location(self) -> tuple[int, ...]: """Location parameters for the GUI window (e.g., screen coordinates or layout settings).""" return self._d["gui_location"] @gui_location.setter def gui_location(self, value: tuple[Any]) -> None: self._set_tuple("gui_location", value) @property def fullscreen(self) -> bool: """Expand the window to its maximum possible size.""" return self._d["fullscreen"] @fullscreen.setter def fullscreen(self, value: bool) -> None: self._set_boolean("fullscreen", value) @property def use_projection_fill_shaders(self) -> bool: """Use shaders for OpenGLVMobject fill which are compatible with transformation matrices.""" return self._d["use_projection_fill_shaders"] @use_projection_fill_shaders.setter def use_projection_fill_shaders(self, value: bool) -> None: self._set_boolean("use_projection_fill_shaders", value) @property def use_projection_stroke_shaders(self) -> bool: """Use shaders for OpenGLVMobject stroke which are compatible with transformation matrices.""" return self._d["use_projection_stroke_shaders"] @use_projection_stroke_shaders.setter def use_projection_stroke_shaders(self, value: bool) -> None: self._set_boolean("use_projection_stroke_shaders", value) @property def zero_pad(self) -> int: """PNG zero padding. A number between 0 (no zero padding) and 9 (9 columns minimum).""" return self._d["zero_pad"] @zero_pad.setter def zero_pad(self, value: int) -> None: self._set_int_between("zero_pad", value, 0, 9) def get_dir(self, key: str, **kwargs: Any) -> Path: """Resolve a config option that stores a directory. Config options that store directories may depend on one another. This method is used to provide the actual directory to the end user. Parameters ---------- key The config option to be resolved. Must be an option ending in ``'_dir'``, for example ``'media_dir'`` or ``'video_dir'``. kwargs Any strings to be used when resolving the directory. Returns ------- :class:`pathlib.Path` Path to the requested directory. If the path resolves to the empty string, return ``None`` instead. Raises ------ :class:`KeyError` When ``key`` is not a config option that stores a directory and thus :meth:`~ManimConfig.get_dir` is not appropriate; or when ``key`` is appropriate but there is not enough information to resolve the directory. Notes ----- Standard :meth:`str.format` syntax is used to resolve the paths so the paths may contain arbitrary placeholders using f-string notation. However, these will require ``kwargs`` to contain the required values. Examples -------- The value of ``config.tex_dir`` is ``'{media_dir}/Tex'`` by default, i.e. it is a subfolder of wherever ``config.media_dir`` is located. In order to get the *actual* directory, use :meth:`~ManimConfig.get_dir`. .. code-block:: pycon >>> from manim import config as globalconfig >>> config = globalconfig.copy() >>> config.tex_dir '{media_dir}/Tex' >>> config.media_dir './media' >>> config.get_dir("tex_dir").as_posix() 'media/Tex' Resolving directories is done in a lazy way, at the last possible moment, to reflect any changes in other config options: .. code-block:: pycon >>> config.media_dir = "my_media_dir" >>> config.get_dir("tex_dir").as_posix() 'my_media_dir/Tex' Some directories depend on information that is not available to :class:`ManimConfig`. For example, the default value of `video_dir` includes the name of the input file and the video quality (e.g. 480p15). This informamtion has to be supplied via ``kwargs``: .. code-block:: pycon >>> config.video_dir '{media_dir}/videos/{module_name}/{quality}' >>> config.get_dir("video_dir") Traceback (most recent call last): KeyError: 'video_dir {media_dir}/videos/{module_name}/{quality} requires the following keyword arguments: module_name' >>> config.get_dir("video_dir", module_name="myfile").as_posix() 'my_media_dir/videos/myfile/1080p60' Note the quality does not need to be passed as keyword argument since :class:`ManimConfig` does store information about quality. Directories may be recursively defined. For example, the config option ``partial_movie_dir`` depends on ``video_dir``, which in turn depends on ``media_dir``: .. code-block:: pycon >>> config.partial_movie_dir '{video_dir}/partial_movie_files/{scene_name}' >>> config.get_dir("partial_movie_dir") Traceback (most recent call last): KeyError: 'partial_movie_dir {video_dir}/partial_movie_files/{scene_name} requires the following keyword arguments: scene_name' >>> config.get_dir( ... "partial_movie_dir", module_name="myfile", scene_name="myscene" ... ).as_posix() 'my_media_dir/videos/myfile/1080p60/partial_movie_files/myscene' Standard f-string syntax is used. Arbitrary names can be used when defining directories, as long as the corresponding values are passed to :meth:`ManimConfig.get_dir` via ``kwargs``. .. code-block:: pycon >>> config.media_dir = "{dir1}/{dir2}" >>> config.get_dir("media_dir") Traceback (most recent call last): KeyError: 'media_dir {dir1}/{dir2} requires the following keyword arguments: dir1' >>> config.get_dir("media_dir", dir1="foo", dir2="bar").as_posix() 'foo/bar' >>> config.media_dir = "./media" >>> config.get_dir("media_dir").as_posix() 'media' """ dirs = [ "assets_dir", "media_dir", "video_dir", "sections_dir", "images_dir", "text_dir", "tex_dir", "log_dir", "input_file", "output_file", "partial_movie_dir", ] if key not in dirs: raise KeyError( "must pass one of " "{media,video,images,text,tex,log}_dir " "or {input,output}_file", ) dirs.remove(key) # a path cannot contain itself all_args = {k: self._d[k] for k in dirs} all_args.update(kwargs) all_args["quality"] = f"{self.pixel_height}p{self.frame_rate:g}" path = self._d[key] assert isinstance(path, str) while "{" in path: try: path = path.format(**all_args) except KeyError as exc: raise KeyError( f"{key} {self._d[key]} requires the following " + "keyword arguments: " + " ".join(exc.args), ) from exc return Path(path) if path else None def _set_dir(self, key: str, val: str | Path) -> None: if isinstance(val, Path): self._d.__setitem__(key, str(val)) else: self._d.__setitem__(key, val) @property def assets_dir(self) -> str: """Directory to locate video assets (no flag).""" return self._d["assets_dir"] @assets_dir.setter def assets_dir(self, value: str | Path) -> None: self._set_dir("assets_dir", value) @property def log_dir(self) -> str: """Directory to place logs. See :meth:`ManimConfig.get_dir`.""" return self._d["log_dir"] @log_dir.setter def log_dir(self, value: str | Path) -> None: self._set_dir("log_dir", value) @property def video_dir(self) -> str: """Directory to place videos (no flag). See :meth:`ManimConfig.get_dir`.""" return self._d["video_dir"] @video_dir.setter def video_dir(self, value: str | Path) -> None: self._set_dir("video_dir", value) @property def sections_dir(self) -> str: """Directory to place section videos (no flag). See :meth:`ManimConfig.get_dir`.""" return self._d["sections_dir"] @sections_dir.setter def sections_dir(self, value: str | Path) -> None: self._set_dir("sections_dir", value) @property def images_dir(self) -> str: """Directory to place images (no flag). See :meth:`ManimConfig.get_dir`.""" return self._d["images_dir"] @images_dir.setter def images_dir(self, value: str | Path) -> None: self._set_dir("images_dir", value) @property def text_dir(self) -> str: """Directory to place text (no flag). See :meth:`ManimConfig.get_dir`.""" return self._d["text_dir"] @text_dir.setter def text_dir(self, value: str | Path) -> None: self._set_dir("text_dir", value) @property def tex_dir(self) -> str: """Directory to place tex (no flag). See :meth:`ManimConfig.get_dir`.""" return self._d["tex_dir"] @tex_dir.setter def tex_dir(self, value: str | Path) -> None: self._set_dir("tex_dir", value) @property def partial_movie_dir(self) -> str: """Directory to place partial movie files (no flag). See :meth:`ManimConfig.get_dir`.""" return self._d["partial_movie_dir"] @partial_movie_dir.setter def partial_movie_dir(self, value: str | Path) -> None: self._set_dir("partial_movie_dir", value) @property def custom_folders(self) -> str: """Whether to use custom folder output.""" return self._d["custom_folders"] @custom_folders.setter def custom_folders(self, value: str | Path) -> None: self._set_dir("custom_folders", value) @property def input_file(self) -> str | Path: """Input file name.""" return self._d["input_file"] @input_file.setter def input_file(self, value: str | Path) -> None: self._set_dir("input_file", value) @property def output_file(self) -> str: """Output file name (-o).""" return self._d["output_file"] @output_file.setter def output_file(self, value: str | Path) -> None: self._set_dir("output_file", value) @property def scene_names(self) -> list[str]: """Scenes to play from file.""" return self._d["scene_names"] @scene_names.setter def scene_names(self, value: list[str]) -> None: self._d.__setitem__("scene_names", value) @property def tex_template(self) -> TexTemplate: """Template used when rendering Tex. See :class:`.TexTemplate`.""" if not hasattr(self, "_tex_template") or not self._tex_template: # type: ignore[has-type] fn = self._d["tex_template_file"] if fn: self._tex_template = TexTemplate.from_file(fn) else: self._tex_template = TexTemplate() return self._tex_template @tex_template.setter def tex_template(self, val: TexTemplate) -> None: if isinstance(val, TexTemplate): self._tex_template = val @property def tex_template_file(self) -> Path: """File to read Tex template from (no flag). See :class:`.TexTemplate`.""" return self._d["tex_template_file"] @tex_template_file.setter def tex_template_file(self, val: str) -> None: if val: if not os.access(val, os.R_OK): logger.warning( f"Custom TeX template {val} not found or not readable.", ) else: self._d["tex_template_file"] = Path(val) else: self._d["tex_template_file"] = val # actually set the falsy value @property def plugins(self) -> list[str]: """List of plugins to enable.""" return self._d["plugins"] @plugins.setter def plugins(self, value: list[str]) -> None: self._d["plugins"] = value @property def seed(self) -> int | None: """Random seed for reproducibility. None means no seed is set.""" return self._d["seed"] @seed.setter def seed(self, value: int | None) -> None: if value is None: return self._set_pos_number("seed", value, False) # TODO: to be used in the future - see PR #620 # https://github.com/ManimCommunity/manim/pull/620 class ManimFrame(Mapping): _OPTS: ClassVar[set[str]] = { "pixel_width", "pixel_height", "aspect_ratio", "frame_height", "frame_width", "frame_y_radius", "frame_x_radius", "top", "bottom", "left_side", "right_side", } _CONSTANTS: ClassVar[dict[str, Vector3D]] = { "UP": np.array((0.0, 1.0, 0.0)), "DOWN": np.array((0.0, -1.0, 0.0)), "RIGHT": np.array((1.0, 0.0, 0.0)), "LEFT": np.array((-1.0, 0.0, 0.0)), "IN": np.array((0.0, 0.0, -1.0)), "OUT": np.array((0.0, 0.0, 1.0)), "ORIGIN": np.array((0.0, 0.0, 0.0)), "X_AXIS": np.array((1.0, 0.0, 0.0)), "Y_AXIS": np.array((0.0, 1.0, 0.0)), "Z_AXIS": np.array((0.0, 0.0, 1.0)), "UL": np.array((-1.0, 1.0, 0.0)), "UR": np.array((1.0, 1.0, 0.0)), "DL": np.array((-1.0, -1.0, 0.0)), "DR": np.array((1.0, -1.0, 0.0)), } _c: ManimConfig def __init__(self, c: ManimConfig) -> None: if not isinstance(c, ManimConfig): raise TypeError("argument must be instance of 'ManimConfig'") # need to use __dict__ directly because setting attributes is not # allowed (see __setattr__) self.__dict__["_c"] = c # there are required by parent class Mapping to behave like a dict def __getitem__(self, key: str) -> Any: if key in self._OPTS: return self._c[key] elif key in self._CONSTANTS: return self._CONSTANTS[key] else: raise KeyError(key) def __iter__(self) -> Iterator[Any]: return iter(list(self._OPTS) + list(self._CONSTANTS)) def __len__(self) -> int: return len(self._OPTS) # make this truly immutable def __setattr__(self, attr: Any, val: Any) -> NoReturn: raise TypeError("'ManimFrame' object does not support item assignment") def __setitem__(self, key: Any, val: Any) -> NoReturn: raise TypeError("'ManimFrame' object does not support item assignment") def __delitem__(self, key: Any) -> NoReturn: raise TypeError("'ManimFrame' object does not support item deletion") for opt in list(ManimFrame._OPTS) + list(ManimFrame._CONSTANTS): setattr(ManimFrame, opt, property(lambda self, o=opt: self[o])) # type: ignore[misc] ManimCommunity-manim-1157b74/manim/animation/000077500000000000000000000000001515024150700211135ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/animation/__init__.py000066400000000000000000000000001515024150700232120ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/animation/animation.py000066400000000000000000000605061515024150700234530ustar00rootroot00000000000000"""Animate mobjects.""" from __future__ import annotations from manim.mobject.opengl.opengl_mobject import OpenGLMobject from .. import config, logger from ..constants import RendererType from ..mobject import mobject from ..mobject.mobject import Group, Mobject from ..mobject.opengl import opengl_mobject from ..utils.rate_functions import linear, smooth __all__ = ["Animation", "Wait", "Add", "override_animation"] from collections.abc import Callable, Iterable, Sequence from copy import deepcopy from functools import partialmethod from typing import TYPE_CHECKING, Any, Self if TYPE_CHECKING: from manim.scene.scene import Scene DEFAULT_ANIMATION_RUN_TIME: float = 1.0 DEFAULT_ANIMATION_LAG_RATIO: float = 0.0 class Animation: """An animation. Animations have a fixed time span. Parameters ---------- mobject The mobject to be animated. This is not required for all types of animations. lag_ratio Defines the delay after which the animation is applied to submobjects. This lag is relative to the duration of the animation. This does not influence the total runtime of the animation. Instead the runtime of individual animations is adjusted so that the complete animation has the defined run time. run_time The duration of the animation in seconds. rate_func The function defining the animation progress based on the relative runtime (see :mod:`~.rate_functions`) . For example ``rate_func(0.5)`` is the proportion of the animation that is done after half of the animations run time. reverse_rate_function Reverses the rate function of the animation. Setting ``reverse_rate_function`` does not have any effect on ``remover`` or ``introducer``. These need to be set explicitly if an introducer-animation should be turned into a remover one and vice versa. name The name of the animation. This gets displayed while rendering the animation. Defaults to (). remover Whether the given mobject should be removed from the scene after this animation. suspend_mobject_updating Whether updaters of the mobject should be suspended during the animation. .. NOTE:: In the current implementation of this class, the specified rate function is applied within :meth:`.Animation.interpolate_mobject` call as part of the call to :meth:`.Animation.interpolate_submobject`. For subclasses of :class:`.Animation` that are implemented by overriding :meth:`interpolate_mobject`, the rate function has to be applied manually (e.g., by passing ``self.rate_func(alpha)`` instead of just ``alpha``). Examples -------- .. manim:: LagRatios class LagRatios(Scene): def construct(self): ratios = [0, 0.1, 0.5, 1, 2] # demonstrated lag_ratios # Create dot groups group = VGroup(*[Dot() for _ in range(4)]).arrange_submobjects() groups = VGroup(*[group.copy() for _ in ratios]).arrange_submobjects(buff=1) self.add(groups) # Label groups self.add(Text("lag_ratio = ", font_size=36).next_to(groups, UP, buff=1.5)) for group, ratio in zip(groups, ratios): self.add(Text(str(ratio), font_size=36).next_to(group, UP)) #Animate groups with different lag_ratios self.play(AnimationGroup(*[ group.animate(lag_ratio=ratio, run_time=1.5).shift(DOWN * 2) for group, ratio in zip(groups, ratios) ])) # lag_ratio also works recursively on nested submobjects: self.play(groups.animate(run_time=1, lag_ratio=0.1).shift(UP * 2)) """ def __new__( cls, mobject=None, *args, use_override=True, **kwargs, ) -> Self: if isinstance(mobject, Mobject) and use_override: func = mobject.animation_override_for(cls) if func is not None: anim = func(mobject, *args, **kwargs) logger.debug( f"The {cls.__name__} animation has been overridden for " f"{type(mobject).__name__} mobjects. use_override = False can " f" be used as keyword argument to prevent animation overriding.", ) return anim return super().__new__(cls) def __init__( self, mobject: Mobject | OpenGLMobject | None, lag_ratio: float = DEFAULT_ANIMATION_LAG_RATIO, run_time: float = DEFAULT_ANIMATION_RUN_TIME, rate_func: Callable[[float], float] = smooth, reverse_rate_function: bool = False, name: str = None, remover: bool = False, # remove a mobject from the screen? suspend_mobject_updating: bool = True, introducer: bool = False, *, _on_finish: Callable[[], None] = lambda _: None, use_override: bool = True, # included here to avoid TypeError if passed from a subclass' constructor ) -> None: self._typecheck_input(mobject) self.run_time: float = run_time self.rate_func: Callable[[float], float] = rate_func self.reverse_rate_function: bool = reverse_rate_function self.name: str | None = name self.remover: bool = remover self.introducer: bool = introducer self.suspend_mobject_updating: bool = suspend_mobject_updating self.lag_ratio: float = lag_ratio self._on_finish: Callable[[Scene], None] = _on_finish if config["renderer"] == RendererType.OPENGL: self.starting_mobject: OpenGLMobject = OpenGLMobject() self.mobject: OpenGLMobject = ( mobject if mobject is not None else OpenGLMobject() ) else: self.starting_mobject: Mobject = Mobject() self.mobject: Mobject = mobject if mobject is not None else Mobject() if hasattr(self, "CONFIG"): logger.error( ( "CONFIG has been removed from ManimCommunity.", "Please use keyword arguments instead.", ), ) @property def run_time(self) -> float: return self._run_time @run_time.setter def run_time(self, value: float) -> None: if value < 0: raise ValueError( f"The run_time of {self.__class__.__name__} cannot be " f"negative. The given value was {value}." ) self._run_time = value def _typecheck_input(self, mobject: Mobject | None) -> None: if mobject is None: logger.debug("Animation with empty mobject") elif not isinstance(mobject, (Mobject, OpenGLMobject)): raise TypeError("Animation only works on Mobjects") def __str__(self) -> str: if self.name: return self.name return f"{self.__class__.__name__}({str(self.mobject)})" def __repr__(self) -> str: return str(self) def begin(self) -> None: """Begin the animation. This method is called right as an animation is being played. As much initialization as possible, especially any mobject copying, should live in this method. """ self.starting_mobject = self.create_starting_mobject() if self.suspend_mobject_updating: # All calls to self.mobject's internal updaters # during the animation, either from this Animation # or from the surrounding scene, should do nothing. # It is, however, okay and desirable to call # the internal updaters of self.starting_mobject, # or any others among self.get_all_mobjects() self.mobject.suspend_updating() self.interpolate(0) def finish(self) -> None: # TODO: begin and finish should require a scene as parameter. # That way Animation.clean_up_from_screen and Scene.add_mobjects_from_animations # could be removed as they fulfill basically the same purpose. """Finish the animation. This method gets called when the animation is over. """ self.interpolate(1) if self.suspend_mobject_updating and self.mobject is not None: self.mobject.resume_updating() def clean_up_from_scene(self, scene: Scene) -> None: """Clean up the :class:`~.Scene` after finishing the animation. This includes to :meth:`~.Scene.remove` the Animation's :class:`~.Mobject` if the animation is a remover. Parameters ---------- scene The scene the animation should be cleaned up from. """ self._on_finish(scene) if self.is_remover(): scene.remove(self.mobject) def _setup_scene(self, scene: Scene) -> None: """Setup up the :class:`~.Scene` before starting the animation. This includes to :meth:`~.Scene.add` the Animation's :class:`~.Mobject` if the animation is an introducer. Parameters ---------- scene The scene the animation should be cleaned up from. """ if scene is None: return if ( self.is_introducer() and self.mobject not in scene.get_mobject_family_members() ): scene.add(self.mobject) def create_starting_mobject(self) -> Mobject | OpenGLMobject: # Keep track of where the mobject starts return self.mobject.copy() def get_all_mobjects(self) -> Sequence[Mobject | OpenGLMobject]: """Get all mobjects involved in the animation. Ordering must match the ordering of arguments to interpolate_submobject Returns ------- Sequence[Mobject] The sequence of mobjects. """ return self.mobject, self.starting_mobject def get_all_families_zipped(self) -> Iterable[tuple]: if config["renderer"] == RendererType.OPENGL: return zip( *(mob.get_family() for mob in self.get_all_mobjects()), strict=False ) return zip( *(mob.family_members_with_points() for mob in self.get_all_mobjects()), strict=False, ) def update_mobjects(self, dt: float) -> None: """ Updates things like starting_mobject, and (for Transforms) target_mobject. Note, since typically (always?) self.mobject will have its updating suspended during the animation, this will do nothing to self.mobject. """ for mob in self.get_all_mobjects_to_update(): mob.update(dt) def get_all_mobjects_to_update(self) -> list[Mobject]: """Get all mobjects to be updated during the animation. Returns ------- List[Mobject] The list of mobjects to be updated during the animation. """ # The surrounding scene typically handles # updating of self.mobject. Besides, in # most cases its updating is suspended anyway return list(filter(lambda m: m is not self.mobject, self.get_all_mobjects())) def copy(self) -> Animation: """Create a copy of the animation. Returns ------- Animation A copy of ``self`` """ return deepcopy(self) # Methods for interpolation, the mean of an Animation # TODO: stop using alpha as parameter name in different meanings. def interpolate(self, alpha: float) -> None: """Set the animation progress. This method gets called for every frame during an animation. Parameters ---------- alpha The relative time to set the animation to, 0 meaning the start, 1 meaning the end. """ self.interpolate_mobject(alpha) def interpolate_mobject(self, alpha: float) -> None: """Interpolates the mobject of the :class:`Animation` based on alpha value. Parameters ---------- alpha A float between 0 and 1 expressing the ratio to which the animation is completed. For example, alpha-values of 0, 0.5, and 1 correspond to the animation being completed 0%, 50%, and 100%, respectively. """ families = list(self.get_all_families_zipped()) for i, mobs in enumerate(families): sub_alpha = self.get_sub_alpha(alpha, i, len(families)) self.interpolate_submobject(*mobs, sub_alpha) def interpolate_submobject( self, submobject: Mobject, starting_submobject: Mobject, # target_copy: Mobject, #Todo: fix - signature of interpolate_submobject differs in Transform(). alpha: float, ) -> Animation: # Typically implemented by subclass pass def get_sub_alpha(self, alpha: float, index: int, num_submobjects: int) -> float: """Get the animation progress of any submobjects subanimation. Parameters ---------- alpha The overall animation progress index The index of the subanimation. num_submobjects The total count of subanimations. Returns ------- float The progress of the subanimation. """ # TODO, make this more understandable, and/or combine # its functionality with AnimationGroup's method # build_animations_with_timings lag_ratio = self.lag_ratio full_length = (num_submobjects - 1) * lag_ratio + 1 value = alpha * full_length lower = index * lag_ratio if self.reverse_rate_function: return self.rate_func(1 - (value - lower)) else: return self.rate_func(value - lower) # Getters and setters def set_run_time(self, run_time: float) -> Animation: """Set the run time of the animation. Parameters ---------- run_time The new time the animation should take in seconds. .. note:: The run_time of an animation should not be changed while it is already running. Returns ------- Animation ``self`` """ self.run_time = run_time return self # TODO: is this getter even necessary? def get_run_time(self) -> float: """Get the run time of the animation. Returns ------- float The time the animation takes in seconds. """ return self.run_time def set_rate_func( self, rate_func: Callable[[float], float], ) -> Animation: """Set the rate function of the animation. Parameters ---------- rate_func The new function defining the animation progress based on the relative runtime (see :mod:`~.rate_functions`). Returns ------- Animation ``self`` """ self.rate_func = rate_func return self def get_rate_func( self, ) -> Callable[[float], float]: """Get the rate function of the animation. Returns ------- Callable[[float], float] The rate function of the animation. """ return self.rate_func def set_name(self, name: str) -> Animation: """Set the name of the animation. Parameters ---------- name The new name of the animation. Returns ------- Animation ``self`` """ self.name = name return self def is_remover(self) -> bool: """Test if the animation is a remover. Returns ------- bool ``True`` if the animation is a remover, ``False`` otherwise. """ return self.remover def is_introducer(self) -> bool: """Test if the animation is an introducer. Returns ------- bool ``True`` if the animation is an introducer, ``False`` otherwise. """ return self.introducer @classmethod def __init_subclass__(cls, **kwargs) -> None: super().__init_subclass__(**kwargs) cls._original__init__ = cls.__init__ _original__init__ = __init__ # needed if set_default() is called with no kwargs directly from Animation @classmethod def set_default(cls, **kwargs) -> None: """Sets the default values of keyword arguments. If this method is called without any additional keyword arguments, the original default values of the initialization method of this class are restored. Parameters ---------- kwargs Passing any keyword argument will update the default values of the keyword arguments of the initialization function of this class. Examples -------- .. manim:: ChangeDefaultAnimation class ChangeDefaultAnimation(Scene): def construct(self): Rotate.set_default(run_time=2, rate_func=rate_functions.linear) Indicate.set_default(color=None) S = Square(color=BLUE, fill_color=BLUE, fill_opacity=0.25) self.add(S) self.play(Rotate(S, PI)) self.play(Indicate(S)) Rotate.set_default() Indicate.set_default() """ if kwargs: cls.__init__ = partialmethod(cls.__init__, **kwargs) else: cls.__init__ = cls._original__init__ def prepare_animation( anim: Animation | mobject._AnimationBuilder | opengl_mobject._AnimationBuilder, ) -> Animation: r"""Returns either an unchanged animation, or the animation built from a passed animation factory. Examples -------- :: >>> from manim import Square, FadeIn >>> s = Square() >>> prepare_animation(FadeIn(s)) FadeIn(Square) :: >>> prepare_animation(s.animate.scale(2).rotate(42)) _MethodAnimation(Square) :: >>> prepare_animation(42) Traceback (most recent call last): ... TypeError: Object 42 cannot be converted to an animation """ if isinstance(anim, mobject._AnimationBuilder): return anim.build() if isinstance(anim, opengl_mobject._AnimationBuilder): return anim.build() if isinstance(anim, Animation): return anim raise TypeError(f"Object {anim} cannot be converted to an animation") class Wait(Animation): """A "no operation" animation. Parameters ---------- run_time The amount of time that should pass. stop_condition A function without positional arguments that evaluates to a boolean. The function is evaluated after every new frame has been rendered. Playing the animation stops after the return value is truthy, or after the specified ``run_time`` has passed. frozen_frame Controls whether or not the wait animation is static, i.e., corresponds to a frozen frame. If ``False`` is passed, the render loop still progresses through the animation as usual and (among other things) continues to call updater functions. If ``None`` (the default value), the :meth:`.Scene.play` call tries to determine whether the Wait call can be static or not itself via :meth:`.Scene.should_mobjects_update`. kwargs Keyword arguments to be passed to the parent class, :class:`.Animation`. """ def __init__( self, run_time: float = 1, stop_condition: Callable[[], bool] | None = None, frozen_frame: bool | None = None, rate_func: Callable[[float], float] = linear, **kwargs, ): if stop_condition and frozen_frame: raise ValueError("A static Wait animation cannot have a stop condition.") self.duration: float = run_time self.stop_condition = stop_condition self.is_static_wait: bool = frozen_frame super().__init__(None, run_time=run_time, rate_func=rate_func, **kwargs) # quick fix to work in opengl setting: self.mobject.shader_wrapper_list = [] def begin(self) -> None: pass def finish(self) -> None: pass def clean_up_from_scene(self, scene: Scene) -> None: pass def update_mobjects(self, dt: float) -> None: pass def interpolate(self, alpha: float) -> None: pass class Add(Animation): """Add Mobjects to a scene, without animating them in any other way. This is similar to the :meth:`.Scene.add` method, but :class:`Add` is an animation which can be grouped into other animations. Parameters ---------- mobjects One :class:`~.Mobject` or more to add to a scene. run_time The duration of the animation after adding the ``mobjects``. Defaults to 0, which means this is an instant animation without extra wait time after adding them. **kwargs Additional arguments to pass to the parent :class:`Animation` class. Examples -------- .. manim:: DefaultAddScene class DefaultAddScene(Scene): def construct(self): text_1 = Text("I was added with Add!") text_2 = Text("Me too!") text_3 = Text("And me!") texts = VGroup(text_1, text_2, text_3).arrange(DOWN) rect = SurroundingRectangle(texts, buff=0.5) self.play( Create(rect, run_time=3.0), Succession( Wait(1.0), # You can Add a Mobject in the middle of an animation... Add(text_1), Wait(1.0), # ...or multiple Mobjects at once! Add(text_2, text_3), ), ) self.wait() .. manim:: AddWithRunTimeScene class AddWithRunTimeScene(Scene): def construct(self): # A 5x5 grid of circles circles = VGroup( *[Circle(radius=0.5) for _ in range(25)] ).arrange_in_grid(5, 5) self.play( Succession( # Add a run_time of 0.2 to wait for 0.2 seconds after # adding the circle, instead of using Wait(0.2) after Add! *[Add(circle, run_time=0.2) for circle in circles], rate_func=smooth, ) ) self.wait() """ def __init__( self, *mobjects: Mobject, run_time: float = 0.0, **kwargs: Any ) -> None: mobject = mobjects[0] if len(mobjects) == 1 else Group(*mobjects) super().__init__(mobject, run_time=run_time, introducer=True, **kwargs) def begin(self) -> None: pass def finish(self) -> None: pass def clean_up_from_scene(self, scene: Scene) -> None: pass def update_mobjects(self, dt: float) -> None: pass def interpolate(self, alpha: float) -> None: pass def override_animation( animation_class: type[Animation], ) -> Callable[[Callable], Callable]: """Decorator used to mark methods as overrides for specific :class:`~.Animation` types. Should only be used to decorate methods of classes derived from :class:`~.Mobject`. ``Animation`` overrides get inherited to subclasses of the ``Mobject`` who defined them. They don't override subclasses of the ``Animation`` they override. See Also -------- :meth:`~.Mobject.add_animation_override` Parameters ---------- animation_class The animation to be overridden. Returns ------- Callable[[Callable], Callable] The actual decorator. This marks the method as overriding an animation. Examples -------- .. manim:: OverrideAnimationExample class MySquare(Square): @override_animation(FadeIn) def _fade_in_override(self, **kwargs): return Create(self, **kwargs) class OverrideAnimationExample(Scene): def construct(self): self.play(FadeIn(MySquare())) """ def decorator(func): func._override_animation = animation_class return func return decorator ManimCommunity-manim-1157b74/manim/animation/changing.py000066400000000000000000000134211515024150700232440ustar00rootroot00000000000000"""Animation of a mobject boundary and tracing of points.""" from __future__ import annotations __all__ = ["AnimatedBoundary", "TracedPath"] from collections.abc import Callable, Sequence from typing import Any, Self from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.utils.color import ( BLUE_B, BLUE_D, BLUE_E, GREY_BROWN, WHITE, ParsableManimColor, ) from manim.utils.rate_functions import RateFunction, smooth class AnimatedBoundary(VGroup): """Boundary of a :class:`.VMobject` with animated color change. Examples -------- .. manim:: AnimatedBoundaryExample class AnimatedBoundaryExample(Scene): def construct(self): text = Text("So shiny!") boundary = AnimatedBoundary(text, colors=[RED, GREEN, BLUE], cycle_rate=3) self.add(text, boundary) self.wait(2) """ def __init__( self, vmobject: VMobject, colors: Sequence[ParsableManimColor] = [BLUE_D, BLUE_B, BLUE_E, GREY_BROWN], max_stroke_width: float = 3, cycle_rate: float = 0.5, back_and_forth: bool = True, draw_rate_func: RateFunction = smooth, fade_rate_func: RateFunction = smooth, **kwargs: Any, ): super().__init__(**kwargs) self.colors = colors self.max_stroke_width = max_stroke_width self.cycle_rate = cycle_rate self.back_and_forth = back_and_forth self.draw_rate_func = draw_rate_func self.fade_rate_func = fade_rate_func self.vmobject = vmobject self.boundary_copies = [ vmobject.copy().set_style(stroke_width=0, fill_opacity=0) for x in range(2) ] self.add(*self.boundary_copies) self.total_time = 0.0 self.add_updater(lambda m, dt: self.update_boundary_copies(dt)) def update_boundary_copies(self, dt: float) -> None: # Not actual time, but something which passes at # an altered rate to make the implementation below # cleaner time = self.total_time * self.cycle_rate growing, fading = self.boundary_copies colors = self.colors msw = self.max_stroke_width vmobject = self.vmobject index = int(time % len(colors)) alpha = time % 1 draw_alpha = self.draw_rate_func(alpha) fade_alpha = self.fade_rate_func(alpha) if self.back_and_forth and int(time) % 2 == 1: bounds = (1.0 - draw_alpha, 1.0) else: bounds = (0.0, draw_alpha) self.full_family_become_partial(growing, vmobject, *bounds) growing.set_stroke(colors[index], width=msw) if time >= 1: self.full_family_become_partial(fading, vmobject, 0, 1) fading.set_stroke(color=colors[index - 1], width=(1 - fade_alpha) * msw) self.total_time += dt def full_family_become_partial( self, mob1: VMobject, mob2: VMobject, a: float, b: float ) -> Self: family1 = mob1.family_members_with_points() family2 = mob2.family_members_with_points() for sm1, sm2 in zip(family1, family2, strict=False): sm1.pointwise_become_partial(sm2, a, b) return self class TracedPath(VMobject, metaclass=ConvertToOpenGL): """Traces the path of a point returned by a function call. Parameters ---------- traced_point_func The function to be traced. stroke_width The width of the trace. stroke_color The color of the trace. dissipating_time The time taken for the path to dissipate. Default set to ``None`` which disables dissipation. Examples -------- .. manim:: TracedPathExample class TracedPathExample(Scene): def construct(self): circ = Circle(color=RED).shift(4*LEFT) dot = Dot(color=RED).move_to(circ.get_start()) rolling_circle = VGroup(circ, dot) trace = TracedPath(circ.get_start) rolling_circle.add_updater(lambda m: m.rotate(-0.3)) self.add(trace, rolling_circle) self.play(rolling_circle.animate.shift(8*RIGHT), run_time=4, rate_func=linear) .. manim:: DissipatingPathExample class DissipatingPathExample(Scene): def construct(self): a = Dot(RIGHT * 2) b = TracedPath(a.get_center, dissipating_time=0.5, stroke_opacity=[0, 1]) self.add(a, b) self.play(a.animate(path_arc=PI / 4).shift(LEFT * 2)) self.play(a.animate(path_arc=-PI / 4).shift(LEFT * 2)) self.wait() """ def __init__( self, traced_point_func: Callable, stroke_width: float = 2, stroke_color: ParsableManimColor | None = WHITE, dissipating_time: float | None = None, **kwargs: Any, ) -> None: super().__init__(stroke_color=stroke_color, stroke_width=stroke_width, **kwargs) self.traced_point_func = traced_point_func self.dissipating_time = dissipating_time self.time = 1.0 if self.dissipating_time else None self.add_updater(self.update_path) def update_path(self, mob: Mobject, dt: float) -> None: new_point = self.traced_point_func() if not self.has_points(): self.start_new_path(new_point) self.add_line_to(new_point) if self.dissipating_time: assert self.time is not None self.time += dt if self.time - 1 > self.dissipating_time: nppcc = self.n_points_per_curve self.set_points(self.points[nppcc:]) ManimCommunity-manim-1157b74/manim/animation/composition.py000066400000000000000000000400501515024150700240270ustar00rootroot00000000000000"""Tools for displaying multiple animations at once.""" from __future__ import annotations from collections.abc import Callable, Iterable, Sequence from typing import TYPE_CHECKING, Any import numpy as np from manim._config import config from manim.animation.animation import Animation, prepare_animation from manim.constants import RendererType from manim.mobject.mobject import Group, Mobject from manim.mobject.opengl.opengl_mobject import OpenGLGroup, OpenGLMobject from manim.scene.scene import Scene from manim.utils.iterables import remove_list_redundancies from manim.utils.parameter_parsing import flatten_iterable_parameters from manim.utils.rate_functions import linear if TYPE_CHECKING: from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup from manim.mobject.types.vectorized_mobject import VGroup __all__ = ["AnimationGroup", "Succession", "LaggedStart", "LaggedStartMap"] DEFAULT_LAGGED_START_LAG_RATIO: float = 0.05 class AnimationGroup(Animation): """Plays a group or series of :class:`~.Animation`. Parameters ---------- animations Sequence of :class:`~.Animation` objects to be played. group A group of multiple :class:`~.Mobject`. run_time The duration of the animation in seconds. rate_func The function defining the animation progress based on the relative runtime (see :mod:`~.rate_functions`) . lag_ratio Defines the delay after which the animation is applied to submobjects. A lag_ratio of ``n.nn`` means the next animation will play when ``nnn%`` of the current animation has played. Defaults to 0.0, meaning that all animations will be played together. This does not influence the total runtime of the animation. Instead the runtime of individual animations is adjusted so that the complete animation has the defined run time. """ def __init__( self, *animations: Animation | Iterable[Animation], group: Group | VGroup | OpenGLGroup | OpenGLVGroup | None = None, run_time: float | None = None, rate_func: Callable[[float], float] = linear, lag_ratio: float = 0, **kwargs: Any, ): arg_anim = flatten_iterable_parameters(animations) self.animations = [prepare_animation(anim) for anim in arg_anim] self.rate_func = rate_func if group is None: mobjects = remove_list_redundancies( [anim.mobject for anim in self.animations if not anim.is_introducer()], ) if config["renderer"] == RendererType.OPENGL: self.group: Group | VGroup | OpenGLGroup | OpenGLVGroup = OpenGLGroup( *mobjects ) else: self.group = Group(*mobjects) else: self.group = group super().__init__( self.group, rate_func=self.rate_func, lag_ratio=lag_ratio, **kwargs ) self.run_time: float = self.init_run_time(run_time) def get_all_mobjects(self) -> Sequence[Mobject | OpenGLMobject]: return list(self.group) def begin(self) -> None: if not self.animations: raise ValueError( f"Trying to play {self} without animations, this is not supported. " "Please add at least one subanimation." ) self.anim_group_time = 0.0 if self.suspend_mobject_updating: self.group.suspend_updating() for anim in self.animations: anim.begin() def _setup_scene(self, scene: Scene) -> None: for anim in self.animations: anim._setup_scene(scene) def finish(self) -> None: for anim in self.animations: anim.finish() self.anims_begun[:] = True self.anims_finished[:] = True if self.suspend_mobject_updating: self.group.resume_updating() def clean_up_from_scene(self, scene: Scene) -> None: self._on_finish(scene) for anim in self.animations: if self.remover: anim.remover = self.remover anim.clean_up_from_scene(scene) def update_mobjects(self, dt: float) -> None: for anim in self.anims_with_timings["anim"][ self.anims_begun & ~self.anims_finished ]: anim.update_mobjects(dt) def init_run_time(self, run_time: float | None) -> float: """Calculates the run time of the animation, if different from ``run_time``. Parameters ---------- run_time The duration of the animation in seconds. Returns ------- run_time The duration of the animation in seconds. """ self.build_animations_with_timings() # Note: if lag_ratio < 1, then not necessarily the final animation's # end time will be the max end time! Therefore we must calculate the # maximum over all the end times, and not just take the last one. # Example: if you want to play 2 animations of 10s and 1s with a # lag_ratio of 0.1, the 1st one will end at t=10 and the 2nd one will # end at t=2, so the AnimationGroup will end at t=10. self.max_end_time = max(self.anims_with_timings["end"], default=0) return self.max_end_time if run_time is None else run_time def build_animations_with_timings(self) -> None: """Creates a list of triplets of the form (anim, start_time, end_time).""" run_times = np.array([anim.run_time for anim in self.animations]) num_animations = run_times.shape[0] dtype = [("anim", "O"), ("start", "f8"), ("end", "f8")] self.anims_with_timings: np.ndarray = np.zeros(num_animations, dtype=dtype) self.anims_begun: np.ndarray = np.zeros(num_animations, dtype=bool) self.anims_finished: np.ndarray = np.zeros(num_animations, dtype=bool) if num_animations == 0: return lags = run_times[:-1] * self.lag_ratio self.anims_with_timings["anim"] = self.animations self.anims_with_timings["start"][1:] = np.add.accumulate(lags) self.anims_with_timings["end"] = self.anims_with_timings["start"] + run_times def interpolate(self, alpha: float) -> None: # Note, if the run_time of AnimationGroup has been # set to something other than its default, these # times might not correspond to actual times, # e.g. of the surrounding scene. Instead they'd # be a rescaled version. But that's okay! anim_group_time = self.rate_func(alpha) * self.max_end_time time_goes_back = anim_group_time < self.anim_group_time # Only update ongoing animations awt = self.anims_with_timings new_begun = anim_group_time >= awt["start"] new_finished = anim_group_time > awt["end"] to_update = awt[ (self.anims_begun | new_begun) & (~self.anims_finished | ~new_finished) ] run_times = to_update["end"] - to_update["start"] with_zero_run_time = run_times == 0 run_times[with_zero_run_time] = 1 sub_alphas = (anim_group_time - to_update["start"]) / run_times if time_goes_back: sub_alphas[(sub_alphas < 0) | with_zero_run_time] = 0 else: sub_alphas[(sub_alphas > 1) | with_zero_run_time] = 1 for anim_to_update, sub_alpha in zip( to_update["anim"], sub_alphas, strict=True ): anim_to_update.interpolate(sub_alpha) self.anim_group_time = anim_group_time self.anims_begun = new_begun self.anims_finished = new_finished class Succession(AnimationGroup): """Plays a series of animations in succession. Parameters ---------- animations Sequence of :class:`~.Animation` objects to be played. lag_ratio Defines the delay after which the animation is applied to submobjects. A lag_ratio of ``n.nn`` means the next animation will play when ``nnn%`` of the current animation has played. Defaults to 1.0, meaning that the next animation will begin when 100% of the current animation has played. This does not influence the total runtime of the animation. Instead the runtime of individual animations is adjusted so that the complete animation has the defined run time. Examples -------- .. manim:: SuccessionExample class SuccessionExample(Scene): def construct(self): dot1 = Dot(point=LEFT * 2 + UP * 2, radius=0.16, color=BLUE) dot2 = Dot(point=LEFT * 2 + DOWN * 2, radius=0.16, color=MAROON) dot3 = Dot(point=RIGHT * 2 + DOWN * 2, radius=0.16, color=GREEN) dot4 = Dot(point=RIGHT * 2 + UP * 2, radius=0.16, color=YELLOW) self.add(dot1, dot2, dot3, dot4) self.play(Succession( dot1.animate.move_to(dot2), dot2.animate.move_to(dot3), dot3.animate.move_to(dot4), dot4.animate.move_to(dot1) )) """ def __init__(self, *animations: Animation, lag_ratio: float = 1, **kwargs: Any): super().__init__(*animations, lag_ratio=lag_ratio, **kwargs) def begin(self) -> None: if not self.animations: raise ValueError( f"Trying to play {self} without animations, this is not supported. " "Please add at least one subanimation." ) self.update_active_animation(0) def finish(self) -> None: while self.active_animation is not None: self.next_animation() def update_mobjects(self, dt: float) -> None: if self.active_animation: self.active_animation.update_mobjects(dt) def _setup_scene(self, scene: Scene | None) -> None: if scene is None: return if self.is_introducer(): for anim in self.animations: if not anim.is_introducer() and anim.mobject is not None: scene.add(anim.mobject) self.scene = scene def update_active_animation(self, index: int) -> None: self.active_index = index if index >= len(self.animations): self.active_animation: Animation | None = None self.active_start_time: float | None = None self.active_end_time: float | None = None else: self.active_animation = self.animations[index] self.active_animation._setup_scene(self.scene) self.active_animation.begin() self.active_start_time = self.anims_with_timings[index]["start"] self.active_end_time = self.anims_with_timings[index]["end"] def next_animation(self) -> None: """Proceeds to the next animation. This method is called right when the active animation finishes. """ if self.active_animation is not None: self.active_animation.finish() self.update_active_animation(self.active_index + 1) def interpolate(self, alpha: float) -> None: current_time = self.rate_func(alpha) * self.max_end_time while self.active_end_time is not None and current_time >= self.active_end_time: self.next_animation() if self.active_animation is not None and self.active_start_time is not None: elapsed = current_time - self.active_start_time active_run_time = self.active_animation.run_time subalpha = elapsed / active_run_time if active_run_time != 0.0 else 1.0 self.active_animation.interpolate(subalpha) class LaggedStart(AnimationGroup): """Adjusts the timing of a series of :class:`~.Animation` according to ``lag_ratio``. Parameters ---------- animations Sequence of :class:`~.Animation` objects to be played. lag_ratio Defines the delay after which the animation is applied to submobjects. A lag_ratio of ``n.nn`` means the next animation will play when ``nnn%`` of the current animation has played. Defaults to 0.05, meaning that the next animation will begin when 5% of the current animation has played. This does not influence the total runtime of the animation. Instead the runtime of individual animations is adjusted so that the complete animation has the defined run time. Examples -------- .. manim:: LaggedStartExample class LaggedStartExample(Scene): def construct(self): title = Text("lag_ratio = 0.25").to_edge(UP) dot1 = Dot(point=LEFT * 2 + UP, radius=0.16) dot2 = Dot(point=LEFT * 2, radius=0.16) dot3 = Dot(point=LEFT * 2 + DOWN, radius=0.16) line_25 = DashedLine( start=LEFT + UP * 2, end=LEFT + DOWN * 2, color=RED ) label = Text("25%", font_size=24).next_to(line_25, UP) self.add(title, dot1, dot2, dot3, line_25, label) self.play(LaggedStart( dot1.animate.shift(RIGHT * 4), dot2.animate.shift(RIGHT * 4), dot3.animate.shift(RIGHT * 4), lag_ratio=0.25, run_time=4 )) """ def __init__( self, *animations: Animation, lag_ratio: float = DEFAULT_LAGGED_START_LAG_RATIO, **kwargs: Any, ): super().__init__(*animations, lag_ratio=lag_ratio, **kwargs) class LaggedStartMap(LaggedStart): """Plays a series of :class:`~.Animation` while mapping a function to submobjects. Parameters ---------- animation_class :class:`~.Animation` to apply to mobject. mobject :class:`~.Mobject` whose submobjects the animation, and optionally the function, are to be applied. arg_creator Function which will be applied to :class:`~.Mobject`. run_time The duration of the animation in seconds. lag_ratio Defines the delay after which the animation is applied to submobjects. A lag_ratio of ``n.nn`` means the next animation will play when ``nnn%`` of the current animation has played. Defaults to 0.05, meaning that the next animation will begin when 5% of the current animation has played. This does not influence the total runtime of the animation. Instead the runtime of individual animations is adjusted so that the complete animation has the defined run time. kwargs Further keyword arguments that are passed to `animation_class`. Examples -------- .. manim:: LaggedStartMapExample class LaggedStartMapExample(Scene): def construct(self): title = Tex("LaggedStartMap").to_edge(UP, buff=LARGE_BUFF) dots = VGroup( *[Dot(radius=0.16) for _ in range(35)] ).arrange_in_grid(rows=5, cols=7, buff=MED_LARGE_BUFF) self.add(dots, title) # Animate yellow ripple effect for mob in dots, title: self.play(LaggedStartMap( ApplyMethod, mob, lambda m : (m.set_color, YELLOW), lag_ratio = 0.1, rate_func = there_and_back, run_time = 2 )) """ def __init__( self, animation_class: type[Animation], mobject: Mobject, arg_creator: Callable[[Mobject], Iterable[Any]] | None = None, run_time: float = 2, lag_ratio: float = DEFAULT_LAGGED_START_LAG_RATIO, **kwargs: Any, ): if arg_creator is None: def identity(mob: Mobject) -> Mobject: return mob arg_creator = identity args_list = [arg_creator(submob) for submob in mobject] anim_kwargs = dict(kwargs) if "lag_ratio" in anim_kwargs: anim_kwargs.pop("lag_ratio") animations = [animation_class(*args, **anim_kwargs) for args in args_list] super().__init__(*animations, run_time=run_time, lag_ratio=lag_ratio) ManimCommunity-manim-1157b74/manim/animation/creation.py000066400000000000000000000621361515024150700233010ustar00rootroot00000000000000r"""Animate the display or removal of a mobject from a scene. .. manim:: CreationModule :hide_source: from manim import ManimBanner class CreationModule(Scene): def construct(self): s1 = Square() s2 = Square() s3 = Square() s4 = Square() VGroup(s1, s2, s3, s4).set_x(0).arrange(buff=1.9).shift(UP) s5 = Square() s6 = Square() s7 = Square() VGroup(s5, s6, s7).set_x(0).arrange(buff=2.6).shift(2 * DOWN) t1 = Text("Write", font_size=24).next_to(s1, UP) t2 = Text("AddTextLetterByLetter", font_size=24).next_to(s2, UP) t3 = Text("Create", font_size=24).next_to(s3, UP) t4 = Text("Uncreate", font_size=24).next_to(s4, UP) t5 = Text("DrawBorderThenFill", font_size=24).next_to(s5, UP) t6 = Text("ShowIncreasingSubsets", font_size=22).next_to(s6, UP) t7 = Text("ShowSubmobjectsOneByOne", font_size=22).next_to(s7, UP) self.add(s1, s2, s3, s4, s5, s6, s7, t1, t2, t3, t4, t5, t6, t7) texts = [Text("manim", font_size=29), Text("manim", font_size=29)] texts[0].move_to(s1.get_center()) texts[1].move_to(s2.get_center()) self.add(*texts) objs = [ManimBanner().scale(0.25) for _ in range(5)] objs[0].move_to(s3.get_center()) objs[1].move_to(s4.get_center()) objs[2].move_to(s5.get_center()) objs[3].move_to(s6.get_center()) objs[4].move_to(s7.get_center()) self.add(*objs) self.play( # text creation Write(texts[0]), AddTextLetterByLetter(texts[1]), # mobject creation Create(objs[0]), Uncreate(objs[1]), DrawBorderThenFill(objs[2]), ShowIncreasingSubsets(objs[3]), ShowSubmobjectsOneByOne(objs[4]), run_time=3, ) self.wait() """ from __future__ import annotations __all__ = [ "Create", "Uncreate", "DrawBorderThenFill", "Write", "Unwrite", "ShowPartial", "ShowIncreasingSubsets", "SpiralIn", "AddTextLetterByLetter", "RemoveTextLetterByLetter", "ShowSubmobjectsOneByOne", "AddTextWordByWord", "TypeWithCursor", "UntypeWithCursor", ] import itertools as it from collections.abc import Callable, Iterable, Sequence from typing import TYPE_CHECKING import numpy as np if TYPE_CHECKING: from manim.mobject.text.text_mobject import Text from manim.scene.scene import Scene from manim.constants import RIGHT, TAU from manim.mobject.opengl.opengl_surface import OpenGLSurface from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.utils.color import ManimColor from .. import config from ..animation.animation import Animation from ..animation.composition import Succession from ..mobject.mobject import Group, Mobject from ..mobject.types.vectorized_mobject import VMobject from ..utils.bezier import integer_interpolate from ..utils.rate_functions import double_smooth, linear class ShowPartial(Animation): """Abstract class for Animations that show the VMobject partially. Raises ------ :class:`TypeError` If ``mobject`` is not an instance of :class:`~.VMobject`. See Also -------- :class:`Create`, :class:`~.ShowPassingFlash` """ def __init__( self, mobject: VMobject | OpenGLVMobject | OpenGLSurface | None, **kwargs, ): pointwise = getattr(mobject, "pointwise_become_partial", None) if not callable(pointwise): raise TypeError(f"{self.__class__.__name__} only works for VMobjects.") super().__init__(mobject, **kwargs) def interpolate_submobject( self, submobject: Mobject, starting_submobject: Mobject, alpha: float, ) -> None: submobject.pointwise_become_partial( starting_submobject, *self._get_bounds(alpha) ) def _get_bounds(self, alpha: float) -> tuple[float, float]: raise NotImplementedError("Please use Create or ShowPassingFlash") class Create(ShowPartial): """Incrementally show a VMobject. Parameters ---------- mobject The VMobject to animate. Raises ------ :class:`TypeError` If ``mobject`` is not an instance of :class:`~.VMobject`. Examples -------- .. manim:: CreateScene class CreateScene(Scene): def construct(self): self.play(Create(Square())) See Also -------- :class:`~.ShowPassingFlash` """ def __init__( self, mobject: VMobject | OpenGLVMobject | OpenGLSurface, lag_ratio: float = 1.0, introducer: bool = True, **kwargs, ) -> None: super().__init__(mobject, lag_ratio=lag_ratio, introducer=introducer, **kwargs) def _get_bounds(self, alpha: float) -> tuple[float, float]: return (0, alpha) class Uncreate(Create): """Like :class:`Create` but in reverse. Examples -------- .. manim:: ShowUncreate class ShowUncreate(Scene): def construct(self): self.play(Uncreate(Square())) See Also -------- :class:`Create` """ def __init__( self, mobject: VMobject | OpenGLVMobject, reverse_rate_function: bool = True, remover: bool = True, **kwargs, ) -> None: super().__init__( mobject, reverse_rate_function=reverse_rate_function, introducer=False, remover=remover, **kwargs, ) class DrawBorderThenFill(Animation): """Draw the border first and then show the fill. Examples -------- .. manim:: ShowDrawBorderThenFill class ShowDrawBorderThenFill(Scene): def construct(self): self.play(DrawBorderThenFill(Square(fill_opacity=1, fill_color=ORANGE))) """ def __init__( self, vmobject: VMobject | OpenGLVMobject, run_time: float = 2, rate_func: Callable[[float], float] = double_smooth, stroke_width: float = 2, stroke_color: str = None, introducer: bool = True, **kwargs, ) -> None: self._typecheck_input(vmobject) super().__init__( vmobject, run_time=run_time, introducer=introducer, rate_func=rate_func, **kwargs, ) self.stroke_width = stroke_width self.stroke_color = stroke_color self.outline = self.get_outline() def _typecheck_input(self, vmobject: VMobject | OpenGLVMobject) -> None: if not isinstance(vmobject, (VMobject, OpenGLVMobject)): raise TypeError( f"{self.__class__.__name__} only works for vectorized Mobjects" ) def begin(self) -> None: self.outline = self.get_outline() super().begin() def get_outline(self) -> Mobject: outline = self.mobject.copy() outline.set_fill(opacity=0) for sm in outline.family_members_with_points(): sm.set_stroke(color=self.get_stroke_color(sm), width=self.stroke_width) return outline def get_stroke_color(self, vmobject: VMobject | OpenGLVMobject) -> ManimColor: if self.stroke_color: return self.stroke_color elif vmobject.get_stroke_width() > 0: return vmobject.get_stroke_color() return vmobject.get_color() def get_all_mobjects(self) -> Sequence[Mobject]: return [*super().get_all_mobjects(), self.outline] def interpolate_submobject( self, submobject: Mobject, starting_submobject: Mobject, outline, alpha: float, ) -> None: # Fixme: not matching the parent class? What is outline doing here? index: int subalpha: float index, subalpha = integer_interpolate(0, 2, alpha) if index == 0: submobject.pointwise_become_partial(outline, 0, subalpha) submobject.match_style(outline) else: submobject.interpolate(outline, starting_submobject, subalpha) class Write(DrawBorderThenFill): """Simulate hand-writing a :class:`~.Text` or hand-drawing a :class:`~.VMobject`. Examples -------- .. manim:: ShowWrite class ShowWrite(Scene): def construct(self): self.play(Write(Text("Hello", font_size=144))) .. manim:: ShowWriteReversed class ShowWriteReversed(Scene): def construct(self): self.play(Write(Text("Hello", font_size=144), reverse=True, remover=False)) Tests ----- Check that creating empty :class:`.Write` animations works:: >>> from manim import Write, Text >>> Write(Text('')) Write(Text('')) """ def __init__( self, vmobject: VMobject | OpenGLVMobject, rate_func: Callable[[float], float] = linear, reverse: bool = False, **kwargs, ) -> None: run_time: float | None = kwargs.pop("run_time", None) lag_ratio: float | None = kwargs.pop("lag_ratio", None) run_time, lag_ratio = self._set_default_config_from_length( vmobject, run_time, lag_ratio, ) self.reverse = reverse if "remover" not in kwargs: kwargs["remover"] = reverse super().__init__( vmobject, rate_func=rate_func, run_time=run_time, lag_ratio=lag_ratio, introducer=not reverse, **kwargs, ) def _set_default_config_from_length( self, vmobject: VMobject | OpenGLVMobject, run_time: float | None, lag_ratio: float | None, ) -> tuple[float, float]: length = len(vmobject.family_members_with_points()) if run_time is None: run_time = 1 if length < 15 else 2 if lag_ratio is None: lag_ratio = min(4.0 / max(1.0, length), 0.2) return run_time, lag_ratio def reverse_submobjects(self) -> None: self.mobject.invert(recursive=True) def begin(self) -> None: if self.reverse: self.reverse_submobjects() super().begin() def finish(self) -> None: super().finish() if self.reverse: self.reverse_submobjects() class Unwrite(Write): """Simulate erasing by hand a :class:`~.Text` or a :class:`~.VMobject`. Parameters ---------- reverse Set True to have the animation start erasing from the last submobject first. Examples -------- .. manim :: UnwriteReverseTrue class UnwriteReverseTrue(Scene): def construct(self): text = Tex("Alice and Bob").scale(3) self.add(text) self.play(Unwrite(text)) .. manim:: UnwriteReverseFalse class UnwriteReverseFalse(Scene): def construct(self): text = Tex("Alice and Bob").scale(3) self.add(text) self.play(Unwrite(text, reverse=False)) """ def __init__( self, vmobject: VMobject, rate_func: Callable[[float], float] = linear, reverse: bool = True, **kwargs, ) -> None: run_time: float | None = kwargs.pop("run_time", None) lag_ratio: float | None = kwargs.pop("lag_ratio", None) run_time, lag_ratio = self._set_default_config_from_length( vmobject, run_time, lag_ratio, ) super().__init__( vmobject, run_time=run_time, lag_ratio=lag_ratio, reverse_rate_function=True, reverse=reverse, **kwargs, ) class SpiralIn(Animation): r"""Create the Mobject with sub-Mobjects flying in on spiral trajectories. Parameters ---------- shapes The Mobject on which to be operated. scale_factor The factor used for scaling the effect. fade_in_fraction Fractional duration of initial fade-in of sub-Mobjects as they fly inward. Examples -------- .. manim :: SpiralInExample class SpiralInExample(Scene): def construct(self): pi = MathTex(r"\pi").scale(7) pi.shift(2.25 * LEFT + 1.5 * UP) circle = Circle(color=GREEN_C, fill_opacity=1).shift(LEFT) square = Square(color=BLUE_D, fill_opacity=1).shift(UP) shapes = VGroup(pi, circle, square) self.play(SpiralIn(shapes)) """ def __init__( self, shapes: Mobject, scale_factor: float = 8, fade_in_fraction=0.3, **kwargs, ) -> None: self.shapes = shapes.copy() self.scale_factor = scale_factor self.shape_center = shapes.get_center() self.fade_in_fraction = fade_in_fraction for shape in shapes: shape.final_position = shape.get_center() shape.initial_position = ( shape.final_position + (shape.final_position - self.shape_center) * self.scale_factor ) shape.move_to(shape.initial_position) shape.save_state() super().__init__(shapes, introducer=True, **kwargs) def interpolate_mobject(self, alpha: float) -> None: alpha = self.rate_func(alpha) for original_shape, shape in zip(self.shapes, self.mobject, strict=True): shape.restore() fill_opacity = original_shape.get_fill_opacity() stroke_opacity = original_shape.get_stroke_opacity() new_fill_opacity = min( fill_opacity, alpha * fill_opacity / self.fade_in_fraction ) new_stroke_opacity = min( stroke_opacity, alpha * stroke_opacity / self.fade_in_fraction ) shape.shift((shape.final_position - shape.initial_position) * alpha) shape.rotate(TAU * alpha, about_point=self.shape_center) shape.rotate(-TAU * alpha, about_point=shape.get_center_of_mass()) shape.set_fill(opacity=new_fill_opacity) shape.set_stroke(opacity=new_stroke_opacity) class ShowIncreasingSubsets(Animation): """Show one submobject at a time, leaving all previous ones displayed on screen. Examples -------- .. manim:: ShowIncreasingSubsetsScene class ShowIncreasingSubsetsScene(Scene): def construct(self): p = VGroup(Dot(), Square(), Triangle()) self.add(p) self.play(ShowIncreasingSubsets(p)) self.wait() """ def __init__( self, group: Mobject, suspend_mobject_updating: bool = False, int_func: Callable[[np.ndarray], np.ndarray] = np.floor, reverse_rate_function=False, **kwargs, ) -> None: self.all_submobs = list(group.submobjects) self.int_func = int_func for mobj in self.all_submobs: mobj.set_opacity(0) super().__init__( group, suspend_mobject_updating=suspend_mobject_updating, reverse_rate_function=reverse_rate_function, **kwargs, ) def interpolate_mobject(self, alpha: float) -> None: n_submobs = len(self.all_submobs) value = ( 1 - self.rate_func(alpha) if self.reverse_rate_function else self.rate_func(alpha) ) index = int(self.int_func(value * n_submobs)) self.update_submobject_list(index) def update_submobject_list(self, index: int) -> None: for mobj in self.all_submobs[:index]: mobj.set_opacity(1) for mobj in self.all_submobs[index:]: mobj.set_opacity(0) class AddTextLetterByLetter(ShowIncreasingSubsets): """Show a :class:`~.Text` letter by letter on the scene. Parameters ---------- time_per_char Frequency of appearance of the letters. .. tip:: This is currently only possible for class:`~.Text` and not for class:`~.MathTex` """ def __init__( self, text: Text, suspend_mobject_updating: bool = False, int_func: Callable[[np.ndarray], np.ndarray] = np.ceil, rate_func: Callable[[float], float] = linear, time_per_char: float = 0.1, run_time: float | None = None, reverse_rate_function=False, introducer=True, **kwargs, ) -> None: self.time_per_char = time_per_char # Check for empty text using family_members_with_points() if not text.family_members_with_points(): raise ValueError( f"The text mobject {text} does not seem to contain any characters." ) if run_time is None: # minimum time per character is 1/frame_rate, otherwise # the animation does not finish. run_time = np.max((1 / config.frame_rate, self.time_per_char)) * len(text) super().__init__( text, suspend_mobject_updating=suspend_mobject_updating, int_func=int_func, rate_func=rate_func, run_time=run_time, reverse_rate_function=reverse_rate_function, introducer=introducer, **kwargs, ) class RemoveTextLetterByLetter(AddTextLetterByLetter): """Remove a :class:`~.Text` letter by letter from the scene. Parameters ---------- time_per_char Frequency of appearance of the letters. .. tip:: This is currently only possible for class:`~.Text` and not for class:`~.MathTex` """ def __init__( self, text: Text, suspend_mobject_updating: bool = False, int_func: Callable[[np.ndarray], np.ndarray] = np.ceil, rate_func: Callable[[float], float] = linear, time_per_char: float = 0.1, run_time: float | None = None, reverse_rate_function=True, introducer=False, remover=True, **kwargs, ) -> None: super().__init__( text, suspend_mobject_updating=suspend_mobject_updating, int_func=int_func, rate_func=rate_func, time_per_char=time_per_char, run_time=run_time, reverse_rate_function=reverse_rate_function, introducer=introducer, remover=remover, **kwargs, ) class ShowSubmobjectsOneByOne(ShowIncreasingSubsets): """Show one submobject at a time, removing all previously displayed ones from screen.""" def __init__( self, group: Iterable[Mobject], int_func: Callable[[np.ndarray], np.ndarray] = np.ceil, **kwargs, ) -> None: new_group = Group(*group) super().__init__(new_group, int_func=int_func, **kwargs) def update_submobject_list(self, index: int) -> None: current_submobjects = self.all_submobs[:index] for mobj in current_submobjects[:-1]: mobj.set_opacity(0) if len(current_submobjects) > 0: current_submobjects[-1].set_opacity(1) # TODO, this is broken... class AddTextWordByWord(Succession): """Show a :class:`~.Text` word by word on the scene. Note: currently broken.""" def __init__( self, text_mobject: Text, run_time: float = None, time_per_char: float = 0.06, **kwargs, ) -> None: self.time_per_char = time_per_char tpc = self.time_per_char anims = it.chain( *( [ ShowIncreasingSubsets(word, run_time=tpc * len(word)), Animation(word, run_time=0.005 * len(word) ** 1.5), ] for word in text_mobject ) ) super().__init__(*anims, **kwargs) class TypeWithCursor(AddTextLetterByLetter): """Similar to :class:`~.AddTextLetterByLetter` , but with an additional cursor mobject at the end. Parameters ---------- time_per_char Frequency of appearance of the letters. cursor :class:`~.Mobject` shown after the last added letter. buff Controls how far away the cursor is to the right of the last added letter. keep_cursor_y If ``True``, the cursor's y-coordinate is set to the center of the ``Text`` and remains the same throughout the animation. Otherwise, it is set to the center of the last added letter. leave_cursor_on Whether to show the cursor after the animation. .. tip:: This is currently only possible for class:`~.Text` and not for class:`~.MathTex`. Examples -------- .. manim:: InsertingTextExample :ref_classes: Blink class InsertingTextExample(Scene): def construct(self): text = Text("Inserting", color=PURPLE).scale(1.5).to_edge(LEFT) cursor = Rectangle( color = GREY_A, fill_color = GREY_A, fill_opacity = 1.0, height = 1.1, width = 0.5, ).move_to(text[0]) # Position the cursor self.play(TypeWithCursor(text, cursor)) self.play(Blink(cursor, blinks=2)) """ def __init__( self, text: Text, cursor: Mobject, buff: float = 0.1, keep_cursor_y: bool = True, leave_cursor_on: bool = True, time_per_char: float = 0.1, reverse_rate_function=False, introducer=True, **kwargs, ) -> None: self.cursor = cursor self.buff = buff self.keep_cursor_y = keep_cursor_y self.leave_cursor_on = leave_cursor_on super().__init__( text, time_per_char=time_per_char, reverse_rate_function=reverse_rate_function, introducer=introducer, **kwargs, ) def begin(self) -> None: self.y_cursor = self.cursor.get_y() self.cursor.initial_position = self.mobject.get_center() if self.keep_cursor_y: self.cursor.set_y(self.y_cursor) self.cursor.set_opacity(0) self.mobject.add(self.cursor) super().begin() def finish(self) -> None: if self.leave_cursor_on: self.cursor.set_opacity(1) else: self.cursor.set_opacity(0) self.mobject.remove(self.cursor) super().finish() def clean_up_from_scene(self, scene: Scene) -> None: if not self.leave_cursor_on: scene.remove(self.cursor) super().clean_up_from_scene(scene) def update_submobject_list(self, index: int) -> None: for mobj in self.all_submobs[:index]: mobj.set_opacity(1) for mobj in self.all_submobs[index:]: mobj.set_opacity(0) if index != 0: self.cursor.next_to( self.all_submobs[index - 1], RIGHT, buff=self.buff ).set_y(self.cursor.initial_position[1]) else: self.cursor.move_to(self.all_submobs[0]).set_y( self.cursor.initial_position[1] ) if self.keep_cursor_y: self.cursor.set_y(self.y_cursor) self.cursor.set_opacity(1) class UntypeWithCursor(TypeWithCursor): """Similar to :class:`~.RemoveTextLetterByLetter` , but with an additional cursor mobject at the end. Parameters ---------- time_per_char Frequency of appearance of the letters. cursor :class:`~.Mobject` shown after the last added letter. buff Controls how far away the cursor is to the right of the last added letter. keep_cursor_y If ``True``, the cursor's y-coordinate is set to the center of the ``Text`` and remains the same throughout the animation. Otherwise, it is set to the center of the last added letter. leave_cursor_on Whether to show the cursor after the animation. .. tip:: This is currently only possible for class:`~.Text` and not for class:`~.MathTex`. Examples -------- .. manim:: DeletingTextExample :ref_classes: Blink class DeletingTextExample(Scene): def construct(self): text = Text("Deleting", color=PURPLE).scale(1.5).to_edge(LEFT) cursor = Rectangle( color = GREY_A, fill_color = GREY_A, fill_opacity = 1.0, height = 1.1, width = 0.5, ).move_to(text[0]) # Position the cursor self.play(UntypeWithCursor(text, cursor)) self.play(Blink(cursor, blinks=2)) """ def __init__( self, text: Text, cursor: VMobject | None = None, time_per_char: float = 0.1, reverse_rate_function=True, introducer=False, remover=True, **kwargs, ) -> None: super().__init__( text, cursor=cursor, time_per_char=time_per_char, reverse_rate_function=reverse_rate_function, introducer=introducer, remover=remover, **kwargs, ) ManimCommunity-manim-1157b74/manim/animation/fading.py000066400000000000000000000134311515024150700227170ustar00rootroot00000000000000"""Fading in and out of view. .. manim:: Fading class Fading(Scene): def construct(self): tex_in = Tex("Fade", "In").scale(3) tex_out = Tex("Fade", "Out").scale(3) self.play(FadeIn(tex_in, shift=DOWN, scale=0.66)) self.play(ReplacementTransform(tex_in, tex_out)) self.play(FadeOut(tex_out, shift=DOWN * 2, scale=1.5)) """ from __future__ import annotations __all__ = [ "FadeOut", "FadeIn", ] from typing import Any import numpy as np from manim.mobject.opengl.opengl_mobject import OpenGLMobject from ..animation.transform import Transform from ..constants import ORIGIN from ..mobject.mobject import Group, Mobject from ..scene.scene import Scene class _Fade(Transform): """Fade :class:`~.Mobject` s in or out. Parameters ---------- mobjects The mobjects to be faded. shift The vector by which the mobject shifts while being faded. target_position The position to/from which the mobject moves while being faded in. In case another mobject is given as target position, its center is used. scale The factor by which the mobject is scaled initially before being rescaling to its original size while being faded in. """ def __init__( self, *mobjects: Mobject, shift: np.ndarray | None = None, target_position: np.ndarray | Mobject | None = None, scale: float = 1, **kwargs: Any, ) -> None: if not mobjects: raise ValueError("At least one mobject must be passed.") mobject = mobjects[0] if len(mobjects) == 1 else Group(*mobjects) self.point_target = False if shift is None: if target_position is not None: if isinstance(target_position, (Mobject, OpenGLMobject)): target_position = target_position.get_center() shift = target_position - mobject.get_center() self.point_target = True else: shift = ORIGIN self.shift_vector = shift self.scale_factor = scale super().__init__(mobject, **kwargs) def _create_faded_mobject(self, fadeIn: bool) -> Mobject: """Create a faded, shifted and scaled copy of the mobject. Parameters ---------- fadeIn Whether the faded mobject is used to fade in. Returns ------- Mobject The faded, shifted and scaled copy of the mobject. """ faded_mobject: Mobject = self.mobject.copy() # type: ignore[assignment] faded_mobject.fade(1) direction_modifier = -1 if fadeIn and not self.point_target else 1 faded_mobject.shift(self.shift_vector * direction_modifier) faded_mobject.scale(self.scale_factor) return faded_mobject class FadeIn(_Fade): r"""Fade in :class:`~.Mobject` s. Parameters ---------- mobjects The mobjects to be faded in. shift The vector by which the mobject shifts while being faded in. target_position The position from which the mobject starts while being faded in. In case another mobject is given as target position, its center is used. scale The factor by which the mobject is scaled initially before being rescaling to its original size while being faded in. Examples -------- .. manim :: FadeInExample class FadeInExample(Scene): def construct(self): dot = Dot(UP * 2 + LEFT) self.add(dot) tex = Tex( "FadeIn with ", "shift ", r" or target\_position", " and scale" ).scale(1) animations = [ FadeIn(tex[0]), FadeIn(tex[1], shift=DOWN), FadeIn(tex[2], target_position=dot), FadeIn(tex[3], scale=1.5), ] self.play(AnimationGroup(*animations, lag_ratio=0.5)) """ def __init__(self, *mobjects: Mobject, **kwargs: Any) -> None: super().__init__(*mobjects, introducer=True, **kwargs) def create_target(self) -> Mobject: return self.mobject # type: ignore[return-value] def create_starting_mobject(self) -> Mobject: return self._create_faded_mobject(fadeIn=True) class FadeOut(_Fade): r"""Fade out :class:`~.Mobject` s. Parameters ---------- mobjects The mobjects to be faded out. shift The vector by which the mobject shifts while being faded out. target_position The position to which the mobject moves while being faded out. In case another mobject is given as target position, its center is used. scale The factor by which the mobject is scaled while being faded out. Examples -------- .. manim :: FadeInExample class FadeInExample(Scene): def construct(self): dot = Dot(UP * 2 + LEFT) self.add(dot) tex = Tex( "FadeOut with ", "shift ", r" or target\_position", " and scale" ).scale(1) animations = [ FadeOut(tex[0]), FadeOut(tex[1], shift=DOWN), FadeOut(tex[2], target_position=dot), FadeOut(tex[3], scale=0.5), ] self.play(AnimationGroup(*animations, lag_ratio=0.5)) """ def __init__(self, *mobjects: Mobject, **kwargs: Any) -> None: super().__init__(*mobjects, remover=True, **kwargs) def create_target(self) -> Mobject: return self._create_faded_mobject(fadeIn=False) def clean_up_from_scene(self, scene: Scene) -> None: super().clean_up_from_scene(scene) self.interpolate(0) ManimCommunity-manim-1157b74/manim/animation/growing.py000066400000000000000000000167071515024150700231540ustar00rootroot00000000000000"""Animations that introduce mobjects to scene by growing them from points. .. manim:: Growing class Growing(Scene): def construct(self): square = Square() circle = Circle() triangle = Triangle() arrow = Arrow(LEFT, RIGHT) star = Star() VGroup(square, circle, triangle).set_x(0).arrange(buff=1.5).set_y(2) VGroup(arrow, star).move_to(DOWN).set_x(0).arrange(buff=1.5).set_y(-2) self.play(GrowFromPoint(square, ORIGIN)) self.play(GrowFromCenter(circle)) self.play(GrowFromEdge(triangle, DOWN)) self.play(GrowArrow(arrow)) self.play(SpinInFromNothing(star)) """ from __future__ import annotations __all__ = [ "GrowFromPoint", "GrowFromCenter", "GrowFromEdge", "GrowArrow", "SpinInFromNothing", ] from typing import TYPE_CHECKING, Any from ..animation.transform import Transform from ..constants import PI from ..utils.paths import spiral_path if TYPE_CHECKING: from manim.mobject.geometry.line import Arrow from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.typing import Point3DLike, Vector3DLike from manim.utils.color import ParsableManimColor from ..mobject.mobject import Mobject class GrowFromPoint(Transform): """Introduce an :class:`~.Mobject` by growing it from a point. Parameters ---------- mobject The mobjects to be introduced. point The point from which the mobject grows. point_color Initial color of the mobject before growing to its full size. Leave empty to match mobject's color. Examples -------- .. manim :: GrowFromPointExample class GrowFromPointExample(Scene): def construct(self): dot = Dot(3 * UR, color=GREEN) squares = [Square() for _ in range(4)] VGroup(*squares).set_x(0).arrange(buff=1) self.add(dot) self.play(GrowFromPoint(squares[0], ORIGIN)) self.play(GrowFromPoint(squares[1], [-2, 2, 0])) self.play(GrowFromPoint(squares[2], [3, -2, 0], RED)) self.play(GrowFromPoint(squares[3], dot, dot.get_color())) """ def __init__( self, mobject: Mobject, point: Point3DLike, point_color: ParsableManimColor | None = None, **kwargs: Any, ): self.point = point self.point_color = point_color super().__init__(mobject, introducer=True, **kwargs) def create_target(self) -> Mobject | OpenGLMobject: return self.mobject def create_starting_mobject(self) -> Mobject | OpenGLMobject: start = super().create_starting_mobject() start.scale(0) start.move_to(self.point) if self.point_color: start.set_color(self.point_color) return start class GrowFromCenter(GrowFromPoint): """Introduce an :class:`~.Mobject` by growing it from its center. Parameters ---------- mobject The mobjects to be introduced. point_color Initial color of the mobject before growing to its full size. Leave empty to match mobject's color. Examples -------- .. manim :: GrowFromCenterExample class GrowFromCenterExample(Scene): def construct(self): squares = [Square() for _ in range(2)] VGroup(*squares).set_x(0).arrange(buff=2) self.play(GrowFromCenter(squares[0])) self.play(GrowFromCenter(squares[1], point_color=RED)) """ def __init__( self, mobject: Mobject, point_color: ParsableManimColor | None = None, **kwargs: Any, ): point = mobject.get_center() super().__init__(mobject, point, point_color=point_color, **kwargs) class GrowFromEdge(GrowFromPoint): """Introduce an :class:`~.Mobject` by growing it from one of its bounding box edges. Parameters ---------- mobject The mobjects to be introduced. edge The direction to seek bounding box edge of mobject. point_color Initial color of the mobject before growing to its full size. Leave empty to match mobject's color. Examples -------- .. manim :: GrowFromEdgeExample class GrowFromEdgeExample(Scene): def construct(self): squares = [Square() for _ in range(4)] VGroup(*squares).set_x(0).arrange(buff=1) self.play(GrowFromEdge(squares[0], DOWN)) self.play(GrowFromEdge(squares[1], RIGHT)) self.play(GrowFromEdge(squares[2], UR)) self.play(GrowFromEdge(squares[3], UP, point_color=RED)) """ def __init__( self, mobject: Mobject, edge: Vector3DLike, point_color: ParsableManimColor | None = None, **kwargs: Any, ): point = mobject.get_critical_point(edge) super().__init__(mobject, point, point_color=point_color, **kwargs) class GrowArrow(GrowFromPoint): """Introduce an :class:`~.Arrow` by growing it from its start toward its tip. Parameters ---------- arrow The arrow to be introduced. point_color Initial color of the arrow before growing to its full size. Leave empty to match arrow's color. Examples -------- .. manim :: GrowArrowExample class GrowArrowExample(Scene): def construct(self): arrows = [Arrow(2 * LEFT, 2 * RIGHT), Arrow(2 * DR, 2 * UL)] VGroup(*arrows).set_x(0).arrange(buff=2) self.play(GrowArrow(arrows[0])) self.play(GrowArrow(arrows[1], point_color=RED)) """ def __init__( self, arrow: Arrow, point_color: ParsableManimColor | None = None, **kwargs: Any ): point = arrow.get_start() super().__init__(arrow, point, point_color=point_color, **kwargs) def create_starting_mobject(self) -> Mobject | OpenGLMobject: start_arrow = self.mobject.copy() start_arrow.scale(0, scale_tips=True, about_point=self.point) if self.point_color: start_arrow.set_color(self.point_color) return start_arrow class SpinInFromNothing(GrowFromCenter): """Introduce an :class:`~.Mobject` spinning and growing it from its center. Parameters ---------- mobject The mobjects to be introduced. angle The amount of spinning before mobject reaches its full size. E.g. 2*PI means that the object will do one full spin before being fully introduced. point_color Initial color of the mobject before growing to its full size. Leave empty to match mobject's color. Examples -------- .. manim :: SpinInFromNothingExample class SpinInFromNothingExample(Scene): def construct(self): squares = [Square() for _ in range(3)] VGroup(*squares).set_x(0).arrange(buff=2) self.play(SpinInFromNothing(squares[0])) self.play(SpinInFromNothing(squares[1], angle=2 * PI)) self.play(SpinInFromNothing(squares[2], point_color=RED)) """ def __init__( self, mobject: Mobject, angle: float = PI / 2, point_color: ParsableManimColor | None = None, **kwargs: Any, ): self.angle = angle super().__init__( mobject, path_func=spiral_path(angle), point_color=point_color, **kwargs ) ManimCommunity-manim-1157b74/manim/animation/indication.py000066400000000000000000000552611515024150700236170ustar00rootroot00000000000000"""Animations drawing attention to particular mobjects. Examples -------- .. manim:: Indications class Indications(Scene): def construct(self): indications = [ApplyWave,Circumscribe,Flash,FocusOn,Indicate,ShowPassingFlash,Wiggle] names = [Tex(i.__name__).scale(3) for i in indications] self.add(names[0]) for i in range(len(names)): if indications[i] is Flash: self.play(Flash(UP)) elif indications[i] is ShowPassingFlash: self.play(ShowPassingFlash(Underline(names[i]))) else: self.play(indications[i](names[i])) self.play(AnimationGroup( FadeOut(names[i], shift=UP*1.5), FadeIn(names[(i+1)%len(names)], shift=UP*1.5), )) """ from __future__ import annotations __all__ = [ "FocusOn", "Indicate", "Flash", "ShowPassingFlash", "ShowPassingFlashWithThinningStrokeWidth", "ApplyWave", "Circumscribe", "Wiggle", "Blink", ] from collections.abc import Iterable from typing import Any, Self import numpy as np from manim.mobject.geometry.arc import Circle, Dot from manim.mobject.geometry.line import Line from manim.mobject.geometry.polygram import Rectangle from manim.mobject.geometry.shape_matchers import SurroundingRectangle from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.scene.scene import Scene from .. import config from ..animation.animation import Animation from ..animation.composition import AnimationGroup, Succession from ..animation.creation import Create, ShowPartial, Uncreate from ..animation.fading import FadeIn, FadeOut from ..animation.movement import Homotopy from ..animation.transform import Transform from ..animation.updaters.update import UpdateFromFunc from ..constants import * from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VGroup, VMobject from ..typing import Point3D, Point3DLike, Vector3DLike from ..utils.bezier import interpolate, inverse_interpolate from ..utils.color import GREY, PURE_YELLOW, ParsableManimColor from ..utils.rate_functions import RateFunction, smooth, there_and_back, wiggle from ..utils.space_ops import normalize class FocusOn(Transform): """Shrink a spotlight to a position. Parameters ---------- focus_point The point at which to shrink the spotlight. If it is a :class:`.~Mobject` its center will be used. opacity The opacity of the spotlight. color The color of the spotlight. run_time The duration of the animation. Examples -------- .. manim:: UsingFocusOn class UsingFocusOn(Scene): def construct(self): dot = Dot(color=PURE_YELLOW).shift(DOWN) self.add(Tex("Focusing on the dot below:"), dot) self.play(FocusOn(dot)) self.wait() """ def __init__( self, focus_point: Point3DLike | Mobject, opacity: float = 0.2, color: ParsableManimColor = GREY, run_time: float = 2, **kwargs: Any, ): self.focus_point = focus_point self.color = color self.opacity = opacity remover = True starting_dot = Dot( radius=config["frame_x_radius"] + config["frame_y_radius"], stroke_width=0, fill_color=self.color, fill_opacity=0, ) super().__init__(starting_dot, run_time=run_time, remover=remover, **kwargs) def create_target(self) -> Dot: little_dot = Dot(radius=0) little_dot.set_fill(self.color, opacity=self.opacity) little_dot.add_updater(lambda d: d.move_to(self.focus_point)) return little_dot class Indicate(Transform): """Indicate a Mobject by temporarily resizing and recoloring it. Parameters ---------- mobject The mobject to indicate. scale_factor The factor by which the mobject will be temporally scaled color The color the mobject temporally takes. rate_func The function defining the animation progress at every point in time. kwargs Additional arguments to be passed to the :class:`~.Succession` constructor Examples -------- .. manim:: UsingIndicate class UsingIndicate(Scene): def construct(self): tex = Tex("Indicate").scale(3) self.play(Indicate(tex)) self.wait() """ def __init__( self, mobject: Mobject, scale_factor: float = 1.2, color: ParsableManimColor = PURE_YELLOW, rate_func: RateFunction = there_and_back, **kwargs: Any, ): self.color = color self.scale_factor = scale_factor super().__init__(mobject, rate_func=rate_func, **kwargs) def create_target(self) -> Mobject | OpenGLMobject: target = self.mobject.copy() target.scale(self.scale_factor) target.set_color(self.color) return target class Flash(AnimationGroup): """Send out lines in all directions. Parameters ---------- point The center of the flash lines. If it is a :class:`.~Mobject` its center will be used. line_length The length of the flash lines. num_lines The number of flash lines. flash_radius The distance from `point` at which the flash lines start. line_stroke_width The stroke width of the flash lines. color The color of the flash lines. time_width The time width used for the flash lines. See :class:`.~ShowPassingFlash` for more details. run_time The duration of the animation. kwargs Additional arguments to be passed to the :class:`~.Succession` constructor Examples -------- .. manim:: UsingFlash class UsingFlash(Scene): def construct(self): dot = Dot(color=PURE_YELLOW).shift(DOWN) self.add(Tex("Flash the dot below:"), dot) self.play(Flash(dot)) self.wait() .. manim:: FlashOnCircle class FlashOnCircle(Scene): def construct(self): radius = 2 circle = Circle(radius) self.add(circle) self.play(Flash( circle, line_length=1, num_lines=30, color=RED, flash_radius=radius+SMALL_BUFF, time_width=0.3, run_time=2, rate_func = rush_from )) """ def __init__( self, point: Point3DLike | Mobject, line_length: float = 0.2, num_lines: int = 12, flash_radius: float = 0.1, line_stroke_width: int = 3, color: ParsableManimColor = PURE_YELLOW, time_width: float = 1, run_time: float = 1.0, **kwargs: Any, ): if isinstance(point, Mobject): self.point: Point3D = point.get_center() else: self.point = np.asarray(point) self.color = color self.line_length = line_length self.num_lines = num_lines self.flash_radius = flash_radius self.line_stroke_width = line_stroke_width self.run_time = run_time self.time_width = time_width self.animation_config = kwargs self.lines = self.create_lines() animations = self.create_line_anims() super().__init__(*animations, group=self.lines) def create_lines(self) -> VGroup: lines = VGroup() for angle in np.arange(0, TAU, TAU / self.num_lines): line = Line(self.point, self.point + self.line_length * RIGHT) line.shift((self.flash_radius) * RIGHT) line.rotate(angle, about_point=self.point) lines.add(line) lines.set_color(self.color) lines.set_stroke(width=self.line_stroke_width) return lines def create_line_anims(self) -> Iterable[ShowPassingFlash]: return [ ShowPassingFlash( line, time_width=self.time_width, run_time=self.run_time, **self.animation_config, ) for line in self.lines ] class ShowPassingFlash(ShowPartial): r"""Show only a sliver of the VMobject each frame. Parameters ---------- mobject The mobject whose stroke is animated. time_width The length of the sliver relative to the length of the stroke. Examples -------- .. manim:: TimeWidthValues class TimeWidthValues(Scene): def construct(self): p = RegularPolygon(5, color=DARK_GRAY, stroke_width=6).scale(3) lbl = VMobject() self.add(p, lbl) p = p.copy().set_color(BLUE) for time_width in [0.2, 0.5, 1, 2]: lbl.become(Tex(r"\texttt{time\_width={{%.1f}}}"%time_width)) self.play(ShowPassingFlash( p.copy().set_color(BLUE), run_time=2, time_width=time_width )) See Also -------- :class:`~.Create` """ def __init__( self, mobject: VMobject, time_width: float = 0.1, **kwargs: Any ) -> None: self.time_width = time_width super().__init__(mobject, remover=True, introducer=True, **kwargs) def _get_bounds(self, alpha: float) -> tuple[float, float]: tw = self.time_width upper = interpolate(0, 1 + tw, alpha) lower = upper - tw upper = min(upper, 1) lower = max(lower, 0) return (lower, upper) def clean_up_from_scene(self, scene: Scene) -> None: super().clean_up_from_scene(scene) for submob, start in self.get_all_families_zipped(): submob.pointwise_become_partial(start, 0, 1) class ShowPassingFlashWithThinningStrokeWidth(AnimationGroup): def __init__( self, vmobject: VMobject, n_segments: int = 10, time_width: float = 0.1, remover: bool = True, **kwargs: Any, ): self.n_segments = n_segments self.time_width = time_width self.remover = remover max_stroke_width = vmobject.get_stroke_width() max_time_width = kwargs.pop("time_width", self.time_width) super().__init__( *( ShowPassingFlash( vmobject.copy().set_stroke(width=stroke_width), time_width=time_width, **kwargs, ) for stroke_width, time_width in zip( np.linspace(0, max_stroke_width, self.n_segments), np.linspace(max_time_width, 0, self.n_segments), strict=True, ) ), ) class ApplyWave(Homotopy): """Send a wave through the Mobject distorting it temporarily. Parameters ---------- mobject The mobject to be distorted. direction The direction in which the wave nudges points of the shape amplitude The distance points of the shape get shifted wave_func The function defining the shape of one wave flank. time_width The length of the wave relative to the width of the mobject. ripples The number of ripples of the wave run_time The duration of the animation. Examples -------- .. manim:: ApplyingWaves class ApplyingWaves(Scene): def construct(self): tex = Tex("WaveWaveWaveWaveWave").scale(2) self.play(ApplyWave(tex)) self.play(ApplyWave( tex, direction=RIGHT, time_width=0.5, amplitude=0.3 )) self.play(ApplyWave( tex, rate_func=linear, ripples=4 )) """ def __init__( self, mobject: Mobject, direction: Vector3DLike = UP, amplitude: float = 0.2, wave_func: RateFunction = smooth, time_width: float = 1, ripples: int = 1, run_time: float = 2, **kwargs: Any, ): x_min = mobject.get_left()[0] x_max = mobject.get_right()[0] vect = amplitude * normalize(direction) def wave(t: float) -> float: # Creates a wave with n ripples from a simple rate_func # This wave is build up as follows: # The time is split into 2*ripples phases. In every phase the amplitude # either rises to one or goes down to zero. Consecutive ripples will have # their amplitudes in opposing directions (first ripple from 0 to 1 to 0, # second from 0 to -1 to 0 and so on). This is how two ripples would be # divided into phases: # ####|#### | | # ## | ## | | # ## | ## | | # #### | ####|#### | #### # | | ## | ## # | | ## | ## # | | ####|#### # However, this looks weird in the middle between two ripples. Therefore the # middle phases do actually use only one appropriately scaled version of the # rate like this: # 1 / 4 Time | 2 / 4 Time | 1 / 4 Time # ####|###### | # ## | ### | # ## | ## | # #### | # | #### # | ## | ## # | ### | ## # | ######|#### # Mirrored looks better in the way the wave is used. t = 1 - t # Clamp input if t >= 1 or t <= 0: return 0 phases = ripples * 2 phase = int(t * phases) if phase == 0: # First rising ripple return wave_func(t * phases) elif phase == phases - 1: # last ripple. Rising or falling depending on the number of ripples # The (ripples % 2)-term is used to make this distinction. t -= phase / phases # Time relative to the phase return (1 - wave_func(t * phases)) * (2 * (ripples % 2) - 1) else: # Longer phases: phase = int((phase - 1) / 2) t -= (2 * phase + 1) / phases # Similar to last ripple: return (1 - 2 * wave_func(t * ripples)) * (1 - 2 * ((phase) % 2)) def homotopy( x: float, y: float, z: float, t: float, ) -> tuple[float, float, float]: upper = interpolate(0, 1 + time_width, t) lower = upper - time_width relative_x = inverse_interpolate(x_min, x_max, x) wave_phase = inverse_interpolate(lower, upper, relative_x) nudge = wave(wave_phase) * vect return_value: tuple[float, float, float] = np.array([x, y, z]) + nudge return return_value super().__init__(homotopy, mobject, run_time=run_time, **kwargs) class Wiggle(Animation): """Wiggle a Mobject. Parameters ---------- mobject The mobject to wiggle. scale_value The factor by which the mobject will be temporarily scaled. rotation_angle The wiggle angle. n_wiggles The number of wiggles. scale_about_point The point about which the mobject gets scaled. rotate_about_point The point around which the mobject gets rotated. run_time The duration of the animation Examples -------- .. manim:: ApplyingWaves class ApplyingWaves(Scene): def construct(self): tex = Tex("Wiggle").scale(3) self.play(Wiggle(tex)) self.wait() """ def __init__( self, mobject: Mobject, scale_value: float = 1.1, rotation_angle: float = 0.01 * TAU, n_wiggles: int = 6, scale_about_point: Point3DLike | None = None, rotate_about_point: Point3DLike | None = None, run_time: float = 2, **kwargs: Any, ): self.scale_value = scale_value self.rotation_angle = rotation_angle self.n_wiggles = n_wiggles self.scale_about_point = scale_about_point if scale_about_point is not None: self.scale_about_point = np.array(scale_about_point) self.rotate_about_point = rotate_about_point if rotate_about_point is not None: self.rotate_about_point = np.array(rotate_about_point) super().__init__(mobject, run_time=run_time, **kwargs) def get_scale_about_point(self) -> Point3D: if self.scale_about_point is None: return self.mobject.get_center() return self.scale_about_point def get_rotate_about_point(self) -> Point3D: if self.rotate_about_point is None: return self.mobject.get_center() return self.rotate_about_point def interpolate_submobject( self, submobject: Mobject, starting_submobject: Mobject, alpha: float, ) -> Self: submobject.points[:, :] = starting_submobject.points submobject.scale( interpolate(1, self.scale_value, there_and_back(alpha)), about_point=self.get_scale_about_point(), ) submobject.rotate( wiggle(alpha, self.n_wiggles) * self.rotation_angle, about_point=self.get_rotate_about_point(), ) return self class Circumscribe(Succession): r"""Draw a temporary line surrounding the mobject. Parameters ---------- mobject The mobject to be circumscribed. shape The shape with which to surround the given mobject. Should be either :class:`~.Rectangle` or :class:`~.Circle` fade_in Whether to make the surrounding shape to fade in. It will be drawn otherwise. fade_out Whether to make the surrounding shape to fade out. It will be undrawn otherwise. time_width The time_width of the drawing and undrawing. Gets ignored if either `fade_in` or `fade_out` is `True`. buff The distance between the surrounding shape and the given mobject. color The color of the surrounding shape. run_time The duration of the entire animation. kwargs Additional arguments to be passed to the :class:`~.Succession` constructor Examples -------- .. manim:: UsingCircumscribe class UsingCircumscribe(Scene): def construct(self): lbl = Tex(r"Circum-\\scribe").scale(2) self.add(lbl) self.play(Circumscribe(lbl)) self.play(Circumscribe(lbl, Circle)) self.play(Circumscribe(lbl, fade_out=True)) self.play(Circumscribe(lbl, time_width=2)) self.play(Circumscribe(lbl, Circle, True)) """ def __init__( self, mobject: Mobject, shape: type[Rectangle] | type[Circle] = Rectangle, fade_in: bool = False, fade_out: bool = False, time_width: float = 0.3, buff: float = SMALL_BUFF, color: ParsableManimColor = PURE_YELLOW, run_time: float = 1, stroke_width: float = DEFAULT_STROKE_WIDTH, **kwargs: Any, ): if shape is Rectangle: frame: SurroundingRectangle | Circle = SurroundingRectangle( mobject, color=color, buff=buff, stroke_width=stroke_width, ) elif shape is Circle: frame = Circle(color=color, stroke_width=stroke_width).surround( mobject, buffer_factor=1, ) radius = frame.width / 2 frame.scale((radius + buff) / radius) else: raise ValueError("shape should be either Rectangle or Circle.") if fade_in and fade_out: super().__init__( FadeIn(frame, run_time=run_time / 2), FadeOut(frame, run_time=run_time / 2), **kwargs, ) elif fade_in: frame.reverse_direction() super().__init__( FadeIn(frame, run_time=run_time / 2), Uncreate(frame, run_time=run_time / 2), **kwargs, ) elif fade_out: super().__init__( Create(frame, run_time=run_time / 2), FadeOut(frame, run_time=run_time / 2), **kwargs, ) else: super().__init__( ShowPassingFlash(frame, time_width, run_time=run_time), **kwargs ) class Blink(Succession): """Blink the mobject. Parameters ---------- mobject The mobject to be blinked. time_on The duration that the mobject is shown for one blink. time_off The duration that the mobject is hidden for one blink. blinks The number of blinks hide_at_end Whether to hide the mobject at the end of the animation. kwargs Additional arguments to be passed to the :class:`~.Succession` constructor. Examples -------- .. manim:: BlinkingExample class BlinkingExample(Scene): def construct(self): text = Text("Blinking").scale(1.5) self.add(text) self.play(Blink(text, blinks=3)) """ def __init__( self, mobject: Mobject, time_on: float = 0.5, time_off: float = 0.5, blinks: int = 1, hide_at_end: bool = False, **kwargs: Any, ): animations = [ UpdateFromFunc( mobject, update_function=lambda mob: mob.set_opacity(1.0), run_time=time_on, ), UpdateFromFunc( mobject, update_function=lambda mob: mob.set_opacity(0.0), run_time=time_off, ), ] * blinks if not hide_at_end: animations.append( UpdateFromFunc( mobject, update_function=lambda mob: mob.set_opacity(1.0), run_time=time_on, ), ) super().__init__(*animations, **kwargs) ManimCommunity-manim-1157b74/manim/animation/movement.py000066400000000000000000000137111515024150700233220ustar00rootroot00000000000000"""Animations related to movement.""" from __future__ import annotations __all__ = [ "Homotopy", "SmoothedVectorizedHomotopy", "ComplexHomotopy", "PhaseFlow", "MoveAlongPath", ] from collections.abc import Callable from typing import TYPE_CHECKING, Any import numpy as np from ..animation.animation import Animation from ..utils.rate_functions import linear if TYPE_CHECKING: from typing import Self from manim.mobject.types.vectorized_mobject import VMobject from manim.typing import MappingFunction, Point3D from manim.utils.rate_functions import RateFunction from ..mobject.mobject import Mobject class Homotopy(Animation): """A Homotopy. This is an animation transforming the points of a mobject according to the specified transformation function. With the parameter :math:`t` moving from 0 to 1 throughout the animation and :math:`(x, y, z)` describing the coordinates of the point of a mobject, the function passed to the ``homotopy`` keyword argument should transform the tuple :math:`(x, y, z, t)` to :math:`(x', y', z')`, the coordinates the original point is transformed to at time :math:`t`. Parameters ---------- homotopy A function mapping :math:`(x, y, z, t)` to :math:`(x', y', z')`. mobject The mobject transformed under the given homotopy. run_time The run time of the animation. apply_function_kwargs Keyword arguments propagated to :meth:`.Mobject.apply_function`. kwargs Further keyword arguments passed to the parent class. Examples -------- .. manim:: HomotopyExample class HomotopyExample(Scene): def construct(self): square = Square() def homotopy(x, y, z, t): if t <= 0.25: progress = t / 0.25 return (x, y + progress * 0.2 * np.sin(x), z) else: wave_progress = (t - 0.25) / 0.75 return (x, y + 0.2 * np.sin(x + 10 * wave_progress), z) self.play(Homotopy(homotopy, square, rate_func= linear, run_time=2)) """ def __init__( self, homotopy: Callable[[float, float, float, float], tuple[float, float, float]], mobject: Mobject, run_time: float = 3, apply_function_kwargs: dict[str, Any] | None = None, **kwargs: Any, ): self.homotopy = homotopy self.apply_function_kwargs = ( apply_function_kwargs if apply_function_kwargs is not None else {} ) super().__init__(mobject, run_time=run_time, **kwargs) def function_at_time_t(self, t: float) -> MappingFunction: def mapping_function(p: Point3D) -> Point3D: x, y, z = p return np.array(self.homotopy(x, y, z, t)) return mapping_function def interpolate_submobject( self, submobject: Mobject, starting_submobject: Mobject, alpha: float, ) -> Self: submobject.points = starting_submobject.points submobject.apply_function( self.function_at_time_t(alpha), **self.apply_function_kwargs, ) return self class SmoothedVectorizedHomotopy(Homotopy): def interpolate_submobject( self, submobject: Mobject, starting_submobject: Mobject, alpha: float, ) -> Self: assert isinstance(submobject, VMobject) super().interpolate_submobject(submobject, starting_submobject, alpha) submobject.make_smooth() return self class ComplexHomotopy(Homotopy): def __init__( self, complex_homotopy: Callable[[complex, float], float], mobject: Mobject, **kwargs: Any, ): """Complex Homotopy a function Cx[0, 1] to C""" def homotopy( x: float, y: float, z: float, t: float, ) -> tuple[float, float, float]: c = complex_homotopy(complex(x, y), t) return (c.real, c.imag, z) super().__init__(homotopy, mobject, **kwargs) class PhaseFlow(Animation): def __init__( self, function: Callable[[np.ndarray], np.ndarray], mobject: Mobject, virtual_time: float = 1, suspend_mobject_updating: bool = False, rate_func: RateFunction = linear, **kwargs: Any, ): self.virtual_time = virtual_time self.function = function super().__init__( mobject, suspend_mobject_updating=suspend_mobject_updating, rate_func=rate_func, **kwargs, ) def interpolate_mobject(self, alpha: float) -> None: if hasattr(self, "last_alpha"): dt = self.virtual_time * ( self.rate_func(alpha) - self.rate_func(self.last_alpha) ) self.mobject.apply_function(lambda p: p + dt * self.function(p)) self.last_alpha: float = alpha class MoveAlongPath(Animation): """Make one mobject move along the path of another mobject. .. manim:: MoveAlongPathExample class MoveAlongPathExample(Scene): def construct(self): d1 = Dot().set_color(ORANGE) l1 = Line(LEFT, RIGHT) l2 = VMobject() self.add(d1, l1, l2) l2.add_updater(lambda x: x.become(Line(LEFT, d1.get_center()).set_color(ORANGE))) self.play(MoveAlongPath(d1, l1), rate_func=linear) """ def __init__( self, mobject: Mobject, path: VMobject, suspend_mobject_updating: bool = False, **kwargs: Any, ): self.path = path super().__init__( mobject, suspend_mobject_updating=suspend_mobject_updating, **kwargs ) def interpolate_mobject(self, alpha: float) -> None: point = self.path.point_from_proportion(self.rate_func(alpha)) self.mobject.move_to(point) ManimCommunity-manim-1157b74/manim/animation/numbers.py000066400000000000000000000060071515024150700231430ustar00rootroot00000000000000"""Animations for changing numbers.""" from __future__ import annotations __all__ = ["ChangingDecimal", "ChangeDecimalToValue"] from collections.abc import Callable from typing import Any from manim.mobject.text.numbers import DecimalNumber from ..animation.animation import Animation from ..utils.bezier import interpolate class ChangingDecimal(Animation): """Animate a :class:`~.DecimalNumber` to values specified by a user-supplied function. Parameters ---------- decimal_mob The :class:`~.DecimalNumber` instance to animate. number_update_func A function that returns the number to display at each point in the animation. suspend_mobject_updating If ``True``, the mobject is not updated outside this animation. Raises ------ TypeError If ``decimal_mob`` is not an instance of :class:`~.DecimalNumber`. Examples -------- .. manim:: ChangingDecimalExample class ChangingDecimalExample(Scene): def construct(self): number = DecimalNumber(0) self.add(number) self.play( ChangingDecimal( number, lambda a: 5 * a, run_time=3 ) ) self.wait() """ def __init__( self, decimal_mob: DecimalNumber, number_update_func: Callable[[float], float], suspend_mobject_updating: bool = False, **kwargs: Any, ) -> None: self.check_validity_of_input(decimal_mob) self.number_update_func = number_update_func super().__init__( decimal_mob, suspend_mobject_updating=suspend_mobject_updating, **kwargs ) def check_validity_of_input(self, decimal_mob: DecimalNumber) -> None: if not isinstance(decimal_mob, DecimalNumber): raise TypeError("ChangingDecimal can only take in a DecimalNumber") def interpolate_mobject(self, alpha: float) -> None: self.mobject.set_value(self.number_update_func(self.rate_func(alpha))) # type: ignore[attr-defined] class ChangeDecimalToValue(ChangingDecimal): """Animate a :class:`~.DecimalNumber` to a target value using linear interpolation. Parameters ---------- decimal_mob The :class:`~.DecimalNumber` instance to animate. target_number The target value to transition to. Examples -------- .. manim:: ChangeDecimalToValueExample class ChangeDecimalToValueExample(Scene): def construct(self): number = DecimalNumber(0) self.add(number) self.play(ChangeDecimalToValue(number, 10, run_time=3)) self.wait() """ def __init__( self, decimal_mob: DecimalNumber, target_number: int, **kwargs: Any ) -> None: start_number = decimal_mob.number super().__init__( decimal_mob, lambda a: interpolate(start_number, target_number, a), **kwargs ) ManimCommunity-manim-1157b74/manim/animation/rotation.py000066400000000000000000000134511515024150700233300ustar00rootroot00000000000000"""Animations related to rotation.""" from __future__ import annotations __all__ = ["Rotating", "Rotate"] from collections.abc import Callable from typing import TYPE_CHECKING, Any from ..animation.animation import Animation from ..animation.transform import Transform from ..constants import OUT, PI, TAU from ..utils.rate_functions import linear if TYPE_CHECKING: from ..mobject.mobject import Mobject from ..mobject.opengl.opengl_mobject import OpenGLMobject from ..typing import Point3DLike, Vector3DLike class Rotating(Animation): """Animation that rotates a Mobject. Parameters ---------- mobject The mobject to be rotated. angle The rotation angle in radians. Predefined constants such as ``DEGREES`` can also be used to specify the angle in degrees. axis The rotation axis as a numpy vector. about_point The rotation center. about_edge If ``about_point`` is ``None``, this argument specifies the direction of the bounding box point to be taken as the rotation center. run_time The duration of the animation in seconds. rate_func The function defining the animation progress based on the relative runtime (see :mod:`~.rate_functions`) . **kwargs Additional keyword arguments passed to :class:`~.Animation`. Examples -------- .. manim:: RotatingDemo class RotatingDemo(Scene): def construct(self): circle = Circle(radius=1, color=BLUE) line = Line(start=ORIGIN, end=RIGHT) arrow = Arrow(start=ORIGIN, end=RIGHT, buff=0, color=GOLD) vg = VGroup(circle,line,arrow) self.add(vg) anim_kw = {"about_point": arrow.get_start(), "run_time": 1} self.play(Rotating(arrow, 180*DEGREES, **anim_kw)) self.play(Rotating(arrow, PI, **anim_kw)) self.play(Rotating(vg, PI, about_point=RIGHT)) self.play(Rotating(vg, PI, axis=UP, about_point=ORIGIN)) self.play(Rotating(vg, PI, axis=RIGHT, about_edge=UP)) self.play(vg.animate.move_to(ORIGIN)) .. manim:: RotatingDifferentAxis class RotatingDifferentAxis(ThreeDScene): def construct(self): axes = ThreeDAxes() cube = Cube() arrow2d = Arrow(start=[0, -1.2, 1], end=[0, 1.2, 1], color=YELLOW_E) cube_group = VGroup(cube,arrow2d) self.set_camera_orientation(gamma=0, phi=40*DEGREES, theta=40*DEGREES) self.add(axes, cube_group) play_kw = {"run_time": 1.5} self.play(Rotating(cube_group, PI), **play_kw) self.play(Rotating(cube_group, PI, axis=UP), **play_kw) self.play(Rotating(cube_group, 180*DEGREES, axis=RIGHT), **play_kw) self.wait(0.5) See also -------- :class:`~.Rotate`, :meth:`~.Mobject.rotate` """ def __init__( self, mobject: Mobject, angle: float = TAU, axis: Vector3DLike = OUT, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, run_time: float = 5, rate_func: Callable[[float], float] = linear, **kwargs: Any, ) -> None: self.angle = angle self.axis = axis self.about_point = about_point self.about_edge = about_edge super().__init__(mobject, run_time=run_time, rate_func=rate_func, **kwargs) def interpolate_mobject(self, alpha: float) -> None: self.mobject.become(self.starting_mobject) self.mobject.rotate( self.rate_func(alpha) * self.angle, axis=self.axis, about_point=self.about_point, about_edge=self.about_edge, ) class Rotate(Transform): """Animation that rotates a Mobject. Parameters ---------- mobject The mobject to be rotated. angle The rotation angle. axis The rotation axis as a numpy vector. about_point The rotation center. about_edge If ``about_point`` is ``None``, this argument specifies the direction of the bounding box point to be taken as the rotation center. Examples -------- .. manim:: UsingRotate class UsingRotate(Scene): def construct(self): self.play( Rotate( Square(side_length=0.5).shift(UP * 2), angle=2*PI, about_point=ORIGIN, rate_func=linear, ), Rotate(Square(side_length=0.5), angle=2*PI, rate_func=linear), ) See also -------- :class:`~.Rotating`, :meth:`~.Mobject.rotate` """ def __init__( self, mobject: Mobject, angle: float = PI, axis: Vector3DLike = OUT, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, **kwargs: Any, ) -> None: if "path_arc" not in kwargs: kwargs["path_arc"] = angle if "path_arc_axis" not in kwargs: kwargs["path_arc_axis"] = axis self.angle = angle self.axis = axis self.about_edge = about_edge self.about_point = about_point if self.about_point is None: self.about_point = mobject.get_center() super().__init__(mobject, path_arc_centers=self.about_point, **kwargs) def create_target(self) -> Mobject | OpenGLMobject: target = self.mobject.copy() target.rotate( self.angle, axis=self.axis, about_point=self.about_point, about_edge=self.about_edge, ) return target ManimCommunity-manim-1157b74/manim/animation/specialized.py000066400000000000000000000056011515024150700237630ustar00rootroot00000000000000from __future__ import annotations __all__ = ["Broadcast"] from collections.abc import Sequence from typing import Any from manim.animation.transform import Restore from manim.mobject.mobject import Mobject from ..constants import * from .composition import LaggedStart class Broadcast(LaggedStart): """Broadcast a mobject starting from an ``initial_width``, up to the actual size of the mobject. Parameters ---------- mobject The mobject to be broadcast. focal_point The center of the broadcast, by default ORIGIN. n_mobs The number of mobjects that emerge from the focal point, by default 5. initial_opacity The starting stroke opacity of the mobjects emitted from the broadcast, by default 1. final_opacity The final stroke opacity of the mobjects emitted from the broadcast, by default 0. initial_width The initial width of the mobjects, by default 0.0. remover Whether the mobjects should be removed from the scene after the animation, by default True. lag_ratio The time between each iteration of the mobject, by default 0.2. run_time The total duration of the animation, by default 3. kwargs Additional arguments to be passed to :class:`~.LaggedStart`. Examples --------- .. manim:: BroadcastExample class BroadcastExample(Scene): def construct(self): mob = Circle(radius=4, color=TEAL_A) self.play(Broadcast(mob)) """ def __init__( self, mobject: Mobject, focal_point: Sequence[float] = ORIGIN, n_mobs: int = 5, initial_opacity: float = 1, final_opacity: float = 0, initial_width: float = 0.0, remover: bool = True, lag_ratio: float = 0.2, run_time: float = 3, **kwargs: Any, ): self.focal_point = focal_point self.n_mobs = n_mobs self.initial_opacity = initial_opacity self.final_opacity = final_opacity self.initial_width = initial_width anims = [] # Works by saving the mob that is passed into the animation, scaling it to 0 (or the initial_width) and then restoring the original mob. fill_o = bool(mobject.fill_opacity) for _ in range(self.n_mobs): mob = mobject.copy() if fill_o: mob.set_opacity(self.final_opacity) else: mob.set_stroke(opacity=self.final_opacity) mob.move_to(self.focal_point) mob.save_state() mob.set(width=self.initial_width) if fill_o: mob.set_opacity(self.initial_opacity) else: mob.set_stroke(opacity=self.initial_opacity) anims.append(Restore(mob, remover=remover)) super().__init__(*anims, run_time=run_time, lag_ratio=lag_ratio, **kwargs) ManimCommunity-manim-1157b74/manim/animation/speedmodifier.py000066400000000000000000000232651515024150700243140ustar00rootroot00000000000000"""Utilities for modifying the speed at which animations are played.""" from __future__ import annotations import inspect import types from collections.abc import Callable from typing import TYPE_CHECKING from numpy import piecewise from ..animation.animation import Animation, Wait, prepare_animation from ..animation.composition import AnimationGroup from ..mobject.mobject import Mobject, _AnimationBuilder from ..scene.scene import Scene if TYPE_CHECKING: from ..mobject.mobject import Updater __all__ = ["ChangeSpeed"] class ChangeSpeed(Animation): """Modifies the speed of passed animation. :class:`AnimationGroup` with different ``lag_ratio`` can also be used which combines multiple animations into one. The ``run_time`` of the passed animation is changed to modify the speed. Parameters ---------- anim Animation of which the speed is to be modified. speedinfo Contains nodes (percentage of ``run_time``) and its corresponding speed factor. rate_func Overrides ``rate_func`` of passed animation, applied before changing speed. Examples -------- .. manim:: SpeedModifierExample class SpeedModifierExample(Scene): def construct(self): a = Dot().shift(LEFT * 4) b = Dot().shift(RIGHT * 4) self.add(a, b) self.play( ChangeSpeed( AnimationGroup( a.animate(run_time=1).shift(RIGHT * 8), b.animate(run_time=1).shift(LEFT * 8), ), speedinfo={0.3: 1, 0.4: 0.1, 0.6: 0.1, 1: 1}, rate_func=linear, ) ) .. manim:: SpeedModifierUpdaterExample class SpeedModifierUpdaterExample(Scene): def construct(self): a = Dot().shift(LEFT * 4) self.add(a) ChangeSpeed.add_updater(a, lambda x, dt: x.shift(RIGHT * 4 * dt)) self.play( ChangeSpeed( Wait(2), speedinfo={0.4: 1, 0.5: 0.2, 0.8: 0.2, 1: 1}, affects_speed_updaters=True, ) ) .. manim:: SpeedModifierUpdaterExample2 class SpeedModifierUpdaterExample2(Scene): def construct(self): a = Dot().shift(LEFT * 4) self.add(a) ChangeSpeed.add_updater(a, lambda x, dt: x.shift(RIGHT * 4 * dt)) self.wait() self.play( ChangeSpeed( Wait(), speedinfo={1: 0}, affects_speed_updaters=True, ) ) """ dt = 0 is_changing_dt = False def __init__( self, anim: Animation | _AnimationBuilder, speedinfo: dict[float, float], rate_func: Callable[[float], float] | None = None, affects_speed_updaters: bool = True, **kwargs, ) -> None: if issubclass(type(anim), AnimationGroup): self.anim = type(anim)( *map(self.setup, anim.animations), group=anim.group, run_time=anim.run_time, rate_func=anim.rate_func, lag_ratio=anim.lag_ratio, ) else: self.anim = self.setup(anim) if affects_speed_updaters: assert ChangeSpeed.is_changing_dt is False, ( "Only one animation at a time can play that changes speed (dt) for ChangeSpeed updaters" ) ChangeSpeed.is_changing_dt = True self.t = 0 self.affects_speed_updaters = affects_speed_updaters self.rate_func = self.anim.rate_func if rate_func is None else rate_func # A function where, f(0) = 0, f'(0) = initial speed, f'( f-1(1) ) = final speed # Following function obtained when conditions applied to vertical parabola self.speed_modifier = lambda x, init_speed, final_speed: ( (final_speed**2 - init_speed**2) * x**2 / 4 + init_speed * x ) # f-1(1), returns x for which f(x) = 1 in `speed_modifier` function self.f_inv_1 = lambda init_speed, final_speed: 2 / (init_speed + final_speed) # if speed factors for the starting node (0) and the final node (1) are # not set, set them to 1 and the penultimate factor, respectively if 0 not in speedinfo: speedinfo[0] = 1 if 1 not in speedinfo: speedinfo[1] = sorted(speedinfo.items())[-1][1] self.speedinfo = dict(sorted(speedinfo.items())) self.functions = [] self.conditions = [] # Get the time taken by amimation if `run_time` is assumed to be 1 scaled_total_time = self.get_scaled_total_time() prevnode = 0 init_speed = self.speedinfo[0] curr_time = 0 for node, final_speed in list(self.speedinfo.items())[1:]: dur = node - prevnode def condition( t, curr_time=curr_time, init_speed=init_speed, final_speed=final_speed, dur=dur, ): lower_bound = curr_time / scaled_total_time upper_bound = ( curr_time + self.f_inv_1(init_speed, final_speed) * dur ) / scaled_total_time return lower_bound <= t <= upper_bound self.conditions.append(condition) def function( t, curr_time=curr_time, init_speed=init_speed, final_speed=final_speed, dur=dur, prevnode=prevnode, ): return ( self.speed_modifier( (scaled_total_time * t - curr_time) / dur, init_speed, final_speed, ) * dur + prevnode ) self.functions.append(function) curr_time += self.f_inv_1(init_speed, final_speed) * dur prevnode = node init_speed = final_speed def func(t): if t == 1: ChangeSpeed.is_changing_dt = False new_t = piecewise( self.rate_func(t), [condition(self.rate_func(t)) for condition in self.conditions], self.functions, ) if self.affects_speed_updaters: ChangeSpeed.dt = (new_t - self.t) * self.anim.run_time self.t = new_t return new_t self.anim.set_rate_func(func) super().__init__( self.anim.mobject, rate_func=self.rate_func, run_time=scaled_total_time * self.anim.run_time, **kwargs, ) def setup(self, anim): if type(anim) is Wait: anim.interpolate = types.MethodType( lambda self, alpha: self.rate_func(alpha), anim ) return prepare_animation(anim) def get_scaled_total_time(self) -> float: """The time taken by the animation under the assumption that the ``run_time`` is 1.""" prevnode = 0 init_speed = self.speedinfo[0] total_time = 0 for node, final_speed in list(self.speedinfo.items())[1:]: dur = node - prevnode total_time += dur * self.f_inv_1(init_speed, final_speed) prevnode = node init_speed = final_speed return total_time @classmethod def add_updater( cls, mobject: Mobject, update_function: Updater, index: int | None = None, call_updater: bool = False, ): """This static method can be used to apply speed change to updaters. This updater will follow speed and rate function of any :class:`.ChangeSpeed` animation that is playing with ``affects_speed_updaters=True``. By default, updater functions added via the usual :meth:`.Mobject.add_updater` method do not respect the change of animation speed. Parameters ---------- mobject The mobject to which the updater should be attached. update_function The function that is called whenever a new frame is rendered. index The position in the list of the mobject's updaters at which the function should be inserted. call_updater If ``True``, calls the update function when attaching it to the mobject. See also -------- :class:`.ChangeSpeed` :meth:`.Mobject.add_updater` """ if "dt" in inspect.signature(update_function).parameters: mobject.add_updater( lambda mob, dt: update_function( mob, ChangeSpeed.dt if ChangeSpeed.is_changing_dt else dt ), index=index, call_updater=call_updater, ) else: mobject.add_updater(update_function, index=index, call_updater=call_updater) def interpolate(self, alpha: float) -> None: self.anim.interpolate(alpha) def update_mobjects(self, dt: float) -> None: self.anim.update_mobjects(dt) def finish(self) -> None: ChangeSpeed.is_changing_dt = False self.anim.finish() def begin(self) -> None: self.anim.begin() def clean_up_from_scene(self, scene: Scene) -> None: self.anim.clean_up_from_scene(scene) def _setup_scene(self, scene) -> None: self.anim._setup_scene(scene) ManimCommunity-manim-1157b74/manim/animation/transform.py000066400000000000000000000745231515024150700235130ustar00rootroot00000000000000"""Animations transforming one mobject into another.""" from __future__ import annotations __all__ = [ "Transform", "ReplacementTransform", "TransformFromCopy", "ClockwiseTransform", "CounterclockwiseTransform", "MoveToTarget", "ApplyMethod", "ApplyPointwiseFunction", "ApplyPointwiseFunctionToCenter", "FadeToColor", "FadeTransform", "FadeTransformPieces", "ScaleInPlace", "ShrinkToCenter", "Restore", "ApplyFunction", "ApplyMatrix", "ApplyComplexFunction", "CyclicReplace", "Swap", "TransformAnimations", ] import inspect import types from collections.abc import Callable, Iterable, Sequence from typing import TYPE_CHECKING, Any import numpy as np from manim.data_structures import MethodWithArgs from manim.mobject.opengl.opengl_mobject import OpenGLGroup, OpenGLMobject from .. import config from ..animation.animation import Animation from ..constants import ( DEFAULT_POINTWISE_FUNCTION_RUN_TIME, DEGREES, ORIGIN, OUT, RendererType, ) from ..mobject.mobject import Group, Mobject from ..utils.paths import path_along_arc, path_along_circles from ..utils.rate_functions import smooth, squish_rate_func if TYPE_CHECKING: from ..scene.scene import Scene from ..typing import Point3DLike, Point3DLike_Array class Transform(Animation): """A Transform transforms a Mobject into a target Mobject. Parameters ---------- mobject The :class:`.Mobject` to be transformed. It will be mutated to become the ``target_mobject``. target_mobject The target of the transformation. path_func A function defining the path that the points of the ``mobject`` are being moved along until they match the points of the ``target_mobject``, see :mod:`.utils.paths`. path_arc The arc angle (in radians) that the points of ``mobject`` will follow to reach the points of the target if using a circular path arc, see ``path_arc_centers``. See also :func:`manim.utils.paths.path_along_arc`. path_arc_axis The axis to rotate along if using a circular path arc, see ``path_arc_centers``. path_arc_centers The center of the circular arcs along which the points of ``mobject`` are moved by the transformation. If this is set and ``path_func`` is not set, then a ``path_along_circles`` path will be generated using the ``path_arc`` parameters and stored in ``path_func``. If ``path_func`` is set, this and the other ``path_arc`` fields are set as attributes, but a ``path_func`` is not generated from it. replace_mobject_with_target_in_scene Controls which mobject is replaced when the transformation is complete. If set to True, ``mobject`` will be removed from the scene and ``target_mobject`` will replace it. Otherwise, ``target_mobject`` is never added and ``mobject`` just takes its shape. Examples -------- .. manim :: TransformPathArc class TransformPathArc(Scene): def construct(self): def make_arc_path(start, end, arc_angle): points = [] p_fn = path_along_arc(arc_angle) # alpha animates between 0.0 and 1.0, where 0.0 # is the beginning of the animation and 1.0 is the end. for alpha in range(0, 11): points.append(p_fn(start, end, alpha / 10.0)) path = VMobject(stroke_color=YELLOW) path.set_points_smoothly(points) return path left = Circle(stroke_color=BLUE_E, fill_opacity=1.0, radius=0.5).move_to(LEFT * 2) colors = [TEAL_A, TEAL_B, TEAL_C, TEAL_D, TEAL_E, GREEN_A] # Positive angles move counter-clockwise, negative angles move clockwise. examples = [-90, 0, 30, 90, 180, 270] anims = [] for idx, angle in enumerate(examples): left_c = left.copy().shift((3 - idx) * UP) left_c.fill_color = colors[idx] right_c = left_c.copy().shift(4 * RIGHT) path_arc = make_arc_path(left_c.get_center(), right_c.get_center(), arc_angle=angle * DEGREES) desc = Text('%dยฐ' % examples[idx]).next_to(left_c, LEFT) # Make the circles in front of the text in front of the arcs. self.add( path_arc.set_z_index(1), desc.set_z_index(2), left_c.set_z_index(3), ) anims.append(Transform(left_c, right_c, path_arc=angle * DEGREES)) self.play(*anims, run_time=2) self.wait() See also -------- :class:`~.ReplacementTransform`, :meth:`~.Mobject.interpolate`, :meth:`~.Mobject.align_data` """ def __init__( self, mobject: Mobject | None, target_mobject: Mobject | None = None, path_func: Callable | None = None, path_arc: float = 0, path_arc_axis: np.ndarray = OUT, path_arc_centers: Point3DLike | Point3DLike_Array | None = None, replace_mobject_with_target_in_scene: bool = False, **kwargs, ) -> None: self.path_arc_axis: np.ndarray = path_arc_axis self.path_arc_centers: Point3DLike | Point3DLike_Array | None = path_arc_centers self.path_arc: float = path_arc # path_func is a property a few lines below so it doesn't need to be set in any case if path_func is not None: self.path_func: Callable = path_func elif self.path_arc_centers is not None: self.path_func = path_along_circles( path_arc, self.path_arc_centers, self.path_arc_axis, ) self.replace_mobject_with_target_in_scene: bool = ( replace_mobject_with_target_in_scene ) self.target_mobject: Mobject = ( target_mobject if target_mobject is not None else Mobject() ) super().__init__(mobject, **kwargs) @property def path_arc(self) -> float: return self._path_arc @path_arc.setter def path_arc(self, path_arc: float) -> None: self._path_arc = path_arc self._path_func = path_along_arc( arc_angle=self._path_arc, axis=self.path_arc_axis, ) @property def path_func( self, ) -> Callable[ [Iterable[np.ndarray], Iterable[np.ndarray], float], Iterable[np.ndarray], ]: return self._path_func @path_func.setter def path_func( self, path_func: Callable[ [Iterable[np.ndarray], Iterable[np.ndarray], float], Iterable[np.ndarray], ], ) -> None: if path_func is not None: self._path_func = path_func def begin(self) -> None: # Use a copy of target_mobject for the align_data # call so that the actual target_mobject stays # preserved. self.target_mobject = self.create_target() self.target_copy = self.target_mobject.copy() # Note, this potentially changes the structure # of both mobject and target_mobject if config.renderer == RendererType.OPENGL: self.mobject.align_data_and_family(self.target_copy) else: self.mobject.align_data(self.target_copy) super().begin() def create_target(self) -> Mobject | OpenGLMobject: # Has no meaningful effect here, but may be useful # in subclasses return self.target_mobject def clean_up_from_scene(self, scene: Scene) -> None: super().clean_up_from_scene(scene) if self.replace_mobject_with_target_in_scene: scene.replace(self.mobject, self.target_mobject) def get_all_mobjects(self) -> Sequence[Mobject]: return [ self.mobject, self.starting_mobject, self.target_mobject, self.target_copy, ] def get_all_families_zipped(self) -> Iterable[tuple]: # more precise typing? mobs = [ self.mobject, self.starting_mobject, self.target_copy, ] if config.renderer == RendererType.OPENGL: return zip(*(mob.get_family() for mob in mobs), strict=True) return zip(*(mob.family_members_with_points() for mob in mobs), strict=True) def interpolate_submobject( self, submobject: Mobject, starting_submobject: Mobject, target_copy: Mobject, alpha: float, ) -> Transform: submobject.interpolate(starting_submobject, target_copy, alpha, self.path_func) return self class ReplacementTransform(Transform): """Replaces and morphs a mobject into a target mobject. Parameters ---------- mobject The starting :class:`~.Mobject`. target_mobject The target :class:`~.Mobject`. kwargs Further keyword arguments that are passed to :class:`Transform`. Examples -------- .. manim:: ReplacementTransformOrTransform :quality: low class ReplacementTransformOrTransform(Scene): def construct(self): # set up the numbers r_transform = VGroup(*[Integer(i) for i in range(1,4)]) text_1 = Text("ReplacementTransform", color=RED) r_transform.add(text_1) transform = VGroup(*[Integer(i) for i in range(4,7)]) text_2 = Text("Transform", color=BLUE) transform.add(text_2) ints = VGroup(r_transform, transform) texts = VGroup(text_1, text_2).scale(0.75) r_transform.arrange(direction=UP, buff=1) transform.arrange(direction=UP, buff=1) ints.arrange(buff=2) self.add(ints, texts) # The mobs replace each other and none are left behind self.play(ReplacementTransform(r_transform[0], r_transform[1])) self.play(ReplacementTransform(r_transform[1], r_transform[2])) # The mobs linger after the Transform() self.play(Transform(transform[0], transform[1])) self.play(Transform(transform[1], transform[2])) self.wait() """ def __init__(self, mobject: Mobject, target_mobject: Mobject, **kwargs) -> None: super().__init__( mobject, target_mobject, replace_mobject_with_target_in_scene=True, **kwargs ) class TransformFromCopy(Transform): """Preserves a copy of the original VMobject and transforms only it's copy to the target VMobject""" def __init__(self, mobject: Mobject, target_mobject: Mobject, **kwargs) -> None: super().__init__(target_mobject, mobject, **kwargs) def interpolate(self, alpha: float) -> None: super().interpolate(1 - alpha) class ClockwiseTransform(Transform): """Transforms the points of a mobject along a clockwise oriented arc. See also -------- :class:`.Transform`, :class:`.CounterclockwiseTransform` Examples -------- .. manim:: ClockwiseExample class ClockwiseExample(Scene): def construct(self): dl, dr = Dot(), Dot() sl, sr = Square(), Square() VGroup(dl, sl).arrange(DOWN).shift(2*LEFT) VGroup(dr, sr).arrange(DOWN).shift(2*RIGHT) self.add(dl, dr) self.wait() self.play( ClockwiseTransform(dl, sl), Transform(dr, sr) ) self.wait() """ def __init__( self, mobject: Mobject, target_mobject: Mobject, path_arc: float = -np.pi, **kwargs, ) -> None: super().__init__(mobject, target_mobject, path_arc=path_arc, **kwargs) class CounterclockwiseTransform(Transform): """Transforms the points of a mobject along a counterclockwise oriented arc. See also -------- :class:`.Transform`, :class:`.ClockwiseTransform` Examples -------- .. manim:: CounterclockwiseTransform_vs_Transform class CounterclockwiseTransform_vs_Transform(Scene): def construct(self): # set up the numbers c_transform = VGroup(DecimalNumber(number=3.141, num_decimal_places=3), DecimalNumber(number=1.618, num_decimal_places=3)) text_1 = Text("CounterclockwiseTransform", color=RED) c_transform.add(text_1) transform = VGroup(DecimalNumber(number=1.618, num_decimal_places=3), DecimalNumber(number=3.141, num_decimal_places=3)) text_2 = Text("Transform", color=BLUE) transform.add(text_2) ints = VGroup(c_transform, transform) texts = VGroup(text_1, text_2).scale(0.75) c_transform.arrange(direction=UP, buff=1) transform.arrange(direction=UP, buff=1) ints.arrange(buff=2) self.add(ints, texts) # The mobs move in clockwise direction for ClockwiseTransform() self.play(CounterclockwiseTransform(c_transform[0], c_transform[1])) # The mobs move straight up for Transform() self.play(Transform(transform[0], transform[1])) """ def __init__( self, mobject: Mobject, target_mobject: Mobject, path_arc: float = np.pi, **kwargs, ) -> None: super().__init__(mobject, target_mobject, path_arc=path_arc, **kwargs) class MoveToTarget(Transform): """Transforms a mobject to the mobject stored in its ``target`` attribute. After calling the :meth:`~.Mobject.generate_target` method, the :attr:`target` attribute of the mobject is populated with a copy of it. After modifying the attribute, playing the :class:`.MoveToTarget` animation transforms the original mobject into the modified one stored in the :attr:`target` attribute. Examples -------- .. manim:: MoveToTargetExample class MoveToTargetExample(Scene): def construct(self): c = Circle() c.generate_target() c.target.set_fill(color=GREEN, opacity=0.5) c.target.shift(2*RIGHT + UP).scale(0.5) self.add(c) self.play(MoveToTarget(c)) """ def __init__(self, mobject: Mobject, **kwargs) -> None: self.check_validity_of_input(mobject) super().__init__(mobject, mobject.target, **kwargs) def check_validity_of_input(self, mobject: Mobject) -> None: if not hasattr(mobject, "target"): raise ValueError( "MoveToTarget called on mobjectwithout attribute 'target'", ) class _MethodAnimation(MoveToTarget): def __init__(self, mobject: Mobject, methods: list[MethodWithArgs]) -> None: self.methods = methods super().__init__(mobject) def finish(self) -> None: for item in self.methods: item.method.__func__(self.mobject, *item.args, **item.kwargs) super().finish() class ApplyMethod(Transform): """Animates a mobject by applying a method. Note that only the method needs to be passed to this animation, it is not required to pass the corresponding mobject. Furthermore, this animation class only works if the method returns the modified mobject. Parameters ---------- method The method that will be applied in the animation. args Any positional arguments to be passed when applying the method. kwargs Any keyword arguments passed to :class:`~.Transform`. """ def __init__( self, method: Callable, *args, **kwargs ) -> None: # method typing (we want to specify Mobject method)? for args? self.check_validity_of_input(method) self.method = method self.method_args = args super().__init__(method.__self__, **kwargs) def check_validity_of_input(self, method: Callable) -> None: if not inspect.ismethod(method): raise ValueError( "Whoops, looks like you accidentally invoked " "the method you want to animate", ) assert isinstance(method.__self__, (Mobject, OpenGLMobject)) def create_target(self) -> Mobject: method = self.method # Make sure it's a list so that args.pop() works args = list(self.method_args) if len(args) > 0 and isinstance(args[-1], dict): method_kwargs = args.pop() else: method_kwargs = {} target = method.__self__.copy() method.__func__(target, *args, **method_kwargs) return target class ApplyPointwiseFunction(ApplyMethod): """Animation that applies a pointwise function to a mobject. Examples -------- .. manim:: WarpSquare :quality: low class WarpSquare(Scene): def construct(self): square = Square() self.play( ApplyPointwiseFunction( lambda point: complex_to_R3(np.exp(R3_to_complex(point))), square ) ) self.wait() """ def __init__( self, function: types.MethodType, mobject: Mobject, run_time: float = DEFAULT_POINTWISE_FUNCTION_RUN_TIME, **kwargs, ) -> None: super().__init__(mobject.apply_function, function, run_time=run_time, **kwargs) class ApplyPointwiseFunctionToCenter(ApplyPointwiseFunction): def __init__(self, function: types.MethodType, mobject: Mobject, **kwargs) -> None: self.function = function super().__init__(mobject.move_to, **kwargs) def begin(self) -> None: self.method_args = [self.function(self.mobject.get_center())] super().begin() class FadeToColor(ApplyMethod): """Animation that changes color of a mobject. Examples -------- .. manim:: FadeToColorExample class FadeToColorExample(Scene): def construct(self): self.play(FadeToColor(Text("Hello World!"), color=RED)) """ def __init__(self, mobject: Mobject, color: str, **kwargs) -> None: super().__init__(mobject.set_color, color, **kwargs) class ScaleInPlace(ApplyMethod): """Animation that scales a mobject by a certain factor. Examples -------- .. manim:: ScaleInPlaceExample class ScaleInPlaceExample(Scene): def construct(self): self.play(ScaleInPlace(Text("Hello World!"), 2)) """ def __init__(self, mobject: Mobject, scale_factor: float, **kwargs) -> None: super().__init__(mobject.scale, scale_factor, **kwargs) class ShrinkToCenter(ScaleInPlace): """Animation that makes a mobject shrink to center. Examples -------- .. manim:: ShrinkToCenterExample class ShrinkToCenterExample(Scene): def construct(self): self.play(ShrinkToCenter(Text("Hello World!"))) """ def __init__(self, mobject: Mobject, **kwargs) -> None: super().__init__(mobject, 0, **kwargs) class Restore(ApplyMethod): """Transforms a mobject to its last saved state. To save the state of a mobject, use the :meth:`~.Mobject.save_state` method. Examples -------- .. manim:: RestoreExample class RestoreExample(Scene): def construct(self): s = Square() s.save_state() self.play(FadeIn(s)) self.play(s.animate.set_color(PURPLE).set_opacity(0.5).shift(2*LEFT).scale(3)) self.play(s.animate.shift(5*DOWN).rotate(PI/4)) self.wait() self.play(Restore(s), run_time=2) """ def __init__(self, mobject: Mobject, **kwargs) -> None: super().__init__(mobject.restore, **kwargs) class ApplyFunction(Transform): def __init__(self, function: types.MethodType, mobject: Mobject, **kwargs) -> None: self.function = function super().__init__(mobject, **kwargs) def create_target(self) -> Any: target = self.function(self.mobject.copy()) if not isinstance(target, (Mobject, OpenGLMobject)): raise TypeError( "Functions passed to ApplyFunction must return object of type Mobject", ) return target class ApplyMatrix(ApplyPointwiseFunction): """Applies a matrix transform to an mobject. Parameters ---------- matrix The transformation matrix. mobject The :class:`~.Mobject`. about_point The origin point for the transform. Defaults to ``ORIGIN``. kwargs Further keyword arguments that are passed to :class:`ApplyPointwiseFunction`. Examples -------- .. manim:: ApplyMatrixExample class ApplyMatrixExample(Scene): def construct(self): matrix = [[1, 1], [0, 2/3]] self.play(ApplyMatrix(matrix, Text("Hello World!")), ApplyMatrix(matrix, NumberPlane())) """ def __init__( self, matrix: np.ndarray, mobject: Mobject, about_point: np.ndarray = ORIGIN, **kwargs, ) -> None: matrix = self.initialize_matrix(matrix) def func(p): return np.dot(p - about_point, matrix.T) + about_point super().__init__(func, mobject, **kwargs) def initialize_matrix(self, matrix: np.ndarray) -> np.ndarray: matrix = np.array(matrix) if matrix.shape == (2, 2): new_matrix = np.identity(3) new_matrix[:2, :2] = matrix matrix = new_matrix elif matrix.shape != (3, 3): raise ValueError("Matrix has bad dimensions") return matrix class ApplyComplexFunction(ApplyMethod): def __init__(self, function: types.MethodType, mobject: Mobject, **kwargs) -> None: self.function = function method = mobject.apply_complex_function super().__init__(method, function, **kwargs) def _init_path_func(self) -> None: func1 = self.function(complex(1)) self.path_arc = np.log(func1).imag super()._init_path_func() ### class CyclicReplace(Transform): """An animation moving mobjects cyclically. In particular, this means: the first mobject takes the place of the second mobject, the second one takes the place of the third mobject, and so on. The last mobject takes the place of the first one. Parameters ---------- mobjects List of mobjects to be transformed. path_arc The angle of the arc (in radians) that the mobjects will follow to reach their target. kwargs Further keyword arguments that are passed to :class:`.Transform`. Examples -------- .. manim :: CyclicReplaceExample class CyclicReplaceExample(Scene): def construct(self): group = VGroup(Square(), Circle(), Triangle(), Star()) group.arrange(RIGHT) self.add(group) for _ in range(4): self.play(CyclicReplace(*group)) """ def __init__( self, *mobjects: Mobject, path_arc: float = 90 * DEGREES, **kwargs ) -> None: self.group = Group(*mobjects) super().__init__(self.group, path_arc=path_arc, **kwargs) def create_target(self) -> Group: target = self.group.copy() cycled_targets = [target[-1], *target[:-1]] for m1, m2 in zip(cycled_targets, self.group, strict=True): m1.move_to(m2) return target class Swap(CyclicReplace): pass # Renaming, more understandable for two entries # TODO, this may be deprecated...worth reimplementing? class TransformAnimations(Transform): def __init__( self, start_anim: Animation, end_anim: Animation, rate_func: Callable = squish_rate_func(smooth), **kwargs, ) -> None: self.start_anim = start_anim self.end_anim = end_anim if "run_time" in kwargs: self.run_time = kwargs.pop("run_time") else: self.run_time = max(start_anim.run_time, end_anim.run_time) for anim in start_anim, end_anim: anim.set_run_time(self.run_time) if ( start_anim.starting_mobject is not None and end_anim.starting_mobject is not None and start_anim.starting_mobject.get_num_points() != end_anim.starting_mobject.get_num_points() ): start_anim.starting_mobject.align_data(end_anim.starting_mobject) for anim in start_anim, end_anim: if isinstance(anim, Transform) and anim.starting_mobject is not None: anim.starting_mobject.align_data(anim.target_mobject) super().__init__( start_anim.mobject, end_anim.mobject, rate_func=rate_func, **kwargs ) # Rewire starting and ending mobjects start_anim.mobject = self.starting_mobject end_anim.mobject = self.target_mobject def interpolate(self, alpha: float) -> None: self.start_anim.interpolate(alpha) self.end_anim.interpolate(alpha) super().interpolate(alpha) class FadeTransform(Transform): """Fades one mobject into another. Parameters ---------- mobject The starting :class:`~.Mobject`. target_mobject The target :class:`~.Mobject`. stretch Controls whether the target :class:`~.Mobject` is stretched during the animation. Default: ``True``. dim_to_match If the target mobject is not stretched automatically, this allows to adjust the initial scale of the target :class:`~.Mobject` while it is shifted in. Setting this to 0, 1, and 2, respectively, matches the length of the target with the length of the starting :class:`~.Mobject` in x, y, and z direction, respectively. kwargs Further keyword arguments are passed to the parent class. Examples -------- .. manim:: DifferentFadeTransforms class DifferentFadeTransforms(Scene): def construct(self): starts = [Rectangle(width=4, height=1) for _ in range(3)] VGroup(*starts).arrange(DOWN, buff=1).shift(3*LEFT) targets = [Circle(fill_opacity=1).scale(0.25) for _ in range(3)] VGroup(*targets).arrange(DOWN, buff=1).shift(3*RIGHT) self.play(*[FadeIn(s) for s in starts]) self.play( FadeTransform(starts[0], targets[0], stretch=True), FadeTransform(starts[1], targets[1], stretch=False, dim_to_match=0), FadeTransform(starts[2], targets[2], stretch=False, dim_to_match=1) ) self.play(*[FadeOut(mobj) for mobj in self.mobjects]) """ def __init__(self, mobject, target_mobject, stretch=True, dim_to_match=1, **kwargs): self.to_add_on_completion = target_mobject self.stretch = stretch self.dim_to_match = dim_to_match mobject.save_state() if config.renderer == RendererType.OPENGL: group = OpenGLGroup(mobject, target_mobject.copy()) else: group = Group(mobject, target_mobject.copy()) super().__init__(group, **kwargs) def begin(self): """Initial setup for the animation. The mobject to which this animation is bound is a group consisting of both the starting and the ending mobject. At the start, the ending mobject replaces the starting mobject (and is completely faded). In the end, it is set to be the other way around. """ self.ending_mobject = self.mobject.copy() Animation.begin(self) # Both 'start' and 'end' consists of the source and target mobjects. # At the start, the target should be faded replacing the source, # and at the end it should be the other way around. start, end = self.starting_mobject, self.ending_mobject for m0, m1 in ((start[1], start[0]), (end[0], end[1])): self.ghost_to(m0, m1) def ghost_to(self, source, target): """Replaces the source by the target and sets the opacity to 0. If the provided target has no points, and thus a location of [0, 0, 0] the source will simply fade out where it currently is. """ # mobject.replace() does not work if the target has no points. if target.get_num_points() or target.submobjects: source.replace(target, stretch=self.stretch, dim_to_match=self.dim_to_match) source.set_opacity(0) def get_all_mobjects(self) -> Sequence[Mobject]: return [ self.mobject, self.starting_mobject, self.ending_mobject, ] def get_all_families_zipped(self): return Animation.get_all_families_zipped(self) def clean_up_from_scene(self, scene): Animation.clean_up_from_scene(self, scene) scene.remove(self.mobject) self.mobject[0].restore() scene.add(self.to_add_on_completion) class FadeTransformPieces(FadeTransform): """Fades submobjects of one mobject into submobjects of another one. See also -------- :class:`~.FadeTransform` Examples -------- .. manim:: FadeTransformSubmobjects class FadeTransformSubmobjects(Scene): def construct(self): src = VGroup(Square(), Circle().shift(LEFT + UP)) src.shift(3*LEFT + 2*UP) src_copy = src.copy().shift(4*DOWN) target = VGroup(Circle(), Triangle().shift(RIGHT + DOWN)) target.shift(3*RIGHT + 2*UP) target_copy = target.copy().shift(4*DOWN) self.play(FadeIn(src), FadeIn(src_copy)) self.play( FadeTransform(src, target), FadeTransformPieces(src_copy, target_copy) ) self.play(*[FadeOut(mobj) for mobj in self.mobjects]) """ def begin(self): self.mobject[0].align_submobjects(self.mobject[1]) super().begin() def ghost_to(self, source, target): """Replaces the source submobjects by the target submobjects and sets the opacity to 0. """ for sm0, sm1 in zip(source.get_family(), target.get_family(), strict=True): super().ghost_to(sm0, sm1) ManimCommunity-manim-1157b74/manim/animation/transform_matching_parts.py000066400000000000000000000242631515024150700265720ustar00rootroot00000000000000"""Animations that try to transform Mobjects while keeping track of identical parts.""" from __future__ import annotations __all__ = ["TransformMatchingShapes", "TransformMatchingTex"] from typing import TYPE_CHECKING import numpy as np from manim.mobject.opengl.opengl_mobject import OpenGLGroup, OpenGLMobject from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup, OpenGLVMobject from .._config import config from ..constants import RendererType from ..mobject.mobject import Group, Mobject from ..mobject.types.vectorized_mobject import VGroup, VMobject from .composition import AnimationGroup from .fading import FadeIn, FadeOut from .transform import FadeTransformPieces, Transform if TYPE_CHECKING: from ..scene.scene import Scene class TransformMatchingAbstractBase(AnimationGroup): """Abstract base class for transformations that keep track of matching parts. Subclasses have to implement the two static methods :meth:`~.TransformMatchingAbstractBase.get_mobject_parts` and :meth:`~.TransformMatchingAbstractBase.get_mobject_key`. Basically, this transformation first maps all submobjects returned by the ``get_mobject_parts`` method to certain keys by applying the ``get_mobject_key`` method. Then, submobjects with matching keys are transformed into each other. Parameters ---------- mobject The starting :class:`~.Mobject`. target_mobject The target :class:`~.Mobject`. transform_mismatches Controls whether submobjects without a matching key are transformed into each other by using :class:`~.Transform`. Default: ``False``. fade_transform_mismatches Controls whether submobjects without a matching key are transformed into each other by using :class:`~.FadeTransform`. Default: ``False``. key_map Optional. A dictionary mapping keys belonging to some of the starting mobject's submobjects (i.e., the return values of the ``get_mobject_key`` method) to some keys belonging to the target mobject's submobjects that should be transformed although the keys don't match. kwargs All further keyword arguments are passed to the submobject transformations. Note ---- If neither ``transform_mismatches`` nor ``fade_transform_mismatches`` are set to ``True``, submobjects without matching keys in the starting mobject are faded out in the direction of the unmatched submobjects in the target mobject, and unmatched submobjects in the target mobject are faded in from the direction of the unmatched submobjects in the start mobject. """ def __init__( self, mobject: Mobject, target_mobject: Mobject, transform_mismatches: bool = False, fade_transform_mismatches: bool = False, key_map: dict | None = None, **kwargs, ): if isinstance(mobject, OpenGLVMobject): group_type = OpenGLVGroup elif isinstance(mobject, OpenGLMobject): group_type = OpenGLGroup elif isinstance(mobject, VMobject): group_type = VGroup else: group_type = Group source_map = self.get_shape_map(mobject) target_map = self.get_shape_map(target_mobject) if key_map is None: key_map = {} # Create two mobjects whose submobjects all match each other # according to whatever keys are used for source_map and # target_map transform_source = group_type() transform_target = group_type() for key in set(source_map).intersection(target_map): transform_source.add(source_map[key]) transform_target.add(target_map[key]) anims = [Transform(transform_source, transform_target, **kwargs)] # User can manually specify when one part should transform # into another despite not matching by using key_map key_mapped_source = group_type() key_mapped_target = group_type() for key1, key2 in key_map.items(): if key1 in source_map and key2 in target_map: key_mapped_source.add(source_map[key1]) key_mapped_target.add(target_map[key2]) source_map.pop(key1, None) target_map.pop(key2, None) if len(key_mapped_source) > 0: anims.append( FadeTransformPieces(key_mapped_source, key_mapped_target, **kwargs), ) fade_source = group_type() fade_target = group_type() for key in set(source_map).difference(target_map): fade_source.add(source_map[key]) for key in set(target_map).difference(source_map): fade_target.add(target_map[key]) fade_target_copy = fade_target.copy() if transform_mismatches: if "replace_mobject_with_target_in_scene" not in kwargs: kwargs["replace_mobject_with_target_in_scene"] = True anims.append(Transform(fade_source, fade_target, **kwargs)) elif fade_transform_mismatches: anims.append(FadeTransformPieces(fade_source, fade_target, **kwargs)) else: anims.append(FadeOut(fade_source, target_position=fade_target, **kwargs)) anims.append( FadeIn(fade_target_copy, target_position=fade_target, **kwargs), ) super().__init__(*anims) self.to_remove = [mobject, fade_target_copy] self.to_add = target_mobject def get_shape_map(self, mobject: Mobject) -> dict: shape_map = {} for sm in self.get_mobject_parts(mobject): key = self.get_mobject_key(sm) if key not in shape_map: if config["renderer"] == RendererType.OPENGL: shape_map[key] = OpenGLVGroup() else: shape_map[key] = VGroup() shape_map[key].add(sm) return shape_map def clean_up_from_scene(self, scene: Scene) -> None: # Interpolate all animations back to 0 to ensure source mobjects remain unchanged. for anim in self.animations: anim.interpolate(0) scene.remove(self.mobject) scene.remove(*self.to_remove) scene.add(self.to_add) @staticmethod def get_mobject_parts(mobject: Mobject): raise NotImplementedError("To be implemented in subclass.") @staticmethod def get_mobject_key(mobject: Mobject): raise NotImplementedError("To be implemented in subclass.") class TransformMatchingShapes(TransformMatchingAbstractBase): """An animation trying to transform groups by matching the shape of their submobjects. Two submobjects match if the hash of their point coordinates after normalization (i.e., after translation to the origin, fixing the submobject height at 1 unit, and rounding the coordinates to three decimal places) matches. See also -------- :class:`~.TransformMatchingAbstractBase` Examples -------- .. manim:: Anagram class Anagram(Scene): def construct(self): src = Text("the morse code") tar = Text("here come dots") self.play(Write(src)) self.wait(0.5) self.play(TransformMatchingShapes(src, tar, path_arc=PI/2)) self.wait(0.5) """ def __init__( self, mobject: Mobject, target_mobject: Mobject, transform_mismatches: bool = False, fade_transform_mismatches: bool = False, key_map: dict | None = None, **kwargs, ): super().__init__( mobject, target_mobject, transform_mismatches=transform_mismatches, fade_transform_mismatches=fade_transform_mismatches, key_map=key_map, **kwargs, ) @staticmethod def get_mobject_parts(mobject: Mobject) -> list[Mobject]: return mobject.family_members_with_points() @staticmethod def get_mobject_key(mobject: Mobject) -> int: mobject.save_state() mobject.center() mobject.set(height=1) rounded_points = np.round(mobject.points, 3) + 0.0 result = hash(rounded_points.tobytes()) mobject.restore() return result class TransformMatchingTex(TransformMatchingAbstractBase): """A transformation trying to transform rendered LaTeX strings. Two submobjects match if their ``tex_string`` matches. See also -------- :class:`~.TransformMatchingAbstractBase` Examples -------- .. manim:: MatchingEquationParts class MatchingEquationParts(Scene): def construct(self): variables = VGroup(MathTex("a"), MathTex("b"), MathTex("c")).arrange_submobjects().shift(UP) eq1 = MathTex("{{x}}^2", "+", "{{y}}^2", "=", "{{z}}^2") eq2 = MathTex("{{a}}^2", "+", "{{b}}^2", "=", "{{c}}^2") eq3 = MathTex("{{a}}^2", "=", "{{c}}^2", "-", "{{b}}^2") self.add(eq1) self.wait(0.5) self.play(TransformMatchingTex(Group(eq1, variables), eq2)) self.wait(0.5) self.play(TransformMatchingTex(eq2, eq3)) self.wait(0.5) """ def __init__( self, mobject: Mobject, target_mobject: Mobject, transform_mismatches: bool = False, fade_transform_mismatches: bool = False, key_map: dict | None = None, **kwargs, ): super().__init__( mobject, target_mobject, transform_mismatches=transform_mismatches, fade_transform_mismatches=fade_transform_mismatches, key_map=key_map, **kwargs, ) @staticmethod def get_mobject_parts(mobject: Mobject) -> list[Mobject]: if isinstance(mobject, (Group, VGroup, OpenGLGroup, OpenGLVGroup)): return [ p for s in mobject.submobjects for p in TransformMatchingTex.get_mobject_parts(s) ] else: assert hasattr(mobject, "tex_string") return mobject.submobjects @staticmethod def get_mobject_key(mobject: Mobject) -> str: return mobject.tex_string ManimCommunity-manim-1157b74/manim/animation/updaters/000077500000000000000000000000001515024150700227425ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/animation/updaters/__init__.py000066400000000000000000000002511515024150700250510ustar00rootroot00000000000000"""Animations and utility mobjects related to update functions. Modules ======= .. autosummary:: :toctree: ../reference ~mobject_update_utils ~update """ ManimCommunity-manim-1157b74/manim/animation/updaters/mobject_update_utils.py000066400000000000000000000160601515024150700275240ustar00rootroot00000000000000"""Utility functions for continuous animation of mobjects.""" from __future__ import annotations __all__ = [ "assert_is_mobject_method", "always", "f_always", "always_redraw", "always_shift", "always_rotate", "turn_animation_into_updater", "cycle_animation", ] import inspect from collections.abc import Callable from typing import TYPE_CHECKING import numpy as np from manim.constants import DEGREES, RIGHT from manim.mobject.mobject import Mobject from manim.opengl import OpenGLMobject from manim.utils.space_ops import normalize if TYPE_CHECKING: from manim.animation.animation import Animation def assert_is_mobject_method(method: Callable) -> None: assert inspect.ismethod(method) mobject = method.__self__ assert isinstance(mobject, (Mobject, OpenGLMobject)) def always(method: Callable, *args, **kwargs) -> Mobject: assert_is_mobject_method(method) mobject = method.__self__ func = method.__func__ mobject.add_updater(lambda m: func(m, *args, **kwargs)) return mobject def f_always(method: Callable[[Mobject], None], *arg_generators, **kwargs) -> Mobject: """ More functional version of always, where instead of taking in args, it takes in functions which output the relevant arguments. """ assert_is_mobject_method(method) mobject = method.__self__ func = method.__func__ def updater(mob): args = [arg_generator() for arg_generator in arg_generators] func(mob, *args, **kwargs) mobject.add_updater(updater) return mobject def always_redraw(func: Callable[[], Mobject]) -> Mobject: """Redraw the mobject constructed by a function every frame. This function returns a mobject with an attached updater that continuously regenerates the mobject according to the specified function. Parameters ---------- func A function without (required) input arguments that returns a mobject. Examples -------- .. manim:: TangentAnimation class TangentAnimation(Scene): def construct(self): ax = Axes() sine = ax.plot(np.sin, color=RED) alpha = ValueTracker(0) point = always_redraw( lambda: Dot( sine.point_from_proportion(alpha.get_value()), color=BLUE ) ) tangent = always_redraw( lambda: TangentLine( sine, alpha=alpha.get_value(), color=YELLOW, length=4 ) ) self.add(ax, sine, point, tangent) self.play(alpha.animate.set_value(1), rate_func=linear, run_time=2) """ mob = func() mob.add_updater(lambda _: mob.become(func())) return mob def always_shift( mobject: Mobject, direction: np.ndarray[np.float64] = RIGHT, rate: float = 0.1 ) -> Mobject: """A mobject which is continuously shifted along some direction at a certain rate. Parameters ---------- mobject The mobject to shift. direction The direction to shift. The vector is normalized, the specified magnitude is not relevant. rate Length in Manim units which the mobject travels in one second along the specified direction. Examples -------- .. manim:: ShiftingSquare class ShiftingSquare(Scene): def construct(self): sq = Square().set_fill(opacity=1) tri = Triangle() VGroup(sq, tri).arrange(LEFT) # construct a square which is continuously # shifted to the right always_shift(sq, RIGHT, rate=5) self.add(sq) self.play(tri.animate.set_fill(opacity=1)) """ mobject.add_updater(lambda m, dt: m.shift(dt * rate * normalize(direction))) return mobject def always_rotate(mobject: Mobject, rate: float = 20 * DEGREES, **kwargs) -> Mobject: """A mobject which is continuously rotated at a certain rate. Parameters ---------- mobject The mobject to be rotated. rate The angle which the mobject is rotated by over one second. kwags Further arguments to be passed to :meth:`.Mobject.rotate`. Examples -------- .. manim:: SpinningTriangle class SpinningTriangle(Scene): def construct(self): tri = Triangle().set_fill(opacity=1).set_z_index(2) sq = Square().to_edge(LEFT) # will keep spinning while there is an animation going on always_rotate(tri, rate=2*PI, about_point=ORIGIN) self.add(tri, sq) self.play(sq.animate.to_edge(RIGHT), rate_func=linear, run_time=1) """ mobject.add_updater(lambda m, dt: m.rotate(dt * rate, **kwargs)) return mobject def turn_animation_into_updater( animation: Animation, cycle: bool = False, delay: float = 0, **kwargs ) -> Mobject: """ Add an updater to the animation's mobject which applies the interpolation and update functions of the animation If cycle is True, this repeats over and over. Otherwise, the updater will be popped upon completion The ``delay`` parameter is the delay (in seconds) before the animation starts.. Examples -------- .. manim:: WelcomeToManim class WelcomeToManim(Scene): def construct(self): words = Text("Welcome to") banner = ManimBanner().scale(0.5) VGroup(words, banner).arrange(DOWN) turn_animation_into_updater(Write(words, run_time=0.9)) self.add(words) self.wait(0.5) self.play(banner.expand(), run_time=0.5) """ mobject = animation.mobject animation.suspend_mobject_updating = False animation.begin() animation.total_time = -delay def update(m: Mobject, dt: float): if animation.total_time >= 0: run_time = animation.get_run_time() # handle zero/negative runtime safely if run_time <= 0: # instantly snap to final state once, then remove updater animation.interpolate(1) animation.update_mobjects(dt) animation.finish() m.remove_updater(update) return time_ratio = animation.total_time / run_time if cycle: alpha = time_ratio % 1 else: alpha = np.clip(time_ratio, 0, 1) if alpha >= 1: animation.finish() m.remove_updater(update) return animation.interpolate(alpha) animation.update_mobjects(dt) animation.total_time += dt mobject.add_updater(update) return mobject def cycle_animation(animation: Animation, **kwargs) -> Mobject: return turn_animation_into_updater(animation, cycle=True, **kwargs) ManimCommunity-manim-1157b74/manim/animation/updaters/update.py000066400000000000000000000034651515024150700246060ustar00rootroot00000000000000"""Animations that update mobjects.""" from __future__ import annotations __all__ = ["UpdateFromFunc", "UpdateFromAlphaFunc", "MaintainPositionRelativeTo"] import operator as op from collections.abc import Callable from typing import TYPE_CHECKING, Any from manim.animation.animation import Animation if TYPE_CHECKING: from manim.mobject.mobject import Mobject class UpdateFromFunc(Animation): """ update_function of the form func(mobject), presumably to be used when the state of one mobject is dependent on another simultaneously animated mobject """ def __init__( self, mobject: Mobject, update_function: Callable[[Mobject], Any], suspend_mobject_updating: bool = False, **kwargs: Any, ) -> None: self.update_function = update_function super().__init__( mobject, suspend_mobject_updating=suspend_mobject_updating, **kwargs ) def interpolate_mobject(self, alpha: float) -> None: self.update_function(self.mobject) # type: ignore[arg-type] class UpdateFromAlphaFunc(UpdateFromFunc): def interpolate_mobject(self, alpha: float) -> None: self.update_function(self.mobject, self.rate_func(alpha)) # type: ignore[call-arg, arg-type] class MaintainPositionRelativeTo(Animation): def __init__( self, mobject: Mobject, tracked_mobject: Mobject, **kwargs: Any ) -> None: self.tracked_mobject = tracked_mobject self.diff = op.sub( mobject.get_center(), tracked_mobject.get_center(), ) super().__init__(mobject, **kwargs) def interpolate_mobject(self, alpha: float) -> None: target = self.tracked_mobject.get_center() location = self.mobject.get_center() self.mobject.shift(target - location + self.diff) ManimCommunity-manim-1157b74/manim/camera/000077500000000000000000000000001515024150700203645ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/camera/__init__.py000066400000000000000000000000001515024150700224630ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/camera/camera.py000066400000000000000000001421201515024150700221660ustar00rootroot00000000000000"""A camera converts the mobjects contained in a Scene into an array of pixels.""" from __future__ import annotations __all__ = ["Camera", "BackgroundColoredVMobjectDisplayer"] import copy import itertools as it import operator as op import pathlib from collections.abc import Callable, Iterable from functools import reduce from typing import TYPE_CHECKING, Any, Self import cairo import numpy as np from PIL import Image from manim._config import config, logger from manim.constants import * from manim.mobject.mobject import Mobject from manim.mobject.types.point_cloud_mobject import PMobject from manim.mobject.types.vectorized_mobject import VMobject from manim.utils.color import ManimColor, ParsableManimColor, color_to_int_rgba from manim.utils.family import extract_mobject_family_members from manim.utils.images import get_full_raster_image_path from manim.utils.iterables import list_difference_update from manim.utils.space_ops import cross2d if TYPE_CHECKING: import numpy.typing as npt from manim.mobject.types.image_mobject import AbstractImageMobject from manim.typing import ( FloatRGBA_Array, FloatRGBALike_Array, ManimFloat, ManimInt, PixelArray, Point3D, Point3D_Array, ) LINE_JOIN_MAP = { LineJointType.AUTO: None, # TODO: this could be improved LineJointType.ROUND: cairo.LineJoin.ROUND, LineJointType.BEVEL: cairo.LineJoin.BEVEL, LineJointType.MITER: cairo.LineJoin.MITER, } CAP_STYLE_MAP = { CapStyleType.AUTO: None, # TODO: this could be improved CapStyleType.ROUND: cairo.LineCap.ROUND, CapStyleType.BUTT: cairo.LineCap.BUTT, CapStyleType.SQUARE: cairo.LineCap.SQUARE, } class Camera: """Base camera class. This is the object which takes care of what exactly is displayed on screen at any given moment. Parameters ---------- background_image The path to an image that should be the background image. If not set, the background is filled with :attr:`self.background_color` background What :attr:`background` is set to. By default, ``None``. pixel_height The height of the scene in pixels. pixel_width The width of the scene in pixels. kwargs Additional arguments (``background_color``, ``background_opacity``) to be set. """ def __init__( self, background_image: str | None = None, frame_center: Point3D = ORIGIN, image_mode: str = "RGBA", n_channels: int = 4, pixel_array_dtype: str = "uint8", cairo_line_width_multiple: float = 0.01, use_z_index: bool = True, background: PixelArray | None = None, pixel_height: int | None = None, pixel_width: int | None = None, frame_height: float | None = None, frame_width: float | None = None, frame_rate: float | None = None, background_color: ParsableManimColor | None = None, background_opacity: float | None = None, **kwargs: Any, ) -> None: self.background_image = background_image self.frame_center = frame_center self.image_mode = image_mode self.n_channels = n_channels self.pixel_array_dtype = pixel_array_dtype self.cairo_line_width_multiple = cairo_line_width_multiple self.use_z_index = use_z_index self.background = background self.background_colored_vmobject_displayer: ( BackgroundColoredVMobjectDisplayer | None ) = None if pixel_height is None: pixel_height = config["pixel_height"] self.pixel_height = pixel_height if pixel_width is None: pixel_width = config["pixel_width"] self.pixel_width = pixel_width if frame_height is None: frame_height = config["frame_height"] self.frame_height = frame_height if frame_width is None: frame_width = config["frame_width"] self.frame_width = frame_width if frame_rate is None: frame_rate = config["frame_rate"] self.frame_rate = frame_rate if background_color is None: self._background_color: ManimColor = ManimColor.parse( config["background_color"] ) else: self._background_color = ManimColor.parse(background_color) if background_opacity is None: self._background_opacity: float = config["background_opacity"] else: self._background_opacity = background_opacity # This one is in the same boat as the above, but it doesn't have the # same name as the corresponding key so it has to be handled on its own self.max_allowable_norm = config["frame_width"] self.rgb_max_val = np.iinfo(self.pixel_array_dtype).max self.pixel_array_to_cairo_context: dict[int, cairo.Context] = {} # Contains the correct method to process a list of Mobjects of the # corresponding class. If a Mobject is not an instance of a class in # this dict (or an instance of a class that inherits from a class in # this dict), then it cannot be rendered. self.init_background() self.resize_frame_shape() self.reset() def __deepcopy__(self, memo: Any) -> Camera: # This is to address a strange bug where deepcopying # will result in a segfault, which is somehow related # to the aggdraw library self.canvas = None return copy.copy(self) @property def background_color(self) -> ManimColor: return self._background_color @background_color.setter def background_color(self, color: ManimColor) -> None: self._background_color = color self.init_background() @property def background_opacity(self) -> float: return self._background_opacity @background_opacity.setter def background_opacity(self, alpha: float) -> None: self._background_opacity = alpha self.init_background() def type_or_raise( self, mobject: Mobject ) -> type[VMobject] | type[PMobject] | type[AbstractImageMobject] | type[Mobject]: """Return the type of mobject, if it is a type that can be rendered. If `mobject` is an instance of a class that inherits from a class that can be rendered, return the super class. For example, an instance of a Square is also an instance of VMobject, and these can be rendered. Therefore, `type_or_raise(Square())` returns True. Parameters ---------- mobject The object to take the type of. Notes ----- For a list of classes that can currently be rendered, see :meth:`display_funcs`. Returns ------- Type[:class:`~.Mobject`] The type of mobjects, if it can be rendered. Raises ------ :exc:`TypeError` When mobject is not an instance of a class that can be rendered. """ from ..mobject.types.image_mobject import AbstractImageMobject self.display_funcs: dict[ type[Mobject], Callable[[list[Mobject], PixelArray], Any] ] = { VMobject: self.display_multiple_vectorized_mobjects, # type: ignore[dict-item] PMobject: self.display_multiple_point_cloud_mobjects, # type: ignore[dict-item] AbstractImageMobject: self.display_multiple_image_mobjects, # type: ignore[dict-item] Mobject: lambda batch, pa: batch, # Do nothing } # We have to check each type in turn because we are dealing with # super classes. For example, if square = Square(), then # type(square) != VMobject, but isinstance(square, VMobject) == True. for _type in self.display_funcs: if isinstance(mobject, _type): return _type raise TypeError(f"Displaying an object of class {_type} is not supported") def reset_pixel_shape(self, new_height: float, new_width: float) -> None: """This method resets the height and width of a single pixel to the passed new_height and new_width. Parameters ---------- new_height The new height of the entire scene in pixels new_width The new width of the entire scene in pixels """ self.pixel_width = new_width self.pixel_height = new_height self.init_background() self.resize_frame_shape() self.reset() def resize_frame_shape(self, fixed_dimension: int = 0) -> None: """ Changes frame_shape to match the aspect ratio of the pixels, where fixed_dimension determines whether frame_height or frame_width remains fixed while the other changes accordingly. Parameters ---------- fixed_dimension If 0, height is scaled with respect to width else, width is scaled with respect to height. """ pixel_height = self.pixel_height pixel_width = self.pixel_width frame_height = self.frame_height frame_width = self.frame_width aspect_ratio = pixel_width / pixel_height if fixed_dimension == 0: frame_height = frame_width / aspect_ratio else: frame_width = aspect_ratio * frame_height self.frame_height = frame_height self.frame_width = frame_width def init_background(self) -> None: """Initialize the background. If self.background_image is the path of an image the image is set as background; else, the default background color fills the background. """ height = self.pixel_height width = self.pixel_width if self.background_image is not None: path = get_full_raster_image_path(self.background_image) image = Image.open(path).convert(self.image_mode) # TODO, how to gracefully handle backgrounds # with different sizes? self.background = np.array(image)[:height, :width] self.background = self.background.astype(self.pixel_array_dtype) else: background_rgba = color_to_int_rgba( self.background_color, self.background_opacity, ) self.background = np.zeros( (height, width, self.n_channels), dtype=self.pixel_array_dtype, ) self.background[:, :] = background_rgba def get_image( self, pixel_array: PixelArray | list | tuple | None = None ) -> Image.Image: """Returns an image from the passed pixel array, or from the current frame if the passed pixel array is none. Parameters ---------- pixel_array The pixel array from which to get an image, by default None Returns ------- PIL.Image.Image The PIL image of the array. """ if pixel_array is None: pixel_array = self.pixel_array return Image.fromarray(pixel_array, mode=self.image_mode) def convert_pixel_array( self, pixel_array: PixelArray | list | tuple, convert_from_floats: bool = False ) -> PixelArray: """Converts a pixel array from values that have floats in then to proper RGB values. Parameters ---------- pixel_array Pixel array to convert. convert_from_floats Whether or not to convert float values to ints, by default False Returns ------- np.array The new, converted pixel array. """ retval = np.array(pixel_array) if convert_from_floats: retval = np.apply_along_axis( lambda f: (f * self.rgb_max_val).astype(self.pixel_array_dtype), 2, retval, ) return retval def set_pixel_array( self, pixel_array: PixelArray | list | tuple, convert_from_floats: bool = False ) -> None: """Sets the pixel array of the camera to the passed pixel array. Parameters ---------- pixel_array The pixel array to convert and then set as the camera's pixel array. convert_from_floats Whether or not to convert float values to proper RGB values, by default False """ converted_array: PixelArray = self.convert_pixel_array( pixel_array, convert_from_floats ) if not ( hasattr(self, "pixel_array") and self.pixel_array.shape == converted_array.shape ): self.pixel_array: PixelArray = converted_array else: # Set in place self.pixel_array[:, :, :] = converted_array[:, :, :] def set_background( self, pixel_array: PixelArray | list | tuple, convert_from_floats: bool = False ) -> None: """Sets the background to the passed pixel_array after converting to valid RGB values. Parameters ---------- pixel_array The pixel array to set the background to. convert_from_floats Whether or not to convert floats values to proper RGB valid ones, by default False """ self.background = self.convert_pixel_array(pixel_array, convert_from_floats) # TODO, this should live in utils, not as a method of Camera def make_background_from_func( self, coords_to_colors_func: Callable[[np.ndarray], np.ndarray] ) -> PixelArray: """ Makes a pixel array for the background by using coords_to_colors_func to determine each pixel's color. Each input pixel's color. Each input to coords_to_colors_func is an (x, y) pair in space (in ordinary space coordinates; not pixel coordinates), and each output is expected to be an RGBA array of 4 floats. Parameters ---------- coords_to_colors_func The function whose input is an (x,y) pair of coordinates and whose return values must be the colors for that point Returns ------- np.array The pixel array which can then be passed to set_background. """ logger.info("Starting set_background") coords = self.get_coords_of_all_pixels() new_background = np.apply_along_axis(coords_to_colors_func, 2, coords) logger.info("Ending set_background") return self.convert_pixel_array(new_background, convert_from_floats=True) def set_background_from_func( self, coords_to_colors_func: Callable[[np.ndarray], np.ndarray] ) -> None: """ Sets the background to a pixel array using coords_to_colors_func to determine each pixel's color. Each input pixel's color. Each input to coords_to_colors_func is an (x, y) pair in space (in ordinary space coordinates; not pixel coordinates), and each output is expected to be an RGBA array of 4 floats. Parameters ---------- coords_to_colors_func The function whose input is an (x,y) pair of coordinates and whose return values must be the colors for that point """ self.set_background(self.make_background_from_func(coords_to_colors_func)) def reset(self) -> Self: """Resets the camera's pixel array to that of the background Returns ------- Camera The camera object after setting the pixel array. """ self.set_pixel_array(self.background) return self def set_frame_to_background(self, background: PixelArray) -> None: self.set_pixel_array(background) #### def get_mobjects_to_display( self, mobjects: Iterable[Mobject], include_submobjects: bool = True, excluded_mobjects: list | None = None, ) -> list[Mobject]: """Used to get the list of mobjects to display with the camera. Parameters ---------- mobjects The Mobjects include_submobjects Whether or not to include the submobjects of mobjects, by default True excluded_mobjects Any mobjects to exclude, by default None Returns ------- list list of mobjects """ if include_submobjects: mobjects = extract_mobject_family_members( mobjects, use_z_index=self.use_z_index, only_those_with_points=True, ) if excluded_mobjects: all_excluded = extract_mobject_family_members( excluded_mobjects, use_z_index=self.use_z_index, ) mobjects = list_difference_update(mobjects, all_excluded) return list(mobjects) def is_in_frame(self, mobject: Mobject) -> bool: """Checks whether the passed mobject is in frame or not. Parameters ---------- mobject The mobject for which the checking needs to be done. Returns ------- bool True if in frame, False otherwise. """ fc = self.frame_center fh = self.frame_height fw = self.frame_width return not reduce( op.or_, [ mobject.get_right()[0] < fc[0] - fw / 2, mobject.get_bottom()[1] > fc[1] + fh / 2, mobject.get_left()[0] > fc[0] + fw / 2, mobject.get_top()[1] < fc[1] - fh / 2, ], ) def capture_mobject(self, mobject: Mobject, **kwargs: Any) -> None: """Capture mobjects by storing it in :attr:`pixel_array`. This is a single-mobject version of :meth:`capture_mobjects`. Parameters ---------- mobject Mobject to capture. kwargs Keyword arguments to be passed to :meth:`get_mobjects_to_display`. """ return self.capture_mobjects([mobject], **kwargs) def capture_mobjects(self, mobjects: Iterable[Mobject], **kwargs: Any) -> None: """Capture mobjects by printing them on :attr:`pixel_array`. This is the essential function that converts the contents of a Scene into an array, which is then converted to an image or video. Parameters ---------- mobjects Mobjects to capture. kwargs Keyword arguments to be passed to :meth:`get_mobjects_to_display`. Notes ----- For a list of classes that can currently be rendered, see :meth:`display_funcs`. """ # The mobjects will be processed in batches (or runs) of mobjects of # the same type. That is, if the list mobjects contains objects of # types [VMobject, VMobject, VMobject, PMobject, PMobject, VMobject], # then they will be captured in three batches: [VMobject, VMobject, # VMobject], [PMobject, PMobject], and [VMobject]. This must be done # without altering their order. it.groupby computes exactly this # partition while at the same time preserving order. mobjects = self.get_mobjects_to_display(mobjects, **kwargs) for group_type, group in it.groupby(mobjects, self.type_or_raise): self.display_funcs[group_type](list(group), self.pixel_array) # Methods associated with svg rendering # NOTE: None of the methods below have been mentioned outside of their definitions. Their DocStrings are not as # detailed as possible. def get_cached_cairo_context(self, pixel_array: PixelArray) -> cairo.Context | None: """Returns the cached cairo context of the passed pixel array if it exists, and None if it doesn't. Parameters ---------- pixel_array The pixel array to check. Returns ------- cairo.Context The cached cairo context. """ return self.pixel_array_to_cairo_context.get(id(pixel_array), None) def cache_cairo_context(self, pixel_array: PixelArray, ctx: cairo.Context) -> None: """Caches the passed Pixel array into a Cairo Context Parameters ---------- pixel_array The pixel array to cache ctx The context to cache it into. """ self.pixel_array_to_cairo_context[id(pixel_array)] = ctx def get_cairo_context(self, pixel_array: PixelArray) -> cairo.Context: """Returns the cairo context for a pixel array after caching it to self.pixel_array_to_cairo_context If that array has already been cached, it returns the cached version instead. Parameters ---------- pixel_array The Pixel array to get the cairo context of. Returns ------- cairo.Context The cairo context of the pixel array. """ cached_ctx = self.get_cached_cairo_context(pixel_array) if cached_ctx: return cached_ctx pw = self.pixel_width ph = self.pixel_height fw = self.frame_width fh = self.frame_height fc = self.frame_center surface = cairo.ImageSurface.create_for_data( pixel_array.data, cairo.FORMAT_ARGB32, pw, ph, ) ctx = cairo.Context(surface) ctx.scale(pw, ph) ctx.set_matrix( cairo.Matrix( (pw / fw), 0, 0, -(ph / fh), (pw / 2) - fc[0] * (pw / fw), (ph / 2) + fc[1] * (ph / fh), ), ) self.cache_cairo_context(pixel_array, ctx) return ctx def display_multiple_vectorized_mobjects( self, vmobjects: list[VMobject], pixel_array: PixelArray ) -> None: """Displays multiple VMobjects in the pixel_array Parameters ---------- vmobjects list of VMobjects to display pixel_array The pixel array """ if len(vmobjects) == 0: return batch_image_pairs = it.groupby(vmobjects, lambda vm: vm.get_background_image()) for image, batch in batch_image_pairs: if image: self.display_multiple_background_colored_vmobjects(batch, pixel_array) else: self.display_multiple_non_background_colored_vmobjects( batch, pixel_array, ) def display_multiple_non_background_colored_vmobjects( self, vmobjects: Iterable[VMobject], pixel_array: PixelArray ) -> None: """Displays multiple VMobjects in the cairo context, as long as they don't have background colors. Parameters ---------- vmobjects list of the VMobjects pixel_array The Pixel array to add the VMobjects to. """ ctx = self.get_cairo_context(pixel_array) for vmobject in vmobjects: self.display_vectorized(vmobject, ctx) def display_vectorized(self, vmobject: VMobject, ctx: cairo.Context) -> Self: """Displays a VMobject in the cairo context Parameters ---------- vmobject The Vectorized Mobject to display ctx The cairo context to use. Returns ------- Camera The camera object """ self.set_cairo_context_path(ctx, vmobject) self.apply_stroke(ctx, vmobject, background=True) self.apply_fill(ctx, vmobject) self.apply_stroke(ctx, vmobject) return self def set_cairo_context_path(self, ctx: cairo.Context, vmobject: VMobject) -> Self: """Sets a path for the cairo context with the vmobject passed Parameters ---------- ctx The cairo context vmobject The VMobject Returns ------- Camera Camera object after setting cairo_context_path """ points = self.transform_points_pre_display(vmobject, vmobject.points) # TODO, shouldn't this be handled in transform_points_pre_display? # points = points - self.get_frame_center() if len(points) == 0: return self ctx.new_path() subpaths = vmobject.gen_subpaths_from_points_2d(points) for subpath in subpaths: quads = vmobject.gen_cubic_bezier_tuples_from_points(subpath) ctx.new_sub_path() start = subpath[0] ctx.move_to(*start[:2]) for _p0, p1, p2, p3 in quads: ctx.curve_to(*p1[:2], *p2[:2], *p3[:2]) if vmobject.consider_points_equals_2d(subpath[0], subpath[-1]): ctx.close_path() return self def set_cairo_context_color( self, ctx: cairo.Context, rgbas: FloatRGBALike_Array, vmobject: VMobject ) -> Self: """Sets the color of the cairo context Parameters ---------- ctx The cairo context rgbas The RGBA array with which to color the context. vmobject The VMobject with which to set the color. Returns ------- Camera The camera object """ if len(rgbas) == 1: # Use reversed rgb because cairo surface is # encodes it in reverse order ctx.set_source_rgba(*rgbas[0][2::-1], rgbas[0][3]) else: points = vmobject.get_gradient_start_and_end_points() points = self.transform_points_pre_display(vmobject, points) pat = cairo.LinearGradient(*it.chain(*(point[:2] for point in points))) offsets = np.linspace(0, 1, len(rgbas)) for rgba, offset in zip(rgbas, offsets, strict=True): pat.add_color_stop_rgba(offset, *rgba[2::-1], rgba[3]) ctx.set_source(pat) return self def apply_fill(self, ctx: cairo.Context, vmobject: VMobject) -> Self: """Fills the cairo context Parameters ---------- ctx The cairo context vmobject The VMobject Returns ------- Camera The camera object. """ self.set_cairo_context_color(ctx, self.get_fill_rgbas(vmobject), vmobject) ctx.fill_preserve() return self def apply_stroke( self, ctx: cairo.Context, vmobject: VMobject, background: bool = False ) -> Self: """Applies a stroke to the VMobject in the cairo context. Parameters ---------- ctx The cairo context vmobject The VMobject background Whether or not to consider the background when applying this stroke width, by default False Returns ------- Camera The camera object with the stroke applied. """ width = vmobject.get_stroke_width(background) if width == 0: return self self.set_cairo_context_color( ctx, self.get_stroke_rgbas(vmobject, background=background), vmobject, ) ctx.set_line_width( width * self.cairo_line_width_multiple * (self.frame_width / self.frame_width), # This ensures lines have constant width as you zoom in on them. ) if vmobject.joint_type != LineJointType.AUTO: ctx.set_line_join(LINE_JOIN_MAP[vmobject.joint_type]) if vmobject.cap_style != CapStyleType.AUTO: ctx.set_line_cap(CAP_STYLE_MAP[vmobject.cap_style]) ctx.stroke_preserve() return self def get_stroke_rgbas( self, vmobject: VMobject, background: bool = False ) -> FloatRGBA_Array: """Gets the RGBA array for the stroke of the passed VMobject. Parameters ---------- vmobject The VMobject background Whether or not to consider the background when getting the stroke RGBAs, by default False Returns ------- np.ndarray The RGBA array of the stroke. """ return vmobject.get_stroke_rgbas(background) def get_fill_rgbas(self, vmobject: VMobject) -> FloatRGBA_Array: """Returns the RGBA array of the fill of the passed VMobject Parameters ---------- vmobject The VMobject Returns ------- np.array The RGBA Array of the fill of the VMobject """ return vmobject.get_fill_rgbas() def get_background_colored_vmobject_displayer( self, ) -> BackgroundColoredVMobjectDisplayer: """Returns the background_colored_vmobject_displayer if it exists or makes one and returns it if not. Returns ------- BackgroundColoredVMobjectDisplayer Object that displays VMobjects that have the same color as the background. """ if self.background_colored_vmobject_displayer is None: self.background_colored_vmobject_displayer = ( BackgroundColoredVMobjectDisplayer(self) ) return self.background_colored_vmobject_displayer def display_multiple_background_colored_vmobjects( self, cvmobjects: Iterable[VMobject], pixel_array: PixelArray ) -> Self: """Displays multiple vmobjects that have the same color as the background. Parameters ---------- cvmobjects List of Colored VMobjects pixel_array The pixel array. Returns ------- Camera The camera object. """ displayer = self.get_background_colored_vmobject_displayer() cvmobject_pixel_array = displayer.display(*cvmobjects) self.overlay_rgba_array(pixel_array, cvmobject_pixel_array) return self # Methods for other rendering # NOTE: Out of the following methods, only `transform_points_pre_display` and `points_to_pixel_coords` have been mentioned outside of their definitions. # As a result, the other methods do not have as detailed docstrings as would be preferred. def display_multiple_point_cloud_mobjects( self, pmobjects: Iterable[PMobject], pixel_array: PixelArray ) -> None: """Displays multiple PMobjects by modifying the passed pixel array. Parameters ---------- pmobjects List of PMobjects pixel_array The pixel array to modify. """ for pmobject in pmobjects: self.display_point_cloud( pmobject, pmobject.points, pmobject.rgbas, self.adjusted_thickness(pmobject.stroke_width), pixel_array, ) def display_point_cloud( self, pmobject: PMobject, points: Point3D_Array, rgbas: FloatRGBA_Array, thickness: float, pixel_array: PixelArray, ) -> None: """Displays a PMobject by modifying the pixel array suitably. TODO: Write a description for the rgbas argument. Parameters ---------- pmobject Point Cloud Mobject points The points to display in the point cloud mobject rgbas thickness The thickness of each point of the PMobject pixel_array The pixel array to modify. """ if len(points) == 0: return pixel_coords = self.points_to_pixel_coords(pmobject, points) pixel_coords = self.thickened_coordinates(pixel_coords, thickness) rgba_len = pixel_array.shape[2] rgbas = (self.rgb_max_val * rgbas).astype(self.pixel_array_dtype) target_len = len(pixel_coords) factor = target_len // len(rgbas) rgbas = np.array([rgbas] * factor).reshape((target_len, rgba_len)) on_screen_indices = self.on_screen_pixels(pixel_coords) pixel_coords = pixel_coords[on_screen_indices] rgbas = rgbas[on_screen_indices] ph = self.pixel_height pw = self.pixel_width flattener = np.array([1, pw], dtype="int") flattener = flattener.reshape((2, 1)) indices = np.dot(pixel_coords, flattener)[:, 0] indices = indices.astype("int") new_pa = pixel_array.reshape((ph * pw, rgba_len)) new_pa[indices] = rgbas pixel_array[:, :] = new_pa.reshape((ph, pw, rgba_len)) def display_multiple_image_mobjects( self, image_mobjects: Iterable[AbstractImageMobject], pixel_array: PixelArray, ) -> None: """Displays multiple image mobjects by modifying the passed pixel_array. Parameters ---------- image_mobjects list of ImageMobjects pixel_array The pixel array to modify. """ for image_mobject in image_mobjects: self.display_image_mobject(image_mobject, pixel_array) def display_image_mobject( self, image_mobject: AbstractImageMobject, pixel_array: np.ndarray ) -> None: """Display an :class:`~.ImageMobject` by changing the ``pixel_array`` suitably. Parameters ---------- image_mobject The :class:`~.ImageMobject` to display. pixel_array The pixel array to put the :class:`~.ImageMobject` in. """ sub_image = Image.fromarray(image_mobject.get_pixel_array(), mode="RGBA") original_coords = np.array( [ [0, 0], [sub_image.width, 0], [0, sub_image.height], [sub_image.width, sub_image.height], ] ) target_coords = self.points_to_subpixel_coords( image_mobject, image_mobject.points ) int_target_coords = target_coords.astype(np.int64) # Temporarily translate target coords to upper left corner to calculate the # smallest possible size for the target image. shift_vector = np.array( [ min(*[x for x, y in int_target_coords]), min(*[y for x, y in int_target_coords]), ] ) target_coords -= shift_vector int_target_coords -= shift_vector target_size = ( max(*[x for x, y in int_target_coords]), max(*[y for x, y in int_target_coords]), ) # Check that the quadrilateral of the transformed image can actually contain any # pixels by checking that its height from the longest side is longer than 0.5 pixels. # If it's not, do not render the image. Otherwise, the perspective transform # coefficients below might have broken values due to the extreme distortion (for # example, when the image is perpendicular to the camera). ordered_vertices = [target_coords[i] for i in (0, 1, 3, 2)] sides = [ordered_vertices[(i + 1) % 4] - ordered_vertices[i] for i in range(4)] side_lengths_in_pixels = np.linalg.norm(sides, axis=1) longest_side_index = np.argmax(side_lengths_in_pixels) longest_side = sides[longest_side_index] longest_side_length_in_pixels = side_lengths_in_pixels[longest_side_index] if longest_side_length_in_pixels == 0: return previous_side = sides[(longest_side_index - 1) % 4] next_side = sides[(longest_side_index - 1) % 4] # height = area / base h1 = abs(cross2d(longest_side, previous_side)) / longest_side_length_in_pixels h2 = abs(cross2d(longest_side, next_side)) / longest_side_length_in_pixels height_from_longest_side_in_pixels = max(h1, h2) if height_from_longest_side_in_pixels < 0.5: return # Use PIL.Image.Image.transform() to apply a perspective transform to the image. # The transform coefficients must be calculated. The following is adapted from: # https://pc-pillow.readthedocs.io/en/latest/Image_class/Image_transform.html#transform-perspective-coefficients # https://stackoverflow.com/questions/14177744/how-does-perspective-transformation-work-in-pil # The derivation can be found here: # https://web.archive.org/web/20150222120106/xenia.media.mit.edu/~cwren/interpolator/ homography_matrix = [] for (x, y), (X, Y) in zip(target_coords, original_coords, strict=True): homography_matrix.append([x, y, 1, 0, 0, 0, -X * x, -X * y]) homography_matrix.append([0, 0, 0, x, y, 1, -Y * x, -Y * y]) A = np.array(homography_matrix, dtype=np.float64) b = original_coords.reshape(8).astype(np.float64) try: transform_coefficients = np.linalg.solve(A, b) except np.linalg.LinAlgError: # The matrix A might be singular if three points are collinear. # In this case, do nothing and return. return sub_image = sub_image.transform( size=target_size, # Use the smallest possible size for speed. method=Image.Transform.PERSPECTIVE, data=transform_coefficients, resample=image_mobject.resampling_algorithm, ) # Paste into an image as large as the camera's pixel array. full_image = Image.fromarray( np.zeros((self.pixel_height, self.pixel_width)), mode="RGBA", ) full_image.paste( sub_image, box=( shift_vector[0], shift_vector[1], shift_vector[0] + target_size[0], shift_vector[1] + target_size[1], ), ) # Paint on top of existing pixel array. self.overlay_PIL_image(pixel_array, full_image) def overlay_rgba_array( self, pixel_array: np.ndarray, new_array: np.ndarray ) -> None: """Overlays an RGBA array on top of the given Pixel array. Parameters ---------- pixel_array The original pixel array to modify. new_array The new pixel array to overlay. """ self.overlay_PIL_image(pixel_array, self.get_image(new_array)) def overlay_PIL_image(self, pixel_array: np.ndarray, image: Image) -> None: """Overlays a PIL image on the passed pixel array. Parameters ---------- pixel_array The Pixel array image The Image to overlay. """ pixel_array[:, :] = np.array( Image.alpha_composite(self.get_image(pixel_array), image), dtype="uint8", ) def adjust_out_of_range_points(self, points: np.ndarray) -> np.ndarray: """If any of the points in the passed array are out of the viable range, they are adjusted suitably. Parameters ---------- points The points to adjust Returns ------- np.array The adjusted points. """ if not np.any(points > self.max_allowable_norm): return points norms = np.apply_along_axis(np.linalg.norm, 1, points) violator_indices = norms > self.max_allowable_norm violators = points[violator_indices, :] violator_norms = norms[violator_indices] reshaped_norms = np.repeat( violator_norms.reshape((len(violator_norms), 1)), points.shape[1], 1, ) rescaled = self.max_allowable_norm * violators / reshaped_norms points[violator_indices] = rescaled return points def transform_points_pre_display( self, mobject: Mobject, points: Point3D_Array, ) -> Point3D_Array: # TODO: Write more detailed docstrings for this method. # NOTE: There seems to be an unused argument `mobject`. # Subclasses (like ThreeDCamera) may want to # adjust points further before they're shown if not np.all(np.isfinite(points)): # TODO, print some kind of warning about # mobject having invalid points? points = np.zeros((1, 3)) return points def points_to_subpixel_coords( self, mobject: Mobject, points: Point3D_Array, ) -> npt.NDArray[ ManimFloat ]: # TODO: Write more detailed docstrings for this method. points = self.transform_points_pre_display(mobject, points) shifted_points = points - self.frame_center result = np.zeros((len(points), 2)) pixel_height = self.pixel_height pixel_width = self.pixel_width frame_height = self.frame_height frame_width = self.frame_width width_mult = pixel_width / frame_width width_add = pixel_width / 2 height_mult = pixel_height / frame_height height_add = pixel_height / 2 # Flip on y-axis as you go height_mult *= -1 result[:, 0] = shifted_points[:, 0] * width_mult + width_add result[:, 1] = shifted_points[:, 1] * height_mult + height_add return result def points_to_pixel_coords( self, mobject: Mobject, points: Point3D_Array, ) -> npt.NDArray[ManimInt]: # TODO: Write more detailed docstrings for this method. return self.points_to_subpixel_coords(mobject, points).astype(np.int64) def on_screen_pixels(self, pixel_coords: np.ndarray) -> PixelArray: """Returns array of pixels that are on the screen from a given array of pixel_coordinates Parameters ---------- pixel_coords The pixel coords to check. Returns ------- np.array The pixel coords on screen. """ return reduce( op.and_, [ pixel_coords[:, 0] >= 0, pixel_coords[:, 0] < self.pixel_width, pixel_coords[:, 1] >= 0, pixel_coords[:, 1] < self.pixel_height, ], ) def adjusted_thickness(self, thickness: float) -> float: """Computes the adjusted stroke width for a zoomed camera. Parameters ---------- thickness The stroke width of a mobject. Returns ------- float The adjusted stroke width that reflects zooming in with the camera. """ # TODO: This seems...unsystematic big_sum: float = op.add(config["pixel_height"], config["pixel_width"]) this_sum: float = op.add(self.pixel_height, self.pixel_width) factor = big_sum / this_sum return 1 + (thickness - 1) * factor def get_thickening_nudges(self, thickness: float) -> PixelArray: """Determine a list of vectors used to nudge two-dimensional pixel coordinates. Parameters ---------- thickness Returns ------- np.array """ thickness = int(thickness) _range = list(range(-thickness // 2 + 1, thickness // 2 + 1)) return np.array(list(it.product(_range, _range))) def thickened_coordinates( self, pixel_coords: np.ndarray, thickness: float ) -> PixelArray: """Returns thickened coordinates for a passed array of pixel coords and a thickness to thicken by. Parameters ---------- pixel_coords Pixel coordinates thickness Thickness Returns ------- np.array Array of thickened pixel coords. """ nudges = self.get_thickening_nudges(thickness) pixel_coords = np.array([pixel_coords + nudge for nudge in nudges]) size = pixel_coords.size return pixel_coords.reshape((size // 2, 2)) # TODO, reimplement using cairo matrix def get_coords_of_all_pixels(self) -> PixelArray: """Returns the cartesian coordinates of each pixel. Returns ------- np.ndarray The array of cartesian coordinates. """ # These are in x, y order, to help me keep things straight full_space_dims = np.array([self.frame_width, self.frame_height]) full_pixel_dims = np.array([self.pixel_width, self.pixel_height]) # These are addressed in the same y, x order as in pixel_array, but the values in them # are listed in x, y order uncentered_pixel_coords = np.indices([self.pixel_height, self.pixel_width])[ ::-1 ].transpose(1, 2, 0) uncentered_space_coords = ( uncentered_pixel_coords * full_space_dims ) / full_pixel_dims # Could structure above line's computation slightly differently, but figured (without much # thought) multiplying by frame_shape first, THEN dividing by pixel_shape, is probably # better than the other order, for avoiding underflow quantization in the division (whereas # overflow is unlikely to be a problem) centered_space_coords = uncentered_space_coords - (full_space_dims / 2) # Have to also flip the y coordinates to account for pixel array being listed in # top-to-bottom order, opposite of screen coordinate convention centered_space_coords = centered_space_coords * (1, -1) return centered_space_coords # NOTE: The methods of the following class have not been mentioned outside of their definitions. # Their DocStrings are not as detailed as preferred. class BackgroundColoredVMobjectDisplayer: """Auxiliary class that handles displaying vectorized mobjects with a set background image. Parameters ---------- camera Camera object to use. """ def __init__(self, camera: Camera): self.camera = camera self.file_name_to_pixel_array_map: dict[str, PixelArray] = {} self.pixel_array = np.array(camera.pixel_array) self.reset_pixel_array() def reset_pixel_array(self) -> None: self.pixel_array[:, :] = 0 def resize_background_array( self, background_array: PixelArray, new_width: float, new_height: float, mode: str = "RGBA", ) -> PixelArray: """Resizes the pixel array representing the background. Parameters ---------- background_array The pixel new_width The new width of the background new_height The new height of the background mode The PIL image mode, by default "RGBA" Returns ------- np.array The numpy pixel array of the resized background. """ image = Image.fromarray(background_array) image = image.convert(mode) resized_image = image.resize((new_width, new_height)) return np.array(resized_image) def resize_background_array_to_match( self, background_array: PixelArray, pixel_array: PixelArray ) -> PixelArray: """Resizes the background array to match the passed pixel array. Parameters ---------- background_array The prospective pixel array. pixel_array The pixel array whose width and height should be matched. Returns ------- np.array The resized background array. """ height, width = pixel_array.shape[:2] mode = "RGBA" if pixel_array.shape[2] == 4 else "RGB" return self.resize_background_array(background_array, width, height, mode) def get_background_array( self, image: Image.Image | pathlib.Path | str ) -> PixelArray: """Gets the background array that has the passed file_name. Parameters ---------- image The background image or its file name. Returns ------- np.ndarray The pixel array of the image. """ image_key = str(image) if image_key in self.file_name_to_pixel_array_map: return self.file_name_to_pixel_array_map[image_key] if isinstance(image, str): full_path = get_full_raster_image_path(image) image = Image.open(full_path) back_array = np.array(image) pixel_array = self.pixel_array if not np.all(pixel_array.shape == back_array.shape): back_array = self.resize_background_array_to_match(back_array, pixel_array) self.file_name_to_pixel_array_map[image_key] = back_array return back_array def display(self, *cvmobjects: VMobject) -> PixelArray | None: """Displays the colored VMobjects. Parameters ---------- *cvmobjects The VMobjects Returns ------- np.array The pixel array with the `cvmobjects` displayed. """ batch_image_pairs = it.groupby(cvmobjects, lambda cv: cv.get_background_image()) curr_array = None for image, batch in batch_image_pairs: background_array = self.get_background_array(image) pixel_array = self.pixel_array self.camera.display_multiple_non_background_colored_vmobjects( batch, pixel_array, ) new_array = np.array( (background_array * pixel_array.astype("float") / 255), dtype=self.camera.pixel_array_dtype, ) if curr_array is None: curr_array = new_array else: curr_array = np.maximum(curr_array, new_array) self.reset_pixel_array() return curr_array ManimCommunity-manim-1157b74/manim/camera/mapping_camera.py000066400000000000000000000136521515024150700237100ustar00rootroot00000000000000"""A camera module that supports spatial mapping between objects for distortion effects.""" from __future__ import annotations __all__ = ["MappingCamera", "OldMultiCamera", "SplitScreenCamera"] import math import numpy as np from ..camera.camera import Camera from ..mobject.types.vectorized_mobject import VMobject from ..utils.config_ops import DictAsObject # TODO: Add an attribute to mobjects under which they can specify that they should just # map their centers but remain otherwise undistorted (useful for labels, etc.) class MappingCamera(Camera): """Parameters ---------- mapping_func : callable Function to map 3D points to new 3D points (identity by default). min_num_curves : int Minimum number of curves for VMobjects to avoid visual glitches. allow_object_intrusion : bool If True, modifies original mobjects; else works on copies. kwargs : dict Additional arguments passed to Camera base class. """ def __init__( self, mapping_func=lambda p: p, min_num_curves=50, allow_object_intrusion=False, **kwargs, ): self.mapping_func = mapping_func self.min_num_curves = min_num_curves self.allow_object_intrusion = allow_object_intrusion super().__init__(**kwargs) def points_to_pixel_coords(self, mobject, points): # Map points with custom function before converting to pixels return super().points_to_pixel_coords( mobject, np.apply_along_axis(self.mapping_func, 1, points), ) def capture_mobjects(self, mobjects, **kwargs): """Capture mobjects for rendering after applying the spatial mapping. Copies mobjects unless intrusion is allowed, and ensures vector objects have enough curves for smooth distortion. """ mobjects = self.get_mobjects_to_display(mobjects, **kwargs) if self.allow_object_intrusion: mobject_copies = mobjects else: mobject_copies = [mobject.copy() for mobject in mobjects] for mobject in mobject_copies: if ( isinstance(mobject, VMobject) and 0 < mobject.get_num_curves() < self.min_num_curves ): mobject.insert_n_curves(self.min_num_curves) super().capture_mobjects( mobject_copies, include_submobjects=False, excluded_mobjects=None, ) # Note: This allows layering of multiple cameras onto the same portion of the pixel array, # the later cameras overwriting the former # # TODO: Add optional separator borders between cameras (or perhaps peel this off into a # CameraPlusOverlay class) # TODO, the classes below should likely be deleted class OldMultiCamera(Camera): """Parameters ---------- cameras_with_start_positions : tuple Tuples of (Camera, (start_y, start_x)) indicating camera and its pixel offset on the final frame. """ def __init__(self, *cameras_with_start_positions, **kwargs): self.shifted_cameras = [ DictAsObject( { "camera": camera_with_start_positions[0], "start_x": camera_with_start_positions[1][1], "start_y": camera_with_start_positions[1][0], "end_x": camera_with_start_positions[1][1] + camera_with_start_positions[0].pixel_width, "end_y": camera_with_start_positions[1][0] + camera_with_start_positions[0].pixel_height, }, ) for camera_with_start_positions in cameras_with_start_positions ] super().__init__(**kwargs) def capture_mobjects(self, mobjects, **kwargs): for shifted_camera in self.shifted_cameras: shifted_camera.camera.capture_mobjects(mobjects, **kwargs) self.pixel_array[ shifted_camera.start_y : shifted_camera.end_y, shifted_camera.start_x : shifted_camera.end_x, ] = shifted_camera.camera.pixel_array def set_background(self, pixel_array, **kwargs): for shifted_camera in self.shifted_cameras: shifted_camera.camera.set_background( pixel_array[ shifted_camera.start_y : shifted_camera.end_y, shifted_camera.start_x : shifted_camera.end_x, ], **kwargs, ) def set_pixel_array(self, pixel_array, **kwargs): super().set_pixel_array(pixel_array, **kwargs) for shifted_camera in self.shifted_cameras: shifted_camera.camera.set_pixel_array( pixel_array[ shifted_camera.start_y : shifted_camera.end_y, shifted_camera.start_x : shifted_camera.end_x, ], **kwargs, ) def init_background(self): super().init_background() for shifted_camera in self.shifted_cameras: shifted_camera.camera.init_background() # A OldMultiCamera which, when called with two full-size cameras, initializes itself # as a split screen, also taking care to resize each individual camera within it class SplitScreenCamera(OldMultiCamera): """Initializes a split screen camera setup with two side-by-side cameras. Parameters ---------- left_camera : Camera right_camera : Camera kwargs : dict """ def __init__(self, left_camera, right_camera, **kwargs): Camera.__init__(self, **kwargs) # to set attributes such as pixel_width self.left_camera = left_camera self.right_camera = right_camera half_width = math.ceil(self.pixel_width / 2) for camera in [self.left_camera, self.right_camera]: camera.reset_pixel_shape(camera.pixel_height, half_width) super().__init__( (left_camera, (0, 0)), (right_camera, (0, half_width)), ) ManimCommunity-manim-1157b74/manim/camera/moving_camera.py000066400000000000000000000217761515024150700235620ustar00rootroot00000000000000"""Defines the MovingCamera class, a camera that can pan and zoom through a scene. .. SEEALSO:: :mod:`.moving_camera_scene` """ from __future__ import annotations __all__ = ["MovingCamera"] from collections.abc import Iterable from typing import Any from cairo import Context from manim.typing import PixelArray, Point3D, Point3DLike from .. import config from ..camera.camera import Camera from ..constants import DOWN, LEFT, RIGHT, UP from ..mobject.frame import ScreenRectangle from ..mobject.mobject import Mobject from ..utils.color import WHITE, ManimColor class MovingCamera(Camera): """A camera that follows and matches the size and position of its 'frame', a Rectangle (or similar Mobject). The frame defines the region of space the camera displays and can move or resize dynamically. .. SEEALSO:: :class:`.MovingCameraScene` """ def __init__( self, frame: Mobject | None = None, fixed_dimension: int = 0, # width default_frame_stroke_color: ManimColor = WHITE, default_frame_stroke_width: int = 0, **kwargs: Any, ): """Frame is a Mobject, (should almost certainly be a rectangle) determining which region of space the camera displays """ self.fixed_dimension = fixed_dimension self.default_frame_stroke_color = default_frame_stroke_color self.default_frame_stroke_width = default_frame_stroke_width if frame is None: frame = ScreenRectangle(height=config["frame_height"]) frame.set_stroke( self.default_frame_stroke_color, self.default_frame_stroke_width, ) self.frame = frame super().__init__(**kwargs) # TODO, make these work for a rotated frame @property def frame_height(self) -> float: """Returns the height of the frame. Returns ------- float The height of the frame. """ return self.frame.height @frame_height.setter def frame_height(self, frame_height: float) -> None: """Sets the height of the frame in MUnits. Parameters ---------- frame_height The new frame_height. """ self.frame.stretch_to_fit_height(frame_height) @property def frame_width(self) -> float: """Returns the width of the frame Returns ------- float The width of the frame. """ return self.frame.width @frame_width.setter def frame_width(self, frame_width: float) -> None: """Sets the width of the frame in MUnits. Parameters ---------- frame_width The new frame_width. """ self.frame.stretch_to_fit_width(frame_width) @property def frame_center(self) -> Point3D: """Returns the centerpoint of the frame in cartesian coordinates. Returns ------- np.array The cartesian coordinates of the center of the frame. """ return self.frame.get_center() @frame_center.setter def frame_center(self, frame_center: Point3DLike | Mobject) -> None: """Sets the centerpoint of the frame. Parameters ---------- frame_center The point to which the frame must be moved. If is of type mobject, the frame will be moved to the center of that mobject. """ self.frame.move_to(frame_center) def capture_mobjects(self, mobjects: Iterable[Mobject], **kwargs: Any) -> None: # self.reset_frame_center() # self.realign_frame_shape() super().capture_mobjects(mobjects, **kwargs) def get_cached_cairo_context(self, pixel_array: PixelArray) -> None: """Since the frame can be moving around, the cairo context used for updating should be regenerated at each frame. So no caching. """ return None def cache_cairo_context(self, pixel_array: PixelArray, ctx: Context) -> None: """Since the frame can be moving around, the cairo context used for updating should be regenerated at each frame. So no caching. """ pass # def reset_frame_center(self): # self.frame_center = self.frame.get_center() # def realign_frame_shape(self): # height, width = self.frame_shape # if self.fixed_dimension == 0: # self.frame_shape = (height, self.frame.width # else: # self.frame_shape = (self.frame.height, width) # self.resize_frame_shape(fixed_dimension=self.fixed_dimension) def get_mobjects_indicating_movement(self) -> list[Mobject]: """Returns all mobjects whose movement implies that the camera should think of all other mobjects on the screen as moving Returns ------- list[Mobject] """ return [self.frame] def auto_zoom( self, mobjects: Iterable[Mobject], margin: float = 0, only_mobjects_in_frame: bool = False, animate: bool = True, ) -> Mobject: """Zooms on to a given array of mobjects (or a singular mobject) and automatically resizes to frame all the mobjects. .. NOTE:: This method only works when 2D-objects in the XY-plane are considered, it will not work correctly when the camera has been rotated. Parameters ---------- mobjects The mobject or array of mobjects that the camera will focus on. margin The width of the margin that is added to the frame (optional, 0 by default). only_mobjects_in_frame If set to ``True``, only allows focusing on mobjects that are already in frame. animate If set to ``False``, applies the changes instead of returning the corresponding animation Returns ------- Union[_AnimationBuilder, ScreenRectangle] _AnimationBuilder that zooms the camera view to a given list of mobjects or ScreenRectangle with position and size updated to zoomed position. """ ( scene_critical_x_left, scene_critical_x_right, scene_critical_y_up, scene_critical_y_down, ) = self._get_bounding_box(mobjects, only_mobjects_in_frame) # calculate center x and y x = (scene_critical_x_left + scene_critical_x_right) / 2 y = (scene_critical_y_up + scene_critical_y_down) / 2 # calculate proposed width and height of zoomed scene new_width = abs(scene_critical_x_left - scene_critical_x_right) new_height = abs(scene_critical_y_up - scene_critical_y_down) m_target = self.frame.animate if animate else self.frame # zoom to fit all mobjects along the side that has the largest size if new_width / self.frame.width > new_height / self.frame.height: return m_target.set_x(x).set_y(y).set(width=new_width + margin) else: return m_target.set_x(x).set_y(y).set(height=new_height + margin) def _get_bounding_box( self, mobjects: Iterable[Mobject], only_mobjects_in_frame: bool ) -> tuple[float, float, float, float]: bounding_box_located = False scene_critical_x_left: float = 0 scene_critical_x_right: float = 1 scene_critical_y_up: float = 1 scene_critical_y_down: float = 0 for m in mobjects: if (m == self.frame) or ( only_mobjects_in_frame and not self.is_in_frame(m) ): # detected camera frame, should not be used to calculate final position of camera continue # initialize scene critical points with first mobjects critical points if not bounding_box_located: scene_critical_x_left = m.get_critical_point(LEFT)[0] scene_critical_x_right = m.get_critical_point(RIGHT)[0] scene_critical_y_up = m.get_critical_point(UP)[1] scene_critical_y_down = m.get_critical_point(DOWN)[1] bounding_box_located = True else: if m.get_critical_point(LEFT)[0] < scene_critical_x_left: scene_critical_x_left = m.get_critical_point(LEFT)[0] if m.get_critical_point(RIGHT)[0] > scene_critical_x_right: scene_critical_x_right = m.get_critical_point(RIGHT)[0] if m.get_critical_point(UP)[1] > scene_critical_y_up: scene_critical_y_up = m.get_critical_point(UP)[1] if m.get_critical_point(DOWN)[1] < scene_critical_y_down: scene_critical_y_down = m.get_critical_point(DOWN)[1] if not bounding_box_located: raise Exception( "Could not determine bounding box of the mobjects given to 'auto_zoom'." ) return ( scene_critical_x_left, scene_critical_x_right, scene_critical_y_up, scene_critical_y_down, ) ManimCommunity-manim-1157b74/manim/camera/multi_camera.py000066400000000000000000000071351515024150700234060ustar00rootroot00000000000000"""A camera supporting multiple perspectives.""" from __future__ import annotations __all__ = ["MultiCamera"] from collections.abc import Iterable from typing import Any, Self from manim.mobject.mobject import Mobject from manim.mobject.types.image_mobject import ImageMobjectFromCamera from ..camera.moving_camera import MovingCamera from ..utils.iterables import list_difference_update class MultiCamera(MovingCamera): """Camera Object that allows for multiple perspectives.""" def __init__( self, image_mobjects_from_cameras: Iterable[ImageMobjectFromCamera] | None = None, allow_cameras_to_capture_their_own_display: bool = False, **kwargs: Any, ) -> None: """Initialises the MultiCamera Parameters ---------- image_mobjects_from_cameras kwargs Any valid keyword arguments of MovingCamera. """ self.image_mobjects_from_cameras: list[ImageMobjectFromCamera] = [] if image_mobjects_from_cameras is not None: for imfc in image_mobjects_from_cameras: self.add_image_mobject_from_camera(imfc) self.allow_cameras_to_capture_their_own_display = ( allow_cameras_to_capture_their_own_display ) super().__init__(**kwargs) def add_image_mobject_from_camera( self, image_mobject_from_camera: ImageMobjectFromCamera ) -> None: """Adds an ImageMobject that's been obtained from the camera into the list ``self.image_mobject_from_cameras`` Parameters ---------- image_mobject_from_camera The ImageMobject to add to self.image_mobject_from_cameras """ # A silly method to have right now, but maybe there are things # we want to guarantee about any imfc's added later. imfc = image_mobject_from_camera assert isinstance(imfc.camera, MovingCamera) self.image_mobjects_from_cameras.append(imfc) def update_sub_cameras(self) -> None: """Reshape sub_camera pixel_arrays""" for imfc in self.image_mobjects_from_cameras: pixel_height, pixel_width = self.pixel_array.shape[:2] # imfc.camera.frame_shape = ( # imfc.camera.frame.height, # imfc.camera.frame.width, # ) imfc.camera.reset_pixel_shape( int(pixel_height * imfc.height / self.frame_height), int(pixel_width * imfc.width / self.frame_width), ) def reset(self) -> Self: """Resets the MultiCamera. Returns ------- MultiCamera The reset MultiCamera """ for imfc in self.image_mobjects_from_cameras: imfc.camera.reset() super().reset() return self def capture_mobjects(self, mobjects: Iterable[Mobject], **kwargs: Any) -> None: self.update_sub_cameras() for imfc in self.image_mobjects_from_cameras: to_add = list(mobjects) if not self.allow_cameras_to_capture_their_own_display: to_add = list_difference_update(to_add, imfc.get_family()) imfc.camera.capture_mobjects(to_add, **kwargs) super().capture_mobjects(mobjects, **kwargs) def get_mobjects_indicating_movement(self) -> list[Mobject]: """Returns all mobjects whose movement implies that the camera should think of all other mobjects on the screen as moving Returns ------- list """ return [self.frame] + [ imfc.camera.frame for imfc in self.image_mobjects_from_cameras ] ManimCommunity-manim-1157b74/manim/camera/three_d_camera.py000066400000000000000000000365241515024150700236720ustar00rootroot00000000000000"""A camera that can be positioned and oriented in three-dimensional space.""" from __future__ import annotations __all__ = ["ThreeDCamera"] from collections.abc import Callable, Iterable from typing import Any import numpy as np from manim.mobject.mobject import Mobject from manim.mobject.three_d.three_d_utils import ( get_3d_vmob_end_corner, get_3d_vmob_end_corner_unit_normal, get_3d_vmob_start_corner, get_3d_vmob_start_corner_unit_normal, ) from manim.mobject.types.vectorized_mobject import VMobject from manim.mobject.value_tracker import ValueTracker from manim.typing import ( FloatRGBA_Array, MatrixMN, Point3D, Point3D_Array, Point3DLike, ) from .. import config from ..camera.camera import Camera from ..constants import * from ..mobject.types.point_cloud_mobject import Point from ..utils.color import get_shaded_rgb from ..utils.family import extract_mobject_family_members from ..utils.space_ops import rotation_about_z, rotation_matrix class ThreeDCamera(Camera): def __init__( self, focal_distance: float = 20.0, shading_factor: float = 0.2, default_distance: float = 5.0, light_source_start_point: Point3DLike = 9 * DOWN + 7 * LEFT + 10 * OUT, should_apply_shading: bool = True, exponential_projection: bool = False, phi: float = 0, theta: float = -90 * DEGREES, gamma: float = 0, zoom: float = 1, **kwargs: Any, ): """Initializes the ThreeDCamera Parameters ---------- *kwargs Any keyword argument of Camera. """ self._frame_center = Point(kwargs.get("frame_center", ORIGIN), stroke_width=0) super().__init__(**kwargs) self.focal_distance = focal_distance self.phi = phi self.theta = theta self.gamma = gamma self.zoom = zoom self.shading_factor = shading_factor self.default_distance = default_distance self.light_source_start_point = light_source_start_point self.light_source = Point(self.light_source_start_point) self.should_apply_shading = should_apply_shading self.exponential_projection = exponential_projection self.max_allowable_norm = 3 * config["frame_width"] self.phi_tracker = ValueTracker(self.phi) self.theta_tracker = ValueTracker(self.theta) self.focal_distance_tracker = ValueTracker(self.focal_distance) self.gamma_tracker = ValueTracker(self.gamma) self.zoom_tracker = ValueTracker(self.zoom) self.fixed_orientation_mobjects: dict[Mobject, Callable[[], Point3D]] = {} self.fixed_in_frame_mobjects: set[Mobject] = set() self.reset_rotation_matrix() @property def frame_center(self) -> Point3D: return self._frame_center.points[0] @frame_center.setter def frame_center(self, point: Point3DLike) -> None: self._frame_center.move_to(point) def capture_mobjects(self, mobjects: Iterable[Mobject], **kwargs: Any) -> None: self.reset_rotation_matrix() super().capture_mobjects(mobjects, **kwargs) def get_value_trackers(self) -> list[ValueTracker]: """A list of :class:`ValueTrackers <.ValueTracker>` of phi, theta, focal_distance, gamma and zoom. Returns ------- list list of ValueTracker objects """ return [ self.phi_tracker, self.theta_tracker, self.focal_distance_tracker, self.gamma_tracker, self.zoom_tracker, ] def modified_rgbas( self, vmobject: VMobject, rgbas: FloatRGBA_Array ) -> FloatRGBA_Array: if not self.should_apply_shading: return rgbas if vmobject.shade_in_3d and (vmobject.get_num_points() > 0): light_source_point = self.light_source.points[0] if len(rgbas) < 2: shaded_rgbas = rgbas.repeat(2, axis=0) else: shaded_rgbas = np.array(rgbas[:2]) shaded_rgbas[0, :3] = get_shaded_rgb( shaded_rgbas[0, :3], get_3d_vmob_start_corner(vmobject), get_3d_vmob_start_corner_unit_normal(vmobject), light_source_point, ) shaded_rgbas[1, :3] = get_shaded_rgb( shaded_rgbas[1, :3], get_3d_vmob_end_corner(vmobject), get_3d_vmob_end_corner_unit_normal(vmobject), light_source_point, ) return shaded_rgbas return rgbas def get_stroke_rgbas( self, vmobject: VMobject, background: bool = False, ) -> FloatRGBA_Array: # NOTE : DocStrings From parent return self.modified_rgbas(vmobject, vmobject.get_stroke_rgbas(background)) def get_fill_rgbas( self, vmobject: VMobject ) -> FloatRGBA_Array: # NOTE : DocStrings From parent return self.modified_rgbas(vmobject, vmobject.get_fill_rgbas()) def get_mobjects_to_display( self, *args: Any, **kwargs: Any ) -> list[Mobject]: # NOTE : DocStrings From parent mobjects = super().get_mobjects_to_display(*args, **kwargs) rot_matrix = self.get_rotation_matrix() def z_key(mob: Mobject) -> float: if not (hasattr(mob, "shade_in_3d") and mob.shade_in_3d): return np.inf # type: ignore[no-any-return] # Assign a number to a three dimensional mobjects # based on how close it is to the camera distance: float = np.dot(mob.get_z_index_reference_point(), rot_matrix.T)[2] return distance return sorted(mobjects, key=z_key) def get_phi(self) -> float: """Returns the Polar angle (the angle off Z_AXIS) phi. Returns ------- float The Polar angle in radians. """ return self.phi_tracker.get_value() def get_theta(self) -> float: """Returns the Azimuthal i.e the angle that spins the camera around the Z_AXIS. Returns ------- float The Azimuthal angle in radians. """ return self.theta_tracker.get_value() def get_focal_distance(self) -> float: """Returns focal_distance of the Camera. Returns ------- float The focal_distance of the Camera in MUnits. """ return self.focal_distance_tracker.get_value() def get_gamma(self) -> float: """Returns the rotation of the camera about the vector from the ORIGIN to the Camera. Returns ------- float The angle of rotation of the camera about the vector from the ORIGIN to the Camera in radians """ return self.gamma_tracker.get_value() def get_zoom(self) -> float: """Returns the zoom amount of the camera. Returns ------- float The zoom amount of the camera. """ return self.zoom_tracker.get_value() def set_phi(self, value: float) -> None: """Sets the polar angle i.e the angle between Z_AXIS and Camera through ORIGIN in radians. Parameters ---------- value The new value of the polar angle in radians. """ self.phi_tracker.set_value(value) def set_theta(self, value: float) -> None: """Sets the azimuthal angle i.e the angle that spins the camera around Z_AXIS in radians. Parameters ---------- value The new value of the azimuthal angle in radians. """ self.theta_tracker.set_value(value) def set_focal_distance(self, value: float) -> None: """Sets the focal_distance of the Camera. Parameters ---------- value The focal_distance of the Camera. """ self.focal_distance_tracker.set_value(value) def set_gamma(self, value: float) -> None: """Sets the angle of rotation of the camera about the vector from the ORIGIN to the Camera. Parameters ---------- value The new angle of rotation of the camera. """ self.gamma_tracker.set_value(value) def set_zoom(self, value: float) -> None: """Sets the zoom amount of the camera. Parameters ---------- value The zoom amount of the camera. """ self.zoom_tracker.set_value(value) def reset_rotation_matrix(self) -> None: """Sets the value of self.rotation_matrix to the matrix corresponding to the current position of the camera """ self.rotation_matrix = self.generate_rotation_matrix() def get_rotation_matrix(self) -> MatrixMN: """Returns the matrix corresponding to the current position of the camera. Returns ------- np.array The matrix corresponding to the current position of the camera. """ return self.rotation_matrix def generate_rotation_matrix(self) -> MatrixMN: """Generates a rotation matrix based off the current position of the camera. Returns ------- np.array The matrix corresponding to the current position of the camera. """ phi = self.get_phi() theta = self.get_theta() gamma = self.get_gamma() matrices = [ rotation_about_z(-theta - 90 * DEGREES), rotation_matrix(-phi, RIGHT), rotation_about_z(gamma), ] result = np.identity(3) for matrix in matrices: result = np.dot(matrix, result) return result def project_points(self, points: Point3D_Array) -> Point3D_Array: """Applies the current rotation_matrix as a projection matrix to the passed array of points. Parameters ---------- points The list of points to project. Returns ------- np.array The points after projecting. """ frame_center = self.frame_center focal_distance = self.get_focal_distance() zoom = self.get_zoom() rot_matrix = self.get_rotation_matrix() points = points - frame_center points = np.dot(points, rot_matrix.T) zs = points[:, 2] for i in 0, 1: if self.exponential_projection: # Proper projection would involve multiplying # x and y by d / (d-z). But for points with high # z value that causes weird artifacts, and applying # the exponential helps smooth it out. factor = np.exp(zs / focal_distance) lt0 = zs < 0 factor[lt0] = focal_distance / (focal_distance - zs[lt0]) else: factor = focal_distance / (focal_distance - zs) factor[(focal_distance - zs) < 0] = 10**6 points[:, i] *= factor * zoom return points def project_point(self, point: Point3D) -> Point3D: """Applies the current rotation_matrix as a projection matrix to the passed point. Parameters ---------- point The point to project. Returns ------- np.array The point after projection. """ return self.project_points(point.reshape((1, 3)))[0, :] def transform_points_pre_display( self, mobject: Mobject, points: Point3D_Array, ) -> Point3D_Array: # TODO: Write Docstrings for this Method. points = super().transform_points_pre_display(mobject, points) fixed_orientation = mobject in self.fixed_orientation_mobjects fixed_in_frame = mobject in self.fixed_in_frame_mobjects if fixed_in_frame: return points if fixed_orientation: center_func = self.fixed_orientation_mobjects[mobject] center = center_func() new_center = self.project_point(center) return points + (new_center - center) else: return self.project_points(points) def add_fixed_orientation_mobjects( self, *mobjects: Mobject, use_static_center_func: bool = False, center_func: Callable[[], Point3D] | None = None, ) -> None: """This method allows the mobject to have a fixed orientation, even when the camera moves around. E.G If it was passed through this method, facing the camera, it will continue to face the camera even as the camera moves. Highly useful when adding labels to graphs and the like. Parameters ---------- *mobjects The mobject whose orientation must be fixed. use_static_center_func Whether or not to use the function that takes the mobject's center as centerpoint, by default False center_func The function which returns the centerpoint with respect to which the mobject will be oriented, by default None """ # This prevents the computation of mobject.get_center # every single time a projection happens def get_static_center_func(mobject: Mobject) -> Callable[[], Point3D]: point = mobject.get_center() return lambda: point for mobject in mobjects: if center_func: func = center_func elif use_static_center_func: func = get_static_center_func(mobject) else: func = mobject.get_center for submob in mobject.get_family(): self.fixed_orientation_mobjects[submob] = func def add_fixed_in_frame_mobjects(self, *mobjects: Mobject) -> None: """This method allows the mobject to have a fixed position, even when the camera moves around. E.G If it was passed through this method, at the top of the frame, it will continue to be displayed at the top of the frame. Highly useful when displaying Titles or formulae or the like. Parameters ---------- **mobjects The mobject to fix in frame. """ for mobject in extract_mobject_family_members(mobjects): self.fixed_in_frame_mobjects.add(mobject) def remove_fixed_orientation_mobjects(self, *mobjects: Mobject) -> None: """If a mobject was fixed in its orientation by passing it through :meth:`.add_fixed_orientation_mobjects`, then this undoes that fixing. The Mobject will no longer have a fixed orientation. Parameters ---------- mobjects The mobjects whose orientation need not be fixed any longer. """ for mobject in extract_mobject_family_members(mobjects): if mobject in self.fixed_orientation_mobjects: del self.fixed_orientation_mobjects[mobject] def remove_fixed_in_frame_mobjects(self, *mobjects: Mobject) -> None: """If a mobject was fixed in frame by passing it through :meth:`.add_fixed_in_frame_mobjects`, then this undoes that fixing. The Mobject will no longer be fixed in frame. Parameters ---------- mobjects The mobjects which need not be fixed in frame any longer. """ for mobject in extract_mobject_family_members(mobjects): if mobject in self.fixed_in_frame_mobjects: self.fixed_in_frame_mobjects.remove(mobject) ManimCommunity-manim-1157b74/manim/cli/000077500000000000000000000000001515024150700177035ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/__init__.py000066400000000000000000000005271515024150700220200ustar00rootroot00000000000000"""The Manim CLI, and the available commands for ``manim``. This page is a work in progress. Please run ``manim`` or ``manim --help`` in your terminal to find more information on the following commands. Available commands ------------------ .. autosummary:: :toctree: ../reference cfg checkhealth init plugins render """ ManimCommunity-manim-1157b74/manim/cli/cfg/000077500000000000000000000000001515024150700204425ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/cfg/__init__.py000066400000000000000000000000001515024150700225410ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/cfg/group.py000066400000000000000000000246271515024150700221630ustar00rootroot00000000000000"""Manim's cfg subcommand. Manim's cfg subcommand is accessed in the command-line interface via ``manim cfg``. Here you can specify options, subcommands, and subgroups for the cfg group. """ from __future__ import annotations import contextlib from ast import literal_eval from pathlib import Path from typing import Any, cast import cloup from rich.errors import StyleSyntaxError from rich.style import Style from manim._config import cli_ctx_settings, console from manim._config.utils import config_file_paths, make_config_parser from manim.constants import EPILOG from manim.utils.file_ops import guarantee_existence, open_file RICH_COLOUR_INSTRUCTIONS: str = """ [red]The default colour is used by the input statement. If left empty, the default colour will be used.[/red] [magenta] For a full list of styles, visit[/magenta] [green]https://rich.readthedocs.io/en/latest/style.html[/green] """ RICH_NON_STYLE_ENTRIES: list[str] = ["log.width", "log.height", "log.timestamps"] __all__ = [ "value_from_string", "value_from_string", "is_valid_style", "replace_keys", "cfg", "write", "show", "export", ] def value_from_string(value: str) -> str | int | bool: """Extract the literal of proper datatype from a ``value`` string. Parameters ---------- value The value to check get the literal from. Returns ------- :class:`str` | :class:`int` | :class:`bool` The literal of appropriate datatype. """ with contextlib.suppress(SyntaxError, ValueError): value = literal_eval(value) return value def _is_expected_datatype( value: str, expected: str, validate_style: bool = False ) -> bool: """Check whether the literal from ``value`` is the same datatype as the literal from ``expected``. If ``validate_style`` is ``True``, also check if the style given by ``value`` is valid, according to ``rich``. Parameters ---------- value The string of the value to check, obtained from reading the user input. expected The string of the literal datatype which must be matched by ``value``. This is obtained from reading the ``cfg`` file. validate_style Whether or not to confirm if ``value`` is a valid style, according to ``rich``. Default is ``False``. Returns ------- :class:`bool` Whether or not the literal from ``value`` matches the datatype of the literal from ``expected``. """ value_literal = value_from_string(value) ExpectedLiteralType = type(value_from_string(expected)) return isinstance(value_literal, ExpectedLiteralType) and ( (isinstance(value_literal, str) and is_valid_style(value_literal)) if validate_style else True ) def is_valid_style(style: str) -> bool: """Checks whether the entered color style is valid, according to ``rich``. Parameters ---------- style The style to check whether it is valid. Returns ------- :class:`bool` Whether the color style is valid or not, according to ``rich``. """ try: Style.parse(style) return True except StyleSyntaxError: return False def replace_keys(default: dict[str, Any]) -> dict[str, Any]: """Replace ``_`` with ``.`` and vice versa in a dictionary's keys for ``rich``. Parameters ---------- default The dictionary whose keys will be checked and replaced. Returns ------- :class:`dict` The dictionary whose keys are modified by replacing ``_`` with ``.`` and vice versa. """ for key in default: if "_" in key: temp = default[key] del default[key] key = key.replace("_", ".") default[key] = temp else: temp = default[key] del default[key] key = key.replace(".", "_") default[key] = temp return default @cloup.group( context_settings=cli_ctx_settings, invoke_without_command=True, no_args_is_help=True, epilog=EPILOG, help="Manages Manim configuration files.", ) @cloup.pass_context def cfg(ctx: cloup.Context) -> None: """Responsible for the cfg subcommand.""" pass @cfg.command(context_settings=cli_ctx_settings, no_args_is_help=True) @cloup.option( "-l", "--level", type=cloup.Choice(["user", "cwd"], case_sensitive=False), default="cwd", help="Specify if this config is for user or the working directory.", ) @cloup.option("-o", "--open", "openfile", is_flag=True) def write(level: str | None = None, openfile: bool = False) -> None: config_paths = config_file_paths() console.print( "[yellow bold]Manim Configuration File Writer[/yellow bold]", justify="center", ) USER_CONFIG_MSG = f"""A configuration file at [yellow]{config_paths[1]}[/yellow] has been created with your required changes. This will be used when running the manim command. If you want to override this config, you will have to create a manim.cfg in the local directory, where you want those changes to be overridden.""" CWD_CONFIG_MSG = f"""A configuration file at [yellow]{config_paths[2]}[/yellow] has been created. To save your config please save that file and place it in your current working directory, from where you run the manim command.""" parser = make_config_parser() if not openfile: action = "save this as" for category in parser: console.print(f"{category}", style="bold green underline") default = cast(dict[str, Any], parser[category]) if category == "logger": console.print(RICH_COLOUR_INSTRUCTIONS) default = replace_keys(default) for key in default: # All the cfg entries for logger need to be validated as styles, # as long as they aren't setting the log width or height etc if category == "logger" and key not in RICH_NON_STYLE_ENTRIES: desc = "style" style = default[key] else: desc = "value" style = None console.print(f"Enter the {desc} for {key} ", style=style, end="") if category != "logger" or key in RICH_NON_STYLE_ENTRIES: defaultval = ( repr(default[key]) if isinstance(value_from_string(default[key]), str) else default[key] ) console.print(f"(defaults to {defaultval}) :", end="") try: temp = input() except EOFError: raise Exception( """Not enough values in input. You may have added a new entry to default.cfg, in which case you will have to modify write_cfg_subcmd_input to account for it.""", ) from None if temp: while temp and not _is_expected_datatype( temp, default[key], bool(style), ): console.print( f"[red bold]Invalid {desc}. Try again.[/red bold]", ) console.print( f"Enter the {desc} for {key}:", style=style, end="", ) temp = input() default[key] = temp.replace("%", "%%") default = replace_keys(default) if category == "logger" else default parser[category] = { i: v.replace("%", "%%") for i, v in dict(default).items() } else: action = "open" if level is None: console.print( f"Do you want to {action} the default config for this User?(y/n)[[n]]", style="dim purple", end="", ) action_to_userpath = input() else: action_to_userpath = "" if action_to_userpath.lower() == "y" or level == "user": cfg_file_path = config_paths[1] guarantee_existence(config_paths[1].parents[0]) console.print(USER_CONFIG_MSG) else: cfg_file_path = config_paths[2] guarantee_existence(config_paths[2].parents[0]) console.print(CWD_CONFIG_MSG) with cfg_file_path.open("w") as fp: parser.write(fp) if openfile: open_file(cfg_file_path) @cfg.command(context_settings=cli_ctx_settings) def show() -> None: console.print("CONFIG FILES READ", style="bold green underline") for path in config_file_paths(): if path.exists(): console.print(f"{path}") console.print() parser = make_config_parser() rich_non_style_entries = [a.replace(".", "_") for a in RICH_NON_STYLE_ENTRIES] for category in parser: console.print(f"{category}", style="bold green underline") for entry in parser[category]: if category == "logger" and entry not in rich_non_style_entries: console.print(f"{entry} :", end="") console.print( f" {parser[category][entry]}", style=parser[category][entry], ) else: console.print(f"{entry} : {parser[category][entry]}") console.print("\n") @cfg.command(context_settings=cli_ctx_settings) @cloup.option("-d", "--directory", default=Path.cwd()) @cloup.pass_context def export(ctx: cloup.Context, directory: str) -> None: directory_path = Path(directory) if directory_path.absolute == Path.cwd().absolute: console.print( """You are reading the config from the same directory you are exporting to. This means that the exported config will overwrite the config for this directory. Are you sure you want to continue? (y/n)""", style="red bold", end="", ) proceed = input().lower() == "y" else: proceed = True if proceed: if not directory_path.is_dir(): console.print(f"Creating folder: {directory}.", style="red bold") directory_path.mkdir(parents=True, exist_ok=True) ctx.invoke(write) from_path = Path.cwd() / "manim.cfg" to_path = directory_path / "manim.cfg" console.print(f"Exported final Config at {from_path} to {to_path}.") else: console.print("Aborted...", style="red bold") ManimCommunity-manim-1157b74/manim/cli/checkhealth/000077500000000000000000000000001515024150700221465ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/checkhealth/__init__.py000066400000000000000000000000001515024150700242450ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/checkhealth/checks.py000066400000000000000000000143541515024150700237670ustar00rootroot00000000000000"""Auxiliary module for the checkhealth subcommand, contains the actual check implementations. """ from __future__ import annotations import os import shutil from collections.abc import Callable from typing import Protocol, cast __all__ = ["HEALTH_CHECKS"] class HealthCheckFunction(Protocol): description: str recommendation: str skip_on_failed: list[str] post_fail_fix_hook: Callable[..., object] | None __name__: str def __call__(self) -> bool: ... HEALTH_CHECKS: list[HealthCheckFunction] = [] def healthcheck( description: str, recommendation: str, skip_on_failed: list[HealthCheckFunction | str] | None = None, post_fail_fix_hook: Callable[..., object] | None = None, ) -> Callable[[Callable[[], bool]], HealthCheckFunction]: """Decorator used for declaring health checks. This decorator attaches some data to a function, which is then added to a a list containing all checks. Parameters ---------- description A brief description of this check, displayed when the ``checkhealth`` subcommand is run. recommendation Help text which is displayed in case the check fails. skip_on_failed A list of check functions which, if they fail, cause the current check to be skipped. post_fail_fix_hook A function that is meant to (interactively) help to fix the detected problem, if possible. This is only called upon explicit confirmation of the user. Returns ------- Callable[Callable[[], bool], :class:`HealthCheckFunction`] A decorator which converts a function into a health check function, as required by the ``checkhealth`` subcommand. """ new_skip_on_failed: list[str] if skip_on_failed is None: new_skip_on_failed = [] else: new_skip_on_failed = [ skip.__name__ if callable(skip) else skip for skip in skip_on_failed ] def wrapper(func: Callable[[], bool]) -> HealthCheckFunction: health_func = cast(HealthCheckFunction, func) health_func.description = description health_func.recommendation = recommendation health_func.skip_on_failed = new_skip_on_failed health_func.post_fail_fix_hook = post_fail_fix_hook HEALTH_CHECKS.append(health_func) return health_func return wrapper @healthcheck( description="Checking whether manim is on your PATH", recommendation=( "The command is currently not on your system's PATH.\n\n" "You can work around this by calling the manim module directly " "via instead of just .\n\n" "To fix the PATH issue properly: " "Usually, the Python package installer pip issues a warning " "during the installation which contains more information. " "Consider reinstalling manim via " "followed by to see the warning again, " "then consult the internet on how to modify your system's " "PATH variable." ), ) def is_manim_on_path() -> bool: """Check whether ``manim`` is in ``PATH``. Returns ------- :class:`bool` Whether ``manim`` is in ``PATH`` or not. """ path_to_manim = shutil.which("manim") return path_to_manim is not None @healthcheck( description="Checking whether the executable belongs to manim", recommendation=( "The command does not belong to your installed version " "of this library, it likely belongs to manimgl / manimlib.\n\n" "Run manim via or via , or uninstall " "and reinstall manim via to fix this." ), skip_on_failed=[is_manim_on_path], ) def is_manim_executable_associated_to_this_library() -> bool: """Check whether the ``manim`` executable in ``PATH`` is associated to this library. To verify this, the executable should look like this: .. code-block:: python #!/.../python import sys from manim.__main__ import main if __name__ == "__main__": sys.exit(main()) Returns ------- :class:`bool` Whether the ``manim`` executable in ``PATH`` is associated to this library or not. """ path_to_manim = shutil.which("manim") assert path_to_manim is not None with open(path_to_manim, "rb") as manim_binary: manim_exec = manim_binary.read() # first condition below corresponds to the executable being # some sort of python script. second condition happens when # the executable is actually a Windows batch file. return b"manim.__main__" in manim_exec or b'"%~dp0\\manim"' in manim_exec @healthcheck( description="Checking whether latex is available", recommendation=( "Manim cannot find on your system's PATH. " "You will not be able to use Tex and MathTex mobjects " "in your scenes.\n\n" "Consult our installation instructions " "at https://docs.manim.community/en/stable/installation.html " "or search the web for instructions on how to install a " "LaTeX distribution on your operating system." ), ) def is_latex_available() -> bool: """Check whether ``latex`` is in ``PATH`` and can be executed. Returns ------- :class:`bool` Whether ``latex`` is in ``PATH`` and can be executed or not. """ path_to_latex = shutil.which("latex") return path_to_latex is not None and os.access(path_to_latex, os.X_OK) @healthcheck( description="Checking whether dvisvgm is available", recommendation=( "Manim could find , but not on your system's " "PATH. Make sure your installed LaTeX distribution comes with " "dvisvgm and consider installing a larger distribution if it " "does not." ), skip_on_failed=[is_latex_available], ) def is_dvisvgm_available() -> bool: """Check whether ``dvisvgm`` is in ``PATH`` and can be executed. Returns ------- :class:`bool` Whether ``dvisvgm`` is in ``PATH`` and can be executed or not. """ path_to_dvisvgm = shutil.which("dvisvgm") return path_to_dvisvgm is not None and os.access(path_to_dvisvgm, os.X_OK) ManimCommunity-manim-1157b74/manim/cli/checkhealth/commands.py000066400000000000000000000061171515024150700243260ustar00rootroot00000000000000"""A CLI utility helping to diagnose problems with your Manim installation. """ from __future__ import annotations import sys import timeit import click import cloup from manim.cli.checkhealth.checks import HEALTH_CHECKS, HealthCheckFunction __all__ = ["checkhealth"] @cloup.command( context_settings=None, ) def checkhealth() -> None: """This subcommand checks whether Manim is installed correctly and has access to its required (and optional) system dependencies. """ click.echo(f"Python executable: {sys.executable}\n") click.echo("Checking whether your installation of Manim Community is healthy...") failed_checks: list[HealthCheckFunction] = [] for check in HEALTH_CHECKS: click.echo(f"- {check.description} ... ", nl=False) if any( failed_check.__name__ in check.skip_on_failed for failed_check in failed_checks ): click.secho("SKIPPED", fg="blue") continue check_result = check() if check_result: click.secho("PASSED", fg="green") else: click.secho("FAILED", fg="red") failed_checks.append(check) click.echo() if failed_checks: click.echo( "There are problems with your installation, " "here are some recommendations to fix them:" ) for ind, failed_check in enumerate(failed_checks): click.echo(failed_check.recommendation) if ind + 1 < len(failed_checks): click.confirm("Continue with next recommendation?") else: # no problems detected! click.echo("No problems detected, your installation seems healthy!") render_test_scene = click.confirm( "Would you like to render and preview a test scene?" ) if render_test_scene: import manim as mn class CheckHealthDemo(mn.Scene): def _inner_construct(self) -> None: banner = mn.ManimBanner().shift(mn.UP * 0.5) self.play(banner.create()) self.wait(0.5) self.play(banner.expand()) self.wait(0.5) text_left = mn.Text("All systems operational!") formula_right = mn.MathTex(r"\oint_{\gamma} f(z)~dz = 0") text_tex_group = mn.VGroup(text_left, formula_right) text_tex_group.arrange(mn.RIGHT, buff=1).next_to(banner, mn.DOWN) self.play(mn.Write(text_tex_group)) self.wait(0.5) self.play( mn.FadeOut(banner, shift=mn.UP), mn.FadeOut(text_tex_group, shift=mn.DOWN), ) def construct(self) -> None: self.execution_time = timeit.timeit(self._inner_construct, number=1) with mn.tempconfig({"preview": True, "disable_caching": True}): scene = CheckHealthDemo() scene.render() click.echo(f"Scene rendered in {scene.execution_time:.2f} seconds.") ManimCommunity-manim-1157b74/manim/cli/default_group.py000066400000000000000000000155231515024150700231230ustar00rootroot00000000000000"""``DefaultGroup`` allows a subcommand to act as the main command. In particular, this class is what allows ``manim`` to act as ``manim render``. .. note:: This is a vendored version of https://github.com/click-contrib/click-default-group/ under the BSD 3-Clause "New" or "Revised" License. This library isn't used as a dependency, as we need to inherit from :class:`cloup.Group` instead of :class:`click.Group`. """ from __future__ import annotations import warnings from collections.abc import Callable from typing import TYPE_CHECKING, Any import cloup from manim.utils.deprecation import deprecated __all__ = ["DefaultGroup"] if TYPE_CHECKING: from click import Command, Context class DefaultGroup(cloup.Group): """Invokes a subcommand marked with ``default=True`` if any subcommand is not chosen. Parameters ---------- *args Positional arguments to forward to :class:`cloup.Group`. **kwargs Keyword arguments to forward to :class:`cloup.Group`. The keyword ``ignore_unknown_options`` must be set to ``False``. Attributes ---------- default_cmd_name : str | None The name of the default command, if specified through the ``default`` keyword argument. Otherwise, this is set to ``None``. default_if_no_args : bool Whether to include or not the default command, if no command arguments are supplied. This can be specified through the ``default_if_no_args`` keyword argument. Default is ``False``. """ def __init__(self, *args: Any, **kwargs: Any): # To resolve as the default command. if not kwargs.get("ignore_unknown_options", True): raise ValueError("Default group accepts unknown options") self.ignore_unknown_options = True self.default_cmd_name: str | None = kwargs.pop("default", None) self.default_if_no_args: bool = kwargs.pop("default_if_no_args", False) super().__init__(*args, **kwargs) def set_default_command(self, command: Command) -> None: """Sets a command function as the default command. Parameters ---------- command The command to set as default. """ cmd_name = command.name self.add_command(command) self.default_cmd_name = cmd_name def parse_args(self, ctx: Context, args: list[str]) -> list[str]: """Parses the list of ``args`` by forwarding it to :meth:`cloup.Group.parse_args`. Before doing so, if :attr:`default_if_no_args` is set to ``True`` and ``args`` is empty, this function appends to it the name of the default command specified by :attr:`default_cmd_name`. Parameters ---------- ctx The Click context. args A list of arguments. If it's empty and :attr:`default_if_no_args` is ``True``, append the name of the default command to it. Returns ------- list[str] The parsed arguments. """ if not args and self.default_if_no_args and self.default_cmd_name: args.insert(0, self.default_cmd_name) parsed_args: list[str] = super().parse_args(ctx, args) return parsed_args def get_command(self, ctx: Context, cmd_name: str) -> Command | None: """Get a command function by its name, by forwarding the arguments to :meth:`cloup.Group.get_command`. If ``cmd_name`` does not match any of the command names in :attr:`commands`, attempt to get the default command instead. Parameters ---------- ctx The Click context. cmd_name The name of the command to get. Returns ------- :class:`click.Command` | None The command, if found. Otherwise, ``None``. """ if cmd_name not in self.commands and self.default_cmd_name: # No command name matched. ctx.meta["arg0"] = cmd_name cmd_name = self.default_cmd_name return super().get_command(ctx, cmd_name) def resolve_command( self, ctx: Context, args: list[str] ) -> tuple[str | None, Command | None, list[str]]: """Given a list of ``args`` given by a CLI, find a command which matches the first element, and return its name (``cmd_name``), the command function itself (``cmd``) and the rest of the arguments which shall be passed to the function (``cmd_args``). If not found, return ``None``, ``None`` and the rest of the arguments. After resolving the command, if the Click context given by ``ctx`` contains an ``arg0`` attribute in its :attr:`click.Context.meta` dictionary, insert it as the first element of the returned ``cmd_args``. Parameters ---------- ctx The Click context. cmd_name The name of the command to get. Returns ------- cmd_name : str | None The command name, if found. Otherwise, ``None``. cmd : :class:`click.Command` | None The command, if found. Otherwise, ``None``. cmd_args : list[str] The rest of the arguments to be passed to ``cmd``. """ cmd_name, cmd, args = super().resolve_command(ctx, args) if "arg0" in ctx.meta: args.insert(0, ctx.meta["arg0"]) if cmd is not None: cmd_name = cmd.name return cmd_name, cmd, args @deprecated def command( self, *args: Any, **kwargs: Any ) -> Callable[[Callable[..., object]], Command]: """Return a decorator which converts any function into the default subcommand for this :class:`DefaultGroup`. .. warning:: This method is deprecated. Use the ``default`` parameter of :class:`DefaultGroup` or :meth:`set_default_command` instead. Parameters ---------- *args Positional arguments to pass to :meth:`cloup.Group.command`. **kwargs Keyword arguments to pass to :meth:`cloup.Group.command`. Returns ------- Callable[[Callable[..., object]], click.Command] A decorator which transforms its input into this :class:`DefaultGroup`'s default subcommand. """ default = kwargs.pop("default", False) decorator: Callable[[Callable[..., object]], Command] = super().command( *args, **kwargs ) if not default: return decorator warnings.warn( "Use default param of DefaultGroup or set_default_command() instead", DeprecationWarning, stacklevel=1, ) def _decorator(f: Callable) -> Command: cmd = decorator(f) self.set_default_command(cmd) return cmd return _decorator ManimCommunity-manim-1157b74/manim/cli/init/000077500000000000000000000000001515024150700206465ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/init/__init__.py000066400000000000000000000000001515024150700227450ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/init/commands.py000066400000000000000000000140271515024150700230250ustar00rootroot00000000000000"""Manim's init subcommand. Manim's init subcommand is accessed in the command-line interface via ``manim init``. Here you can specify options, subcommands, and subgroups for the init group. """ from __future__ import annotations import configparser from pathlib import Path from typing import Any import click import cloup from manim._config import console from manim.constants import CONTEXT_SETTINGS, EPILOG, QUALITIES from manim.utils.file_ops import ( add_import_statement, copy_template_files, get_template_names, get_template_path, ) CFG_DEFAULTS = { "frame_rate": 30, "background_color": "BLACK", "background_opacity": 1, "scene_names": "Default", "resolution": (1920, 1080), } __all__ = ["select_resolution", "update_cfg", "project", "scene"] def select_resolution() -> tuple[int, int]: """Prompts input of type click.Choice from user. Presents options from QUALITIES constant. Returns ------- tuple[int, int] Tuple containing height and width. """ resolution_options: list[tuple[int, int]] = [ (quality[1]["pixel_height"], quality[1]["pixel_width"]) for quality in QUALITIES.items() ] resolution_options.pop() choice = click.prompt( "\nSelect resolution:\n", type=cloup.Choice([f"{i[0]}p" for i in resolution_options]), show_default=False, default="480p", ) matches = [res for res in resolution_options if f"{res[0]}p" == choice] return matches[0] def update_cfg(cfg_dict: dict[str, Any], project_cfg_path: Path) -> None: """Update the ``manim.cfg`` file after reading it from the specified ``project_cfg_path``. Parameters ---------- cfg_dict Values used to update ``manim.cfg`` which is found in ``project_cfg_path``. project_cfg_path Path of the ``manim.cfg`` file. """ config = configparser.ConfigParser() config.read(project_cfg_path) cli_config = config["CLI"] for key, value in cfg_dict.items(): if key == "resolution": cli_config["pixel_height"] = str(value[0]) cli_config["pixel_width"] = str(value[1]) else: cli_config[key] = str(value) with project_cfg_path.open("w") as conf: config.write(conf) @cloup.command( context_settings=CONTEXT_SETTINGS, epilog=EPILOG, ) @cloup.argument("project_name", type=cloup.Path(path_type=Path), required=False) @cloup.option( "-d", "--default", "default_settings", is_flag=True, help="Default settings for project creation.", nargs=1, ) def project(default_settings: bool, **kwargs: Any) -> None: """Creates a new project. PROJECT_NAME is the name of the folder in which the new project will be initialized. """ project_name: Path if kwargs["project_name"]: project_name = kwargs["project_name"] else: project_name = click.prompt("Project Name", type=Path) # in the future when implementing a full template system. Choices are going to be saved in some sort of config file for templates template_name = click.prompt( "Template", type=click.Choice(get_template_names(), False), default="Default", ) if project_name.is_dir(): console.print( f"\nFolder [red]{project_name}[/red] exists. Please type another name\n", ) else: project_name.mkdir() new_cfg: dict[str, Any] = {} new_cfg_path = Path.resolve(project_name / "manim.cfg") if not default_settings: for key, value in CFG_DEFAULTS.items(): if key == "scene_names": new_cfg[key] = template_name + "Template" elif key == "resolution": new_cfg[key] = select_resolution() else: new_cfg[key] = click.prompt(f"\n{key}", default=value) console.print("\n", new_cfg) if click.confirm("Do you want to continue?", default=True, abort=True): copy_template_files(project_name, template_name) update_cfg(new_cfg, new_cfg_path) else: copy_template_files(project_name, template_name) update_cfg(CFG_DEFAULTS, new_cfg_path) @cloup.command( context_settings=CONTEXT_SETTINGS, no_args_is_help=True, epilog=EPILOG, ) @cloup.argument("scene_name", type=str, required=True) @cloup.argument("file_name", type=str, required=False) def scene(**kwargs: Any) -> None: """Inserts a SCENE to an existing FILE or creates a new FILE. SCENE is the name of the scene that will be inserted. FILE is the name of file in which the SCENE will be inserted. """ template_name: str = click.prompt( "template", type=click.Choice(get_template_names(), False), default="Default", ) scene = (get_template_path() / f"{template_name}.mtp").resolve().read_text() scene = scene.replace(template_name + "Template", kwargs["scene_name"], 1) if kwargs["file_name"]: file_name = Path(kwargs["file_name"]) if file_name.suffix != ".py": file_name = file_name.with_suffix(file_name.suffix + ".py") if file_name.is_file(): # file exists so we are going to append new scene to that file with file_name.open("a") as f: f.write("\n\n\n" + scene) else: # file does not exist so we create a new file, append the scene and prepend the import statement file_name.write_text("\n\n\n" + scene) add_import_statement(file_name) else: # file name is not provided so we assume it is main.py # if main.py does not exist we do not continue with Path("main.py").open("a") as f: f.write("\n\n\n" + scene) @cloup.group( context_settings=CONTEXT_SETTINGS, invoke_without_command=True, no_args_is_help=True, epilog=EPILOG, help="Create a new project or insert a new scene.", ) @cloup.pass_context def init(ctx: cloup.Context) -> None: pass init.add_command(project) init.add_command(scene) ManimCommunity-manim-1157b74/manim/cli/plugins/000077500000000000000000000000001515024150700213645ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/plugins/__init__.py000066400000000000000000000000001515024150700234630ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/plugins/commands.py000066400000000000000000000020701515024150700235360ustar00rootroot00000000000000"""Manim's plugin subcommand. Manim's plugin subcommand is accessed in the command-line interface via ``manim plugin``. Here you can specify options, subcommands, and subgroups for the plugin group. """ from __future__ import annotations import cloup from manim.constants import CONTEXT_SETTINGS, EPILOG from manim.plugins.plugins_flags import list_plugins __all__ = ["plugins"] @cloup.command( context_settings=CONTEXT_SETTINGS, no_args_is_help=True, epilog=EPILOG, help="Manages Manim plugins.", ) @cloup.option( "-l", "--list", "list_available", is_flag=True, help="List available plugins.", ) def plugins(list_available: bool) -> None: """Print a list of all available plugins when calling ``manim plugins -l`` or ``manim plugins --list``. Parameters ---------- list_available If the ``-l`` or ``-list`` option is passed to ``manim plugins``, this parameter will be set to ``True``, which will print a list of all available plugins. """ if list_available: list_plugins() ManimCommunity-manim-1157b74/manim/cli/render/000077500000000000000000000000001515024150700211625ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/render/__init__.py000066400000000000000000000000001515024150700232610ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/cli/render/commands.py000066400000000000000000000121351515024150700233370ustar00rootroot00000000000000"""Manim's default subcommand, render. Manim's render subcommand is accessed in the command-line interface via ``manim``, but can be more explicitly accessed with ``manim render``. Here you can specify options, and arguments for the render command. """ from __future__ import annotations import http.client import json import sys import urllib.error import urllib.request from argparse import Namespace from pathlib import Path from typing import Any, cast import cloup from manim import __version__ from manim._config import ( config, console, error_console, logger, tempconfig, ) from manim.cli.render.ease_of_access_options import ease_of_access_options from manim.cli.render.global_options import global_options from manim.cli.render.output_options import output_options from manim.cli.render.render_options import render_options from manim.constants import EPILOG, RendererType from manim.utils.module_ops import scene_classes_from_file __all__ = ["render"] class ClickArgs(Namespace): def __init__(self, args: dict[str, Any]) -> None: for name in args: setattr(self, name, args[name]) def _get_kwargs(self) -> list[tuple[str, Any]]: return list(self.__dict__.items()) def __eq__(self, other: object) -> bool: if not isinstance(other, ClickArgs): return NotImplemented return vars(self) == vars(other) def __contains__(self, key: str) -> bool: return key in self.__dict__ def __repr__(self) -> str: return str(self.__dict__) @cloup.command( context_settings=None, no_args_is_help=True, epilog=EPILOG, ) @cloup.argument("file", type=cloup.Path(path_type=Path), required=True) @cloup.argument("scene_names", required=False, nargs=-1) @global_options @output_options @render_options @ease_of_access_options def render(**kwargs: Any) -> ClickArgs | dict[str, Any]: """Render SCENE(S) from the input FILE. FILE is the file path of the script or a config file. SCENES is an optional list of scenes in the file. """ if kwargs["save_as_gif"]: logger.warning("--save_as_gif is deprecated, please use --format=gif instead!") kwargs["format"] = "gif" if kwargs["save_pngs"]: logger.warning("--save_pngs is deprecated, please use --format=png instead!") kwargs["format"] = "png" if kwargs["show_in_file_browser"]: logger.warning( "The short form of show_in_file_browser is deprecated and will be moved to support --format.", ) click_args = ClickArgs(kwargs) if kwargs["jupyter"]: return click_args config.digest_args(click_args) file = Path(config.input_file) if config.renderer == RendererType.OPENGL: from manim.renderer.opengl_renderer import OpenGLRenderer try: renderer = OpenGLRenderer() keep_running = True while keep_running: for SceneClass in scene_classes_from_file(file): with tempconfig({}): scene = SceneClass(renderer) rerun = scene.render() if rerun or config["write_all"]: renderer.num_plays = 0 continue else: keep_running = False break if config["write_all"]: keep_running = False except Exception: error_console.print_exception() sys.exit(1) else: for SceneClass in scene_classes_from_file(file): try: with tempconfig({}): scene = SceneClass() scene.render() except Exception: error_console.print_exception() sys.exit(1) if config.notify_outdated_version: manim_info_url = "https://pypi.org/pypi/manim/json" warn_prompt = "Cannot check if latest release of manim is installed" try: with urllib.request.urlopen( urllib.request.Request(manim_info_url), timeout=10, ) as response: response = cast(http.client.HTTPResponse, response) json_data = json.loads(response.read()) except urllib.error.HTTPError: logger.debug("HTTP Error: %s", warn_prompt) except urllib.error.URLError: logger.debug("URL Error: %s", warn_prompt) except json.JSONDecodeError: logger.debug( "Error while decoding JSON from %r: %s", manim_info_url, warn_prompt ) except Exception: logger.debug("Something went wrong: %s", warn_prompt) else: stable = json_data["info"]["version"] if stable != __version__: console.print( f"You are using manim version [red]v{__version__}[/red], but version [green]v{stable}[/green] is available.", ) console.print( "You should consider upgrading via [yellow]pip install -U manim[/yellow]", ) return kwargs ManimCommunity-manim-1157b74/manim/cli/render/ease_of_access_options.py000066400000000000000000000020261515024150700262310ustar00rootroot00000000000000from __future__ import annotations from cloup import Choice, option, option_group __all__ = ["ease_of_access_options"] ease_of_access_options = option_group( "Ease of access options", option( "--progress_bar", default=None, show_default=False, type=Choice( ["display", "leave", "none"], case_sensitive=False, ), help="Display progress bars and/or keep them displayed.", ), option( "-p", "--preview", is_flag=True, help="Preview the Scene's animation. OpenGL does a live preview in a " "popup window. Cairo opens the rendered video file in the system " "default media player.", default=None, ), option( "-f", "--show_in_file_browser", is_flag=True, help="Show the output file in the file browser.", default=None, ), option( "--jupyter", is_flag=True, help="Using jupyter notebook magic.", default=None, ), ) ManimCommunity-manim-1157b74/manim/cli/render/global_options.py000066400000000000000000000075721515024150700245620ustar00rootroot00000000000000from __future__ import annotations import logging import re import sys from typing import TYPE_CHECKING from cloup import Choice, option, option_group if TYPE_CHECKING: from click import Context, Option __all__ = ["global_options"] logger = logging.getLogger("manim") def validate_gui_location( ctx: Context, param: Option, value: str | None ) -> tuple[int, int] | None: """If the ``value`` string is given, extract from it the GUI location, which should be in any of these formats: 'x;y', 'x,y' or 'x-y'. Parameters ---------- ctx The Click context. param A Click option. value The optional string which will be parsed. Returns ------- tuple[int, int] | None If ``value`` is ``None``, the return value is ``None``. Otherwise, it's the ``(x, y)`` location for the GUI. Raises ------ ValueError If ``value`` has an invalid format. """ if value is None: return None try: x_offset, y_offset = map(int, re.split(r"[;,\-]", value)) except Exception: logger.error("GUI location option is invalid.") sys.exit() return (x_offset, y_offset) global_options = option_group( "Global options", option( "-c", "--config_file", help="Specify the configuration file to use for render settings.", default=None, ), option( "--custom_folders", is_flag=True, default=None, help="Use the folders defined in the [custom_folders] section of the " "config file to define the output folder structure.", ), option( "--disable_caching", is_flag=True, default=None, help="Disable the use of the cache (still generates cache files).", ), option( "--flush_cache", is_flag=True, help="Remove cached partial movie files.", default=None, ), option("--tex_template", help="Specify a custom TeX template file.", default=None), option( "-v", "--verbosity", type=Choice( ["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], case_sensitive=False, ), help="Verbosity of CLI output. Changes ffmpeg log level unless 5+.", default=None, ), option( "--notify_outdated_version/--silent", is_flag=True, default=None, help="Display warnings for outdated installation.", ), option( "--enable_gui", is_flag=True, help="Enable GUI interaction.", default=None, ), option( "--gui_location", default=None, callback=validate_gui_location, help="Starting location for the GUI.", ), option( "--fullscreen", is_flag=True, help="Expand the window to its maximum possible size.", default=None, ), option( "--enable_wireframe", is_flag=True, help="Enable wireframe debugging mode in opengl.", default=None, ), option( "--force_window", is_flag=True, help="Force window to open when using the opengl renderer, intended for debugging as it may impact performance", default=None, ), option( "--dry_run", is_flag=True, help="Renders animations without outputting image or video files and disables the window", default=None, ), option( "--no_latex_cleanup", is_flag=True, help="Prevents deletion of .aux, .dvi, and .log files produced by Tex and MathTex.", default=None, ), option( "--preview_command", help="The command used to preview the output file (for example vlc for video files)", default=None, ), option( "--seed", type=int, help="Set the random seed to allow reproducibility.", default=None, ), ) ManimCommunity-manim-1157b74/manim/cli/render/output_options.py000066400000000000000000000020341515024150700246460ustar00rootroot00000000000000from __future__ import annotations from cloup import IntRange, Path, option, option_group __all__ = ["output_options"] output_options = option_group( "Output options", option( "-o", "--output_file", type=str, default=None, help="Specify the filename(s) of the rendered scene(s).", ), option( "-0", "--zero_pad", type=IntRange(0, 9), default=None, help="Zero padding for PNG file names.", ), option( "--write_to_movie", is_flag=True, default=None, help="Write the video rendered with opengl to a file.", ), option( "--media_dir", type=Path(), default=None, help="Path to store rendered videos and latex.", ), option( "--log_dir", type=Path(), help="Path to store render logs.", default=None, ), option( "--log_to_file", is_flag=True, default=None, help="Log terminal output to file.", ), ) ManimCommunity-manim-1157b74/manim/cli/render/render_options.py000066400000000000000000000124671515024150700246000ustar00rootroot00000000000000from __future__ import annotations import logging import re import sys from typing import TYPE_CHECKING from cloup import Choice, option, option_group from manim.constants import QUALITIES, RendererType if TYPE_CHECKING: from click import Context, Option __all__ = ["render_options"] logger = logging.getLogger("manim") def validate_scene_range( ctx: Context, param: Option, value: str | None ) -> tuple[int] | tuple[int, int] | None: """If the ``value`` string is given, extract from it the scene range, which should be in any of these formats: 'start', 'start;end', 'start,end' or 'start-end'. Otherwise, return ``None``. Parameters ---------- ctx The Click context. param A Click option. value The optional string which will be parsed. Returns ------- tuple[int] | tuple[int, int] | None If ``value`` is ``None``, the return value is ``None``. Otherwise, it's the scene range, given by a tuple which may contain a single value ``start`` or two values ``start`` and ``end``. Raises ------ ValueError If ``value`` has an invalid format. """ if value is None: return None try: start = int(value) return (start,) except Exception: pass try: start, end = map(int, re.split(r"[;,\-]", value)) except Exception: logger.error("Couldn't determine a range for -n option.") sys.exit() return start, end def validate_resolution( ctx: Context, param: Option, value: str | None ) -> tuple[int, int] | None: """If the ``value`` string is given, extract from it the resolution, which should be in any of these formats: 'W;H', 'W,H' or 'W-H'. Otherwise, return ``None``. Parameters ---------- ctx The Click context. param A Click option. value The optional string which will be parsed. Returns ------- tuple[int, int] | None If ``value`` is ``None``, the return value is ``None``. Otherwise, it's the resolution as a ``(W, H)`` tuple. Raises ------ ValueError If ``value`` has an invalid format. """ if value is None: return None try: width, height = map(int, re.split(r"[;,\-]", value)) except Exception: logger.error("Resolution option is invalid.") sys.exit() return width, height render_options = option_group( "Render Options", option( "-n", "--from_animation_number", callback=validate_scene_range, help="Start rendering from n_0 until n_1. If n_1 is left unspecified, " "renders all scenes after n_0.", default=None, ), option( "-a", "--write_all", is_flag=True, help="Render all scenes in the input file.", default=None, ), option( "--format", type=Choice(["png", "gif", "mp4", "webm", "mov"], case_sensitive=False), default=None, ), option( "-s", "--save_last_frame", default=None, is_flag=True, help="Render and save only the last frame of a scene as a PNG image.", ), option( "-q", "--quality", default=None, type=Choice( list(reversed([q["flag"] for q in QUALITIES.values() if q["flag"]])), case_sensitive=False, ), help="Render quality at the follow resolution framerates, respectively: " + ", ".join( reversed( [ f"{q['pixel_width']}x{q['pixel_height']} {q['frame_rate']}FPS" for q in QUALITIES.values() if q["flag"] ] ) ), ), option( "-r", "--resolution", callback=validate_resolution, default=None, help='Resolution in "W,H" for when 16:9 aspect ratio isn\'t possible.', ), option( "--fps", "--frame_rate", "frame_rate", type=float, default=None, help="Render at this frame rate.", ), option( "--renderer", type=Choice( [renderer_type.value for renderer_type in RendererType], case_sensitive=False, ), help="Select a renderer for your Scene.", default="cairo", ), option( "-g", "--save_pngs", is_flag=True, default=None, help="Save each frame as png (Deprecated).", ), option( "-i", "--save_as_gif", default=None, is_flag=True, help="Save as a gif (Deprecated).", ), option( "--save_sections", default=None, is_flag=True, help="Save section videos in addition to movie file.", ), option( "-t", "--transparent", is_flag=True, help="Render scenes with alpha channel.", ), option( "--use_projection_fill_shaders", is_flag=True, help="Use shaders for OpenGLVMobject fill which are compatible with transformation matrices.", default=None, ), option( "--use_projection_stroke_shaders", is_flag=True, help="Use shaders for OpenGLVMobject stroke which are compatible with transformation matrices.", default=None, ), ) ManimCommunity-manim-1157b74/manim/constants.py000066400000000000000000000202131515024150700215200ustar00rootroot00000000000000"""Constant definitions.""" from __future__ import annotations from enum import Enum from typing import TypedDict import numpy as np from cloup import Context from PIL.Image import Resampling from manim.typing import Vector3D __all__ = [ "SCENE_NOT_FOUND_MESSAGE", "CHOOSE_NUMBER_MESSAGE", "INVALID_NUMBER_MESSAGE", "NO_SCENE_MESSAGE", "NORMAL", "ITALIC", "OBLIQUE", "BOLD", "THIN", "ULTRALIGHT", "LIGHT", "SEMILIGHT", "BOOK", "MEDIUM", "SEMIBOLD", "ULTRABOLD", "HEAVY", "ULTRAHEAVY", "RESAMPLING_ALGORITHMS", "ORIGIN", "UP", "DOWN", "RIGHT", "LEFT", "IN", "OUT", "X_AXIS", "Y_AXIS", "Z_AXIS", "UL", "UR", "DL", "DR", "START_X", "START_Y", "DEFAULT_DOT_RADIUS", "DEFAULT_SMALL_DOT_RADIUS", "DEFAULT_DASH_LENGTH", "DEFAULT_ARROW_TIP_LENGTH", "SMALL_BUFF", "MED_SMALL_BUFF", "MED_LARGE_BUFF", "LARGE_BUFF", "DEFAULT_MOBJECT_TO_EDGE_BUFFER", "DEFAULT_MOBJECT_TO_MOBJECT_BUFFER", "DEFAULT_POINTWISE_FUNCTION_RUN_TIME", "DEFAULT_WAIT_TIME", "DEFAULT_POINT_DENSITY_2D", "DEFAULT_POINT_DENSITY_1D", "DEFAULT_STROKE_WIDTH", "DEFAULT_FONT_SIZE", "SCALE_FACTOR_PER_FONT_POINT", "PI", "TAU", "DEGREES", "QUALITIES", "DEFAULT_QUALITY", "EPILOG", "CONTEXT_SETTINGS", "SHIFT_VALUE", "CTRL_VALUE", "RendererType", "LineJointType", "CapStyleType", ] # Messages SCENE_NOT_FOUND_MESSAGE = """ {} is not in the script """ CHOOSE_NUMBER_MESSAGE = """ Choose number corresponding to desired scene/arguments. (Use comma separated list for multiple entries or use "*" to select all scenes.) Choice(s): """ INVALID_NUMBER_MESSAGE = "Invalid scene numbers have been specified. Aborting." NO_SCENE_MESSAGE = """ There are no scenes inside that module """ # Pango stuff NORMAL = "NORMAL" ITALIC = "ITALIC" OBLIQUE = "OBLIQUE" BOLD = "BOLD" # Only for Pango from below THIN = "THIN" ULTRALIGHT = "ULTRALIGHT" LIGHT = "LIGHT" SEMILIGHT = "SEMILIGHT" BOOK = "BOOK" MEDIUM = "MEDIUM" SEMIBOLD = "SEMIBOLD" ULTRABOLD = "ULTRABOLD" HEAVY = "HEAVY" ULTRAHEAVY = "ULTRAHEAVY" RESAMPLING_ALGORITHMS = { "nearest": Resampling.NEAREST, "none": Resampling.NEAREST, "bilinear": Resampling.BILINEAR, "linear": Resampling.BILINEAR, "bicubic": Resampling.BICUBIC, "cubic": Resampling.BICUBIC, } # Geometry: directions ORIGIN: Vector3D = np.array((0.0, 0.0, 0.0)) """The center of the coordinate system.""" UP: Vector3D = np.array((0.0, 1.0, 0.0)) """One unit step in the positive Y direction.""" DOWN: Vector3D = np.array((0.0, -1.0, 0.0)) """One unit step in the negative Y direction.""" RIGHT: Vector3D = np.array((1.0, 0.0, 0.0)) """One unit step in the positive X direction.""" LEFT: Vector3D = np.array((-1.0, 0.0, 0.0)) """One unit step in the negative X direction.""" IN: Vector3D = np.array((0.0, 0.0, -1.0)) """One unit step in the negative Z direction.""" OUT: Vector3D = np.array((0.0, 0.0, 1.0)) """One unit step in the positive Z direction.""" # Geometry: axes X_AXIS: Vector3D = np.array((1.0, 0.0, 0.0)) Y_AXIS: Vector3D = np.array((0.0, 1.0, 0.0)) Z_AXIS: Vector3D = np.array((0.0, 0.0, 1.0)) # Geometry: useful abbreviations for diagonals UL: Vector3D = UP + LEFT """One step up plus one step left.""" UR: Vector3D = UP + RIGHT """One step up plus one step right.""" DL: Vector3D = DOWN + LEFT """One step down plus one step left.""" DR: Vector3D = DOWN + RIGHT """One step down plus one step right.""" # Geometry START_X = 30 START_Y = 20 DEFAULT_DOT_RADIUS = 0.08 DEFAULT_SMALL_DOT_RADIUS = 0.04 DEFAULT_DASH_LENGTH = 0.05 DEFAULT_ARROW_TIP_LENGTH = 0.35 # Default buffers (padding) SMALL_BUFF = 0.1 MED_SMALL_BUFF = 0.25 MED_LARGE_BUFF = 0.5 LARGE_BUFF = 1 DEFAULT_MOBJECT_TO_EDGE_BUFFER = MED_LARGE_BUFF DEFAULT_MOBJECT_TO_MOBJECT_BUFFER = MED_SMALL_BUFF # Times in seconds DEFAULT_POINTWISE_FUNCTION_RUN_TIME = 3.0 DEFAULT_WAIT_TIME = 1.0 # Misc DEFAULT_POINT_DENSITY_2D = 25 DEFAULT_POINT_DENSITY_1D = 10 DEFAULT_STROKE_WIDTH = 4 DEFAULT_FONT_SIZE = 48 SCALE_FACTOR_PER_FONT_POINT = 1 / 960 # Mathematical constants PI = np.pi """The ratio of the circumference of a circle to its diameter.""" TAU = 2 * PI """The ratio of the circumference of a circle to its radius.""" DEGREES = TAU / 360 """The exchange rate between radians and degrees.""" class QualityDict(TypedDict): flag: str | None pixel_height: int pixel_width: int frame_rate: int # Video qualities QUALITIES: dict[str, QualityDict] = { "fourk_quality": { "flag": "k", "pixel_height": 2160, "pixel_width": 3840, "frame_rate": 60, }, "production_quality": { "flag": "p", "pixel_height": 1440, "pixel_width": 2560, "frame_rate": 60, }, "high_quality": { "flag": "h", "pixel_height": 1080, "pixel_width": 1920, "frame_rate": 60, }, "medium_quality": { "flag": "m", "pixel_height": 720, "pixel_width": 1280, "frame_rate": 30, }, "low_quality": { "flag": "l", "pixel_height": 480, "pixel_width": 854, "frame_rate": 15, }, "example_quality": { "flag": None, "pixel_height": 480, "pixel_width": 854, "frame_rate": 30, }, } DEFAULT_QUALITY = "high_quality" EPILOG = "Made with <3 by Manim Community developers." SHIFT_VALUE = 65505 CTRL_VALUE = 65507 CONTEXT_SETTINGS = Context.settings( align_option_groups=True, align_sections=True, show_constraints=True, ) class RendererType(Enum): """An enumeration of all renderer types that can be assigned to the ``config.renderer`` attribute. Manim's configuration allows assigning string values to the renderer setting, the values are then replaced by the corresponding enum object. In other words, you can run:: config.renderer = "opengl" and checking the renderer afterwards reveals that the attribute has assumed the value:: """ CAIRO = "cairo" #: A renderer based on the cairo backend. OPENGL = "opengl" #: An OpenGL-based renderer. class LineJointType(Enum): """Collection of available line joint types. See the example below for a visual illustration of the different joint types. Examples -------- .. manim:: LineJointVariants :save_last_frame: class LineJointVariants(Scene): def construct(self): mob = VMobject(stroke_width=20, color=GREEN).set_points_as_corners([ np.array([-2, 0, 0]), np.array([0, 0, 0]), np.array([-2, 1, 0]), ]) lines = VGroup(*[mob.copy() for _ in range(len(LineJointType))]) for line, joint_type in zip(lines, LineJointType): line.joint_type = joint_type lines.arrange(RIGHT, buff=1) self.add(lines) for line in lines: label = Text(line.joint_type.name).next_to(line, DOWN) self.add(label) """ AUTO = 0 ROUND = 1 BEVEL = 2 MITER = 3 class CapStyleType(Enum): """Collection of available cap styles. See the example below for a visual illustration of the different cap styles. Examples -------- .. manim:: CapStyleVariants :save_last_frame: class CapStyleVariants(Scene): def construct(self): arcs = VGroup(*[ Arc( radius=1, start_angle=0, angle=TAU / 4, stroke_width=20, color=GREEN, cap_style=cap_style, ) for cap_style in CapStyleType ]) arcs.arrange(RIGHT, buff=1) self.add(arcs) for arc in arcs: label = Text(arc.cap_style.name, font_size=24).next_to(arc, DOWN) self.add(label) """ AUTO = 0 ROUND = 1 BUTT = 2 SQUARE = 3 ManimCommunity-manim-1157b74/manim/data_structures.py000066400000000000000000000014741515024150700227300ustar00rootroot00000000000000"""Data classes and other necessary data structures for use in Manim.""" from __future__ import annotations from collections.abc import Iterable from dataclasses import dataclass from types import MethodType from typing import Any @dataclass class MethodWithArgs: """Object containing a :attr:`method` which is intended to be called later with the positional arguments :attr:`args` and the keyword arguments :attr:`kwargs`. Attributes ---------- method : MethodType A callable representing a method of some class. args : Iterable[Any] Positional arguments for :attr:`method`. kwargs : dict[str, Any] Keyword arguments for :attr:`method`. """ __slots__ = ["method", "args", "kwargs"] method: MethodType args: Iterable[Any] kwargs: dict[str, Any] ManimCommunity-manim-1157b74/manim/mobject/000077500000000000000000000000001515024150700205575ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/mobject/__init__.py000066400000000000000000000000001515024150700226560ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/mobject/frame.py000066400000000000000000000017271515024150700222320ustar00rootroot00000000000000"""Special rectangles.""" from __future__ import annotations __all__ = [ "ScreenRectangle", "FullScreenRectangle", ] from typing import Any from manim.mobject.geometry.polygram import Rectangle from .. import config class ScreenRectangle(Rectangle): def __init__( self, aspect_ratio: float = 16.0 / 9.0, height: float = 4, **kwargs: Any ) -> None: super().__init__(width=aspect_ratio * height, height=height, **kwargs) @property def aspect_ratio(self) -> float: """The aspect ratio. When set, the width is stretched to accommodate the new aspect ratio. """ return self.width / self.height @aspect_ratio.setter def aspect_ratio(self, value: float) -> None: self.stretch_to_fit_width(value * self.height) class FullScreenRectangle(ScreenRectangle): def __init__(self, **kwargs: Any) -> None: super().__init__(**kwargs) self.height = config["frame_height"] ManimCommunity-manim-1157b74/manim/mobject/geometry/000077500000000000000000000000001515024150700224125ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/mobject/geometry/__init__.py000066400000000000000000000002771515024150700245310ustar00rootroot00000000000000"""Various geometric Mobjects. Modules ======= .. autosummary:: :toctree: ../reference ~arc ~boolean_ops ~labeled ~line ~polygram ~shape_matchers ~tips """ ManimCommunity-manim-1157b74/manim/mobject/geometry/arc.py000066400000000000000000001343411515024150700235370ustar00rootroot00000000000000r"""Mobjects that are curved. Examples -------- .. manim:: UsefulAnnotations :save_last_frame: class UsefulAnnotations(Scene): def construct(self): m0 = Dot() m1 = AnnotationDot() m2 = LabeledDot("ii") m3 = LabeledDot(MathTex(r"\alpha").set_color(ORANGE)) m4 = CurvedArrow(2*LEFT, 2*RIGHT, radius= -5) m5 = CurvedArrow(2*LEFT, 2*RIGHT, radius= 8) m6 = CurvedDoubleArrow(ORIGIN, 2*RIGHT) self.add(m0, m1, m2, m3, m4, m5, m6) for i, mobj in enumerate(self.mobjects): mobj.shift(DOWN * (i-3)) """ from __future__ import annotations __all__ = [ "TipableVMobject", "Arc", "ArcBetweenPoints", "CurvedArrow", "CurvedDoubleArrow", "Circle", "Dot", "AnnotationDot", "LabeledDot", "Ellipse", "AnnularSector", "Sector", "Annulus", "CubicBezier", "ArcPolygon", "ArcPolygonFromArcs", "TangentialArc", ] import itertools import warnings from typing import TYPE_CHECKING, Any, Self, cast import numpy as np from manim.constants import * from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.utils.color import BLACK, BLUE, RED, WHITE, ParsableManimColor from manim.utils.iterables import adjacent_pairs from manim.utils.space_ops import ( angle_between_vectors, angle_of_vector, cartesian_to_spherical, line_intersection, perpendicular_bisector, rotate_vector, ) if TYPE_CHECKING: from collections.abc import Iterable import manim.mobject.geometry.tips as tips from manim.mobject.geometry.line import Line from manim.mobject.mobject import Mobject from manim.mobject.text.tex_mobject import SingleStringMathTex, Tex from manim.mobject.text.text_mobject import Text from manim.typing import ( Point3D, Point3DLike, QuadraticSpline, Vector3DLike, ) class TipableVMobject(VMobject, metaclass=ConvertToOpenGL): """Meant for shared functionality between Arc and Line. Functionality can be classified broadly into these groups: * Adding, Creating, Modifying tips - add_tip calls create_tip, before pushing the new tip into the TipableVMobject's list of submobjects - stylistic and positional configuration * Checking for tips - Boolean checks for whether the TipableVMobject has a tip and a starting tip * Getters - Straightforward accessors, returning information pertaining to the TipableVMobject instance's tip(s), its length etc """ def __init__( self, tip_length: float = DEFAULT_ARROW_TIP_LENGTH, normal_vector: Vector3DLike = OUT, tip_style: dict | None = None, **kwargs: Any, ) -> None: self.tip_length: float = tip_length self.normal_vector = normal_vector self.tip_style: dict = tip_style if tip_style is not None else {} super().__init__(**kwargs) # Adding, Creating, Modifying tips def add_tip( self, tip: tips.ArrowTip | None = None, tip_shape: type[tips.ArrowTip] | None = None, tip_length: float | None = None, tip_width: float | None = None, at_start: bool = False, ) -> Self: """Adds a tip to the TipableVMobject instance, recognising that the endpoints might need to be switched if it's a 'starting tip' or not. """ if tip is None: tip = self.create_tip(tip_shape, tip_length, tip_width, at_start) else: self.position_tip(tip, at_start) self.reset_endpoints_based_on_tip(tip, at_start) self.assign_tip_attr(tip, at_start) self.add(tip) return self def create_tip( self, tip_shape: type[tips.ArrowTip] | None = None, tip_length: float | None = None, tip_width: float | None = None, at_start: bool = False, ) -> tips.ArrowTip: """Stylises the tip, positions it spatially, and returns the newly instantiated tip to the caller. """ tip = self.get_unpositioned_tip(tip_shape, tip_length, tip_width) self.position_tip(tip, at_start) return tip def get_unpositioned_tip( self, tip_shape: type[tips.ArrowTip] | None = None, tip_length: float | None = None, tip_width: float | None = None, ) -> tips.ArrowTip | tips.ArrowTriangleFilledTip: """Returns a tip that has been stylistically configured, but has not yet been given a position in space. """ from manim.mobject.geometry.tips import ArrowTriangleFilledTip style: dict[str, Any] = {} if tip_shape is None: tip_shape = ArrowTriangleFilledTip if tip_shape is ArrowTriangleFilledTip: if tip_width is None: tip_width = self.get_default_tip_length() style.update({"width": tip_width}) if tip_length is None: tip_length = self.get_default_tip_length() color = self.get_color() style.update({"fill_color": color, "stroke_color": color}) style.update(self.tip_style) tip = tip_shape(length=tip_length, **style) return tip def position_tip(self, tip: tips.ArrowTip, at_start: bool = False) -> tips.ArrowTip: # Last two control points, defining both # the end, and the tangency direction if at_start: anchor = self.get_start() handle = self.get_first_handle() else: handle = self.get_last_handle() anchor = self.get_end() angles = cartesian_to_spherical(handle - anchor) tip.rotate( angles[1] - PI - tip.tip_angle, ) # Rotates the tip along the azimuthal if not hasattr(self, "_init_positioning_axis"): axis = np.array( [ np.sin(angles[1]), -np.cos(angles[1]), 0, ] ) # Obtains the perpendicular of the tip tip.rotate( -angles[2] + PI / 2, axis=axis, ) # Rotates the tip along the vertical wrt the axis self._init_positioning_axis = axis tip.shift(anchor - tip.tip_point) return tip def reset_endpoints_based_on_tip(self, tip: tips.ArrowTip, at_start: bool) -> Self: if self.get_length() == 0: # Zero length, put_start_and_end_on wouldn't work return self if at_start: self.put_start_and_end_on(tip.base, self.get_end()) else: self.put_start_and_end_on(self.get_start(), tip.base) return self def assign_tip_attr(self, tip: tips.ArrowTip, at_start: bool) -> Self: if at_start: self.start_tip = tip else: self.tip = tip return self # Checking for tips def has_tip(self) -> bool: return hasattr(self, "tip") and self.tip in self def has_start_tip(self) -> bool: return hasattr(self, "start_tip") and self.start_tip in self # Getters def pop_tips(self) -> VGroup: start, end = self.get_start_and_end() result = self.get_group_class()() if self.has_tip(): result.add(self.tip) self.remove(self.tip) if self.has_start_tip(): result.add(self.start_tip) self.remove(self.start_tip) if result.submobjects: self.put_start_and_end_on(start, end) return result def get_tips(self) -> VGroup: """Returns a VGroup (collection of VMobjects) containing the TipableVMObject instance's tips. """ result = self.get_group_class()() if hasattr(self, "tip"): result.add(self.tip) if hasattr(self, "start_tip"): result.add(self.start_tip) return result def get_tip(self) -> VMobject: """Returns the TipableVMobject instance's (first) tip, otherwise throws an exception. """ tips = self.get_tips() if len(tips) == 0: raise Exception("tip not found") else: tip: VMobject = tips[0] return tip def get_default_tip_length(self) -> float: return self.tip_length def get_first_handle(self) -> Point3D: # Type inference of extracting an element from a list, is not # supported by numpy, see this numpy issue # https://github.com/numpy/numpy/issues/16544 first_handle: Point3D = self.points[1] return first_handle def get_last_handle(self) -> Point3D: # Type inference of extracting an element from a list, is not # supported by numpy, see this numpy issue # https://github.com/numpy/numpy/issues/16544 last_handle: Point3D = self.points[-2] return last_handle def get_end(self) -> Point3D: if self.has_tip(): return self.tip.get_start() else: return super().get_end() def get_start(self) -> Point3D: if self.has_start_tip(): return self.start_tip.get_start() else: return super().get_start() def get_length(self) -> float: start, end = self.get_start_and_end() return float(np.linalg.norm(start - end)) class Arc(TipableVMobject): """A circular arc. Examples -------- A simple arc of angle Pi. .. manim:: ArcExample :save_last_frame: class ArcExample(Scene): def construct(self): self.add(Arc(angle=PI)) """ def __init__( self, radius: float | None = 1.0, start_angle: float = 0, angle: float = TAU / 4, num_components: int = 9, arc_center: Point3DLike = ORIGIN, **kwargs: Any, ): if radius is None: # apparently None is passed by ArcBetweenPoints radius = 1.0 self.radius = radius self.num_components = num_components self.arc_center: Point3D = np.asarray(arc_center) self.start_angle = start_angle self.angle = angle self._failed_to_get_center: bool = False super().__init__(**kwargs) def generate_points(self) -> None: self._set_pre_positioned_points() self.scale(self.radius, about_point=ORIGIN) self.shift(self.arc_center) # Points are set a bit differently when rendering via OpenGL. # TODO: refactor Arc so that only one strategy for setting points # has to be used. def init_points(self) -> None: self.set_points( Arc._create_quadratic_bezier_points( angle=self.angle, start_angle=self.start_angle, n_components=self.num_components, ), ) self.scale(self.radius, about_point=ORIGIN) self.shift(self.arc_center) @staticmethod def _create_quadratic_bezier_points( angle: float, start_angle: float = 0, n_components: int = 8 ) -> QuadraticSpline: samples = np.array( [ [np.cos(a), np.sin(a), 0] for a in np.linspace( start_angle, start_angle + angle, 2 * n_components + 1, ) ], ) theta = angle / n_components samples[1::2] /= np.cos(theta / 2) points = np.zeros((3 * n_components, 3)) points[0::3] = samples[0:-1:2] points[1::3] = samples[1::2] points[2::3] = samples[2::2] return points def _set_pre_positioned_points(self) -> None: anchors = np.array( [ np.cos(a) * RIGHT + np.sin(a) * UP for a in np.linspace( self.start_angle, self.start_angle + self.angle, self.num_components, ) ], ) # Figure out which control points will give the # Appropriate tangent lines to the circle d_theta = self.angle / (self.num_components - 1.0) tangent_vectors = np.zeros(anchors.shape) # Rotate all 90 degrees, via (x, y) -> (-y, x) tangent_vectors[:, 1] = anchors[:, 0] tangent_vectors[:, 0] = -anchors[:, 1] # Use tangent vectors to deduce anchors factor = 4 / 3 * np.tan(d_theta / 4) handles1 = anchors[:-1] + factor * tangent_vectors[:-1] handles2 = anchors[1:] - factor * tangent_vectors[1:] self.set_anchors_and_handles(anchors[:-1], handles1, handles2, anchors[1:]) def get_arc_center(self, warning: bool = True) -> Point3D: """Looks at the normals to the first two anchors, and finds their intersection points """ # First two anchors and handles a1, h1, h2, a2 = self.points[:4] if np.all(a1 == a2): # For a1 and a2 to lie at the same point arc radius # must be zero. Thus arc_center will also lie at # that point. return np.copy(a1) # Tangent vectors t1 = h1 - a1 t2 = h2 - a2 # Normals n1 = rotate_vector(t1, TAU / 4) n2 = rotate_vector(t2, TAU / 4) try: return line_intersection(line1=(a1, a1 + n1), line2=(a2, a2 + n2)) except Exception: if warning: warnings.warn( "Can't find Arc center, using ORIGIN instead", stacklevel=1 ) self._failed_to_get_center = True return np.array(ORIGIN) def move_arc_center_to(self, point: Point3DLike) -> Self: self.shift(point - self.get_arc_center()) return self def stop_angle(self) -> float: return cast( float, angle_of_vector(self.points[-1] - self.get_arc_center()) % TAU, ) class ArcBetweenPoints(Arc): """Inherits from Arc and additionally takes 2 points between which the arc is spanned. Example ------- .. manim:: ArcBetweenPointsExample class ArcBetweenPointsExample(Scene): def construct(self): circle = Circle(radius=2, stroke_color=GREY) dot_1 = Dot(color=GREEN).move_to([2, 0, 0]).scale(0.5) dot_1_text = Tex("(2,0)").scale(0.5).next_to(dot_1, RIGHT).set_color(BLUE) dot_2 = Dot(color=GREEN).move_to([0, 2, 0]).scale(0.5) dot_2_text = Tex("(0,2)").scale(0.5).next_to(dot_2, UP).set_color(BLUE) arc= ArcBetweenPoints(start=2 * RIGHT, end=2 * UP, stroke_color=YELLOW) self.add(circle, dot_1, dot_2, dot_1_text, dot_2_text) self.play(Create(arc)) """ def __init__( self, start: Point3DLike, end: Point3DLike, angle: float = TAU / 4, radius: float | None = None, **kwargs: Any, ) -> None: if radius is not None: self.radius = radius if radius < 0: sign = -2 radius *= -1 else: sign = 2 halfdist = np.linalg.norm(np.array(start) - np.array(end)) / 2 if radius < halfdist: raise ValueError( """ArcBetweenPoints called with a radius that is smaller than half the distance between the points.""", ) arc_height = radius - np.sqrt(radius**2 - halfdist**2) angle = np.arccos((radius - arc_height) / radius) * sign super().__init__(radius=radius, angle=angle, **kwargs) if angle == 0: self.set_points_as_corners(np.array([LEFT, RIGHT])) self.put_start_and_end_on(start, end) if radius is None: center = self.get_arc_center(warning=False) if not self._failed_to_get_center: # np.linalg.norm returns floating[Any] which is not compatible with float self.radius = cast( float, np.linalg.norm(np.array(start) - np.array(center)) ) else: self.radius = np.inf class TangentialArc(ArcBetweenPoints): """ Construct an arc that is tangent to two intersecting lines. You can choose any of the 4 possible corner arcs via the `corner` tuple. corner = (s1, s2) where each si is ยฑ1 to control direction along each line. Examples -------- .. manim:: TangentialArcExample :save_last_frame: class TangentialArcExample(Scene): def construct(self): line1 = DashedLine(start=3 * LEFT, end=3 * RIGHT) line1.rotate(angle=31 * DEGREES, about_point=ORIGIN) line2 = DashedLine(start=3 * UP, end=3 * DOWN) line2.rotate(angle=12 * DEGREES, about_point=ORIGIN) arc = TangentialArc(line1, line2, radius=2.25, corner=(1, 1), color=TEAL) self.add(arc, line1, line2) The following example shows all four possible corner configurations: .. manim:: TangentialArcCorners :save_last_frame: class TangentialArcCorners(Scene): def construct(self): # Create two intersecting lines line1 = DashedLine(start=3 * LEFT, end=3 * RIGHT, color=GREY) line2 = DashedLine(start=3 * UP, end=3 * DOWN, color=GREY) # All four corner configurations with different colors arc_pp = TangentialArc(line1, line2, radius=1.5, corner=(1, 1), color=RED) arc_pn = TangentialArc(line1, line2, radius=1.5, corner=(1, -1), color=GREEN) arc_np = TangentialArc(line1, line2, radius=1.5, corner=(-1, 1), color=BLUE) arc_nn = TangentialArc(line1, line2, radius=1.5, corner=(-1, -1), color=YELLOW) # Labels for each arc label_pp = Text("(1,1)", font_size=24, color=RED).next_to(arc_pp, UR, buff=0.1) label_pn = Text("(1,-1)", font_size=24, color=GREEN).next_to(arc_pn, DR, buff=0.1) label_np = Text("(-1,1)", font_size=24, color=BLUE).next_to(arc_np, UL, buff=0.1) label_nn = Text("(-1,-1)", font_size=24, color=YELLOW).next_to(arc_nn, DL, buff=0.1) self.add(line1, line2, arc_pp, arc_pn, arc_np, arc_nn) self.add(label_pp, label_pn, label_np, label_nn) """ def __init__( self, line1: Line, line2: Line, radius: float, corner: Any = (1, 1), **kwargs: Any, ): self.line1 = line1 self.line2 = line2 intersection_point = line_intersection( [line1.get_start(), line1.get_end()], [line2.get_start(), line2.get_end()] ) s1, s2 = corner # Get unit vector for specified directions unit_vector1 = s1 * line1.get_unit_vector() unit_vector2 = s2 * line2.get_unit_vector() corner_angle = angle_between_vectors(unit_vector1, unit_vector2) tangent_point_distance = radius / np.tan(corner_angle / 2) # tangent points tangent_point1 = intersection_point + tangent_point_distance * unit_vector1 tangent_point2 = intersection_point + tangent_point_distance * unit_vector2 cross_product = ( unit_vector1[0] * unit_vector2[1] - unit_vector1[1] * unit_vector2[0] ) # Determine start and end points based on orientation if cross_product < 0: # Counterclockwise orientation - standard order start_point = tangent_point1 end_point = tangent_point2 else: # Clockwise orientation - reverse the points start_point = tangent_point2 end_point = tangent_point1 super().__init__(start=start_point, end=end_point, radius=radius, **kwargs) class CurvedArrow(ArcBetweenPoints): def __init__( self, start_point: Point3DLike, end_point: Point3DLike, **kwargs: Any ) -> None: from manim.mobject.geometry.tips import ArrowTriangleFilledTip tip_shape = kwargs.pop("tip_shape", ArrowTriangleFilledTip) super().__init__(start_point, end_point, **kwargs) self.add_tip(tip_shape=tip_shape) class CurvedDoubleArrow(CurvedArrow): def __init__( self, start_point: Point3DLike, end_point: Point3DLike, **kwargs: Any ) -> None: if "tip_shape_end" in kwargs: kwargs["tip_shape"] = kwargs.pop("tip_shape_end") from manim.mobject.geometry.tips import ArrowTriangleFilledTip tip_shape_start = kwargs.pop("tip_shape_start", ArrowTriangleFilledTip) super().__init__(start_point, end_point, **kwargs) self.add_tip(at_start=True, tip_shape=tip_shape_start) class Circle(Arc): """A circle. Parameters ---------- color The color of the shape. kwargs Additional arguments to be passed to :class:`Arc` Examples -------- .. manim:: CircleExample :save_last_frame: class CircleExample(Scene): def construct(self): circle_1 = Circle(radius=1.0) circle_2 = Circle(radius=1.5, color=GREEN) circle_3 = Circle(radius=1.0, color=BLUE_B, fill_opacity=1) circle_group = Group(circle_1, circle_2, circle_3).arrange(buff=1) self.add(circle_group) """ def __init__( self, radius: float | None = None, color: ParsableManimColor = RED, **kwargs: Any, ) -> None: super().__init__( radius=radius, start_angle=0, angle=TAU, color=color, **kwargs, ) def surround( self, mobject: Mobject, dim_to_match: int = 0, stretch: bool = False, buffer_factor: float = 1.2, ) -> Self: """Modifies a circle so that it surrounds a given mobject. Parameters ---------- mobject The mobject that the circle will be surrounding. dim_to_match buffer_factor Scales the circle with respect to the mobject. A `buffer_factor` < 1 makes the circle smaller than the mobject. stretch Stretches the circle to fit more tightly around the mobject. Note: Does not work with :class:`Line` Examples -------- .. manim:: CircleSurround :save_last_frame: class CircleSurround(Scene): def construct(self): triangle1 = Triangle() circle1 = Circle().surround(triangle1) group1 = Group(triangle1,circle1) # treat the two mobjects as one line2 = Line() circle2 = Circle().surround(line2, buffer_factor=2.0) group2 = Group(line2,circle2) # buffer_factor < 1, so the circle is smaller than the square square3 = Square() circle3 = Circle().surround(square3, buffer_factor=0.5) group3 = Group(square3, circle3) group = Group(group1, group2, group3).arrange(buff=1) self.add(group) """ # Ignores dim_to_match and stretch; result will always be a circle # TODO: Perhaps create an ellipse class to handle single-dimension stretching # Something goes wrong here when surrounding lines? # TODO: Figure out and fix self.replace(mobject, dim_to_match, stretch) self.width = np.sqrt(mobject.width**2 + mobject.height**2) return self.scale(buffer_factor) def point_at_angle(self, angle: float) -> Point3D: """Returns the position of a point on the circle. Parameters ---------- angle The angle of the point along the circle in radians. Returns ------- :class:`numpy.ndarray` The location of the point along the circle's circumference. Examples -------- .. manim:: PointAtAngleExample :save_last_frame: class PointAtAngleExample(Scene): def construct(self): circle = Circle(radius=2.0) p1 = circle.point_at_angle(PI/2) p2 = circle.point_at_angle(270*DEGREES) s1 = Square(side_length=0.25).move_to(p1) s2 = Square(side_length=0.25).move_to(p2) self.add(circle, s1, s2) """ proportion = angle / TAU proportion -= np.floor(proportion) return self.point_from_proportion(proportion) @staticmethod def from_three_points( p1: Point3DLike, p2: Point3DLike, p3: Point3DLike, **kwargs: Any ) -> Circle: """Returns a circle passing through the specified three points. Example ------- .. manim:: CircleFromPointsExample :save_last_frame: class CircleFromPointsExample(Scene): def construct(self): circle = Circle.from_three_points(LEFT, LEFT + UP, UP * 2, color=RED) dots = VGroup( Dot(LEFT), Dot(LEFT + UP), Dot(UP * 2), ) self.add(NumberPlane(), circle, dots) """ center = line_intersection( perpendicular_bisector([np.asarray(p1), np.asarray(p2)]), perpendicular_bisector([np.asarray(p2), np.asarray(p3)]), ) # np.linalg.norm returns floating[Any] which is not compatible with float radius = cast(float, np.linalg.norm(p1 - center)) return Circle(radius=radius, **kwargs).shift(center) class Dot(Circle): """A circle with a very small radius. Parameters ---------- point The location of the dot. radius The radius of the dot. stroke_width The thickness of the outline of the dot. fill_opacity The opacity of the dot's fill_colour color The color of the dot. kwargs Additional arguments to be passed to :class:`Circle` Examples -------- .. manim:: DotExample :save_last_frame: class DotExample(Scene): def construct(self): dot1 = Dot(point=LEFT, radius=0.08) dot2 = Dot(point=ORIGIN) dot3 = Dot(point=RIGHT) self.add(dot1,dot2,dot3) """ def __init__( self, point: Point3DLike = ORIGIN, radius: float = DEFAULT_DOT_RADIUS, stroke_width: float = 0, fill_opacity: float = 1.0, color: ParsableManimColor = WHITE, **kwargs: Any, ) -> None: super().__init__( arc_center=point, radius=radius, stroke_width=stroke_width, fill_opacity=fill_opacity, color=color, **kwargs, ) class AnnotationDot(Dot): """A dot with bigger radius and bold stroke to annotate scenes.""" def __init__( self, radius: float = DEFAULT_DOT_RADIUS * 1.3, stroke_width: float = 5, stroke_color: ParsableManimColor = WHITE, fill_color: ParsableManimColor = BLUE, **kwargs: Any, ) -> None: super().__init__( radius=radius, stroke_width=stroke_width, stroke_color=stroke_color, fill_color=fill_color, **kwargs, ) class LabeledDot(Dot): """A :class:`Dot` containing a label in its center. Parameters ---------- label The label of the :class:`Dot`. This is rendered as :class:`~.MathTex` by default (i.e., when passing a :class:`str`), but other classes representing rendered strings like :class:`~.Text` or :class:`~.Tex` can be passed as well. radius The radius of the :class:`Dot`. If provided, the ``buff`` is ignored. If ``None`` (the default), the radius is calculated based on the size of the ``label`` and the ``buff``. Examples -------- .. manim:: SeveralLabeledDots :save_last_frame: class SeveralLabeledDots(Scene): def construct(self): sq = Square(fill_color=RED, fill_opacity=1) self.add(sq) dot1 = LabeledDot(Tex("42", color=RED)) dot2 = LabeledDot(MathTex("a", color=GREEN)) dot3 = LabeledDot(Text("ii", color=BLUE)) dot4 = LabeledDot("3") dot1.next_to(sq, UL) dot2.next_to(sq, UR) dot3.next_to(sq, DL) dot4.next_to(sq, DR) self.add(dot1, dot2, dot3, dot4) """ def __init__( self, label: str | SingleStringMathTex | Text | Tex, radius: float | None = None, buff: float = SMALL_BUFF, **kwargs: Any, ) -> None: if isinstance(label, str): from manim import MathTex rendered_label: VMobject = MathTex(label, color=BLACK) else: rendered_label = label if radius is None: radius = buff + float( np.linalg.norm([rendered_label.width, rendered_label.height]) / 2 ) super().__init__(radius=radius, **kwargs) rendered_label.move_to(self.get_center()) self.add(rendered_label) class Ellipse(Circle): """A circular shape; oval, circle. Parameters ---------- width The horizontal width of the ellipse. height The vertical height of the ellipse. kwargs Additional arguments to be passed to :class:`Circle`. Examples -------- .. manim:: EllipseExample :save_last_frame: class EllipseExample(Scene): def construct(self): ellipse_1 = Ellipse(width=2.0, height=4.0, color=BLUE_B) ellipse_2 = Ellipse(width=4.0, height=1.0, color=BLUE_D) ellipse_group = Group(ellipse_1,ellipse_2).arrange(buff=1) self.add(ellipse_group) """ def __init__(self, width: float = 2, height: float = 1, **kwargs: Any) -> None: super().__init__(**kwargs) self.stretch_to_fit_width(width) self.stretch_to_fit_height(height) class AnnularSector(Arc): """A sector of an annulus. Parameters ---------- inner_radius The inside radius of the Annular Sector. outer_radius The outside radius of the Annular Sector. angle The clockwise angle of the Annular Sector. start_angle The starting clockwise angle of the Annular Sector. fill_opacity The opacity of the color filled in the Annular Sector. stroke_width The stroke width of the Annular Sector. color The color filled into the Annular Sector. Examples -------- .. manim:: AnnularSectorExample :save_last_frame: class AnnularSectorExample(Scene): def construct(self): # Changes background color to clearly visualize changes in fill_opacity. self.camera.background_color = WHITE # The default parameter start_angle is 0, so the AnnularSector starts from the +x-axis. s1 = AnnularSector(color=YELLOW).move_to(2 * UL) # Different inner_radius and outer_radius than the default. s2 = AnnularSector(inner_radius=1.5, outer_radius=2, angle=45 * DEGREES, color=RED).move_to(2 * UR) # fill_opacity is typically a number > 0 and <= 1. If fill_opacity=0, the AnnularSector is transparent. s3 = AnnularSector(inner_radius=1, outer_radius=1.5, angle=PI, fill_opacity=0.25, color=BLUE).move_to(2 * DL) # With a negative value for the angle, the AnnularSector is drawn clockwise from the start value. s4 = AnnularSector(inner_radius=1, outer_radius=1.5, angle=-3 * PI / 2, color=GREEN).move_to(2 * DR) self.add(s1, s2, s3, s4) """ def __init__( self, inner_radius: float = 1, outer_radius: float = 2, angle: float = TAU / 4, start_angle: float = 0, fill_opacity: float = 1, stroke_width: float = 0, color: ParsableManimColor = WHITE, **kwargs: Any, ) -> None: self.inner_radius = inner_radius self.outer_radius = outer_radius super().__init__( start_angle=start_angle, angle=angle, fill_opacity=fill_opacity, stroke_width=stroke_width, color=color, **kwargs, ) def generate_points(self) -> None: inner_arc, outer_arc = ( Arc( start_angle=self.start_angle, angle=self.angle, radius=radius, arc_center=self.arc_center, ) for radius in (self.inner_radius, self.outer_radius) ) outer_arc.reverse_points() self.append_points(inner_arc.points) self.add_line_to(outer_arc.points[0]) self.append_points(outer_arc.points) self.add_line_to(inner_arc.points[0]) def init_points(self) -> None: self.generate_points() class Sector(AnnularSector): """A sector of a circle. Examples -------- .. manim:: ExampleSector :save_last_frame: class ExampleSector(Scene): def construct(self): sector = Sector(radius=2) sector2 = Sector(radius=2.5, angle=60*DEGREES).move_to([-3, 0, 0]) sector.set_color(RED) sector2.set_color(PINK) self.add(sector, sector2) """ def __init__(self, radius: float = 1, **kwargs: Any) -> None: super().__init__(inner_radius=0, outer_radius=radius, **kwargs) class Annulus(Circle): """Region between two concentric :class:`Circles <.Circle>`. Parameters ---------- inner_radius The radius of the inner :class:`Circle`. outer_radius The radius of the outer :class:`Circle`. kwargs Additional arguments to be passed to :class:`Annulus` Examples -------- .. manim:: AnnulusExample :save_last_frame: class AnnulusExample(Scene): def construct(self): annulus_1 = Annulus(inner_radius=0.5, outer_radius=1).shift(UP) annulus_2 = Annulus(inner_radius=0.3, outer_radius=0.6, color=RED).next_to(annulus_1, DOWN) self.add(annulus_1, annulus_2) """ def __init__( self, inner_radius: float = 1, outer_radius: float = 2, fill_opacity: float = 1, stroke_width: float = 0, color: ParsableManimColor = WHITE, mark_paths_closed: bool = False, **kwargs: Any, ) -> None: self.mark_paths_closed = mark_paths_closed # is this even used? self.inner_radius = inner_radius self.outer_radius = outer_radius super().__init__( fill_opacity=fill_opacity, stroke_width=stroke_width, color=color, **kwargs ) def generate_points(self) -> None: self.radius = self.outer_radius outer_circle = Circle(radius=self.outer_radius) inner_circle = Circle(radius=self.inner_radius) inner_circle.reverse_points() self.append_points(outer_circle.points) self.append_points(inner_circle.points) self.shift(self.arc_center) def init_points(self) -> None: self.generate_points() class CubicBezier(VMobject, metaclass=ConvertToOpenGL): """A cubic Bรฉzier curve. Example ------- .. manim:: BezierSplineExample :save_last_frame: class BezierSplineExample(Scene): def construct(self): p1 = np.array([-3, 1, 0]) p1b = p1 + [1, 0, 0] d1 = Dot(point=p1).set_color(BLUE) l1 = Line(p1, p1b) p2 = np.array([3, -1, 0]) p2b = p2 - [1, 0, 0] d2 = Dot(point=p2).set_color(RED) l2 = Line(p2, p2b) bezier = CubicBezier(p1b, p1b + 3 * RIGHT, p2b - 3 * RIGHT, p2b) self.add(l1, d1, l2, d2, bezier) """ def __init__( self, start_anchor: Point3DLike, start_handle: Point3DLike, end_handle: Point3DLike, end_anchor: Point3DLike, **kwargs: Any, ) -> None: super().__init__(**kwargs) self.add_cubic_bezier_curve(start_anchor, start_handle, end_handle, end_anchor) class ArcPolygon(VMobject, metaclass=ConvertToOpenGL): """A generalized polygon allowing for points to be connected with arcs. This version tries to stick close to the way :class:`Polygon` is used. Points can be passed to it directly which are used to generate the according arcs (using :class:`ArcBetweenPoints`). An angle or radius can be passed to it to use across all arcs, but to configure arcs individually an ``arc_config`` list has to be passed with the syntax explained below. Parameters ---------- vertices A list of vertices, start and end points for the arc segments. angle The angle used for constructing the arcs. If no other parameters are set, this angle is used to construct all arcs. radius The circle radius used to construct the arcs. If specified, overrides the specified ``angle``. arc_config When passing a ``dict``, its content will be passed as keyword arguments to :class:`~.ArcBetweenPoints`. Otherwise, a list of dictionaries containing values that are passed as keyword arguments for every individual arc can be passed. kwargs Further keyword arguments that are passed to the constructor of :class:`~.VMobject`. Attributes ---------- arcs : :class:`list` The arcs created from the input parameters:: >>> from manim import ArcPolygon >>> ap = ArcPolygon([0, 0, 0], [2, 0, 0], [0, 2, 0]) >>> ap.arcs [ArcBetweenPoints, ArcBetweenPoints, ArcBetweenPoints] .. tip:: Two instances of :class:`ArcPolygon` can be transformed properly into one another as well. Be advised that any arc initialized with ``angle=0`` will actually be a straight line, so if a straight section should seamlessly transform into an arced section or vice versa, initialize the straight section with a negligible angle instead (such as ``angle=0.0001``). .. note:: There is an alternative version (:class:`ArcPolygonFromArcs`) that is instantiated with pre-defined arcs. See Also -------- :class:`ArcPolygonFromArcs` Examples -------- .. manim:: SeveralArcPolygons class SeveralArcPolygons(Scene): def construct(self): a = [0, 0, 0] b = [2, 0, 0] c = [0, 2, 0] ap1 = ArcPolygon(a, b, c, radius=2) ap2 = ArcPolygon(a, b, c, angle=45*DEGREES) ap3 = ArcPolygon(a, b, c, arc_config={'radius': 1.7, 'color': RED}) ap4 = ArcPolygon(a, b, c, color=RED, fill_opacity=1, arc_config=[{'radius': 1.7, 'color': RED}, {'angle': 20*DEGREES, 'color': BLUE}, {'radius': 1}]) ap_group = VGroup(ap1, ap2, ap3, ap4).arrange() self.play(*[Create(ap) for ap in [ap1, ap2, ap3, ap4]]) self.wait() For further examples see :class:`ArcPolygonFromArcs`. """ def __init__( self, *vertices: Point3DLike, angle: float = PI / 4, radius: float | None = None, arc_config: list[dict] | None = None, **kwargs: Any, ) -> None: n = len(vertices) point_pairs = [(vertices[k], vertices[(k + 1) % n]) for k in range(n)] if not arc_config: if radius: all_arc_configs: Iterable[dict] = itertools.repeat( {"radius": radius}, len(point_pairs) ) else: all_arc_configs = itertools.repeat({"angle": angle}, len(point_pairs)) elif isinstance(arc_config, dict): all_arc_configs = itertools.repeat(arc_config, len(point_pairs)) else: assert len(arc_config) == n all_arc_configs = arc_config arcs = [ ArcBetweenPoints(*pair, **conf) for (pair, conf) in zip(point_pairs, all_arc_configs, strict=True) ] super().__init__(**kwargs) # Adding the arcs like this makes ArcPolygon double as a VGroup. # Also makes changes to the ArcPolygon, such as scaling, affect # the arcs, so that their new values are usable. self.add(*arcs) for arc in arcs: self.append_points(arc.points) # This enables the use of ArcPolygon.arcs as a convenience # because ArcPolygon[0] returns itself, not the first Arc. self.arcs = arcs class ArcPolygonFromArcs(VMobject, metaclass=ConvertToOpenGL): """A generalized polygon allowing for points to be connected with arcs. This version takes in pre-defined arcs to generate the arcpolygon and introduces little new syntax. However unlike :class:`Polygon` it can't be created with points directly. For proper appearance the passed arcs should connect seamlessly: ``[a,b][b,c][c,a]`` If there are any gaps between the arcs, those will be filled in with straight lines, which can be used deliberately for any straight sections. Arcs can also be passed as straight lines such as an arc initialized with ``angle=0``. Parameters ---------- arcs These are the arcs from which the arcpolygon is assembled. kwargs Keyword arguments that are passed to the constructor of :class:`~.VMobject`. Affects how the ArcPolygon itself is drawn, but doesn't affect passed arcs. Attributes ---------- arcs The arcs used to initialize the ArcPolygonFromArcs:: >>> from manim import ArcPolygonFromArcs, Arc, ArcBetweenPoints >>> ap = ArcPolygonFromArcs(Arc(), ArcBetweenPoints([1,0,0], [0,1,0]), Arc()) >>> ap.arcs [Arc, ArcBetweenPoints, Arc] .. tip:: Two instances of :class:`ArcPolygon` can be transformed properly into one another as well. Be advised that any arc initialized with ``angle=0`` will actually be a straight line, so if a straight section should seamlessly transform into an arced section or vice versa, initialize the straight section with a negligible angle instead (such as ``angle=0.0001``). .. note:: There is an alternative version (:class:`ArcPolygon`) that can be instantiated with points. .. seealso:: :class:`ArcPolygon` Examples -------- One example of an arcpolygon is the Reuleaux triangle. Instead of 3 straight lines connecting the outer points, a Reuleaux triangle has 3 arcs connecting those points, making a shape with constant width. Passed arcs are stored as submobjects in the arcpolygon. This means that the arcs are changed along with the arcpolygon, for example when it's shifted, and these arcs can be manipulated after the arcpolygon has been initialized. Also both the arcs contained in an :class:`~.ArcPolygonFromArcs`, as well as the arcpolygon itself are drawn, which affects draw time in :class:`~.Create` for example. In most cases the arcs themselves don't need to be drawn, in which case they can be passed as invisible. .. manim:: ArcPolygonExample class ArcPolygonExample(Scene): def construct(self): arc_conf = {"stroke_width": 0} poly_conf = {"stroke_width": 10, "stroke_color": BLUE, "fill_opacity": 1, "color": PURPLE} a = [-1, 0, 0] b = [1, 0, 0] c = [0, np.sqrt(3), 0] arc0 = ArcBetweenPoints(a, b, radius=2, **arc_conf) arc1 = ArcBetweenPoints(b, c, radius=2, **arc_conf) arc2 = ArcBetweenPoints(c, a, radius=2, **arc_conf) reuleaux_tri = ArcPolygonFromArcs(arc0, arc1, arc2, **poly_conf) self.play(FadeIn(reuleaux_tri)) self.wait(2) The arcpolygon itself can also be hidden so that instead only the contained arcs are drawn. This can be used to easily debug arcs or to highlight them. .. manim:: ArcPolygonExample2 class ArcPolygonExample2(Scene): def construct(self): arc_conf = {"stroke_width": 3, "stroke_color": BLUE, "fill_opacity": 0.5, "color": GREEN} poly_conf = {"color": None} a = [-1, 0, 0] b = [1, 0, 0] c = [0, np.sqrt(3), 0] arc0 = ArcBetweenPoints(a, b, radius=2, **arc_conf) arc1 = ArcBetweenPoints(b, c, radius=2, **arc_conf) arc2 = ArcBetweenPoints(c, a, radius=2, stroke_color=RED) reuleaux_tri = ArcPolygonFromArcs(arc0, arc1, arc2, **poly_conf) self.play(FadeIn(reuleaux_tri)) self.wait(2) """ def __init__(self, *arcs: Arc | ArcBetweenPoints, **kwargs: Any) -> None: if not all(isinstance(m, (Arc, ArcBetweenPoints)) for m in arcs): raise ValueError( "All ArcPolygon submobjects must be of type Arc/ArcBetweenPoints", ) super().__init__(**kwargs) # Adding the arcs like this makes ArcPolygonFromArcs double as a VGroup. # Also makes changes to the ArcPolygonFromArcs, such as scaling, affect # the arcs, so that their new values are usable. self.add(*arcs) # This enables the use of ArcPolygonFromArcs.arcs as a convenience # because ArcPolygonFromArcs[0] returns itself, not the first Arc. self.arcs = [*arcs] from .line import Line for arc1, arc2 in adjacent_pairs(arcs): self.append_points(arc1.points) line = Line(arc1.get_end(), arc2.get_start()) len_ratio = line.get_length() / arc1.get_arc_length() if np.isnan(len_ratio) or np.isinf(len_ratio): continue line.insert_n_curves(int(arc1.get_num_curves() * len_ratio)) self.append_points(line.points) ManimCommunity-manim-1157b74/manim/mobject/geometry/boolean_ops.py000066400000000000000000000240601515024150700252660ustar00rootroot00000000000000"""Boolean operations for two-dimensional mobjects.""" from __future__ import annotations from typing import TYPE_CHECKING, Any import numpy as np from pathops import Path as SkiaPath from pathops import PathVerb, difference, intersection, union, xor from manim import config from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VMobject if TYPE_CHECKING: from manim.typing import Point2DLike_Array, Point3D_Array, Point3DLike_Array from ...constants import RendererType __all__ = ["Union", "Intersection", "Difference", "Exclusion"] class _BooleanOps(VMobject, metaclass=ConvertToOpenGL): """This class contains some helper functions which helps to convert to and from skia objects and manim objects (:class:`~.VMobject`). """ def _convert_2d_to_3d_array( self, points: Point2DLike_Array | Point3DLike_Array, z_dim: float = 0.0, ) -> Point3D_Array: """Converts an iterable with coordinates in 2D to 3D by adding :attr:`z_dim` as the Z coordinate. Parameters ---------- points An iterable of points. z_dim Default value for the Z coordinate. Returns ------- Point3D_Array A list of the points converted to 3D. Example ------- >>> a = _BooleanOps() >>> p = [(1, 2), (3, 4)] >>> a._convert_2d_to_3d_array(p) array([[1., 2., 0.], [3., 4., 0.]]) """ list_of_points = list(points) for i, point in enumerate(list_of_points): if len(point) == 2: list_of_points[i] = np.append(point, z_dim) return np.asarray(list_of_points) def _convert_vmobject_to_skia_path(self, vmobject: VMobject) -> SkiaPath: """Converts a :class:`~.VMobject` to SkiaPath. This method only works for cairo renderer because it treats the points as Cubic beizer curves. Parameters ---------- vmobject: The :class:`~.VMobject` to convert from. Returns ------- SkiaPath The converted path. """ path = SkiaPath() if np.all(np.isfinite(vmobject.points)): points = vmobject.points else: points = np.zeros((1, 3)) # point invalid? if len(points) == 0: # what? No points so return empty path return path # In OpenGL it's quadratic beizer curves while on Cairo it's cubic... if config.renderer == RendererType.OPENGL: subpaths = vmobject.get_subpaths_from_points(points) for subpath in subpaths: quads = vmobject.get_bezier_tuples_from_points(subpath) start = subpath[0] path.moveTo(*start[:2]) for _p0, p1, p2 in quads: path.quadTo(*p1[:2], *p2[:2]) if vmobject.consider_points_equals(subpath[0], subpath[-1]): path.close() elif config.renderer == RendererType.CAIRO: subpaths = vmobject.gen_subpaths_from_points_2d(points) # type: ignore[assignment] for subpath in subpaths: quads = vmobject.gen_cubic_bezier_tuples_from_points(subpath) start = subpath[0] path.moveTo(*start[:2]) for _p0, p1, p2, p3 in quads: path.cubicTo(*p1[:2], *p2[:2], *p3[:2]) if vmobject.consider_points_equals_2d(subpath[0], subpath[-1]): path.close() return path def _convert_skia_path_to_vmobject(self, path: SkiaPath) -> VMobject: """Converts SkiaPath back to VMobject. Parameters ---------- path: The SkiaPath to convert. Returns ------- VMobject: The converted VMobject. """ vmobject = self current_path_start = np.array([0, 0, 0]) for path_verb, points in path: if path_verb == PathVerb.MOVE: parts = self._convert_2d_to_3d_array(points) for part in parts: current_path_start = part vmobject.start_new_path(part) # vmobject.move_to(*part) elif path_verb == PathVerb.CUBIC: n1, n2, n3 = self._convert_2d_to_3d_array(points) vmobject.add_cubic_bezier_curve_to(n1, n2, n3) elif path_verb == PathVerb.LINE: parts = self._convert_2d_to_3d_array(points) vmobject.add_line_to(parts[0]) elif path_verb == PathVerb.CLOSE: vmobject.add_line_to(current_path_start) elif path_verb == PathVerb.QUAD: n1, n2 = self._convert_2d_to_3d_array(points) vmobject.add_quadratic_bezier_curve_to(n1, n2) else: raise Exception(f"Unsupported: {path_verb}") return vmobject class Union(_BooleanOps): """Union of two or more :class:`~.VMobject` s. This returns the common region of the :class:`~VMobject` s. Parameters ---------- vmobjects The :class:`~.VMobject` s to find the union of. Raises ------ ValueError If less than 2 :class:`~.VMobject` s are passed. Example ------- .. manim:: UnionExample :save_last_frame: class UnionExample(Scene): def construct(self): sq = Square(color=RED, fill_opacity=1) sq.move_to([-2, 0, 0]) cr = Circle(color=BLUE, fill_opacity=1) cr.move_to([-1.3, 0.7, 0]) un = Union(sq, cr, color=GREEN, fill_opacity=1) un.move_to([1.5, 0.3, 0]) self.add(sq, cr, un) """ def __init__(self, *vmobjects: VMobject, **kwargs: Any) -> None: if len(vmobjects) < 2: raise ValueError("At least 2 mobjects needed for Union.") super().__init__(**kwargs) paths = [ self._convert_vmobject_to_skia_path(vmobject) for vmobject in vmobjects ] outpen = SkiaPath() union(paths, outpen.getPen()) self._convert_skia_path_to_vmobject(outpen) class Difference(_BooleanOps): """Subtracts one :class:`~.VMobject` from another one. Parameters ---------- subject The 1st :class:`~.VMobject`. clip The 2nd :class:`~.VMobject` Example ------- .. manim:: DifferenceExample :save_last_frame: class DifferenceExample(Scene): def construct(self): sq = Square(color=RED, fill_opacity=1) sq.move_to([-2, 0, 0]) cr = Circle(color=BLUE, fill_opacity=1) cr.move_to([-1.3, 0.7, 0]) un = Difference(sq, cr, color=GREEN, fill_opacity=1) un.move_to([1.5, 0, 0]) self.add(sq, cr, un) """ def __init__(self, subject: VMobject, clip: VMobject, **kwargs: Any) -> None: super().__init__(**kwargs) outpen = SkiaPath() difference( [self._convert_vmobject_to_skia_path(subject)], [self._convert_vmobject_to_skia_path(clip)], outpen.getPen(), ) self._convert_skia_path_to_vmobject(outpen) class Intersection(_BooleanOps): """Find the intersection of two :class:`~.VMobject` s. This keeps the parts covered by both :class:`~.VMobject` s. Parameters ---------- vmobjects The :class:`~.VMobject` to find the intersection. Raises ------ ValueError If less the 2 :class:`~.VMobject` are passed. Example ------- .. manim:: IntersectionExample :save_last_frame: class IntersectionExample(Scene): def construct(self): sq = Square(color=RED, fill_opacity=1) sq.move_to([-2, 0, 0]) cr = Circle(color=BLUE, fill_opacity=1) cr.move_to([-1.3, 0.7, 0]) un = Intersection(sq, cr, color=GREEN, fill_opacity=1) un.move_to([1.5, 0, 0]) self.add(sq, cr, un) """ def __init__(self, *vmobjects: VMobject, **kwargs: Any) -> None: if len(vmobjects) < 2: raise ValueError("At least 2 mobjects needed for Intersection.") super().__init__(**kwargs) outpen = SkiaPath() intersection( [self._convert_vmobject_to_skia_path(vmobjects[0])], [self._convert_vmobject_to_skia_path(vmobjects[1])], outpen.getPen(), ) new_outpen = outpen for _i in range(2, len(vmobjects)): new_outpen = SkiaPath() intersection( [outpen], [self._convert_vmobject_to_skia_path(vmobjects[_i])], new_outpen.getPen(), ) outpen = new_outpen self._convert_skia_path_to_vmobject(outpen) class Exclusion(_BooleanOps): """Find the XOR between two :class:`~.VMobject`. This creates a new :class:`~.VMobject` consisting of the region covered by exactly one of them. Parameters ---------- subject The 1st :class:`~.VMobject`. clip The 2nd :class:`~.VMobject` Example ------- .. manim:: IntersectionExample :save_last_frame: class IntersectionExample(Scene): def construct(self): sq = Square(color=RED, fill_opacity=1) sq.move_to([-2, 0, 0]) cr = Circle(color=BLUE, fill_opacity=1) cr.move_to([-1.3, 0.7, 0]) un = Exclusion(sq, cr, color=GREEN, fill_opacity=1) un.move_to([1.5, 0.4, 0]) self.add(sq, cr, un) """ def __init__(self, subject: VMobject, clip: VMobject, **kwargs: Any) -> None: super().__init__(**kwargs) outpen = SkiaPath() xor( [self._convert_vmobject_to_skia_path(subject)], [self._convert_vmobject_to_skia_path(clip)], outpen.getPen(), ) self._convert_skia_path_to_vmobject(outpen) ManimCommunity-manim-1157b74/manim/mobject/geometry/labeled.py000066400000000000000000000307271515024150700243650ustar00rootroot00000000000000r"""Mobjects that inherit from lines and contain a label along the length.""" from __future__ import annotations __all__ = ["Label", "LabeledLine", "LabeledArrow", "LabeledPolygram"] from typing import TYPE_CHECKING, Any import numpy as np from manim.constants import * from manim.mobject.geometry.line import Arrow, Line from manim.mobject.geometry.polygram import Polygram from manim.mobject.geometry.shape_matchers import ( BackgroundRectangle, SurroundingRectangle, ) from manim.mobject.text.tex_mobject import MathTex, Tex from manim.mobject.text.text_mobject import Text from manim.mobject.types.vectorized_mobject import VGroup from manim.utils.color import WHITE from manim.utils.polylabel import polylabel if TYPE_CHECKING: from manim.typing import Point3DLike_Array class Label(VGroup): """A Label consisting of text surrounded by a frame. Parameters ---------- label Label that will be displayed. label_config A dictionary containing the configuration for the label. This is only applied if ``label`` is of type ``str``. box_config A dictionary containing the configuration for the background box. frame_config A dictionary containing the configuration for the frame. Examples -------- .. manim:: LabelExample :save_last_frame: :quality: high class LabelExample(Scene): def construct(self): label = Label( label=Text('Label Text', font='sans-serif'), box_config = { "color" : BLUE, "fill_opacity" : 0.75 } ) label.scale(3) self.add(label) """ def __init__( self, label: str | Tex | MathTex | Text, label_config: dict[str, Any] | None = None, box_config: dict[str, Any] | None = None, frame_config: dict[str, Any] | None = None, **kwargs: Any, ) -> None: super().__init__(**kwargs) # Setup Defaults default_label_config: dict[str, Any] = { "color": WHITE, "font_size": DEFAULT_FONT_SIZE, } default_box_config: dict[str, Any] = { "color": None, "buff": 0.05, "fill_opacity": 1, "stroke_width": 0.5, } default_frame_config: dict[str, Any] = { "color": WHITE, "buff": 0.05, "stroke_width": 0.5, } # Merge Defaults label_config = default_label_config | (label_config or {}) box_config = default_box_config | (box_config or {}) frame_config = default_frame_config | (frame_config or {}) # Determine the type of label and instantiate the appropriate object self.rendered_label: MathTex | Tex | Text if isinstance(label, str): self.rendered_label = MathTex(label, **label_config) elif isinstance(label, (MathTex, Tex, Text)): self.rendered_label = label else: raise TypeError("Unsupported label type. Must be MathTex, Tex, or Text.") # Add a background box self.background_rect = BackgroundRectangle(self.rendered_label, **box_config) # Add a frame around the label self.frame = SurroundingRectangle(self.rendered_label, **frame_config) # Add components to the VGroup self.add(self.background_rect, self.rendered_label, self.frame) class LabeledLine(Line): """Constructs a line containing a label box somewhere along its length. Parameters ---------- label Label that will be displayed on the line. label_position A ratio in the range [0-1] to indicate the position of the label with respect to the length of the line. Default value is 0.5. label_config A dictionary containing the configuration for the label. This is only applied if ``label`` is of type ``str``. box_config A dictionary containing the configuration for the background box. frame_config A dictionary containing the configuration for the frame. .. seealso:: :class:`LabeledArrow` Examples -------- .. manim:: LabeledLineExample :save_last_frame: :quality: high class LabeledLineExample(Scene): def construct(self): line = LabeledLine( label = '0.5', label_position = 0.8, label_config = { "font_size" : 20 }, start=LEFT+DOWN, end=RIGHT+UP) line.set_length(line.get_length() * 2) self.add(line) """ def __init__( self, label: str | Tex | MathTex | Text, label_position: float = 0.5, label_config: dict[str, Any] | None = None, box_config: dict[str, Any] | None = None, frame_config: dict[str, Any] | None = None, *args: Any, **kwargs: Any, ) -> None: super().__init__(*args, **kwargs) # Create Label self.label = Label( label=label, label_config=label_config, box_config=box_config, frame_config=frame_config, ) # Compute Label Position line_start, line_end = self.get_start_and_end() new_vec = (line_end - line_start) * label_position label_coords = line_start + new_vec self.label.move_to(label_coords) self.add(self.label) class LabeledArrow(LabeledLine, Arrow): """Constructs an arrow containing a label box somewhere along its length. This class inherits its label properties from `LabeledLine`, so the main parameters controlling it are the same. Parameters ---------- label Label that will be displayed on the Arrow. label_position A ratio in the range [0-1] to indicate the position of the label with respect to the length of the line. Default value is 0.5. label_config A dictionary containing the configuration for the label. This is only applied if ``label`` is of type ``str``. box_config A dictionary containing the configuration for the background box. frame_config A dictionary containing the configuration for the frame. .. seealso:: :class:`LabeledLine` Examples -------- .. manim:: LabeledArrowExample :save_last_frame: :quality: high class LabeledArrowExample(Scene): def construct(self): l_arrow = LabeledArrow("0.5", start=LEFT*3, end=RIGHT*3 + UP*2, label_position=0.5) self.add(l_arrow) """ def __init__( self, *args: Any, **kwargs: Any, ) -> None: super().__init__(*args, **kwargs) class LabeledPolygram(Polygram): """Constructs a polygram containing a label box at its pole of inaccessibility. Parameters ---------- vertex_groups Vertices passed to the :class:`~.Polygram` constructor. label Label that will be displayed on the Polygram. precision The precision used by the PolyLabel algorithm. label_config A dictionary containing the configuration for the label. This is only applied if ``label`` is of type ``str``. box_config A dictionary containing the configuration for the background box. frame_config A dictionary containing the configuration for the frame. .. note:: The PolyLabel Algorithm expects each vertex group to form a closed ring. If the input is open, :class:`LabeledPolygram` will attempt to close it. This may cause the polygon to intersect itself leading to unexpected results. .. tip:: Make sure the precision corresponds to the scale of your inputs! For instance, if the bounding box of your polygon stretches from 0 to 10,000, a precision of 1.0 or 10.0 should be sufficient. Examples -------- .. manim:: LabeledPolygramExample :save_last_frame: :quality: high class LabeledPolygramExample(Scene): def construct(self): # Define Rings ring1 = [ [-3.8, -2.4, 0], [-2.4, -2.5, 0], [-1.3, -1.6, 0], [-0.2, -1.7, 0], [1.7, -2.5, 0], [2.9, -2.6, 0], [3.5, -1.5, 0], [4.9, -1.4, 0], [4.5, 0.2, 0], [4.7, 1.6, 0], [3.5, 2.4, 0], [1.1, 2.5, 0], [-0.1, 0.9, 0], [-1.2, 0.5, 0], [-1.6, 0.7, 0], [-1.4, 1.9, 0], [-2.6, 2.6, 0], [-4.4, 1.2, 0], [-4.9, -0.8, 0], [-3.8, -2.4, 0] ] ring2 = [ [0.2, -1.2, 0], [0.9, -1.2, 0], [1.4, -2.0, 0], [2.1, -1.6, 0], [2.2, -0.5, 0], [1.4, 0.0, 0], [0.4, -0.2, 0], [0.2, -1.2, 0] ] ring3 = [[-2.7, 1.4, 0], [-2.3, 1.7, 0], [-2.8, 1.9, 0], [-2.7, 1.4, 0]] # Create Polygons (for reference) p1 = Polygon(*ring1, fill_opacity=0.75) p2 = Polygon(*ring2, fill_color=BLACK, fill_opacity=1) p3 = Polygon(*ring3, fill_color=BLACK, fill_opacity=1) # Create Labeled Polygram polygram = LabeledPolygram( *[ring1, ring2, ring3], label=Text('Pole', font='sans-serif'), precision=0.01, ) # Display Circle (for reference) circle = Circle(radius=polygram.radius, color=WHITE).move_to(polygram.pole) self.add(p1, p2, p3) self.add(polygram) self.add(circle) .. manim:: LabeledCountryExample :save_last_frame: :quality: high import requests import json class LabeledCountryExample(Scene): def construct(self): # Fetch JSON data and process arcs data = requests.get('https://cdn.jsdelivr.net/npm/us-atlas@3/nation-10m.json').json() arcs, transform = data['arcs'], data['transform'] sarcs = [np.cumsum(arc, axis=0) * transform['scale'] + transform['translate'] for arc in arcs] ssarcs = sorted(sarcs, key=len, reverse=True)[:1] # Compute Bounding Box points = np.concatenate(ssarcs) mins, maxs = np.min(points, axis=0), np.max(points, axis=0) # Build Axes ax = Axes( x_range=[mins[0], maxs[0], maxs[0] - mins[0]], x_length=10, y_range=[mins[1], maxs[1], maxs[1] - mins[1]], y_length=7, tips=False ) # Adjust Coordinates array = [[ax.c2p(*point) for point in sarc] for sarc in ssarcs] # Add Polygram polygram = LabeledPolygram( *array, label=Text('USA', font='sans-serif'), precision=0.01, fill_color=BLUE, stroke_width=0, fill_opacity=0.75 ) # Display Circle (for reference) circle = Circle(radius=polygram.radius, color=WHITE).move_to(polygram.pole) self.add(ax) self.add(polygram) self.add(circle) """ def __init__( self, *vertex_groups: Point3DLike_Array, label: str | Tex | MathTex | Text, precision: float = 0.01, label_config: dict[str, Any] | None = None, box_config: dict[str, Any] | None = None, frame_config: dict[str, Any] | None = None, **kwargs: Any, ) -> None: # Initialize the Polygram with the vertex groups super().__init__(*vertex_groups, **kwargs) # Create Label self.label = Label( label=label, label_config=label_config, box_config=box_config, frame_config=frame_config, ) # Close Vertex Groups rings = [ group if np.array_equal(group[0], group[-1]) else list(group) + [group[0]] for group in vertex_groups ] # Compute the Pole of Inaccessibility cell = polylabel(rings, precision=precision) self.pole, self.radius = np.pad(cell.c, (0, 1), "constant"), cell.d # Position the label at the pole self.label.move_to(self.pole) self.add(self.label) ManimCommunity-manim-1157b74/manim/mobject/geometry/line.py000066400000000000000000001204511515024150700237160ustar00rootroot00000000000000r"""Mobjects that are lines or variations of them.""" from __future__ import annotations __all__ = [ "Line", "DashedLine", "TangentLine", "Elbow", "Arrow", "Vector", "DoubleArrow", "Angle", "RightAngle", ] from typing import TYPE_CHECKING, Any, Literal import numpy as np from manim import config from manim.constants import * from manim.mobject.geometry.arc import Arc, ArcBetweenPoints, Dot, TipableVMobject from manim.mobject.geometry.tips import ArrowTriangleFilledTip from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.types.vectorized_mobject import DashedVMobject, VGroup, VMobject from manim.utils.color import WHITE from manim.utils.space_ops import angle_of_vector, line_intersection, normalize if TYPE_CHECKING: from typing import Self, TypeAlias from manim.typing import Point3D, Point3DLike, Vector2DLike, Vector3D, Vector3DLike from manim.utils.color import ParsableManimColor from ..matrix import Matrix # Avoid circular import AngleQuadrant: TypeAlias = tuple[Literal[-1, 1], Literal[-1, 1]] r"""A tuple of 2 integers which can be either +1 or -1, allowing to select one of the 4 quadrants of the Cartesian plane. Let :math:`L_1,\ L_2` be two lines defined by start points :math:`S_1,\ S_2` and end points :math:`E_1,\ E_2`. We define the "positive direction" of :math:`L_1` as the direction from :math:`S_1` to :math:`E_1`, and its "negative direction" as the opposite one. We do the same with :math:`L_2`. If :math:`L_1` and :math:`L_2` intersect, they divide the plane into 4 quadrants. To pick one quadrant, choose the integers in this tuple in the following way: - If the 1st integer is +1, select one of the 2 quadrants towards the positive direction of :math:`L_1`, i.e. closest to `E_1`. Otherwise, if the 1st integer is -1, select one of the 2 quadrants towards the negative direction of :math:`L_1`, i.e. closest to `S_1`. - Similarly, the sign of the 2nd integer picks the positive or negative direction of :math:`L_2` and, thus, selects one of the 2 quadrants which are closest to :math:`E_2` or :math:`S_2` respectively. """ class Line(TipableVMobject): """A straight or curved line segment between two points or mobjects. Parameters ---------- start The starting point or Mobject of the line. end The ending point or Mobject of the line. buff The distance to shorten the line from both ends. path_arc If nonzero, the line will be curved into an arc with this angle (in radians). kwargs Additional arguments to be passed to :class:`TipableVMobject` Examples -------- .. manim:: LineExample :save_last_frame: class LineExample(Scene): def construct(self): line1 = Line(LEFT*2, RIGHT*2) line2 = Line(LEFT*2, RIGHT*2, buff=0.5) line3 = Line(LEFT*2, RIGHT*2, path_arc=PI/2) grp = VGroup(line1,line2,line3).arrange(DOWN, buff=2) self.add(grp) """ def __init__( self, start: Point3DLike | Mobject = LEFT, end: Point3DLike | Mobject = RIGHT, buff: float = 0, path_arc: float = 0, **kwargs: Any, ) -> None: self.dim = 3 self.buff = buff self.path_arc = path_arc self._set_start_and_end_attrs(start, end) super().__init__(**kwargs) def generate_points(self) -> None: self.set_points_by_ends( start=self.start, end=self.end, buff=self.buff, path_arc=self.path_arc, ) def set_points_by_ends( self, start: Point3DLike | Mobject, end: Point3DLike | Mobject, buff: float = 0, path_arc: float = 0, ) -> None: """Sets the points of the line based on its start and end points. Unlike :meth:`put_start_and_end_on`, this method respects `self.buff` and Mobject bounding boxes. Parameters ---------- start The start point or Mobject of the line. end The end point or Mobject of the line. buff The empty space between the start and end of the line, by default 0. path_arc The angle of a circle spanned by this arc, by default 0 which is a straight line. """ self._set_start_and_end_attrs(start, end) if path_arc: arc = ArcBetweenPoints(self.start, self.end, angle=self.path_arc) self.set_points(arc.points) else: self.set_points_as_corners(np.asarray([self.start, self.end])) self._account_for_buff(buff) def init_points(self) -> None: self.generate_points() def _account_for_buff(self, buff: float) -> None: if buff <= 0: return length = self.get_length() if self.path_arc == 0 else self.get_arc_length() if length < 2 * buff: return buff_proportion = buff / length self.pointwise_become_partial(self, buff_proportion, 1 - buff_proportion) def _set_start_and_end_attrs( self, start: Point3DLike | Mobject, end: Point3DLike | Mobject ) -> None: # If either start or end are Mobjects, this # gives their centers rough_start = self._pointify(start) rough_end = self._pointify(end) vect = normalize(rough_end - rough_start) # Now that we know the direction between them, # we can find the appropriate boundary point from # start and end, if they're mobjects self.start = self._pointify(start, vect) self.end = self._pointify(end, -vect) def _pointify( self, mob_or_point: Mobject | Point3DLike, direction: Vector3DLike | None = None, ) -> Point3D: """Transforms a mobject into its corresponding point. Does nothing if a point is passed. ``direction`` determines the location of the point along its bounding box in that direction. Parameters ---------- mob_or_point The mobject or point. direction The direction. """ if isinstance(mob_or_point, (Mobject, OpenGLMobject)): mob = mob_or_point if direction is None: return mob.get_center() else: return mob.get_boundary_point(direction) return np.array(mob_or_point) def set_path_arc(self, new_value: float) -> None: self.path_arc = new_value self.init_points() def put_start_and_end_on( self, start: Point3DLike, end: Point3DLike, ) -> Self: """Sets starts and end coordinates of a line. Examples -------- .. manim:: LineExample class LineExample(Scene): def construct(self): d = VGroup() for i in range(0,10): d.add(Dot()) d.arrange_in_grid(buff=1) self.add(d) l= Line(d[0], d[1]) self.add(l) self.wait() l.put_start_and_end_on(d[1].get_center(), d[2].get_center()) self.wait() l.put_start_and_end_on(d[4].get_center(), d[7].get_center()) self.wait() """ curr_start, curr_end = self.get_start_and_end() if np.all(curr_start == curr_end): # TODO, any problems with resetting # these attrs? self.start = np.asarray(start) self.end = np.asarray(end) self.generate_points() return super().put_start_and_end_on(start, end) def get_vector(self) -> Vector3D: return self.get_end() - self.get_start() def get_unit_vector(self) -> Vector3D: return normalize(self.get_vector()) def get_angle(self) -> float: return angle_of_vector(self.get_vector()) def get_projection(self, point: Point3DLike) -> Point3D: """Returns the projection of a point onto a line. Parameters ---------- point The point to which the line is projected. """ start = self.get_start() end = self.get_end() unit_vect = normalize(end - start) return start + float(np.dot(point - start, unit_vect)) * unit_vect def get_slope(self) -> float: return float(np.tan(self.get_angle())) def set_angle(self, angle: float, about_point: Point3DLike | None = None) -> Self: if about_point is None: about_point = self.get_start() self.rotate( angle - self.get_angle(), about_point=about_point, ) return self def set_length(self, length: float) -> Self: scale_factor: float = length / self.get_length() return self.scale(scale_factor) class DashedLine(Line): """A dashed :class:`Line`. Parameters ---------- args Arguments to be passed to :class:`Line` dash_length The length of each individual dash of the line. dashed_ratio The ratio of dash space to empty space. Range of 0-1. kwargs Additional arguments to be passed to :class:`Line` .. seealso:: :class:`~.DashedVMobject` Examples -------- .. manim:: DashedLineExample :save_last_frame: class DashedLineExample(Scene): def construct(self): # dash_length increased dashed_1 = DashedLine(config.left_side, config.right_side, dash_length=2.0).shift(UP*2) # normal dashed_2 = DashedLine(config.left_side, config.right_side) # dashed_ratio decreased dashed_3 = DashedLine(config.left_side, config.right_side, dashed_ratio=0.1).shift(DOWN*2) self.add(dashed_1, dashed_2, dashed_3) """ def __init__( self, *args: Any, dash_length: float = DEFAULT_DASH_LENGTH, dashed_ratio: float = 0.5, **kwargs: Any, ) -> None: self.dash_length = dash_length self.dashed_ratio = dashed_ratio super().__init__(*args, **kwargs) dashes = DashedVMobject( self, num_dashes=self._calculate_num_dashes(), dashed_ratio=dashed_ratio, ) self.clear_points() self.add(*dashes) def _calculate_num_dashes(self) -> int: """Returns the number of dashes in the dashed line. Examples -------- :: >>> DashedLine()._calculate_num_dashes() 20 """ # Minimum number of dashes has to be 2 return max( 2, int(np.ceil((self.get_length() / self.dash_length) * self.dashed_ratio)), ) def get_start(self) -> Point3D: """Returns the start point of the line. Examples -------- :: >>> DashedLine().get_start() array([-1., 0., 0.]) """ if len(self.submobjects) > 0: return self.submobjects[0].get_start() else: return super().get_start() def get_end(self) -> Point3D: """Returns the end point of the line. Examples -------- :: >>> DashedLine().get_end() array([1., 0., 0.]) """ if len(self.submobjects) > 0: return self.submobjects[-1].get_end() else: return super().get_end() def get_first_handle(self) -> Point3D: """Returns the point of the first handle. Examples -------- :: >>> DashedLine().get_first_handle() array([-0.98333333, 0. , 0. ]) """ # Type inference of extracting an element from a list, is not # supported by numpy, see this numpy issue # https://github.com/numpy/numpy/issues/16544 first_handle: Point3D = self.submobjects[0].points[1] return first_handle def get_last_handle(self) -> Point3D: """Returns the point of the last handle. Examples -------- :: >>> DashedLine().get_last_handle() array([0.98333333, 0. , 0. ]) """ # Type inference of extracting an element from a list, is not # supported by numpy, see this numpy issue # https://github.com/numpy/numpy/issues/16544 last_handle: Point3D = self.submobjects[-1].points[2] return last_handle class TangentLine(Line): """Constructs a line tangent to a :class:`~.VMobject` at a specific point. Parameters ---------- vmob The VMobject on which the tangent line is drawn. alpha How far along the shape that the line will be constructed. range: 0-1. length Length of the tangent line. d_alpha The ``dx`` value kwargs Additional arguments to be passed to :class:`Line` .. seealso:: :meth:`~.VMobject.point_from_proportion` Examples -------- .. manim:: TangentLineExample :save_last_frame: class TangentLineExample(Scene): def construct(self): circle = Circle(radius=2) line_1 = TangentLine(circle, alpha=0.0, length=4, color=BLUE_D) # right line_2 = TangentLine(circle, alpha=0.4, length=4, color=GREEN) # top left self.add(circle, line_1, line_2) """ def __init__( self, vmob: VMobject, alpha: float, length: float = 1, d_alpha: float = 1e-6, **kwargs: Any, ) -> None: self.length = length self.d_alpha = d_alpha da = self.d_alpha a1 = np.clip(alpha - da, 0, 1) a2 = np.clip(alpha + da, 0, 1) super().__init__( vmob.point_from_proportion(a1), vmob.point_from_proportion(a2), **kwargs ) self.scale(self.length / self.get_length()) class Elbow(VMobject, metaclass=ConvertToOpenGL): """Two lines that create a right angle about each other: L-shape. Parameters ---------- width The length of the elbow's sides. angle The rotation of the elbow. kwargs Additional arguments to be passed to :class:`~.VMobject` .. seealso:: :class:`RightAngle` Examples -------- .. manim:: ElbowExample :save_last_frame: class ElbowExample(Scene): def construct(self): elbow_1 = Elbow() elbow_2 = Elbow(width=2.0) elbow_3 = Elbow(width=2.0, angle=5*PI/4) elbow_group = Group(elbow_1, elbow_2, elbow_3).arrange(buff=1) self.add(elbow_group) """ def __init__(self, width: float = 0.2, angle: float = 0, **kwargs: Any) -> None: self.angle = angle super().__init__(**kwargs) self.set_points_as_corners(np.array([UP, UP + RIGHT, RIGHT])) self.scale_to_fit_width(width, about_point=ORIGIN) self.rotate(self.angle, about_point=ORIGIN) class Arrow(Line): """An arrow. Parameters ---------- args Arguments to be passed to :class:`Line`. stroke_width The thickness of the arrow. Influenced by :attr:`max_stroke_width_to_length_ratio`. buff The distance of the arrow from its start and end points. max_tip_length_to_length_ratio :attr:`tip_length` scales with the length of the arrow. Increasing this ratio raises the max value of :attr:`tip_length`. max_stroke_width_to_length_ratio :attr:`stroke_width` scales with the length of the arrow. Increasing this ratio ratios the max value of :attr:`stroke_width`. kwargs Additional arguments to be passed to :class:`Line`. .. seealso:: :class:`ArrowTip` :class:`CurvedArrow` Examples -------- .. manim:: ArrowExample :save_last_frame: from manim.mobject.geometry.tips import ArrowSquareTip class ArrowExample(Scene): def construct(self): arrow_1 = Arrow(start=RIGHT, end=LEFT, color=GOLD) arrow_2 = Arrow(start=RIGHT, end=LEFT, color=GOLD, tip_shape=ArrowSquareTip).shift(DOWN) g1 = Group(arrow_1, arrow_2) # the effect of buff square = Square(color=MAROON_A) arrow_3 = Arrow(start=LEFT, end=RIGHT) arrow_4 = Arrow(start=LEFT, end=RIGHT, buff=0).next_to(arrow_1, UP) g2 = Group(arrow_3, arrow_4, square) # a shorter arrow has a shorter tip and smaller stroke width arrow_5 = Arrow(start=ORIGIN, end=config.top).shift(LEFT * 4) arrow_6 = Arrow(start=config.top + DOWN, end=config.top).shift(LEFT * 3) g3 = Group(arrow_5, arrow_6) self.add(Group(g1, g2, g3).arrange(buff=2)) .. manim:: ArrowExample :save_last_frame: class ArrowExample(Scene): def construct(self): left_group = VGroup() # As buff increases, the size of the arrow decreases. for buff in np.arange(0, 2.2, 0.45): left_group += Arrow(buff=buff, start=2 * LEFT, end=2 * RIGHT) # Required to arrange arrows. left_group.arrange(DOWN) left_group.move_to(4 * LEFT) middle_group = VGroup() # As max_stroke_width_to_length_ratio gets bigger, # the width of stroke increases. for i in np.arange(0, 5, 0.5): middle_group += Arrow(max_stroke_width_to_length_ratio=i) middle_group.arrange(DOWN) UR_group = VGroup() # As max_tip_length_to_length_ratio increases, # the length of the tip increases. for i in np.arange(0, 0.3, 0.1): UR_group += Arrow(max_tip_length_to_length_ratio=i) UR_group.arrange(DOWN) UR_group.move_to(4 * RIGHT + 2 * UP) DR_group = VGroup() DR_group += Arrow(start=LEFT, end=RIGHT, color=BLUE, tip_shape=ArrowSquareTip) DR_group += Arrow(start=LEFT, end=RIGHT, color=BLUE, tip_shape=ArrowSquareFilledTip) DR_group += Arrow(start=LEFT, end=RIGHT, color=YELLOW, tip_shape=ArrowCircleTip) DR_group += Arrow(start=LEFT, end=RIGHT, color=YELLOW, tip_shape=ArrowCircleFilledTip) DR_group.arrange(DOWN) DR_group.move_to(4 * RIGHT + 2 * DOWN) self.add(left_group, middle_group, UR_group, DR_group) """ def __init__( self, *args: Any, stroke_width: float = 6, buff: float = MED_SMALL_BUFF, max_tip_length_to_length_ratio: float = 0.25, max_stroke_width_to_length_ratio: float = 5, **kwargs: Any, ) -> None: self.max_tip_length_to_length_ratio = max_tip_length_to_length_ratio self.max_stroke_width_to_length_ratio = max_stroke_width_to_length_ratio tip_shape = kwargs.pop("tip_shape", ArrowTriangleFilledTip) super().__init__(*args, buff=buff, stroke_width=stroke_width, **kwargs) # type: ignore[misc] # TODO, should this be affected when # Arrow.set_stroke is called? self.initial_stroke_width = self.stroke_width self.add_tip(tip_shape=tip_shape) self._set_stroke_width_from_length() def scale(self, factor: float, scale_tips: bool = False, **kwargs: Any) -> Self: # type: ignore[override] r"""Scale an arrow, but keep stroke width and arrow tip size fixed. .. seealso:: :meth:`~.Mobject.scale` Examples -------- :: >>> arrow = Arrow(np.array([-1, -1, 0]), np.array([1, 1, 0]), buff=0) >>> scaled_arrow = arrow.scale(2) >>> np.round(scaled_arrow.get_start_and_end(), 8) + 0 array([[-2., -2., 0.], [ 2., 2., 0.]]) >>> arrow.tip.length == scaled_arrow.tip.length True Manually scaling the object using the default method :meth:`~.Mobject.scale` does not have the same properties:: >>> new_arrow = Arrow(np.array([-1, -1, 0]), np.array([1, 1, 0]), buff=0) >>> another_scaled_arrow = VMobject.scale(new_arrow, 2) >>> another_scaled_arrow.tip.length == arrow.tip.length False """ if self.get_length() == 0: return self if scale_tips: super().scale(factor, **kwargs) self._set_stroke_width_from_length() return self has_tip = self.has_tip() has_start_tip = self.has_start_tip() if has_tip or has_start_tip: old_tips = self.pop_tips() super().scale(factor, **kwargs) self._set_stroke_width_from_length() if has_tip: self.add_tip(tip=old_tips[0]) if has_start_tip: self.add_tip(tip=old_tips[1], at_start=True) return self def get_normal_vector(self) -> Vector3D: """Returns the normal of a vector. Examples -------- :: >>> np.round(Arrow().get_normal_vector()) + 0. # add 0. to avoid negative 0 in output array([ 0., 0., -1.]) """ p0, p1, p2 = self.tip.get_start_anchors()[:3] return normalize(np.cross(p2 - p1, p1 - p0)) def reset_normal_vector(self) -> Self: """Resets the normal of a vector""" self.normal_vector = self.get_normal_vector() return self def get_default_tip_length(self) -> float: """Returns the default tip_length of the arrow. Examples -------- :: >>> Arrow().get_default_tip_length() 0.35 """ max_ratio = self.max_tip_length_to_length_ratio return min(self.tip_length, max_ratio * self.get_length()) def _set_stroke_width_from_length(self) -> Self: """Sets stroke width based on length.""" max_ratio = self.max_stroke_width_to_length_ratio if config.renderer == RendererType.OPENGL: # Mypy does not recognize that the self object in this case # is a OpenGLVMobject and that the set_stroke method is # defined here: # mobject/opengl/opengl_vectorized_mobject.py#L248 self.set_stroke( # type: ignore[call-arg] width=min(self.initial_stroke_width, max_ratio * self.get_length()), recurse=False, ) else: self.set_stroke( width=min(self.initial_stroke_width, max_ratio * self.get_length()), family=False, ) return self class Vector(Arrow): """A vector specialized for use in graphs. .. caution:: Do not confuse with the :class:`~.Vector2D`, :class:`~.Vector3D` or :class:`~.VectorND` type aliases, which are not Mobjects! Parameters ---------- direction The direction of the arrow. buff The distance of the vector from its endpoints. kwargs Additional arguments to be passed to :class:`Arrow` Examples -------- .. manim:: VectorExample :save_last_frame: class VectorExample(Scene): def construct(self): plane = NumberPlane() vector_1 = Vector([1,2]) vector_2 = Vector([-5,-2]) self.add(plane, vector_1, vector_2) """ def __init__( self, direction: Vector2DLike | Vector3DLike = RIGHT, buff: float = 0, **kwargs: Any, ) -> None: self.buff = buff if len(direction) == 2: direction = np.hstack([direction, 0]) super().__init__(ORIGIN, direction, buff=buff, **kwargs) def coordinate_label( self, integer_labels: bool = True, n_dim: int = 2, color: ParsableManimColor | None = None, **kwargs: Any, ) -> Matrix: """Creates a label based on the coordinates of the vector. Parameters ---------- integer_labels Whether or not to round the coordinates to integers. n_dim The number of dimensions of the vector. color Sets the color of label, optional. kwargs Additional arguments to be passed to :class:`~.Matrix`. Returns ------- :class:`~.Matrix` The label. Examples -------- .. manim:: VectorCoordinateLabel :save_last_frame: class VectorCoordinateLabel(Scene): def construct(self): plane = NumberPlane() vec_1 = Vector([1, 2]) vec_2 = Vector([-3, -2]) label_1 = vec_1.coordinate_label() label_2 = vec_2.coordinate_label(color=YELLOW) self.add(plane, vec_1, vec_2, label_1, label_2) """ # avoiding circular imports from ..matrix import Matrix vect = np.array(self.get_end()) if integer_labels: vect = np.round(vect).astype(int) vect = vect[:n_dim] vect = vect.reshape((n_dim, 1)) label = Matrix(vect, **kwargs) label.scale(LARGE_BUFF - 0.2) shift_dir = np.array(self.get_end()) if shift_dir[0] >= 0: # Pointing right shift_dir -= label.get_left() + DEFAULT_MOBJECT_TO_MOBJECT_BUFFER * LEFT else: # Pointing left shift_dir -= label.get_right() + DEFAULT_MOBJECT_TO_MOBJECT_BUFFER * RIGHT label.shift(shift_dir) if color is not None: label.set_color(color) return label class DoubleArrow(Arrow): """An arrow with tips on both ends. Parameters ---------- args Arguments to be passed to :class:`Arrow` kwargs Additional arguments to be passed to :class:`Arrow` .. seealso:: :class:`.~ArrowTip` :class:`.~CurvedDoubleArrow` Examples -------- .. manim:: DoubleArrowExample :save_last_frame: from manim.mobject.geometry.tips import ArrowCircleFilledTip class DoubleArrowExample(Scene): def construct(self): circle = Circle(radius=2.0) d_arrow = DoubleArrow(start=circle.get_left(), end=circle.get_right()) d_arrow_2 = DoubleArrow(tip_shape_end=ArrowCircleFilledTip, tip_shape_start=ArrowCircleFilledTip) group = Group(Group(circle, d_arrow), d_arrow_2).arrange(UP, buff=1) self.add(group) .. manim:: DoubleArrowExample2 :save_last_frame: class DoubleArrowExample2(Scene): def construct(self): box = Square() p1 = box.get_left() p2 = box.get_right() d1 = DoubleArrow(p1, p2, buff=0) d2 = DoubleArrow(p1, p2, buff=0, tip_length=0.2, color=YELLOW) d3 = DoubleArrow(p1, p2, buff=0, tip_length=0.4, color=BLUE) Group(d1, d2, d3).arrange(DOWN) self.add(box, d1, d2, d3) """ def __init__(self, *args: Any, **kwargs: Any) -> None: if "tip_shape_end" in kwargs: kwargs["tip_shape"] = kwargs.pop("tip_shape_end") tip_shape_start = kwargs.pop("tip_shape_start", ArrowTriangleFilledTip) super().__init__(*args, **kwargs) self.add_tip(at_start=True, tip_shape=tip_shape_start) class Angle(VMobject, metaclass=ConvertToOpenGL): """A circular arc or elbow-type mobject representing an angle of two lines. Parameters ---------- line1 : The first line. line2 : The second line. radius : The radius of the :class:`Arc`. quadrant A sequence of two :class:`int` numbers determining which of the 4 quadrants should be used. The first value indicates whether to anchor the arc on the first line closer to the end point (1) or start point (-1), and the second value functions similarly for the end (1) or start (-1) of the second line. Possibilities: (1,1), (-1,1), (1,-1), (-1,-1). other_angle : Toggles between the two possible angles defined by two points and an arc center. If set to False (default), the arc will always go counterclockwise from the point on line1 until the point on line2 is reached. If set to True, the angle will go clockwise from line1 to line2. dot Allows for a :class:`Dot` in the arc. Mainly used as an convention to indicate a right angle. The dot can be customized in the next three parameters. dot_radius The radius of the :class:`Dot`. If not specified otherwise, this radius will be 1/10 of the arc radius. dot_distance Relative distance from the center to the arc: 0 puts the dot in the center and 1 on the arc itself. dot_color The color of the :class:`Dot`. elbow Produces an elbow-type mobject indicating a right angle, see :class:`RightAngle` for more information and a shorthand. **kwargs Further keyword arguments that are passed to the constructor of :class:`Arc` or :class:`Elbow`. Examples -------- The first example shows some right angles with a dot in the middle while the second example shows all 8 possible angles defined by two lines. .. manim:: RightArcAngleExample :save_last_frame: class RightArcAngleExample(Scene): def construct(self): line1 = Line( LEFT, RIGHT ) line2 = Line( DOWN, UP ) rightarcangles = [ Angle(line1, line2, dot=True), Angle(line1, line2, radius=0.4, quadrant=(1,-1), dot=True, other_angle=True), Angle(line1, line2, radius=0.5, quadrant=(-1,1), stroke_width=8, dot=True, dot_color=YELLOW, dot_radius=0.04, other_angle=True), Angle(line1, line2, radius=0.7, quadrant=(-1,-1), color=RED, dot=True, dot_color=GREEN, dot_radius=0.08), ] plots = VGroup() for angle in rightarcangles: plot=VGroup(line1.copy(),line2.copy(), angle) plots.add(plot) plots.arrange(buff=1.5) self.add(plots) .. manim:: AngleExample :save_last_frame: class AngleExample(Scene): def construct(self): line1 = Line( LEFT + (1/3) * UP, RIGHT + (1/3) * DOWN ) line2 = Line( DOWN + (1/3) * RIGHT, UP + (1/3) * LEFT ) angles = [ Angle(line1, line2), Angle(line1, line2, radius=0.4, quadrant=(1,-1), other_angle=True), Angle(line1, line2, radius=0.5, quadrant=(-1,1), stroke_width=8, other_angle=True), Angle(line1, line2, radius=0.7, quadrant=(-1,-1), color=RED), Angle(line1, line2, other_angle=True), Angle(line1, line2, radius=0.4, quadrant=(1,-1)), Angle(line1, line2, radius=0.5, quadrant=(-1,1), stroke_width=8), Angle(line1, line2, radius=0.7, quadrant=(-1,-1), color=RED, other_angle=True), ] plots = VGroup() for angle in angles: plot=VGroup(line1.copy(),line2.copy(), angle) plots.add(VGroup(plot,SurroundingRectangle(plot, buff=0.3))) plots.arrange_in_grid(rows=2,buff=1) self.add(plots) .. manim:: FilledAngle :save_last_frame: class FilledAngle(Scene): def construct(self): l1 = Line(ORIGIN, 2 * UP + RIGHT).set_color(GREEN) l2 = ( Line(ORIGIN, 2 * UP + RIGHT) .set_color(GREEN) .rotate(-20 * DEGREES, about_point=ORIGIN) ) norm = l1.get_length() a1 = Angle(l1, l2, other_angle=True, radius=norm - 0.5).set_color(GREEN) a2 = Angle(l1, l2, other_angle=True, radius=norm).set_color(GREEN) q1 = a1.points # save all coordinates of points of angle a1 q2 = a2.reverse_direction().points # save all coordinates of points of angle a1 (in reversed direction) pnts = np.concatenate([q1, q2, q1[0].reshape(1, 3)]) # adds points and ensures that path starts and ends at same point mfill = VMobject().set_color(ORANGE) mfill.set_points_as_corners(pnts).set_fill(GREEN, opacity=1) self.add(l1, l2) self.add(mfill) """ def __init__( self, line1: Line, line2: Line, radius: float | None = None, quadrant: AngleQuadrant = (1, 1), other_angle: bool = False, dot: bool = False, dot_radius: float | None = None, dot_distance: float = 0.55, dot_color: ParsableManimColor = WHITE, elbow: bool = False, **kwargs: Any, ) -> None: super().__init__(**kwargs) self.lines = (line1, line2) self.quadrant = quadrant self.dot_distance = dot_distance self.elbow = elbow inter = line_intersection( [line1.get_start(), line1.get_end()], [line2.get_start(), line2.get_end()], ) if radius is None: if quadrant[0] == 1: dist_1 = np.linalg.norm(line1.get_end() - inter) else: dist_1 = np.linalg.norm(line1.get_start() - inter) if quadrant[1] == 1: dist_2 = np.linalg.norm(line2.get_end() - inter) else: dist_2 = np.linalg.norm(line2.get_start() - inter) if np.minimum(dist_1, dist_2) < 0.6: radius = (2 / 3) * np.minimum(dist_1, dist_2) else: radius = 0.4 else: self.radius = radius anchor_angle_1 = inter + quadrant[0] * radius * line1.get_unit_vector() anchor_angle_2 = inter + quadrant[1] * radius * line2.get_unit_vector() if elbow: anchor_middle = ( inter + quadrant[0] * radius * line1.get_unit_vector() + quadrant[1] * radius * line2.get_unit_vector() ) angle_mobject: VMobject = Elbow(**kwargs) angle_mobject.set_points_as_corners( np.array([anchor_angle_1, anchor_middle, anchor_angle_2]), ) else: angle_1 = angle_of_vector(anchor_angle_1 - inter) angle_2 = angle_of_vector(anchor_angle_2 - inter) if not other_angle: start_angle = angle_1 if angle_2 > angle_1: angle_fin = angle_2 - angle_1 else: angle_fin = 2 * np.pi - (angle_1 - angle_2) else: start_angle = angle_1 if angle_2 < angle_1: angle_fin = -angle_1 + angle_2 else: angle_fin = -2 * np.pi + (angle_2 - angle_1) self.angle_value = angle_fin angle_mobject = Arc( radius=radius, angle=self.angle_value, start_angle=start_angle, arc_center=inter, **kwargs, ) if dot: if dot_radius is None: dot_radius = radius / 10 else: self.dot_radius = dot_radius right_dot = Dot(ORIGIN, radius=dot_radius, color=dot_color) dot_anchor = ( inter + (angle_mobject.get_center() - inter) / np.linalg.norm(angle_mobject.get_center() - inter) * radius * dot_distance ) right_dot.move_to(dot_anchor) self.add(right_dot) self.set_points(angle_mobject.points) def get_lines(self) -> VGroup: """Get the lines forming an angle of the :class:`Angle` class. Returns ------- :class:`~.VGroup` A :class:`~.VGroup` containing the lines that form the angle of the :class:`Angle` class. Examples -------- :: >>> line_1, line_2 = Line(ORIGIN, RIGHT), Line(ORIGIN, UR) >>> angle = Angle(line_1, line_2) >>> angle.get_lines() VGroup(Line, Line) """ return VGroup(*self.lines) def get_value(self, degrees: bool = False) -> float: r"""Get the value of an angle of the :class:`Angle` class. Parameters ---------- degrees A boolean to decide the unit (deg/rad) in which the value of the angle is returned. Returns ------- :class:`float` The value in degrees/radians of an angle of the :class:`Angle` class. Examples -------- .. manim:: GetValueExample :save_last_frame: class GetValueExample(Scene): def construct(self): line1 = Line(LEFT+(1/3)*UP, RIGHT+(1/3)*DOWN) line2 = Line(DOWN+(1/3)*RIGHT, UP+(1/3)*LEFT) angle = Angle(line1, line2, radius=0.4) value = DecimalNumber(angle.get_value(degrees=True), unit=r"^{\circ}") value.next_to(angle, UR) self.add(line1, line2, angle, value) """ return self.angle_value / DEGREES if degrees else self.angle_value @staticmethod def from_three_points( A: Point3DLike, B: Point3DLike, C: Point3DLike, **kwargs: Any ) -> Angle: r"""The angle between the lines AB and BC. This constructs the angle :math:`\\angle ABC`. Parameters ---------- A The endpoint of the first angle leg B The vertex of the angle C The endpoint of the second angle leg **kwargs Further keyword arguments are passed to :class:`.Angle` Returns ------- The Angle calculated from the three points Angle(line1, line2, radius=0.5, quadrant=(-1,1), stroke_width=8), Angle(line1, line2, radius=0.7, quadrant=(-1,-1), color=RED, other_angle=True), Examples -------- .. manim:: AngleFromThreePointsExample :save_last_frame: class AngleFromThreePointsExample(Scene): def construct(self): sample_angle = Angle.from_three_points(UP, ORIGIN, LEFT) red_angle = Angle.from_three_points(LEFT + UP, ORIGIN, RIGHT, radius=.8, quadrant=(-1,-1), color=RED, stroke_width=8, other_angle=True) self.add(red_angle, sample_angle) """ return Angle(Line(B, A), Line(B, C), **kwargs) class RightAngle(Angle): """An elbow-type mobject representing a right angle between two lines. Parameters ---------- line1 The first line. line2 The second line. length The length of the arms. **kwargs Further keyword arguments that are passed to the constructor of :class:`Angle`. Examples -------- .. manim:: RightAngleExample :save_last_frame: class RightAngleExample(Scene): def construct(self): line1 = Line( LEFT, RIGHT ) line2 = Line( DOWN, UP ) rightangles = [ RightAngle(line1, line2), RightAngle(line1, line2, length=0.4, quadrant=(1,-1)), RightAngle(line1, line2, length=0.5, quadrant=(-1,1), stroke_width=8), RightAngle(line1, line2, length=0.7, quadrant=(-1,-1), color=RED), ] plots = VGroup() for rightangle in rightangles: plot=VGroup(line1.copy(),line2.copy(), rightangle) plots.add(plot) plots.arrange(buff=1.5) self.add(plots) """ def __init__( self, line1: Line, line2: Line, length: float | None = None, **kwargs: Any, ) -> None: super().__init__(line1, line2, radius=length, elbow=True, **kwargs) ManimCommunity-manim-1157b74/manim/mobject/geometry/polygram.py000066400000000000000000000651021515024150700246220ustar00rootroot00000000000000r"""Mobjects that are simple geometric shapes.""" from __future__ import annotations __all__ = [ "Polygram", "Polygon", "RegularPolygram", "RegularPolygon", "Star", "Triangle", "Rectangle", "Square", "RoundedRectangle", "Cutout", "ConvexHull", ] from math import ceil from typing import TYPE_CHECKING, Any, Literal import numpy as np from manim.constants import * from manim.mobject.geometry.arc import ArcBetweenPoints from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.utils.color import BLUE, WHITE, ParsableManimColor from manim.utils.iterables import adjacent_n_tuples, adjacent_pairs from manim.utils.qhull import QuickHull from manim.utils.space_ops import angle_between_vectors, normalize, regular_vertices if TYPE_CHECKING: from typing import Self import numpy.typing as npt from manim.typing import ( Point3D, Point3D_Array, Point3DLike, Point3DLike_Array, ) from manim.utils.color import ParsableManimColor class Polygram(VMobject, metaclass=ConvertToOpenGL): """A generalized :class:`Polygon`, allowing for disconnected sets of edges. Parameters ---------- vertex_groups The groups of vertices making up the :class:`Polygram`. The first vertex in each group is repeated to close the shape. Each point must be 3-dimensional: ``[x,y,z]`` color The color of the :class:`Polygram`. kwargs Forwarded to the parent constructor. Examples -------- .. manim:: PolygramExample import numpy as np class PolygramExample(Scene): def construct(self): hexagram = Polygram( [[0, 2, 0], [-np.sqrt(3), -1, 0], [np.sqrt(3), -1, 0]], [[-np.sqrt(3), 1, 0], [0, -2, 0], [np.sqrt(3), 1, 0]], ) self.add(hexagram) dot = Dot() self.play(MoveAlongPath(dot, hexagram), run_time=5, rate_func=linear) self.remove(dot) self.wait() """ def __init__( self, *vertex_groups: Point3DLike_Array, color: ParsableManimColor = BLUE, **kwargs: Any, ): super().__init__(color=color, **kwargs) for vertices in vertex_groups: # The inferred type for *vertices is Any, but it should be # Point3D_Array first_vertex, *vertices = vertices first_vertex = np.array(first_vertex) self.start_new_path(first_vertex) self.add_points_as_corners( [*(np.array(vertex) for vertex in vertices), first_vertex], ) def get_vertices(self) -> Point3D_Array: """Gets the vertices of the :class:`Polygram`. Returns ------- :class:`numpy.ndarray` The vertices of the :class:`Polygram`. Examples -------- :: >>> sq = Square() >>> sq.get_vertices() array([[ 1., 1., 0.], [-1., 1., 0.], [-1., -1., 0.], [ 1., -1., 0.]]) """ return self.get_start_anchors() def get_vertex_groups(self) -> list[Point3D_Array]: """Gets the vertex groups of the :class:`Polygram`. Returns ------- list[Point3D_Array] The list of vertex groups of the :class:`Polygram`. Examples -------- :: >>> poly = Polygram([ORIGIN, RIGHT, UP, LEFT + UP], [LEFT, LEFT + UP, 2 * LEFT]) >>> groups = poly.get_vertex_groups() >>> len(groups) 2 >>> groups[0] array([[ 0., 0., 0.], [ 1., 0., 0.], [ 0., 1., 0.], [-1., 1., 0.]]) >>> groups[1] array([[-1., 0., 0.], [-1., 1., 0.], [-2., 0., 0.]]) """ vertex_groups = [] # TODO: If any of the original vertex groups contained the starting vertex N # times, then .get_vertex_groups() splits it into N vertex groups. group = [] for start, end in zip( self.get_start_anchors(), self.get_end_anchors(), strict=True ): group.append(start) if self.consider_points_equals(end, group[0]): vertex_groups.append(np.array(group)) group = [] return vertex_groups def round_corners( self, radius: float | list[float] = 0.5, evenly_distribute_anchors: bool = False, components_per_rounded_corner: int = 2, ) -> Self: """Rounds off the corners of the :class:`Polygram`. Parameters ---------- radius The curvature of the corners of the :class:`Polygram`. evenly_distribute_anchors Break long line segments into proportionally-sized segments. components_per_rounded_corner The number of points used to represent the rounded corner curve. .. seealso:: :class:`.~RoundedRectangle` .. note:: If `radius` is supplied as a single value, then the same radius will be applied to all corners. If `radius` is a list, then the individual values will be applied sequentially, with the first corner receiving `radius[0]`, the second corner receiving `radius[1]`, etc. The radius list will be repeated as necessary. The `components_per_rounded_corner` value is provided so that the fidelity of the rounded corner may be fine-tuned as needed. 2 is an appropriate value for most shapes, however a larger value may be need if the rounded corner is particularly large. 2 is the minimum number allowed, representing the start and end of the curve. 3 will result in a start, middle, and end point, meaning 2 curves will be generated. The option to `evenly_distribute_anchors` is provided so that the line segments (the part part of each line remaining after rounding off the corners) can be subdivided to a density similar to that of the average density of the rounded corners. This may be desirable in situations in which an even distribution of curves is desired for use in later transformation animations. Be aware, though, that enabling this option can result in an an object containing significantly more points than the original, especially when the rounded corner curves are small. Examples -------- .. manim:: PolygramRoundCorners :save_last_frame: class PolygramRoundCorners(Scene): def construct(self): star = Star(outer_radius=2) shapes = VGroup(star) shapes.add(star.copy().round_corners(radius=0.1)) shapes.add(star.copy().round_corners(radius=0.25)) shapes.arrange(RIGHT) self.add(shapes) """ if radius == 0: return self new_points: list[Point3D] = [] for vertex_group in self.get_vertex_groups(): arcs = [] # Repeat the radius list as necessary in order to provide a radius # for each vertex. if isinstance(radius, (int, float)): radius_list = [radius] * len(vertex_group) else: radius_list = radius * ceil(len(vertex_group) / len(radius)) for current_radius, (v1, v2, v3) in zip( radius_list, adjacent_n_tuples(vertex_group, 3), strict=True ): vect1 = v2 - v1 vect2 = v3 - v2 unit_vect1 = normalize(vect1) unit_vect2 = normalize(vect2) angle = angle_between_vectors(vect1, vect2) # Negative radius gives concave curves angle *= np.sign(current_radius) # Distance between vertex and start of the arc cut_off_length = current_radius * np.tan(angle / 2) # Determines counterclockwise vs. clockwise sign = np.sign(np.cross(vect1, vect2)[2]) arc = ArcBetweenPoints( v2 - unit_vect1 * cut_off_length, v2 + unit_vect2 * cut_off_length, angle=sign * angle, num_components=components_per_rounded_corner, ) arcs.append(arc) if evenly_distribute_anchors: # Determine the average length of each curve nonzero_length_arcs = [arc for arc in arcs if len(arc.points) > 4] if len(nonzero_length_arcs) > 0: total_arc_length = sum( [arc.get_arc_length() for arc in nonzero_length_arcs] ) num_curves = ( sum([len(arc.points) for arc in nonzero_length_arcs]) / 4 ) average_arc_length = total_arc_length / num_curves else: average_arc_length = 1.0 # To ensure that we loop through starting with last arcs = [arcs[-1], *arcs[:-1]] from manim.mobject.geometry.line import Line for arc1, arc2 in adjacent_pairs(arcs): new_points.extend(arc1.points) line = Line(arc1.get_end(), arc2.get_start()) # Make sure anchors are evenly distributed, if necessary if evenly_distribute_anchors: line.insert_n_curves(ceil(line.get_length() / average_arc_length)) new_points.extend(line.points) self.set_points(np.array(new_points)) return self class Polygon(Polygram): """A shape consisting of one closed loop of vertices. Parameters ---------- vertices The vertices of the :class:`Polygon`. kwargs Forwarded to the parent constructor. Examples -------- .. manim:: PolygonExample :save_last_frame: class PolygonExample(Scene): def construct(self): isosceles = Polygon([-5, 1.5, 0], [-2, 1.5, 0], [-3.5, -2, 0]) position_list = [ [4, 1, 0], # middle right [4, -2.5, 0], # bottom right [0, -2.5, 0], # bottom left [0, 3, 0], # top left [2, 1, 0], # middle [4, 3, 0], # top right ] square_and_triangles = Polygon(*position_list, color=PURPLE_B) self.add(isosceles, square_and_triangles) """ def __init__(self, *vertices: Point3DLike, **kwargs: Any) -> None: super().__init__(vertices, **kwargs) class RegularPolygram(Polygram): """A :class:`Polygram` with regularly spaced vertices. Parameters ---------- num_vertices The number of vertices. density The density of the :class:`RegularPolygram`. Can be thought of as how many vertices to hop to draw a line between them. Every ``density``-th vertex is connected. radius The radius of the circle that the vertices are placed on. start_angle The angle the vertices start at; the rotation of the :class:`RegularPolygram`. kwargs Forwarded to the parent constructor. Examples -------- .. manim:: RegularPolygramExample :save_last_frame: class RegularPolygramExample(Scene): def construct(self): pentagram = RegularPolygram(5, radius=2) self.add(pentagram) """ def __init__( self, num_vertices: int, *, density: int = 2, radius: float = 1, start_angle: float | None = None, **kwargs: Any, ) -> None: # Regular polygrams can be expressed by the number of their vertices # and their density. This relation can be expressed as its Schlรคfli # symbol: {num_vertices/density}. # # For instance, a pentagon can be expressed as {5/1} or just {5}. # A pentagram, however, can be expressed as {5/2}. # A hexagram *would* be expressed as {6/2}, except that 6 and 2 # are not coprime, and it can be simplified to 2{3}, which corresponds # to the fact that a hexagram is actually made up of 2 triangles. # # See https://en.wikipedia.org/wiki/Polygram_(geometry)#Generalized_regular_polygons # for more information. num_gons = np.gcd(num_vertices, density) num_vertices //= num_gons density //= num_gons # Utility function for generating the individual # polygon vertices. def gen_polygon_vertices(start_angle: float | None) -> tuple[list[Any], float]: reg_vertices, start_angle = regular_vertices( num_vertices, radius=radius, start_angle=start_angle, ) vertices = [] i = 0 while True: vertices.append(reg_vertices[i]) i += density i %= num_vertices if i == 0: break return vertices, start_angle first_group, self.start_angle = gen_polygon_vertices(start_angle) vertex_groups = [first_group] for i in range(1, num_gons): start_angle = self.start_angle + (i / num_gons) * TAU / num_vertices group, _ = gen_polygon_vertices(start_angle) vertex_groups.append(group) super().__init__(*vertex_groups, **kwargs) class RegularPolygon(RegularPolygram): """An n-sided regular :class:`Polygon`. Parameters ---------- n The number of sides of the :class:`RegularPolygon`. kwargs Forwarded to the parent constructor. Examples -------- .. manim:: RegularPolygonExample :save_last_frame: class RegularPolygonExample(Scene): def construct(self): poly_1 = RegularPolygon(n=6) poly_2 = RegularPolygon(n=6, start_angle=30*DEGREES, color=GREEN) poly_3 = RegularPolygon(n=10, color=RED) poly_group = Group(poly_1, poly_2, poly_3).scale(1.5).arrange(buff=1) self.add(poly_group) """ def __init__(self, n: int = 6, **kwargs: Any) -> None: super().__init__(n, density=1, **kwargs) class Star(Polygon): """A regular polygram without the intersecting lines. Parameters ---------- n How many points on the :class:`Star`. outer_radius The radius of the circle that the outer vertices are placed on. inner_radius The radius of the circle that the inner vertices are placed on. If unspecified, the inner radius will be calculated such that the edges of the :class:`Star` perfectly follow the edges of its :class:`RegularPolygram` counterpart. density The density of the :class:`Star`. Only used if ``inner_radius`` is unspecified. See :class:`RegularPolygram` for more information. start_angle The angle the vertices start at; the rotation of the :class:`Star`. kwargs Forwardeds to the parent constructor. Raises ------ :exc:`ValueError` If ``inner_radius`` is unspecified and ``density`` is not in the range ``[1, n/2)``. Examples -------- .. manim:: StarExample class StarExample(Scene): def construct(self): pentagram = RegularPolygram(5, radius=2) star = Star(outer_radius=2, color=RED) self.add(pentagram) self.play(Create(star), run_time=3) self.play(FadeOut(star), run_time=2) .. manim:: DifferentDensitiesExample :save_last_frame: class DifferentDensitiesExample(Scene): def construct(self): density_2 = Star(7, outer_radius=2, density=2, color=RED) density_3 = Star(7, outer_radius=2, density=3, color=PURPLE) self.add(VGroup(density_2, density_3).arrange(RIGHT)) """ def __init__( self, n: int = 5, *, outer_radius: float = 1, inner_radius: float | None = None, density: int = 2, start_angle: float | None = TAU / 4, **kwargs: Any, ) -> None: inner_angle = TAU / (2 * n) if inner_radius is None: # See https://math.stackexchange.com/a/2136292 for an # overview of how to calculate the inner radius of a # perfect star. if density <= 0 or density >= n / 2: raise ValueError( f"Incompatible density {density} for number of points {n}", ) outer_angle = TAU * density / n inverse_x = 1 - np.tan(inner_angle) * ( (np.cos(outer_angle) - 1) / np.sin(outer_angle) ) inner_radius = outer_radius / (np.cos(inner_angle) * inverse_x) outer_vertices, self.start_angle = regular_vertices( n, radius=outer_radius, start_angle=start_angle, ) inner_vertices, _ = regular_vertices( n, radius=inner_radius, start_angle=self.start_angle + inner_angle, ) vertices: list[npt.NDArray] = [] for pair in zip(outer_vertices, inner_vertices, strict=True): vertices.extend(pair) super().__init__(*vertices, **kwargs) class Triangle(RegularPolygon): """An equilateral triangle. Parameters ---------- kwargs Additional arguments to be passed to :class:`RegularPolygon` Examples -------- .. manim:: TriangleExample :save_last_frame: class TriangleExample(Scene): def construct(self): triangle_1 = Triangle() triangle_2 = Triangle().scale(2).rotate(60*DEGREES) tri_group = Group(triangle_1, triangle_2).arrange(buff=1) self.add(tri_group) """ def __init__(self, **kwargs: Any) -> None: super().__init__(n=3, **kwargs) class Rectangle(Polygon): """A quadrilateral with two sets of parallel sides. Parameters ---------- color The color of the rectangle. height The vertical height of the rectangle. width The horizontal width of the rectangle. grid_xstep Space between vertical grid lines. grid_ystep Space between horizontal grid lines. mark_paths_closed No purpose. close_new_points No purpose. kwargs Additional arguments to be passed to :class:`Polygon` Examples ---------- .. manim:: RectangleExample :save_last_frame: class RectangleExample(Scene): def construct(self): rect1 = Rectangle(width=4.0, height=2.0, grid_xstep=1.0, grid_ystep=0.5) rect2 = Rectangle(width=1.0, height=4.0) rect3 = Rectangle(width=2.0, height=2.0, grid_xstep=1.0, grid_ystep=1.0) rect3.grid_lines.set_stroke(width=1) rects = Group(rect1, rect2, rect3).arrange(buff=1) self.add(rects) """ def __init__( self, color: ParsableManimColor = WHITE, height: float = 2.0, width: float = 4.0, grid_xstep: float | None = None, grid_ystep: float | None = None, mark_paths_closed: bool = True, close_new_points: bool = True, **kwargs: Any, ): super().__init__(UR, UL, DL, DR, color=color, **kwargs) self.stretch_to_fit_width(width) self.stretch_to_fit_height(height) v = self.get_vertices() self.grid_lines = VGroup() if grid_xstep or grid_ystep: from manim.mobject.geometry.line import Line v = self.get_vertices() if grid_xstep: grid_xstep = abs(grid_xstep) count = int(width / grid_xstep) grid = VGroup( *( Line( v[1] + i * grid_xstep * RIGHT, v[1] + i * grid_xstep * RIGHT + height * DOWN, color=color, ) for i in range(1, count) ) ) self.grid_lines.add(grid) if grid_ystep: grid_ystep = abs(grid_ystep) count = int(height / grid_ystep) grid = VGroup( *( Line( v[1] + i * grid_ystep * DOWN, v[1] + i * grid_ystep * DOWN + width * RIGHT, color=color, ) for i in range(1, count) ) ) self.grid_lines.add(grid) if self.grid_lines: self.add(self.grid_lines) class Square(Rectangle): """A rectangle with equal side lengths. Parameters ---------- side_length The length of the sides of the square. kwargs Additional arguments to be passed to :class:`Rectangle`. Examples -------- .. manim:: SquareExample :save_last_frame: class SquareExample(Scene): def construct(self): square_1 = Square(side_length=2.0).shift(DOWN) square_2 = Square(side_length=1.0).next_to(square_1, direction=UP) square_3 = Square(side_length=0.5).next_to(square_2, direction=UP) self.add(square_1, square_2, square_3) """ def __init__(self, side_length: float = 2.0, **kwargs: Any) -> None: super().__init__(height=side_length, width=side_length, **kwargs) @property def side_length(self) -> float: return float(np.linalg.norm(self.get_vertices()[0] - self.get_vertices()[1])) @side_length.setter def side_length(self, value: float) -> None: self.scale(value / self.side_length) class RoundedRectangle(Rectangle): """A rectangle with rounded corners. Parameters ---------- corner_radius The curvature of the corners of the rectangle. kwargs Additional arguments to be passed to :class:`Rectangle` Examples -------- .. manim:: RoundedRectangleExample :save_last_frame: class RoundedRectangleExample(Scene): def construct(self): rect_1 = RoundedRectangle(corner_radius=0.5) rect_2 = RoundedRectangle(corner_radius=1.5, height=4.0, width=4.0) rect_group = Group(rect_1, rect_2).arrange(buff=1) self.add(rect_group) """ def __init__(self, corner_radius: float | list[float] = 0.5, **kwargs: Any): super().__init__(**kwargs) self.corner_radius = corner_radius self.round_corners(self.corner_radius) class Cutout(VMobject, metaclass=ConvertToOpenGL): """A shape with smaller cutouts. Parameters ---------- main_shape The primary shape from which cutouts are made. mobjects The smaller shapes which are to be cut out of the ``main_shape``. kwargs Further keyword arguments that are passed to the constructor of :class:`~.VMobject`. .. warning:: Technically, this class behaves similar to a symmetric difference: if parts of the ``mobjects`` are not located within the ``main_shape``, these parts will be added to the resulting :class:`~.VMobject`. Examples -------- .. manim:: CutoutExample class CutoutExample(Scene): def construct(self): s1 = Square().scale(2.5) s2 = Triangle().shift(DOWN + RIGHT).scale(0.5) s3 = Square().shift(UP + RIGHT).scale(0.5) s4 = RegularPolygon(5).shift(DOWN + LEFT).scale(0.5) s5 = RegularPolygon(6).shift(UP + LEFT).scale(0.5) c = Cutout(s1, s2, s3, s4, s5, fill_opacity=1, color=BLUE, stroke_color=RED) self.play(Write(c), run_time=4) self.wait() """ def __init__( self, main_shape: VMobject, *mobjects: VMobject, **kwargs: Any ) -> None: super().__init__(**kwargs) self.append_points(main_shape.points) sub_direction: Literal["CCW", "CW"] = ( "CCW" if main_shape.get_direction() == "CW" else "CW" ) for mobject in mobjects: self.append_points(mobject.force_direction(sub_direction).points) class ConvexHull(Polygram): """Constructs a convex hull for a set of points in no particular order. Parameters ---------- points The points to consider. tolerance The tolerance used by quickhull. kwargs Forwarded to the parent constructor. Examples -------- .. manim:: ConvexHullExample :save_last_frame: :quality: high class ConvexHullExample(Scene): def construct(self): points = [ [-2.35, -2.25, 0], [1.65, -2.25, 0], [2.65, -0.25, 0], [1.65, 1.75, 0], [-0.35, 2.75, 0], [-2.35, 0.75, 0], [-0.35, -1.25, 0], [0.65, -0.25, 0], [-1.35, 0.25, 0], [0.15, 0.75, 0] ] hull = ConvexHull(*points, color=BLUE) dots = VGroup(*[Dot(point) for point in points]) self.add(hull) self.add(dots) """ def __init__( self, *points: Point3DLike, tolerance: float = 1e-5, **kwargs: Any ) -> None: # Build Convex Hull array = np.array(points)[:, :2] hull = QuickHull(tolerance) hull.build(array) # Extract Vertices facets = set(hull.facets) - hull.removed facet = facets.pop() subfacets = list(facet.subfacets) while len(subfacets) <= len(facets): sf = subfacets[-1] (facet,) = hull.neighbors[sf] - {facet} (sf,) = facet.subfacets - {sf} subfacets.append(sf) # Setup Vertices as Point3D coordinates = np.vstack([sf.coordinates for sf in subfacets]) vertices = np.hstack((coordinates, np.zeros((len(coordinates), 1)))) # Call Polygram super().__init__(vertices, **kwargs) ManimCommunity-manim-1157b74/manim/mobject/geometry/shape_matchers.py000066400000000000000000000151051515024150700257540ustar00rootroot00000000000000"""Mobjects used to mark and annotate other mobjects.""" from __future__ import annotations __all__ = ["SurroundingRectangle", "BackgroundRectangle", "Cross", "Underline"] from typing import Any, Self from manim import logger from manim._config import config from manim.constants import ( DOWN, LEFT, RIGHT, SMALL_BUFF, UP, ) from manim.mobject.geometry.line import Line from manim.mobject.geometry.polygram import RoundedRectangle from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.types.vectorized_mobject import VGroup from manim.utils.color import BLACK, PURE_YELLOW, RED, ParsableManimColor class SurroundingRectangle(RoundedRectangle): r"""A rectangle surrounding a :class:`~.Mobject` Examples -------- .. manim:: SurroundingRectExample :save_last_frame: class SurroundingRectExample(Scene): def construct(self): title = Title("A Quote from Newton") quote = Text( "If I have seen further than others, \n" "it is by standing upon the shoulders of giants.", color=BLUE, ).scale(0.75) box = SurroundingRectangle(quote, color=YELLOW, buff=MED_LARGE_BUFF) t2 = Tex(r"Hello World").scale(1.5) box2 = SurroundingRectangle(t2, corner_radius=0.2) mobjects = VGroup(VGroup(box, quote), VGroup(t2, box2)).arrange(DOWN) self.add(title, mobjects) """ def __init__( self, *mobjects: Mobject, color: ParsableManimColor = PURE_YELLOW, buff: float | tuple[float, float] = SMALL_BUFF, corner_radius: float = 0.0, **kwargs: Any, ) -> None: from manim.mobject.mobject import Group if not all(isinstance(mob, (Mobject, OpenGLMobject)) for mob in mobjects): raise TypeError( "Expected all inputs for parameter mobjects to be a Mobjects" ) if isinstance(buff, tuple): buff_x = buff[0] buff_y = buff[1] else: buff_x = buff_y = buff group = Group(*mobjects) super().__init__( color=color, width=group.width + 2 * buff_x, height=group.height + 2 * buff_y, corner_radius=corner_radius, **kwargs, ) self.buff = buff self.move_to(group) class BackgroundRectangle(SurroundingRectangle): """A background rectangle. Its default color is the background color of the scene. Examples -------- .. manim:: ExampleBackgroundRectangle :save_last_frame: class ExampleBackgroundRectangle(Scene): def construct(self): circle = Circle().shift(LEFT) circle.set_stroke(color=GREEN, width=20) triangle = Triangle().shift(2 * RIGHT) triangle.set_fill(PINK, opacity=0.5) backgroundRectangle1 = BackgroundRectangle(circle, color=WHITE, fill_opacity=0.15) backgroundRectangle2 = BackgroundRectangle(triangle, color=WHITE, fill_opacity=0.15) self.add(backgroundRectangle1) self.add(backgroundRectangle2) self.add(circle) self.add(triangle) self.play(Rotate(backgroundRectangle1, PI / 4)) self.play(Rotate(backgroundRectangle2, PI / 2)) """ def __init__( self, *mobjects: Mobject, color: ParsableManimColor | None = None, stroke_width: float = 0, stroke_opacity: float = 0, fill_opacity: float = 0.75, buff: float | tuple[float, float] = 0, **kwargs: Any, ) -> None: if color is None: color = config.background_color super().__init__( *mobjects, color=color, stroke_width=stroke_width, stroke_opacity=stroke_opacity, fill_opacity=fill_opacity, buff=buff, **kwargs, ) self.original_fill_opacity: float = self.fill_opacity def pointwise_become_partial(self, mobject: Mobject, a: Any, b: float) -> Self: self.set_fill(opacity=b * self.original_fill_opacity) return self def set_style(self, fill_opacity: float, **kwargs: Any) -> Self: # type: ignore[override] # Unchangeable style, except for fill_opacity # All other style arguments are ignored super().set_style( stroke_color=BLACK, stroke_width=0, fill_color=BLACK, fill_opacity=fill_opacity, ) if len(kwargs) > 0: logger.info( "Argument %s is ignored in BackgroundRectangle.set_style.", kwargs, ) return self class Cross(VGroup): """Creates a cross. Parameters ---------- mobject The mobject linked to this instance. It fits the mobject when specified. Defaults to None. stroke_color Specifies the color of the cross lines. Defaults to RED. stroke_width Specifies the width of the cross lines. Defaults to 6. scale_factor Scales the cross to the provided units. Defaults to 1. Examples -------- .. manim:: ExampleCross :save_last_frame: class ExampleCross(Scene): def construct(self): cross = Cross() self.add(cross) """ def __init__( self, mobject: Mobject | None = None, stroke_color: ParsableManimColor = RED, stroke_width: float = 6.0, scale_factor: float = 1.0, **kwargs: Any, ) -> None: super().__init__( Line(UP + LEFT, DOWN + RIGHT), Line(UP + RIGHT, DOWN + LEFT), **kwargs ) if mobject is not None: self.replace(mobject, stretch=True) self.scale(scale_factor) self.set_stroke(color=stroke_color, width=stroke_width) class Underline(Line): """Creates an underline. Examples -------- .. manim:: UnderLine :save_last_frame: class UnderLine(Scene): def construct(self): man = Tex("Manim") # Full Word ul = Underline(man) # Underlining the word self.add(man, ul) """ def __init__( self, mobject: Mobject, buff: float = SMALL_BUFF, **kwargs: Any ) -> None: super().__init__(LEFT, RIGHT, buff=buff, **kwargs) self.match_width(mobject) self.next_to(mobject, DOWN, buff=self.buff) ManimCommunity-manim-1157b74/manim/mobject/geometry/tips.py000066400000000000000000000242761515024150700237560ustar00rootroot00000000000000r"""A collection of tip mobjects for use with :class:`~.TipableVMobject`.""" from __future__ import annotations __all__ = [ "ArrowTip", "ArrowCircleFilledTip", "ArrowCircleTip", "ArrowSquareTip", "ArrowSquareFilledTip", "ArrowTriangleTip", "ArrowTriangleFilledTip", "StealthTip", ] from typing import TYPE_CHECKING, Any import numpy as np from manim.constants import * from manim.mobject.geometry.arc import Circle from manim.mobject.geometry.polygram import Square, Triangle from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VMobject from manim.utils.space_ops import angle_of_vector if TYPE_CHECKING: from manim.typing import Point3D, Vector3D class ArrowTip(VMobject, metaclass=ConvertToOpenGL): r"""Base class for arrow tips. .. seealso:: :class:`ArrowTriangleTip` :class:`ArrowTriangleFilledTip` :class:`ArrowCircleTip` :class:`ArrowCircleFilledTip` :class:`ArrowSquareTip` :class:`ArrowSquareFilledTip` :class:`StealthTip` Examples -------- Cannot be used directly, only intended for inheritance:: >>> tip = ArrowTip() Traceback (most recent call last): ... NotImplementedError: Has to be implemented in inheriting subclasses. Instead, use one of the pre-defined ones, or make a custom one like this: .. manim:: CustomTipExample >>> from manim import RegularPolygon, Arrow >>> class MyCustomArrowTip(ArrowTip, RegularPolygon): ... def __init__(self, length=0.35, **kwargs): ... RegularPolygon.__init__(self, n=5, **kwargs) ... self.width = length ... self.stretch_to_fit_height(length) >>> arr = Arrow( ... np.array([-2, -2, 0]), np.array([2, 2, 0]), tip_shape=MyCustomArrowTip ... ) >>> isinstance(arr.tip, RegularPolygon) True >>> from manim import Scene, Create >>> class CustomTipExample(Scene): ... def construct(self): ... self.play(Create(arr)) Using a class inherited from :class:`ArrowTip` to get a non-filled tip is a shorthand to manually specifying the arrow tip style as follows:: >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 1, 0]), ... tip_style={'fill_opacity': 0, 'stroke_width': 3}) The following example illustrates the usage of all of the predefined arrow tips. .. manim:: ArrowTipsShowcase :save_last_frame: class ArrowTipsShowcase(Scene): def construct(self): tip_names = [ 'Default (YELLOW)', 'ArrowTriangleTip', 'Default', 'ArrowSquareTip', 'ArrowSquareFilledTip', 'ArrowCircleTip', 'ArrowCircleFilledTip', 'StealthTip' ] big_arrows = [ Arrow(start=[-4, 3.5, 0], end=[2, 3.5, 0], color=YELLOW), Arrow(start=[-4, 2.5, 0], end=[2, 2.5, 0], tip_shape=ArrowTriangleTip), Arrow(start=[-4, 1.5, 0], end=[2, 1.5, 0]), Arrow(start=[-4, 0.5, 0], end=[2, 0.5, 0], tip_shape=ArrowSquareTip), Arrow([-4, -0.5, 0], [2, -0.5, 0], tip_shape=ArrowSquareFilledTip), Arrow([-4, -1.5, 0], [2, -1.5, 0], tip_shape=ArrowCircleTip), Arrow([-4, -2.5, 0], [2, -2.5, 0], tip_shape=ArrowCircleFilledTip), Arrow([-4, -3.5, 0], [2, -3.5, 0], tip_shape=StealthTip) ] small_arrows = ( arrow.copy().scale(0.5, scale_tips=True).next_to(arrow, RIGHT) for arrow in big_arrows ) labels = ( Text(tip_names[i], font='monospace', font_size=20, color=BLUE).next_to(big_arrows[i], LEFT) for i in range(len(big_arrows)) ) self.add(*big_arrows, *small_arrows, *labels) """ def __init__(self, *args: Any, **kwargs: Any) -> None: raise NotImplementedError("Has to be implemented in inheriting subclasses.") @property def base(self) -> Point3D: r"""The base point of the arrow tip. This is the point connecting to the arrow line. Examples -------- :: >>> from manim import Arrow >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 0, 0]), buff=0) >>> arrow.tip.base.round(2) + 0. # add 0. to avoid negative 0 in output array([1.65, 0. , 0. ]) """ return self.point_from_proportion(0.5) @property def tip_point(self) -> Point3D: r"""The tip point of the arrow tip. Examples -------- :: >>> from manim import Arrow >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 0, 0]), buff=0) >>> arrow.tip.tip_point.round(2) + 0. array([2., 0., 0.]) """ # Type inference of extracting an element from a list, is not # supported by numpy, see this numpy issue # https://github.com/numpy/numpy/issues/16544 tip_point: Point3D = self.points[0] return tip_point @property def vector(self) -> Vector3D: r"""The vector pointing from the base point to the tip point. Examples -------- :: >>> from manim import Arrow >>> arrow = Arrow(np.array([0, 0, 0]), np.array([2, 2, 0]), buff=0) >>> arrow.tip.vector.round(2) + 0. array([0.25, 0.25, 0. ]) """ return self.tip_point - self.base @property def tip_angle(self) -> float: r"""The angle of the arrow tip. Examples -------- :: >>> from manim import Arrow >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 1, 0]), buff=0) >>> bool(round(arrow.tip.tip_angle, 5) == round(PI/4, 5)) True """ return angle_of_vector(self.vector) @property def length(self) -> float: r"""The length of the arrow tip. Examples -------- :: >>> from manim import Arrow >>> arrow = Arrow(np.array([0, 0, 0]), np.array([1, 2, 0])) >>> round(arrow.tip.length, 3) 0.35 """ return float(np.linalg.norm(self.vector)) class StealthTip(ArrowTip): r"""'Stealth' fighter / kite arrow shape. Naming is inspired by the corresponding `TikZ arrow shape `__. """ def __init__( self, fill_opacity: float = 1, stroke_width: float = 3, length: float = DEFAULT_ARROW_TIP_LENGTH / 2, start_angle: float = PI, **kwargs: Any, ): self.start_angle = start_angle VMobject.__init__( self, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs ) self.set_points_as_corners( np.array( [ [2, 0, 0], # tip [-1.2, 1.6, 0], [0, 0, 0], # base [-1.2, -1.6, 0], [2, 0, 0], # close path, back to tip ] ) ) self.scale(length / self.length) @property def length(self) -> float: """The length of the arrow tip. In this case, the length is computed as the height of the triangle encompassing the stealth tip (otherwise, the tip is scaled too large). """ return float(np.linalg.norm(self.vector) * 1.6) class ArrowTriangleTip(ArrowTip, Triangle): r"""Triangular arrow tip.""" def __init__( self, fill_opacity: float = 0, stroke_width: float = 3, length: float = DEFAULT_ARROW_TIP_LENGTH, width: float = DEFAULT_ARROW_TIP_LENGTH, start_angle: float = PI, **kwargs: Any, ) -> None: Triangle.__init__( self, fill_opacity=fill_opacity, stroke_width=stroke_width, start_angle=start_angle, **kwargs, ) self.width = width self.stretch_to_fit_width(length) self.stretch_to_fit_height(width) class ArrowTriangleFilledTip(ArrowTriangleTip): r"""Triangular arrow tip with filled tip. This is the default arrow tip shape. """ def __init__( self, fill_opacity: float = 1, stroke_width: float = 0, **kwargs: Any ) -> None: super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs) class ArrowCircleTip(ArrowTip, Circle): r"""Circular arrow tip.""" def __init__( self, fill_opacity: float = 0, stroke_width: float = 3, length: float = DEFAULT_ARROW_TIP_LENGTH, start_angle: float = PI, **kwargs: Any, ) -> None: self.start_angle = start_angle Circle.__init__( self, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs ) self.width = length self.stretch_to_fit_height(length) class ArrowCircleFilledTip(ArrowCircleTip): r"""Circular arrow tip with filled tip.""" def __init__( self, fill_opacity: float = 1, stroke_width: float = 0, **kwargs: Any ) -> None: super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs) class ArrowSquareTip(ArrowTip, Square): r"""Square arrow tip.""" def __init__( self, fill_opacity: float = 0, stroke_width: float = 3, length: float = DEFAULT_ARROW_TIP_LENGTH, start_angle: float = PI, **kwargs: Any, ) -> None: self.start_angle = start_angle Square.__init__( self, fill_opacity=fill_opacity, stroke_width=stroke_width, side_length=length, **kwargs, ) self.width = length self.stretch_to_fit_height(length) class ArrowSquareFilledTip(ArrowSquareTip): r"""Square arrow tip with filled tip.""" def __init__( self, fill_opacity: float = 1, stroke_width: float = 0, **kwargs: Any ) -> None: super().__init__(fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs) ManimCommunity-manim-1157b74/manim/mobject/graph.py000066400000000000000000001771111515024150700222420ustar00rootroot00000000000000"""Mobjects used to represent mathematical graphs (think graph theory, not plotting).""" from __future__ import annotations __all__ = [ "Graph", "DiGraph", ] import itertools as it from collections.abc import Hashable, Iterable, Sequence from copy import copy from typing import TYPE_CHECKING, Any, Literal, Protocol, cast import networkx as nx import numpy as np if TYPE_CHECKING: from typing import TypeAlias from manim.scene.scene import Scene from manim.typing import Point3D, Point3DLike NxGraph: TypeAlias = nx.classes.graph.Graph | nx.classes.digraph.DiGraph from manim.animation.composition import AnimationGroup from manim.animation.creation import Create, Uncreate from manim.mobject.geometry.arc import Dot, LabeledDot from manim.mobject.geometry.line import Line from manim.mobject.mobject import Mobject, override_animate from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.text.tex_mobject import MathTex from manim.mobject.types.vectorized_mobject import VMobject from manim.utils.color import BLACK class LayoutFunction(Protocol): """A protocol for automatic layout functions that compute a layout for a graph to be used in :meth:`~.Graph.change_layout`. .. note:: The layout function must be a pure function, i.e., it must not modify the graph passed to it. Examples -------- Here is an example that arranges nodes in an n x m grid in sorted order. .. manim:: CustomLayoutExample :save_last_frame: class CustomLayoutExample(Scene): def construct(self): import numpy as np import networkx as nx # create custom layout def custom_layout( graph: nx.Graph, scale: float | tuple[float, float, float] = 2, n: int | None = None, *args: Any, **kwargs: Any, ): nodes = sorted(list(graph)) height = len(nodes) // n return { node: (scale * np.array([ (i % n) - (n-1)/2, -(i // n) + height/2, 0 ])) for i, node in enumerate(graph) } # draw graph n = 4 graph = Graph( [i for i in range(4 * 2 - 1)], [(0, 1), (0, 4), (1, 2), (1, 5), (2, 3), (2, 6), (4, 5), (5, 6)], labels=True, layout=custom_layout, layout_config={'n': n} ) self.add(graph) Several automatic layouts are provided by manim, and can be used by passing their name as the ``layout`` parameter to :meth:`~.Graph.change_layout`. Alternatively, a custom layout function can be passed to :meth:`~.Graph.change_layout` as the ``layout`` parameter. Such a function must adhere to the :class:`~.LayoutFunction` protocol. The :class:`~.LayoutFunction` s provided by manim are illustrated below: - Circular Layout: places the vertices on a circle .. manim:: CircularLayout :save_last_frame: class CircularLayout(Scene): def construct(self): graph = Graph( [1, 2, 3, 4, 5, 6], [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], layout="circular", labels=True ) self.add(graph) - Kamada Kawai Layout: tries to place the vertices such that the given distances between them are respected .. manim:: KamadaKawaiLayout :save_last_frame: class KamadaKawaiLayout(Scene): def construct(self): from collections import defaultdict distances: dict[int, dict[int, float]] = defaultdict(dict) # set desired distances distances[1][2] = 1 # distance between vertices 1 and 2 is 1 distances[2][3] = 1 # distance between vertices 2 and 3 is 1 distances[3][4] = 2 # etc distances[4][5] = 3 distances[5][6] = 5 distances[6][1] = 8 graph = Graph( [1, 2, 3, 4, 5, 6], [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1)], layout="kamada_kawai", layout_config={"dist": distances}, layout_scale=4, labels=True ) self.add(graph) - Partite Layout: places vertices into distinct partitions .. manim:: PartiteLayout :save_last_frame: class PartiteLayout(Scene): def construct(self): graph = Graph( [1, 2, 3, 4, 5, 6], [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], layout="partite", layout_config={"partitions": [[1,2],[3,4],[5,6]]}, labels=True ) self.add(graph) - Planar Layout: places vertices such that edges do not cross .. manim:: PlanarLayout :save_last_frame: class PlanarLayout(Scene): def construct(self): graph = Graph( [1, 2, 3, 4, 5, 6], [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], layout="planar", layout_scale=4, labels=True ) self.add(graph) - Random Layout: randomly places vertices .. manim:: RandomLayout :save_last_frame: class RandomLayout(Scene): def construct(self): graph = Graph( [1, 2, 3, 4, 5, 6], [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], layout="random", labels=True ) self.add(graph) - Shell Layout: places vertices in concentric circles .. manim:: ShellLayout :save_last_frame: class ShellLayout(Scene): def construct(self): nlist = [[1, 2, 3], [4, 5, 6, 7, 8, 9]] graph = Graph( [1, 2, 3, 4, 5, 6, 7, 8, 9], [(1, 2), (2, 3), (3, 1), (4, 1), (4, 2), (5, 2), (6, 2), (6, 3), (7, 3), (8, 3), (8, 1), (9, 1)], layout="shell", layout_config={"nlist": nlist}, labels=True ) self.add(graph) - Spectral Layout: places vertices using the eigenvectors of the graph Laplacian (clusters nodes which are an approximation of the ratio cut) .. manim:: SpectralLayout :save_last_frame: class SpectralLayout(Scene): def construct(self): graph = Graph( [1, 2, 3, 4, 5, 6], [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], layout="spectral", labels=True ) self.add(graph) - Sprial Layout: places vertices in a spiraling pattern .. manim:: SpiralLayout :save_last_frame: class SpiralLayout(Scene): def construct(self): graph = Graph( [1, 2, 3, 4, 5, 6], [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], layout="spiral", labels=True ) self.add(graph) - Spring Layout: places nodes according to the Fruchterman-Reingold force-directed algorithm (attempts to minimize edge length while maximizing node separation) .. manim:: SpringLayout :save_last_frame: class SpringLayout(Scene): def construct(self): graph = Graph( [1, 2, 3, 4, 5, 6], [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 1), (5, 1), (1, 3), (3, 5)], layout="spring", labels=True ) self.add(graph) - Tree Layout: places vertices into a tree with a root node and branches (can only be used with legal trees) .. manim:: TreeLayout :save_last_frame: class TreeLayout(Scene): def construct(self): graph = Graph( [1, 2, 3, 4, 5, 6, 7], [(1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (3, 7)], layout="tree", layout_config={"root_vertex": 1}, labels=True ) self.add(graph) """ def __call__( self, graph: NxGraph, scale: float | tuple[float, float, float] = 2, *args: Any, **kwargs: Any, ) -> dict[Hashable, Point3D]: """Given a graph and a scale, return a dictionary of coordinates. Parameters ---------- graph The underlying NetworkX graph to be laid out. DO NOT MODIFY. scale Either a single float value, or a tuple of three float values specifying the scale along each axis. Returns ------- dict[Hashable, Point3D] A dictionary mapping vertices to their positions. """ ... def _partite_layout( nx_graph: NxGraph, scale: float = 2, partitions: Sequence[Sequence[Hashable]] | None = None, **kwargs: Any, ) -> dict[Hashable, Point3D]: if partitions is None or len(partitions) == 0: raise ValueError( "The partite layout requires partitions parameter to contain the partition of the vertices", ) partition_count = len(partitions) for i in range(partition_count): for v in partitions[i]: if nx_graph.nodes[v] is None: raise ValueError( "The partition must contain arrays of vertices in the graph", ) nx_graph.nodes[v]["subset"] = i # Add missing vertices to their own side for v in nx_graph.nodes: if "subset" not in nx_graph.nodes[v]: nx_graph.nodes[v]["subset"] = partition_count return nx.layout.multipartite_layout(nx_graph, scale=scale, **kwargs) def _random_layout(nx_graph: NxGraph, scale: float = 2, **kwargs: Any): # the random layout places coordinates in [0, 1) # we need to rescale manually afterwards... auto_layout = nx.layout.random_layout(nx_graph, **kwargs) for k, v in auto_layout.items(): auto_layout[k] = 2 * scale * (v - np.array([0.5, 0.5])) return {k: np.append(v, [0]) for k, v in auto_layout.items()} def _tree_layout( T: NxGraph, root_vertex: Hashable | None = None, scale: float | tuple | None = 2, vertex_spacing: tuple | None = None, orientation: str = "down", ): if root_vertex is None: raise ValueError("The tree layout requires the root_vertex parameter") if not nx.is_tree(T): raise ValueError("The tree layout must be used with trees") children = {root_vertex: list(T.neighbors(root_vertex))} # The following code is SageMath's tree layout implementation, taken from # https://github.com/sagemath/sage/blob/cc60cfebc4576fed8b01f0fc487271bdee3cefed/src/sage/graphs/graph_plot.py#L1447 # Always make a copy of the children because they get eaten stack = [list(children[root_vertex]).copy()] stick = [root_vertex] parent = dict.fromkeys(children[root_vertex], root_vertex) pos = {} obstruction = [0.0] * len(T) o = -1 if orientation == "down" else 1 def slide(v, dx): """ Shift the vertex v and its descendants to the right by dx. Precondition: v and its descendents have already had their positions computed. """ level = [v] while level: nextlevel = [] for u in level: x, y = pos[u] x += dx obstruction[y] = max(x + 1, obstruction[y]) pos[u] = x, y nextlevel += children[u] level = nextlevel while stack: C = stack[-1] if not C: p = stick.pop() stack.pop() cp = children[p] y = o * len(stack) if not cp: x = obstruction[y] pos[p] = x, y else: x = sum(pos[c][0] for c in cp) / float(len(cp)) pos[p] = x, y ox = obstruction[y] if x < ox: slide(p, ox - x) x = ox obstruction[y] = x + 1 continue t = C.pop() pt = parent[t] ct = [u for u in list(T.neighbors(t)) if u != pt] for c in ct: parent[c] = t children[t] = copy(ct) stack.append(ct) stick.append(t) # the resulting layout is then rescaled again to fit on Manim's canvas x_min = min(pos.values(), key=lambda t: t[0])[0] x_max = max(pos.values(), key=lambda t: t[0])[0] y_min = min(pos.values(), key=lambda t: t[1])[1] y_max = max(pos.values(), key=lambda t: t[1])[1] center = np.array([x_min + x_max, y_min + y_max, 0]) / 2 height = y_max - y_min width = x_max - x_min if vertex_spacing is None: if isinstance(scale, (float, int)) and (width > 0 or height > 0): sf = 2 * scale / max(width, height) elif isinstance(scale, tuple): sw = 2 * scale[0] / width if scale[0] is not None and width > 0 else 1 sh = 2 * scale[1] / height if scale[1] is not None and height > 0 else 1 sf = np.array([sw, sh, 0]) else: sf = 1 else: sx, sy = vertex_spacing sf = np.array([sx, sy, 0]) return {v: (np.array([x, y, 0]) - center) * sf for v, (x, y) in pos.items()} LayoutName = Literal[ "circular", "kamada_kawai", "partite", "planar", "random", "shell", "spectral", "spiral", "spring", "tree", ] _layouts: dict[LayoutName, LayoutFunction] = { "circular": cast(LayoutFunction, nx.layout.circular_layout), "kamada_kawai": cast(LayoutFunction, nx.layout.kamada_kawai_layout), "partite": cast(LayoutFunction, _partite_layout), "planar": cast(LayoutFunction, nx.layout.planar_layout), "random": cast(LayoutFunction, _random_layout), "shell": cast(LayoutFunction, nx.layout.shell_layout), "spectral": cast(LayoutFunction, nx.layout.spectral_layout), "spiral": cast(LayoutFunction, nx.layout.spiral_layout), "spring": cast(LayoutFunction, nx.layout.spring_layout), "tree": cast(LayoutFunction, _tree_layout), } def _determine_graph_layout( nx_graph: nx.classes.graph.Graph | nx.classes.digraph.DiGraph, layout: LayoutName | dict[Hashable, Point3DLike] | LayoutFunction = "spring", layout_scale: float | tuple[float, float, float] = 2, layout_config: dict[str, Any] | None = None, ) -> dict[Hashable, Point3DLike]: if layout_config is None: layout_config = {} if isinstance(layout, dict): return layout elif layout in _layouts: auto_layout = _layouts[layout](nx_graph, scale=layout_scale, **layout_config) # NetworkX returns a dictionary of 3D points if the dimension # is specified to be 3. Otherwise, it returns a dictionary of # 2D points, so adjusting is required. if ( layout_config.get("dim") == 3 or auto_layout[next(auto_layout.__iter__())].shape[0] == 3 ): return auto_layout else: return {k: np.append(v, [0]) for k, v in auto_layout.items()} else: try: return cast(LayoutFunction, layout)( nx_graph, scale=layout_scale, **layout_config ) except TypeError as e: raise ValueError( f"The layout '{layout}' is neither a recognized layout, a layout function," "nor a vertex placement dictionary.", ) from e class GenericGraph(VMobject, metaclass=ConvertToOpenGL): """Abstract base class for graphs (that is, a collection of vertices connected with edges). Graphs can be instantiated by passing both a list of (distinct, hashable) vertex names, together with list of edges (as tuples of vertex names). See the examples for concrete implementations of this class for details. .. note:: This implementation uses updaters to make the edges move with the vertices. See also -------- :class:`.Graph` :class:`.DiGraph` Parameters ---------- vertices A list of vertices. Must be hashable elements. edges A list of edges, specified as tuples ``(u, v)`` where both ``u`` and ``v`` are vertices. labels Controls whether or not vertices are labeled. If ``False`` (the default), the vertices are not labeled; if ``True`` they are labeled using their names (as specified in ``vertices``) via :class:`~.MathTex`. Alternatively, custom labels can be specified by passing a dictionary whose keys are the vertices, and whose values are the corresponding vertex labels (rendered via, e.g., :class:`~.Text` or :class:`~.Tex`). label_fill_color Sets the fill color of the default labels generated when ``labels`` is set to ``True``. Has no effect for other values of ``labels``. layout Either one of ``"spring"`` (the default), ``"circular"``, ``"kamada_kawai"``, ``"planar"``, ``"random"``, ``"shell"``, ``"spectral"``, ``"spiral"``, ``"tree"``, and ``"partite"`` for automatic vertex positioning primarily using ``networkx`` (see `their documentation `_ for more details), a dictionary specifying a coordinate (value) for each vertex (key) for manual positioning, or a .:class:`~.LayoutFunction` with a user-defined automatic layout. layout_config Only for automatic layouts. A dictionary whose entries are passed as keyword arguments to the named layout or automatic layout function specified via ``layout``. The ``tree`` layout also accepts a special parameter ``vertex_spacing`` passed as a keyword argument inside the ``layout_config`` dictionary. Passing a tuple ``(space_x, space_y)`` as this argument overrides the value of ``layout_scale`` and ensures that vertices are arranged in a way such that the centers of siblings in the same layer are at least ``space_x`` units apart horizontally, and neighboring layers are spaced ``space_y`` units vertically. layout_scale The scale of automatically generated layouts: the vertices will be arranged such that the coordinates are located within the interval ``[-scale, scale]``. Some layouts accept a tuple ``(scale_x, scale_y)`` causing the first coordinate to be in the interval ``[-scale_x, scale_x]``, and the second in ``[-scale_y, scale_y]``. Default: 2. vertex_type The mobject class used for displaying vertices in the scene. vertex_config Either a dictionary containing keyword arguments to be passed to the class specified via ``vertex_type``, or a dictionary whose keys are the vertices, and whose values are dictionaries containing keyword arguments for the mobject related to the corresponding vertex. vertex_mobjects A dictionary whose keys are the vertices, and whose values are mobjects to be used as vertices. Passing vertices here overrides all other configuration options for a vertex. edge_type The mobject class used for displaying edges in the scene. Must be a subclass of :class:`~.Line` for default updaters to work. edge_config Either a dictionary containing keyword arguments to be passed to the class specified via ``edge_type``, or a dictionary whose keys are the edges, and whose values are dictionaries containing keyword arguments for the mobject related to the corresponding edge. """ def __init__( self, vertices: Sequence[Hashable], edges: Sequence[tuple[Hashable, Hashable]], labels: bool | dict = False, label_fill_color: str = BLACK, layout: LayoutName | dict[Hashable, Point3DLike] | LayoutFunction = "spring", layout_scale: float | tuple[float, float, float] = 2, layout_config: dict | None = None, vertex_type: type[Mobject] = Dot, vertex_config: dict | None = None, vertex_mobjects: dict | None = None, edge_type: type[Mobject] = Line, partitions: Sequence[Sequence[Hashable]] | None = None, root_vertex: Hashable | None = None, edge_config: dict | None = None, ) -> None: super().__init__() nx_graph = self._empty_networkx_graph() nx_graph.add_nodes_from(vertices) nx_graph.add_edges_from(edges) self._graph = nx_graph if isinstance(labels, dict): self._labels = labels elif isinstance(labels, bool): if labels: self._labels = {v: MathTex(v, color=label_fill_color) for v in vertices} else: self._labels = {} if self._labels and vertex_type is Dot: vertex_type = LabeledDot if vertex_mobjects is None: vertex_mobjects = {} # build vertex_config if vertex_config is None: vertex_config = {} default_vertex_config = {} if vertex_config: default_vertex_config = { k: v for k, v in vertex_config.items() if k not in vertices } self._vertex_config = { v: vertex_config.get(v, copy(default_vertex_config)) for v in vertices } self.default_vertex_config = default_vertex_config for v, label in self._labels.items(): self._vertex_config[v]["label"] = label self.vertices = {v: vertex_type(**self._vertex_config[v]) for v in vertices} self.vertices.update(vertex_mobjects) self.change_layout( layout=layout, layout_scale=layout_scale, layout_config=layout_config, partitions=partitions, root_vertex=root_vertex, ) # build edge_config if edge_config is None: edge_config = {} default_tip_config = {} default_edge_config = {} if edge_config: default_tip_config = edge_config.pop("tip_config", {}) default_edge_config = { k: v for k, v in edge_config.items() if not isinstance( k, tuple ) # everything that is not an edge is an option } self._edge_config = {} self._tip_config = {} for e in edges: if e in edge_config: self._tip_config[e] = edge_config[e].pop( "tip_config", copy(default_tip_config) ) self._edge_config[e] = edge_config[e] else: self._tip_config[e] = copy(default_tip_config) self._edge_config[e] = copy(default_edge_config) self.default_edge_config = default_edge_config self._populate_edge_dict(edges, edge_type) self.add(*self.vertices.values()) self.add(*self.edges.values()) self.add_updater(self.update_edges) @staticmethod def _empty_networkx_graph() -> nx.classes.graph.Graph: """Return an empty networkx graph for the given graph type.""" raise NotImplementedError("To be implemented in concrete subclasses") def _populate_edge_dict( self, edges: list[tuple[Hashable, Hashable]], edge_type: type[Mobject] ): """Helper method for populating the edges of the graph.""" raise NotImplementedError("To be implemented in concrete subclasses") def __getitem__(self: Graph, v: Hashable) -> Mobject: return self.vertices[v] def _create_vertex( self, vertex: Hashable, position: Point3DLike | None = None, label: bool = False, label_fill_color: str = BLACK, vertex_type: type[Mobject] = Dot, vertex_config: dict | None = None, vertex_mobject: dict | None = None, ) -> tuple[Hashable, Point3D, dict, Mobject]: np_position: Point3D = ( self.get_center() if position is None else np.asarray(position) ) if vertex_config is None: vertex_config = {} if vertex in self.vertices: raise ValueError( f"Vertex identifier '{vertex}' is already used for a vertex in this graph.", ) if label is True: label = MathTex(vertex, color=label_fill_color) elif vertex in self._labels: label = self._labels[vertex] elif not isinstance(label, (Mobject, OpenGLMobject)): label = None base_vertex_config = copy(self.default_vertex_config) base_vertex_config.update(vertex_config) vertex_config = base_vertex_config if label is not None: vertex_config["label"] = label if vertex_type is Dot: vertex_type = LabeledDot if vertex_mobject is None: vertex_mobject = vertex_type(**vertex_config) vertex_mobject.move_to(np_position) return (vertex, np_position, vertex_config, vertex_mobject) def _add_created_vertex( self, vertex: Hashable, position: Point3DLike, vertex_config: dict, vertex_mobject: Mobject, ) -> Mobject: if vertex in self.vertices: raise ValueError( f"Vertex identifier '{vertex}' is already used for a vertex in this graph.", ) self._graph.add_node(vertex) self._layout[vertex] = position if "label" in vertex_config: self._labels[vertex] = vertex_config["label"] self._vertex_config[vertex] = vertex_config self.vertices[vertex] = vertex_mobject self.vertices[vertex].move_to(position) self.add(self.vertices[vertex]) return self.vertices[vertex] def _add_vertex( self, vertex: Hashable, position: Point3DLike | None = None, label: bool = False, label_fill_color: str = BLACK, vertex_type: type[Mobject] = Dot, vertex_config: dict | None = None, vertex_mobject: dict | None = None, ) -> Mobject: """Add a vertex to the graph. Parameters ---------- vertex A hashable vertex identifier. position The coordinates where the new vertex should be added. If ``None``, the center of the graph is used. label Controls whether or not the vertex is labeled. If ``False`` (the default), the vertex is not labeled; if ``True`` it is labeled using its names (as specified in ``vertex``) via :class:`~.MathTex`. Alternatively, any :class:`~.Mobject` can be passed to be used as the label. label_fill_color Sets the fill color of the default labels generated when ``labels`` is set to ``True``. Has no effect for other values of ``label``. vertex_type The mobject class used for displaying vertices in the scene. vertex_config A dictionary containing keyword arguments to be passed to the class specified via ``vertex_type``. vertex_mobject The mobject to be used as the vertex. Overrides all other vertex customization options. """ return self._add_created_vertex( *self._create_vertex( vertex=vertex, position=position, label=label, label_fill_color=label_fill_color, vertex_type=vertex_type, vertex_config=vertex_config, vertex_mobject=vertex_mobject, ) ) def _create_vertices( self: Graph, *vertices: Hashable, positions: dict | None = None, labels: bool = False, label_fill_color: str = BLACK, vertex_type: type[Mobject] = Dot, vertex_config: dict | None = None, vertex_mobjects: dict | None = None, ) -> Iterable[tuple[Hashable, Point3D, dict, Mobject]]: if positions is None: positions = {} if vertex_mobjects is None: vertex_mobjects = {} graph_center = self.get_center() base_positions = dict.fromkeys(vertices, graph_center) base_positions.update(positions) positions = base_positions if isinstance(labels, bool): labels = dict.fromkeys(vertices, labels) else: assert isinstance(labels, dict) base_labels = dict.fromkeys(vertices, False) base_labels.update(labels) labels = base_labels if vertex_config is None: vertex_config = copy(self.default_vertex_config) assert isinstance(vertex_config, dict) base_vertex_config = copy(self.default_vertex_config) base_vertex_config.update( {key: val for key, val in vertex_config.items() if key not in vertices}, ) vertex_config = { v: (vertex_config[v] if v in vertex_config else copy(base_vertex_config)) for v in vertices } return [ self._create_vertex( v, position=positions[v], label=labels[v], label_fill_color=label_fill_color, vertex_type=vertex_type, vertex_config=vertex_config[v], vertex_mobject=vertex_mobjects.get(v), ) for v in vertices ] def add_vertices( self: Graph, *vertices: Hashable, positions: dict | None = None, labels: bool = False, label_fill_color: str = BLACK, vertex_type: type[Mobject] = Dot, vertex_config: dict | None = None, vertex_mobjects: dict | None = None, ): """Add a list of vertices to the graph. Parameters ---------- vertices Hashable vertex identifiers. positions A dictionary specifying the coordinates where the new vertices should be added. If ``None``, all vertices are created at the center of the graph. labels Controls whether or not the vertex is labeled. If ``False`` (the default), the vertex is not labeled; if ``True`` it is labeled using its names (as specified in ``vertex``) via :class:`~.MathTex`. Alternatively, any :class:`~.Mobject` can be passed to be used as the label. label_fill_color Sets the fill color of the default labels generated when ``labels`` is set to ``True``. Has no effect for other values of ``labels``. vertex_type The mobject class used for displaying vertices in the scene. vertex_config A dictionary containing keyword arguments to be passed to the class specified via ``vertex_type``. vertex_mobjects A dictionary whose keys are the vertex identifiers, and whose values are mobjects that should be used as vertices. Overrides all other vertex customization options. """ return [ self._add_created_vertex(*v) for v in self._create_vertices( *vertices, positions=positions, labels=labels, label_fill_color=label_fill_color, vertex_type=vertex_type, vertex_config=vertex_config, vertex_mobjects=vertex_mobjects, ) ] @override_animate(add_vertices) def _add_vertices_animation(self, *args, anim_args=None, **kwargs): if anim_args is None: anim_args = {} animation = anim_args.pop("animation", Create) vertex_mobjects = self._create_vertices(*args, **kwargs) def on_finish(scene: Scene): for v in vertex_mobjects: scene.remove(v[-1]) self._add_created_vertex(*v) return AnimationGroup( *(animation(v[-1], **anim_args) for v in vertex_mobjects), group=self, _on_finish=on_finish, ) def _remove_vertex(self, vertex): """Remove a vertex (as well as all incident edges) from the graph. Parameters ---------- vertex The identifier of a vertex to be removed. Returns ------- Group A mobject containing all removed objects. """ if vertex not in self.vertices: raise ValueError( f"The graph does not contain a vertex with identifier '{vertex}'", ) self._graph.remove_node(vertex) self._layout.pop(vertex) if vertex in self._labels: self._labels.pop(vertex) self._vertex_config.pop(vertex) edge_tuples = [e for e in self.edges if vertex in e] for e in edge_tuples: self._edge_config.pop(e) to_remove = [self.edges.pop(e) for e in edge_tuples] to_remove.append(self.vertices.pop(vertex)) self.remove(*to_remove) return self.get_group_class()(*to_remove) def remove_vertices(self, *vertices): """Remove several vertices from the graph. Parameters ---------- vertices Vertices to be removed from the graph. Examples -------- :: >>> G = Graph([1, 2, 3], [(1, 2), (2, 3)]) >>> removed = G.remove_vertices(2, 3); removed VGroup(Line, Line, Dot, Dot) >>> G Undirected graph on 1 vertices and 0 edges """ mobjects = [] for v in vertices: mobjects.extend(self._remove_vertex(v).submobjects) return self.get_group_class()(*mobjects) @override_animate(remove_vertices) def _remove_vertices_animation(self, *vertices, anim_args=None): if anim_args is None: anim_args = {} animation = anim_args.pop("animation", Uncreate) mobjects = self.remove_vertices(*vertices) return AnimationGroup( *(animation(mobj, **anim_args) for mobj in mobjects), group=self ) def _add_edge( self, edge: tuple[Hashable, Hashable], edge_type: type[Mobject] = Line, edge_config: dict | None = None, ): """Add a new edge to the graph. Parameters ---------- edge The edge (as a tuple of vertex identifiers) to be added. If a non-existing vertex is passed, a new vertex with default settings will be created. Create new vertices yourself beforehand to customize them. edge_type The mobject class used for displaying edges in the scene. edge_config A dictionary containing keyword arguments to be passed to the class specified via ``edge_type``. Returns ------- Group A group containing all newly added vertices and edges. """ if edge_config is None: edge_config = self.default_edge_config.copy() added_mobjects = [self._add_vertex(v) for v in edge if v not in self.vertices] u, v = edge self._graph.add_edge(u, v) base_edge_config = self.default_edge_config.copy() base_edge_config.update(edge_config) edge_config = base_edge_config self._edge_config[(u, v)] = edge_config edge_mobject = edge_type( start=self[u].get_center(), end=self[v].get_center(), z_index=-1, **edge_config, ) self.edges[(u, v)] = edge_mobject self.add(edge_mobject) added_mobjects.append(edge_mobject) return self.get_group_class()(*added_mobjects) def add_edges( self, *edges: tuple[Hashable, Hashable], edge_type: type[Mobject] = Line, edge_config: dict | None = None, **kwargs, ): """Add new edges to the graph. Parameters ---------- edges Edges (as tuples of vertex identifiers) to be added. If a non-existing vertex is passed, a new vertex with default settings will be created. Create new vertices yourself beforehand to customize them. edge_type The mobject class used for displaying edges in the scene. edge_config A dictionary either containing keyword arguments to be passed to the class specified via ``edge_type``, or a dictionary whose keys are the edge tuples, and whose values are dictionaries containing keyword arguments to be passed for the construction of the corresponding edge. kwargs Any further keyword arguments are passed to :meth:`.add_vertices` which is used to create new vertices in the passed edges. Returns ------- Group A group containing all newly added vertices and edges. """ if edge_config is None: edge_config = {} non_edge_settings = {k: v for (k, v) in edge_config.items() if k not in edges} base_edge_config = self.default_edge_config.copy() base_edge_config.update(non_edge_settings) base_edge_config = {e: base_edge_config.copy() for e in edges} for e in edges: base_edge_config[e].update(edge_config.get(e, {})) edge_config = base_edge_config edge_vertices = set(it.chain(*edges)) new_vertices = [v for v in edge_vertices if v not in self.vertices] added_vertices = self.add_vertices(*new_vertices, **kwargs) added_mobjects = sum( ( self._add_edge( edge, edge_type=edge_type, edge_config=edge_config[edge], ).submobjects for edge in edges ), added_vertices, ) return self.get_group_class()(*added_mobjects) @override_animate(add_edges) def _add_edges_animation(self, *args, anim_args=None, **kwargs): if anim_args is None: anim_args = {} animation = anim_args.pop("animation", Create) mobjects = self.add_edges(*args, **kwargs) return AnimationGroup( *(animation(mobj, **anim_args) for mobj in mobjects), group=self ) def _remove_edge(self, edge: tuple[Hashable]): """Remove an edge from the graph. Parameters ---------- edge The edge (i.e., a tuple of vertex identifiers) to be removed from the graph. Returns ------- Mobject The removed edge. """ if edge not in self.edges: raise ValueError(f"The graph does not contain a edge '{edge}'") edge_mobject = self.edges.pop(edge) self._graph.remove_edge(*edge) self._edge_config.pop(edge, None) self.remove(edge_mobject) return edge_mobject def remove_edges(self, *edges: tuple[Hashable]): """Remove several edges from the graph. Parameters ---------- edges Edges to be removed from the graph. Returns ------- Group A group containing all removed edges. """ edge_mobjects = [self._remove_edge(edge) for edge in edges] return self.get_group_class()(*edge_mobjects) @override_animate(remove_edges) def _remove_edges_animation(self, *edges, anim_args=None): if anim_args is None: anim_args = {} animation = anim_args.pop("animation", Uncreate) mobjects = self.remove_edges(*edges) return AnimationGroup(*(animation(mobj, **anim_args) for mobj in mobjects)) @classmethod def from_networkx( cls, nxgraph: nx.classes.graph.Graph | nx.classes.digraph.DiGraph, **kwargs ): """Build a :class:`~.Graph` or :class:`~.DiGraph` from a given ``networkx`` graph. Parameters ---------- nxgraph A ``networkx`` graph or digraph. **kwargs Keywords to be passed to the constructor of :class:`~.Graph`. Examples -------- .. manim:: ImportNetworkxGraph import networkx as nx nxgraph = nx.erdos_renyi_graph(14, 0.5) class ImportNetworkxGraph(Scene): def construct(self): G = Graph.from_networkx(nxgraph, layout="spring", layout_scale=3.5) self.play(Create(G)) self.play(*[G[v].animate.move_to(5*RIGHT*np.cos(ind/7 * PI) + 3*UP*np.sin(ind/7 * PI)) for ind, v in enumerate(G.vertices)]) self.play(Uncreate(G)) """ return cls(list(nxgraph.nodes), list(nxgraph.edges), **kwargs) def change_layout( self, layout: LayoutName | dict[Hashable, Point3DLike] | LayoutFunction = "spring", layout_scale: float | tuple[float, float, float] = 2, layout_config: dict[str, Any] | None = None, partitions: list[list[Hashable]] | None = None, root_vertex: Hashable | None = None, ) -> Graph: """Change the layout of this graph. See the documentation of :class:`~.Graph` for details about the keyword arguments. Examples -------- .. manim:: ChangeGraphLayout class ChangeGraphLayout(Scene): def construct(self): G = Graph([1, 2, 3, 4, 5], [(1, 2), (2, 3), (3, 4), (4, 5)], layout={1: [-2, 0, 0], 2: [-1, 0, 0], 3: [0, 0, 0], 4: [1, 0, 0], 5: [2, 0, 0]} ) self.play(Create(G)) self.play(G.animate.change_layout("circular")) self.wait() """ layout_config = {} if layout_config is None else layout_config if partitions is not None and "partitions" not in layout_config: layout_config["partitions"] = partitions if root_vertex is not None and "root_vertex" not in layout_config: layout_config["root_vertex"] = root_vertex self._layout = _determine_graph_layout( self._graph, layout=layout, layout_scale=layout_scale, layout_config=layout_config, ) for v in self.vertices: self[v].move_to(self._layout[v]) return self class Graph(GenericGraph): """An undirected graph (vertices connected with edges). The graph comes with an updater which makes the edges stick to the vertices when moved around. See :class:`.DiGraph` for a version with directed edges. See also -------- :class:`.GenericGraph` Parameters ---------- vertices A list of vertices. Must be hashable elements. edges A list of edges, specified as tuples ``(u, v)`` where both ``u`` and ``v`` are vertices. The vertex order is irrelevant. labels Controls whether or not vertices are labeled. If ``False`` (the default), the vertices are not labeled; if ``True`` they are labeled using their names (as specified in ``vertices``) via :class:`~.MathTex`. Alternatively, custom labels can be specified by passing a dictionary whose keys are the vertices, and whose values are the corresponding vertex labels (rendered via, e.g., :class:`~.Text` or :class:`~.Tex`). label_fill_color Sets the fill color of the default labels generated when ``labels`` is set to ``True``. Has no effect for other values of ``labels``. layout Either one of ``"spring"`` (the default), ``"circular"``, ``"kamada_kawai"``, ``"planar"``, ``"random"``, ``"shell"``, ``"spectral"``, ``"spiral"``, ``"tree"``, and ``"partite"`` for automatic vertex positioning using ``networkx`` (see `their documentation `_ for more details), or a dictionary specifying a coordinate (value) for each vertex (key) for manual positioning. layout_config Only for automatically generated layouts. A dictionary whose entries are passed as keyword arguments to the automatic layout algorithm specified via ``layout`` of ``networkx``. The ``tree`` layout also accepts a special parameter ``vertex_spacing`` passed as a keyword argument inside the ``layout_config`` dictionary. Passing a tuple ``(space_x, space_y)`` as this argument overrides the value of ``layout_scale`` and ensures that vertices are arranged in a way such that the centers of siblings in the same layer are at least ``space_x`` units apart horizontally, and neighboring layers are spaced ``space_y`` units vertically. layout_scale The scale of automatically generated layouts: the vertices will be arranged such that the coordinates are located within the interval ``[-scale, scale]``. Some layouts accept a tuple ``(scale_x, scale_y)`` causing the first coordinate to be in the interval ``[-scale_x, scale_x]``, and the second in ``[-scale_y, scale_y]``. Default: 2. vertex_type The mobject class used for displaying vertices in the scene. vertex_config Either a dictionary containing keyword arguments to be passed to the class specified via ``vertex_type``, or a dictionary whose keys are the vertices, and whose values are dictionaries containing keyword arguments for the mobject related to the corresponding vertex. vertex_mobjects A dictionary whose keys are the vertices, and whose values are mobjects to be used as vertices. Passing vertices here overrides all other configuration options for a vertex. edge_type The mobject class used for displaying edges in the scene. edge_config Either a dictionary containing keyword arguments to be passed to the class specified via ``edge_type``, or a dictionary whose keys are the edges, and whose values are dictionaries containing keyword arguments for the mobject related to the corresponding edge. Examples -------- First, we create a small graph and demonstrate that the edges move together with the vertices. .. manim:: MovingVertices class MovingVertices(Scene): def construct(self): vertices = [1, 2, 3, 4] edges = [(1, 2), (2, 3), (3, 4), (1, 3), (1, 4)] g = Graph(vertices, edges) self.play(Create(g)) self.wait() self.play(g[1].animate.move_to([1, 1, 0]), g[2].animate.move_to([-1, 1, 0]), g[3].animate.move_to([1, -1, 0]), g[4].animate.move_to([-1, -1, 0])) self.wait() There are several automatic positioning algorithms to choose from: .. manim:: GraphAutoPosition :save_last_frame: class GraphAutoPosition(Scene): def construct(self): vertices = [1, 2, 3, 4, 5, 6, 7, 8] edges = [(1, 7), (1, 8), (2, 3), (2, 4), (2, 5), (2, 8), (3, 4), (6, 1), (6, 2), (6, 3), (7, 2), (7, 4)] autolayouts = ["spring", "circular", "kamada_kawai", "planar", "random", "shell", "spectral", "spiral"] graphs = [Graph(vertices, edges, layout=lt).scale(0.5) for lt in autolayouts] r1 = VGroup(*graphs[:3]).arrange() r2 = VGroup(*graphs[3:6]).arrange() r3 = VGroup(*graphs[6:]).arrange() self.add(VGroup(r1, r2, r3).arrange(direction=DOWN)) Vertices can also be positioned manually: .. manim:: GraphManualPosition :save_last_frame: class GraphManualPosition(Scene): def construct(self): vertices = [1, 2, 3, 4] edges = [(1, 2), (2, 3), (3, 4), (4, 1)] lt = {1: [0, 0, 0], 2: [1, 1, 0], 3: [1, -1, 0], 4: [-1, 0, 0]} G = Graph(vertices, edges, layout=lt) self.add(G) The vertices in graphs can be labeled, and configurations for vertices and edges can be modified both by default and for specific vertices and edges. .. note:: In ``edge_config``, edges can be passed in both directions: if ``(u, v)`` is an edge in the graph, both ``(u, v)`` as well as ``(v, u)`` can be used as keys in the dictionary. .. manim:: LabeledModifiedGraph :save_last_frame: class LabeledModifiedGraph(Scene): def construct(self): vertices = [1, 2, 3, 4, 5, 6, 7, 8] edges = [(1, 7), (1, 8), (2, 3), (2, 4), (2, 5), (2, 8), (3, 4), (6, 1), (6, 2), (6, 3), (7, 2), (7, 4)] g = Graph(vertices, edges, layout="circular", layout_scale=3, labels=True, vertex_config={7: {"fill_color": RED}}, edge_config={(1, 7): {"stroke_color": RED}, (2, 7): {"stroke_color": RED}, (4, 7): {"stroke_color": RED}}) self.add(g) You can also lay out a partite graph on columns by specifying a list of the vertices on each side and choosing the partite layout. .. note:: All vertices in your graph which are not listed in any of the partitions are collected in their own partition and rendered in the rightmost column. .. manim:: PartiteGraph :save_last_frame: import networkx as nx class PartiteGraph(Scene): def construct(self): G = nx.Graph() G.add_nodes_from([0, 1, 2, 3]) G.add_edges_from([(0, 2), (0,3), (1, 2)]) graph = Graph(list(G.nodes), list(G.edges), layout="partite", partitions=[[0, 1]]) self.play(Create(graph)) The representation of a linear artificial neural network is facilitated by the use of the partite layout and defining partitions for each layer. .. manim:: LinearNN :save_last_frame: class LinearNN(Scene): def construct(self): edges = [] partitions = [] c = 0 layers = [2, 3, 3, 2] # the number of neurons in each layer for i in layers: partitions.append(list(range(c + 1, c + i + 1))) c += i for i, v in enumerate(layers[1:]): last = sum(layers[:i+1]) for j in range(v): for k in range(last - layers[i], last): edges.append((k + 1, j + last + 1)) vertices = np.arange(1, sum(layers) + 1) graph = Graph( vertices, edges, layout='partite', partitions=partitions, layout_scale=3, vertex_config={'radius': 0.20}, ) self.add(graph) The custom tree layout can be used to show the graph by distance from the root vertex. You must pass the root vertex of the tree. .. manim:: Tree import networkx as nx class Tree(Scene): def construct(self): G = nx.Graph() G.add_node("ROOT") for i in range(5): G.add_node("Child_%i" % i) G.add_node("Grandchild_%i" % i) G.add_node("Greatgrandchild_%i" % i) G.add_edge("ROOT", "Child_%i" % i) G.add_edge("Child_%i" % i, "Grandchild_%i" % i) G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) self.play(Create( Graph(list(G.nodes), list(G.edges), layout="tree", root_vertex="ROOT"))) The following code sample illustrates the use of the ``vertex_spacing`` layout parameter specific to the ``"tree"`` layout. As mentioned above, setting ``vertex_spacing`` overrides the specified value for ``layout_scale``, and as such it is harder to control the size of the mobject. However, we can adjust the captured frame and zoom out by using a :class:`.MovingCameraScene`:: class LargeTreeGeneration(MovingCameraScene): DEPTH = 4 CHILDREN_PER_VERTEX = 3 LAYOUT_CONFIG = {"vertex_spacing": (0.5, 1)} VERTEX_CONF = {"radius": 0.25, "color": BLUE_B, "fill_opacity": 1} def expand_vertex(self, g, vertex_id: str, depth: int): new_vertices = [ f"{vertex_id}/{i}" for i in range(self.CHILDREN_PER_VERTEX) ] new_edges = [(vertex_id, child_id) for child_id in new_vertices] g.add_edges( *new_edges, vertex_config=self.VERTEX_CONF, positions={ k: g.vertices[vertex_id].get_center() + 0.1 * DOWN for k in new_vertices }, ) if depth < self.DEPTH: for child_id in new_vertices: self.expand_vertex(g, child_id, depth + 1) return g def construct(self): g = Graph(["ROOT"], [], vertex_config=self.VERTEX_CONF) g = self.expand_vertex(g, "ROOT", 1) self.add(g) self.play( g.animate.change_layout( "tree", root_vertex="ROOT", layout_config=self.LAYOUT_CONFIG, ) ) self.play(self.camera.auto_zoom(g, margin=1), run_time=0.5) """ @staticmethod def _empty_networkx_graph() -> nx.Graph: return nx.Graph() def _populate_edge_dict( self, edges: list[tuple[Hashable, Hashable]], edge_type: type[Mobject] ): self.edges = { (u, v): edge_type( start=self[u].get_center(), end=self[v].get_center(), z_index=-1, **self._edge_config[(u, v)], ) for (u, v) in edges } def update_edges(self, graph): for (u, v), edge in graph.edges.items(): # Undirected graph has a Line edge edge.set_points_by_ends( graph[u].get_center(), graph[v].get_center(), buff=self._edge_config.get("buff", 0), path_arc=self._edge_config.get("path_arc", 0), ) def __repr__(self: Graph) -> str: return f"Undirected graph on {len(self.vertices)} vertices and {len(self.edges)} edges" class DiGraph(GenericGraph): """A directed graph. .. note:: In contrast to undirected graphs, the order in which vertices in a given edge are specified is relevant here. See also -------- :class:`.GenericGraph` Parameters ---------- vertices A list of vertices. Must be hashable elements. edges A list of edges, specified as tuples ``(u, v)`` where both ``u`` and ``v`` are vertices. The edge is directed from ``u`` to ``v``. labels Controls whether or not vertices are labeled. If ``False`` (the default), the vertices are not labeled; if ``True`` they are labeled using their names (as specified in ``vertices``) via :class:`~.MathTex`. Alternatively, custom labels can be specified by passing a dictionary whose keys are the vertices, and whose values are the corresponding vertex labels (rendered via, e.g., :class:`~.Text` or :class:`~.Tex`). label_fill_color Sets the fill color of the default labels generated when ``labels`` is set to ``True``. Has no effect for other values of ``labels``. layout Either one of ``"spring"`` (the default), ``"circular"``, ``"kamada_kawai"``, ``"planar"``, ``"random"``, ``"shell"``, ``"spectral"``, ``"spiral"``, ``"tree"``, and ``"partite"`` for automatic vertex positioning using ``networkx`` (see `their documentation `_ for more details), or a dictionary specifying a coordinate (value) for each vertex (key) for manual positioning. layout_config Only for automatically generated layouts. A dictionary whose entries are passed as keyword arguments to the automatic layout algorithm specified via ``layout`` of ``networkx``. The ``tree`` layout also accepts a special parameter ``vertex_spacing`` passed as a keyword argument inside the ``layout_config`` dictionary. Passing a tuple ``(space_x, space_y)`` as this argument overrides the value of ``layout_scale`` and ensures that vertices are arranged in a way such that the centers of siblings in the same layer are at least ``space_x`` units apart horizontally, and neighboring layers are spaced ``space_y`` units vertically. layout_scale The scale of automatically generated layouts: the vertices will be arranged such that the coordinates are located within the interval ``[-scale, scale]``. Some layouts accept a tuple ``(scale_x, scale_y)`` causing the first coordinate to be in the interval ``[-scale_x, scale_x]``, and the second in ``[-scale_y, scale_y]``. Default: 2. vertex_type The mobject class used for displaying vertices in the scene. vertex_config Either a dictionary containing keyword arguments to be passed to the class specified via ``vertex_type``, or a dictionary whose keys are the vertices, and whose values are dictionaries containing keyword arguments for the mobject related to the corresponding vertex. vertex_mobjects A dictionary whose keys are the vertices, and whose values are mobjects to be used as vertices. Passing vertices here overrides all other configuration options for a vertex. edge_type The mobject class used for displaying edges in the scene. edge_config Either a dictionary containing keyword arguments to be passed to the class specified via ``edge_type``, or a dictionary whose keys are the edges, and whose values are dictionaries containing keyword arguments for the mobject related to the corresponding edge. You can further customize the tip by adding a ``tip_config`` dictionary for global styling, or by adding the dict to a specific ``edge_config``. Examples -------- .. manim:: MovingDiGraph class MovingDiGraph(Scene): def construct(self): vertices = [1, 2, 3, 4] edges = [(1, 2), (2, 3), (3, 4), (1, 3), (1, 4)] g = DiGraph(vertices, edges) self.add(g) self.play( g[1].animate.move_to([1, 1, 1]), g[2].animate.move_to([-1, 1, 2]), g[3].animate.move_to([1, -1, -1]), g[4].animate.move_to([-1, -1, 0]), ) self.wait() You can customize the edges and arrow tips globally or locally. .. manim:: CustomDiGraph class CustomDiGraph(Scene): def construct(self): vertices = [i for i in range(5)] edges = [ (0, 1), (1, 2), (3, 2), (3, 4), ] edge_config = { "stroke_width": 2, "tip_config": { "tip_shape": ArrowSquareTip, "tip_length": 0.15, }, (3, 4): { "color": RED, "tip_config": {"tip_length": 0.25, "tip_width": 0.25} }, } g = DiGraph( vertices, edges, labels=True, layout="circular", edge_config=edge_config, ).scale(1.4) self.play(Create(g)) self.wait() Since this implementation respects the labels boundary you can also use it for an undirected moving graph with labels. .. manim:: UndirectedMovingDiGraph class UndirectedMovingDiGraph(Scene): def construct(self): vertices = [i for i in range(5)] edges = [ (0, 1), (1, 2), (3, 2), (3, 4), ] edge_config = { "stroke_width": 2, "tip_config": {"tip_length": 0, "tip_width": 0}, (3, 4): {"color": RED}, } g = DiGraph( vertices, edges, labels=True, layout="circular", edge_config=edge_config, ).scale(1.4) self.play(Create(g)) self.wait() self.play( g[1].animate.move_to([1, 1, 1]), g[2].animate.move_to([-1, 1, 2]), g[3].animate.move_to([-1.5, -1.5, -1]), g[4].animate.move_to([1, -2, -1]), ) self.wait() """ @staticmethod def _empty_networkx_graph() -> nx.DiGraph: return nx.DiGraph() def _populate_edge_dict( self, edges: list[tuple[Hashable, Hashable]], edge_type: type[Mobject] ): self.edges = { (u, v): edge_type( start=self[u], end=self[v], z_index=-1, **self._edge_config[(u, v)], ) for (u, v) in edges } for (u, v), edge in self.edges.items(): edge.add_tip(**self._tip_config[(u, v)]) def update_edges(self, graph): """Updates the edges to stick at their corresponding vertices. Arrow tips need to be repositioned since otherwise they can be deformed. """ for (u, v), edge in graph.edges.items(): tip = edge.pop_tips()[0] # Passing the Mobject instead of the vertex makes the tip # stop on the bounding box of the vertex. edge.set_points_by_ends( graph[u], graph[v], buff=self._edge_config.get("buff", 0), path_arc=self._edge_config.get("path_arc", 0), ) edge.add_tip(tip) def __repr__(self: DiGraph) -> str: return f"Directed graph on {len(self.vertices)} vertices and {len(self.edges)} edges" ManimCommunity-manim-1157b74/manim/mobject/graphing/000077500000000000000000000000001515024150700223565ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/mobject/graphing/__init__.py000066400000000000000000000003251515024150700244670ustar00rootroot00000000000000"""Coordinate systems and function graphing related mobjects. Modules ======= .. autosummary:: :toctree: ../reference ~coordinate_systems ~functions ~number_line ~probability ~scale """ ManimCommunity-manim-1157b74/manim/mobject/graphing/coordinate_systems.py000066400000000000000000003560521515024150700266610ustar00rootroot00000000000000"""Mobjects that represent coordinate systems.""" from __future__ import annotations __all__ = [ "CoordinateSystem", "Axes", "ThreeDAxes", "NumberPlane", "PolarPlane", "ComplexPlane", ] import fractions as fr import numbers from collections.abc import Callable, Iterable, Sequence from typing import TYPE_CHECKING, Any, Self, TypeVar, overload import numpy as np from manim import config from manim.constants import * from manim.mobject.geometry.arc import Circle, Dot from manim.mobject.geometry.line import Arrow, DashedLine, Line from manim.mobject.geometry.polygram import Polygon, Rectangle, RegularPolygon from manim.mobject.graphing.functions import ImplicitFunction, ParametricFunction from manim.mobject.graphing.number_line import NumberLine from manim.mobject.graphing.scale import LinearBase from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_surface import OpenGLSurface from manim.mobject.text.tex_mobject import MathTex from manim.mobject.three_d.three_dimensions import Surface from manim.mobject.types.vectorized_mobject import ( VDict, VectorizedPoint, VGroup, VMobject, ) from manim.utils.color import ( BLACK, BLUE, BLUE_D, GREEN, PURE_YELLOW, WHITE, ManimColor, ParsableManimColor, color_gradient, interpolate_color, invert_color, ) from manim.utils.config_ops import merge_dicts_recursively, update_dict_recursively from manim.utils.simple_functions import binary_search from manim.utils.space_ops import angle_of_vector if TYPE_CHECKING: from manim.mobject.mobject import Mobject from manim.typing import ( ManimFloat, Point2D, Point2DLike, Point3D, Point3DLike, Vector3D, Vector3DLike, ) LineType = TypeVar("LineType", bound=Line) class CoordinateSystem: r"""Abstract base class for Axes and NumberPlane. Examples -------- .. manim:: CoordSysExample :save_last_frame: class CoordSysExample(Scene): def construct(self): # the location of the ticks depends on the x_range and y_range. grid = Axes( x_range=[0, 1, 0.05], # step size determines num_decimal_places. y_range=[0, 1, 0.05], x_length=9, y_length=5.5, axis_config={ "numbers_to_include": np.arange(0, 1 + 0.1, 0.1), "font_size": 24, }, tips=False, ) # Labels for the x-axis and y-axis. y_label = grid.get_y_axis_label("y", edge=LEFT, direction=LEFT, buff=0.4) x_label = grid.get_x_axis_label("x") grid_labels = VGroup(x_label, y_label) graphs = VGroup() for n in np.arange(1, 20 + 0.5, 0.5): graphs += grid.plot(lambda x: x ** n, color=WHITE) graphs += grid.plot( lambda x: x ** (1 / n), color=WHITE, use_smoothing=False ) # Extra lines and labels for point (1,1) graphs += grid.get_horizontal_line(grid @ (1, 1, 0), color=BLUE) graphs += grid.get_vertical_line(grid @ (1, 1, 0), color=BLUE) graphs += Dot(point=grid @ (1, 1, 0), color=YELLOW) graphs += Tex("(1,1)").scale(0.75).next_to(grid @ (1, 1, 0)) title = Title( # spaces between braces to prevent SyntaxError r"Graphs of $y=x^{ {1}\over{n} }$ and $y=x^n (n=1,2,3,...,20)$", include_underline=False, font_size=40, ) self.add(title, graphs, grid, grid_labels) """ def __init__( self, x_range: Sequence[float] | None = None, y_range: Sequence[float] | None = None, x_length: float | None = None, y_length: float | None = None, dimension: int = 2, ): self.dimension = dimension default_step = 1 if x_range is None: x_range = [ round(-config["frame_x_radius"]), round(config["frame_x_radius"]), default_step, ] elif len(x_range) == 2: x_range = [*x_range, default_step] if y_range is None: y_range = [ round(-config["frame_y_radius"]), round(config["frame_y_radius"]), default_step, ] elif len(y_range) == 2: y_range = [*y_range, default_step] self.x_range = x_range self.y_range = y_range self.x_length = x_length self.y_length = y_length self.num_sampled_graph_points_per_tick = 10 self.x_axis: NumberLine def coords_to_point(self, *coords: ManimFloat) -> Point3D: # TODO: I think the method should be able to return more than just a single point. # E.g. see the implementation of it on line 2065. raise NotImplementedError() def point_to_coords(self, point: Point3DLike) -> list[ManimFloat]: raise NotImplementedError() def polar_to_point(self, radius: float, azimuth: float) -> Point2D: r"""Gets a point from polar coordinates. Parameters ---------- radius The coordinate radius (:math:`r`). azimuth The coordinate azimuth (:math:`\theta`). Returns ------- numpy.ndarray The point. Examples -------- .. manim:: PolarToPointExample :ref_classes: PolarPlane Vector :save_last_frame: class PolarToPointExample(Scene): def construct(self): polarplane_pi = PolarPlane(azimuth_units="PI radians", size=6) polartopoint_vector = Vector(polarplane_pi.polar_to_point(3, PI/4)) self.add(polarplane_pi) self.add(polartopoint_vector) """ return self.coords_to_point(radius * np.cos(azimuth), radius * np.sin(azimuth)) def point_to_polar(self, point: Point2DLike) -> Point2D: r"""Gets polar coordinates from a point. Parameters ---------- point The point. Returns ------- Point2D The coordinate radius (:math:`r`) and the coordinate azimuth (:math:`\theta`). """ x, y = self.point_to_coords(point) return np.sqrt(x**2 + y**2), np.arctan2(y, x) def c2p( self, *coords: float | Sequence[float] | Sequence[Sequence[float]] | np.ndarray ) -> np.ndarray: """Abbreviation for :meth:`coords_to_point`""" return self.coords_to_point(*coords) def p2c(self, point: Point3DLike) -> list[ManimFloat]: """Abbreviation for :meth:`point_to_coords`""" return self.point_to_coords(point) def pr2pt(self, radius: float, azimuth: float) -> np.ndarray: """Abbreviation for :meth:`polar_to_point`""" return self.polar_to_point(radius, azimuth) def pt2pr(self, point: np.ndarray) -> Point2D: """Abbreviation for :meth:`point_to_polar`""" return self.point_to_polar(point) def get_axes(self) -> VGroup: raise NotImplementedError() def get_axis(self, index: int) -> NumberLine: val: NumberLine = self.get_axes()[index] return val def get_origin(self) -> Point3D: """Gets the origin of :class:`~.Axes`. Returns ------- np.ndarray The center point. """ return self.coords_to_point(0, 0) def get_x_axis(self) -> NumberLine: return self.get_axis(0) def get_y_axis(self) -> NumberLine: return self.get_axis(1) def get_z_axis(self) -> NumberLine: return self.get_axis(2) def get_x_unit_size(self) -> float: return self.get_x_axis().get_unit_size() def get_y_unit_size(self) -> float: return self.get_y_axis().get_unit_size() def get_x_axis_label( self, label: float | str | VMobject, edge: Vector3D = UR, direction: Vector3D = UR, buff: float = SMALL_BUFF, **kwargs: Any, ) -> Mobject: """Generate an x-axis label. Parameters ---------- label The label. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. edge The edge of the x-axis to which the label will be added, by default ``UR``. direction Allows for further positioning of the label from an edge, by default ``UR``. buff The distance of the label from the line. Returns ------- :class:`~.Mobject` The positioned label. Examples -------- .. manim:: GetXAxisLabelExample :save_last_frame: class GetXAxisLabelExample(Scene): def construct(self): ax = Axes(x_range=(0, 8), y_range=(0, 5), x_length=8, y_length=5) x_label = ax.get_x_axis_label( Tex("$x$-values").scale(0.65), edge=DOWN, direction=DOWN, buff=0.5 ) self.add(ax, x_label) """ return self._get_axis_label( label, self.get_x_axis(), edge, direction, buff=buff, **kwargs ) def get_y_axis_label( self, label: float | str | VMobject, edge: Vector3D = UR, direction: Vector3D = UP * 0.5 + RIGHT, buff: float = SMALL_BUFF, **kwargs: Any, ) -> Mobject: """Generate a y-axis label. Parameters ---------- label The label. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. edge The edge of the y-axis to which the label will be added, by default ``UR``. direction Allows for further positioning of the label from an edge, by default ``UR`` buff The distance of the label from the line. Returns ------- :class:`~.Mobject` The positioned label. Examples -------- .. manim:: GetYAxisLabelExample :save_last_frame: class GetYAxisLabelExample(Scene): def construct(self): ax = Axes(x_range=(0, 8), y_range=(0, 5), x_length=8, y_length=5) y_label = ax.get_y_axis_label( Tex("$y$-values").scale(0.65).rotate(90 * DEGREES), edge=LEFT, direction=LEFT, buff=0.3, ) self.add(ax, y_label) """ return self._get_axis_label( label, self.get_y_axis(), edge, direction, buff=buff, **kwargs ) def _get_axis_label( self, label: float | str | VMobject, axis: Mobject, edge: Vector3DLike, direction: Vector3DLike, buff: float = SMALL_BUFF, ) -> Mobject: """Gets the label for an axis. Parameters ---------- label The label. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. axis The axis to which the label will be added. edge The edge of the axes to which the label will be added. ``RIGHT`` adds to the right side of the axis direction Allows for further positioning of the label. buff The distance of the label from the line. Returns ------- :class:`~.Mobject` The positioned label along the given axis. """ label_mobject: Mobject = self.x_axis._create_label_tex(label) label_mobject.next_to( axis.get_edge_center(edge), direction=direction, buff=buff ) label_mobject.shift_onto_screen(buff=MED_SMALL_BUFF) return label_mobject def get_axis_labels(self) -> VGroup: raise NotImplementedError() def add_coordinates( self, *axes_numbers: Iterable[float] | None | dict[float, str | float | Mobject], **kwargs: Any, ) -> Self: """Adds labels to the axes. Use ``Axes.coordinate_labels`` to access the coordinates after creation. Parameters ---------- axes_numbers The numbers to be added to the axes. Use ``None`` to represent an axis with default labels. Examples -------- .. code-block:: python ax = ThreeDAxes() x_labels = range(-4, 5) z_labels = range(-4, 4, 2) ax.add_coordinates( x_labels, None, z_labels ) # default y labels, custom x & z labels ax.add_coordinates(x_labels) # only x labels You can also specifically control the position and value of the labels using a dict. .. code-block:: python ax = Axes(x_range=[0, 7]) x_pos = [x for x in range(1, 8)] # strings are automatically converted into a Tex mobject. x_vals = [ "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ] x_dict = dict(zip(x_pos, x_vals)) ax.add_coordinates(x_dict) """ self.coordinate_labels = VGroup() # if nothing is passed to axes_numbers, produce axes with default labelling if not axes_numbers: axes_numbers = [None for _ in range(self.dimension)] for axis, values in zip(self.axes, axes_numbers, strict=False): if isinstance(values, dict): axis.add_labels(values, **kwargs) labels = axis.labels elif values is None and axis.scaling.custom_labels: tick_range = axis.get_tick_range() axis.add_labels( dict( zip( tick_range, axis.scaling.get_custom_labels(tick_range), strict=True, ) ) ) labels = axis.labels else: axis.add_numbers(values, **kwargs) labels = axis.numbers self.coordinate_labels.add(labels) return self # overload necessary until https://github.com/python/mypy/issues/3737 is supported @overload def get_line_from_axis_to_point( self, index: int, point: Point3DLike, line_config: dict | None = ..., color: ParsableManimColor | None = ..., stroke_width: float = ..., ) -> DashedLine: ... @overload def get_line_from_axis_to_point( self, index: int, point: Point3DLike, line_func: type[LineType], line_config: dict | None = ..., color: ParsableManimColor | None = ..., stroke_width: float = ..., ) -> LineType: ... def get_line_from_axis_to_point( # type: ignore[no-untyped-def] self, index, point, line_func=DashedLine, line_config=None, color=None, stroke_width=2, ): """Returns a straight line from a given axis to a point in the scene. Parameters ---------- index Specifies the axis from which to draw the line. `0 = x_axis`, `1 = y_axis` point The point to which the line will be drawn. line_func The function of the :class:`~.Line` mobject used to construct the line. line_config Optional arguments to passed to :attr:`line_func`. color The color of the line. stroke_width The stroke width of the line. Returns ------- :class:`~.Line` The line from an axis to a point. .. seealso:: :meth:`~.CoordinateSystem.get_vertical_line` :meth:`~.CoordinateSystem.get_horizontal_line` """ line_config = line_config if line_config is not None else {} if color is None: color = VMobject().color line_config["color"] = ManimColor.parse(color) line_config["stroke_width"] = stroke_width axis = self.get_axis(index) line = line_func(axis.get_projection(point), point, **line_config) return line def get_vertical_line(self, point: Point3DLike, **kwargs: Any) -> Line: """A vertical line from the x-axis to a given point in the scene. Parameters ---------- point The point to which the vertical line will be drawn. kwargs Additional parameters to be passed to :class:`get_line_from_axis_to_point`. Returns ------- :class:`Line` A vertical line from the x-axis to the point. Examples -------- .. manim:: GetVerticalLineExample :save_last_frame: class GetVerticalLineExample(Scene): def construct(self): ax = Axes().add_coordinates() point = ax.coords_to_point(-3.5, 2) dot = Dot(point) line = ax.get_vertical_line(point, line_config={"dashed_ratio": 0.85}) self.add(ax, line, dot) """ return self.get_line_from_axis_to_point(0, point, **kwargs) def get_horizontal_line(self, point: Point3DLike, **kwargs: Any) -> Line: """A horizontal line from the y-axis to a given point in the scene. Parameters ---------- point The point to which the horizontal line will be drawn. kwargs Additional parameters to be passed to :class:`get_line_from_axis_to_point`. Returns ------- :class:`Line` A horizontal line from the y-axis to the point. Examples -------- .. manim:: GetHorizontalLineExample :save_last_frame: class GetHorizontalLineExample(Scene): def construct(self): ax = Axes().add_coordinates() point = ax @ (-4, 1.5) dot = Dot(point) line = ax.get_horizontal_line(point, line_func=Line) self.add(ax, line, dot) """ return self.get_line_from_axis_to_point(1, point, **kwargs) def get_lines_to_point(self, point: Point3DLike, **kwargs: Any) -> VGroup: """Generate both horizontal and vertical lines from the axis to a point. Parameters ---------- point A point on the scene. kwargs Additional parameters to be passed to :meth:`get_line_from_axis_to_point` Returns ------- :class:`~.VGroup` A :class:`~.VGroup` of the horizontal and vertical lines. .. seealso:: :meth:`~.CoordinateSystem.get_vertical_line` :meth:`~.CoordinateSystem.get_horizontal_line` Examples -------- .. manim:: GetLinesToPointExample :save_last_frame: class GetLinesToPointExample(Scene): def construct(self): ax = Axes() circ = Circle(radius=0.5).move_to([-4, -1.5, 0]) lines_1 = ax.get_lines_to_point(circ.get_right(), color=GREEN_B) lines_2 = ax.get_lines_to_point(circ.get_corner(DL), color=BLUE_B) self.add(ax, lines_1, lines_2, circ) """ return VGroup( self.get_horizontal_line(point, **kwargs), self.get_vertical_line(point, **kwargs), ) # graphing def plot( self, function: Callable[[float], float], x_range: Sequence[float] | None = None, use_vectorized: bool = False, colorscale: Iterable[ParsableManimColor] | Iterable[ParsableManimColor, float] | None = None, colorscale_axis: int = 1, **kwargs: Any, ) -> ParametricFunction: """Generates a curve based on a function. Parameters ---------- function The function used to construct the :class:`~.ParametricFunction`. x_range The range of the curve along the axes. ``x_range = [x_min, x_max, x_step]``. use_vectorized Whether to pass in the generated t value array to the function. Only use this if your function supports it. Output should be a numpy array of shape ``[y_0, y_1, ...]`` colorscale Colors of the function. Optional parameter used when coloring a function by values. Passing a list of colors and a colorscale_axis will color the function by y-value. Passing a list of tuples in the form ``(color, pivot)`` allows user-defined pivots where the color transitions. colorscale_axis Defines the axis on which the colorscale is applied (0 = x, 1 = y), default is y-axis (1). kwargs Additional parameters to be passed to :class:`~.ParametricFunction`. Returns ------- :class:`~.ParametricFunction` The plotted curve. .. warning:: This method may not produce accurate graphs since Manim currently relies on interpolation between evenly-spaced samples of the curve, instead of intelligent plotting. See the example below for some solutions to this problem. Examples -------- .. manim:: PlotExample :save_last_frame: class PlotExample(Scene): def construct(self): # construct the axes ax_1 = Axes( x_range=[0.001, 6], y_range=[-8, 2], x_length=5, y_length=3, tips=False, ) ax_2 = ax_1.copy() ax_3 = ax_1.copy() # position the axes ax_1.to_corner(UL) ax_2.to_corner(UR) ax_3.to_edge(DOWN) axes = VGroup(ax_1, ax_2, ax_3) # create the logarithmic curves def log_func(x): return np.log(x) # a curve without adjustments; poor interpolation. curve_1 = ax_1.plot(log_func, color=PURE_RED) # disabling interpolation makes the graph look choppy as not enough # inputs are available curve_2 = ax_2.plot(log_func, use_smoothing=False, color=ORANGE) # taking more inputs of the curve by specifying a step for the # x_range yields expected results, but increases rendering time. curve_3 = ax_3.plot( log_func, x_range=(0.001, 6, 0.001), color=PURE_GREEN ) curves = VGroup(curve_1, curve_2, curve_3) self.add(axes, curves) """ t_range = np.array(self.x_range, dtype=float) if x_range is not None: t_range[: len(x_range)] = x_range if x_range is None or len(x_range) < 3: # if t_range has a defined step size, increase the number of sample points per tick t_range[2] /= self.num_sampled_graph_points_per_tick # For axes, the third coordinate of x_range indicates # tick frequency. But for functions, it indicates a # sample frequency graph = ParametricFunction( lambda t: self.coords_to_point(t, function(t)), t_range=t_range, scaling=self.x_axis.scaling, use_vectorized=use_vectorized, **kwargs, ) graph.underlying_function = function if colorscale: if type(colorscale[0]) in (list, tuple): new_colors, pivots = [ [i for i, j in colorscale], [j for i, j in colorscale], ] else: new_colors = colorscale ranges = [self.x_range, self.y_range] pivot_min = ranges[colorscale_axis][0] pivot_max = ranges[colorscale_axis][1] pivot_frequency = (pivot_max - pivot_min) / (len(new_colors) - 1) pivots = np.arange( start=pivot_min, stop=pivot_max + pivot_frequency, step=pivot_frequency, ) resolution = 0.01 if len(x_range) == 2 else x_range[2] sample_points = np.arange(x_range[0], x_range[1] + resolution, resolution) color_list = [] for samp_x in sample_points: axis_value = (samp_x, function(samp_x))[colorscale_axis] if axis_value <= pivots[0]: color_list.append(new_colors[0]) elif axis_value >= pivots[-1]: color_list.append(new_colors[-1]) else: for i, pivot in enumerate(pivots): if pivot > axis_value: color_index = (axis_value - pivots[i - 1]) / ( pivots[i] - pivots[i - 1] ) color_index = min(color_index, 1) mob_color = interpolate_color( new_colors[i - 1], new_colors[i], color_index, ) color_list.append(mob_color) break if config.renderer == RendererType.OPENGL: graph.set_color(color_list) else: graph.set_stroke(color_list) graph.set_sheen_direction(RIGHT) return graph def plot_implicit_curve( self, func: Callable[[float, float], float], min_depth: int = 5, max_quads: int = 1500, **kwargs: Any, ) -> ImplicitFunction: """Creates the curves of an implicit function. Parameters ---------- func The function to graph, in the form of f(x, y) = 0. min_depth The minimum depth of the function to calculate. max_quads The maximum number of quads to use. kwargs Additional parameters to pass into :class:`ImplicitFunction`. Examples -------- .. manim:: ImplicitExample :save_last_frame: class ImplicitExample(Scene): def construct(self): ax = Axes() a = ax.plot_implicit_curve( lambda x, y: y * (x - y) ** 2 - 4 * x - 8, color=BLUE ) self.add(ax, a) """ x_scale = self.get_x_axis().scaling y_scale = self.get_y_axis().scaling graph = ImplicitFunction( func=(lambda x, y: func(x_scale.function(x), y_scale.function(y))), x_range=self.x_range[:2], y_range=self.y_range[:2], min_depth=min_depth, max_quads=max_quads, **kwargs, ) ( graph.stretch(self.get_x_unit_size(), 0, about_point=ORIGIN) .stretch(self.get_y_unit_size(), 1, about_point=ORIGIN) .shift(self.get_origin()) ) return graph def plot_parametric_curve( self, function: Callable[[float], np.ndarray], use_vectorized: bool = False, **kwargs: Any, ) -> ParametricFunction: """A parametric curve. Parameters ---------- function A parametric function mapping a number to a point in the coordinate system. use_vectorized Whether to pass in the generated t value array to the function. Only use this if your function supports it. kwargs Any further keyword arguments are passed to :class:`.ParametricFunction`. Example ------- .. manim:: ParametricCurveExample :save_last_frame: class ParametricCurveExample(Scene): def construct(self): ax = Axes() cardioid = ax.plot_parametric_curve( lambda t: np.array( [ np.exp(1) * np.cos(t) * (1 - np.cos(t)), np.exp(1) * np.sin(t) * (1 - np.cos(t)), 0, ] ), t_range=[0, 2 * PI], color="#0FF1CE", ) self.add(ax, cardioid) """ dim = self.dimension graph = ParametricFunction( lambda t: self.coords_to_point(*function(t)[:dim]), use_vectorized=use_vectorized, **kwargs, ) graph.underlying_function = function return graph def plot_polar_graph( self, r_func: Callable[[float], float], theta_range: Sequence[float] | None = None, **kwargs: Any, ) -> ParametricFunction: """A polar graph. Parameters ---------- r_func The function r of theta. theta_range The range of theta as ``theta_range = [theta_min, theta_max, theta_step]``. kwargs Additional parameters passed to :class:`~.ParametricFunction`. Examples -------- .. manim:: PolarGraphExample :ref_classes: PolarPlane :save_last_frame: class PolarGraphExample(Scene): def construct(self): plane = PolarPlane() r = lambda theta: 2 * np.sin(theta * 5) graph = plane.plot_polar_graph(r, [0, 2 * PI], color=ORANGE) self.add(plane, graph) """ theta_range = theta_range if theta_range is not None else [0, 2 * PI] graph = ParametricFunction( function=lambda th: self.pr2pt(r_func(th), th), t_range=theta_range, **kwargs, ) graph.underlying_function = r_func return graph def plot_surface( self, function: Callable[[float], float], u_range: Sequence[float] | None = None, v_range: Sequence[float] | None = None, colorscale: ( Sequence[ParsableManimColor] | Sequence[tuple[ParsableManimColor, float]] | None ) = None, colorscale_axis: int = 2, **kwargs: Any, ) -> Surface | OpenGLSurface: """Generates a surface based on a function. Parameters ---------- function The function used to construct the :class:`~.Surface`. u_range The range of the ``u`` variable: ``(u_min, u_max)``. v_range The range of the ``v`` variable: ``(v_min, v_max)``. colorscale Colors of the surface. Passing a list of colors will color the surface by z-value. Passing a list of tuples in the form ``(color, pivot)`` allows user-defined pivots where the color transitions. colorscale_axis Defines the axis on which the colorscale is applied (0 = x, 1 = y, 2 = z), default is z-axis (2). kwargs Additional parameters to be passed to :class:`~.Surface`. Returns ------- :class:`~.Surface` The plotted surface. Examples -------- .. manim:: PlotSurfaceExample :save_last_frame: class PlotSurfaceExample(ThreeDScene): def construct(self): resolution_fa = 16 self.set_camera_orientation(phi=75 * DEGREES, theta=-60 * DEGREES) axes = ThreeDAxes(x_range=(-3, 3, 1), y_range=(-3, 3, 1), z_range=(-5, 5, 1)) def param_trig(u, v): x = u y = v z = 2 * np.sin(x) + 2 * np.cos(y) return z trig_plane = axes.plot_surface( param_trig, resolution=(resolution_fa, resolution_fa), u_range = (-3, 3), v_range = (-3, 3), colorscale = [BLUE, GREEN, YELLOW, ORANGE, RED], ) self.add(axes, trig_plane) """ if config.renderer == RendererType.CAIRO: surface = Surface( lambda u, v: self.c2p(u, v, function(u, v)), u_range=u_range, v_range=v_range, **kwargs, ) if colorscale: surface.set_fill_by_value( axes=self.copy(), colorscale=colorscale, axis=colorscale_axis, ) elif config.renderer == RendererType.OPENGL: surface = OpenGLSurface( lambda u, v: self.c2p(u, v, function(u, v)), u_range=u_range, v_range=v_range, axes=self.copy(), colorscale=colorscale, colorscale_axis=colorscale_axis, **kwargs, ) return surface def input_to_graph_point( self, x: float, graph: ParametricFunction | VMobject, ) -> Point3D: """Returns the coordinates of the point on a ``graph`` corresponding to an ``x`` value. Parameters ---------- x The x-value of a point on the ``graph``. graph The :class:`~.ParametricFunction` on which the point lies. Returns ------- :class:`np.ndarray` The coordinates of the point on the :attr:`graph` corresponding to the :attr:`x` value. Raises ------ :exc:`ValueError` When the target x is not in the range of the line graph. Examples -------- .. manim:: InputToGraphPointExample :save_last_frame: class InputToGraphPointExample(Scene): def construct(self): ax = Axes() curve = ax.plot(lambda x : np.cos(x)) # move a square to PI on the cosine curve. position = ax.input_to_graph_point(x=PI, graph=curve) sq = Square(side_length=1, color=YELLOW).move_to(position) self.add(ax, curve, sq) """ if hasattr(graph, "underlying_function"): return graph.function(x) else: alpha = binary_search( function=lambda a: self.point_to_coords(graph.point_from_proportion(a))[ 0 ], target=x, lower_bound=0, upper_bound=1, ) if alpha is not None: return graph.point_from_proportion(alpha) else: raise ValueError( f"x={x} not located in the range of the graph ([{self.p2c(graph.get_start())[0]}, {self.p2c(graph.get_end())[0]}])", ) def input_to_graph_coords( self, x: float, graph: ParametricFunction ) -> tuple[float, float]: """Returns a tuple of the axis relative coordinates of the point on the graph based on the x-value given. Examples -------- .. code-block:: pycon >>> from manim import Axes >>> ax = Axes() >>> parabola = ax.plot(lambda x: x**2) >>> ax.input_to_graph_coords(x=3, graph=parabola) (3, 9) """ return x, graph.underlying_function(x) def i2gc(self, x: float, graph: ParametricFunction) -> tuple[float, float]: """Alias for :meth:`input_to_graph_coords`.""" return self.input_to_graph_coords(x, graph) def i2gp(self, x: float, graph: ParametricFunction) -> np.ndarray: """Alias for :meth:`input_to_graph_point`.""" return self.input_to_graph_point(x, graph) def get_graph_label( self, graph: ParametricFunction, label: float | str | VMobject = "f(x)", x_val: float | None = None, direction: Sequence[float] = RIGHT, buff: float = MED_SMALL_BUFF, color: ParsableManimColor | None = None, dot: bool = False, dot_config: dict[str, Any] | None = None, ) -> Mobject: r"""Creates a properly positioned label for the passed graph, with an optional dot. Parameters ---------- graph The curve. label The label for the function's curve. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. x_val The x_value along the curve that positions the label. direction The cartesian position, relative to the curve that the label will be at --> ``LEFT``, ``RIGHT``. buff The distance between the curve and the label. color The color of the label. Defaults to the color of the curve. dot Whether to add a dot at the point on the graph. dot_config Additional parameters to be passed to :class:`~.Dot`. Returns ------- :class:`Mobject` The positioned label and :class:`~.Dot`, if applicable. Examples -------- .. manim:: GetGraphLabelExample :save_last_frame: class GetGraphLabelExample(Scene): def construct(self): ax = Axes() sin = ax.plot(lambda x: np.sin(x), color=PURPLE_B) label = ax.get_graph_label( graph=sin, label= MathTex(r"\frac{\pi}{2}"), x_val=PI / 2, dot=True, direction=UR, ) self.add(ax, sin, label) """ if dot_config is None: dot_config = {} if color is None: color = graph.get_color() label_object: Mobject = self.x_axis._create_label_tex(label).set_color(color) if x_val is None: # Search from right to left for x in np.linspace(self.x_range[1], self.x_range[0], 100): point = self.input_to_graph_point(x, graph) if point[1] < config["frame_y_radius"]: break else: point = self.input_to_graph_point(x_val, graph) label_object.next_to(point, direction, buff=buff) label_object.shift_onto_screen() if dot: dot = Dot(point=point, **dot_config) label_object.add(dot) label_object.dot = dot return label_object # calculus def get_riemann_rectangles( self, graph: ParametricFunction, x_range: Sequence[float] | None = None, dx: float = 0.1, input_sample_type: str = "left", stroke_width: float = 1, stroke_color: ParsableManimColor = BLACK, fill_opacity: float = 1, color: Iterable[ParsableManimColor] | ParsableManimColor = (BLUE, GREEN), show_signed_area: bool = True, bounded_graph: ParametricFunction | None = None, blend: bool = False, width_scale_factor: float = 1.001, ) -> VGroup: """Generates a :class:`~.VGroup` of the Riemann Rectangles for a given curve. Parameters ---------- graph The graph whose area will be approximated by Riemann rectangles. x_range The minimum and maximum x-values of the rectangles. ``x_range = [x_min, x_max]``. dx The change in x-value that separates each rectangle. input_sample_type Can be any of ``"left"``, ``"right"`` or ``"center"``. Refers to where the sample point for the height of each Riemann Rectangle will be inside the segments of the partition. stroke_width The stroke_width of the border of the rectangles. stroke_color The color of the border of the rectangle. fill_opacity The opacity of the rectangles. color The colors of the rectangles. Creates a balanced gradient if multiple colors are passed. show_signed_area Indicates negative area when the curve dips below the x-axis by inverting its color. blend Sets the :attr:`stroke_color` to :attr:`fill_color`, blending the rectangles without clear separation. bounded_graph If a secondary graph is specified, encloses the area between the two curves. width_scale_factor The factor by which the width of the rectangles is scaled. Returns ------- :class:`~.VGroup` A :class:`~.VGroup` containing the Riemann Rectangles. Examples -------- .. manim:: GetRiemannRectanglesExample :save_last_frame: class GetRiemannRectanglesExample(Scene): def construct(self): ax = Axes(y_range=[-2, 10]) quadratic = ax.plot(lambda x: 0.5 * x ** 2 - 0.5) # the rectangles are constructed from their top right corner. # passing an iterable to `color` produces a gradient rects_right = ax.get_riemann_rectangles( quadratic, x_range=[-4, -3], dx=0.25, color=(TEAL, BLUE_B, DARK_BLUE), input_sample_type="right", ) # the colour of rectangles below the x-axis is inverted # due to show_signed_area rects_left = ax.get_riemann_rectangles( quadratic, x_range=[-1.5, 1.5], dx=0.15, color=YELLOW ) bounding_line = ax.plot( lambda x: 1.5 * x, color=BLUE_B, x_range=[3.3, 6] ) bounded_rects = ax.get_riemann_rectangles( bounding_line, bounded_graph=quadratic, dx=0.15, x_range=[4, 5], show_signed_area=False, color=(MAROON_A, RED_B, PURPLE_D), ) self.add( ax, bounding_line, quadratic, rects_right, rects_left, bounded_rects ) """ # setting up x_range, overwrite user's third input if x_range is None: if bounded_graph is None: x_range = [graph.t_min, graph.t_max] else: x_min = max(graph.t_min, bounded_graph.t_min) x_max = min(graph.t_max, bounded_graph.t_max) x_range = [x_min, x_max] x_range = [*x_range[:2], dx] rectangles = VGroup() x_range_array = np.arange(*x_range) if isinstance(color, (list, tuple)): color = [ManimColor(c) for c in color] else: color = [ManimColor(color)] colors = color_gradient(color, len(x_range_array)) for x, color in zip(x_range_array, colors, strict=True): if input_sample_type == "left": sample_input = x elif input_sample_type == "right": sample_input = x + dx elif input_sample_type == "center": sample_input = x + 0.5 * dx else: raise ValueError("Invalid input sample type") graph_point = self.input_to_graph_point(sample_input, graph) if bounded_graph is None: y_point = self._origin_shift(self.y_range) else: y_point = bounded_graph.underlying_function(x) points = VGroup( *list( map( VectorizedPoint, [ self.coords_to_point(x, y_point), self.coords_to_point(x + width_scale_factor * dx, y_point), graph_point, ], ), ) ) rect = Rectangle().replace(points, stretch=True) rectangles.add(rect) # checks if the rectangle is under the x-axis if self.p2c(graph_point)[1] < y_point and show_signed_area: color = invert_color(color) # blends rectangles smoothly if blend: stroke_color = color rect.set_style( fill_color=color, fill_opacity=fill_opacity, stroke_color=stroke_color, stroke_width=stroke_width, ) return rectangles def get_area( self, graph: ParametricFunction, x_range: tuple[float, float] | None = None, color: ParsableManimColor | Iterable[ParsableManimColor] = (BLUE, GREEN), opacity: float = 0.3, bounded_graph: ParametricFunction | None = None, **kwargs: Any, ) -> Polygon: """Returns a :class:`~.Polygon` representing the area under the graph passed. Parameters ---------- graph The graph/curve for which the area needs to be gotten. x_range The range of the minimum and maximum x-values of the area. ``x_range = [x_min, x_max]``. color The color of the area. Creates a gradient if a list of colors is provided. opacity The opacity of the area. bounded_graph If a secondary :attr:`graph` is specified, encloses the area between the two curves. kwargs Additional parameters passed to :class:`~.Polygon`. Returns ------- :class:`~.Polygon` The :class:`~.Polygon` representing the area. Raises ------ :exc:`ValueError` When x_ranges do not match (either area x_range, graph's x_range or bounded_graph's x_range). Examples -------- .. manim:: GetAreaExample :save_last_frame: class GetAreaExample(Scene): def construct(self): ax = Axes().add_coordinates() curve = ax.plot(lambda x: 2 * np.sin(x), color=DARK_BLUE) area = ax.get_area( curve, x_range=(PI / 2, 3 * PI / 2), color=(GREEN_B, GREEN_D), opacity=1, ) self.add(ax, curve, area) """ if x_range is None: a = graph.t_min b = graph.t_max else: a, b = x_range if bounded_graph is not None: if bounded_graph.t_min > b: raise ValueError( f"Ranges not matching: {bounded_graph.t_min} < {b}", ) if bounded_graph.t_max < a: raise ValueError( f"Ranges not matching: {bounded_graph.t_max} > {a}", ) a = max(a, bounded_graph.t_min) b = min(b, bounded_graph.t_max) if bounded_graph is None: points = ( [self.c2p(a), graph.function(a)] + [p for p in graph.points if a <= self.p2c(p)[0] <= b] + [graph.function(b), self.c2p(b)] ) else: graph_points, bounded_graph_points = ( [g.function(a)] + [p for p in g.points if a <= self.p2c(p)[0] <= b] + [g.function(b)] for g in (graph, bounded_graph) ) points = graph_points + bounded_graph_points[::-1] return Polygon(*points, **kwargs).set_opacity(opacity).set_color(color) def angle_of_tangent( self, x: float, graph: ParametricFunction, dx: float = 1e-8, ) -> float: """Returns the angle to the x-axis of the tangent to the plotted curve at a particular x-value. Parameters ---------- x The x-value at which the tangent must touch the curve. graph The :class:`~.ParametricFunction` for which to calculate the tangent. dx The change in `x` used to determine the angle of the tangent to the curve. Returns ------- :class:`float` The angle of the tangent to the curve. Examples -------- .. code-block:: python ax = Axes() curve = ax.plot(lambda x: x**2) ax.angle_of_tangent(x=3, graph=curve) # 1.4056476493802699 """ p0 = np.array([*self.input_to_graph_coords(x, graph)]) p1 = np.array([*self.input_to_graph_coords(x + dx, graph)]) return angle_of_vector(p1 - p0) def slope_of_tangent( self, x: float, graph: ParametricFunction, **kwargs: Any ) -> float: """Returns the slope of the tangent to the plotted curve at a particular x-value. Parameters ---------- x The x-value at which the tangent must touch the curve. graph The :class:`~.ParametricFunction` for which to calculate the tangent. Returns ------- :class:`float` The slope of the tangent with the x axis. Examples -------- .. code-block:: python ax = Axes() curve = ax.plot(lambda x: x**2) ax.slope_of_tangent(x=-2, graph=curve) # -3.5000000259052038 """ val: float = np.tan(self.angle_of_tangent(x, graph, **kwargs)) return val def plot_derivative_graph( self, graph: ParametricFunction, color: ParsableManimColor = GREEN, **kwargs: Any, ) -> ParametricFunction: """Returns the curve of the derivative of the passed graph. Parameters ---------- graph The graph for which the derivative will be found. color The color of the derivative curve. kwargs Any valid keyword argument of :class:`~.ParametricFunction`. Returns ------- :class:`~.ParametricFunction` The curve of the derivative. Examples -------- .. manim:: DerivativeGraphExample :save_last_frame: class DerivativeGraphExample(Scene): def construct(self): ax = NumberPlane(y_range=[-1, 7], background_line_style={"stroke_opacity": 0.4}) curve_1 = ax.plot(lambda x: x ** 2, color=PURPLE_B) curve_2 = ax.plot_derivative_graph(curve_1) curves = VGroup(curve_1, curve_2) label_1 = ax.get_graph_label(curve_1, "x^2", x_val=-2, direction=DL) label_2 = ax.get_graph_label(curve_2, "2x", x_val=3, direction=RIGHT) labels = VGroup(label_1, label_2) self.add(ax, curves, labels) """ def deriv(x: float) -> float: return self.slope_of_tangent(x, graph) return self.plot(deriv, color=color, **kwargs) def plot_antiderivative_graph( self, graph: ParametricFunction, y_intercept: float = 0, samples: int = 50, use_vectorized: bool = False, **kwargs: Any, ) -> ParametricFunction: """Plots an antiderivative graph. Parameters ---------- graph The graph for which the antiderivative will be found. y_intercept The y-value at which the graph intercepts the y-axis. samples The number of points to take the area under the graph. use_vectorized Whether to use the vectorized version of the antiderivative. This means to pass in the generated t value array to the function. Only use this if your function supports it. Output should be a numpy array of shape ``[y_0, y_1, ...]`` kwargs Any valid keyword argument of :class:`~.ParametricFunction`. Returns ------- :class:`~.ParametricFunction` The curve of the antiderivative. .. note:: This graph is plotted from the values of area under the reference graph. The result might not be ideal if the reference graph contains uncalculatable areas from x=0. Examples -------- .. manim:: AntiderivativeExample :save_last_frame: class AntiderivativeExample(Scene): def construct(self): ax = Axes() graph1 = ax.plot( lambda x: (x ** 2 - 2) / 3, color=RED, ) graph2 = ax.plot_antiderivative_graph(graph1, color=BLUE) self.add(ax, graph1, graph2) """ def antideriv(x): x_vals = np.linspace(0, x, samples, axis=1 if use_vectorized else 0) f_vec = np.vectorize(graph.underlying_function) y_vals = f_vec(x_vals) return np.trapezoid(y_vals, x_vals) + y_intercept return self.plot(antideriv, use_vectorized=use_vectorized, **kwargs) def get_secant_slope_group( self, x: float, graph: ParametricFunction, dx: float | None = None, dx_line_color: ParsableManimColor = PURE_YELLOW, dy_line_color: ParsableManimColor | None = None, dx_label: float | str | None = None, dy_label: float | str | None = None, include_secant_line: bool = True, secant_line_color: ParsableManimColor = GREEN, secant_line_length: float = 10, ) -> VGroup: """Creates two lines representing `dx` and `df`, the labels for `dx` and `df`, and the secant to the curve at a particular x-value. Parameters ---------- x The x-value at which the secant intersects the graph for the first time. graph The curve for which the secant will be found. dx The change in `x` after which the secant exits. dx_line_color The color of the line that indicates the change in `x`. dy_line_color The color of the line that indicates the change in `y`. Defaults to the color of :attr:`graph`. dx_label The label for the `dx` line. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. dy_label The label for the `dy` line. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. include_secant_line Whether to include the secant line in the graph, or just the df/dx lines and labels. secant_line_color The color of the secant line. secant_line_length The length of the secant line. Returns ------- :class:`~.VGroup` A group containing the elements: `dx_line`, `df_line`, and if applicable also :attr:`dx_label`, :attr:`df_label`, `secant_line`. Examples -------- .. manim:: GetSecantSlopeGroupExample :save_last_frame: class GetSecantSlopeGroupExample(Scene): def construct(self): ax = Axes(y_range=[-1, 7]) graph = ax.plot(lambda x: 1 / 4 * x ** 2, color=BLUE) slopes = ax.get_secant_slope_group( x=2.0, graph=graph, dx=1.0, dx_label=Tex("dx = 1.0"), dy_label="dy", dx_line_color=GREEN_B, secant_line_length=4, secant_line_color=RED_D, ) self.add(ax, graph, slopes) """ group = VGroup() dx = dx or float(self.x_range[1] - self.x_range[0]) / 10 dy_line_color = dy_line_color or graph.get_color() p1 = self.input_to_graph_point(x, graph) p2 = self.input_to_graph_point(x + dx, graph) interim_point = p2[0] * RIGHT + p1[1] * UP group.dx_line = Line(p1, interim_point, color=dx_line_color) group.df_line = Line(interim_point, p2, color=dy_line_color) group.add(group.dx_line, group.df_line) labels = VGroup() if dx_label is not None: group.dx_label = self.x_axis._create_label_tex(dx_label) labels.add(group.dx_label) group.add(group.dx_label) if dy_label is not None: group.df_label = self.x_axis._create_label_tex(dy_label) labels.add(group.df_label) group.add(group.df_label) if len(labels) > 0: max_width = 0.8 * group.dx_line.width max_height = 0.8 * group.df_line.height if labels.width > max_width: labels.width = max_width if labels.height > max_height: labels.height = max_height if dx_label is not None: group.dx_label.next_to( group.dx_line, np.sign(dx) * DOWN, buff=group.dx_label.height / 2, ) group.dx_label.set_color(group.dx_line.get_color()) if dy_label is not None: group.df_label.next_to( group.df_line, np.sign(dx) * RIGHT, buff=group.df_label.height / 2, ) group.df_label.set_color(group.df_line.get_color()) if include_secant_line: group.secant_line = Line(p1, p2, color=secant_line_color) group.secant_line.scale( secant_line_length / group.secant_line.get_length(), ) group.add(group.secant_line) return group def get_vertical_lines_to_graph( self, graph: ParametricFunction, x_range: Sequence[float] | None = None, num_lines: int = 20, **kwargs: Any, ) -> VGroup: """Obtains multiple lines from the x-axis to the curve. Parameters ---------- graph The graph along which the lines are placed. x_range A list containing the lower and and upper bounds of the lines: ``x_range = [x_min, x_max]``. num_lines The number of evenly spaced lines. kwargs Additional arguments to be passed to :meth:`~.CoordinateSystem.get_vertical_line`. Returns ------- :class:`~.VGroup` The :class:`~.VGroup` of the evenly spaced lines. Examples -------- .. manim:: GetVerticalLinesToGraph :save_last_frame: class GetVerticalLinesToGraph(Scene): def construct(self): ax = Axes( x_range=[0, 8.0, 1], y_range=[-1, 1, 0.2], axis_config={"font_size": 24}, ).add_coordinates() curve = ax.plot(lambda x: np.sin(x) / np.e ** 2 * x) lines = ax.get_vertical_lines_to_graph( curve, x_range=[0, 4], num_lines=30, color=BLUE ) self.add(ax, curve, lines) """ x_range = x_range if x_range is not None else self.x_range return VGroup( *( self.get_vertical_line(self.i2gp(x, graph), **kwargs) for x in np.linspace(x_range[0], x_range[1], num_lines) ) ) def get_T_label( self, x_val: float, graph: ParametricFunction, label: float | str | Mobject | None = None, label_color: ParsableManimColor | None = None, triangle_size: float = MED_SMALL_BUFF, triangle_color: ParsableManimColor | None = WHITE, line_func: type[Line] = Line, line_color: ParsableManimColor = PURE_YELLOW, ) -> VGroup: """Creates a labelled triangle marker with a vertical line from the x-axis to a curve at a given x-value. Parameters ---------- x_val The position along the curve at which the label, line and triangle will be constructed. graph The :class:`~.ParametricFunction` for which to construct the label. label The label of the vertical line and triangle. label_color The color of the label. triangle_size The size of the triangle. triangle_color The color of the triangle. line_func The function used to construct the vertical line. line_color The color of the vertical line. Returns ------- :class:`~.VGroup` A :class:`~.VGroup` of the label, triangle and vertical line mobjects. Examples -------- .. manim:: TLabelExample :save_last_frame: class TLabelExample(Scene): def construct(self): # defines the axes and linear function axes = Axes(x_range=[-1, 10], y_range=[-1, 10], x_length=9, y_length=6) func = axes.plot(lambda x: x, color=BLUE) # creates the T_label t_label = axes.get_T_label(x_val=4, graph=func, label=Tex("x-value")) self.add(axes, func, t_label) """ T_label_group = VGroup() triangle = RegularPolygon(n=3, start_angle=np.pi / 2, stroke_width=0).set_fill( color=triangle_color, opacity=1, ) triangle.height = triangle_size triangle.move_to(self.coords_to_point(x_val, 0), UP) if label is not None: t_label = self.x_axis._create_label_tex(label, color=label_color) t_label.next_to(triangle, DOWN) T_label_group.add(t_label) v_line = self.get_vertical_line( self.i2gp(x_val, graph), color=line_color, line_func=line_func, ) T_label_group.add(triangle, v_line) return T_label_group def __matmul__(self, coord: Point3DLike | Mobject) -> Point3DLike: if isinstance(coord, Mobject): coord = coord.get_center() return self.coords_to_point(*coord) def __rmatmul__(self, point: Point3DLike) -> Point3DLike: return self.point_to_coords(point) @staticmethod def _origin_shift(axis_range: Sequence[float]) -> float: ... class Axes(VGroup, CoordinateSystem, metaclass=ConvertToOpenGL): """Creates a set of axes. Parameters ---------- x_range The ``(x_min, x_max, x_step)`` values of the x-axis. y_range The ``(y_min, y_max, y_step)`` values of the y-axis. x_length The length of the x-axis. y_length The length of the y-axis. axis_config Arguments to be passed to :class:`~.NumberLine` that influences both axes. x_axis_config Arguments to be passed to :class:`~.NumberLine` that influence the x-axis. y_axis_config Arguments to be passed to :class:`~.NumberLine` that influence the y-axis. tips Whether or not to include the tips on both axes. kwargs Additional arguments to be passed to :class:`CoordinateSystem` and :class:`~.VGroup`. Examples -------- .. manim:: LogScalingExample :save_last_frame: class LogScalingExample(Scene): def construct(self): ax = Axes( x_range=[0, 10, 1], y_range=[-2, 6, 1], tips=False, axis_config={"include_numbers": True}, y_axis_config={"scaling": LogBase(custom_labels=True)}, ) # x_min must be > 0 because log is undefined at 0. graph = ax.plot(lambda x: x ** 2, x_range=[0.001, 10], use_smoothing=False) self.add(ax, graph) Styling arguments can be passed to the underlying :class:`.NumberLine` mobjects that represent the axes: .. manim:: AxesWithDifferentTips :save_last_frame: class AxesWithDifferentTips(Scene): def construct(self): ax = Axes(axis_config={'tip_shape': StealthTip}) self.add(ax) """ def __init__( self, x_range: Sequence[float] | None = None, y_range: Sequence[float] | None = None, x_length: float | None = round(config.frame_width) - 2, y_length: float | None = round(config.frame_height) - 2, axis_config: dict | None = None, x_axis_config: dict | None = None, y_axis_config: dict | None = None, tips: bool = True, **kwargs: Any, ): VGroup.__init__(self, **kwargs) CoordinateSystem.__init__(self, x_range, y_range, x_length, y_length) self.axis_config = { "include_tip": tips, "numbers_to_exclude": [0], } self.x_axis_config: dict[str, Any] = {} self.y_axis_config: dict[str, Any] = { "rotation": 90 * DEGREES, "label_direction": LEFT, } self._update_default_configs( (self.axis_config, self.x_axis_config, self.y_axis_config), (axis_config, x_axis_config, y_axis_config), ) self.x_axis_config = merge_dicts_recursively( self.axis_config, self.x_axis_config, ) self.y_axis_config = merge_dicts_recursively( self.axis_config, self.y_axis_config, ) # excluding the origin tick removes a tick at the 0-point of the axis # This is desired for LinearBase because the 0 point is always the x-axis # For non-LinearBase, the "0-point" does not have this quality, so it must be included. # i.e. with LogBase range [-2, 4]: # it would remove the "0" tick, which is actually 10^0, # not the lowest tick on the graph (which is 10^-2). if self.x_axis_config.get("scaling") is None or isinstance( self.x_axis_config.get("scaling"), LinearBase ): self.x_axis_config["exclude_origin_tick"] = True else: self.x_axis_config["exclude_origin_tick"] = False if self.y_axis_config.get("scaling") is None or isinstance( self.y_axis_config.get("scaling"), LinearBase ): self.y_axis_config["exclude_origin_tick"] = True else: self.y_axis_config["exclude_origin_tick"] = False self.x_axis = self._create_axis(self.x_range, self.x_axis_config, self.x_length) self.y_axis = self._create_axis(self.y_range, self.y_axis_config, self.y_length) # Add as a separate group in case various other # mobjects are added to self, as for example in # NumberPlane below self.axes = VGroup(self.x_axis, self.y_axis) self.add(*self.axes) # finds the middle-point on each axis lines_center_point = [ axis.scaling.function((axis.x_range[1] + axis.x_range[0]) / 2) for axis in self.axes ] self.shift(-self.coords_to_point(*lines_center_point)) @staticmethod def _update_default_configs( default_configs: tuple[dict[Any, Any]], passed_configs: tuple[dict[Any, Any]] ) -> None: """Takes in two tuples of dicts and return modifies the first such that values from ``passed_configs`` overwrite values in ``default_configs``. If a key does not exist in default_configs, it is added to the dict. This method is useful for having defaults in a class and being able to overwrite them with user-defined input. Parameters ---------- default_configs The dict that will be updated. passed_configs The dict that will be used to update. Examples -------- To create a tuple with one dictionary, add a comma after the element: .. code-block:: python self._update_default_configs( (dict_1,)( dict_2, ) ) """ for default_config, passed_config in zip( default_configs, passed_configs, strict=False ): if passed_config is not None: update_dict_recursively(default_config, passed_config) def _create_axis( self, range_terms: Sequence[float], axis_config: dict[str, Any], length: float, ) -> NumberLine: """Creates an axis and dynamically adjusts its position depending on where 0 is located on the line. Parameters ---------- range_terms The range of the the axis : ``(x_min, x_max, x_step)``. axis_config Additional parameters that are passed to :class:`~.NumberLine`. length The length of the axis. Returns ------- :class:`NumberLine` Returns a number line based on ``range_terms``. """ axis_config["length"] = length axis = NumberLine(range_terms, **axis_config) # without the call to _origin_shift, graph does not exist when min > 0 or max < 0 # shifts the axis so that 0 is centered axis.shift(-axis.number_to_point(self._origin_shift([axis.x_min, axis.x_max]))) return axis def coords_to_point( self, *coords: float | Sequence[float] | Sequence[Sequence[float]] | np.ndarray ) -> np.ndarray: """Accepts coordinates from the axes and returns a point with respect to the scene. Equivalent to `ax @ (coord1)` Parameters ---------- coords The coordinates. Each coord is passed as a separate argument: ``ax.coords_to_point(1, 2, 3)``. Also accepts a list of coordinates ``ax.coords_to_point( [x_0, x_1, ...], [y_0, y_1, ...], ... )`` ``ax.coords_to_point( [[x_0, y_0, z_0], [x_1, y_1, z_1]] )`` A single coordinate can also be passed as a flat list or 1D array: ``ax.coords_to_point( [x, y, z] )`` Returns ------- np.ndarray A point with respect to the scene's coordinate system. The shape of the array will be similar to the shape of the input. Examples -------- .. code-block:: pycon >>> from manim import Axes >>> import numpy as np >>> ax = Axes() >>> np.around(ax.coords_to_point(1, 0, 0), 2) array([0.86, 0. , 0. ]) >>> np.around(ax @ (1, 0, 0), 2) array([0.86, 0. , 0. ]) >>> np.around(ax.coords_to_point([[0, 1], [1, 1], [1, 0]]), 2) array([[0. , 0.75, 0. ], [0.86, 0.75, 0. ], [0.86, 0. , 0. ]]) >>> np.around( ... ax.coords_to_point([0, 1, 1], [1, 1, 0]), 2 ... ) # Transposed version of the above array([[0. , 0.86, 0.86], [0.75, 0.75, 0. ], [0. , 0. , 0. ]]) >>> np.around(ax.coords_to_point([1, 0, 0]), 2) array([0.86, 0. , 0. ]) >>> np.around(ax.coords_to_point(np.array([1, 0])), 2) array([0.86, 0. , 0. ]) .. manim:: CoordsToPointExample :save_last_frame: class CoordsToPointExample(Scene): def construct(self): ax = Axes().add_coordinates() # a dot with respect to the axes dot_axes = Dot(ax.coords_to_point(2, 2), color=GREEN) lines = ax.get_lines_to_point(ax.c2p(2,2)) # a dot with respect to the scene # the default plane corresponds to the coordinates of the scene. plane = NumberPlane() dot_scene = Dot((2,2,0), color=RED) self.add(plane, dot_scene, ax, dot_axes, lines) """ coords = np.asarray(coords) origin = self.x_axis.number_to_point( self._origin_shift([self.x_axis.x_min, self.x_axis.x_max]), ) # Is coords in the format ([[x1 y1 z1] [x2 y2 z2] ...])? (True) # Or is coords in the format (x, y, z) or ([x1 x2 ...], [y1 y2 ...], [z1 z2 ...])? (False) # The latter is preferred. are_coordinates_transposed = False # If coords is in the format ([[x1 y1 z1] [x2 y2 z2] ...]): if coords.ndim == 3: # Extract from original tuple: now coords looks like [[x y z]] or [[x1 y1 z1] [x2 y2 z2] ...]. coords = coords[0] # If there's a single coord (coords = [[x y z]]), extract it so that # coords = [x y z] and coords_to_point returns a single point. if coords.shape[0] == 1: coords = coords[0] # Else, if coords looks more like [[x1 y1 z1] [x2 y2 z2] ...], transform them (by # transposing) into the format [[x1 x2 ...] [y1 y2 ...] [z1 z2 ...]] for later processing. else: coords = coords.T are_coordinates_transposed = True # If coords is in the format ([x, y, z]) -- a single flat list/array passed as one argument: elif coords.ndim == 2 and coords.shape[0] == 1: # Extract the single list so [x, y, z] is treated like c2p(x, y, z). coords = coords[0] # Otherwise, coords already looked like (x, y, z) or ([x1 x2 ...], [y1 y2 ...], [z1 z2 ...]), # so no further processing is needed. # Now coords should either look like [x y z] or [[x1 x2 ...] [y1 y2 ...] [z1 z2 ...]], # so it can be iterated directly. Each element is either a float representing a single # coordinate, or a float ndarray of coordinates corresponding to a single axis. # Although "points" and "nums" are in plural, there might be a single point or number. points = self.x_axis.number_to_point(coords[0]) other_axes = self.axes.submobjects[1:] for axis, nums in zip(other_axes, coords[1:], strict=False): points += axis.number_to_point(nums) - origin # Return points as is, except if coords originally looked like # ([x1 x2 ...], [y1 y2 ...], [z1 z2 ...]), which is determined by the conditions below. In # that case, the current implementation requires that the results have to be transposed. if are_coordinates_transposed or points.ndim == 1: return points return points.T def point_to_coords(self, point: Sequence[float]) -> np.ndarray: """Accepts a point from the scene and returns its coordinates with respect to the axes. Parameters ---------- point The point, i.e. ``RIGHT`` or ``[0, 1, 0]``. Also accepts a list of points as ``[RIGHT, [0, 1, 0]]``. Returns ------- np.ndarray[float] The coordinates on the axes, i.e. ``[4.0, 7.0]``. Or a list of coordinates if `point` is a list of points. Examples -------- .. code-block:: pycon >>> from manim import Axes, RIGHT >>> import numpy as np >>> ax = Axes(x_range=[0, 10, 2]) >>> np.around(ax.point_to_coords(RIGHT), 2) array([5.83, 0. ]) >>> np.around(ax.point_to_coords([[0, 0, 1], [1, 0, 0]]), 2) array([[5. , 0. ], [5.83, 0. ]]) .. manim:: PointToCoordsExample :save_last_frame: class PointToCoordsExample(Scene): def construct(self): ax = Axes(x_range=[0, 10, 2]).add_coordinates() circ = Circle(radius=0.5).shift(UR * 2) # get the coordinates of the circle with respect to the axes coords = np.around(ax.point_to_coords(circ.get_right()), decimals=2) label = ( Matrix([[coords[0]], [coords[1]]]).scale(0.75).next_to(circ, RIGHT) ) self.add(ax, circ, label, Dot(circ.get_right())) """ point = np.asarray(point) result = np.asarray([axis.point_to_number(point) for axis in self.get_axes()]) if point.ndim == 2: return result.T return result def get_axes(self) -> VGroup: """Gets the axes. Returns ------- :class:`~.VGroup` A pair of axes. """ return self.axes def get_axis_labels( self, x_label: float | str | Mobject = "x", y_label: float | str | Mobject = "y", ) -> VGroup: """Defines labels for the x-axis and y-axis of the graph. For increased control over the position of the labels, use :meth:`~.CoordinateSystem.get_x_axis_label` and :meth:`~.CoordinateSystem.get_y_axis_label`. Parameters ---------- x_label The label for the x_axis. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. y_label The label for the y_axis. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. Returns ------- :class:`~.VGroup` A :class:`~.VGroup` of the labels for the x_axis and y_axis. .. seealso:: :meth:`~.CoordinateSystem.get_x_axis_label` :meth:`~.CoordinateSystem.get_y_axis_label` Examples -------- .. manim:: GetAxisLabelsExample :save_last_frame: class GetAxisLabelsExample(Scene): def construct(self): ax = Axes() labels = ax.get_axis_labels( Tex("x-axis").scale(0.7), Text("y-axis").scale(0.45) ) self.add(ax, labels) """ self.axis_labels = VGroup( self.get_x_axis_label(x_label), self.get_y_axis_label(y_label), ) return self.axis_labels def plot_line_graph( self, x_values: Iterable[float], y_values: Iterable[float], z_values: Iterable[float] | None = None, line_color: ParsableManimColor = PURE_YELLOW, add_vertex_dots: bool = True, vertex_dot_radius: float = DEFAULT_DOT_RADIUS, vertex_dot_style: dict[str, Any] | None = None, **kwargs: Any, ) -> VDict: """Draws a line graph. The graph connects the vertices formed from zipping ``x_values``, ``y_values`` and ``z_values``. Also adds :class:`Dots <.Dot>` at the vertices if ``add_vertex_dots`` is set to ``True``. Parameters ---------- x_values Iterable of values along the x-axis. y_values Iterable of values along the y-axis. z_values Iterable of values (zeros if z_values is None) along the z-axis. line_color Color for the line graph. add_vertex_dots Whether or not to add :class:`~.Dot` at each vertex. vertex_dot_radius Radius for the :class:`~.Dot` at each vertex. vertex_dot_style Style arguments to be passed into :class:`~.Dot` at each vertex. kwargs Additional arguments to be passed into :class:`~.VMobject`. Returns ------- :class:`~.VDict` A VDict containing both the line and dots (if specified). The line can be accessed with: ``line_graph["line_graph"]``. The dots can be accessed with: ``line_graph["vertex_dots"]``. Examples -------- .. manim:: LineGraphExample :save_last_frame: class LineGraphExample(Scene): def construct(self): plane = NumberPlane( x_range = (0, 7), y_range = (0, 5), x_length = 7, axis_config={"include_numbers": True}, ) plane.center() line_graph = plane.plot_line_graph( x_values = [0, 1.5, 2, 2.8, 4, 6.25], y_values = [1, 3, 2.25, 4, 2.5, 1.75], line_color=GOLD_E, vertex_dot_style=dict(stroke_width=3, fill_color=PURPLE), stroke_width = 4, ) self.add(plane, line_graph) """ x_values, y_values = map(np.array, (x_values, y_values)) if z_values is None: z_values = np.zeros(x_values.shape) line_graph = VDict() graph = VGroup(color=line_color, **kwargs) vertices = [ self.coords_to_point(x, y, z) for x, y, z in zip(x_values, y_values, z_values, strict=True) ] graph.set_points_as_corners(vertices) line_graph["line_graph"] = graph if add_vertex_dots: vertex_dot_style = vertex_dot_style or {} vertex_dots = VGroup( *( Dot(point=vertex, radius=vertex_dot_radius, **vertex_dot_style) for vertex in vertices ) ) line_graph["vertex_dots"] = vertex_dots return line_graph @staticmethod def _origin_shift(axis_range: Sequence[float]) -> float: """Determines how to shift graph mobjects to compensate when 0 is not on the axis. Parameters ---------- axis_range The range of the axis : ``(x_min, x_max, x_step)``. """ if axis_range[0] > 0: # min greater than 0 return axis_range[0] if axis_range[1] < 0: # max less than 0 return axis_range[1] else: return 0 class ThreeDAxes(Axes): """A 3-dimensional set of axes. Parameters ---------- x_range The ``[x_min, x_max, x_step]`` values of the x-axis. y_range The ``[y_min, y_max, y_step]`` values of the y-axis. z_range The ``[z_min, z_max, z_step]`` values of the z-axis. x_length The length of the x-axis. y_length The length of the y-axis. z_length The length of the z-axis. z_axis_config Arguments to be passed to :class:`~.NumberLine` that influence the z-axis. z_normal The direction of the normal. num_axis_pieces The number of pieces used to construct the axes. light_source The direction of the light source. depth Currently non-functional. gloss Currently non-functional. kwargs Additional arguments to be passed to :class:`Axes`. """ def __init__( self, x_range: Sequence[float] | None = (-6, 6, 1), y_range: Sequence[float] | None = (-5, 5, 1), z_range: Sequence[float] | None = (-4, 4, 1), x_length: float | None = config.frame_height + 2.5, y_length: float | None = config.frame_height + 2.5, z_length: float | None = config.frame_height - 1.5, z_axis_config: dict[str, Any] | None = None, z_normal: Vector3DLike = DOWN, num_axis_pieces: int = 20, light_source: Point3DLike = 9 * DOWN + 7 * LEFT + 10 * OUT, # opengl stuff (?) depth: Any = None, gloss: float = 0.5, **kwargs: dict[str, Any], ): super().__init__( x_range=x_range, x_length=x_length, y_range=y_range, y_length=y_length, **kwargs, ) self.z_range = z_range self.z_length = z_length self.z_axis_config: dict[str, Any] = {} self._update_default_configs((self.z_axis_config,), (z_axis_config,)) self.z_axis_config = merge_dicts_recursively( self.axis_config, self.z_axis_config, ) self.z_normal = z_normal self.num_axis_pieces = num_axis_pieces self.light_source = np.array(light_source) self.dimension = 3 if self.z_axis_config.get("scaling") is None or isinstance( self.z_axis_config.get("scaling"), LinearBase ): self.z_axis_config["exclude_origin_tick"] = True else: self.z_axis_config["exclude_origin_tick"] = False z_axis = self._create_axis(self.z_range, self.z_axis_config, self.z_length) # [ax.x_min, ax.x_max] used to account for LogBase() scaling # where ax.x_range[0] != ax.x_min z_origin = self._origin_shift([z_axis.x_min, z_axis.x_max]) z_axis.rotate_about_number(z_origin, -PI / 2, UP) z_axis.rotate_about_number(z_origin, angle_of_vector(self.z_normal)) z_axis.shift(-z_axis.number_to_point(z_origin)) z_axis.shift( self.x_axis.number_to_point( self._origin_shift([self.x_axis.x_min, self.x_axis.x_max]), ), ) self.axes.add(z_axis) self.add(z_axis) self.z_axis = z_axis if config.renderer == RendererType.CAIRO: self._add_3d_pieces() self._set_axis_shading() def _add_3d_pieces(self) -> None: for axis in self.axes: axis.pieces = VGroup(*axis.get_pieces(self.num_axis_pieces)) axis.add(axis.pieces) axis.set_stroke(width=0, family=False) axis.set_shade_in_3d(True) def _set_axis_shading(self) -> None: def make_func(axis): vect = self.light_source return lambda: ( axis.get_edge_center(-vect), axis.get_edge_center(vect), ) for axis in self: for submob in axis.family_members_with_points(): submob.get_gradient_start_and_end_points = make_func(axis) submob.get_unit_normal = lambda a: np.ones(3) submob.set_sheen(0.2) def get_y_axis_label( self, label: float | str | VMobject, edge: Vector3DLike = UR, direction: Vector3DLike = UR, buff: float = SMALL_BUFF, rotation: float = PI / 2, rotation_axis: Vector3DLike = OUT, **kwargs: dict[str, Any], ) -> Mobject: """Generate a y-axis label. Parameters ---------- label The label. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. edge The edge of the y-axis to which the label will be added, by default ``UR``. direction Allows for further positioning of the label from an edge, by default ``UR``. buff The distance of the label from the line, by default ``SMALL_BUFF``. rotation The angle at which to rotate the label, by default ``PI/2``. rotation_axis The axis about which to rotate the label, by default ``OUT``. Returns ------- :class:`~.Mobject` The positioned label. Examples -------- .. manim:: GetYAxisLabelExample :save_last_frame: class GetYAxisLabelExample(ThreeDScene): def construct(self): ax = ThreeDAxes() lab = ax.get_y_axis_label(Tex("$y$-label")) self.set_camera_orientation(phi=2*PI/5, theta=PI/5) self.add(ax, lab) """ positioned_label = self._get_axis_label( label, self.get_y_axis(), edge, direction, buff=buff, **kwargs ) positioned_label.rotate(rotation, axis=rotation_axis) return positioned_label def get_z_axis_label( self, label: float | str | VMobject, edge: Vector3DLike = OUT, direction: Vector3DLike = RIGHT, buff: float = SMALL_BUFF, rotation: float = PI / 2, rotation_axis: Vector3DLike = RIGHT, **kwargs: Any, ) -> Mobject: """Generate a z-axis label. Parameters ---------- label The label. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. edge The edge of the z-axis to which the label will be added, by default ``OUT``. direction Allows for further positioning of the label from an edge, by default ``RIGHT``. buff The distance of the label from the line, by default ``SMALL_BUFF``. rotation The angle at which to rotate the label, by default ``PI/2``. rotation_axis The axis about which to rotate the label, by default ``RIGHT``. Returns ------- :class:`~.Mobject` The positioned label. Examples -------- .. manim:: GetZAxisLabelExample :save_last_frame: class GetZAxisLabelExample(ThreeDScene): def construct(self): ax = ThreeDAxes() lab = ax.get_z_axis_label(Tex("$z$-label")) self.set_camera_orientation(phi=2*PI/5, theta=PI/5) self.add(ax, lab) """ positioned_label = self._get_axis_label( label, self.get_z_axis(), edge, direction, buff=buff, **kwargs ) positioned_label.rotate(rotation, axis=rotation_axis) return positioned_label def get_axis_labels( self, x_label: float | str | VMobject = "x", y_label: float | str | VMobject = "y", z_label: float | str | VMobject = "z", ) -> VGroup: """Defines labels for the x_axis and y_axis of the graph. For increased control over the position of the labels, use :meth:`~.CoordinateSystem.get_x_axis_label`, :meth:`~.ThreeDAxes.get_y_axis_label`, and :meth:`~.ThreeDAxes.get_z_axis_label`. Parameters ---------- x_label The label for the x_axis. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. y_label The label for the y_axis. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. z_label The label for the z_axis. Defaults to :class:`~.MathTex` for ``str`` and ``float`` inputs. Returns ------- :class:`~.VGroup` A :class:`~.VGroup` of the labels for the x_axis, y_axis, and z_axis. .. seealso:: :meth:`~.CoordinateSystem.get_x_axis_label` :meth:`~.ThreeDAxes.get_y_axis_label` :meth:`~.ThreeDAxes.get_z_axis_label` Examples -------- .. manim:: GetAxisLabelsExample :save_last_frame: class GetAxisLabelsExample(ThreeDScene): def construct(self): self.set_camera_orientation(phi=2*PI/5, theta=PI/5) axes = ThreeDAxes() labels = axes.get_axis_labels( Text("x-axis").scale(0.7), Text("y-axis").scale(0.45), Text("z-axis").scale(0.45) ) self.add(axes, labels) """ self.axis_labels = VGroup( self.get_x_axis_label(x_label), self.get_y_axis_label(y_label), self.get_z_axis_label(z_label), ) return self.axis_labels class NumberPlane(Axes): """Creates a cartesian plane with background lines. Parameters ---------- x_range The ``[x_min, x_max, x_step]`` values of the plane in the horizontal direction. y_range The ``[y_min, y_max, y_step]`` values of the plane in the vertical direction. x_length The width of the plane. y_length The height of the plane. background_line_style Arguments that influence the construction of the background lines of the plane. faded_line_style Similar to :attr:`background_line_style`, affects the construction of the scene's background lines. faded_line_ratio Determines the number of boxes within the background lines: :code:`2` = 4 boxes, :code:`3` = 9 boxes. make_smooth_after_applying_functions Currently non-functional. kwargs Additional arguments to be passed to :class:`Axes`. .. note:: If :attr:`x_length` or :attr:`y_length` are not defined, they are automatically calculated such that one unit on each axis is one Manim unit long. Examples -------- .. manim:: NumberPlaneExample :save_last_frame: class NumberPlaneExample(Scene): def construct(self): number_plane = NumberPlane( background_line_style={ "stroke_color": TEAL, "stroke_width": 4, "stroke_opacity": 0.6 } ) self.add(number_plane) .. manim:: NumberPlaneScaled :save_last_frame: class NumberPlaneScaled(Scene): def construct(self): number_plane = NumberPlane( x_range=(-4, 11, 1), y_range=(-3, 3, 1), x_length=5, y_length=2, ).move_to(LEFT*3) number_plane_scaled_y = NumberPlane( x_range=(-4, 11, 1), x_length=5, y_length=4, ).move_to(RIGHT*3) self.add(number_plane) self.add(number_plane_scaled_y) """ def __init__( self, x_range: Sequence[float] | None = ( -config["frame_x_radius"], config["frame_x_radius"], 1, ), y_range: Sequence[float] | None = ( -config["frame_y_radius"], config["frame_y_radius"], 1, ), x_length: float | None = None, y_length: float | None = None, background_line_style: dict[str, Any] | None = None, faded_line_style: dict[str, Any] | None = None, faded_line_ratio: int = 1, make_smooth_after_applying_functions: bool = True, **kwargs: dict[str, Any], ): # configs self.axis_config: dict[str, Any] = { "stroke_width": 2, "include_ticks": False, "include_tip": False, "line_to_number_buff": SMALL_BUFF, "label_direction": DR, "font_size": 24, } self.y_axis_config: dict[str, Any] = {"label_direction": DR} self.background_line_style: dict[str, Any] = { "stroke_color": BLUE_D, "stroke_width": 2, "stroke_opacity": 1, } self._update_default_configs( (self.axis_config, self.y_axis_config, self.background_line_style), ( kwargs.pop("axis_config", None), kwargs.pop("y_axis_config", None), background_line_style, ), ) # Defaults to a faded version of line_config self.faded_line_style = faded_line_style self.faded_line_ratio = faded_line_ratio self.make_smooth_after_applying_functions = make_smooth_after_applying_functions # init super().__init__( x_range=x_range, y_range=y_range, x_length=x_length, y_length=y_length, axis_config=self.axis_config, y_axis_config=self.y_axis_config, **kwargs, ) self._init_background_lines() def _init_background_lines(self) -> None: """Will init all the lines of NumberPlanes (faded or not)""" if self.faded_line_style is None: style = dict(self.background_line_style) # For anything numerical, like stroke_width # and stroke_opacity, chop it in half for key in style: if isinstance(style[key], numbers.Number): style[key] *= 0.5 self.faded_line_style = style self.background_lines, self.faded_lines = self._get_lines() self.background_lines.set_style( **self.background_line_style, ) self.faded_lines.set_style( **self.faded_line_style, ) self.add_to_back( self.faded_lines, self.background_lines, ) def _get_lines(self) -> tuple[VGroup, VGroup]: """Generate all the lines, faded and not faded. Two sets of lines are generated: one parallel to the X-axis, and parallel to the Y-axis. Returns ------- Tuple[:class:`~.VGroup`, :class:`~.VGroup`] The first (i.e the non faded lines) and second (i.e the faded lines) sets of lines, respectively. """ x_axis = self.get_x_axis() y_axis = self.get_y_axis() x_lines1, x_lines2 = self._get_lines_parallel_to_axis( x_axis, y_axis, self.y_axis.x_range[2], self.faded_line_ratio, ) y_lines1, y_lines2 = self._get_lines_parallel_to_axis( y_axis, x_axis, self.x_axis.x_range[2], self.faded_line_ratio, ) # TODO this was added so that we can run tests on NumberPlane # In the future these attributes will be tacked onto self.background_lines self.x_lines = x_lines1 self.y_lines = y_lines1 lines1 = VGroup(*x_lines1, *y_lines1) lines2 = VGroup(*x_lines2, *y_lines2) return lines1, lines2 def _get_lines_parallel_to_axis( self, axis_parallel_to: NumberLine, axis_perpendicular_to: NumberLine, freq: float, ratio_faded_lines: int, ) -> tuple[VGroup, VGroup]: """Generate a set of lines parallel to an axis. Parameters ---------- axis_parallel_to The axis with which the lines will be parallel. axis_perpendicular_to The axis with which the lines will be perpendicular. ratio_faded_lines The ratio between the space between faded lines and the space between non-faded lines. freq Frequency of non-faded lines (number of non-faded lines per graph unit). Returns ------- Tuple[:class:`~.VGroup`, :class:`~.VGroup`] The first (i.e the non-faded lines parallel to `axis_parallel_to`) and second (i.e the faded lines parallel to `axis_parallel_to`) sets of lines, respectively. """ line = Line(axis_parallel_to.get_start(), axis_parallel_to.get_end()) if ratio_faded_lines == 0: # don't show faded lines ratio_faded_lines = 1 # i.e. set ratio to 1 step = (1 / ratio_faded_lines) * freq lines1 = VGroup() lines2 = VGroup() unit_vector_axis_perp_to = axis_perpendicular_to.get_unit_vector() # need to unpack all three values x_min, x_max, _ = axis_perpendicular_to.x_range # account for different axis scalings (logarithmic), where # negative values do not exist and [-2 , 4] should output lines # similar to [0, 6] if axis_perpendicular_to.x_min > 0 and x_min < 0: x_min, x_max = (0, np.abs(x_min) + np.abs(x_max)) # min/max used in case range does not include 0. i.e. if (2,6): # the range becomes (0,4), not (0,6). ranges = ( [0], np.arange(step, min(x_max - x_min, x_max), step), np.arange(-step, max(x_min - x_max, x_min), -step), ) for inputs in ranges: for k, x in enumerate(inputs): new_line = line.copy() new_line.shift(unit_vector_axis_perp_to * x) if (k + 1) % ratio_faded_lines == 0: lines1.add(new_line) else: lines2.add(new_line) return lines1, lines2 def get_vector(self, coords: Sequence[ManimFloat], **kwargs: Any) -> Arrow: kwargs["buff"] = 0 return Arrow( self.coords_to_point(0, 0), self.coords_to_point(*coords), **kwargs ) def prepare_for_nonlinear_transform(self, num_inserted_curves: int = 50) -> Self: for mob in self.family_members_with_points(): num_curves = mob.get_num_curves() if num_inserted_curves > num_curves: mob.insert_n_curves(num_inserted_curves - num_curves) return self class PolarPlane(Axes): r"""Creates a polar plane with background lines. Parameters ---------- azimuth_step The number of divisions in the azimuth (also known as the `angular coordinate` or `polar angle`). If ``None`` is specified then it will use the default specified by ``azimuth_units``: - ``"PI radians"`` or ``"TAU radians"``: 20 - ``"degrees"``: 36 - ``"gradians"``: 40 - ``None``: 1 A non-integer value will result in a partial division at the end of the circle. size The diameter of the plane. radius_step The distance between faded radius lines. radius_max The maximum value of the radius. azimuth_units Specifies a default labelling system for the azimuth. Choices are: - ``"PI radians"``: Fractional labels in the interval :math:`\left[0, 2\pi\right]` with :math:`\pi` as a constant. - ``"TAU radians"``: Fractional labels in the interval :math:`\left[0, \tau\right]` (where :math:`\tau = 2\pi`) with :math:`\tau` as a constant. - ``"degrees"``: Decimal labels in the interval :math:`\left[0, 360\right]` with a degree (:math:`^{\circ}`) symbol. - ``"gradians"``: Decimal labels in the interval :math:`\left[0, 400\right]` with a superscript "g" (:math:`^{g}`). - ``None``: Decimal labels in the interval :math:`\left[0, 1\right]`. azimuth_compact_fraction If the ``azimuth_units`` choice has fractional labels, choose whether to combine the constant in a compact form :math:`\tfrac{xu}{y}` as opposed to :math:`\tfrac{x}{y}u`, where :math:`u` is the constant. azimuth_offset The angle offset of the azimuth, expressed in radians. azimuth_direction The direction of the azimuth. - ``"CW"``: Clockwise. - ``"CCW"``: Anti-clockwise. azimuth_label_buff The buffer for the azimuth labels. azimuth_label_font_size The font size of the azimuth labels. radius_config The axis config for the radius. Examples -------- .. manim:: PolarPlaneExample :ref_classes: PolarPlane :save_last_frame: class PolarPlaneExample(Scene): def construct(self): polarplane_pi = PolarPlane( azimuth_units="PI radians", size=6, azimuth_label_font_size=33.6, radius_config={"font_size": 33.6}, ).add_coordinates() self.add(polarplane_pi) """ def __init__( self, radius_max: float = config["frame_y_radius"], size: float | None = None, radius_step: float = 1, azimuth_step: float | None = None, azimuth_units: str = "PI radians", azimuth_compact_fraction: bool = True, azimuth_offset: float = 0, azimuth_direction: str = "CCW", azimuth_label_buff: float = SMALL_BUFF, azimuth_label_font_size: float = 24, radius_config: dict[str, Any] | None = None, background_line_style: dict[str, Any] | None = None, faded_line_style: dict[str, Any] | None = None, faded_line_ratio: int = 1, make_smooth_after_applying_functions: bool = True, **kwargs: Any, ): # error catching if azimuth_units in ["PI radians", "TAU radians", "degrees", "gradians", None]: self.azimuth_units = azimuth_units else: raise ValueError( "Invalid azimuth units. Expected one of: PI radians, TAU radians, degrees, gradians or None.", ) if azimuth_direction in ["CW", "CCW"]: self.azimuth_direction = azimuth_direction else: raise ValueError("Invalid azimuth units. Expected one of: CW, CCW.") # configs self.radius_config = { "stroke_width": 2, "include_ticks": False, "include_tip": False, "line_to_number_buff": SMALL_BUFF, "label_direction": DL, "font_size": 24, } self.background_line_style = { "stroke_color": BLUE_D, "stroke_width": 2, "stroke_opacity": 1, } self.azimuth_step = ( ( { "PI radians": 20, "TAU radians": 20, "degrees": 36, "gradians": 40, None: 1, }[azimuth_units] ) if azimuth_step is None else azimuth_step ) self._update_default_configs( (self.radius_config, self.background_line_style), (radius_config, background_line_style), ) # Defaults to a faded version of line_config self.faded_line_style = faded_line_style self.faded_line_ratio = faded_line_ratio self.make_smooth_after_applying_functions = make_smooth_after_applying_functions self.azimuth_offset = azimuth_offset self.azimuth_label_buff = azimuth_label_buff self.azimuth_label_font_size = azimuth_label_font_size self.azimuth_compact_fraction = azimuth_compact_fraction # init super().__init__( x_range=np.array((-radius_max, radius_max, radius_step)), y_range=np.array((-radius_max, radius_max, radius_step)), x_length=size, y_length=size, axis_config=self.radius_config, **kwargs, ) self._init_background_lines() def _init_background_lines(self) -> None: """Will init all the lines of NumberPlanes (faded or not)""" if self.faded_line_style is None: style = dict(self.background_line_style) # For anything numerical, like stroke_width # and stroke_opacity, chop it in half for key in style: if isinstance(style[key], numbers.Number): style[key] *= 0.5 self.faded_line_style = style self.background_lines, self.faded_lines = self._get_lines() self.background_lines.set_style( **self.background_line_style, ) self.faded_lines.set_style( **self.faded_line_style, ) self.add_to_back( self.faded_lines, self.background_lines, ) def _get_lines(self) -> tuple[VGroup, VGroup]: """Generate all the lines and circles, faded and not faded. Returns ------- Tuple[:class:`~.VGroup`, :class:`~.VGroup`] The first (i.e the non faded lines and circles) and second (i.e the faded lines and circles) sets of lines and circles, respectively. """ center = self.get_origin() ratio_faded_lines = self.faded_line_ratio offset = self.azimuth_offset if ratio_faded_lines == 0: # don't show faded lines ratio_faded_lines = 1 # i.e. set ratio to 1 rstep = (1 / ratio_faded_lines) * self.x_axis.x_range[2] astep = (1 / ratio_faded_lines) * (TAU * (1 / self.azimuth_step)) rlines1 = VGroup() rlines2 = VGroup() alines1 = VGroup() alines2 = VGroup() rinput = np.arange(0, self.x_axis.x_range[1] + rstep, rstep) ainput = np.arange(0, TAU, astep) unit_vector = self.x_axis.get_unit_vector()[0] for k, x in enumerate(rinput): new_circle = Circle(radius=x * unit_vector) if k % ratio_faded_lines == 0: alines1.add(new_circle) else: alines2.add(new_circle) line = Line(center, self.get_x_axis().get_end()) for k, x in enumerate(ainput): new_line = line.copy() new_line.rotate(x + offset, about_point=center) if k % ratio_faded_lines == 0: rlines1.add(new_line) else: rlines2.add(new_line) lines1 = VGroup(*rlines1, *alines1) lines2 = VGroup(*rlines2, *alines2) return lines1, lines2 def get_axes(self) -> VGroup: """Gets the axes. Returns ------- :class:`~.VGroup` A pair of axes. """ return self.axes def get_vector(self, coords: Sequence[ManimFloat], **kwargs: Any) -> Arrow: kwargs["buff"] = 0 return Arrow( self.coords_to_point(0, 0), self.coords_to_point(*coords), **kwargs ) def prepare_for_nonlinear_transform(self, num_inserted_curves: int = 50) -> Self: for mob in self.family_members_with_points(): num_curves = mob.get_num_curves() if num_inserted_curves > num_curves: mob.insert_n_curves(num_inserted_curves - num_curves) return self def get_coordinate_labels( self, r_values: Iterable[float] | None = None, a_values: Iterable[float] | None = None, **kwargs: Any, ) -> VDict: """Gets labels for the coordinates Parameters ---------- r_values Iterable of values along the radius, by default None. a_values Iterable of values along the azimuth, by default None. Returns ------- VDict Labels for the radius and azimuth values. """ if r_values is None: r_values = [r for r in self.get_x_axis().get_tick_range() if r >= 0] if a_values is None: a_values = np.arange(0, 1, 1 / self.azimuth_step) r_mobs = self.get_x_axis().add_numbers(r_values) if self.azimuth_direction == "CCW": d = 1 elif self.azimuth_direction == "CW": d = -1 else: raise ValueError("Invalid azimuth direction. Expected one of: CW, CCW") a_points = [ { "label": i, "point": np.array( [ self.get_right()[0] * np.cos(d * (i * TAU) + self.azimuth_offset), self.get_right()[0] * np.sin(d * (i * TAU) + self.azimuth_offset), 0, ], ), } for i in a_values ] a_tex = [] if self.azimuth_units == "PI radians" or self.azimuth_units == "TAU radians": a_tex = [ self.get_radian_label( i["label"], font_size=self.azimuth_label_font_size, ).next_to( i["point"], direction=i["point"], aligned_edge=i["point"], buff=self.azimuth_label_buff, ) for i in a_points ] elif self.azimuth_units == "degrees": a_tex = [ MathTex( f"{360 * i['label']:g}" + r"^{\circ}", font_size=self.azimuth_label_font_size, ).next_to( i["point"], direction=i["point"], aligned_edge=i["point"], buff=self.azimuth_label_buff, ) for i in a_points ] elif self.azimuth_units == "gradians": a_tex = [ MathTex( f"{400 * i['label']:g}" + r"^{g}", font_size=self.azimuth_label_font_size, ).next_to( i["point"], direction=i["point"], aligned_edge=i["point"], buff=self.azimuth_label_buff, ) for i in a_points ] elif self.azimuth_units is None: a_tex = [ MathTex( f"{i['label']:g}", font_size=self.azimuth_label_font_size, ).next_to( i["point"], direction=i["point"], aligned_edge=i["point"], buff=self.azimuth_label_buff, ) for i in a_points ] a_mobs = VGroup(*a_tex) self.coordinate_labels = VGroup(r_mobs, a_mobs) return self.coordinate_labels def add_coordinates( self, r_values: Iterable[float] | None = None, a_values: Iterable[float] | None = None, ) -> Self: """Adds the coordinates. Parameters ---------- r_values Iterable of values along the radius, by default None. a_values Iterable of values along the azimuth, by default None. """ self.add(self.get_coordinate_labels(r_values, a_values)) return self def get_radian_label( self, number: float, font_size: float = 24, **kwargs: Any ) -> MathTex: constant_label = {"PI radians": r"\pi", "TAU radians": r"\tau"}[ self.azimuth_units ] division = number * {"PI radians": 2, "TAU radians": 1}[self.azimuth_units] frac = fr.Fraction(division).limit_denominator(max_denominator=100) if frac.numerator == 0 & frac.denominator == 0: string = r"0" elif frac.numerator == 1 and frac.denominator == 1: string = constant_label elif frac.numerator == 1: if self.azimuth_compact_fraction: string = ( r"\tfrac{" + constant_label + r"}{" + str(frac.denominator) + "}" ) else: string = r"\tfrac{1}{" + str(frac.denominator) + "}" + constant_label elif frac.denominator == 1: string = str(frac.numerator) + constant_label else: if self.azimuth_compact_fraction: string = ( r"\tfrac{" + str(frac.numerator) + constant_label + r"}{" + str(frac.denominator) + r"}" ) else: string = ( r"\tfrac{" + str(frac.numerator) + r"}{" + str(frac.denominator) + r"}" + constant_label ) return MathTex(string, font_size=font_size, **kwargs) class ComplexPlane(NumberPlane): """A :class:`~.NumberPlane` specialized for use with complex numbers. Examples -------- .. manim:: ComplexPlaneExample :save_last_frame: :ref_classes: Dot MathTex class ComplexPlaneExample(Scene): def construct(self): plane = ComplexPlane().add_coordinates() self.add(plane) d1 = Dot(plane.n2p(2 + 1j), color=YELLOW) d2 = Dot(plane.n2p(-3 - 2j), color=YELLOW) label1 = MathTex("2+i").next_to(d1, UR, 0.1) label2 = MathTex("-3-2i").next_to(d2, UR, 0.1) self.add( d1, label1, d2, label2, ) """ def __init__(self, **kwargs: Any): super().__init__( **kwargs, ) def number_to_point(self, number: float | complex) -> np.ndarray: """Accepts a float/complex number and returns the equivalent point on the plane. Parameters ---------- number The number. Can be a float or a complex number. Returns ------- np.ndarray The point on the plane. """ number = complex(number) return self.coords_to_point(number.real, number.imag) def n2p(self, number: float | complex) -> np.ndarray: """Abbreviation for :meth:`number_to_point`.""" return self.number_to_point(number) def point_to_number(self, point: Point3DLike) -> complex: """Accepts a point and returns a complex number equivalent to that point on the plane. Parameters ---------- point The point in manim's coordinate-system Returns ------- complex A complex number consisting of real and imaginary components. """ x, y = self.point_to_coords(point) return complex(x, y) def p2n(self, point: Point3DLike) -> complex: """Abbreviation for :meth:`point_to_number`.""" return self.point_to_number(point) def _get_default_coordinate_values(self) -> list[float | complex]: """Generate a list containing the numerical values of the plane's labels. Returns ------- List[float | complex] A list of floats representing the x-axis and complex numbers representing the y-axis. """ x_numbers = self.get_x_axis().get_tick_range() y_numbers = self.get_y_axis().get_tick_range() y_numbers = [complex(0, y) for y in y_numbers if y != 0] return [*x_numbers, *y_numbers] def get_coordinate_labels( self, *numbers: Iterable[float | complex], **kwargs: Any ) -> VGroup: """Generates the :class:`~.DecimalNumber` mobjects for the coordinates of the plane. Parameters ---------- numbers An iterable of floats/complex numbers. Floats are positioned along the x-axis, complex numbers along the y-axis. kwargs Additional arguments to be passed to :meth:`~.NumberLine.get_number_mobject`, i.e. :class:`~.DecimalNumber`. Returns ------- :class:`~.VGroup` A :class:`~.VGroup` containing the positioned label mobjects. """ # TODO: Make this work the same as coord_sys.add_coordinates() if len(numbers) == 0: numbers = self._get_default_coordinate_values() self.coordinate_labels = VGroup() for number in numbers: z = complex(number) if abs(z.imag) > abs(z.real): axis = self.get_y_axis() value = z.imag kwargs["unit"] = "i" else: axis = self.get_x_axis() value = z.real number_mob = axis.get_number_mobject(value, **kwargs) self.coordinate_labels.add(number_mob) return self.coordinate_labels def add_coordinates( self, *numbers: Iterable[float | complex], **kwargs: Any ) -> Self: """Adds the labels produced from :meth:`~.NumberPlane.get_coordinate_labels` to the plane. Parameters ---------- numbers An iterable of floats/complex numbers. Floats are positioned along the x-axis, complex numbers along the y-axis. kwargs Additional arguments to be passed to :meth:`~.NumberLine.get_number_mobject`, i.e. :class:`~.DecimalNumber`. """ self.add(self.get_coordinate_labels(*numbers, **kwargs)) return self ManimCommunity-manim-1157b74/manim/mobject/graphing/functions.py000066400000000000000000000261661515024150700247530ustar00rootroot00000000000000"""Mobjects representing function graphs.""" from __future__ import annotations __all__ = ["ParametricFunction", "FunctionGraph", "ImplicitFunction"] from collections.abc import Callable, Iterable, Sequence from typing import TYPE_CHECKING import numpy as np from isosurfaces import plot_isoline from manim import config from manim.mobject.graphing.scale import LinearBase, _ScaleBase from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VMobject if TYPE_CHECKING: from typing import Any, Self from manim.typing import Point3D, Point3DLike from manim.utils.color import ParsableManimColor from manim.utils.color import PURE_YELLOW class ParametricFunction(VMobject, metaclass=ConvertToOpenGL): """A parametric curve. Parameters ---------- function The function to be plotted in the form of ``(lambda t: (x(t), y(t), z(t)))`` t_range Determines the length that the function spans in the form of (t_min, t_max, step=0.01). By default ``[0, 1]`` scaling Scaling class applied to the points of the function. Default of :class:`~.LinearBase`. use_smoothing Whether to interpolate between the points of the function after they have been created. (Will have odd behaviour with a low number of points) use_vectorized Whether to pass in the generated t value array to the function as ``[t_0, t_1, ...]``. Only use this if your function supports it. Output should be a numpy array of shape ``[[x_0, x_1, ...], [y_0, y_1, ...], [z_0, z_1, ...]]`` but ``z`` can also be 0 if the Axes is 2D discontinuities Values of t at which the function experiences discontinuity. dt The left and right tolerance for the discontinuities. Examples -------- .. manim:: PlotParametricFunction :save_last_frame: class PlotParametricFunction(Scene): def func(self, t): return (np.sin(2 * t), np.sin(3 * t), 0) def construct(self): func = ParametricFunction(self.func, t_range = (0, TAU), fill_opacity=0).set_color(RED) self.add(func.scale(3)) .. manim:: ThreeDParametricSpring :save_last_frame: class ThreeDParametricSpring(ThreeDScene): def construct(self): curve1 = ParametricFunction( lambda u: ( 1.2 * np.cos(u), 1.2 * np.sin(u), u * 0.05 ), color=RED, t_range = (-3*TAU, 5*TAU, 0.01) ).set_shade_in_3d(True) axes = ThreeDAxes() self.add(axes, curve1) self.set_camera_orientation(phi=80 * DEGREES, theta=-60 * DEGREES) self.wait() .. attention:: If your function has discontinuities, you'll have to specify the location of the discontinuities manually. See the following example for guidance. .. manim:: DiscontinuousExample :save_last_frame: class DiscontinuousExample(Scene): def construct(self): ax1 = NumberPlane((-3, 3), (-4, 4)) ax2 = NumberPlane((-3, 3), (-4, 4)) VGroup(ax1, ax2).arrange() discontinuous_function = lambda x: (x ** 2 - 2) / (x ** 2 - 4) incorrect = ax1.plot(discontinuous_function, color=RED) correct = ax2.plot( discontinuous_function, discontinuities=[-2, 2], # discontinuous points dt=0.1, # left and right tolerance of discontinuity color=GREEN, ) self.add(ax1, ax2, incorrect, correct) """ def __init__( self, function: Callable[[float], Point3DLike], t_range: tuple[float, float] | tuple[float, float, float] = (0, 1), scaling: _ScaleBase = LinearBase(), dt: float = 1e-8, discontinuities: Iterable[float] | None = None, use_smoothing: bool = True, use_vectorized: bool = False, **kwargs: Any, ): def internal_parametric_function(t: float) -> Point3D: """Wrap ``function``'s output inside a NumPy array.""" return np.asarray(function(t)) self.function = internal_parametric_function if len(t_range) == 2: t_range = (*t_range, 0.01) self.scaling = scaling self.dt = dt self.discontinuities = discontinuities self.use_smoothing = use_smoothing self.use_vectorized = use_vectorized self.t_min, self.t_max, self.t_step = t_range super().__init__(**kwargs) def get_function(self) -> Callable[[float], Point3D]: return self.function def get_point_from_function(self, t: float) -> Point3D: return self.function(t) def generate_points(self) -> Self: if self.discontinuities is not None: discontinuities = filter( lambda t: self.t_min <= t <= self.t_max, self.discontinuities, ) discontinuities_array = np.array(list(discontinuities)) boundary_times = np.array( [ self.t_min, self.t_max, *(discontinuities_array - self.dt), *(discontinuities_array + self.dt), ], ) boundary_times.sort() else: boundary_times = [self.t_min, self.t_max] for t1, t2 in zip(boundary_times[0::2], boundary_times[1::2], strict=True): t_range = np.array( [ *self.scaling.function(np.arange(t1, t2, self.t_step)), self.scaling.function(t2), ], ) if self.use_vectorized: x, y, z = self.function(t_range) if not isinstance(z, np.ndarray): z = np.zeros_like(x) points = np.stack([x, y, z], axis=1) else: points = np.array([self.function(t) for t in t_range]) self.start_new_path(points[0]) self.add_points_as_corners(points[1:]) if self.use_smoothing: # TODO: not in line with upstream, approx_smooth does not exist self.make_smooth() return self def init_points(self) -> None: self.generate_points() class FunctionGraph(ParametricFunction): """A :class:`ParametricFunction` that spans the length of the scene by default. Examples -------- .. manim:: ExampleFunctionGraph :save_last_frame: class ExampleFunctionGraph(Scene): def construct(self): cos_func = FunctionGraph( lambda t: np.cos(t) + 0.5 * np.cos(7 * t) + (1 / 7) * np.cos(14 * t), color=RED, ) sin_func_1 = FunctionGraph( lambda t: np.sin(t) + 0.5 * np.sin(7 * t) + (1 / 7) * np.sin(14 * t), color=BLUE, ) sin_func_2 = FunctionGraph( lambda t: np.sin(t) + 0.5 * np.sin(7 * t) + (1 / 7) * np.sin(14 * t), x_range=[-4, 4], color=GREEN, ).move_to([0, 1, 0]) self.add(cos_func, sin_func_1, sin_func_2) """ def __init__( self, function: Callable[[float], Any], x_range: tuple[float, float] | tuple[float, float, float] | None = None, color: ParsableManimColor = PURE_YELLOW, **kwargs: Any, ) -> None: if x_range is None: x_range = (-config["frame_x_radius"], config["frame_x_radius"]) self.x_range = x_range self.parametric_function: Callable[[float], Point3D] = lambda t: np.array( [t, function(t), 0] ) self.function = function # type: ignore[assignment] super().__init__(self.parametric_function, self.x_range, color=color, **kwargs) def get_function(self) -> Callable[[float], Any]: return self.function def get_point_from_function(self, x: float) -> Point3D: return self.parametric_function(x) class ImplicitFunction(VMobject, metaclass=ConvertToOpenGL): def __init__( self, func: Callable[[float, float], float], x_range: Sequence[float] | None = None, y_range: Sequence[float] | None = None, min_depth: int = 5, max_quads: int = 1500, use_smoothing: bool = True, **kwargs: Any, ): """An implicit function. Parameters ---------- func The implicit function in the form ``f(x, y) = 0``. x_range The x min and max of the function. y_range The y min and max of the function. min_depth The minimum depth of the function to calculate. max_quads The maximum number of quads to use. use_smoothing Whether or not to smoothen the curves. kwargs Additional parameters to pass into :class:`VMobject` .. note:: A small ``min_depth`` :math:`d` means that some small details might be ignored if they don't cross an edge of one of the :math:`4^d` uniform quads. The value of ``max_quads`` strongly corresponds to the quality of the curve, but a higher number of quads may take longer to render. Examples -------- .. manim:: ImplicitFunctionExample :save_last_frame: class ImplicitFunctionExample(Scene): def construct(self): graph = ImplicitFunction( lambda x, y: x * y ** 2 - x ** 2 * y - 2, color=YELLOW ) self.add(NumberPlane(), graph) """ self.function = func self.min_depth = min_depth self.max_quads = max_quads self.use_smoothing = use_smoothing self.x_range = x_range or [ -config.frame_width / 2, config.frame_width / 2, ] self.y_range = y_range or [ -config.frame_height / 2, config.frame_height / 2, ] super().__init__(**kwargs) def generate_points(self) -> Self: p_min, p_max = ( np.array([self.x_range[0], self.y_range[0]]), np.array([self.x_range[1], self.y_range[1]]), ) curves = plot_isoline( fn=lambda u: self.function(u[0], u[1]), pmin=p_min, pmax=p_max, min_depth=self.min_depth, max_quads=self.max_quads, ) # returns a list of lists of 2D points curves = [ np.pad(curve, [(0, 0), (0, 1)]) for curve in curves if curve != [] ] # add z coord as 0 for curve in curves: self.start_new_path(curve[0]) self.add_points_as_corners(curve[1:]) if self.use_smoothing: self.make_smooth() return self def init_points(self) -> None: self.generate_points() ManimCommunity-manim-1157b74/manim/mobject/graphing/number_line.py000066400000000000000000000605131515024150700252340ustar00rootroot00000000000000"""Mobject representing a number line.""" from __future__ import annotations from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject __all__ = ["NumberLine", "UnitInterval"] from collections.abc import Callable, Iterable, Sequence from typing import TYPE_CHECKING if TYPE_CHECKING: from typing import Any, Self from manim.mobject.geometry.tips import ArrowTip from manim.typing import Point3D, Point3DLike, Vector3D import numpy as np from manim import config from manim.constants import * from manim.mobject.geometry.line import Line from manim.mobject.graphing.scale import LinearBase, _ScaleBase from manim.mobject.text.numbers import DecimalNumber, Integer from manim.mobject.text.tex_mobject import MathTex, Tex from manim.mobject.text.text_mobject import Text from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.utils.bezier import interpolate from manim.utils.config_ops import merge_dicts_recursively from manim.utils.space_ops import normalize class NumberLine(Line): """Creates a number line with tick marks. Parameters ---------- x_range The ``[x_min, x_max, x_step]`` values to create the line. length The length of the number line. unit_size The distance between each tick of the line. Overwritten by :attr:`length`, if specified. include_ticks Whether to include ticks on the number line. tick_size The length of each tick mark. numbers_with_elongated_ticks An iterable of specific values with elongated ticks. longer_tick_multiple Influences how many times larger elongated ticks are than regular ticks (2 = 2x). rotation The angle (in radians) at which the line is rotated. stroke_width The thickness of the line. include_tip Whether to add a tip to the end of the line. tip_width The width of the tip. tip_height The height of the tip. tip_shape The mobject class used to construct the tip, or ``None`` (the default) for the default arrow tip. Passed classes have to inherit from :class:`.ArrowTip`. include_numbers Whether to add numbers to the tick marks. The number of decimal places is determined by the step size, this default can be overridden by ``decimal_number_config``. scaling The way the ``x_range`` is value is scaled, i.e. :class:`~.LogBase` for a logarithmic numberline. Defaults to :class:`~.LinearBase`. font_size The size of the label mobjects. Defaults to 36. label_direction The specific position to which label mobjects are added on the line. label_constructor Determines the mobject class that will be used to construct the labels of the number line. line_to_number_buff The distance between the line and the label mobject. decimal_number_config Arguments that can be passed to :class:`~.numbers.DecimalNumber` to influence number mobjects. numbers_to_exclude An explicit iterable of numbers to not be added to the number line. numbers_to_include An explicit iterable of numbers to add to the number line kwargs Additional arguments to be passed to :class:`~.Line`. .. note:: Number ranges that include both negative and positive values will be generated from the 0 point, and may not include a tick at the min / max values as the tick locations are dependent on the step size. Examples -------- .. manim:: NumberLineExample :save_last_frame: class NumberLineExample(Scene): def construct(self): l0 = NumberLine( x_range=[-10, 10, 2], length=10, color=BLUE, include_numbers=True, label_direction=UP, ) l1 = NumberLine( x_range=[-10, 10, 2], unit_size=0.5, numbers_with_elongated_ticks=[-2, 4], include_numbers=True, font_size=24, ) num6 = l1.numbers[8] num6.set_color(RED) l2 = NumberLine( x_range=[-2.5, 2.5 + 0.5, 0.5], length=12, decimal_number_config={"num_decimal_places": 2}, include_numbers=True, ) l3 = NumberLine( x_range=[-5, 5 + 1, 1], length=6, include_tip=True, include_numbers=True, rotation=10 * DEGREES, ) line_group = VGroup(l0, l1, l2, l3).arrange(DOWN, buff=1) self.add(line_group) """ def __init__( self, x_range: Sequence[float] | None = None, # must be first length: float | None = None, unit_size: float = 1, # ticks include_ticks: bool = True, tick_size: float = 0.1, numbers_with_elongated_ticks: Iterable[float] | None = None, longer_tick_multiple: int = 2, exclude_origin_tick: bool = False, # visuals rotation: float = 0, stroke_width: float = 2.0, # tip include_tip: bool = False, tip_width: float = DEFAULT_ARROW_TIP_LENGTH, tip_height: float = DEFAULT_ARROW_TIP_LENGTH, tip_shape: type[ArrowTip] | None = None, # numbers/labels include_numbers: bool = False, font_size: float = 36, label_direction: Point3DLike = DOWN, label_constructor: type[MathTex] = MathTex, scaling: _ScaleBase = LinearBase(), line_to_number_buff: float = MED_SMALL_BUFF, decimal_number_config: dict | None = None, numbers_to_exclude: Iterable[float] | None = None, numbers_to_include: Iterable[float] | None = None, **kwargs: Any, ): # avoid mutable arguments in defaults if numbers_to_exclude is None: numbers_to_exclude = [] if numbers_with_elongated_ticks is None: numbers_with_elongated_ticks = [] if x_range is None: x_range = [ round(-config["frame_x_radius"]), round(config["frame_x_radius"]), 1, ] elif len(x_range) == 2: # adds x_step if not specified. not sure how to feel about this. a user can't know default without peeking at source code x_range = [*x_range, 1] if decimal_number_config is None: decimal_number_config = { "num_decimal_places": self._decimal_places_from_step(x_range[2]), } # turn into a NumPy array to scale by just applying the function self.x_range = np.array(x_range, dtype=float) self.x_min: float self.x_max: float self.x_step: float self.x_min, self.x_max, self.x_step = scaling.function(self.x_range) self.length = length self.unit_size = unit_size # ticks self.include_ticks = include_ticks self.tick_size = tick_size self.numbers_with_elongated_ticks = numbers_with_elongated_ticks self.longer_tick_multiple = longer_tick_multiple self.exclude_origin_tick = exclude_origin_tick # visuals self.rotation = rotation # tip self.include_tip = include_tip self.tip_width = tip_width self.tip_height = tip_height # numbers self.font_size = font_size self.include_numbers = include_numbers self.label_direction = label_direction self.label_constructor = label_constructor self.line_to_number_buff = line_to_number_buff self.decimal_number_config = decimal_number_config self.numbers_to_exclude = numbers_to_exclude self.numbers_to_include = numbers_to_include self.scaling = scaling super().__init__( self.x_range[0] * RIGHT, self.x_range[1] * RIGHT, stroke_width=stroke_width, **kwargs, ) if self.length: self.set_length(self.length) self.unit_size = self.get_unit_size() else: self.scale(self.unit_size) self.center() if self.include_tip: self.add_tip( tip_length=self.tip_height, tip_width=self.tip_width, tip_shape=tip_shape, ) self.tip.set_stroke(self.stroke_color, self.stroke_width) if self.include_ticks: self.add_ticks() self.rotate(self.rotation) if self.include_numbers or self.numbers_to_include is not None: if self.scaling.custom_labels: tick_range = self.get_tick_range() custom_labels = self.scaling.get_custom_labels( tick_range, unit_decimal_places=decimal_number_config["num_decimal_places"], ) self.add_labels( dict( zip( tick_range, custom_labels, strict=True, ) ), ) else: self.add_numbers( x_values=self.numbers_to_include, excluding=self.numbers_to_exclude, font_size=self.font_size, ) def rotate_about_zero( self, angle: float, axis: Vector3D = OUT, **kwargs: Any ) -> Self: return self.rotate_about_number(0, angle, axis, **kwargs) def rotate_about_number( self, number: float, angle: float, axis: Vector3D = OUT, **kwargs: Any ) -> Self: return self.rotate(angle, axis, about_point=self.n2p(number), **kwargs) def add_ticks(self) -> None: """Adds ticks to the number line. Ticks can be accessed after creation via ``self.ticks``. """ ticks = VGroup() elongated_tick_size = self.tick_size * self.longer_tick_multiple elongated_tick_offsets = ( np.array(self.numbers_with_elongated_ticks) - self.x_min ) for x in self.get_tick_range(): size = self.tick_size if np.any(np.isclose(x - self.x_min, elongated_tick_offsets)): size = elongated_tick_size ticks.add(self.get_tick(x, size)) self.add(ticks) self.ticks = ticks def get_tick(self, x: float, size: float | None = None) -> Line: """Generates a tick and positions it along the number line. Parameters ---------- x The position of the tick. size The factor by which the tick is scaled. Returns ------- :class:`~.Line` A positioned tick. """ if size is None: size = self.tick_size result = Line(size * DOWN, size * UP) result.rotate(self.get_angle()) result.move_to(self.number_to_point(x)) result.match_style(self) return result def get_tick_marks(self) -> VGroup: return self.ticks def get_tick_range(self) -> np.ndarray: """Generates the range of values on which labels are plotted based on the ``x_range`` attribute of the number line. Returns ------- np.ndarray A numpy array of floats represnting values along the number line. """ x_min, x_max, x_step = self.x_range if not self.include_tip: x_max += 1e-6 # Handle cases where min and max are both positive or both negative if x_min < x_max < 0 or x_max > x_min > 0: tick_range = np.arange(x_min, x_max, x_step) else: start_point = 0 if self.exclude_origin_tick: start_point += x_step x_min_segment = np.arange(start_point, np.abs(x_min) + 1e-6, x_step) * -1 x_max_segment = np.arange(start_point, x_max, x_step) tick_range = np.unique(np.concatenate((x_min_segment, x_max_segment))) return self.scaling.function(tick_range) def number_to_point(self, number: float | np.ndarray) -> np.ndarray: """Accepts a value along the number line and returns a point with respect to the scene. Equivalent to `NumberLine @ number` Parameters ---------- number The value to be transformed into a coordinate. Or a list of values. Returns ------- np.ndarray A point with respect to the scene's coordinate system. Or a list of points. Examples -------- >>> from manim import NumberLine >>> number_line = NumberLine() >>> number_line.number_to_point(0) array([0., 0., 0.]) >>> number_line.number_to_point(1) array([1., 0., 0.]) >>> number_line @ 1 array([1., 0., 0.]) >>> number_line.number_to_point([1, 2, 3]) array([[1., 0., 0.], [2., 0., 0.], [3., 0., 0.]]) """ number = np.asarray(number) scalar = number.ndim == 0 number = self.scaling.inverse_function(number) alphas = (number - self.x_range[0]) / (self.x_range[1] - self.x_range[0]) alphas = float(alphas) if scalar else np.vstack(alphas) val = interpolate(self.get_start(), self.get_end(), alphas) return val def point_to_number(self, point: Sequence[float]) -> float: """Accepts a point with respect to the scene and returns a float along the number line. Parameters ---------- point A sequence of values consisting of ``(x_coord, y_coord, z_coord)``. Returns ------- float A float representing a value along the number line. Examples -------- >>> from manim import NumberLine >>> number_line = NumberLine() >>> number_line.point_to_number((0, 0, 0)) np.float64(0.0) >>> number_line.point_to_number((1, 0, 0)) np.float64(1.0) >>> number_line.point_to_number([[0.5, 0, 0], [1, 0, 0], [1.5, 0, 0]]) array([0.5, 1. , 1.5]) """ point = np.asarray(point) start, end = self.get_start_and_end() unit_vect = normalize(end - start) proportion: float = np.dot(point - start, unit_vect) / np.dot( end - start, unit_vect ) return interpolate(self.x_min, self.x_max, proportion) def n2p(self, number: float | np.ndarray) -> Point3D: """Abbreviation for :meth:`~.NumberLine.number_to_point`.""" return self.number_to_point(number) def p2n(self, point: Point3DLike) -> float: """Abbreviation for :meth:`~.NumberLine.point_to_number`.""" return self.point_to_number(point) def get_unit_size(self) -> float: val: float = self.get_length() / (self.x_range[1] - self.x_range[0]) return val def get_unit_vector(self) -> Vector3D: return super().get_unit_vector() * self.unit_size def get_number_mobject( self, x: float, direction: Vector3D | None = None, buff: float | None = None, font_size: float | None = None, label_constructor: type[MathTex] | None = None, **number_config: dict[str, Any], ) -> VMobject: """Generates a positioned :class:`~.DecimalNumber` mobject generated according to ``label_constructor``. Parameters ---------- x The x-value at which the mobject should be positioned. direction Determines the direction at which the label is positioned next to the line. buff The distance of the label from the line. font_size The font size of the label mobject. label_constructor The :class:`~.VMobject` class that will be used to construct the label. Defaults to the ``label_constructor`` attribute of the number line if not specified. Returns ------- :class:`~.DecimalNumber` The positioned mobject. """ number_config_merged = merge_dicts_recursively( self.decimal_number_config, number_config, ) if direction is None: direction = self.label_direction if buff is None: buff = self.line_to_number_buff if font_size is None: font_size = self.font_size if label_constructor is None: label_constructor = self.label_constructor num_mob = DecimalNumber( x, font_size=font_size, mob_class=label_constructor, **number_config_merged, ) num_mob.next_to(self.number_to_point(x), direction=direction, buff=buff) if x < 0 and self.label_direction[0] == 0: # Align without the minus sign num_mob.shift(num_mob[0].width * LEFT / 2) return num_mob def get_number_mobjects(self, *numbers: float, **kwargs: Any) -> VGroup: if len(numbers) == 0: numbers = self.default_numbers_to_display() return VGroup([self.get_number_mobject(number, **kwargs) for number in numbers]) def get_labels(self) -> VGroup: return self.get_number_mobjects() def add_numbers( self, x_values: Iterable[float] | None = None, excluding: Iterable[float] | None = None, font_size: float | None = None, label_constructor: type[MathTex] | None = None, **kwargs: Any, ) -> Self: """Adds :class:`~.DecimalNumber` mobjects representing their position at each tick of the number line. The numbers can be accessed after creation via ``self.numbers``. Parameters ---------- x_values An iterable of the values used to position and create the labels. Defaults to the output produced by :meth:`~.NumberLine.get_tick_range` excluding A list of values to exclude from :attr:`x_values`. font_size The font size of the labels. Defaults to the ``font_size`` attribute of the number line. label_constructor The :class:`~.VMobject` class that will be used to construct the label. Defaults to the ``label_constructor`` attribute of the number line if not specified. """ if x_values is None: x_values = self.get_tick_range() if excluding is None: excluding = self.numbers_to_exclude if font_size is None: font_size = self.font_size if label_constructor is None: label_constructor = self.label_constructor numbers = VGroup() for x in x_values: if x in excluding: continue numbers.add( self.get_number_mobject( x, font_size=font_size, label_constructor=label_constructor, **kwargs, ) ) self.add(numbers) self.numbers = numbers return self def add_labels( self, dict_values: dict[float, str | float | VMobject], direction: Point3DLike | None = None, buff: float | None = None, font_size: float | None = None, label_constructor: type[MathTex] | None = None, ) -> Self: """Adds specifically positioned labels to the :class:`~.NumberLine` using a ``dict``. The labels can be accessed after creation via ``self.labels``. Parameters ---------- dict_values A dictionary consisting of the position along the number line and the mobject to be added: ``{1: Tex("Monday"), 3: Tex("Tuesday")}``. :attr:`label_constructor` will be used to construct the labels if the value is not a mobject (``str`` or ``float``). direction Determines the direction at which the label is positioned next to the line. buff The distance of the label from the line. font_size The font size of the mobject to be positioned. label_constructor The :class:`~.VMobject` class that will be used to construct the label. Defaults to the ``label_constructor`` attribute of the number line if not specified. Raises ------ AttributeError If the label does not have a ``font_size`` attribute, an ``AttributeError`` is raised. """ direction = self.label_direction if direction is None else direction buff = self.line_to_number_buff if buff is None else buff font_size = self.font_size if font_size is None else font_size if label_constructor is None: label_constructor = self.label_constructor labels = VGroup() for x, label in dict_values.items(): # TODO: remove this check and ability to call # this method via CoordinateSystem.add_coordinates() # must be explicitly called if isinstance(label, str) and label_constructor is MathTex: label = Tex(label) else: label = self._create_label_tex(label, label_constructor) if hasattr(label, "font_size"): assert isinstance(label, (MathTex, Tex, Text, Integer)), label label.font_size = font_size else: raise AttributeError(f"{label} is not compatible with add_labels.") label.next_to(self.number_to_point(x), direction=direction, buff=buff) labels.add(label) self.labels = labels self.add(labels) return self def _create_label_tex( self, label_tex: str | float | VMobject, label_constructor: Callable | None = None, **kwargs: Any, ) -> VMobject: """Checks if the label is a :class:`~.VMobject`, otherwise, creates a label by passing ``label_tex`` to ``label_constructor``. Parameters ---------- label_tex The label for which a mobject should be created. If the label already is a mobject, no new mobject is created. label_constructor Optional. A class or function returning a mobject when passing ``label_tex`` as an argument. If ``None`` is passed (the default), the label constructor from the :attr:`.label_constructor` attribute is used. Returns ------- :class:`~.VMobject` The label. """ if isinstance(label_tex, (VMobject, OpenGLVMobject)): return label_tex if label_constructor is None: label_constructor = self.label_constructor if isinstance(label_tex, str): return label_constructor(label_tex, **kwargs) return label_constructor(str(label_tex), **kwargs) @staticmethod def _decimal_places_from_step(step: float) -> int: step_str = str(step) if "." not in step_str: return 0 return len(step_str.split(".")[-1]) def __matmul__(self, other: float) -> Point3D: return self.n2p(other) def __rmatmul__(self, other: Point3DLike | Mobject) -> float: if isinstance(other, Mobject): other = other.get_center() return self.p2n(other) class UnitInterval(NumberLine): def __init__( self, unit_size: float = 10, numbers_with_elongated_ticks: list[float] | None = None, decimal_number_config: dict[str, Any] | None = None, **kwargs: Any, ): numbers_with_elongated_ticks = ( [0, 1] if numbers_with_elongated_ticks is None else numbers_with_elongated_ticks ) decimal_number_config = ( { "num_decimal_places": 1, } if decimal_number_config is None else decimal_number_config ) super().__init__( x_range=(0, 1, 0.1), unit_size=unit_size, numbers_with_elongated_ticks=numbers_with_elongated_ticks, decimal_number_config=decimal_number_config, **kwargs, ) ManimCommunity-manim-1157b74/manim/mobject/graphing/probability.py000066400000000000000000000451331515024150700252560ustar00rootroot00000000000000"""Mobjects representing objects from probability theory and statistics.""" from __future__ import annotations __all__ = ["SampleSpace", "BarChart"] from collections.abc import Iterable, MutableSequence, Sequence from typing import Any import numpy as np from manim import config, logger from manim.constants import * from manim.mobject.geometry.polygram import Rectangle from manim.mobject.graphing.coordinate_systems import Axes from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.mobject.svg.brace import Brace from manim.mobject.text.tex_mobject import MathTex, Tex from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.typing import Vector3D from manim.utils.color import ( BLUE_E, DARK_GREY, GREEN_E, LIGHT_GREY, MAROON_B, YELLOW, ParsableManimColor, color_gradient, ) from manim.utils.iterables import tuplify EPSILON = 0.0001 class SampleSpace(Rectangle): """A mobject representing a twodimensional rectangular sampling space. Examples -------- .. manim:: ExampleSampleSpace :save_last_frame: class ExampleSampleSpace(Scene): def construct(self): poly1 = SampleSpace(stroke_width=15, fill_opacity=1) poly2 = SampleSpace(width=5, height=3, stroke_width=5, fill_opacity=0.5) poly3 = SampleSpace(width=2, height=2, stroke_width=5, fill_opacity=0.1) poly3.divide_vertically(p_list=np.array([0.37, 0.13, 0.5]), colors=[BLACK, WHITE, GRAY], vect=RIGHT) poly_group = VGroup(poly1, poly2, poly3).arrange() self.add(poly_group) """ def __init__( self, height: float = 3, width: float = 3, fill_color: ParsableManimColor = DARK_GREY, fill_opacity: float = 1, stroke_width: float = 0.5, stroke_color: ParsableManimColor = LIGHT_GREY, default_label_scale_val: float = 1, ): super().__init__( height=height, width=width, fill_color=fill_color, fill_opacity=fill_opacity, stroke_width=stroke_width, stroke_color=stroke_color, ) self.default_label_scale_val = default_label_scale_val def add_title( self, title: str = "Sample space", buff: float = MED_SMALL_BUFF ) -> None: # TODO, should this really exist in SampleSpaceScene title_mob = Tex(title) if title_mob.width > self.width: title_mob.width = self.width title_mob.next_to(self, UP, buff=buff) self.title = title_mob self.add(title_mob) def add_label(self, label: str) -> None: self.label = label def complete_p_list(self, p_list: float | Iterable[float]) -> list[float]: p_list_tuplified: tuple[float] = tuplify(p_list) new_p_list = list(p_list_tuplified) remainder = 1.0 - sum(new_p_list) if abs(remainder) > EPSILON: new_p_list.append(remainder) return new_p_list def get_division_along_dimension( self, p_list: float | Iterable[float], dim: int, colors: Sequence[ParsableManimColor], vect: Vector3D, ) -> VGroup: p_list_complete = self.complete_p_list(p_list) colors_in_gradient = color_gradient(colors, len(p_list_complete)) last_point = self.get_edge_center(-vect) parts = VGroup() for factor, color in zip(p_list_complete, colors_in_gradient, strict=True): part = SampleSpace() part.set_fill(color, 1) part.replace(self, stretch=True) part.stretch(factor, dim) part.move_to(last_point, -vect) last_point = part.get_edge_center(vect) parts.add(part) return parts def get_horizontal_division( self, p_list: float | Iterable[float], colors: Sequence[ParsableManimColor] = [GREEN_E, BLUE_E], vect: Vector3D = DOWN, ) -> VGroup: return self.get_division_along_dimension(p_list, 1, colors, vect) def get_vertical_division( self, p_list: float | Iterable[float], colors: Sequence[ParsableManimColor] = [MAROON_B, YELLOW], vect: Vector3D = RIGHT, ) -> VGroup: return self.get_division_along_dimension(p_list, 0, colors, vect) def divide_horizontally(self, *args: Any, **kwargs: Any) -> None: self.horizontal_parts = self.get_horizontal_division(*args, **kwargs) self.add(self.horizontal_parts) def divide_vertically(self, *args: Any, **kwargs: Any) -> None: self.vertical_parts = self.get_vertical_division(*args, **kwargs) self.add(self.vertical_parts) def get_subdivision_braces_and_labels( self, parts: VGroup, labels: list[str | VMobject | OpenGLVMobject], direction: Vector3D, buff: float = SMALL_BUFF, min_num_quads: int = 1, ) -> VGroup: label_mobs = VGroup() braces = VGroup() for label, part in zip(labels, parts, strict=False): brace = Brace(part, direction, min_num_quads=min_num_quads, buff=buff) if isinstance(label, (VMobject, OpenGLVMobject)): label_mob = label else: label_mob = MathTex(label) label_mob.scale(self.default_label_scale_val) label_mob.next_to(brace, direction, buff) braces.add(brace) assert isinstance(label_mob, VMobject) label_mobs.add(label_mob) parts.braces = braces # type: ignore[attr-defined] parts.labels = label_mobs # type: ignore[attr-defined] parts.label_kwargs = { # type: ignore[attr-defined] "labels": label_mobs.copy(), "direction": direction, "buff": buff, } return VGroup(parts.braces, parts.labels) def get_side_braces_and_labels( self, labels: list[str | VMobject | OpenGLVMobject], direction: Vector3D = LEFT, **kwargs: Any, ) -> VGroup: assert hasattr(self, "horizontal_parts") parts = self.horizontal_parts return self.get_subdivision_braces_and_labels( parts, labels, direction, **kwargs ) def get_top_braces_and_labels( self, labels: list[str | VMobject | OpenGLVMobject], **kwargs: Any ) -> VGroup: assert hasattr(self, "vertical_parts") parts = self.vertical_parts return self.get_subdivision_braces_and_labels(parts, labels, UP, **kwargs) def get_bottom_braces_and_labels( self, labels: list[str | VMobject | OpenGLVMobject], **kwargs: Any ) -> VGroup: assert hasattr(self, "vertical_parts") parts = self.vertical_parts return self.get_subdivision_braces_and_labels(parts, labels, DOWN, **kwargs) def add_braces_and_labels(self) -> None: for attr in "horizontal_parts", "vertical_parts": if not hasattr(self, attr): continue parts = getattr(self, attr) for subattr in "braces", "labels": if hasattr(parts, subattr): self.add(getattr(parts, subattr)) def __getitem__(self, index: int) -> SampleSpace: if hasattr(self, "horizontal_parts"): val: SampleSpace = self.horizontal_parts[index] return val elif hasattr(self, "vertical_parts"): val = self.vertical_parts[index] return val return self.split()[index] class BarChart(Axes): """Creates a bar chart. Inherits from :class:`~.Axes`, so it shares its methods and attributes. Each axis inherits from :class:`~.NumberLine`, so pass in ``x_axis_config``/``y_axis_config`` to control their attributes. Parameters ---------- values A sequence of values that determines the height of each bar. Accepts negative values. bar_names A sequence of names for each bar. Does not have to match the length of ``values``. y_range The y_axis range of values. If ``None``, the range will be calculated based on the min/max of ``values`` and the step will be calculated based on ``y_length``. x_length The length of the x-axis. If ``None``, it is automatically calculated based on the number of values and the width of the screen. y_length The length of the y-axis. bar_colors The color for the bars. Accepts a sequence of colors (can contain just one item). If the length of``bar_colors`` does not match that of ``values``, intermediate colors will be automatically determined. bar_width The length of a bar. Must be between 0 and 1. bar_fill_opacity The fill opacity of the bars. bar_stroke_width The stroke width of the bars. Examples -------- .. manim:: BarChartExample :save_last_frame: class BarChartExample(Scene): def construct(self): chart = BarChart( values=[-5, 40, -10, 20, -3], bar_names=["one", "two", "three", "four", "five"], y_range=[-20, 50, 10], y_length=6, x_length=10, x_axis_config={"font_size": 36}, ) c_bar_lbls = chart.get_bar_labels(font_size=48) self.add(chart, c_bar_lbls) """ def __init__( self, values: MutableSequence[float], bar_names: Sequence[str] | None = None, y_range: Sequence[float] | None = None, x_length: float | None = None, y_length: float | None = None, bar_colors: Iterable[str] = [ "#003f5c", "#58508d", "#bc5090", "#ff6361", "#ffa600", ], bar_width: float = 0.6, bar_fill_opacity: float = 0.7, bar_stroke_width: float = 3, **kwargs: Any, ): if isinstance(bar_colors, str): logger.warning( "Passing a string to `bar_colors` has been deprecated since v0.15.2 and will be removed after v0.17.0, the parameter must be a list. " ) bar_colors = list(bar_colors) y_length = y_length if y_length is not None else config.frame_height - 4 self.values = values self.bar_names = bar_names self.bar_colors = bar_colors self.bar_width = bar_width self.bar_fill_opacity = bar_fill_opacity self.bar_stroke_width = bar_stroke_width x_range = [0, len(self.values), 1] if y_range is None: y_range = [ min(0, min(self.values)), max(0, max(self.values)), round(max(self.values) / y_length, 2), ] elif len(y_range) == 2: y_range = [*y_range, round(max(self.values) / y_length, 2)] if x_length is None: x_length = min(len(self.values), config.frame_width - 2) x_axis_config = {"font_size": 24, "label_constructor": Tex} self._update_default_configs( (x_axis_config,), (kwargs.pop("x_axis_config", None),) ) self.bars: VGroup = VGroup() self.x_labels: VGroup | None = None self.bar_labels: VGroup | None = None super().__init__( x_range=x_range, y_range=y_range, x_length=x_length, y_length=y_length, x_axis_config=x_axis_config, tips=kwargs.pop("tips", False), **kwargs, ) self._add_bars() if self.bar_names is not None: self._add_x_axis_labels() self.y_axis.add_numbers() def _update_colors(self) -> None: """Initialize the colors of the bars of the chart. Sets the color of ``self.bars`` via ``self.bar_colors``. Primarily used when the bars are initialized with ``self._add_bars`` or updated via ``self.change_bar_values``. """ self.bars.set_color_by_gradient(*self.bar_colors) def _add_x_axis_labels(self) -> None: """Essentially :meth`:~.NumberLine.add_labels`, but differs in that the direction of the label with respect to the x_axis changes to UP or DOWN depending on the value. UP for negative values and DOWN for positive values. """ assert isinstance(self.bar_names, list) val_range = np.arange( 0.5, len(self.bar_names), 1 ) # 0.5 shifted so that labels are centered, not on ticks labels = VGroup() for i, (value, bar_name) in enumerate( zip(val_range, self.bar_names, strict=True) ): # to accommodate negative bars, the label may need to be # below or above the x_axis depending on the value of the bar direction = UP if self.values[i] < 0 else DOWN bar_name_label: MathTex = self.x_axis.label_constructor(bar_name) bar_name_label.font_size = self.x_axis.font_size bar_name_label.next_to( self.x_axis.number_to_point(value), direction=direction, buff=self.x_axis.line_to_number_buff, ) labels.add(bar_name_label) self.x_axis.labels = labels self.x_axis.add(labels) def _create_bar(self, bar_number: int, value: float) -> Rectangle: """Creates a positioned bar on the chart. Parameters ---------- bar_number Determines the x-position of the bar. value The value that determines the height of the bar. Returns ------- Rectangle A positioned rectangle representing a bar on the chart. """ # bar measurements relative to the axis # distance from between the y-axis and the top of the bar bar_h = abs(self.c2p(0, value)[1] - self.c2p(0, 0)[1]) # width of the bar bar_w = self.c2p(self.bar_width, 0)[0] - self.c2p(0, 0)[0] bar = Rectangle( height=bar_h, width=bar_w, stroke_width=self.bar_stroke_width, fill_opacity=self.bar_fill_opacity, ) pos = UP if (value >= 0) else DOWN bar.next_to(self.c2p(bar_number + 0.5, 0), pos, buff=0) return bar def _add_bars(self) -> None: for i, value in enumerate(self.values): tmp_bar = self._create_bar(bar_number=i, value=value) self.bars.add(tmp_bar) self._update_colors() self.add_to_back(self.bars) def get_bar_labels( self, color: ParsableManimColor | None = None, font_size: float = 24, buff: float = MED_SMALL_BUFF, label_constructor: type[MathTex] = Tex, ) -> VGroup: """Annotates each bar with its corresponding value. Use ``self.bar_labels`` to access the labels after creation. Parameters ---------- color The color of each label. By default ``None`` and is based on the parent's bar color. font_size The font size of each label. buff The distance from each label to its bar. By default 0.4. label_constructor The Mobject class to construct the labels, by default :class:`~.Tex`. Examples -------- .. manim:: GetBarLabelsExample :save_last_frame: class GetBarLabelsExample(Scene): def construct(self): chart = BarChart(values=[10, 9, 8, 7, 6, 5, 4, 3, 2, 1], y_range=[0, 10, 1]) c_bar_lbls = chart.get_bar_labels( color=WHITE, label_constructor=MathTex, font_size=36 ) self.add(chart, c_bar_lbls) """ bar_labels = VGroup() for bar, value in zip(self.bars, self.values, strict=False): bar_lbl: MathTex = label_constructor(str(value)) if color is None: bar_lbl.set_color(bar.get_fill_color()) else: bar_lbl.set_color(color) bar_lbl.font_size = font_size pos = UP if (value >= 0) else DOWN bar_lbl.next_to(bar, pos, buff=buff) bar_labels.add(bar_lbl) return bar_labels def change_bar_values( self, values: Iterable[float], update_colors: bool = True ) -> None: """Updates the height of the bars of the chart. Parameters ---------- values The values that will be used to update the height of the bars. Does not have to match the number of bars. update_colors Whether to re-initalize the colors of the bars based on ``self.bar_colors``. Examples -------- .. manim:: ChangeBarValuesExample :save_last_frame: class ChangeBarValuesExample(Scene): def construct(self): values=[-10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10] chart = BarChart( values, y_range=[-10, 10, 2], y_axis_config={"font_size": 24}, ) self.add(chart) chart.change_bar_values(list(reversed(values))) self.add(chart.get_bar_labels(font_size=24)) """ for i, (bar, value) in enumerate(zip(self.bars, values, strict=False)): chart_val = self.values[i] if chart_val > 0: bar_lim = bar.get_bottom() aligned_edge = DOWN else: bar_lim = bar.get_top() aligned_edge = UP # check if the bar has height if chart_val != 0: quotient = value / chart_val if quotient < 0: aligned_edge = UP if chart_val > 0 else DOWN # if the bar is already positive, then we now want to move it # so that it is negative. So, we move the top edge of the bar # to the location of the previous bottom # if already negative, then we move the bottom edge of the bar # to the location of the previous top bar.stretch_to_fit_height(abs(quotient) * bar.height) else: # create a new bar since the current one has a height of zero (doesn't exist) temp_bar = self._create_bar(i, value) self.bars.remove(bar) self.bars.insert(i, temp_bar) bar.move_to(bar_lim, aligned_edge) if update_colors: self._update_colors() self.values[: len(list(values))] = values ManimCommunity-manim-1157b74/manim/mobject/graphing/scale.py000066400000000000000000000127561515024150700240320ustar00rootroot00000000000000from __future__ import annotations import math from collections.abc import Iterable from typing import TYPE_CHECKING, Any, overload import numpy as np __all__ = ["LogBase", "LinearBase"] from manim.mobject.text.numbers import Integer if TYPE_CHECKING: from collections.abc import Callable from manim.mobject.types.vectorized_mobject import VMobject class _ScaleBase: """Scale baseclass for graphing/functions. Parameters ---------- custom_labels Whether to create custom labels when plotted on a :class:`~.NumberLine`. """ def __init__(self, custom_labels: bool = False): self.custom_labels = custom_labels @overload def function(self, value: float) -> float: ... @overload def function(self, value: np.ndarray) -> np.ndarray: ... def function(self, value: float) -> float: """The function that will be used to scale the values. Parameters ---------- value The number/``np.ndarray`` to be scaled. Returns ------- float The value after it has undergone the scaling. Raises ------ NotImplementedError Must be subclassed. """ raise NotImplementedError def inverse_function(self, value: float) -> float: """The inverse of ``function``. Used for plotting on a particular axis. Raises ------ NotImplementedError Must be subclassed. """ raise NotImplementedError def get_custom_labels( self, val_range: Iterable[float], **kw_args: Any, ) -> Iterable[VMobject]: """Custom instructions for generating labels along an axis. Parameters ---------- val_range The position of labels. Also used for defining the content of the labels. Returns ------- Dict A list consisting of the labels. Can be passed to :meth:`~.NumberLine.add_labels() along with ``val_range``. Raises ------ NotImplementedError Can be subclassed, optional. """ raise NotImplementedError class LinearBase(_ScaleBase): def __init__(self, scale_factor: float = 1.0): """The default scaling class. Parameters ---------- scale_factor The slope of the linear function, by default 1.0 """ super().__init__() self.scale_factor = scale_factor def function(self, value: float) -> float: """Multiplies the value by the scale factor. Parameters ---------- value Value to be multiplied by the scale factor. """ return self.scale_factor * value def inverse_function(self, value: float) -> float: """Inverse of function. Divides the value by the scale factor. Parameters ---------- value value to be divided by the scale factor. """ return value / self.scale_factor class LogBase(_ScaleBase): def __init__(self, base: float = 10, custom_labels: bool = True): """Scale for logarithmic graphs/functions. Parameters ---------- base The base of the log, by default 10. custom_labels For use with :class:`~.Axes`: Whether or not to include ``LaTeX`` axis labels, by default True. Examples -------- .. code-block:: python func = ParametricFunction(lambda x: x, scaling=LogBase(base=2)) """ super().__init__() self.base = base self.custom_labels = custom_labels def function(self, value: float) -> float: """Scales the value to fit it to a logarithmic scale.``self.function(5)==10**5``""" return_value: float = self.base**value return return_value def inverse_function(self, value: float) -> float: """Inverse of ``function``. The value must be greater than 0""" if isinstance(value, np.ndarray): condition = value.any() <= 0 func: Callable[[float, float], float] def func(value: float, base: float) -> float: return_value: float = np.log(value) / np.log(base) return return_value else: condition = value <= 0 func = math.log if condition: raise ValueError( "log(0) is undefined. Make sure the value is in the domain of the function" ) value = func(value, self.base) return value def get_custom_labels( self, val_range: Iterable[float], unit_decimal_places: int = 0, **base_config: Any, ) -> list[Integer]: """Produces custom :class:`~.Integer` labels in the form of ``10^2``. Parameters ---------- val_range The iterable of values used to create the labels. Determines the exponent. unit_decimal_places The number of decimal places to include in the exponent base_config Additional arguments to be passed to :class:`~.Integer`. """ # uses `format` syntax to control the number of decimal places. tex_labels: list[Integer] = [ Integer( self.base, unit="^{%s}" % (f"{self.inverse_function(i):.{unit_decimal_places}f}"), # noqa: UP031 **base_config, ) for i in val_range ] return tex_labels ManimCommunity-manim-1157b74/manim/mobject/logo.py000066400000000000000000000341141515024150700220740ustar00rootroot00000000000000"""Utilities for Manim's logo and banner.""" from __future__ import annotations __all__ = ["ManimBanner"] from typing import Any import svgelements as se from manim.animation.updaters.update import UpdateFromAlphaFunc from manim.mobject.geometry.arc import Circle from manim.mobject.geometry.polygram import Square, Triangle from manim.mobject.mobject import Mobject from manim.typing import Vector3D from .. import constants as cst from ..animation.animation import override_animation from ..animation.composition import AnimationGroup, Succession from ..animation.creation import Create, SpiralIn from ..animation.fading import FadeIn from ..mobject.svg.svg_mobject import VMobjectFromSVGPath from ..mobject.types.vectorized_mobject import VGroup from ..utils.rate_functions import ease_in_out_cubic, smooth MANIM_SVG_PATHS: list[se.Path] = [ se.Path( # double stroke letter M "M4.64259-2.092154L2.739726-6.625156C2.660025-6.824408 2.650062-6.824408 " "2.381071-6.824408H.52802C.348692-6.824408 .199253-6.824408 .199253-6.645" "081C.199253-6.475716 .37858-6.475716 .428394-6.475716C.547945-6.475716 ." "816936-6.455791 1.036115-6.37609V-1.05604C1.036115-.846824 1.036115-.408" "468 .358655-.348692C.169365-.328767 .169365-.18929 .169365-.179328C.1693" "65 0 .328767 0 .508095 0H2.052304C2.231631 0 2.381071 0 2.381071-.179328" "C2.381071-.268991 2.30137-.33873 2.221669-.348692C1.454545-.408468 1.454" "545-.826899 1.454545-1.05604V-6.017435L1.464508-6.027397L3.895392-.20921" "5C3.975093-.029888 4.044832 0 4.104608 0C4.224159 0 4.254047-.079701 4.3" "03861-.199253L6.744707-6.027397L6.75467-6.017435V-1.05604C6.75467-.84682" "4 6.75467-.408468 6.07721-.348692C5.88792-.328767 5.88792-.18929 5.88792" "-.179328C5.88792 0 6.047323 0 6.22665 0H8.886675C9.066002 0 9.215442 0 9" ".215442-.179328C9.215442-.268991 9.135741-.33873 9.05604-.348692C8.28891" "7-.408468 8.288917-.826899 8.288917-1.05604V-5.768369C8.288917-5.977584 " "8.288917-6.41594 8.966376-6.475716C9.066002-6.485679 9.155666-6.535492 9" ".155666-6.645081C9.155666-6.824408 9.006227-6.824408 8.826899-6.824408H6" ".90411C6.645081-6.824408 6.625156-6.824408 6.535492-6.615193L4.64259-2.0" "92154ZM4.343711-1.912827C4.423412-1.743462 4.433375-1.733499 4.552927-1." "693649L4.11457-.637609H4.094645L1.823163-6.057285C1.77335-6.1868 1.69364" "9-6.356164 1.554172-6.475716H2.420922L4.343711-1.912827ZM1.334994-.34869" "2H1.165629C1.185554-.37858 1.205479-.408468 1.225405-.428394C1.235367-.4" "38356 1.235367-.448319 1.24533-.458281L1.334994-.348692ZM7.103362-6.4757" "16H8.159402C7.940224-6.22665 7.940224-5.967621 7.940224-5.788294V-1.0361" "15C7.940224-.856787 7.940224-.597758 8.169365-.348692H6.884184C7.103362-" ".597758 7.103362-.856787 7.103362-1.036115V-6.475716Z" ), se.Path( # letter a "M1.464508-4.024907C1.464508-4.234122 1.743462-4.393524 2.092154-4.393524" "C2.669988-4.393524 2.929016-4.124533 2.929016-3.516812V-2.789539C1.77335" "-2.440847 .249066-2.042341 .249066-.916563C.249066-.308842 .71731 .13947" "7 1.354919 .139477C1.92279 .139477 2.381071-.059776 2.929016-.557908C3.0" "38605-.049813 3.257783 .139477 3.745953 .139477C4.174346 .139477 4.48318" "8-.019925 4.861768-.428394L4.712329-.637609L4.612702-.537983C4.582814-.5" "08095 4.552927-.498132 4.503113-.498132C4.363636-.498132 4.293898-.58779" "6 4.293898-.747198V-3.347447C4.293898-4.184309 3.536737-4.712329 2.32129" "5-4.712329C1.195517-4.712329 .438356-4.204234 .438356-3.457036C.438356-3" ".048568 .67746-2.799502 1.085928-2.799502C1.484433-2.799502 1.763387-3.0" "38605 1.763387-3.377335C1.763387-3.676214 1.464508-3.88543 1.464508-4.02" "4907ZM2.919054-.996264C2.650062-.687422 2.450809-.56787 2.211706-.56787C" "1.912827-.56787 1.703611-.836862 1.703611-1.235367C1.703611-1.8132 2.122" "042-2.231631 2.919054-2.440847V-.996264Z" ), se.Path( # letter n "M2.948941-4.044832C3.297634-4.044832 3.466999-3.775841 3.466999-3.217933" "V-.806974C3.466999-.438356 3.337484-.278954 2.998755-.239103V0H5.339975V" "-.239103C4.951432-.268991 4.851806-.388543 4.851806-.806974V-3.307597C4." "851806-4.164384 4.323786-4.712329 3.506849-4.712329C2.909091-4.712329 2." "450809-4.433375 2.082192-3.845579V-4.592777H.179328V-4.353674C.617684-4." "283935 .707347-4.184309 .707347-3.765878V-.836862C.707347-.418431 .62764" "6-.328767 .179328-.239103V0H2.580324V-.239103C2.211706-.288917 2.092154-" ".438356 2.092154-.806974V-3.466999C2.092154-3.576588 2.530511-4.044832 2" ".948941-4.044832Z" ), se.Path( # letter i "M2.15193-4.592777H.239103V-4.353674C.67746-4.26401 .767123-4.174346 .767" "123-3.765878V-.836862C.767123-.428394 .697385-.348692 .239103-.239103V0H" "2.6401V-.239103C2.291407-.288917 2.15193-.428394 2.15193-.806974V-4.5927" "77ZM1.454545-6.884184C1.026152-6.884184 .67746-6.535492 .67746-6.117061C" ".67746-5.668742 1.006227-5.339975 1.444583-5.339975S2.221669-5.668742 2." "221669-6.107098C2.221669-6.535492 1.882939-6.884184 1.454545-6.884184Z" ), se.Path( # letter m "M2.929016-4.044832C3.317559-4.044832 3.466999-3.815691 3.466999-3.217933" "V-.806974C3.466999-.398506 3.35741-.268991 2.988792-.239103V0H5.32005V-." "239103C4.971357-.278954 4.851806-.428394 4.851806-.806974V-3.466999C4.85" "1806-3.576588 5.310087-4.044832 5.69863-4.044832C6.07721-4.044832 6.2266" "5-3.805729 6.22665-3.217933V-.806974C6.22665-.388543 6.117061-.268991 5." "738481-.239103V0H8.109589V-.239103C7.721046-.259029 7.611457-.37858 7.61" "1457-.806974V-3.307597C7.611457-4.164384 7.083437-4.712329 6.266501-4.71" "2329C5.69863-4.712329 5.32005-4.483188 4.801993-3.845579C4.503113-4.4732" "25 4.154421-4.712329 3.526775-4.712329S2.440847-4.443337 2.062267-3.8455" "79V-4.592777H.179328V-4.353674C.617684-4.293898 .707347-4.174346 .707347" "-3.765878V-.836862C.707347-.428394 .617684-.318804 .179328-.239103V0H2.5" "50436V-.239103C2.201743-.288917 2.092154-.428394 2.092154-.806974V-3.466" "999C2.092154-3.58655 2.530511-4.044832 2.929016-4.044832Z" ), ] class ManimBanner(VGroup): r"""Convenience class representing Manim's banner. Can be animated using custom methods. Parameters ---------- dark_theme If ``True`` (the default), the dark theme version of the logo (with light text font) will be rendered. Otherwise, if ``False``, the light theme version (with dark text font) is used. Examples -------- .. manim:: DarkThemeBanner class DarkThemeBanner(Scene): def construct(self): banner = ManimBanner() self.play(banner.create()) self.play(banner.expand()) self.wait() self.play(Unwrite(banner)) .. manim:: LightThemeBanner class LightThemeBanner(Scene): def construct(self): self.camera.background_color = "#ece6e2" banner = ManimBanner(dark_theme=False) self.play(banner.create()) self.play(banner.expand()) self.wait() self.play(Unwrite(banner)) """ def __init__(self, dark_theme: bool = True): super().__init__() logo_green = "#81b29a" logo_blue = "#454866" logo_red = "#e07a5f" m_height_over_anim_height = 0.75748 self.font_color = "#ece6e2" if dark_theme else "#343434" self.scale_factor = 1.0 self.M = VMobjectFromSVGPath(MANIM_SVG_PATHS[0]).flip(cst.RIGHT).center() self.M.set(stroke_width=0).scale( 7 * cst.DEFAULT_FONT_SIZE * cst.SCALE_FACTOR_PER_FONT_POINT ) self.M.set_fill(color=self.font_color, opacity=1).shift( 2.25 * cst.LEFT + 1.5 * cst.UP ) self.circle = Circle(color=logo_green, fill_opacity=1).shift(cst.LEFT) self.square = Square(color=logo_blue, fill_opacity=1).shift(cst.UP) self.triangle = Triangle(color=logo_red, fill_opacity=1).shift(cst.RIGHT) self.shapes = VGroup(self.triangle, self.square, self.circle) self.add(self.shapes, self.M) self.move_to(cst.ORIGIN) anim = VGroup() for ind, path in enumerate(MANIM_SVG_PATHS[1:]): tex = VMobjectFromSVGPath(path).flip(cst.RIGHT).center() tex.set(stroke_width=0).scale( cst.DEFAULT_FONT_SIZE * cst.SCALE_FACTOR_PER_FONT_POINT ) if ind > 0: tex.next_to(anim, buff=0.01) tex.align_to(self.M, cst.DOWN) anim.add(tex) anim.set_fill(color=self.font_color, opacity=1) anim.height = m_height_over_anim_height * self.M.height # Note: "anim" is only shown in the expanded state # and thus not yet added to the submobjects of self. self.anim = anim def scale(self, scale_factor: float, **kwargs: Any) -> ManimBanner: """Scale the banner by the specified scale factor. Parameters ---------- scale_factor The factor used for scaling the banner. Returns ------- :class:`~.ManimBanner` The scaled banner. """ self.scale_factor *= scale_factor # Note: self.anim is only added to self after expand() if self.anim not in self.submobjects: self.anim.scale(scale_factor, **kwargs) return super().scale(scale_factor, **kwargs) @override_animation(Create) def create(self, run_time: float = 2) -> AnimationGroup: """The creation animation for Manim's logo. Parameters ---------- run_time The run time of the animation. Returns ------- :class:`~.AnimationGroup` An animation to be used in a :meth:`.Scene.play` call. """ return AnimationGroup( SpiralIn(self.shapes, run_time=run_time), FadeIn(self.M, run_time=run_time / 2), lag_ratio=0.1, ) def expand(self, run_time: float = 1.5, direction: str = "center") -> Succession: """An animation that expands Manim's logo into its banner. The returned animation transforms the banner from its initial state (representing Manim's logo with just the icons) to its expanded state (showing the full name together with the icons). See the class documentation for how to use this. .. note:: Before calling this method, the text "anim" is not a submobject of the banner object. After the expansion, it is added as a submobject so subsequent animations to the banner object apply to the text "anim" as well. Parameters ---------- run_time The run time of the animation. direction The direction in which the logo is expanded. Returns ------- :class:`~.Succession` An animation to be used in a :meth:`.Scene.play` call. Examples -------- .. manim:: ExpandDirections class ExpandDirections(Scene): def construct(self): banners = [ManimBanner().scale(0.5).shift(UP*x) for x in [-2, 0, 2]] self.play( banners[0].expand(direction="right"), banners[1].expand(direction="center"), banners[2].expand(direction="left"), ) """ if direction not in ["left", "right", "center"]: raise ValueError("direction must be 'left', 'right' or 'center'.") m_shape_offset = 6.25 * self.scale_factor shape_sliding_overshoot = self.scale_factor * 0.8 m_anim_buff = 0.06 self.anim.next_to(self.M, buff=m_anim_buff).align_to(self.M, cst.DOWN) self.anim.set_opacity(0) self.shapes.save_state() m_clone = self.anim[-1].copy() self.add(m_clone) m_clone.move_to(self.shapes) self.M.save_state() left_group = VGroup(self.M, self.anim, m_clone) def shift(vector: Vector3D) -> None: self.shapes.restore() left_group.align_to(self.M.saved_state, cst.LEFT) if direction == "right": self.shapes.shift(vector) elif direction == "center": self.shapes.shift(vector / 2) left_group.shift(-vector / 2) elif direction == "left": left_group.shift(-vector) def slide_and_uncover(mob: Mobject, alpha: float) -> None: shift(alpha * (m_shape_offset + shape_sliding_overshoot) * cst.RIGHT) # Add letters when they are covered for letter in mob.anim: if mob.square.get_center()[0] > letter.get_center()[0]: letter.set_opacity(1) self.add_to_back(letter) # Finish animation if alpha == 1: self.remove(*[self.anim]) self.add_to_back(self.anim) mob.shapes.set_z_index(0) mob.shapes.save_state() mob.M.save_state() def slide_back(mob: Mobject, alpha: float) -> None: if alpha == 0: m_clone.set_opacity(1) m_clone.move_to(mob.anim[-1]) mob.anim.set_opacity(1) shift(alpha * shape_sliding_overshoot * cst.LEFT) if alpha == 1: mob.remove(m_clone) mob.add_to_back(mob.shapes) return Succession( UpdateFromAlphaFunc( self, slide_and_uncover, run_time=run_time * 2 / 3, rate_func=ease_in_out_cubic, ), UpdateFromAlphaFunc( self, slide_back, run_time=run_time * 1 / 3, rate_func=smooth, ), ) ManimCommunity-manim-1157b74/manim/mobject/matrix.py000066400000000000000000000471331515024150700224450ustar00rootroot00000000000000r"""Mobjects representing matrices. Examples -------- .. manim:: MatrixExamples :save_last_frame: class MatrixExamples(Scene): def construct(self): m0 = Matrix([["\\pi", 0], [-1, 1]]) m1 = IntegerMatrix([[1.5, 0.], [12, -1.3]], left_bracket="(", right_bracket=")") m2 = DecimalMatrix( [[3.456, 2.122], [33.2244, 12.33]], element_to_mobject_config={"num_decimal_places": 2}, left_bracket=r"\{", right_bracket=r"\}") m3 = MobjectMatrix( [[Circle().scale(0.3), Square().scale(0.3)], [MathTex("\\pi").scale(2), Star().scale(0.3)]], left_bracket="\\langle", right_bracket="\\rangle") g = Group(m0, m1, m2, m3).arrange_in_grid(buff=2) self.add(g) """ from __future__ import annotations __all__ = [ "Matrix", "DecimalMatrix", "IntegerMatrix", "MobjectMatrix", "matrix_to_tex_string", "matrix_to_mobject", "get_det_text", ] import itertools as it from collections.abc import Callable, Iterable, Sequence from typing import Any, Self import numpy as np from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.text.numbers import DecimalNumber, Integer from manim.mobject.text.tex_mobject import MathTex, Tex from ..constants import * from ..mobject.types.vectorized_mobject import VGroup, VMobject # TO DO : The following two functions are not used in this file. # Not sure if we should keep it or not. def matrix_to_tex_string(matrix: np.ndarray) -> str: matrix = np.array(matrix).astype("str") if matrix.ndim == 1: matrix = matrix.reshape((matrix.size, 1)) n_rows, n_cols = matrix.shape prefix = "\\left[ \\begin{array}{%s}" % ("c" * n_cols) suffix = "\\end{array} \\right]" rows = [" & ".join(row) for row in matrix] return prefix + " \\\\ ".join(rows) + suffix def matrix_to_mobject(matrix: np.ndarray) -> MathTex: return MathTex(matrix_to_tex_string(matrix)) class Matrix(VMobject, metaclass=ConvertToOpenGL): r"""A mobject that displays a matrix on the screen. Parameters ---------- matrix A numpy 2d array or list of lists. v_buff Vertical distance between elements, by default 0.8. h_buff Horizontal distance between elements, by default 1.3. bracket_h_buff Distance of the brackets from the matrix, by default ``MED_SMALL_BUFF``. bracket_v_buff Height of the brackets, by default ``MED_SMALL_BUFF``. add_background_rectangles_to_entries ``True`` if should add backgraound rectangles to entries, by default ``False``. include_background_rectangle ``True`` if should include background rectangle, by default ``False``. element_to_mobject The mobject class used to construct the elements, by default :class:`~.MathTex`. element_to_mobject_config Additional arguments to be passed to the constructor in ``element_to_mobject``, by default ``{}``. element_alignment_corner The corner to which elements are aligned, by default ``DR``. left_bracket The left bracket type, by default ``"["``. right_bracket The right bracket type, by default ``"]"``. stretch_brackets ``True`` if should stretch the brackets to fit the height of matrix contents, by default ``True``. bracket_config Additional arguments to be passed to :class:`~.MathTex` when constructing the brackets. Examples -------- The first example shows a variety of uses of this module while the second example exlpains the use of the options `add_background_rectangles_to_entries` and `include_background_rectangle`. .. manim:: MatrixExamples :save_last_frame: class MatrixExamples(Scene): def construct(self): m0 = Matrix([[2, r"\pi"], [-1, 1]]) m1 = Matrix([[2, 0, 4], [-1, 1, 5]], v_buff=1.3, h_buff=0.8, bracket_h_buff=SMALL_BUFF, bracket_v_buff=SMALL_BUFF, left_bracket=r"\{", right_bracket=r"\}") m1.add(SurroundingRectangle(m1.get_columns()[1])) m2 = Matrix([[2, 1], [-1, 3]], element_alignment_corner=UL, left_bracket="(", right_bracket=")") m3 = Matrix([[2, 1], [-1, 3]], left_bracket=r"\langle", right_bracket=r"\rangle") m4 = Matrix([[2, 1], [-1, 3]], ).set_column_colors(RED, GREEN) m5 = Matrix([[2, 1], [-1, 3]], ).set_row_colors(RED, GREEN) g = Group( m0,m1,m2,m3,m4,m5 ).arrange_in_grid(buff=2) self.add(g) .. manim:: BackgroundRectanglesExample :save_last_frame: class BackgroundRectanglesExample(Scene): def construct(self): background= Rectangle().scale(3.2) background.set_fill(opacity=.5) background.set_color([TEAL, RED, YELLOW]) self.add(background) m0 = Matrix([[12, -30], [-1, 15]], add_background_rectangles_to_entries=True) m1 = Matrix([[2, 0], [-1, 1]], include_background_rectangle=True) m2 = Matrix([[12, -30], [-1, 15]]) g = Group(m0, m1, m2).arrange(buff=2) self.add(g) """ def __init__( self, matrix: Iterable, v_buff: float = 0.8, h_buff: float = 1.3, bracket_h_buff: float = MED_SMALL_BUFF, bracket_v_buff: float = MED_SMALL_BUFF, add_background_rectangles_to_entries: bool = False, include_background_rectangle: bool = False, element_to_mobject: type[Mobject] | Callable[..., Mobject] = MathTex, element_to_mobject_config: dict = {}, element_alignment_corner: Sequence[float] = DR, left_bracket: str = "[", right_bracket: str = "]", stretch_brackets: bool = True, bracket_config: dict = {}, **kwargs: Any, ): self.v_buff = v_buff self.h_buff = h_buff self.bracket_h_buff = bracket_h_buff self.bracket_v_buff = bracket_v_buff self.add_background_rectangles_to_entries = add_background_rectangles_to_entries self.include_background_rectangle = include_background_rectangle self.element_to_mobject = element_to_mobject self.element_to_mobject_config = element_to_mobject_config self.element_alignment_corner = element_alignment_corner self.left_bracket = left_bracket self.right_bracket = right_bracket self.stretch_brackets = stretch_brackets super().__init__(**kwargs) mob_matrix = self._matrix_to_mob_matrix(matrix) self._organize_mob_matrix(mob_matrix) self.elements = VGroup(*it.chain(*mob_matrix)) self.add(self.elements) self._add_brackets(self.left_bracket, self.right_bracket, **bracket_config) self.center() self.mob_matrix = mob_matrix if self.add_background_rectangles_to_entries: for mob in self.elements: mob.add_background_rectangle() if self.include_background_rectangle: self.add_background_rectangle() def _matrix_to_mob_matrix(self, matrix: np.ndarray) -> list[list[Mobject]]: return [ [ self.element_to_mobject(item, **self.element_to_mobject_config) for item in row ] for row in matrix ] def _organize_mob_matrix(self, matrix: list[list[Mobject]]) -> Self: for i, row in enumerate(matrix): for j, _ in enumerate(row): mob = matrix[i][j] mob.move_to( i * self.v_buff * DOWN + j * self.h_buff * RIGHT, self.element_alignment_corner, ) return self def _add_brackets(self, left: str = "[", right: str = "]", **kwargs: Any) -> Self: """Adds the brackets to the Matrix mobject. See Latex document for various bracket types. Parameters ---------- left the left bracket, by default "[" right the right bracket, by default "]" Returns ------- :class:`Matrix` The current matrix object (self). """ # Height per row of LaTeX array with default settings BRACKET_HEIGHT = 0.5977 n = int((self.height) / BRACKET_HEIGHT) + 1 empty_tex_array = "".join( [ r"\begin{array}{c}", *n * [r"\quad \\"], r"\end{array}", ] ) tex_left = "".join( [ r"\left" + left, empty_tex_array, r"\right.", ] ) tex_right = "".join( [ r"\left.", empty_tex_array, r"\right" + right, ] ) l_bracket = MathTex(tex_left, **kwargs) r_bracket = MathTex(tex_right, **kwargs) bracket_pair = VGroup(l_bracket, r_bracket) if self.stretch_brackets: bracket_pair.stretch_to_fit_height(self.height + 2 * self.bracket_v_buff) l_bracket.next_to(self, LEFT, self.bracket_h_buff) r_bracket.next_to(self, RIGHT, self.bracket_h_buff) self.brackets = bracket_pair self.add(l_bracket, r_bracket) return self def get_columns(self) -> VGroup: r"""Return columns of the matrix as VGroups. Returns -------- :class:`~.VGroup` The VGroup contains a nested VGroup for each column of the matrix. Examples -------- .. manim:: GetColumnsExample :save_last_frame: class GetColumnsExample(Scene): def construct(self): m0 = Matrix([[r"\pi", 3], [1, 5]]) m0.add(SurroundingRectangle(m0.get_columns()[1])) self.add(m0) """ return VGroup( *( VGroup(*(row[i] for row in self.mob_matrix)) for i in range(len(self.mob_matrix[0])) ) ) def set_column_colors(self, *colors: str) -> Self: r"""Set individual colors for each columns of the matrix. Parameters ---------- colors The list of colors; each color specified corresponds to a column. Returns ------- :class:`Matrix` The current matrix object (self). Examples -------- .. manim:: SetColumnColorsExample :save_last_frame: class SetColumnColorsExample(Scene): def construct(self): m0 = Matrix([["\\pi", 1], [-1, 3]], ).set_column_colors([RED,BLUE], GREEN) self.add(m0) """ columns = self.get_columns() for color, column in zip(colors, columns, strict=False): column.set_color(color) return self def get_rows(self) -> VGroup: r"""Return rows of the matrix as VGroups. Returns -------- :class:`~.VGroup` The VGroup contains a nested VGroup for each row of the matrix. Examples -------- .. manim:: GetRowsExample :save_last_frame: class GetRowsExample(Scene): def construct(self): m0 = Matrix([["\\pi", 3], [1, 5]]) m0.add(SurroundingRectangle(m0.get_rows()[1])) self.add(m0) """ return VGroup(*(VGroup(*row) for row in self.mob_matrix)) def set_row_colors(self, *colors: str) -> Self: r"""Set individual colors for each row of the matrix. Parameters ---------- colors The list of colors; each color specified corresponds to a row. Returns ------- :class:`Matrix` The current matrix object (self). Examples -------- .. manim:: SetRowColorsExample :save_last_frame: class SetRowColorsExample(Scene): def construct(self): m0 = Matrix([["\\pi", 1], [-1, 3]], ).set_row_colors([RED,BLUE], GREEN) self.add(m0) """ rows = self.get_rows() for color, row in zip(colors, rows, strict=False): row.set_color(color) return self def add_background_to_entries(self) -> Self: """Add a black background rectangle to the matrix, see above for an example. Returns ------- :class:`Matrix` The current matrix object (self). """ for mob in self.get_entries(): mob.add_background_rectangle() return self def get_mob_matrix(self) -> list[list[Mobject]]: """Return the underlying mob matrix mobjects. Returns -------- List[:class:`~.VGroup`] Each VGroup contains a row of the matrix. """ return self.mob_matrix def get_entries(self) -> VGroup: """Return the individual entries of the matrix. Returns -------- :class:`~.VGroup` VGroup containing entries of the matrix. Examples -------- .. manim:: GetEntriesExample :save_last_frame: class GetEntriesExample(Scene): def construct(self): m0 = Matrix([[2, 3], [1, 5]]) ent = m0.get_entries() colors = [BLUE, GREEN, YELLOW, RED] for k in range(len(colors)): ent[k].set_color(colors[k]) self.add(m0) """ return self.elements def get_brackets(self) -> VGroup: r"""Return the bracket mobjects. Returns -------- :class:`~.VGroup` A VGroup containing the left and right bracket. Examples -------- .. manim:: GetBracketsExample :save_last_frame: class GetBracketsExample(Scene): def construct(self): m0 = Matrix([["\\pi", 3], [1, 5]]) bra = m0.get_brackets() colors = [BLUE, GREEN] for k in range(len(colors)): bra[k].set_color(colors[k]) self.add(m0) """ return self.brackets class DecimalMatrix(Matrix): r"""A mobject that displays a matrix with decimal entries on the screen. Examples -------- .. manim:: DecimalMatrixExample :save_last_frame: class DecimalMatrixExample(Scene): def construct(self): m0 = DecimalMatrix( [[3.456, 2.122], [33.2244, 12]], element_to_mobject_config={"num_decimal_places": 2}, left_bracket="\\{", right_bracket="\\}") self.add(m0) """ def __init__( self, matrix: Iterable, element_to_mobject: type[Mobject] = DecimalNumber, element_to_mobject_config: dict[str, Any] = {"num_decimal_places": 1}, **kwargs: Any, ): """ Will round/truncate the decimal places as per the provided config. Parameters ---------- matrix A numpy 2d array or list of lists element_to_mobject Mobject to use, by default DecimalNumber element_to_mobject_config Config for the desired mobject, by default {"num_decimal_places": 1} """ super().__init__( matrix, element_to_mobject=element_to_mobject, element_to_mobject_config=element_to_mobject_config, **kwargs, ) class IntegerMatrix(Matrix): """A mobject that displays a matrix with integer entries on the screen. Examples -------- .. manim:: IntegerMatrixExample :save_last_frame: class IntegerMatrixExample(Scene): def construct(self): m0 = IntegerMatrix( [[3.7, 2], [42.2, 12]], left_bracket="(", right_bracket=")") self.add(m0) """ def __init__( self, matrix: Iterable, element_to_mobject: type[Mobject] = Integer, **kwargs: Any, ): """ Will round if there are decimal entries in the matrix. Parameters ---------- matrix A numpy 2d array or list of lists element_to_mobject Mobject to use, by default Integer """ super().__init__(matrix, element_to_mobject=element_to_mobject, **kwargs) class MobjectMatrix(Matrix): r"""A mobject that displays a matrix of mobject entries on the screen. Examples -------- .. manim:: MobjectMatrixExample :save_last_frame: class MobjectMatrixExample(Scene): def construct(self): a = Circle().scale(0.3) b = Square().scale(0.3) c = MathTex("\\pi").scale(2) d = Star().scale(0.3) m0 = MobjectMatrix([[a, b], [c, d]]) self.add(m0) """ def __init__( self, matrix: Iterable, element_to_mobject: type[Mobject] | Callable[..., Mobject] = lambda m: m, **kwargs: Any, ): super().__init__(matrix, element_to_mobject=element_to_mobject, **kwargs) def get_det_text( matrix: Matrix, determinant: int | str | None = None, background_rect: bool = False, initial_scale_factor: float = 2, ) -> VGroup: r"""Helper function to create determinant. Parameters ---------- matrix The matrix whose determinant is to be created determinant The value of the determinant of the matrix background_rect The background rectangle initial_scale_factor The scale of the text `det` w.r.t the matrix Returns -------- :class:`~.VGroup` A VGroup containing the determinant Examples -------- .. manim:: DeterminantOfAMatrix :save_last_frame: class DeterminantOfAMatrix(Scene): def construct(self): matrix = Matrix([ [2, 0], [-1, 1] ]) # scaling down the `det` string det = get_det_text(matrix, determinant=3, initial_scale_factor=1) # must add the matrix self.add(matrix) self.add(det) """ parens = MathTex("(", ")") parens.scale(initial_scale_factor) parens.stretch_to_fit_height(matrix.height) l_paren, r_paren = parens.split() l_paren.next_to(matrix, LEFT, buff=0.1) r_paren.next_to(matrix, RIGHT, buff=0.1) det = Tex("det") det.scale(initial_scale_factor) det.next_to(l_paren, LEFT, buff=0.1) if background_rect: det.add_background_rectangle() det_text = VGroup(det, l_paren, r_paren) if determinant is not None: eq = MathTex("=") eq.next_to(r_paren, RIGHT, buff=0.1) result = MathTex(str(determinant)) result.next_to(eq, RIGHT, buff=0.2) det_text.add(eq, result) return det_text ManimCommunity-manim-1157b74/manim/mobject/mobject.py000066400000000000000000003377531515024150700225760ustar00rootroot00000000000000"""Base classes for objects that can be displayed.""" from __future__ import annotations __all__ = ["Mobject", "Group", "override_animate"] import copy import inspect import itertools as it import math import operator as op import random import sys import types import warnings from collections.abc import Callable, Iterable from functools import partialmethod, reduce from pathlib import Path from typing import TYPE_CHECKING, Any import numpy as np from manim.data_structures import MethodWithArgs from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from .. import config, logger from ..constants import * from ..utils.color import ( BLACK, PURE_YELLOW, WHITE, ManimColor, ParsableManimColor, color_gradient, interpolate_color, ) from ..utils.exceptions import MultiAnimationOverrideException from ..utils.iterables import list_update, remove_list_redundancies from ..utils.paths import straight_path from ..utils.space_ops import angle_between_vectors, normalize, rotation_matrix if TYPE_CHECKING: from typing import Self, TypeAlias from manim.typing import ( FunctionOverride, MappingFunction, MatrixMN, MultiMappingFunction, PathFuncType, PixelArray, Point3D, Point3DLike, Point3DLike_Array, Vector3DLike, ) from ..animation.animation import Animation TimeBasedUpdater: TypeAlias = Callable[["Mobject", float], object] NonTimeBasedUpdater: TypeAlias = Callable[["Mobject"], object] Updater: TypeAlias = NonTimeBasedUpdater | TimeBasedUpdater class Mobject: """Mathematical Object: base class for objects that can be displayed on screen. There is a compatibility layer that allows for getting and setting generic attributes with ``get_*`` and ``set_*`` methods. See :meth:`set` for more details. Attributes ---------- submobjects : List[:class:`Mobject`] The contained objects. points : :class:`numpy.ndarray` The points of the objects. .. seealso:: :class:`~.VMobject` """ animation_overrides = {} @classmethod def __init_subclass__(cls, **kwargs) -> None: super().__init_subclass__(**kwargs) cls.animation_overrides: dict[ type[Animation], FunctionOverride, ] = {} cls._add_intrinsic_animation_overrides() cls._original__init__ = cls.__init__ def __init__( self, color: ParsableManimColor | list[ParsableManimColor] = WHITE, name: str | None = None, dim: int = 3, target=None, z_index: float = 0, ) -> None: self.name = self.__class__.__name__ if name is None else name self.dim = dim self.target = target self.z_index = z_index self.point_hash = None self.submobjects = [] self.updaters: list[Updater] = [] self.updating_suspended = False self.color = ManimColor.parse(color) self.reset_points() self.generate_points() self.init_colors() def _assert_valid_submobjects(self, submobjects: Iterable[Mobject]) -> Self: """Check that all submobjects are actually instances of :class:`Mobject`, and that none of them is ``self`` (a :class:`Mobject` cannot contain itself). This is an auxiliary function called when adding Mobjects to the :attr:`submobjects` list. This function is intended to be overridden by subclasses such as :class:`VMobject`, which should assert that only other VMobjects may be added into it. Parameters ---------- submobjects The list containing values to validate. Returns ------- :class:`Mobject` The Mobject itself. Raises ------ TypeError If any of the values in `submobjects` is not a :class:`Mobject`. ValueError If there was an attempt to add a :class:`Mobject` as its own submobject. """ return self._assert_valid_submobjects_internal(submobjects, Mobject) def _assert_valid_submobjects_internal( self, submobjects: list[Mobject], mob_class: type[Mobject] ) -> Self: for i, submob in enumerate(submobjects): if not isinstance(submob, mob_class): error_message = ( f"Only values of type {mob_class.__name__} can be added " f"as submobjects of {type(self).__name__}, but the value " f"{submob} (at index {i}) is of type " f"{type(submob).__name__}." ) # Intended for subclasses such as VMobject, which # cannot have regular Mobjects as submobjects if isinstance(submob, Mobject): error_message += ( " You can try adding this value into a Group instead." ) raise TypeError(error_message) if submob is self: raise ValueError( f"Cannot add {type(self).__name__} as a submobject of " f"itself (at index {i})." ) return self @classmethod def animation_override_for( cls, animation_class: type[Animation], ) -> FunctionOverride | None: """Returns the function defining a specific animation override for this class. Parameters ---------- animation_class The animation class for which the override function should be returned. Returns ------- Optional[Callable[[Mobject, ...], Animation]] The function returning the override animation or ``None`` if no such animation override is defined. """ if animation_class in cls.animation_overrides: return cls.animation_overrides[animation_class] return None @classmethod def _add_intrinsic_animation_overrides(cls) -> None: """Initializes animation overrides marked with the :func:`~.override_animation` decorator. """ for method_name in dir(cls): # Ignore dunder methods if method_name.startswith("__"): continue method = getattr(cls, method_name) if hasattr(method, "_override_animation"): animation_class = method._override_animation cls.add_animation_override(animation_class, method) @classmethod def add_animation_override( cls, animation_class: type[Animation], override_func: FunctionOverride, ) -> None: """Add an animation override. This does not apply to subclasses. Parameters ---------- animation_class The animation type to be overridden override_func The function returning an animation replacing the default animation. It gets passed the parameters given to the animation constructor. Raises ------ MultiAnimationOverrideException If the overridden animation was already overridden. """ if animation_class not in cls.animation_overrides: cls.animation_overrides[animation_class] = override_func else: raise MultiAnimationOverrideException( f"The animation {animation_class.__name__} for " f"{cls.__name__} is overridden by more than one method: " f"{cls.animation_overrides[animation_class].__qualname__} and " f"{override_func.__qualname__}.", ) @classmethod def set_default(cls, **kwargs) -> None: """Sets the default values of keyword arguments. If this method is called without any additional keyword arguments, the original default values of the initialization method of this class are restored. Parameters ---------- kwargs Passing any keyword argument will update the default values of the keyword arguments of the initialization function of this class. Examples -------- :: >>> from manim import Square, GREEN >>> Square.set_default(color=GREEN, fill_opacity=0.25) >>> s = Square(); s.color, s.fill_opacity (ManimColor('#83C167'), 0.25) >>> Square.set_default() >>> s = Square(); s.color, s.fill_opacity (ManimColor('#FFFFFF'), 0.0) .. manim:: ChangedDefaultTextcolor :save_last_frame: config.background_color = WHITE class ChangedDefaultTextcolor(Scene): def construct(self): Text.set_default(color=BLACK) self.add(Text("Changing default values is easy!")) # we revert the colour back to the default to prevent a bug in the docs. Text.set_default(color=WHITE) """ if kwargs: cls.__init__ = partialmethod(cls.__init__, **kwargs) else: cls.__init__ = cls._original__init__ @property def animate(self) -> _AnimationBuilder | Self: """Used to animate the application of any method of :code:`self`. Any method called on :code:`animate` is converted to an animation of applying that method on the mobject itself. For example, :code:`square.set_fill(WHITE)` sets the fill color of a square, while :code:`square.animate.set_fill(WHITE)` animates this action. Multiple methods can be put in a single animation once via chaining: :: self.play(my_mobject.animate.shift(RIGHT).rotate(PI)) .. warning:: Passing multiple animations for the same :class:`Mobject` in one call to :meth:`~.Scene.play` is discouraged and will most likely not work properly. Instead of writing an animation like :: self.play( my_mobject.animate.shift(RIGHT), my_mobject.animate.rotate(PI) ) make use of method chaining. Keyword arguments that can be passed to :meth:`.Scene.play` can be passed directly after accessing ``.animate``, like so:: self.play(my_mobject.animate(rate_func=linear).shift(RIGHT)) This is especially useful when animating simultaneous ``.animate`` calls that you want to behave differently:: self.play( mobject1.animate(run_time=2).rotate(PI), mobject2.animate(rate_func=there_and_back).shift(RIGHT), ) .. seealso:: :func:`override_animate` Examples -------- .. manim:: AnimateExample class AnimateExample(Scene): def construct(self): s = Square() self.play(Create(s)) self.play(s.animate.shift(RIGHT)) self.play(s.animate.scale(2)) self.play(s.animate.rotate(PI / 2)) self.play(Uncreate(s)) .. manim:: AnimateChainExample class AnimateChainExample(Scene): def construct(self): s = Square() self.play(Create(s)) self.play(s.animate.shift(RIGHT).scale(2).rotate(PI / 2)) self.play(Uncreate(s)) .. manim:: AnimateWithArgsExample class AnimateWithArgsExample(Scene): def construct(self): s = Square() c = Circle() VGroup(s, c).arrange(RIGHT, buff=2) self.add(s, c) self.play( s.animate(run_time=2).rotate(PI / 2), c.animate(rate_func=there_and_back).shift(RIGHT), ) .. warning:: ``.animate`` will interpolate the :class:`~.Mobject` between its points prior to ``.animate`` and its points after applying ``.animate`` to it. This may result in unexpected behavior when attempting to interpolate along paths, or rotations (see :meth:`.rotate`). If you want animations to consider the points between, consider using :class:`~.ValueTracker` with updaters instead (see :meth:`.add_updater`). """ return _AnimationBuilder(self) @property def always(self) -> Self: """Call a method on a mobject every frame. This is syntactic sugar for ``mob.add_updater(lambda m: m.method(*args, **kwargs), call_updater=True)``. Note that this will call the method immediately. If this behavior is not desired, you should use :meth:`add_updater` directly. .. warning:: Chaining of methods is allowed, but each method will be added as its own updater. If you are chaining methods, make sure they do not interfere with each other or you may get unexpected results. .. warning:: :attr:`always` is not compatible with :meth:`.ValueTracker.get_value`, because the value will be computed once and then never updated again. Use :meth:`add_updater` if you would like to use a :class:`~.ValueTracker` to update the value. Example ------- .. manim:: AlwaysExample class AlwaysExample(Scene): def construct(self): sq = Square().to_edge(LEFT) t = Text("Hello World!") t.always.next_to(sq, UP) self.add(sq, t) self.play(sq.animate.to_edge(RIGHT)) """ # can't use typing.cast because Self is under TYPE_CHECKING return _UpdaterBuilder(self) # type: ignore[return-value] def __deepcopy__(self, clone_from_id) -> Self: cls = self.__class__ result = cls.__new__(cls) clone_from_id[id(self)] = result for k, v in self.__dict__.items(): setattr(result, k, copy.deepcopy(v, clone_from_id)) result.original_id = str(id(self)) return result def __repr__(self) -> str: return str(self.name) def reset_points(self) -> Self: """Sets :attr:`points` to be an empty array.""" self.points = np.zeros((0, self.dim)) return self def init_colors(self) -> object: """Initializes the colors. Gets called upon creation. This is an empty method that can be implemented by subclasses. """ def generate_points(self) -> object: """Initializes :attr:`points` and therefore the shape. Gets called upon creation. This is an empty method that can be implemented by subclasses. """ def add(self, *mobjects: Mobject) -> Self: """Add mobjects as submobjects. The mobjects are added to :attr:`submobjects`. Subclasses of mobject may implement ``+`` and ``+=`` dunder methods. Parameters ---------- mobjects The mobjects to add. Returns ------- :class:`Mobject` ``self`` Raises ------ :class:`ValueError` When a mobject tries to add itself. :class:`TypeError` When trying to add an object that is not an instance of :class:`Mobject`. Notes ----- A mobject cannot contain itself, and it cannot contain a submobject more than once. If the parent mobject is displayed, the newly-added submobjects will also be displayed (i.e. they are automatically added to the parent Scene). See Also -------- :meth:`remove` :meth:`add_to_back` Examples -------- :: >>> outer = Mobject() >>> inner = Mobject() >>> outer = outer.add(inner) Duplicates are not added again:: >>> outer = outer.add(inner) >>> len(outer.submobjects) 1 Only Mobjects can be added:: >>> outer.add(3) Traceback (most recent call last): ... TypeError: Only values of type Mobject can be added as submobjects of Mobject, but the value 3 (at index 0) is of type int. Adding an object to itself raises an error:: >>> outer.add(outer) Traceback (most recent call last): ... ValueError: Cannot add Mobject as a submobject of itself (at index 0). A given mobject cannot be added as a submobject twice to some parent:: >>> parent = Mobject(name="parent") >>> child = Mobject(name="child") >>> parent.add(child, child) [...] WARNING ... parent >>> parent.submobjects [child] """ self._assert_valid_submobjects(mobjects) unique_mobjects = remove_list_redundancies(mobjects) if len(mobjects) != len(unique_mobjects): logger.warning( "Attempted adding some Mobject as a child more than once, " "this is not possible. Repetitions are ignored.", ) self.submobjects = list_update(self.submobjects, unique_mobjects) return self def insert(self, index: int, mobject: Mobject) -> None: """Inserts a mobject at a specific position into self.submobjects Effectively just calls ``self.submobjects.insert(index, mobject)``, where ``self.submobjects`` is a list. Highly adapted from ``Mobject.add``. Parameters ---------- index The index at which mobject The mobject to be inserted. """ self._assert_valid_submobjects([mobject]) self.submobjects.insert(index, mobject) def __add__(self, mobject: Mobject): raise NotImplementedError def __iadd__(self, mobject: Mobject): raise NotImplementedError def add_to_back(self, *mobjects: Mobject) -> Self: """Add all passed mobjects to the back of the submobjects. If :attr:`submobjects` already contains the given mobjects, they just get moved to the back instead. Parameters ---------- mobjects The mobjects to add. Returns ------- :class:`Mobject` ``self`` .. note:: Technically, this is done by adding (or moving) the mobjects to the head of :attr:`submobjects`. The head of this list is rendered first, which places the corresponding mobjects behind the subsequent list members. Raises ------ :class:`ValueError` When a mobject tries to add itself. :class:`TypeError` When trying to add an object that is not an instance of :class:`Mobject`. Notes ----- A mobject cannot contain itself, and it cannot contain a submobject more than once. If the parent mobject is displayed, the newly-added submobjects will also be displayed (i.e. they are automatically added to the parent Scene). See Also -------- :meth:`remove` :meth:`add` """ self._assert_valid_submobjects(mobjects) self.remove(*mobjects) # dict.fromkeys() removes duplicates while maintaining order self.submobjects = list(dict.fromkeys(mobjects)) + self.submobjects return self def remove(self, *mobjects: Mobject) -> Self: """Remove :attr:`submobjects`. The mobjects are removed from :attr:`submobjects`, if they exist. Subclasses of mobject may implement ``-`` and ``-=`` dunder methods. Parameters ---------- mobjects The mobjects to remove. Returns ------- :class:`Mobject` ``self`` See Also -------- :meth:`add` """ for mobject in mobjects: if mobject in self.submobjects: self.submobjects.remove(mobject) return self def __sub__(self, other): raise NotImplementedError def __isub__(self, other): raise NotImplementedError def set(self, **kwargs) -> Self: """Sets attributes. I.e. ``my_mobject.set(foo=1)`` applies ``my_mobject.foo = 1``. This is a convenience to be used along with :attr:`animate` to animate setting attributes. In addition to this method, there is a compatibility layer that allows ``get_*`` and ``set_*`` methods to get and set generic attributes. For instance:: >>> mob = Mobject() >>> mob.set_foo(0) Mobject >>> mob.get_foo() 0 >>> mob.foo 0 This compatibility layer does not interfere with any ``get_*`` or ``set_*`` methods that are explicitly defined. .. warning:: This compatibility layer is for backwards compatibility and is not guaranteed to stay around. Where applicable, please prefer getting/setting attributes normally or with the :meth:`set` method. Parameters ---------- **kwargs The attributes and corresponding values to set. Returns ------- :class:`Mobject` ``self`` Examples -------- :: >>> mob = Mobject() >>> mob.set(foo=0) Mobject >>> mob.foo 0 """ for attr, value in kwargs.items(): setattr(self, attr, value) return self def __getattr__(self, attr: str) -> types.MethodType: # Add automatic compatibility layer # between properties and get_* and set_* # methods. # # In python 3.9+ we could change this # logic to use str.remove_prefix instead. if attr.startswith("get_"): # Remove the "get_" prefix to_get = attr[4:] def getter(self): warnings.warn( "This method is not guaranteed to stay around. Please prefer " "getting the attribute normally.", DeprecationWarning, stacklevel=2, ) return getattr(self, to_get) # Return a bound method return types.MethodType(getter, self) if attr.startswith("set_"): # Remove the "set_" prefix to_set = attr[4:] def setter(self, value): warnings.warn( "This method is not guaranteed to stay around. Please prefer " "setting the attribute normally or with Mobject.set().", DeprecationWarning, stacklevel=2, ) setattr(self, to_set, value) return self # Return a bound method return types.MethodType(setter, self) # Unhandled attribute, therefore error raise AttributeError(f"{type(self).__name__} object has no attribute '{attr}'") @property def width(self) -> float: """The width of the mobject. Returns ------- :class:`float` Examples -------- .. manim:: WidthExample class WidthExample(Scene): def construct(self): decimal = DecimalNumber().to_edge(UP) rect = Rectangle(color=BLUE) rect_copy = rect.copy().set_stroke(GRAY, opacity=0.5) decimal.add_updater(lambda d: d.set_value(rect.width)) self.add(rect_copy, rect, decimal) self.play(rect.animate.set(width=7)) self.wait() See also -------- :meth:`length_over_dim` """ # Get the length across the X dimension return self.length_over_dim(0) @width.setter def width(self, value: float): self.scale_to_fit_width(value) @property def height(self) -> float: """The height of the mobject. Returns ------- :class:`float` Examples -------- .. manim:: HeightExample class HeightExample(Scene): def construct(self): decimal = DecimalNumber().to_edge(UP) rect = Rectangle(color=BLUE) rect_copy = rect.copy().set_stroke(GRAY, opacity=0.5) decimal.add_updater(lambda d: d.set_value(rect.height)) self.add(rect_copy, rect, decimal) self.play(rect.animate.set(height=5)) self.wait() See also -------- :meth:`length_over_dim` """ # Get the length across the Y dimension return self.length_over_dim(1) @height.setter def height(self, value: float): self.scale_to_fit_height(value) @property def depth(self) -> float: """The depth of the mobject. Returns ------- :class:`float` See also -------- :meth:`length_over_dim` """ # Get the length across the Z dimension return self.length_over_dim(2) @depth.setter def depth(self, value: float): self.scale_to_fit_depth(value) # Can't be staticmethod because of point_cloud_mobject.py def get_array_attrs(self) -> list[str]: return ["points"] def apply_over_attr_arrays(self, func: MultiMappingFunction) -> Self: for attr in self.get_array_attrs(): setattr(self, attr, func(getattr(self, attr))) return self # Displaying def get_image(self, camera=None) -> PixelArray: if camera is None: from ..camera.camera import Camera camera = Camera() camera.capture_mobject(self) return camera.get_image() def show(self, camera=None) -> None: self.get_image(camera=camera).show() def save_image(self, name: str | None = None) -> None: """Saves an image of only this :class:`Mobject` at its position to a png file. """ self.get_image().save( Path(config.get_dir("video_dir")).joinpath((name or str(self)) + ".png"), ) def copy(self) -> Self: """Create and return an identical copy of the :class:`Mobject` including all :attr:`submobjects`. Returns ------- :class:`Mobject` The copy. Note ---- The clone is initially not visible in the Scene, even if the original was. """ return copy.deepcopy(self) def generate_target(self, use_deepcopy: bool = False) -> Self: self.target = None # Prevent unbounded linear recursion if use_deepcopy: self.target = copy.deepcopy(self) else: self.target = self.copy() return self.target # Updating def update(self, dt: float = 0, recursive: bool = True) -> Self: """Apply all updaters. Does nothing if updating is suspended. Parameters ---------- dt The parameter ``dt`` to pass to the update functions. Usually this is the time in seconds since the last call of ``update``. recursive Whether to recursively update all submobjects. Returns ------- :class:`Mobject` ``self`` See Also -------- :meth:`add_updater` :meth:`get_updaters` """ if not self.updating_suspended: for updater in self.updaters: if "dt" in inspect.signature(updater).parameters: updater(self, dt) else: updater(self) if recursive: for submob in self.submobjects: submob.update(dt, recursive=recursive) return self def get_time_based_updaters(self) -> list[TimeBasedUpdater]: """Return all updaters using the ``dt`` parameter. The updaters use this parameter as the input for difference in time. Returns ------- List[:class:`Callable`] The list of time based updaters. See Also -------- :meth:`get_updaters` :meth:`has_time_based_updater` """ return [ updater for updater in self.updaters if "dt" in inspect.signature(updater).parameters ] def has_time_based_updater(self) -> bool: """Test if ``self`` has a time based updater. Returns ------- :class:`bool` ``True`` if at least one updater uses the ``dt`` parameter, ``False`` otherwise. See Also -------- :meth:`get_time_based_updaters` """ return any( "dt" in inspect.signature(updater).parameters for updater in self.updaters ) def get_updaters(self) -> list[Updater]: """Return all updaters. Returns ------- List[:class:`Callable`] The list of updaters. See Also -------- :meth:`add_updater` :meth:`get_time_based_updaters` """ return self.updaters def get_family_updaters(self) -> list[Updater]: return list(it.chain(*(sm.get_updaters() for sm in self.get_family()))) def add_updater( self, update_function: Updater, index: int | None = None, call_updater: bool = False, ) -> Self: """Add an update function to this mobject. Update functions, or updaters in short, are functions that are applied to the Mobject in every frame. Parameters ---------- update_function The update function to be added. Whenever :meth:`update` is called, this update function gets called using ``self`` as the first parameter. The updater can have a second parameter ``dt``. If it uses this parameter, it gets called using a second value ``dt``, usually representing the time in seconds since the last call of :meth:`update`. index The index at which the new updater should be added in ``self.updaters``. In case ``index`` is ``None`` the updater will be added at the end. call_updater Whether or not to call the updater initially. If ``True``, the updater will be called using ``dt=0``. Returns ------- :class:`Mobject` ``self`` Examples -------- .. manim:: NextToUpdater class NextToUpdater(Scene): def construct(self): def update_label(mobject): mobject.set_value(dot.get_center()[0]) mobject.next_to(dot) dot = Dot(RIGHT*3) label = DecimalNumber() label.add_updater(update_label) self.add(dot, label) self.play(Rotating(dot, angle=TAU, about_point=ORIGIN, run_time=TAU, rate_func=linear)) .. manim:: DtUpdater class DtUpdater(Scene): def construct(self): square = Square() #Let the square rotate 90ยฐ per second square.add_updater(lambda mobject, dt: mobject.rotate(dt*90*DEGREES)) self.add(square) self.wait(2) See also -------- :meth:`get_updaters` :meth:`remove_updater` :class:`~.UpdateFromFunc` :class:`~.Rotating` :meth:`rotate` :attr:`~.Mobject.animate` """ if index is None: self.updaters.append(update_function) else: self.updaters.insert(index, update_function) if call_updater: parameters = inspect.signature(update_function).parameters if "dt" in parameters: update_function(self, 0) else: update_function(self) return self def remove_updater(self, update_function: Updater) -> Self: """Remove an updater. If the same updater is applied multiple times, every instance gets removed. Parameters ---------- update_function The update function to be removed. Returns ------- :class:`Mobject` ``self`` See also -------- :meth:`clear_updaters` :meth:`add_updater` :meth:`get_updaters` """ while update_function in self.updaters: self.updaters.remove(update_function) return self def clear_updaters(self, recursive: bool = True) -> Self: """Remove every updater. Parameters ---------- recursive Whether to recursively call ``clear_updaters`` on all submobjects. Returns ------- :class:`Mobject` ``self`` See also -------- :meth:`remove_updater` :meth:`add_updater` :meth:`get_updaters` """ self.updaters = [] if recursive: for submob in self.submobjects: submob.clear_updaters() return self def match_updaters(self, mobject: Mobject) -> Self: """Match the updaters of the given mobject. Parameters ---------- mobject The mobject whose updaters get matched. Returns ------- :class:`Mobject` ``self`` Note ---- All updaters from submobjects are removed, but only updaters of the given mobject are matched, not those of it's submobjects. See also -------- :meth:`add_updater` :meth:`clear_updaters` """ self.clear_updaters() for updater in mobject.get_updaters(): self.add_updater(updater) return self def suspend_updating(self, recursive: bool = True) -> Self: """Disable updating from updaters and animations. Parameters ---------- recursive Whether to recursively suspend updating on all submobjects. Returns ------- :class:`Mobject` ``self`` See also -------- :meth:`resume_updating` :meth:`add_updater` """ self.updating_suspended = True if recursive: for submob in self.submobjects: submob.suspend_updating(recursive) return self def resume_updating(self, recursive: bool = True) -> Self: """Enable updating from updaters and animations. Parameters ---------- recursive Whether to recursively enable updating on all submobjects. Returns ------- :class:`Mobject` ``self`` See also -------- :meth:`suspend_updating` :meth:`add_updater` """ self.updating_suspended = False if recursive: for submob in self.submobjects: submob.resume_updating(recursive) self.update(dt=0, recursive=recursive) return self # Transforming operations def apply_to_family(self, func: Callable[[Mobject], None]) -> None: """Apply a function to ``self`` and every submobject with points recursively. Parameters ---------- func The function to apply to each mobject. ``func`` gets passed the respective (sub)mobject as parameter. Returns ------- :class:`Mobject` ``self`` See also -------- :meth:`family_members_with_points` """ for mob in self.family_members_with_points(): func(mob) def shift(self, *vectors: Vector3DLike) -> Self: """Shift by the given vectors. Parameters ---------- vectors Vectors to shift by. If multiple vectors are given, they are added together. Returns ------- :class:`Mobject` ``self`` See also -------- :meth:`move_to` """ total_vector = reduce(op.add, vectors) for mob in self.family_members_with_points(): mob.points = mob.points.astype("float") mob.points += total_vector return self def scale( self, scale_factor: float, *, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: r"""Scale the size by a factor. Default behavior is to scale about the center of the mobject. Parameters ---------- scale_factor The scaling factor :math:`\alpha`. If :math:`0 < |\alpha|ย < 1`, the mobject will shrink, and for :math:`|\alpha| > 1` it will grow. Furthermore, if :math:`\alpha < 0`, the mobject is also flipped. about_point The point about which to apply the scaling. about_edge The edge about which to apply the scaling. Returns ------- :class:`Mobject` ``self`` Examples -------- .. manim:: MobjectScaleExample :save_last_frame: class MobjectScaleExample(Scene): def construct(self): f1 = Text("F") f2 = Text("F").scale(2) f3 = Text("F").scale(0.5) f4 = Text("F").scale(-1) vgroup = VGroup(f1, f2, f3, f4).arrange(6 * RIGHT) self.add(vgroup) See also -------- :meth:`move_to` """ self.apply_points_function_about_point( lambda points: scale_factor * points, about_point, about_edge ) return self def rotate_about_origin(self, angle: float, axis: Vector3DLike = OUT) -> Self: """Rotates the :class:`~.Mobject` about the ORIGIN, which is at [0,0,0].""" return self.rotate(angle, axis, about_point=ORIGIN) def rotate( self, angle: float, axis: Vector3DLike = OUT, *, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: """Rotates the :class:`~.Mobject` around a specified axis and point. Parameters ---------- angle The angle of rotation in radians. Predefined constants such as ``DEGREES`` can also be used to specify the angle in degrees. axis The rotation axis (see :class:`~.Rotating` for more). about_point The point about which the mobject rotates. If ``None``, rotation occurs around the center of the mobject. about_edge The edge about which to apply the scaling. Returns ------- :class:`Mobject` ``self`` (for method chaining) .. note:: To animate a rotation, use :class:`~.Rotating` or :class:`~.Rotate` instead of ``.animate.rotate(...)``. The ``.animate.rotate(...)`` syntax only applies a transformation from the initial state to the final rotated state (interpolation between the two states), without showing proper rotational motion based on the angle (from 0 to the given angle). Examples -------- .. manim:: RotateMethodExample :save_last_frame: class RotateMethodExample(Scene): def construct(self): circle = Circle(radius=1, color=BLUE) line = Line(start=ORIGIN, end=RIGHT) arrow1 = Arrow(start=ORIGIN, end=RIGHT, buff=0, color=GOLD) group1 = VGroup(circle, line, arrow1) group2 = group1.copy() arrow2 = group2[2] arrow2.rotate(angle=PI / 4, about_point=arrow2.get_start()) group3 = group1.copy() arrow3 = group3[2] arrow3.rotate(angle=120 * DEGREES, about_point=arrow3.get_start()) self.add(VGroup(group1, group2, group3).arrange(RIGHT, buff=1)) See also -------- :class:`~.Rotating`, :class:`~.Rotate`, :attr:`~.Mobject.animate`, :meth:`apply_points_function_about_point` """ rot_matrix = rotation_matrix(angle, axis) self.apply_points_function_about_point( lambda points: np.dot(points, rot_matrix.T), about_point, about_edge ) return self def flip( self, axis: Vector3DLike = UP, *, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: """Flips/Mirrors an mobject about its center. Examples -------- .. manim:: FlipExample :save_last_frame: class FlipExample(Scene): def construct(self): s= Line(LEFT, RIGHT+UP).shift(4*LEFT) self.add(s) s2= s.copy().flip() self.add(s2) """ return self.rotate( TAU / 2, axis, about_point=about_point, about_edge=about_edge ) def stretch( self, factor: float, dim: int, *, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: def func(points: Point3D_Array) -> Point3D_Array: points[:, dim] *= factor return points self.apply_points_function_about_point(func, about_point, about_edge) return self def apply_function( self, function: MappingFunction, *, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: # Default to applying matrix about the origin, not mobjects center if about_point is None and about_edge is None: about_point = ORIGIN def multi_mapping_function(points: Point3D_Array) -> Point3D_Array: result: Point3D_Array = np.apply_along_axis(function, 1, points) return result self.apply_points_function_about_point( multi_mapping_function, about_point, about_edge, ) return self def apply_function_to_position(self, function: MappingFunction) -> Self: self.move_to(function(self.get_center())) return self def apply_function_to_submobject_positions(self, function: MappingFunction) -> Self: for submob in self.submobjects: submob.apply_function_to_position(function) return self def apply_matrix( self, matrix: MatrixMN, *, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: # Default to applying matrix about the origin, not mobjects center if about_point is None and about_edge is None: about_point = ORIGIN full_matrix = np.identity(self.dim) matrix = np.array(matrix) full_matrix[: matrix.shape[0], : matrix.shape[1]] = matrix self.apply_points_function_about_point( lambda points: np.dot(points, full_matrix.T), about_point, about_edge ) return self def apply_complex_function( self, function: Callable[[complex], complex], *, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: """Applies a complex function to a :class:`Mobject`. The x and y Point3Ds correspond to the real and imaginary parts respectively. Example ------- .. manim:: ApplyFuncExample class ApplyFuncExample(Scene): def construct(self): circ = Circle().scale(1.5) circ_ref = circ.copy() circ.apply_complex_function( lambda x: np.exp(x*1j) ) t = ValueTracker(0) circ.add_updater( lambda x: x.become(circ_ref.copy().apply_complex_function( lambda x: np.exp(x+t.get_value()*1j) )).set_color(BLUE) ) self.add(circ_ref) self.play(TransformFromCopy(circ_ref, circ)) self.play(t.animate.set_value(TAU), run_time=3) """ def R3_func(point): x, y, z = point xy_complex = function(complex(x, y)) return [xy_complex.real, xy_complex.imag, z] return self.apply_function( R3_func, about_point=about_point, about_edge=about_edge ) def reverse_points(self) -> Self: for mob in self.family_members_with_points(): mob.apply_over_attr_arrays(lambda arr: np.array(list(reversed(arr)))) return self def repeat(self, count: int) -> Self: """This can make transition animations nicer""" def repeat_array(array): return reduce(lambda a1, a2: np.append(a1, a2, axis=0), [array] * count) for mob in self.family_members_with_points(): mob.apply_over_attr_arrays(repeat_array) return self # In place operations. # Note, much of these are now redundant with default behavior of # above methods # TODO: name is inconsistent with OpenGLMobject.apply_points_function() def apply_points_function_about_point( self, func: MultiMappingFunction, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: if about_point is None: if about_edge is None: about_edge = ORIGIN about_point = self.get_critical_point(about_edge) # Make a copy to prevent mutation of the original array if about_point is a view about_point = np.array(about_point, copy=True) for mob in self.family_members_with_points(): mob.points -= about_point mob.points = func(mob.points) mob.points += about_point return self def pose_at_angle(self, **kwargs): self.rotate(TAU / 14, RIGHT + UP, **kwargs) return self # Positioning methods def center(self) -> Self: """Moves the center of the mobject to the center of the scene. Returns ------- :class:`.Mobject` The centered mobject. """ self.shift(-self.get_center()) return self def align_on_border( self, direction: Vector3DLike, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER ) -> Self: """Direction just needs to be a vector pointing towards side or corner in the 2d plane. """ target_point = np.sign(direction) * ( config["frame_x_radius"], config["frame_y_radius"], 0, ) point_to_align = self.get_critical_point(direction) shift_val = target_point - point_to_align - buff * np.array(direction) shift_val = shift_val * abs(np.sign(direction)) self.shift(shift_val) return self def to_corner( self, corner: Vector3DLike = DL, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER ) -> Self: """Moves this :class:`~.Mobject` to the given corner of the screen. Returns ------- :class:`.Mobject` The newly positioned mobject. Examples -------- .. manim:: ToCornerExample :save_last_frame: class ToCornerExample(Scene): def construct(self): c = Circle() c.to_corner(UR) t = Tex("To the corner!") t2 = MathTex("x^3").shift(DOWN) self.add(c,t,t2) t.to_corner(DL, buff=0) t2.to_corner(UL, buff=1.5) """ return self.align_on_border(corner, buff) def to_edge( self, edge: Vector3DLike = LEFT, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER ) -> Self: """Moves this :class:`~.Mobject` to the given edge of the screen, without affecting its position in the other dimension. Returns ------- :class:`.Mobject` The newly positioned mobject. Examples -------- .. manim:: ToEdgeExample :save_last_frame: class ToEdgeExample(Scene): def construct(self): tex_top = Tex("I am at the top!") tex_top.to_edge(UP) tex_side = Tex("I am moving to the side!") c = Circle().shift(2*DOWN) self.add(tex_top, tex_side, c) tex_side.to_edge(LEFT) c.to_edge(RIGHT, buff=0) """ return self.align_on_border(edge, buff) def next_to( self, mobject_or_point: Mobject | Point3DLike, direction: Vector3DLike = RIGHT, buff: float = DEFAULT_MOBJECT_TO_MOBJECT_BUFFER, aligned_edge: Vector3DLike = ORIGIN, submobject_to_align: Mobject | None = None, index_of_submobject_to_align: int | None = None, coor_mask: Vector3DLike = np.array([1, 1, 1]), ) -> Self: """Move this :class:`~.Mobject` next to another's :class:`~.Mobject` or Point3D. Examples -------- .. manim:: GeometricShapes :save_last_frame: class GeometricShapes(Scene): def construct(self): d = Dot() c = Circle() s = Square() t = Triangle() d.next_to(c, RIGHT) s.next_to(c, LEFT) t.next_to(c, DOWN) self.add(d, c, s, t) """ np_direction = np.asarray(direction) np_aligned_edge = np.asarray(aligned_edge) if isinstance(mobject_or_point, Mobject): mob = mobject_or_point if index_of_submobject_to_align is not None: target_aligner = mob[index_of_submobject_to_align] else: target_aligner = mob target_point = target_aligner.get_critical_point( np_aligned_edge + np_direction ) else: target_point = mobject_or_point if submobject_to_align is not None: aligner = submobject_to_align elif index_of_submobject_to_align is not None: aligner = self[index_of_submobject_to_align] else: aligner = self point_to_align = aligner.get_critical_point(np_aligned_edge - np_direction) self.shift((target_point - point_to_align + buff * np_direction) * coor_mask) return self def shift_onto_screen(self, **kwargs) -> Self: space_lengths = [config["frame_x_radius"], config["frame_y_radius"]] for vect in UP, DOWN, LEFT, RIGHT: dim = np.argmax(np.abs(vect)) buff = kwargs.get("buff", DEFAULT_MOBJECT_TO_EDGE_BUFFER) max_val = space_lengths[dim] - buff edge_center = self.get_edge_center(vect) if np.dot(edge_center, vect) > max_val: self.to_edge(vect, **kwargs) return self def is_off_screen(self): if self.get_left()[0] > config["frame_x_radius"]: return True if self.get_right()[0] < -config["frame_x_radius"]: return True if self.get_bottom()[1] > config["frame_y_radius"]: return True return self.get_top()[1] < -config["frame_y_radius"] def stretch_about_point(self, factor: float, dim: int, point: Point3DLike) -> Self: return self.stretch(factor, dim, about_point=point) def rescale_to_fit( self, length: float, dim: int, stretch: bool = False, **kwargs ) -> Self: old_length = self.length_over_dim(dim) if old_length == 0: return self if stretch: self.stretch(length / old_length, dim, **kwargs) else: self.scale(length / old_length, **kwargs) return self def scale_to_fit_width(self, width: float, **kwargs) -> Self: """Scales the :class:`~.Mobject` to fit a width while keeping height/depth proportional. Returns ------- :class:`Mobject` ``self`` Examples -------- :: >>> from manim import * >>> sq = Square() >>> sq.height np.float64(2.0) >>> sq.scale_to_fit_width(5) Square >>> sq.width np.float64(5.0) >>> sq.height np.float64(5.0) """ return self.rescale_to_fit(width, 0, stretch=False, **kwargs) def stretch_to_fit_width(self, width: float, **kwargs) -> Self: """Stretches the :class:`~.Mobject` to fit a width, not keeping height/depth proportional. Returns ------- :class:`Mobject` ``self`` Examples -------- :: >>> from manim import * >>> sq = Square() >>> sq.height np.float64(2.0) >>> sq.stretch_to_fit_width(5) Square >>> sq.width np.float64(5.0) >>> sq.height np.float64(2.0) """ return self.rescale_to_fit(width, 0, stretch=True, **kwargs) def scale_to_fit_height(self, height: float, **kwargs) -> Self: """Scales the :class:`~.Mobject` to fit a height while keeping width/depth proportional. Returns ------- :class:`Mobject` ``self`` Examples -------- :: >>> from manim import * >>> sq = Square() >>> sq.width np.float64(2.0) >>> sq.scale_to_fit_height(5) Square >>> sq.height np.float64(5.0) >>> sq.width np.float64(5.0) """ return self.rescale_to_fit(height, 1, stretch=False, **kwargs) def stretch_to_fit_height(self, height: float, **kwargs) -> Self: """Stretches the :class:`~.Mobject` to fit a height, not keeping width/depth proportional. Returns ------- :class:`Mobject` ``self`` Examples -------- :: >>> from manim import * >>> sq = Square() >>> sq.width np.float64(2.0) >>> sq.stretch_to_fit_height(5) Square >>> sq.height np.float64(5.0) >>> sq.width np.float64(2.0) """ return self.rescale_to_fit(height, 1, stretch=True, **kwargs) def scale_to_fit_depth(self, depth: float, **kwargs) -> Self: """Scales the :class:`~.Mobject` to fit a depth while keeping width/height proportional.""" return self.rescale_to_fit(depth, 2, stretch=False, **kwargs) def stretch_to_fit_depth(self, depth: float, **kwargs) -> Self: """Stretches the :class:`~.Mobject` to fit a depth, not keeping width/height proportional.""" return self.rescale_to_fit(depth, 2, stretch=True, **kwargs) def set_coord(self, value, dim: int, direction: Vector3DLike = ORIGIN) -> Self: curr = self.get_coord(dim, direction) shift_vect = np.zeros(self.dim) shift_vect[dim] = value - curr self.shift(shift_vect) return self def set_x(self, x: float, direction: Vector3DLike = ORIGIN) -> Self: """Set x value of the center of the :class:`~.Mobject` (``int`` or ``float``)""" return self.set_coord(x, 0, direction) def set_y(self, y: float, direction: Vector3DLike = ORIGIN) -> Self: """Set y value of the center of the :class:`~.Mobject` (``int`` or ``float``)""" return self.set_coord(y, 1, direction) def set_z(self, z: float, direction: Vector3DLike = ORIGIN) -> Self: """Set z value of the center of the :class:`~.Mobject` (``int`` or ``float``)""" return self.set_coord(z, 2, direction) def space_out_submobjects(self, factor: float = 1.5, **kwargs) -> Self: self.scale(factor, **kwargs) for submob in self.submobjects: submob.scale(1.0 / factor) return self def move_to( self, point_or_mobject: Point3DLike | Mobject, aligned_edge: Vector3DLike = ORIGIN, coor_mask: Vector3DLike = np.array([1, 1, 1]), ) -> Self: """Move center of the :class:`~.Mobject` to certain Point3D.""" if isinstance(point_or_mobject, Mobject): target = point_or_mobject.get_critical_point(aligned_edge) else: target = point_or_mobject point_to_align = self.get_critical_point(aligned_edge) self.shift((target - point_to_align) * coor_mask) return self def replace( self, mobject: Mobject, dim_to_match: int = 0, stretch: bool = False ) -> Self: if not mobject.get_num_points() and not mobject.submobjects: raise Warning("Attempting to replace mobject with no points") if stretch: self.stretch_to_fit_width(mobject.width) self.stretch_to_fit_height(mobject.height) else: self.rescale_to_fit( mobject.length_over_dim(dim_to_match), dim_to_match, stretch=False, ) self.shift(mobject.get_center() - self.get_center()) return self def surround( self, mobject: Mobject, dim_to_match: int = 0, stretch: bool = False, buff: float = MED_SMALL_BUFF, ) -> Self: self.replace(mobject, dim_to_match, stretch) length = mobject.length_over_dim(dim_to_match) self.scale((length + buff) / length) return self def put_start_and_end_on(self, start: Point3DLike, end: Point3DLike) -> Self: curr_start, curr_end = self.get_start_and_end() curr_vect = curr_end - curr_start if np.all(curr_vect == 0): # TODO: this looks broken. It makes self.points a Point3D instead # of a Point3D_Array. However, modifying this breaks some tests # where this is currently expected. self.points = np.array(start) return self target_vect = np.asarray(end) - np.asarray(start) axis = ( normalize(np.cross(curr_vect, target_vect)) if np.linalg.norm(np.cross(curr_vect, target_vect)) != 0 else OUT ) self.scale( np.linalg.norm(target_vect) / np.linalg.norm(curr_vect), about_point=curr_start, ) self.rotate( angle_between_vectors(curr_vect, target_vect), about_point=curr_start, axis=axis, ) self.shift(start - curr_start) return self # Background rectangle def add_background_rectangle( self, color: ParsableManimColor | None = None, opacity: float = 0.75, **kwargs ) -> Self: """Add a BackgroundRectangle as submobject. The BackgroundRectangle is added behind other submobjects. This can be used to increase the mobjects visibility in front of a noisy background. Parameters ---------- color The color of the BackgroundRectangle opacity The opacity of the BackgroundRectangle kwargs Additional keyword arguments passed to the BackgroundRectangle constructor Returns ------- :class:`Mobject` ``self`` See Also -------- :meth:`add_to_back` :class:`~.BackgroundRectangle` """ # TODO, this does not behave well when the mobject has points, # since it gets displayed on top from manim.mobject.geometry.shape_matchers import BackgroundRectangle self.background_rectangle = BackgroundRectangle( self, color=color, fill_opacity=opacity, **kwargs ) self.add_to_back(self.background_rectangle) return self def add_background_rectangle_to_submobjects(self, **kwargs) -> Self: for submobject in self.submobjects: submobject.add_background_rectangle(**kwargs) return self def add_background_rectangle_to_family_members_with_points(self, **kwargs) -> Self: for mob in self.family_members_with_points(): mob.add_background_rectangle(**kwargs) return self # Color functions def set_color( self, color: ParsableManimColor = PURE_YELLOW, family: bool = True ) -> Self: """Condition is function which takes in one arguments, (x, y, z). Here it just recurses to submobjects, but in subclasses this should be further implemented based on the the inner workings of color """ if family: for submob in self.submobjects: submob.set_color(color, family=family) self.color = ManimColor.parse(color) return self def set_color_by_gradient(self, *colors: ParsableManimColor) -> Self: """ Parameters ---------- colors The colors to use for the gradient. Use like `set_color_by_gradient(RED, BLUE, GREEN)`. self.color = ManimColor.parse(color) return self """ self.set_submobject_colors_by_gradient(*colors) return self def set_colors_by_radial_gradient( self, center: Point3DLike | None = None, radius: float = 1, inner_color: ParsableManimColor = WHITE, outer_color: ParsableManimColor = BLACK, ) -> Self: self.set_submobject_colors_by_radial_gradient( center, radius, inner_color, outer_color, ) return self def set_submobject_colors_by_gradient(self, *colors: Iterable[ParsableManimColor]): if len(colors) == 0: raise ValueError("Need at least one color") elif len(colors) == 1: return self.set_color(*colors) mobs = self.family_members_with_points() new_colors = color_gradient(colors, len(mobs)) for mob, color in zip(mobs, new_colors, strict=True): mob.set_color(color, family=False) return self def set_submobject_colors_by_radial_gradient( self, center: Point3DLike | None = None, radius: float = 1, inner_color: ParsableManimColor = WHITE, outer_color: ParsableManimColor = BLACK, ) -> Self: if center is None: center = self.get_center() for mob in self.family_members_with_points(): t = np.linalg.norm(mob.get_center() - center) / radius t = min(t, 1) mob_color = interpolate_color(inner_color, outer_color, t) mob.set_color(mob_color, family=False) return self def to_original_color(self) -> Self: self.set_color(self.color) return self def fade_to( self, color: ParsableManimColor, alpha: float, family: bool = True ) -> Self: if self.get_num_points() > 0: new_color = interpolate_color(self.get_color(), color, alpha) self.set_color(new_color, family=False) if family: for submob in self.submobjects: submob.fade_to(color, alpha) return self def fade(self, darkness: float = 0.5, family: bool = True) -> Self: if family: for submob in self.submobjects: submob.fade(darkness, family) return self def get_color(self) -> ManimColor: """Returns the color of the :class:`~.Mobject` Examples -------- :: >>> from manim import Square, RED >>> Square(color=RED).get_color() == RED True """ return self.color ## def save_state(self) -> Self: """Save the current state (position, color & size). Can be restored with :meth:`~.Mobject.restore`.""" if hasattr(self, "saved_state"): # Prevent exponential growth of data self.saved_state = None self.saved_state = self.copy() return self def restore(self) -> Self: """Restores the state that was previously saved with :meth:`~.Mobject.save_state`.""" if not hasattr(self, "saved_state") or self.save_state is None: raise Exception("Trying to restore without having saved") self.become(self.saved_state) return self def reduce_across_dimension(self, reduce_func: Callable, dim: int): """Find the min or max value from a dimension across all points in this and submobjects.""" assert dim >= 0 assert dim <= 2 if len(self.submobjects) == 0 and len(self.points) == 0: # If we have no points and no submobjects, return 0 (e.g. center) return 0 # If we do not have points (but do have submobjects) # use only the points from those. if len(self.points) == 0: # noqa: SIM108 rv = None else: # Otherwise, be sure to include our own points rv = reduce_func(self.points[:, dim]) # Recursively ask submobjects (if any) for the biggest/ # smallest dimension they have and compare it to the return value. for mobj in self.submobjects: value = mobj.reduce_across_dimension(reduce_func, dim) rv = value if rv is None else reduce_func([value, rv]) return rv def nonempty_submobjects(self) -> list[Self]: return [ submob for submob in self.submobjects if len(submob.submobjects) != 0 or len(submob.points) != 0 ] def get_merged_array(self, array_attr: str) -> np.ndarray: """Return all of a given attribute from this mobject and all submobjects. May contain duplicates; the order is in a depth-first (pre-order) traversal of the submobjects. """ result = getattr(self, array_attr) for submob in self.submobjects: result = np.append(result, submob.get_merged_array(array_attr), axis=0) return result def get_all_points(self) -> Point3D_Array: """Return all points from this mobject and all submobjects. May contain duplicates; the order is in a depth-first (pre-order) traversal of the submobjects. """ return self.get_merged_array("points") # Getters def get_points_defining_boundary(self) -> Point3D_Array: return self.get_all_points() def get_num_points(self) -> int: return len(self.points) def get_extremum_along_dim( self, points: Point3DLike_Array | None = None, dim: int = 0, key: int = 0 ) -> float: np_points: Point3D_Array = ( self.get_points_defining_boundary() if points is None else np.asarray(points) ) values = np_points[:, dim] if key < 0: return np.min(values) elif key == 0: return (np.min(values) + np.max(values)) / 2 else: return np.max(values) def get_critical_point(self, direction: Vector3DLike) -> Point3D: """Picture a box bounding the :class:`~.Mobject`. Such a box has 9 'critical points': 4 corners, 4 edge center, the center. This returns one of them, along the given direction. :: sample = Arc(start_angle=PI / 7, angle=PI / 5) # These are all equivalent max_y_1 = sample.get_top()[1] max_y_2 = sample.get_critical_point(UP)[1] max_y_3 = sample.get_extremum_along_dim(dim=1, key=1) """ result = np.zeros(self.dim) all_points = self.get_points_defining_boundary() if len(all_points) == 0: return result for dim in range(self.dim): result[dim] = self.get_extremum_along_dim( all_points, dim=dim, key=direction[dim], ) return result # Pseudonyms for more general get_critical_point method def get_edge_center(self, direction: Vector3DLike) -> Point3D: """Get edge Point3Ds for certain direction.""" return self.get_critical_point(direction) def get_corner(self, direction: Vector3DLike) -> Point3D: """Get corner Point3Ds for certain direction.""" return self.get_critical_point(direction) def get_center(self) -> Point3D: """Get center Point3Ds""" return self.get_critical_point(np.zeros(self.dim)) def get_center_of_mass(self) -> Point3D: return np.apply_along_axis(np.mean, 0, self.get_all_points()) def get_boundary_point(self, direction: Vector3DLike) -> Point3D: all_points = self.get_points_defining_boundary() index = np.argmax(np.dot(all_points, direction)) return all_points[index] def get_midpoint(self) -> Point3D: """Get Point3Ds of the middle of the path that forms the :class:`~.Mobject`. Examples -------- .. manim:: AngleMidPoint :save_last_frame: class AngleMidPoint(Scene): def construct(self): line1 = Line(ORIGIN, 2*RIGHT) line2 = Line(ORIGIN, 2*RIGHT).rotate_about_origin(80*DEGREES) a = Angle(line1, line2, radius=1.5, other_angle=False) d = Dot(a.get_midpoint()).set_color(RED) self.add(line1, line2, a, d) self.wait() """ return self.point_from_proportion(0.5) def get_top(self) -> Point3D: """Get top Point3Ds of a box bounding the :class:`~.Mobject`""" return self.get_edge_center(UP) def get_bottom(self) -> Point3D: """Get bottom Point3Ds of a box bounding the :class:`~.Mobject`""" return self.get_edge_center(DOWN) def get_right(self) -> Point3D: """Get right Point3Ds of a box bounding the :class:`~.Mobject`""" return self.get_edge_center(RIGHT) def get_left(self) -> Point3D: """Get left Point3Ds of a box bounding the :class:`~.Mobject`""" return self.get_edge_center(LEFT) def get_zenith(self) -> Point3D: """Get zenith Point3Ds of a box bounding a 3D :class:`~.Mobject`.""" return self.get_edge_center(OUT) def get_nadir(self) -> Point3D: """Get nadir (opposite the zenith) Point3Ds of a box bounding a 3D :class:`~.Mobject`.""" return self.get_edge_center(IN) def length_over_dim(self, dim: int) -> float: """Measure the length of an :class:`~.Mobject` in a certain direction.""" return self.reduce_across_dimension( max, dim, ) - self.reduce_across_dimension(min, dim) def get_coord(self, dim: int, direction: Vector3DLike = ORIGIN) -> float: """Meant to generalize ``get_x``, ``get_y`` and ``get_z``""" return self.get_extremum_along_dim(dim=dim, key=direction[dim]) def get_x(self, direction: Vector3DLike = ORIGIN) -> float: """Returns x Point3D of the center of the :class:`~.Mobject` as ``float``""" return self.get_coord(0, direction) def get_y(self, direction: Vector3DLike = ORIGIN) -> float: """Returns y Point3D of the center of the :class:`~.Mobject` as ``float``""" return self.get_coord(1, direction) def get_z(self, direction: Vector3DLike = ORIGIN) -> float: """Returns z Point3D of the center of the :class:`~.Mobject` as ``float``""" return self.get_coord(2, direction) def get_start(self) -> Point3D: """Returns the point, where the stroke that surrounds the :class:`~.Mobject` starts.""" self.throw_error_if_no_points() return np.array(self.points[0]) def get_end(self) -> Point3D: """Returns the point, where the stroke that surrounds the :class:`~.Mobject` ends.""" self.throw_error_if_no_points() return np.array(self.points[-1]) def get_start_and_end(self) -> tuple[Point3D, Point3D]: """Returns starting and ending point of a stroke as a ``tuple``.""" return self.get_start(), self.get_end() def point_from_proportion(self, alpha: float) -> Point3D: raise NotImplementedError("Please override in a child class.") def proportion_from_point(self, point: Point3DLike) -> float: raise NotImplementedError("Please override in a child class.") def get_pieces(self, n_pieces: float) -> Group: template = self.copy() template.submobjects = [] alphas = np.linspace(0, 1, n_pieces + 1) return Group( *( template.copy().pointwise_become_partial(self, a1, a2) for a1, a2 in zip(alphas[:-1], alphas[1:], strict=True) ) ) def get_z_index_reference_point(self) -> Point3D: # TODO, better place to define default z_index_group? z_index_group = getattr(self, "z_index_group", self) return z_index_group.get_center() def has_points(self) -> bool: """Check if :class:`~.Mobject` contains points.""" return len(self.points) > 0 def has_no_points(self) -> bool: """Check if :class:`~.Mobject` *does not* contains points.""" return not self.has_points() # Match other mobject properties def match_color(self, mobject: Mobject) -> Self: """Match the color with the color of another :class:`~.Mobject`.""" return self.set_color(mobject.get_color()) def match_dim_size(self, mobject: Mobject, dim: int, **kwargs) -> Self: """Match the specified dimension with the dimension of another :class:`~.Mobject`.""" return self.rescale_to_fit(mobject.length_over_dim(dim), dim, **kwargs) def match_width(self, mobject: Mobject, **kwargs) -> Self: """Match the width with the width of another :class:`~.Mobject`.""" return self.match_dim_size(mobject, 0, **kwargs) def match_height(self, mobject: Mobject, **kwargs) -> Self: """Match the height with the height of another :class:`~.Mobject`.""" return self.match_dim_size(mobject, 1, **kwargs) def match_depth(self, mobject: Mobject, **kwargs) -> Self: """Match the depth with the depth of another :class:`~.Mobject`.""" return self.match_dim_size(mobject, 2, **kwargs) def match_coord( self, mobject: Mobject, dim: int, direction: Vector3DLike = ORIGIN ) -> Self: """Match the Point3Ds with the Point3Ds of another :class:`~.Mobject`.""" return self.set_coord( mobject.get_coord(dim, direction), dim=dim, direction=direction, ) def match_x(self, mobject: Mobject, direction=ORIGIN) -> Self: """Match x coord. to the x coord. of another :class:`~.Mobject`.""" return self.match_coord(mobject, 0, direction) def match_y(self, mobject: Mobject, direction=ORIGIN) -> Self: """Match y coord. to the x coord. of another :class:`~.Mobject`.""" return self.match_coord(mobject, 1, direction) def match_z(self, mobject: Mobject, direction=ORIGIN) -> Self: """Match z coord. to the x coord. of another :class:`~.Mobject`.""" return self.match_coord(mobject, 2, direction) def align_to( self, mobject_or_point: Mobject | Point3DLike, direction: Vector3DLike = ORIGIN, ) -> Self: """Aligns mobject to another :class:`~.Mobject` in a certain direction. Examples: mob1.align_to(mob2, UP) moves mob1 vertically so that its top edge lines ups with mob2's top edge. """ if isinstance(mobject_or_point, Mobject): point = mobject_or_point.get_critical_point(direction) else: point = mobject_or_point for dim in range(self.dim): if direction[dim] != 0: self.set_coord(point[dim], dim, direction) return self # Family matters def __getitem__(self, value): self_list = self.split() if isinstance(value, slice): GroupClass = self.get_group_class() return GroupClass(*self_list.__getitem__(value)) return self_list.__getitem__(value) def __iter__(self): return iter(self.split()) def __len__(self) -> int: return len(self.split()) def get_group_class(self) -> type[Group]: return Group @staticmethod def get_mobject_type_class() -> type[Mobject]: """Return the base class of this mobject type.""" return Mobject def split(self) -> list[Self]: result = [self] if len(self.points) > 0 else [] return result + self.submobjects def get_family(self, recurse: bool = True) -> list[Self]: """Lists all mobjects in the hierarchy (family) of the given mobject, including the mobject itself and all its submobjects recursively. Parameters ---------- recurse Just for consistency with get_family method in OpenGLMobject. Returns ------- list[Mobject] A list of mobjects in the family of the given mobject. Examples -------- :: >>> from manim import Square, Rectangle, VGroup, Group, Mobject, VMobject >>> s, r, m, v = Square(), Rectangle(), Mobject(), VMobject() >>> vg = VGroup(s, r) >>> gr = Group(vg, m, v) >>> gr.get_family() [Group, VGroup(Square, Rectangle), Square, Rectangle, Mobject, VMobject] See also -------- :meth:`~.Mobject.family_members_with_points`, :meth:`~.Mobject.align_data` """ sub_families = [x.get_family() for x in self.submobjects] all_mobjects = [self] + list(it.chain(*sub_families)) return remove_list_redundancies(all_mobjects) def family_members_with_points(self) -> list[Self]: """Filters the list of family members (generated by :meth:`.get_family`) to include only mobjects with points. Returns ------- list[Mobject] A list of mobjects that have points. Examples -------- :: >>> from manim import Square, Rectangle, VGroup, Group, Mobject, VMobject >>> s, r, m, v = Square(), Rectangle(), Mobject(), VMobject() >>> vg = VGroup(s, r) >>> gr = Group(vg, m, v) >>> gr.family_members_with_points() [Square, Rectangle] See also -------- :meth:`~.Mobject.get_family` """ return [m for m in self.get_family() if m.get_num_points() > 0] def arrange( self, direction: Vector3DLike = RIGHT, buff: float = DEFAULT_MOBJECT_TO_MOBJECT_BUFFER, center: bool = True, **kwargs, ) -> Self: """Sorts :class:`~.Mobject` next to each other on screen. Examples -------- .. manim:: Example :save_last_frame: class Example(Scene): def construct(self): s1 = Square() s2 = Square() s3 = Square() s4 = Square() x = VGroup(s1, s2, s3, s4).set_x(0).arrange(buff=1.0) self.add(x) """ for m1, m2 in zip(self.submobjects[:-1], self.submobjects[1:], strict=True): m2.next_to(m1, direction, buff, **kwargs) if center: self.center() return self def arrange_in_grid( self, rows: int | None = None, cols: int | None = None, buff: float | tuple[float, float] = MED_SMALL_BUFF, cell_alignment: Vector3DLike = ORIGIN, row_alignments: str | None = None, # "ucd" col_alignments: str | None = None, # "lcr" row_heights: Iterable[float | None] | None = None, col_widths: Iterable[float | None] | None = None, flow_order: str = "rd", **kwargs, ) -> Self: """Arrange submobjects in a grid. Parameters ---------- rows The number of rows in the grid. cols The number of columns in the grid. buff The gap between grid cells. To specify a different buffer in the horizontal and vertical directions, a tuple of two values can be given - ``(row, col)``. cell_alignment The way each submobject is aligned in its grid cell. row_alignments The vertical alignment for each row (top to bottom). Accepts the following characters: ``"u"`` - up, ``"c"`` - center, ``"d"`` - down. col_alignments The horizontal alignment for each column (left to right). Accepts the following characters ``"l"`` - left, ``"c"`` - center, ``"r"`` - right. row_heights Defines a list of heights for certain rows (top to bottom). If the list contains ``None``, the corresponding row will fit its height automatically based on the highest element in that row. col_widths Defines a list of widths for certain columns (left to right). If the list contains ``None``, the corresponding column will fit its width automatically based on the widest element in that column. flow_order The order in which submobjects fill the grid. Can be one of the following values: "rd", "dr", "ld", "dl", "ru", "ur", "lu", "ul". ("rd" -> fill rightwards then downwards) Returns ------- :class:`Mobject` ``self`` Raises ------ ValueError If ``rows`` and ``cols`` are too small to fit all submobjects. ValueError If :code:`cols`, :code:`col_alignments` and :code:`col_widths` or :code:`rows`, :code:`row_alignments` and :code:`row_heights` have mismatching sizes. Notes ----- If only one of ``cols`` and ``rows`` is set implicitly, the other one will be chosen big enough to fit all submobjects. If neither is set, they will be chosen to be about the same, tending towards ``cols`` > ``rows`` (simply because videos are wider than they are high). If both ``cell_alignment`` and ``row_alignments`` / ``col_alignments`` are defined, the latter has higher priority. Examples -------- .. manim:: ExampleBoxes :save_last_frame: class ExampleBoxes(Scene): def construct(self): boxes=VGroup(*[Square() for s in range(0,6)]) boxes.arrange_in_grid(rows=2, buff=0.1) self.add(boxes) .. manim:: ArrangeInGrid :save_last_frame: class ArrangeInGrid(Scene): def construct(self): boxes = VGroup(*[ Rectangle(WHITE, 0.5, 0.5).add(Text(str(i+1)).scale(0.5)) for i in range(24) ]) self.add(boxes) boxes.arrange_in_grid( buff=(0.25,0.5), col_alignments="lccccr", row_alignments="uccd", col_widths=[1, *[None]*4, 1], row_heights=[1, None, None, 1], flow_order="dr" ) """ from manim.mobject.geometry.line import Line mobs = self.submobjects.copy() start_pos = self.get_center() # get cols / rows values if given (implicitly) def init_size(num, alignments, sizes): if num is not None: return num if alignments is not None: return len(alignments) if sizes is not None: return len(sizes) cols = init_size(cols, col_alignments, col_widths) rows = init_size(rows, row_alignments, row_heights) # calculate rows cols if rows is None and cols is None: cols = math.ceil(math.sqrt(len(mobs))) # make the grid as close to quadratic as possible. # choosing cols first can results in cols>rows. # This is favored over rows>cols since in general # the sceene is wider than high. if rows is None: rows = math.ceil(len(mobs) / cols) if cols is None: cols = math.ceil(len(mobs) / rows) if rows * cols < len(mobs): raise ValueError("Too few rows and columns to fit all submobjetcs.") # rows and cols are now finally valid. if isinstance(buff, tuple): buff_x = buff[0] buff_y = buff[1] else: buff_x = buff_y = buff # Initialize alignments correctly def init_alignments(alignments, num, mapping, name, dir_): if alignments is None: # Use cell_alignment as fallback return [cell_alignment * dir_] * num if len(alignments) != num: raise ValueError(f"{name}_alignments has a mismatching size.") alignments = list(alignments) for i in range(num): alignments[i] = mapping[alignments[i]] return alignments row_alignments = init_alignments( row_alignments, rows, {"u": UP, "c": ORIGIN, "d": DOWN}, "row", RIGHT, ) col_alignments = init_alignments( col_alignments, cols, {"l": LEFT, "c": ORIGIN, "r": RIGHT}, "col", UP, ) # Now row_alignment[r] + col_alignment[c] is the alignment in cell [r][c] mapper = { "dr": lambda r, c: (rows - r - 1) + c * rows, "dl": lambda r, c: (rows - r - 1) + (cols - c - 1) * rows, "ur": lambda r, c: r + c * rows, "ul": lambda r, c: r + (cols - c - 1) * rows, "rd": lambda r, c: (rows - r - 1) * cols + c, "ld": lambda r, c: (rows - r - 1) * cols + (cols - c - 1), "ru": lambda r, c: r * cols + c, "lu": lambda r, c: r * cols + (cols - c - 1), } if flow_order not in mapper: raise ValueError( 'flow_order must be one of the following values: "dr", "rd", "ld" "dl", "ru", "ur", "lu", "ul".', ) flow_order = mapper[flow_order] # Reverse row_alignments and row_heights. Necessary since the # grid filling is handled bottom up for simplicity reasons. def reverse(maybe_list): if maybe_list is not None: maybe_list = list(maybe_list) maybe_list.reverse() return maybe_list row_alignments = reverse(row_alignments) row_heights = reverse(row_heights) placeholder = Mobject() # Used to fill up the grid temporarily, doesn't get added to the scene. # In this case a Mobject is better than None since it has width and height # properties of 0. mobs.extend([placeholder] * (rows * cols - len(mobs))) grid = [[mobs[flow_order(r, c)] for c in range(cols)] for r in range(rows)] measured_heigths = [ max(grid[r][c].height for c in range(cols)) for r in range(rows) ] measured_widths = [ max(grid[r][c].width for r in range(rows)) for c in range(cols) ] # Initialize row_heights / col_widths correctly using measurements as fallback def init_sizes(sizes, num, measures, name): if sizes is None: sizes = [None] * num if len(sizes) != num: raise ValueError(f"{name} has a mismatching size.") return [ sizes[i] if sizes[i] is not None else measures[i] for i in range(num) ] heights = init_sizes(row_heights, rows, measured_heigths, "row_heights") widths = init_sizes(col_widths, cols, measured_widths, "col_widths") x, y = 0, 0 for r in range(rows): x = 0 for c in range(cols): if grid[r][c] is not placeholder: alignment = row_alignments[r] + col_alignments[c] line = Line( x * RIGHT + y * UP, (x + widths[c]) * RIGHT + (y + heights[r]) * UP, ) # Use a mobject to avoid rewriting align inside # box code that Mobject.move_to(Mobject) already # includes. grid[r][c].move_to(line, alignment) x += widths[c] + buff_x y += heights[r] + buff_y self.move_to(start_pos) return self def sort( self, point_to_num_func: Callable[[Point3DLike], float] = lambda p: p[0], submob_func: Callable[[Mobject], Any] | None = None, ) -> Self: """Sorts the list of :attr:`submobjects` by a function defined by ``submob_func``.""" if submob_func is None: def submob_func(m: Mobject) -> float: return point_to_num_func(m.get_center()) self.submobjects.sort(key=submob_func) return self def shuffle(self, recursive: bool = False) -> None: """Shuffles the list of :attr:`submobjects`.""" if recursive: for submob in self.submobjects: submob.shuffle(recursive=True) random.shuffle(self.submobjects) def invert(self, recursive: bool = False) -> None: """Inverts the list of :attr:`submobjects`. Parameters ---------- recursive If ``True``, all submobject lists of this mobject's family are inverted. Examples -------- .. manim:: InvertSumobjectsExample class InvertSumobjectsExample(Scene): def construct(self): s = VGroup(*[Dot().shift(i*0.1*RIGHT) for i in range(-20,20)]) s2 = s.copy() s2.invert() s2.shift(DOWN) self.play(Write(s), Write(s2)) """ if recursive: for submob in self.submobjects: submob.invert(recursive=True) self.submobjects.reverse() # Just here to keep from breaking old scenes. def arrange_submobjects(self, *args, **kwargs) -> Self: """Arrange the position of :attr:`submobjects` with a small buffer. Examples -------- .. manim:: ArrangeSumobjectsExample :save_last_frame: class ArrangeSumobjectsExample(Scene): def construct(self): s= VGroup(*[Dot().shift(i*0.1*RIGHT*np.random.uniform(-1,1)+UP*np.random.uniform(-1,1)) for i in range(0,15)]) s.shift(UP).set_color(BLUE) s2= s.copy().set_color(RED) s2.arrange_submobjects() s2.shift(DOWN) self.add(s,s2) """ return self.arrange(*args, **kwargs) def sort_submobjects(self, *args, **kwargs) -> Self: """Sort the :attr:`submobjects`""" return self.sort(*args, **kwargs) def shuffle_submobjects(self, *args, **kwargs) -> None: """Shuffles the order of :attr:`submobjects` Examples -------- .. manim:: ShuffleSubmobjectsExample class ShuffleSubmobjectsExample(Scene): def construct(self): s= VGroup(*[Dot().shift(i*0.1*RIGHT) for i in range(-20,20)]) s2= s.copy() s2.shuffle_submobjects() s2.shift(DOWN) self.play(Write(s), Write(s2)) """ return self.shuffle(*args, **kwargs) # Alignment def align_data(self, mobject: Mobject, skip_point_alignment: bool = False) -> None: """Aligns the family structure and data of this mobject with another mobject. Afterwards, the two mobjects will have the same number of submobjects (see :meth:`.align_submobjects`) and the same parent structure (see :meth:`.null_point_align`). If ``skip_point_alignment`` is ``False``, they will also have the same number of points (see :meth:`.align_points`). Parameters ---------- mobject The other mobject this mobject should be aligned to. skip_point_alignment Controls whether or not the computationally expensive point alignment is skipped (default: ``False``). .. note:: This method is primarily used internally by :meth:`.become` and the :class:`~.Transform` animation to ensure that mobjects are structurally compatible before transformation. Examples -------- :: >>> from manim import Rectangle, Line, ORIGIN, RIGHT >>> rect = Rectangle(width=4.0, height=2.0, grid_xstep=1.0, grid_ystep=0.5) >>> line = Line(start=ORIGIN,end=RIGHT) >>> line.align_data(rect) >>> len(line.get_family()) == len(rect.get_family()) True >>> line.get_num_points() == rect.get_num_points() True See also -------- :class:`~.Transform`, :meth:`~.Mobject.become`, :meth:`~.VMobject.align_points`, :meth:`~.Mobject.get_family` """ self.null_point_align(mobject) self.align_submobjects(mobject) if not skip_point_alignment: self.align_points(mobject) # Recurse for m1, m2 in zip(self.submobjects, mobject.submobjects, strict=True): m1.align_data(m2) def get_point_mobject(self, center=None): """The simplest :class:`~.Mobject` to be transformed to or from self. Should by a point of the appropriate type """ msg = f"get_point_mobject not implemented for {self.__class__.__name__}" raise NotImplementedError(msg) def align_points(self, mobject: Mobject) -> Self: count1 = self.get_num_points() count2 = mobject.get_num_points() if count1 < count2: self.align_points_with_larger(mobject) elif count2 < count1: mobject.align_points_with_larger(self) return self def align_points_with_larger(self, larger_mobject: Mobject): raise NotImplementedError("Please override in a child class.") def align_submobjects(self, mobject: Mobject) -> Self: mob1 = self mob2 = mobject n1 = len(mob1.submobjects) n2 = len(mob2.submobjects) mob1.add_n_more_submobjects(max(0, n2 - n1)) mob2.add_n_more_submobjects(max(0, n1 - n2)) return self def null_point_align(self, mobject: Mobject): """If a :class:`~.Mobject` with points is being aligned to one without, treat both as groups, and push the one with points into its own submobjects list. Returns ------- :class:`Mobject` ``self`` """ for m1, m2 in (self, mobject), (mobject, self): if m1.has_no_points() and m2.has_points(): m2.push_self_into_submobjects() return self def push_self_into_submobjects(self) -> Self: copy = self.copy() copy.submobjects = [] self.reset_points() self.add(copy) return self def add_n_more_submobjects(self, n: int) -> Self | None: if n == 0: return None curr = len(self.submobjects) if curr == 0: # If empty, simply add n point mobjects self.submobjects = [self.get_point_mobject() for k in range(n)] return None target = curr + n # TODO, factor this out to utils so as to reuse # with VMobject.insert_n_curves repeat_indices = (np.arange(target) * curr) // target split_factors = [sum(repeat_indices == i) for i in range(curr)] new_submobs = [] for submob, sf in zip(self.submobjects, split_factors, strict=True): new_submobs.append(submob) new_submobs.extend(submob.copy().fade(1) for _ in range(1, sf)) self.submobjects = new_submobs return self def repeat_submobject(self, submob: Mobject) -> Self: return submob.copy() def interpolate( self, mobject1: Mobject, mobject2: Mobject, alpha: float, path_func: PathFuncType = straight_path(), ) -> Self: """Turns this :class:`~.Mobject` into an interpolation between ``mobject1`` and ``mobject2``. The interpolation is applied to the points and color of the mobject. Parameters ---------- mobject1 The starting Mobject. mobject2 The target Mobject. alpha Interpolation factor between 0 (at ``mobject1``) and 1 (at ``mobject2``). path_func The function defining the interpolation path. Defaults to a straight path. Returns ------- :class:`Mobject` ``self`` .. note:: - Both mobjects must have the same number of points. If not, this will raise an error. Use :meth:`~.VMobject.align_points` to match point counts beforehand if needed. - This method is used internally by the :class:`~.Transform` animation to interpolate between two mobjects during a transformation. Examples -------- .. manim:: InterpolateExample :save_last_frame: class InterpolateExample(Scene): def construct(self): # No need for point alignment: dotL = Dot(color=DARK_GREY).to_edge(LEFT) dotR = Dot(color=YELLOW).scale(10).to_edge(RIGHT) dotMid1 = VMobject().interpolate(dotL, dotR, alpha=0.1) dotMid2 = VMobject().interpolate(dotL, dotR, alpha=0.25) dotMid3 = VMobject().interpolate(dotL, dotR, alpha=0.5) dotMid4 = VMobject().interpolate(dotL, dotR, alpha=0.75) dots = VGroup(dotL, dotR, dotMid1, dotMid2, dotMid3, dotMid4) # Needs point alignment: line = Line(ORIGIN, UP).to_edge(LEFT) sq = Square(color=RED, fill_opacity=1, stroke_color=BLUE).to_edge(RIGHT) line.align_points(sq) mid1 = VMobject().interpolate(line, sq, alpha=0.1) mid2 = VMobject().interpolate(line, sq, alpha=0.25) mid3 = VMobject().interpolate(line, sq, alpha=0.5) mid4 = VMobject().interpolate(line, sq, alpha=0.75) linesquares = VGroup(line, sq, mid1, mid2, mid3, mid4) self.add(VGroup(dots, linesquares).arrange(DOWN, buff=1)) See also -------- :class:`~.Transform`, :meth:`~.VMobject.align_points`, :meth:`~.VMobject.interpolate_color` """ self.points = path_func(mobject1.points, mobject2.points, alpha) self.interpolate_color(mobject1, mobject2, alpha) return self def interpolate_color(self, mobject1: Mobject, mobject2: Mobject, alpha: float): raise NotImplementedError("Please override in a child class.") def become( self, mobject: Mobject, match_height: bool = False, match_width: bool = False, match_depth: bool = False, match_center: bool = False, stretch: bool = False, ) -> Self: """Edit points, colors and submobjects to be identical to another :class:`~.Mobject` .. note:: If both match_height and match_width are ``True`` then the transformed :class:`~.Mobject` will match the height first and then the width. Parameters ---------- match_height Whether or not to preserve the height of the original :class:`~.Mobject`. match_width Whether or not to preserve the width of the original :class:`~.Mobject`. match_depth Whether or not to preserve the depth of the original :class:`~.Mobject`. match_center Whether or not to preserve the center of the original :class:`~.Mobject`. stretch Whether or not to stretch the target mobject to match the the proportions of the original :class:`~.Mobject`. Examples -------- .. manim:: BecomeScene class BecomeScene(Scene): def construct(self): circ = Circle(fill_color=RED, fill_opacity=0.8) square = Square(fill_color=BLUE, fill_opacity=0.2) self.add(circ) self.wait(0.5) circ.become(square) self.wait(0.5) The following examples illustrate how mobject measurements change when using the ``match_...`` and ``stretch`` arguments. We start with a rectangle that is 2 units high and 4 units wide, which we want to turn into a circle of radius 3:: >>> from manim import Rectangle, Circle >>> import numpy as np >>> rect = Rectangle(height=2, width=4) >>> circ = Circle(radius=3) With ``stretch=True``, the target circle is deformed to match the proportions of the rectangle, which results in the target mobject being an ellipse with height 2 and width 4. We can check that the resulting points satisfy the ellipse equation :math:`x^2/a^2 + y^2/b^2 = 1` with :math:`a = 4/2` and :math:`b = 2/2` being the semi-axes:: >>> result = rect.copy().become(circ, stretch=True) >>> result.height, result.width (np.float64(2.0), np.float64(4.0)) >>> ellipse_points = np.array(result.get_anchors()) >>> ellipse_eq = np.sum(ellipse_points**2 * [1/4, 1, 0], axis=1) >>> np.allclose(ellipse_eq, 1) True With ``match_height=True`` and ``match_width=True`` the circle is scaled such that the height or the width of the rectangle will be preserved, respectively. The points of the resulting mobject satisfy the circle equation :math:`x^2 + y^2 = r^2` for the corresponding radius :math:`r`:: >>> result = rect.copy().become(circ, match_height=True) >>> result.height, result.width (np.float64(2.0), np.float64(2.0)) >>> circle_points = np.array(result.get_anchors()) >>> circle_eq = np.sum(circle_points**2, axis=1) >>> np.allclose(circle_eq, 1) True >>> result = rect.copy().become(circ, match_width=True) >>> result.height, result.width (np.float64(4.0), np.float64(4.0)) >>> circle_points = np.array(result.get_anchors()) >>> circle_eq = np.sum(circle_points**2, axis=1) >>> np.allclose(circle_eq, 2**2) True With ``match_center=True``, the resulting mobject is moved such that its center is the same as the center of the original mobject:: >>> rect = rect.shift(np.array([0, 1, 0])) >>> np.allclose(rect.get_center(), circ.get_center()) False >>> result = rect.copy().become(circ, match_center=True) >>> np.allclose(rect.get_center(), result.get_center()) True See also -------- :meth:`~.Mobject.align_data`, :meth:`~.VMobject.interpolate_color` """ if stretch or match_height or match_width or match_depth or match_center: mobject = mobject.copy() if stretch: mobject.stretch_to_fit_height(self.height) mobject.stretch_to_fit_width(self.width) mobject.stretch_to_fit_depth(self.depth) else: if match_height: mobject.match_height(self) if match_width: mobject.match_width(self) if match_depth: mobject.match_depth(self) if match_center: mobject.move_to(self.get_center()) self.align_data(mobject, skip_point_alignment=True) for sm1, sm2 in zip(self.get_family(), mobject.get_family(), strict=True): sm1.points = np.array(sm2.points) sm1.interpolate_color(sm1, sm2, 1) return self def match_points(self, mobject: Mobject, copy_submobjects: bool = True) -> Self: """Edit points, positions, and submobjects to be identical to another :class:`~.Mobject`, while keeping the style unchanged. Examples -------- .. manim:: MatchPointsScene class MatchPointsScene(Scene): def construct(self): circ = Circle(fill_color=RED, fill_opacity=0.8) square = Square(fill_color=BLUE, fill_opacity=0.2) self.add(circ) self.wait(0.5) self.play(circ.animate.match_points(square)) self.wait(0.5) """ for sm1, sm2 in zip(self.get_family(), mobject.get_family(), strict=False): sm1.points = np.array(sm2.points) return self # Errors def throw_error_if_no_points(self) -> None: if self.has_no_points(): caller_name = sys._getframe(1).f_code.co_name raise Exception( f"Cannot call Mobject.{caller_name} for a Mobject with no points", ) # About z-index def set_z_index( self, z_index_value: float, family: bool = True, ) -> Self: """Sets the :class:`~.Mobject`'s :attr:`z_index` to the value specified in `z_index_value`. Parameters ---------- z_index_value The new value of :attr:`z_index` set. family If ``True``, the :attr:`z_index` value of all submobjects is also set. Returns ------- :class:`Mobject` The Mobject itself, after :attr:`z_index` is set. For chaining purposes. (Returns `self`.) Examples -------- .. manim:: SetZIndex :save_last_frame: class SetZIndex(Scene): def construct(self): text = Text('z_index = 3', color = PURE_RED).shift(UP).set_z_index(3) square = Square(2, fill_opacity=1).set_z_index(2) tex = Tex(r'zIndex = 1', color = PURE_BLUE).shift(DOWN).set_z_index(1) circle = Circle(radius = 1.7, color = GREEN, fill_opacity = 1) # z_index = 0 # Displaying order is now defined by z_index values self.add(text) self.add(square) self.add(tex) self.add(circle) """ if family: for submob in self.submobjects: submob.set_z_index(z_index_value, family=family) self.z_index = z_index_value return self def set_z_index_by_z_Point3D(self) -> Self: """Sets the :class:`~.Mobject`'s z Point3D to the value of :attr:`z_index`. Returns ------- :class:`Mobject` The Mobject itself, after :attr:`z_index` is set. (Returns `self`.) """ z_coord = self.get_center()[-1] self.set_z_index(z_coord) return self class Group(Mobject, metaclass=ConvertToOpenGL): """Groups together multiple :class:`Mobjects <.Mobject>`. Notes ----- When adding the same mobject more than once, repetitions are ignored. Use :meth:`.Mobject.copy` to create a separate copy which can then be added to the group. """ def __init__(self, *mobjects, **kwargs) -> None: super().__init__(**kwargs) self.add(*mobjects) class _AnimationBuilder: def __init__(self, mobject) -> None: self.mobject = mobject self.mobject.generate_target() self.overridden_animation = None self.is_chaining = False self.methods: list[MethodWithArgs] = [] # Whether animation args can be passed self.cannot_pass_args = False self.anim_args = {} def __call__(self, **kwargs) -> Self: if self.cannot_pass_args: raise ValueError( "Animation arguments must be passed before accessing methods and can only be passed once", ) self.anim_args = kwargs self.cannot_pass_args = True return self def __getattr__(self, method_name) -> types.MethodType: method = getattr(self.mobject.target, method_name) has_overridden_animation = hasattr(method, "_override_animate") if (self.is_chaining and has_overridden_animation) or self.overridden_animation: raise NotImplementedError( "Method chaining is currently not supported for overridden animations", ) def update_target(*method_args, **method_kwargs): if has_overridden_animation: self.overridden_animation = method._override_animate( self.mobject, *method_args, anim_args=self.anim_args, **method_kwargs, ) else: self.methods.append(MethodWithArgs(method, method_args, method_kwargs)) method(*method_args, **method_kwargs) return self self.is_chaining = True self.cannot_pass_args = True return update_target def build(self) -> Animation: from ..animation.transform import ( # is this to prevent circular import? _MethodAnimation, ) anim = self.overridden_animation or _MethodAnimation(self.mobject, self.methods) for attr, value in self.anim_args.items(): setattr(anim, attr, value) return anim class _UpdaterBuilder: """Syntactic sugar for adding updaters to mobjects.""" def __init__(self, mobject: Mobject): self._mobject = mobject def __getattr__(self, name: str, /) -> Callable[..., Self]: # just return a function that will add the updater def add_updater(*method_args, **method_kwargs) -> Self: self._mobject.add_updater( lambda m: getattr(m, name)(*method_args, **method_kwargs), call_updater=True, ) return self return add_updater def override_animate(method) -> types.FunctionType: r"""Decorator for overriding method animations. This allows to specify a method (returning an :class:`~.Animation`) which is called when the decorated method is used with the ``.animate`` syntax for animating the application of a method. .. seealso:: :attr:`~.Mobject.animate` .. note:: Overridden methods cannot be combined with normal or other overridden methods using method chaining with the ``.animate`` syntax. Examples -------- .. manim:: AnimationOverrideExample class CircleWithContent(VGroup): def __init__(self, content): super().__init__() self.circle = Circle() self.content = content self.add(self.circle, content) content.move_to(self.circle.get_center()) def clear_content(self): self.remove(self.content) self.content = None @override_animate(clear_content) def _clear_content_animation(self, anim_args=None): if anim_args is None: anim_args = {} anim = Uncreate(self.content, **anim_args) self.clear_content() return anim class AnimationOverrideExample(Scene): def construct(self): t = Text("hello!") my_mobject = CircleWithContent(t) self.play(Create(my_mobject)) self.play(my_mobject.animate.clear_content()) self.wait() """ def decorator(animation_method): method._override_animate = animation_method return animation_method return decorator ManimCommunity-manim-1157b74/manim/mobject/opengl/000077500000000000000000000000001515024150700220435ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/mobject/opengl/__init__.py000066400000000000000000000000001515024150700241420ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/mobject/opengl/dot_cloud.py000066400000000000000000000033171515024150700243750ustar00rootroot00000000000000from __future__ import annotations __all__ = ["TrueDot", "DotCloud"] from typing import Any, Self import numpy as np from manim.constants import ORIGIN, RIGHT, UP from manim.mobject.opengl.opengl_point_cloud_mobject import OpenGLPMobject from manim.typing import Point3DLike from manim.utils.color import PURE_YELLOW, ParsableManimColor class DotCloud(OpenGLPMobject): def __init__( self, color: ParsableManimColor = PURE_YELLOW, stroke_width: float = 2.0, radius: float = 2.0, density: float = 10, **kwargs: Any, ): self.radius = radius self.epsilon = 1.0 / density super().__init__( stroke_width=stroke_width, density=density, color=color, **kwargs ) def init_points(self) -> None: self.points = np.array( [ r * (np.cos(theta) * RIGHT + np.sin(theta) * UP) for r in np.arange(self.epsilon, self.radius, self.epsilon) # Num is equal to int(stop - start)/ (step + 1) reformulated. for theta in np.linspace( 0, 2 * np.pi, num=int(2 * np.pi * (r + self.epsilon) / self.epsilon), ) ], dtype=np.float32, ) def make_3d(self, gloss: float = 0.5, shadow: float = 0.2) -> Self: self.set_gloss(gloss) self.set_shadow(shadow) self.apply_depth_test() return self class TrueDot(DotCloud): def __init__( self, center: Point3DLike = ORIGIN, stroke_width: float = 2.0, **kwargs: Any ): self.radius = stroke_width super().__init__(points=[center], stroke_width=stroke_width, **kwargs) ManimCommunity-manim-1157b74/manim/mobject/opengl/opengl_compatibility.py000066400000000000000000000032611515024150700266340ustar00rootroot00000000000000from __future__ import annotations from abc import ABCMeta from typing import Any from manim import config from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.opengl.opengl_point_cloud_mobject import OpenGLPMobject from manim.mobject.opengl.opengl_three_dimensions import OpenGLSurface from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from ...constants import RendererType __all__ = ["ConvertToOpenGL"] class ConvertToOpenGL(ABCMeta): """Metaclass for swapping (V)Mobject with its OpenGL counterpart at runtime depending on config.renderer. This metaclass should only need to be inherited on the lowest order inheritance classes such as Mobject and VMobject. """ _converted_classes: list[type] = [] def __new__( mcls, name: str, bases: tuple[type, ...], namespace: dict[str, Any] ) -> type: if config.renderer == RendererType.OPENGL: # Must check class names to prevent # cyclic importing. base_names_to_opengl: dict[str, type] = { "Mobject": OpenGLMobject, "VMobject": OpenGLVMobject, "PMobject": OpenGLPMobject, "Mobject1D": OpenGLPMobject, "Mobject2D": OpenGLPMobject, "Surface": OpenGLSurface, } bases = tuple( base_names_to_opengl.get(base.__name__, base) for base in bases ) return super().__new__(mcls, name, bases, namespace) def __init__(cls, name: str, bases: tuple[type, ...], namespace: dict[str, Any]): super().__init__(name, bases, namespace) cls._converted_classes.append(cls) ManimCommunity-manim-1157b74/manim/mobject/opengl/opengl_geometry.py000066400000000000000000000731511515024150700256230ustar00rootroot00000000000000from __future__ import annotations from typing import Any, Self, cast import numpy as np from manim.constants import * from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_vectorized_mobject import ( OpenGLDashedVMobject, OpenGLMobject, OpenGLVGroup, OpenGLVMobject, ) from manim.typing import ( Point3D, Point3D_Array, Point3DLike, QuadraticSpline, Vector2DLike, Vector3D, Vector3DLike, ) from manim.utils.color import * from manim.utils.iterables import adjacent_n_tuples, adjacent_pairs from manim.utils.simple_functions import clip from manim.utils.space_ops import ( angle_between_vectors, angle_of_vector, compass_directions, find_intersection, normalize, rotate_vector, rotation_matrix_transpose, ) DEFAULT_DOT_RADIUS = 0.08 DEFAULT_DASH_LENGTH = 0.05 DEFAULT_ARROW_TIP_LENGTH = 0.35 DEFAULT_ARROW_TIP_WIDTH = 0.35 __all__ = [ "OpenGLTipableVMobject", "OpenGLArc", "OpenGLArcBetweenPoints", "OpenGLCurvedArrow", "OpenGLCurvedDoubleArrow", "OpenGLCircle", "OpenGLDot", "OpenGLEllipse", "OpenGLAnnularSector", "OpenGLSector", "OpenGLAnnulus", "OpenGLLine", "OpenGLDashedLine", "OpenGLTangentLine", "OpenGLElbow", "OpenGLArrow", "OpenGLVector", "OpenGLDoubleArrow", "OpenGLCubicBezier", "OpenGLPolygon", "OpenGLRegularPolygon", "OpenGLTriangle", "OpenGLArrowTip", ] class OpenGLTipableVMobject(OpenGLVMobject): """ Meant for shared functionality between Arc and Line. Functionality can be classified broadly into these groups: * Adding, Creating, Modifying tips - add_tip calls create_tip, before pushing the new tip into the TipableVMobject's list of submobjects - stylistic and positional configuration * Checking for tips - Boolean checks for whether the TipableVMobject has a tip and a starting tip * Getters - Straightforward accessors, returning information pertaining to the TipableVMobject instance's tip(s), its length etc """ # Adding, Creating, Modifying tips def __init__( self, tip_length: float = DEFAULT_ARROW_TIP_LENGTH, normal_vector: Vector3DLike = OUT, tip_config: dict[str, Any] = {}, **kwargs: Any, ): self.tip_length = tip_length self.normal_vector = normal_vector self.tip_config = tip_config super().__init__(**kwargs) def add_tip(self, at_start: bool = False, **kwargs: Any) -> Self: """ Adds a tip to the TipableVMobject instance, recognising that the endpoints might need to be switched if it's a 'starting tip' or not. """ tip = self.create_tip(at_start, **kwargs) self.reset_endpoints_based_on_tip(tip, at_start) self.assign_tip_attr(tip, at_start) self.add(tip) return self def create_tip(self, at_start: bool = False, **kwargs: Any) -> OpenGLArrowTip: """ Stylises the tip, positions it spacially, and returns the newly instantiated tip to the caller. """ tip = self.get_unpositioned_tip(**kwargs) self.position_tip(tip, at_start) return tip def get_unpositioned_tip(self, **kwargs: Any) -> OpenGLArrowTip: """ Returns a tip that has been stylistically configured, but has not yet been given a position in space. """ config = {} config.update(self.tip_config) config.update(kwargs) return OpenGLArrowTip(**config) def position_tip( self, tip: OpenGLArrowTip, at_start: bool = False ) -> OpenGLArrowTip: # Last two control points, defining both # the end, and the tangency direction if at_start: anchor = self.get_start() handle = self.get_first_handle() else: handle = self.get_last_handle() anchor = self.get_end() tip.rotate(angle_of_vector(handle - anchor) - PI - tip.get_angle()) tip.shift(anchor - tip.get_tip_point()) return tip def reset_endpoints_based_on_tip(self, tip: OpenGLArrowTip, at_start: bool) -> Self: if self.get_length() == 0: # Zero length, put_start_and_end_on wouldn't # work return self if at_start: start = tip.get_base() end = self.get_end() else: start = self.get_start() end = tip.get_base() self.put_start_and_end_on(start, end) return self def assign_tip_attr(self, tip: OpenGLArrowTip, at_start: bool) -> Self: if at_start: self.start_tip = tip else: self.tip = tip return self # Checking for tips def has_tip(self) -> bool: return hasattr(self, "tip") and self.tip in self def has_start_tip(self) -> bool: return hasattr(self, "start_tip") and self.start_tip in self # Getters def pop_tips(self) -> OpenGLVGroup: start, end = self.get_start_and_end() result = OpenGLVGroup() if self.has_tip(): result.add(self.tip) self.remove(self.tip) if self.has_start_tip(): result.add(self.start_tip) self.remove(self.start_tip) self.put_start_and_end_on(start, end) return result def get_tips(self) -> OpenGLVGroup: """ Returns a VGroup (collection of VMobjects) containing the TipableVMObject instance's tips. """ result = OpenGLVGroup() if hasattr(self, "tip"): result.add(self.tip) if hasattr(self, "start_tip"): result.add(self.start_tip) return result def get_tip(self) -> OpenGLArrowTip: """Returns the TipableVMobject instance's (first) tip, otherwise throws an exception. """ tips = self.get_tips() if len(tips) == 0: raise Exception("tip not found") else: rv = cast(OpenGLArrowTip, tips[0]) return rv def get_default_tip_length(self) -> float: return self.tip_length def get_first_handle(self) -> Point3D: return self.points[1] def get_last_handle(self) -> Point3D: return self.points[-2] def get_end(self) -> Point3D: if self.has_tip(): return self.tip.get_start() else: return super().get_end() def get_start(self) -> Point3D: if self.has_start_tip(): return self.start_tip.get_start() else: return super().get_start() def get_length(self) -> float: start, end = self.get_start_and_end() rv: float = np.linalg.norm(start - end) return rv class OpenGLArc(OpenGLTipableVMobject): def __init__( self, start_angle: float = 0, angle: float = TAU / 4, radius: float = 1.0, n_components: int = 8, arc_center: Point3DLike = ORIGIN, **kwargs: Any, ): self.start_angle = start_angle self.angle = angle self.radius = radius self.n_components = n_components self.arc_center = arc_center super().__init__(**kwargs) self.orientation = -1 def init_points(self) -> None: self.set_points( OpenGLArc.create_quadratic_bezier_points( angle=self.angle, start_angle=self.start_angle, n_components=self.n_components, ), ) # To maintain proper orientation for fill shaders. self.scale(self.radius, about_point=ORIGIN) self.shift(self.arc_center) @staticmethod def create_quadratic_bezier_points( angle: float, start_angle: float = 0, n_components: int = 8 ) -> QuadraticSpline: samples = np.array( [ [np.cos(a), np.sin(a), 0] for a in np.linspace( start_angle, start_angle + angle, 2 * n_components + 1, ) ], ) theta = angle / n_components samples[1::2] /= np.cos(theta / 2) points = np.zeros((3 * n_components, 3)) points[0::3] = samples[0:-1:2] points[1::3] = samples[1::2] points[2::3] = samples[2::2] return points def get_arc_center(self) -> Point3D: """ Looks at the normals to the first two anchors, and finds their intersection points """ # First two anchors and handles a1, h, a2 = self.points[:3] # Tangent vectors t1 = h - a1 t2 = h - a2 # Normals n1 = rotate_vector(t1, TAU / 4) n2 = rotate_vector(t2, TAU / 4) return find_intersection(a1, n1, a2, n2) def get_start_angle(self) -> float: angle = angle_of_vector(self.get_start() - self.get_arc_center()) rv: float = angle % TAU return rv def get_stop_angle(self) -> float: angle = angle_of_vector(self.get_end() - self.get_arc_center()) rv: float = angle % TAU return rv def move_arc_center_to(self, point: Point3DLike) -> Self: self.shift(point - self.get_arc_center()) return self class OpenGLArcBetweenPoints(OpenGLArc): def __init__( self, start: Point3DLike, end: Point3DLike, angle: float = TAU / 4, **kwargs: Any, ): super().__init__(angle=angle, **kwargs) if angle == 0: self.set_points_as_corners([LEFT, RIGHT]) self.put_start_and_end_on(start, end) class OpenGLCurvedArrow(OpenGLArcBetweenPoints): def __init__(self, start_point: Point3DLike, end_point: Point3DLike, **kwargs: Any): super().__init__(start_point, end_point, **kwargs) self.add_tip() class OpenGLCurvedDoubleArrow(OpenGLCurvedArrow): def __init__(self, start_point: Point3DLike, end_point: Point3DLike, **kwargs: Any): super().__init__(start_point, end_point, **kwargs) self.add_tip(at_start=True) class OpenGLCircle(OpenGLArc): def __init__(self, color: ParsableManimColor = RED, **kwargs: Any): super().__init__(0, TAU, color=color, **kwargs) def surround( self, mobject: OpenGLMobject, dim_to_match: int = 0, stretch: bool = False, buff: float = MED_SMALL_BUFF, ) -> Self: # Ignores dim_to_match and stretch; result will always be a circle # TODO: Perhaps create an ellipse class to handle singele-dimension stretching self.replace(mobject, dim_to_match, stretch) self.stretch((self.get_width() + 2 * buff) / self.get_width(), 0) self.stretch((self.get_height() + 2 * buff) / self.get_height(), 1) return self def point_at_angle(self, angle: float) -> Point3D: start_angle = self.get_start_angle() return self.point_from_proportion((angle - start_angle) / TAU) class OpenGLDot(OpenGLCircle): def __init__( self, point: Point3DLike = ORIGIN, radius: float = DEFAULT_DOT_RADIUS, stroke_width: float = 0, fill_opacity: float = 1.0, color: ParsableManimColor = WHITE, **kwargs: Any, ): super().__init__( arc_center=point, radius=radius, stroke_width=stroke_width, fill_opacity=fill_opacity, color=color, **kwargs, ) class OpenGLEllipse(OpenGLCircle): def __init__(self, width: float = 2, height: float = 1, **kwargs: Any): super().__init__(**kwargs) self.set_width(width, stretch=True) self.set_height(height, stretch=True) class OpenGLAnnularSector(OpenGLArc): def __init__( self, inner_radius: float = 1, outer_radius: float = 2, angle: float = TAU / 4, start_angle: float = 0, fill_opacity: float = 1, stroke_width: float = 0, color: ParsableManimColor = WHITE, **kwargs: Any, ): self.inner_radius = inner_radius self.outer_radius = outer_radius super().__init__( start_angle=start_angle, angle=angle, fill_opacity=fill_opacity, stroke_width=stroke_width, color=color, **kwargs, ) def init_points(self) -> None: inner_arc, outer_arc = ( OpenGLArc( start_angle=self.start_angle, angle=self.angle, radius=radius, arc_center=self.arc_center, ) for radius in (self.inner_radius, self.outer_radius) ) outer_arc.reverse_points() self.append_points(inner_arc.points) self.add_line_to(outer_arc.points[0]) self.append_points(outer_arc.points) self.add_line_to(inner_arc.points[0]) class OpenGLSector(OpenGLAnnularSector): def __init__(self, outer_radius: float = 1, inner_radius: float = 0, **kwargs: Any): super().__init__(inner_radius=inner_radius, outer_radius=outer_radius, **kwargs) class OpenGLAnnulus(OpenGLCircle): def __init__( self, inner_radius: float = 1, outer_radius: float = 2, fill_opacity: float = 1, stroke_width: float = 0, color: ParsableManimColor = WHITE, mark_paths_closed: bool = False, **kwargs: Any, ): self.mark_paths_closed = mark_paths_closed # is this even used? self.inner_radius = inner_radius self.outer_radius = outer_radius super().__init__( fill_opacity=fill_opacity, stroke_width=stroke_width, color=color, **kwargs ) def init_points(self) -> None: self.radius = self.outer_radius outer_circle = OpenGLCircle(radius=self.outer_radius) inner_circle = OpenGLCircle(radius=self.inner_radius) inner_circle.reverse_points() self.append_points(outer_circle.points) self.append_points(inner_circle.points) self.shift(self.arc_center) class OpenGLLine(OpenGLTipableVMobject): def __init__( self, start: Point3DLike = LEFT, end: Point3DLike = RIGHT, buff: float = 0, path_arc: float = 0, **kwargs: Any, ): self.dim = 3 self.buff = buff self.path_arc = path_arc self.set_start_and_end_attrs(start, end) super().__init__(**kwargs) def init_points(self) -> None: self.set_points_by_ends(self.start, self.end, self.buff, self.path_arc) def set_points_by_ends( self, start: Point3DLike, end: Point3DLike, buff: float = 0, path_arc: float = 0 ) -> None: if path_arc: self.set_points(OpenGLArc.create_quadratic_bezier_points(path_arc)) self.put_start_and_end_on(start, end) else: self.set_points_as_corners([start, end]) self.account_for_buff(self.buff) def set_path_arc(self, new_value: float) -> None: self.path_arc = new_value self.init_points() def account_for_buff(self, buff: float) -> Self: if buff == 0: return self # length = self.get_length() if self.path_arc == 0 else self.get_arc_length() # if length < 2 * buff: return self buff_prop = buff / length self.pointwise_become_partial(self, buff_prop, 1 - buff_prop) return self def set_start_and_end_attrs( self, start: Mobject | Point3DLike, end: Mobject | Point3DLike ) -> None: # If either start or end are Mobjects, this # gives their centers rough_start = self.pointify(start) rough_end = self.pointify(end) vect = normalize(rough_end - rough_start) # Now that we know the direction between them, # we can find the appropriate boundary point from # start and end, if they're mobjects self.start = self.pointify(start, vect) + self.buff * vect self.end = self.pointify(end, -vect) - self.buff * vect def pointify( self, mob_or_point: Mobject | Point3DLike, direction: Vector3DLike = None ) -> Point3D: """ Take an argument passed into Line (or subclass) and turn it into a 3d point. """ if isinstance(mob_or_point, Mobject): mob = mob_or_point if direction is None: return mob.get_center() else: return mob.get_continuous_bounding_box_point(direction) else: point = mob_or_point result = np.zeros(self.dim) result[: len(point)] = point return result def put_start_and_end_on(self, start: Point3DLike, end: Point3DLike) -> Self: curr_start, curr_end = self.get_start_and_end() if (curr_start == curr_end).all(): self.set_points_by_ends(start, end, self.path_arc) return super().put_start_and_end_on(start, end) def get_vector(self) -> Vector3D: return self.get_end() - self.get_start() def get_unit_vector(self) -> Vector3D: return normalize(self.get_vector()) def get_angle(self) -> float: return angle_of_vector(self.get_vector()) def get_projection(self, point: Point3DLike) -> Point3D: """Return projection of a point onto the line""" unit_vect = self.get_unit_vector() start = self.get_start() return start + np.dot(point - start, unit_vect) * unit_vect def get_slope(self) -> float: rv: float = np.tan(self.get_angle()) return rv def set_angle(self, angle: float, about_point: Point3DLike | None = None) -> Self: if about_point is None: about_point = self.get_start() self.rotate( angle - self.get_angle(), about_point=about_point, ) return self def set_length(self, length: float) -> None: self.scale(length / self.get_length()) class OpenGLDashedLine(OpenGLLine): def __init__( self, *args: Any, dash_length: float = DEFAULT_DASH_LENGTH, dashed_ratio: float = 0.5, **kwargs: Any, ): self.dashed_ratio = dashed_ratio self.dash_length = dash_length super().__init__(*args, **kwargs) dashed_ratio = self.dashed_ratio num_dashes = self.calculate_num_dashes(dashed_ratio) dashes = OpenGLDashedVMobject( self, num_dashes=num_dashes, dashed_ratio=dashed_ratio, ) self.clear_points() self.add(*dashes) def calculate_num_dashes(self, dashed_ratio: float) -> int: return max( 2, int(np.ceil((self.get_length() / self.dash_length) * dashed_ratio)), ) def get_start(self) -> Point3D: if len(self.submobjects) > 0: return self.submobjects[0].get_start() else: return super().get_start() def get_end(self) -> Point3D: if len(self.submobjects) > 0: return self.submobjects[-1].get_end() else: return super().get_end() def get_first_handle(self) -> Point3D: return self.submobjects[0].points[1] def get_last_handle(self) -> Point3D: return self.submobjects[-1].points[-2] class OpenGLTangentLine(OpenGLLine): def __init__( self, vmob: OpenGLVMobject, alpha: float, length: float = 1, d_alpha: float = 1e-6, **kwargs: Any, ): self.length = length self.d_alpha = d_alpha da = self.d_alpha a1 = clip(alpha - da, 0, 1) a2 = clip(alpha + da, 0, 1) super().__init__(vmob.pfp(a1), vmob.pfp(a2), **kwargs) self.scale(self.length / self.get_length()) class OpenGLElbow(OpenGLVMobject): def __init__(self, width: float = 0.2, angle: float = 0, **kwargs: Any): self.angle = angle super().__init__(self, **kwargs) self.set_points_as_corners([UP, UP + RIGHT, RIGHT]) self.set_width(width, about_point=ORIGIN) self.rotate(self.angle, about_point=ORIGIN) class OpenGLArrow(OpenGLLine): def __init__( self, start: Point3DLike = LEFT, end: Point3DLike = RIGHT, path_arc: float = 0, fill_color: ParsableManimColor = GREY_A, fill_opacity: float = 1, stroke_width: float = 0, buff: float = MED_SMALL_BUFF, thickness: float = 0.05, tip_width_ratio: float = 5, tip_angle: float = PI / 3, max_tip_length_to_length_ratio: float = 0.5, max_width_to_length_ratio: float = 0.1, **kwargs: Any, ): self.thickness = thickness self.tip_width_ratio = tip_width_ratio self.tip_angle = tip_angle self.max_tip_length_to_length_ratio = max_tip_length_to_length_ratio self.max_width_to_length_ratio = max_width_to_length_ratio super().__init__( start=start, end=end, buff=buff, path_arc=path_arc, fill_color=fill_color, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs, ) def set_points_by_ends( self, start: Point3DLike, end: Point3DLike, buff: float = 0, path_arc: float = 0 ) -> None: # Find the right tip length and thickness vect = np.asarray(end) - np.asarray(start) length = max(np.linalg.norm(vect), 1e-8) thickness = self.thickness w_ratio = self.max_width_to_length_ratio / (thickness / length) if w_ratio < 1: thickness *= w_ratio tip_width = self.tip_width_ratio * thickness tip_length = tip_width / (2 * np.tan(self.tip_angle / 2)) t_ratio = self.max_tip_length_to_length_ratio / (tip_length / length) if t_ratio < 1: tip_length *= t_ratio tip_width *= t_ratio # Find points for the stem if path_arc == 0: points1 = (length - tip_length) * np.array([RIGHT, 0.5 * RIGHT, ORIGIN]) points1 += thickness * UP / 2 points2 = points1[::-1] + thickness * DOWN else: # Solve for radius so that the tip-to-tail length matches |end - start| a = 2 * (1 - np.cos(path_arc)) b = -2 * tip_length * np.sin(path_arc) c = tip_length**2 - length**2 R = (-b + np.sqrt(b**2 - 4 * a * c)) / (2 * a) # Find arc points points1 = OpenGLArc.create_quadratic_bezier_points(path_arc) points2 = np.array(points1[::-1]) points1 *= R + thickness / 2 points2 *= R - thickness / 2 if path_arc < 0: tip_length *= -1 rot_T = rotation_matrix_transpose(PI / 2 - path_arc, OUT) for points in points1, points2: points[:] = np.dot(points, rot_T) points += R * DOWN self.set_points(points1) # Tip self.add_line_to(tip_width * UP / 2) self.add_line_to(tip_length * LEFT) self.tip_index = len(self.points) - 1 self.add_line_to(tip_width * DOWN / 2) self.add_line_to(points2[0]) # Close it out self.append_points(points2) self.add_line_to(points1[0]) if length > 0: # Final correction super().scale(length / self.get_length()) self.rotate(angle_of_vector(vect) - self.get_angle()) self.rotate( PI / 2 - np.arccos(normalize(vect)[2]), axis=rotate_vector(self.get_unit_vector(), -PI / 2), ) self.shift(start - self.get_start()) self.refresh_triangulation() def reset_points_around_ends(self) -> Self: self.set_points_by_ends( self.get_start(), self.get_end(), path_arc=self.path_arc, ) return self def get_start(self) -> Point3D: nppc = self.n_points_per_curve points = self.points return (points[0] + points[-nppc]) / 2 def get_end(self) -> Point3D: return self.points[self.tip_index] def put_start_and_end_on(self, start: Point3DLike, end: Point3DLike) -> Self: self.set_points_by_ends(start, end, buff=0, path_arc=self.path_arc) return self def scale(self, *args: Any, **kwargs: Any) -> Self: super().scale(*args, **kwargs) self.reset_points_around_ends() return self def set_thickness(self, thickness: float) -> Self: self.thickness = thickness self.reset_points_around_ends() return self def set_path_arc(self, path_arc: float) -> None: self.path_arc = path_arc self.reset_points_around_ends() # return self class OpenGLVector(OpenGLArrow): def __init__( self, direction: Vector2DLike | Vector3DLike = RIGHT, buff: float = 0, **kwargs: Any, ): self.buff = buff if len(direction) == 2: direction = np.hstack([direction, 0]) super().__init__(ORIGIN, direction, buff=buff, **kwargs) class OpenGLDoubleArrow(OpenGLArrow): def __init__(self, *args: Any, **kwargs: Any): super().__init__(*args, **kwargs) self.add_tip(at_start=True) class OpenGLCubicBezier(OpenGLVMobject): def __init__( self, a0: Point3DLike, h0: Point3DLike, h1: Point3DLike, a1: Point3DLike, **kwargs: Any, ): super().__init__(**kwargs) self.add_cubic_bezier_curve(a0, h0, h1, a1) class OpenGLPolygon(OpenGLVMobject): def __init__(self, *vertices: Point3DLike, **kwargs: Any): self.vertices: Point3D_Array = np.array(vertices) super().__init__(**kwargs) def init_points(self) -> None: verts = self.vertices self.set_points_as_corners([*verts, verts[0]]) def get_vertices(self) -> Point3D_Array: return self.get_start_anchors() def round_corners(self, radius: float = 0.5) -> Self: vertices = self.get_vertices() arcs = [] for v1, v2, v3 in adjacent_n_tuples(vertices, 3): vect1 = v2 - v1 vect2 = v3 - v2 unit_vect1 = normalize(vect1) unit_vect2 = normalize(vect2) angle = angle_between_vectors(vect1, vect2) # Negative radius gives concave curves angle *= np.sign(radius) # Distance between vertex and start of the arc cut_off_length = radius * np.tan(angle / 2) # Determines counterclockwise vs. clockwise sign = np.sign(np.cross(vect1, vect2)[2]) arc = OpenGLArcBetweenPoints( v2 - unit_vect1 * cut_off_length, v2 + unit_vect2 * cut_off_length, angle=sign * angle, n_components=2, ) arcs.append(arc) self.clear_points() # To ensure that we loop through starting with last arcs = [arcs[-1], *arcs[:-1]] for arc1, arc2 in adjacent_pairs(arcs): self.append_points(arc1.points) line = OpenGLLine(arc1.get_end(), arc2.get_start()) # Make sure anchors are evenly distributed len_ratio = line.get_length() / arc1.get_arc_length() line.insert_n_curves(int(arc1.get_num_curves() * len_ratio)) self.append_points(line.points) return self class OpenGLRegularPolygon(OpenGLPolygon): def __init__(self, n: int = 6, start_angle: float | None = None, **kwargs: Any): self.start_angle = start_angle if self.start_angle is None: if n % 2 == 0: self.start_angle = 0 else: self.start_angle = 90 * DEGREES start_vect = rotate_vector(RIGHT, self.start_angle) vertices = compass_directions(n, start_vect) super().__init__(*vertices, **kwargs) class OpenGLTriangle(OpenGLRegularPolygon): def __init__(self, **kwargs: Any): super().__init__(n=3, **kwargs) class OpenGLArrowTip(OpenGLTriangle): def __init__( self, fill_opacity: float = 1, fill_color: ParsableManimColor = WHITE, stroke_width: float = 0, width: float = DEFAULT_ARROW_TIP_WIDTH, length: float = DEFAULT_ARROW_TIP_LENGTH, angle: float = 0, **kwargs: Any, ): super().__init__( start_angle=0, fill_opacity=fill_opacity, fill_color=fill_color, stroke_width=stroke_width, **kwargs, ) self.set_width(width, stretch=True) self.set_height(length, stretch=True) def get_base(self) -> Point3D: return self.point_from_proportion(0.5) def get_tip_point(self) -> Point3D: return self.points[0] def get_vector(self) -> Vector3D: return self.get_tip_point() - self.get_base() def get_angle(self) -> float: return angle_of_vector(self.get_vector()) def get_length(self) -> float: rv: float = np.linalg.norm(self.get_vector()) return rv class OpenGLRectangle(OpenGLPolygon): def __init__( self, color: ParsableManimColor = WHITE, width: float = 4.0, height: float = 2.0, **kwargs: Any, ): super().__init__(UR, UL, DL, DR, color=color, **kwargs) self.set_width(width, stretch=True) self.set_height(height, stretch=True) class OpenGLSquare(OpenGLRectangle): def __init__(self, side_length: float = 2.0, **kwargs: Any): self.side_length = side_length super().__init__(height=side_length, width=side_length, **kwargs) class OpenGLRoundedRectangle(OpenGLRectangle): def __init__(self, corner_radius: float = 0.5, **kwargs: Any): self.corner_radius = corner_radius super().__init__(**kwargs) self.round_corners(self.corner_radius) ManimCommunity-manim-1157b74/manim/mobject/opengl/opengl_image_mobject.py000066400000000000000000000050741515024150700265540ustar00rootroot00000000000000from __future__ import annotations __all__ = [ "OpenGLImageMobject", ] from pathlib import Path from typing import TYPE_CHECKING, Any import numpy as np from PIL import Image from PIL.Image import Resampling from manim.mobject.opengl.opengl_surface import OpenGLSurface, OpenGLTexturedSurface from manim.utils.images import get_full_raster_image_path if TYPE_CHECKING: import numpy.typing as npt __all__ = ["OpenGLImageMobject"] class OpenGLImageMobject(OpenGLTexturedSurface): def __init__( self, filename_or_array: str | Path | npt.NDArray, width: float | None = None, height: float | None = None, image_mode: str = "RGBA", resampling_algorithm: Resampling = Resampling.BICUBIC, opacity: float = 1, gloss: float = 0, shadow: float = 0, **kwargs: Any, ): self.image = filename_or_array self.resampling_algorithm = resampling_algorithm if isinstance(filename_or_array, np.ndarray): self.size = filename_or_array.shape[1::-1] elif isinstance(filename_or_array, (str, Path)): path = get_full_raster_image_path(filename_or_array) self.size = Image.open(path).size if width is None and height is None: width = 4 * self.size[0] / self.size[1] height = 4 if height is None: height = width * self.size[1] / self.size[0] if width is None: width = height * self.size[0] / self.size[1] surface = OpenGLSurface( lambda u, v: np.array([u, v, 0]), [-width / 2, width / 2], [-height / 2, height / 2], opacity=opacity, gloss=gloss, shadow=shadow, ) super().__init__( surface, self.image, image_mode=image_mode, opacity=opacity, gloss=gloss, shadow=shadow, **kwargs, ) def get_image_from_file( self, image_file: str | Path | np.ndarray, image_mode: str, ) -> Image.Image: if isinstance(image_file, (str, Path)): return super().get_image_from_file(image_file, image_mode) else: return ( Image.fromarray(image_file.astype("uint8")) .convert(image_mode) .resize( image_file.shape[:2] * 200, # assumption of 200 ppmu (pixels per manim unit) would suffice resample=self.resampling_algorithm, ) ) ManimCommunity-manim-1157b74/manim/mobject/opengl/opengl_mobject.py000066400000000000000000003246621515024150700254210ustar00rootroot00000000000000from __future__ import annotations import copy import inspect import itertools as it import random import sys import types from collections.abc import Callable, Iterable, Iterator, Sequence from functools import partialmethod, wraps from math import ceil from typing import ( TYPE_CHECKING, Any, ClassVar, Never, Protocol, Self, TypeAlias, TypeVar, cast, overload, ) import moderngl import numpy as np import numpy.typing as npt from typing_extensions import ( override, ) from manim import config, logger from manim.constants import * from manim.data_structures import MethodWithArgs from manim.renderer.shader_wrapper import get_colormap_code from manim.typing import ( Point3D, Point3D_Array, Point3DLike, Point3DLike_Array, ) from manim.utils.bezier import integer_interpolate, interpolate from manim.utils.color import ( WHITE, ManimColor, ParsableManimColor, color_gradient, color_to_rgb, rgb_to_hex, ) from manim.utils.config_ops import _Data, _Uniforms # from ..utils.iterables import batch_by_property from manim.utils.iterables import ( batch_by_property, list_update, listify, make_even, resize_array, resize_preserving_order, resize_with_interpolation, uniq_chain, ) from manim.utils.paths import straight_path from manim.utils.space_ops import ( angle_between_vectors, normalize, rotation_matrix_transpose, ) if TYPE_CHECKING: from manim.animation.animation import Animation from manim.renderer.shader_wrapper import ShaderWrapper from manim.typing import ( FloatRGB_Array, FloatRGBA_Array, ManimFloat, MappingFunction, MatrixMN, MultiMappingFunction, PathFuncType, Vector3D, Vector3DLike, ) _TimeBasedUpdater: TypeAlias = Callable[["OpenGLMobject", float], object] _NonTimeBasedUpdater: TypeAlias = Callable[["OpenGLMobject"], object] _Updater: TypeAlias = _NonTimeBasedUpdater | _TimeBasedUpdater _T = TypeVar("_T") _T_np = TypeVar("_T_np", bound=np.generic) def affects_shader_info_id( func: Callable[[OpenGLMobject], OpenGLMobject], ) -> Callable[[OpenGLMobject], OpenGLMobject]: @wraps(func) def wrapper(self: OpenGLMobject) -> OpenGLMobject: for mob in self.get_family(): func(mob) mob.refresh_shader_wrapper_id() return self return wrapper __all__ = ["OpenGLMobject", "OpenGLGroup", "OpenGLPoint", "_AnimationBuilder"] _ShaderDType: TypeAlias = np.void """The dtype for NumPy arrays representing shader data. It's a structured dtype with signature `(point, np.float32, (3,))`.""" _ShaderData: TypeAlias = npt.NDArray[_ShaderDType] class OpenGLMobject: """Mathematical Object: base class for objects that can be displayed on screen. Attributes ---------- submobjects : List[:class:`OpenGLMobject`] The contained objects. points : :class:`numpy.ndarray` The points of the objects. .. seealso:: :class:`~.OpenGLVMobject` """ _original__init__: ClassVar[Callable[..., None]] shader_dtype: ClassVar[Sequence[tuple[str, type[np.generic], tuple[int, ...]]]] = [ ("point", np.float32, (3,)), ] shader_folder: ClassVar[str] = "" # _Data and _Uniforms are set as class variables to tell manim how to handle setting/getting these attributes later. points: _Data[Point3D_Array] = _Data() bounding_box: _Data[Point3D_Array] = _Data() rgbas: _Data[FloatRGBA_Array] = _Data() is_fixed_in_frame: _Uniforms = _Uniforms() is_fixed_orientation: _Uniforms = _Uniforms() fixed_orientation_center: _Uniforms[tuple[float, float, float]] = ( _Uniforms() ) # for fixed orientation reference gloss: _Uniforms = _Uniforms() shadow: _Uniforms = _Uniforms() def __init__( self, color: ParsableManimColor | Sequence[ParsableManimColor] = WHITE, opacity: float = 1, dim: int = 3, # TODO, get rid of this # Lighting parameters # Positive gloss up to 1 makes it reflect the light. gloss: float = 0.0, # Positive shadow up to 1 makes a side opposite the light darker shadow: float = 0.0, # For shaders render_primitive: int = moderngl.TRIANGLES, texture_paths: dict[str, str] | None = None, depth_test: bool = False, # If true, the mobject will not get rotated according to camera position is_fixed_in_frame: bool = False, is_fixed_orientation: bool = False, # Must match in attributes of vert shader # Event listener listen_to_events: bool = False, model_matrix: MatrixMN | None = None, should_render: bool = True, name: str | None = None, **kwargs: Any, ): self.name: str = self.__class__.__name__ if name is None else name # getattr in case data/uniforms are already defined in parent classes. self.data: dict[str, npt.NDArray[Any]] = getattr(self, "data", {}) self.uniforms: dict[str, float | tuple[float, ...]] = getattr( self, "uniforms", {} ) self.opacity: float | Iterable[float] = opacity self.dim: int = dim # TODO, get rid of this # Lighting parameters # Positive gloss up to 1 makes it reflect the light. self.gloss = gloss # Positive shadow up to 1 makes a side opposite the light darker self.shadow = shadow # For shaders self.render_primitive: int = render_primitive self.texture_paths: dict[str, str] | None = texture_paths self.depth_test: bool = depth_test # If true, the mobject will not get rotated according to camera position self.is_fixed_in_frame = float(is_fixed_in_frame) self.is_fixed_orientation = float(is_fixed_orientation) self.fixed_orientation_center = (0, 0, 0) # Must match in attributes of vert shader # Event listener self.listen_to_events: bool = listen_to_events self._submobjects: list[OpenGLMobject] = [] self.parents: list[OpenGLMobject] = [] self.parent: OpenGLMobject | None = None self.family: list[OpenGLMobject] = [self] self.locked_data_keys: set[str] = set() self.needs_new_bounding_box: bool = True if model_matrix is None: self.model_matrix: MatrixMN = np.eye(4) else: self.model_matrix = model_matrix self.init_data() self.init_updaters() # self.init_event_listners() self.init_points() self.color: ManimColor | list[ManimColor] = ManimColor.parse(color) self.init_colors() self.shader_indices: Sequence[int] | None = None if self.depth_test: self.apply_depth_test() self.should_render: bool = should_render def _assert_valid_submobjects(self, submobjects: Iterable[OpenGLMobject]) -> Self: """Check that all submobjects are actually instances of :class:`OpenGLMobject`, and that none of them is ``self`` (an :class:`OpenGLMobject` cannot contain itself). This is an auxiliary function called when adding OpenGLMobjects to the :attr:`submobjects` list. This function is intended to be overridden by subclasses such as :class:`OpenGLVMobject`, which should assert that only other OpenGLVMobjects may be added into it. Parameters ---------- submobjects The list containing values to validate. Returns ------- :class:`OpenGLMobject` The OpenGLMobject itself. Raises ------ TypeError If any of the values in `submobjects` is not an :class:`OpenGLMobject`. ValueError If there was an attempt to add an :class:`OpenGLMobject` as its own submobject. """ return self._assert_valid_submobjects_internal(submobjects, OpenGLMobject) def _assert_valid_submobjects_internal( self, submobjects: Iterable[OpenGLMobject], mob_class: type[OpenGLMobject] ) -> Self: for i, submob in enumerate(submobjects): if not isinstance(submob, mob_class): error_message = ( f"Only values of type {mob_class.__name__} can be added " f"as submobjects of {type(self).__name__}, but the value " f"{submob} (at index {i}) is of type " f"{type(submob).__name__}." ) # Intended for subclasses such as OpenGLVMobject, which # cannot have regular OpenGLMobjects as submobjects if isinstance(submob, OpenGLMobject): error_message += ( " You can try adding this value into a Group instead." ) raise TypeError(error_message) if submob is self: raise ValueError( f"Cannot add {type(self).__name__} as a submobject of " f"itself (at index {i})." ) return self @classmethod def __init_subclass__(cls, **kwargs: Any) -> None: super().__init_subclass__(**kwargs) cls._original__init__ = cls.__init__ @override def __str__(self) -> str: return self.__class__.__name__ @override def __repr__(self) -> str: return str(self.name) def __sub__(self, other: Never) -> object: return NotImplemented def __isub__(self, other: Never) -> object: return NotImplemented def __add__(self, mobject: Never) -> object: return NotImplemented def __iadd__(self, mobject: Never) -> object: return NotImplemented @classmethod def set_default(cls, **kwargs: Any) -> None: """Sets the default values of keyword arguments. If this method is called without any additional keyword arguments, the original default values of the initialization method of this class are restored. Parameters ---------- kwargs Passing any keyword argument will update the default values of the keyword arguments of the initialization function of this class. Examples -------- :: >>> from manim import Square, GREEN >>> Square.set_default(color=GREEN, fill_opacity=0.25) >>> s = Square(); s.color, s.fill_opacity (ManimColor('#83C167'), 0.25) >>> Square.set_default() >>> s = Square(); s.color, s.fill_opacity (ManimColor('#FFFFFF'), 0.0) .. manim:: ChangedDefaultTextcolor :save_last_frame: config.background_color = WHITE class ChangedDefaultTextcolor(Scene): def construct(self): Text.set_default(color=BLACK) self.add(Text("Changing default values is easy!")) # we revert the colour back to the default to prevent a bug in the docs. Text.set_default(color=WHITE) """ if kwargs: # Apparently mypy does not correctly understand `partialmethod`: # see https://github.com/python/mypy/issues/8619 cls.__init__ = partialmethod(cls.__init__, **kwargs) # type: ignore[assignment] else: cls.__init__ = cls._original__init__ def init_data(self) -> None: """Initializes the ``points``, ``bounding_box`` and ``rgbas`` attributes and groups them into self.data. Subclasses can inherit and overwrite this method to extend `self.data`. """ self.points = np.zeros((0, 3)) self.bounding_box = np.zeros((3, 3)) self.rgbas = np.zeros((1, 4)) def init_colors(self) -> None: """Initializes the colors. Gets called upon creation """ self.set_color(self.color, self.opacity) def init_points(self) -> None: """Initializes :attr:`points` and therefore the shape. Gets called upon creation. This is an empty method that can be implemented by subclasses. """ # Typically implemented in subclass, unless purposefully left blank pass def set(self, **kwargs: object) -> Self: """Sets attributes. Mainly to be used along with :attr:`animate` to animate setting attributes. Examples -------- :: >>> mob = OpenGLMobject() >>> mob.set(foo=0) OpenGLMobject >>> mob.foo 0 Parameters ---------- **kwargs The attributes and corresponding values to set. Returns ------- :class:`OpenGLMobject` ``self`` """ for attr, value in kwargs.items(): setattr(self, attr, value) return self def set_data(self, data: dict[str, Any]) -> Self: for key in data: self.data[key] = data[key].copy() return self def set_uniforms(self, uniforms: dict[str, Any]) -> Self: for key in uniforms: self.uniforms[key] = uniforms[key] # Copy? return self @property def animate(self) -> _AnimationBuilder | Self: """Used to animate the application of a method. .. warning:: Passing multiple animations for the same :class:`OpenGLMobject` in one call to :meth:`~.Scene.play` is discouraged and will most likely not work properly. Instead of writing an animation like :: self.play( my_mobject.animate.shift(RIGHT), my_mobject.animate.rotate(PI) ) make use of method chaining for ``animate``, meaning:: self.play(my_mobject.animate.shift(RIGHT).rotate(PI)) Keyword arguments that can be passed to :meth:`.Scene.play` can be passed directly after accessing ``.animate``, like so:: self.play(my_mobject.animate(rate_func=linear).shift(RIGHT)) This is especially useful when animating simultaneous ``.animate`` calls that you want to behave differently:: self.play( mobject1.animate(run_time=2).rotate(PI), mobject2.animate(rate_func=there_and_back).shift(RIGHT), ) .. seealso:: :func:`override_animate` Examples -------- .. manim:: AnimateExample class AnimateExample(Scene): def construct(self): s = Square() self.play(Create(s)) self.play(s.animate.shift(RIGHT)) self.play(s.animate.scale(2)) self.play(s.animate.rotate(PI / 2)) self.play(Uncreate(s)) .. manim:: AnimateChainExample class AnimateChainExample(Scene): def construct(self): s = Square() self.play(Create(s)) self.play(s.animate.shift(RIGHT).scale(2).rotate(PI / 2)) self.play(Uncreate(s)) .. manim:: AnimateWithArgsExample class AnimateWithArgsExample(Scene): def construct(self): s = Square() c = Circle() VGroup(s, c).arrange(RIGHT, buff=2) self.add(s, c) self.play( s.animate(run_time=2).rotate(PI / 2), c.animate(rate_func=there_and_back).shift(RIGHT), ) .. warning:: ``.animate`` will interpolate the :class:`~.OpenGLMobject` between its points prior to ``.animate`` and its points after applying ``.animate`` to it. This may result in unexpected behavior when attempting to interpolate along paths, or rotations. If you want animations to consider the points between, consider using :class:`~.ValueTracker` with updaters instead. """ return _AnimationBuilder(self) @property def width(self) -> float: """The width of the mobject. Returns ------- :class:`float` Examples -------- .. manim:: WidthExample class WidthExample(Scene): def construct(self): decimal = DecimalNumber().to_edge(UP) rect = Rectangle(color=BLUE) rect_copy = rect.copy().set_stroke(GRAY, opacity=0.5) decimal.add_updater(lambda d: d.set_value(rect.width)) self.add(rect_copy, rect, decimal) self.play(rect.animate.set(width=7)) self.wait() See also -------- :meth:`length_over_dim` """ # Get the length across the X dimension return self.length_over_dim(0) # Only these methods should directly affect points @width.setter def width(self, value: float) -> None: self.rescale_to_fit(value, 0, stretch=False) @property def height(self) -> float: """The height of the mobject. Returns ------- :class:`float` Examples -------- .. manim:: HeightExample class HeightExample(Scene): def construct(self): decimal = DecimalNumber().to_edge(UP) rect = Rectangle(color=BLUE) rect_copy = rect.copy().set_stroke(GRAY, opacity=0.5) decimal.add_updater(lambda d: d.set_value(rect.height)) self.add(rect_copy, rect, decimal) self.play(rect.animate.set(height=5)) self.wait() See also -------- :meth:`length_over_dim` """ # Get the length across the Y dimension return self.length_over_dim(1) @height.setter def height(self, value: float) -> None: self.rescale_to_fit(value, 1, stretch=False) @property def depth(self) -> float: """The depth of the mobject. Returns ------- :class:`float` See also -------- :meth:`length_over_dim` """ # Get the length across the Z dimension return self.length_over_dim(2) @depth.setter def depth(self, value: float) -> None: self.rescale_to_fit(value, 2, stretch=False) def resize_points( self, new_length: int, resize_func: Callable[[Point3D_Array, int], Point3D_Array] = resize_array, ) -> Self: if new_length != len(self.points): self.points = resize_func(self.points, new_length) self.refresh_bounding_box() return self def set_points(self, points: Point3DLike_Array) -> Self: if len(points) == len(self.points): self.points[:] = points elif isinstance(points, np.ndarray): self.points = points.copy() else: self.points = np.array(points) self.refresh_bounding_box() return self def apply_over_attr_arrays( self, func: Callable[[npt.NDArray[_T_np]], npt.NDArray[_T_np]] ) -> Self: for attr in self.get_array_attrs(): setattr(self, attr, func(getattr(self, attr))) return self def get_array_attrs(self) -> Iterable[str]: return ["points"] def append_points(self, new_points: Point3DLike_Array) -> Self: self.points = np.vstack([self.points, new_points]) self.refresh_bounding_box() return self def reverse_points(self) -> Self: for mob in self.get_family(): for key in mob.data: mob.data[key] = mob.data[key][::-1] return self def get_midpoint(self) -> Point3D: """Get coordinates of the middle of the path that forms the :class:`~.OpenGLMobject`. Examples -------- .. manim:: AngleMidPoint :save_last_frame: class AngleMidPoint(Scene): def construct(self): line1 = Line(ORIGIN, 2*RIGHT) line2 = Line(ORIGIN, 2*RIGHT).rotate_about_origin(80*DEGREES) a = Angle(line1, line2, radius=1.5, other_angle=False) d = Dot(a.get_midpoint()).set_color(RED) self.add(line1, line2, a, d) self.wait() """ return self.point_from_proportion(0.5) # TODO: name is inconsistent with Mobject.apply_points_function_about_point() def apply_points_function( self, func: MultiMappingFunction, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = ORIGIN, works_on_bounding_box: bool = False, ) -> Self: if about_point is None and about_edge is not None: about_point = self.get_bounding_box_point(about_edge) for mob in self.get_family(): arrs: list[Point3D_Array] = [] if mob.has_points(): arrs.append(mob.points) if works_on_bounding_box: arrs.append(mob.get_bounding_box()) for arr in arrs: if about_point is None: arr[:] = func(arr) else: arr[:] = func(arr - about_point) + about_point if not works_on_bounding_box: self.refresh_bounding_box(recurse_down=True) else: for parent in self.parents: parent.refresh_bounding_box() return self # Others related to points def match_points(self, mobject: OpenGLMobject) -> Self: """Edit points, positions, and submobjects to be identical to another :class:`~.OpenGLMobject`, while keeping the style unchanged. Examples -------- .. manim:: MatchPointsScene class MatchPointsScene(Scene): def construct(self): circ = Circle(fill_color=RED, fill_opacity=0.8) square = Square(fill_color=BLUE, fill_opacity=0.2) self.add(circ) self.wait(0.5) self.play(circ.animate.match_points(square)) self.wait(0.5) """ self.set_points(mobject.points) return self def clear_points(self) -> Self: self.points = np.empty((0, 3)) return self def get_num_points(self) -> int: return len(self.points) def get_all_points(self) -> Point3D_Array: if self.submobjects: return np.vstack([sm.points for sm in self.get_family()]) else: return self.points def has_points(self) -> bool: return self.get_num_points() > 0 def get_bounding_box(self) -> Point3D_Array: if self.needs_new_bounding_box: self.bounding_box = self.compute_bounding_box() self.needs_new_bounding_box = False return self.bounding_box def compute_bounding_box(self) -> Point3D_Array: all_points = np.vstack( [ self.points, *( mob.get_bounding_box() for mob in self.get_family()[1:] if mob.has_points() ), ], ) if len(all_points) == 0: return np.zeros((3, self.dim)) else: # Lower left and upper right corners mins = all_points.min(0) maxs = all_points.max(0) mids = (mins + maxs) / 2 return np.array([mins, mids, maxs]) def refresh_bounding_box( self, recurse_down: bool = False, recurse_up: bool = True ) -> Self: for mob in self.get_family(recurse_down): mob.needs_new_bounding_box = True if recurse_up: for parent in self.parents: parent.refresh_bounding_box() return self def is_point_touching( self, point: Point3DLike, buff: float = MED_SMALL_BUFF ) -> bool: bb = self.get_bounding_box() mins = bb[0] - buff maxs = bb[2] + buff rv: bool = (point >= mins).all() and (point <= maxs).all() return rv # Family matters def __getitem__(self, value: int | slice) -> OpenGLMobject: if isinstance(value, slice): GroupClass = self.get_group_class() return GroupClass(*self.split().__getitem__(value)) return self.split().__getitem__(value) def __iter__(self) -> Iterator[OpenGLMobject]: return iter(self.split()) def __len__(self) -> int: return len(self.split()) def split(self) -> Sequence[OpenGLMobject]: return self.submobjects def assemble_family(self) -> Self: sub_families = (sm.get_family() for sm in self.submobjects) self.family = [self, *uniq_chain(*sub_families)] self.refresh_has_updater_status() self.refresh_bounding_box() for parent in self.parents: parent.assemble_family() return self def get_family(self, recurse: bool = True) -> Sequence[OpenGLMobject]: if recurse and hasattr(self, "family"): return self.family else: return [self] def family_members_with_points(self) -> Sequence[OpenGLMobject]: return [m for m in self.get_family() if m.has_points()] def add(self, *mobjects: OpenGLMobject, update_parent: bool = False) -> Self: """Add mobjects as submobjects. The mobjects are added to :attr:`submobjects`. Subclasses of mobject may implement ``+`` and ``+=`` dunder methods. Parameters ---------- mobjects The mobjects to add. Returns ------- :class:`OpenGLMobject` ``self`` Raises ------ :class:`ValueError` When a mobject tries to add itself. :class:`TypeError` When trying to add an object that is not an instance of :class:`OpenGLMobject`. Notes ----- A mobject cannot contain itself, and it cannot contain a submobject more than once. If the parent mobject is displayed, the newly-added submobjects will also be displayed (i.e. they are automatically added to the parent Scene). See Also -------- :meth:`remove` :meth:`add_to_back` Examples -------- :: >>> outer = OpenGLMobject() >>> inner = OpenGLMobject() >>> outer = outer.add(inner) Duplicates are not added again:: >>> outer = outer.add(inner) >>> len(outer.submobjects) 1 Only OpenGLMobjects can be added:: >>> outer.add(3) Traceback (most recent call last): ... TypeError: Only values of type OpenGLMobject can be added as submobjects of OpenGLMobject, but the value 3 (at index 0) is of type int. Adding an object to itself raises an error:: >>> outer.add(outer) Traceback (most recent call last): ... ValueError: Cannot add OpenGLMobject as a submobject of itself (at index 0). """ if update_parent: assert len(mobjects) == 1, "Can't set multiple parents." mobjects[0].parent = self self._assert_valid_submobjects(mobjects) if any(mobjects.count(elem) > 1 for elem in mobjects): logger.warning( "Attempted adding some Mobject as a child more than once, " "this is not possible. Repetitions are ignored.", ) for mobject in mobjects: if mobject not in self.submobjects: self.submobjects.append(mobject) if self not in mobject.parents: mobject.parents.append(self) self.assemble_family() return self def insert( self, index: int, mobject: OpenGLMobject, update_parent: bool = False ) -> Self: """Inserts a mobject at a specific position into self.submobjects Effectively just calls ``self.submobjects.insert(index, mobject)``, where ``self.submobjects`` is a list. Highly adapted from ``OpenGLMobject.add``. Parameters ---------- index The index at which mobject The mobject to be inserted. update_parent Whether or not to set ``mobject.parent`` to ``self``. """ if update_parent: mobject.parent = self self._assert_valid_submobjects([mobject]) if mobject not in self.submobjects: self.submobjects.insert(index, mobject) if self not in mobject.parents: mobject.parents.append(self) self.assemble_family() return self def remove(self, *mobjects: OpenGLMobject, update_parent: bool = False) -> Self: """Remove :attr:`submobjects`. The mobjects are removed from :attr:`submobjects`, if they exist. Subclasses of mobject may implement ``-`` and ``-=`` dunder methods. Parameters ---------- mobjects The mobjects to remove. Returns ------- :class:`OpenGLMobject` ``self`` See Also -------- :meth:`add` """ if update_parent: assert len(mobjects) == 1, "Can't remove multiple parents." mobjects[0].parent = None for mobject in mobjects: if mobject in self.submobjects: self.submobjects.remove(mobject) if self in mobject.parents: mobject.parents.remove(self) self.assemble_family() return self def add_to_back(self, *mobjects: OpenGLMobject) -> Self: # NOTE: is the note true OpenGLMobjects? """Add all passed mobjects to the back of the submobjects. If :attr:`submobjects` already contains the given mobjects, they just get moved to the back instead. Parameters ---------- mobjects The mobjects to add. Returns ------- :class:`OpenGLMobject` ``self`` .. note:: Technically, this is done by adding (or moving) the mobjects to the head of :attr:`submobjects`. The head of this list is rendered first, which places the corresponding mobjects behind the subsequent list members. Raises ------ :class:`ValueError` When a mobject tries to add itself. :class:`TypeError` When trying to add an object that is not an instance of :class:`OpenGLMobject`. Notes ----- A mobject cannot contain itself, and it cannot contain a submobject more than once. If the parent mobject is displayed, the newly-added submobjects will also be displayed (i.e. they are automatically added to the parent Scene). See Also -------- :meth:`remove` :meth:`add` """ self._assert_valid_submobjects(mobjects) self.submobjects = list_update(mobjects, self.submobjects) return self def replace_submobject(self, index: int, new_submob: OpenGLMobject) -> Self: self._assert_valid_submobjects([new_submob]) old_submob = self.submobjects[index] if self in old_submob.parents: old_submob.parents.remove(self) self.submobjects[index] = new_submob self.assemble_family() return self # Submobject organization def arrange( self, direction: Vector3DLike = RIGHT, center: bool = True, **kwargs: Any, ) -> Self: """Sorts :class:`~.OpenGLMobject` next to each other on screen. Examples -------- .. manim:: Example :save_last_frame: class Example(Scene): def construct(self): s1 = Square() s2 = Square() s3 = Square() s4 = Square() x = OpenGLVGroup(s1, s2, s3, s4).set_x(0).arrange(buff=1.0) self.add(x) """ for m1, m2 in zip(self.submobjects[:-1], self.submobjects[1:], strict=True): m2.next_to(m1, direction, **kwargs) if center: self.center() return self def arrange_in_grid( self, rows: int | None = None, cols: int | None = None, buff: float | tuple[float, float] = MED_SMALL_BUFF, cell_alignment: Vector3DLike = ORIGIN, row_alignments: str | None = None, # "ucd" col_alignments: str | None = None, # "lcr" row_heights: Sequence[float | None] | None = None, col_widths: Sequence[float | None] | None = None, flow_order: str = "rd", **kwargs: Any, ) -> Self: """Arrange submobjects in a grid. Parameters ---------- rows The number of rows in the grid. cols The number of columns in the grid. buff The gap between grid cells. To specify a different buffer in the horizontal and vertical directions, a tuple of two values can be given - ``(row, col)``. cell_alignment The way each submobject is aligned in its grid cell. row_alignments The vertical alignment for each row (top to bottom). Accepts the following characters: ``"u"`` - up, ``"c"`` - center, ``"d"`` - down. col_alignments The horizontal alignment for each column (left to right). Accepts the following characters ``"l"`` - left, ``"c"`` - center, ``"r"`` - right. row_heights Defines a list of heights for certain rows (top to bottom). If the list contains ``None``, the corresponding row will fit its height automatically based on the highest element in that row. col_widths Defines a list of widths for certain columns (left to right). If the list contains ``None``, the corresponding column will fit its width automatically based on the widest element in that column. flow_order The order in which submobjects fill the grid. Can be one of the following values: "rd", "dr", "ld", "dl", "ru", "ur", "lu", "ul". ("rd" -> fill rightwards then downwards) Returns ------- OpenGLMobject The mobject. NOTES ----- If only one of ``cols`` and ``rows`` is set implicitly, the other one will be chosen big enough to fit all submobjects. If neither is set, they will be chosen to be about the same, tending towards ``cols`` > ``rows`` (simply because videos are wider than they are high). If both ``cell_alignment`` and ``row_alignments`` / ``col_alignments`` are defined, the latter has higher priority. Raises ------ ValueError If ``rows`` and ``cols`` are too small to fit all submobjects. ValueError If :code:`cols`, :code:`col_alignments` and :code:`col_widths` or :code:`rows`, :code:`row_alignments` and :code:`row_heights` have mismatching sizes. Examples -------- .. manim:: ExampleBoxes :save_last_frame: class ExampleBoxes(Scene): def construct(self): boxes=VGroup(*[Square() for s in range(0,6)]) boxes.arrange_in_grid(rows=2, buff=0.1) self.add(boxes) .. manim:: ArrangeInGrid :save_last_frame: class ArrangeInGrid(Scene): def construct(self): #Add some numbered boxes: np.random.seed(3) boxes = VGroup(*[ Rectangle(WHITE, np.random.random()+.5, np.random.random()+.5).add(Text(str(i+1)).scale(0.5)) for i in range(22) ]) self.add(boxes) boxes.arrange_in_grid( buff=(0.25,0.5), col_alignments="lccccr", row_alignments="uccd", col_widths=[2, *[None]*4, 2], flow_order="dr" ) """ from manim.mobject.geometry.line import Line mobs = self.submobjects.copy() start_pos = self.get_center() # get cols / rows values if given (implicitly) def init_size( num: int | None, alignments: str | None, sizes: Sequence[float | None] | None, name: str, ) -> int: if num is not None: return num if alignments is not None: return len(alignments) if sizes is not None: return len(sizes) raise ValueError( f"At least one of the following parameters: '{name}s', " f"'{name}_alignments' or " f"'{name}_{'widths' if name == 'col' else 'heights'}', " "must not be None" ) cols = init_size(cols, col_alignments, col_widths, "col") rows = init_size(rows, row_alignments, row_heights, "row") # calculate rows cols if rows is None and cols is None: cols = ceil(np.sqrt(len(mobs))) # make the grid as close to quadratic as possible. # choosing cols first can results in cols>rows. # This is favored over rows>cols since in general # the sceene is wider than high. if rows is None: rows = ceil(len(mobs) / cols) if cols is None: cols = ceil(len(mobs) / rows) if rows * cols < len(mobs): raise ValueError("Too few rows and columns to fit all submobjetcs.") # rows and cols are now finally valid. if isinstance(buff, tuple): buff_x = buff[0] buff_y = buff[1] else: buff_x = buff_y = buff # Initialize alignments correctly def init_alignments( str_alignments: str | None, num: int, mapping: dict[str, Vector3D], name: str, direction: Vector3D, ) -> Sequence[Vector3D]: if str_alignments is None: # Use cell_alignment as fallback return [cast(Vector3D, cell_alignment * direction)] * num if len(str_alignments) != num: raise ValueError(f"{name}_alignments has a mismatching size.") return [mapping[letter] for letter in str_alignments] row_alignments_seq: Sequence[Vector3D] = init_alignments( row_alignments, rows, {"u": UP, "c": ORIGIN, "d": DOWN}, "row", RIGHT, ) col_alignments_seq: Sequence[Vector3D] = init_alignments( col_alignments, cols, {"l": LEFT, "c": ORIGIN, "r": RIGHT}, "col", UP, ) # Now row_alignments_seq[r] + col_alignment_seq[c] is the alignment in cell [r][c] mapper: dict[str, Callable[[int, int], int]] = { "dr": lambda r, c: (rows - r - 1) + c * rows, "dl": lambda r, c: (rows - r - 1) + (cols - c - 1) * rows, "ur": lambda r, c: r + c * rows, "ul": lambda r, c: r + (cols - c - 1) * rows, "rd": lambda r, c: (rows - r - 1) * cols + c, "ld": lambda r, c: (rows - r - 1) * cols + (cols - c - 1), "ru": lambda r, c: r * cols + c, "lu": lambda r, c: r * cols + (cols - c - 1), } if flow_order not in mapper: valid_flow_orders = ",".join([f'"{key}"' for key in mapper]) raise ValueError( f"flow_order must be one of the following values: {valid_flow_orders}.", ) flow_order_func = mapper[flow_order] # Reverse row_alignments and row_heights. Necessary since the # grid filling is handled bottom up for simplicity reasons. if TYPE_CHECKING: @overload def reverse(maybe_list: None) -> None: ... @overload def reverse(maybe_list: Sequence[_T]) -> list[_T]: ... @overload def reverse(maybe_list: Sequence[_T] | None) -> list[_T] | None: ... def reverse(maybe_list: Sequence[_T] | None) -> list[_T] | None: if maybe_list is not None: maybe_list = list(maybe_list) maybe_list.reverse() return maybe_list return None row_alignments_seq = reverse(row_alignments_seq) row_heights = reverse(row_heights) placeholder = OpenGLMobject() # Used to fill up the grid temporarily, doesn't get added to the scene. # In this case a Mobject is better than None since it has width and height # properties of 0. mobs.extend([placeholder] * (rows * cols - len(mobs))) grid = [[mobs[flow_order_func(r, c)] for c in range(cols)] for r in range(rows)] measured_heigths = [ max(grid[r][c].height for c in range(cols)) for r in range(rows) ] measured_widths = [ max(grid[r][c].width for r in range(rows)) for c in range(cols) ] # Initialize row_heights / col_widths correctly using measurements as fallback def init_sizes( sizes: Sequence[float | None] | None, num: int, measures: Sequence[float], name: str, ) -> Sequence[float]: if sizes is None: sizes = [None] * num if len(sizes) != num: raise ValueError(f"{name} has a mismatching size.") return [ size if (size := sizes[i]) is not None else measures[i] for i in range(num) ] heights = init_sizes(row_heights, rows, measured_heigths, "row_heights") widths = init_sizes(col_widths, cols, measured_widths, "col_widths") x, y = 0.0, 0.0 for r in range(rows): x = 0.0 for c in range(cols): if grid[r][c] is not placeholder: alignment = row_alignments_seq[r] + col_alignments_seq[c] line = Line( x * RIGHT + y * UP, (x + widths[c]) * RIGHT + (y + heights[r]) * UP, ) # Use a mobject to avoid rewriting align inside # box code that Mobject.move_to(Mobject) already # includes. grid[r][c].move_to(line, alignment) x += widths[c] + buff_x y += heights[r] + buff_y self.move_to(start_pos) return self def get_grid( self, n_rows: int, n_cols: int, height: float | None = None, **kwargs: Any, ) -> OpenGLGroup: """ Returns a new mobject containing multiple copies of this one arranged in a grid """ grid = self.duplicate(n_rows * n_cols) grid.arrange_in_grid(n_rows, n_cols, **kwargs) if height is not None: grid.set_height(height) return grid def duplicate(self, n: int) -> OpenGLGroup: """Returns an :class:`~.OpenGLGroup` containing ``n`` copies of the mobject.""" return self.get_group_class()(*[self.copy() for _ in range(n)]) def sort( self, point_to_num_func: Callable[[Point3DLike], float] = lambda p: p[0], submob_func: Callable[[OpenGLMobject], Any] | None = None, ) -> Self: """Sorts the list of :attr:`submobjects` by a function defined by ``submob_func``.""" if submob_func is not None: self.submobjects.sort(key=submob_func) else: self.submobjects.sort(key=lambda m: point_to_num_func(m.get_center())) return self def shuffle(self, recurse: bool = False) -> Self: """Shuffles the order of :attr:`submobjects` Examples -------- .. manim:: ShuffleSubmobjectsExample class ShuffleSubmobjectsExample(Scene): def construct(self): s= OpenGLVGroup(*[Dot().shift(i*0.1*RIGHT) for i in range(-20,20)]) s2= s.copy() s2.shuffle() s2.shift(DOWN) self.play(Write(s), Write(s2)) """ if recurse: for submob in self.submobjects: submob.shuffle(recurse=True) random.shuffle(self.submobjects) self.assemble_family() return self def invert(self, recursive: bool = False) -> Self: """Inverts the list of :attr:`submobjects`. Parameters ---------- recursive If ``True``, all submobject lists of this mobject's family are inverted. Examples -------- .. manim:: InvertSumobjectsExample class InvertSumobjectsExample(Scene): def construct(self): s = VGroup(*[Dot().shift(i*0.1*RIGHT) for i in range(-20,20)]) s2 = s.copy() s2.invert() s2.shift(DOWN) self.play(Write(s), Write(s2)) """ if recursive: for submob in self.submobjects: submob.invert(recursive=True) self.submobjects.reverse() self.assemble_family() return self # Copying def copy(self, shallow: bool = False) -> OpenGLMobject: """Create and return an identical copy of the :class:`OpenGLMobject` including all :attr:`submobjects`. Returns ------- :class:`OpenGLMobject` The copy. Parameters ---------- shallow Controls whether a shallow copy is returned. Note ---- The clone is initially not visible in the Scene, even if the original was. """ if not shallow: return self.deepcopy() # TODO, either justify reason for shallow copy, or # remove this redundancy everywhere # return self.deepcopy() parents = self.parents self.parents = [] copy_mobject = copy.copy(self) self.parents = parents copy_mobject.data = dict(self.data) for key in self.data: copy_mobject.data[key] = self.data[key].copy() # TODO, are uniforms ever numpy arrays? copy_mobject.uniforms = dict(self.uniforms) copy_mobject.submobjects = [] copy_mobject.add(*(sm.copy() for sm in self.submobjects)) copy_mobject.match_updaters(self) copy_mobject.needs_new_bounding_box = self.needs_new_bounding_box # Make sure any mobject or numpy array attributes are copied family = self.get_family() for attr, value in list(self.__dict__.items()): if ( isinstance(value, OpenGLMobject) and value in family and value is not self ): setattr(copy_mobject, attr, value.copy()) if isinstance(value, np.ndarray): setattr(copy_mobject, attr, value.copy()) # if isinstance(value, ShaderWrapper): # setattr(copy_mobject, attr, value.copy()) return copy_mobject def deepcopy(self) -> OpenGLMobject: parents = self.parents self.parents = [] result = copy.deepcopy(self) self.parents = parents return result def generate_target(self, use_deepcopy: bool = False) -> OpenGLMobject: self.target: OpenGLMobject | None = None # Prevent exponential explosion if use_deepcopy: self.target = self.deepcopy() else: self.target = self.copy() return self.target def save_state(self, use_deepcopy: bool = False) -> Self: """Save the current state (position, color & size). Can be restored with :meth:`~.OpenGLMobject.restore`.""" if hasattr(self, "saved_state"): # Prevent exponential growth of data self.saved_state: OpenGLMobject | None = None if use_deepcopy: self.saved_state = self.deepcopy() else: self.saved_state = self.copy() return self def restore(self) -> Self: """Restores the state that was previously saved with :meth:`~.OpenGLMobject.save_state`.""" if not hasattr(self, "saved_state") or self.saved_state is None: raise Exception("Trying to restore without having saved") self.become(self.saved_state) return self # Updating def init_updaters(self) -> None: self.time_based_updaters: list["_TimeBasedUpdater"] = [] # noqa: UP037 self.non_time_updaters: list["_NonTimeBasedUpdater"] = [] # noqa: UP037 self.has_updaters: bool = False self.updating_suspended: bool = False def update(self, dt: float = 0, recurse: bool = True) -> Self: if self.has_updaters and not self.updating_suspended: for time_based_updater in self.time_based_updaters: time_based_updater(self, dt) for non_time_updater in self.non_time_updaters: non_time_updater(self) if recurse: for submob in self.submobjects: submob.update(dt, recurse) return self def get_time_based_updaters(self) -> Sequence[_TimeBasedUpdater]: return self.time_based_updaters def has_time_based_updater(self) -> bool: return len(self.time_based_updaters) > 0 def get_updaters(self) -> Sequence[_Updater]: return cast("list[_Updater]", self.time_based_updaters) + cast( "list[_Updater]", self.non_time_updaters ) def get_family_updaters(self) -> Sequence[_Updater]: return list(it.chain(*(sm.get_updaters() for sm in self.get_family()))) def add_updater( self, update_function: _Updater, index: int | None = None, call_updater: bool = False, ) -> Self: updater_list: list[_TimeBasedUpdater] | list[_NonTimeBasedUpdater] if "dt" in inspect.signature(update_function).parameters: updater_list = self.time_based_updaters else: updater_list = self.non_time_updaters if index is None: cast("list[_Updater]", updater_list).append(update_function) else: cast("list[_Updater]", updater_list).insert(index, update_function) self.refresh_has_updater_status() if call_updater: self.update() return self def remove_updater(self, update_function: _Updater) -> Self: for updater_list in [self.time_based_updaters, self.non_time_updaters]: updater_list = cast("list[_Updater]", updater_list) while update_function in updater_list: updater_list.remove(update_function) self.refresh_has_updater_status() return self def clear_updaters(self, recurse: bool = True) -> Self: self.time_based_updaters = [] self.non_time_updaters = [] self.refresh_has_updater_status() if recurse: for submob in self.submobjects: submob.clear_updaters() return self def match_updaters(self, mobject: OpenGLMobject) -> Self: self.clear_updaters() for updater in mobject.get_updaters(): self.add_updater(updater) return self def suspend_updating(self, recurse: bool = True) -> Self: self.updating_suspended = True if recurse: for submob in self.submobjects: submob.suspend_updating(recurse) return self def resume_updating(self, recurse: bool = True, call_updater: bool = True) -> Self: self.updating_suspended = False if recurse: for submob in self.submobjects: submob.resume_updating(recurse) for parent in self.parents: parent.resume_updating(recurse=False, call_updater=False) if call_updater: self.update(dt=0, recurse=recurse) return self def refresh_has_updater_status(self) -> Self: self.has_updaters = any(mob.get_updaters() for mob in self.get_family()) return self # Transforming operations def shift(self, vector: Vector3DLike) -> Self: self.apply_points_function( lambda points: points + vector, about_edge=None, works_on_bounding_box=True, ) return self def scale( self, scale_factor: float, about_point: Point3DLike | None = None, about_edge: Point3DLike | None = ORIGIN, **_kwargs: object, ) -> Self: r"""Scale the size by a factor. Default behavior is to scale about the center of the mobject. The argument about_edge can be a vector, indicating which side of the mobject to scale about, e.g., mob.scale(about_edge = RIGHT) scales about mob.get_right(). Otherwise, if about_point is given a value, scaling is done with respect to that point. Parameters ---------- scale_factor The scaling factor :math:`\alpha`. If :math:`0 < |\alpha|ย < 1`, the mobject will shrink, and for :math:`|\alpha| > 1` it will grow. Furthermore, if :math:`\alpha < 0`, the mobject is also flipped. kwargs Additional keyword arguments passed to :meth:`apply_points_function`. Returns ------- OpenGLMobject The scaled mobject. Examples -------- .. manim:: MobjectScaleExample :save_last_frame: class MobjectScaleExample(Scene): def construct(self): f1 = Text("F") f2 = Text("F").scale(2) f3 = Text("F").scale(0.5) f4 = Text("F").scale(-1) vgroup = VGroup(f1, f2, f3, f4).arrange(6 * RIGHT) self.add(vgroup) See also -------- :meth:`move_to` """ self.apply_points_function( lambda points: scale_factor * points, about_point=about_point, about_edge=about_edge, works_on_bounding_box=True, ) return self def stretch(self, factor: float, dim: int, **kwargs: Any) -> Self: def func(points: Point3D_Array) -> Point3D_Array: points[:, dim] *= factor return points self.apply_points_function(func, works_on_bounding_box=True, **kwargs) return self def rotate_about_origin(self, angle: float, axis: Vector3DLike = OUT) -> Self: return self.rotate(angle, axis, about_point=ORIGIN) def rotate( self, angle: float, axis: Vector3DLike = OUT, about_point: Point3DLike | None = None, **kwargs: Any, ) -> Self: """Rotates the :class:`~.OpenGLMobject` about a certain point.""" rot_matrix_T = rotation_matrix_transpose(angle, axis) self.apply_points_function( lambda points: np.dot(points, rot_matrix_T), about_point=about_point, **kwargs, ) return self def flip(self, axis: Vector3DLike = UP, **kwargs: Any) -> Self: """Flips/Mirrors an mobject about its center. Examples -------- .. manim:: FlipExample :save_last_frame: class FlipExample(Scene): def construct(self): s= Line(LEFT, RIGHT+UP).shift(4*LEFT) self.add(s) s2= s.copy().flip() self.add(s2) """ return self.rotate(TAU / 2, axis, **kwargs) def apply_function(self, function: MappingFunction, **kwargs: Any) -> Self: # Default to applying matrix about the origin, not mobjects center if len(kwargs) == 0: kwargs["about_point"] = ORIGIN def multi_mapping_function(points: Point3D_Array) -> Point3D_Array: result: Point3D_Array = np.apply_along_axis(function, 1, points) return result self.apply_points_function(multi_mapping_function, **kwargs) return self def apply_function_to_position(self, function: MappingFunction) -> Self: self.move_to(function(self.get_center())) return self def apply_function_to_submobject_positions(self, function: MappingFunction) -> Self: for submob in self.submobjects: submob.apply_function_to_position(function) return self def apply_matrix(self, matrix: MatrixMN, **kwargs: Any) -> Self: # Default to applying matrix about the origin, not mobjects center if ("about_point" not in kwargs) and ("about_edge" not in kwargs): kwargs["about_point"] = ORIGIN full_matrix = np.identity(self.dim) matrix = np.array(matrix) full_matrix[: matrix.shape[0], : matrix.shape[1]] = matrix self.apply_points_function( lambda points: np.dot(points, full_matrix.T), **kwargs ) return self def apply_complex_function( self, function: Callable[[complex], complex], **kwargs: Any ) -> Self: """Applies a complex function to a :class:`OpenGLMobject`. The x and y coordinates correspond to the real and imaginary parts respectively. Example ------- .. manim:: ApplyFuncExample class ApplyFuncExample(Scene): def construct(self): circ = Circle().scale(1.5) circ_ref = circ.copy() circ.apply_complex_function( lambda x: np.exp(x*1j) ) t = ValueTracker(0) circ.add_updater( lambda x: x.become(circ_ref.copy().apply_complex_function( lambda x: np.exp(x+t.get_value()*1j) )).set_color(BLUE) ) self.add(circ_ref) self.play(TransformFromCopy(circ_ref, circ)) self.play(t.animate.set_value(TAU), run_time=3) """ def R3_func(point: Point3D) -> Point3D: x, y, z = point xy_complex = function(complex(x, y)) return np.array([xy_complex.real, xy_complex.imag, z]) return self.apply_function(R3_func, **kwargs) def hierarchical_model_matrix(self) -> MatrixMN: if self.parent is None: return self.model_matrix model_matrices = [self.model_matrix] current_object = self while current_object.parent is not None: model_matrices.append(current_object.parent.model_matrix) current_object = current_object.parent return np.linalg.multi_dot(list(reversed(model_matrices))) def wag( self, direction: Vector3DLike = RIGHT, axis: Vector3DLike = DOWN, wag_factor: float = 1.0, ) -> Self: for mob in self.family_members_with_points(): alphas = np.dot(mob.points, np.transpose(axis)) alphas -= min(alphas) alphas /= max(alphas) alphas = alphas**wag_factor mob.set_points( mob.points + np.dot( alphas.reshape((len(alphas), 1)), np.array(direction).reshape((1, mob.dim)), ), ) return self # Positioning methods def center(self) -> Self: """Moves the mobject to the center of the Scene.""" self.shift(-self.get_center()) return self def align_on_border( self, direction: Vector3DLike, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER, ) -> Self: """ Direction just needs to be a vector pointing towards side or corner in the 2d plane. """ target_point = np.sign(direction) * ( config["frame_x_radius"], config["frame_y_radius"], 0, ) point_to_align = self.get_bounding_box_point(direction) shift_val = target_point - point_to_align - buff * np.asarray(direction) shift_val = shift_val * abs(np.sign(direction)) self.shift(shift_val) return self def to_corner( self, corner: Vector3DLike = LEFT + DOWN, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER, ) -> Self: return self.align_on_border(corner, buff) def to_edge( self, edge: Vector3DLike = LEFT, buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER, ) -> Self: return self.align_on_border(edge, buff) def next_to( self, mobject_or_point: OpenGLMobject | Point3DLike, direction: Vector3DLike = RIGHT, buff: float = DEFAULT_MOBJECT_TO_MOBJECT_BUFFER, aligned_edge: Vector3DLike = ORIGIN, submobject_to_align: OpenGLMobject | None = None, index_of_submobject_to_align: int | None = None, coor_mask: Vector3DLike = np.array([1, 1, 1]), ) -> Self: """Move this :class:`~.OpenGLMobject` next to another's :class:`~.OpenGLMobject` or coordinate. Examples -------- .. manim:: GeometricShapes :save_last_frame: class GeometricShapes(Scene): def construct(self): d = Dot() c = Circle() s = Square() t = Triangle() d.next_to(c, RIGHT) s.next_to(c, LEFT) t.next_to(c, DOWN) self.add(d, c, s, t) """ np_direction = np.asarray(direction) np_aligned_edge = np.asarray(aligned_edge) target_point: Point3DLike if isinstance(mobject_or_point, OpenGLMobject): mob = mobject_or_point if index_of_submobject_to_align is not None: target_aligner = mob[index_of_submobject_to_align] else: target_aligner = mob target_point = target_aligner.get_bounding_box_point( np_aligned_edge + np_direction, ) else: target_point = mobject_or_point if submobject_to_align is not None: aligner = submobject_to_align elif index_of_submobject_to_align is not None: aligner = self[index_of_submobject_to_align] else: aligner = self point_to_align = aligner.get_bounding_box_point(np_aligned_edge - np_direction) self.shift((target_point - point_to_align + buff * np_direction) * coor_mask) return self def shift_onto_screen(self, **kwargs: Any) -> Self: space_lengths: list[float] = [ config["frame_x_radius"], config["frame_y_radius"], ] for vect in UP, DOWN, LEFT, RIGHT: dim = np.argmax(np.abs(vect)) buff: float = kwargs.get("buff", DEFAULT_MOBJECT_TO_EDGE_BUFFER) max_val = space_lengths[dim] - buff edge_center = self.get_edge_center(vect) if np.dot(edge_center, vect) > max_val: self.to_edge(vect, buff=buff) return self def is_off_screen(self) -> bool: if self.get_left()[0] > config.frame_x_radius: return True if self.get_right()[0] < config.frame_x_radius: return True if self.get_bottom()[1] > config.frame_y_radius: return True return cast(float, self.get_top()[1]) < -config.frame_y_radius def stretch_about_point(self, factor: float, dim: int, point: Point3DLike) -> Self: return self.stretch(factor, dim, about_point=point) def rescale_to_fit( self, length: float, dim: int, stretch: bool = False, **kwargs: Any, ) -> Self: old_length = self.length_over_dim(dim) if old_length == 0: return self if stretch: self.stretch(length / old_length, dim, **kwargs) else: self.scale(length / old_length, **kwargs) return self def stretch_to_fit_width(self, width: float, **kwargs: Any) -> Self: """Stretches the :class:`~.OpenGLMobject` to fit a width, not keeping height/depth proportional. Returns ------- :class:`OpenGLMobject` ``self`` Examples -------- :: >>> from manim import * >>> import numpy as np >>> sq = Square() >>> sq.height np.float64(2.0) >>> sq.stretch_to_fit_width(5) Square >>> sq.width np.float64(5.0) >>> sq.height np.float64(2.0) """ return self.rescale_to_fit(width, 0, stretch=True, **kwargs) def stretch_to_fit_height(self, height: float, **kwargs: Any) -> Self: """Stretches the :class:`~.OpenGLMobject` to fit a height, not keeping width/height proportional.""" return self.rescale_to_fit(height, 1, stretch=True, **kwargs) def stretch_to_fit_depth(self, depth: float, **kwargs: Any) -> Self: """Stretches the :class:`~.OpenGLMobject` to fit a depth, not keeping width/height proportional.""" return self.rescale_to_fit(depth, 1, stretch=True, **kwargs) def set_width( self, width: float, stretch: bool = False, **kwargs: Any, ) -> Self: """Scales the :class:`~.OpenGLMobject` to fit a width while keeping height/depth proportional. Returns ------- :class:`OpenGLMobject` ``self`` Examples -------- :: >>> from manim import * >>> import numpy as np >>> sq = Square() >>> sq.height np.float64(2.0) >>> sq.scale_to_fit_width(5) Square >>> sq.width np.float64(5.0) >>> sq.height np.float64(5.0) """ return self.rescale_to_fit(width, 0, stretch=stretch, **kwargs) scale_to_fit_width = set_width def set_height( self, height: float, stretch: bool = False, **kwargs: Any, ) -> Self: """Scales the :class:`~.OpenGLMobject` to fit a height while keeping width/depth proportional.""" return self.rescale_to_fit(height, 1, stretch=stretch, **kwargs) scale_to_fit_height = set_height def set_depth( self, depth: float, stretch: bool = False, **kwargs: Any, ) -> Self: """Scales the :class:`~.OpenGLMobject` to fit a depth while keeping width/height proportional.""" return self.rescale_to_fit(depth, 2, stretch=stretch, **kwargs) scale_to_fit_depth = set_depth def set_coord( self, value: float, dim: int, direction: Vector3DLike = ORIGIN ) -> Self: curr = self.get_coord(dim, direction) shift_vect = np.zeros(self.dim) shift_vect[dim] = value - curr self.shift(shift_vect) return self def set_x(self, x: float, direction: Vector3DLike = ORIGIN) -> Self: """Set x value of the center of the :class:`~.OpenGLMobject` (``int`` or ``float``)""" return self.set_coord(x, 0, direction) def set_y(self, y: float, direction: Vector3DLike = ORIGIN) -> Self: """Set y value of the center of the :class:`~.OpenGLMobject` (``int`` or ``float``)""" return self.set_coord(y, 1, direction) def set_z(self, z: float, direction: Vector3DLike = ORIGIN) -> Self: """Set z value of the center of the :class:`~.OpenGLMobject` (``int`` or ``float``)""" return self.set_coord(z, 2, direction) def space_out_submobjects(self, factor: float = 1.5, **kwargs: Any) -> Self: self.scale(factor, **kwargs) for submob in self.submobjects: submob.scale(1.0 / factor) return self def move_to( self, point_or_mobject: Point3DLike | OpenGLMobject, aligned_edge: Vector3DLike = ORIGIN, coor_mask: Vector3DLike = np.array([1, 1, 1]), ) -> Self: """Move center of the :class:`~.OpenGLMobject` to certain coordinate.""" target: Point3DLike if isinstance(point_or_mobject, OpenGLMobject): target = point_or_mobject.get_bounding_box_point(aligned_edge) else: target = point_or_mobject point_to_align = self.get_bounding_box_point(aligned_edge) self.shift((target - point_to_align) * coor_mask) return self def replace( self, mobject: OpenGLMobject, dim_to_match: int = 0, stretch: bool = False, ) -> Self: if not mobject.get_num_points() and not mobject.submobjects: self.scale(0) return self if stretch: for i in range(self.dim): self.rescale_to_fit(mobject.length_over_dim(i), i, stretch=True) else: self.rescale_to_fit( mobject.length_over_dim(dim_to_match), dim_to_match, stretch=False, ) self.shift(mobject.get_center() - self.get_center()) return self def surround( self, mobject: OpenGLMobject, dim_to_match: int = 0, stretch: bool = False, buff: float = MED_SMALL_BUFF, ) -> Self: self.replace(mobject, dim_to_match, stretch) length = mobject.length_over_dim(dim_to_match) self.scale((length + buff) / length) return self def put_start_and_end_on(self, start: Point3DLike, end: Point3DLike) -> Self: curr_start, curr_end = self.get_start_and_end() curr_vect = curr_end - curr_start if np.all(curr_vect == 0): raise Exception("Cannot position endpoints of closed loop") target_vect = np.array(end) - np.array(start) axis = ( normalize(np.cross(curr_vect, target_vect)) if np.linalg.norm(np.cross(curr_vect, target_vect)) != 0 else OUT ) self.scale( float(np.linalg.norm(target_vect) / np.linalg.norm(curr_vect)), about_point=curr_start, ) self.rotate( angle_between_vectors(curr_vect, target_vect), about_point=curr_start, axis=axis, ) self.shift(start - curr_start) return self # Color functions def set_rgba_array( self, color: ParsableManimColor | Iterable[ParsableManimColor] | None = None, opacity: float | Iterable[float] | None = None, name: str = "rgbas", recurse: bool = True, ) -> Self: if color is not None: rgbs: FloatRGB_Array = np.array([color_to_rgb(c) for c in listify(color)]) if opacity is not None: opacities = listify(opacity) # Color only if color is not None and opacity is None: for mob in self.get_family(recurse): mob.data[name] = resize_array( mob.data[name] if name in mob.data else np.empty((1, 3)), len(rgbs) ) mob.data[name][:, :3] = rgbs # Opacity only if color is None and opacity is not None: for mob in self.get_family(recurse): mob.data[name] = resize_array( mob.data[name] if name in mob.data else np.empty((1, 3)), len(opacities), ) mob.data[name][:, 3] = opacities # Color and opacity if color is not None and opacity is not None: rgbas: FloatRGBA_Array = np.array( [[*rgb, o] for rgb, o in zip(*make_even(rgbs, opacities), strict=True)] ) for mob in self.get_family(recurse): mob.data[name] = rgbas.copy() return self def set_rgba_array_direct( self, rgbas: FloatRGBA_Array, name: str = "rgbas", recurse: bool = True, ) -> Self: """Directly set rgba data from `rgbas` and optionally do the same recursively with submobjects. This can be used if the `rgbas` have already been generated with the correct shape and simply need to be set. Parameters ---------- rgbas the rgba to be set as data name the name of the data attribute to be set recurse set to true to recursively apply this method to submobjects """ for mob in self.get_family(recurse): mob.data[name] = rgbas.copy() return self def set_color( self, color: ParsableManimColor | Sequence[ParsableManimColor] | None, opacity: float | Iterable[float] | None = None, recurse: bool = True, ) -> Self: self.set_rgba_array(color, opacity, recurse=False) # Recurse to submobjects differently from how set_rgba_array # in case they implement set_color differently if color is not None: self.color = ManimColor.parse(color) if opacity is not None: self.opacity = opacity if recurse: for submob in self.submobjects: submob.set_color(color, recurse=True) return self def set_opacity( self, opacity: float | Iterable[float] | None, recurse: bool = True ) -> Self: self.set_rgba_array(color=None, opacity=opacity, recurse=False) if recurse: for submob in self.submobjects: submob.set_opacity(opacity, recurse=True) return self def get_color(self) -> str: return rgb_to_hex(self.rgbas[0, :3]) def get_opacity(self) -> float: rv: float = self.rgbas[0, 3] return rv def set_color_by_gradient(self, *colors: ParsableManimColor) -> Self: return self.set_submobject_colors_by_gradient(*colors) def set_submobject_colors_by_gradient(self, *colors: ParsableManimColor) -> Self: if len(colors) == 0: raise Exception("Need at least one color") elif len(colors) == 1: return self.set_color(*colors) # mobs = self.family_members_with_points() mobs = self.submobjects new_colors = color_gradient(colors, len(mobs)) for mob, color in zip(mobs, new_colors, strict=True): mob.set_color(color) return self def fade(self, darkness: float = 0.5, recurse: bool = True) -> Self: return self.set_opacity(1.0 - darkness, recurse=recurse) def get_gloss(self) -> float: return self.gloss def set_gloss(self, gloss: float, recurse: bool = True) -> Self: for mob in self.get_family(recurse): mob.gloss = gloss return self def get_shadow(self) -> float: return self.shadow def set_shadow(self, shadow: float, recurse: bool = True) -> Self: for mob in self.get_family(recurse): mob.shadow = shadow return self # Background rectangle def add_background_rectangle( self, color: ParsableManimColor | None = None, opacity: float = 0.75, **kwargs: Any, ) -> Self: # TODO, this does not behave well when the mobject has points, # since it gets displayed on top """Add a BackgroundRectangle as submobject. The BackgroundRectangle is added behind other submobjects. This can be used to increase the mobjects visibility in front of a noisy background. Parameters ---------- color The color of the BackgroundRectangle opacity The opacity of the BackgroundRectangle kwargs Additional keyword arguments passed to the BackgroundRectangle constructor Returns ------- :class:`OpenGLMobject` ``self`` See Also -------- :meth:`add_to_back` :class:`~.BackgroundRectangle` """ from manim.mobject.geometry.shape_matchers import BackgroundRectangle self.background_rectangle: BackgroundRectangle = BackgroundRectangle( self, # type: ignore[arg-type] color=color, fill_opacity=opacity, **kwargs, ) self.add_to_back(self.background_rectangle) # type: ignore[arg-type] return self def add_background_rectangle_to_submobjects(self, **kwargs: Any) -> Self: for submobject in self.submobjects: submobject.add_background_rectangle(**kwargs) return self def add_background_rectangle_to_family_members_with_points( self, **kwargs: Any ) -> Self: for mob in self.family_members_with_points(): mob.add_background_rectangle(**kwargs) return self # Getters def get_bounding_box_point(self, direction: Vector3DLike) -> Point3D: bb = self.get_bounding_box() indices = (np.sign(direction) + 1).astype(int) return np.array([bb[indices[i]][i] for i in range(3)]) def get_edge_center(self, direction: Vector3DLike) -> Point3D: """Get edge coordinates for certain direction.""" return self.get_bounding_box_point(direction) def get_corner(self, direction: Vector3DLike) -> Point3D: """Get corner coordinates for certain direction.""" return self.get_bounding_box_point(direction) def get_center(self) -> Point3D: """Get center coordinates.""" return self.get_bounding_box()[1] def get_center_of_mass(self) -> Point3D: return self.get_all_points().mean(0) def get_boundary_point(self, direction: Vector3DLike) -> Point3D: all_points = self.get_all_points() boundary_directions = all_points - self.get_center() norms = np.linalg.norm(boundary_directions, axis=1) boundary_directions /= np.repeat(norms, 3).reshape((len(norms), 3)) index = np.argmax(np.dot(boundary_directions, direction)) return all_points[index] def get_continuous_bounding_box_point(self, direction: Vector3DLike) -> Point3D: _dl, center, ur = self.get_bounding_box() corner_vect = ur - center np_direction = np.asarray(direction) return center + np_direction / np.max( np.abs( np.true_divide( np_direction, corner_vect, out=np.zeros(len(np_direction)), where=((corner_vect) != 0), ), ), ) def get_top(self) -> Point3D: """Get top coordinates of a box bounding the :class:`~.OpenGLMobject`""" return self.get_edge_center(UP) def get_bottom(self) -> Point3D: """Get bottom coordinates of a box bounding the :class:`~.OpenGLMobject`""" return self.get_edge_center(DOWN) def get_right(self) -> Point3D: """Get right coordinates of a box bounding the :class:`~.OpenGLMobject`""" return self.get_edge_center(RIGHT) def get_left(self) -> Point3D: """Get left coordinates of a box bounding the :class:`~.OpenGLMobject`""" return self.get_edge_center(LEFT) def get_zenith(self) -> Point3D: """Get zenith coordinates of a box bounding a 3D :class:`~.OpenGLMobject`.""" return self.get_edge_center(OUT) def get_nadir(self) -> Point3D: """Get nadir (opposite the zenith) coordinates of a box bounding a 3D :class:`~.OpenGLMobject`.""" return self.get_edge_center(IN) def length_over_dim(self, dim: int) -> float: bb = self.get_bounding_box() rv: float = abs((bb[2] - bb[0])[dim]) return rv def get_width(self) -> float: """Returns the width of the mobject.""" return self.length_over_dim(0) def get_height(self) -> float: """Returns the height of the mobject.""" return self.length_over_dim(1) def get_depth(self) -> float: """Returns the depth of the mobject.""" return self.length_over_dim(2) def get_coord(self, dim: int, direction: Vector3DLike = ORIGIN) -> ManimFloat: """Meant to generalize ``get_x``, ``get_y`` and ``get_z``""" return self.get_bounding_box_point(direction)[dim] def get_x(self, direction: Vector3DLike = ORIGIN) -> ManimFloat: """Returns x coordinate of the center of the :class:`~.OpenGLMobject` as ``float``""" return self.get_coord(0, direction) def get_y(self, direction: Vector3DLike = ORIGIN) -> ManimFloat: """Returns y coordinate of the center of the :class:`~.OpenGLMobject` as ``float``""" return self.get_coord(1, direction) def get_z(self, direction: Vector3DLike = ORIGIN) -> ManimFloat: """Returns z coordinate of the center of the :class:`~.OpenGLMobject` as ``float``""" return self.get_coord(2, direction) def get_start(self) -> Point3D: """Returns the point, where the stroke that surrounds the :class:`~.OpenGLMobject` starts.""" self.throw_error_if_no_points() return np.array(self.points[0]) def get_end(self) -> Point3D: """Returns the point, where the stroke that surrounds the :class:`~.OpenGLMobject` ends.""" self.throw_error_if_no_points() return np.array(self.points[-1]) def get_start_and_end(self) -> tuple[Point3D, Point3D]: """Returns starting and ending point of a stroke as a ``tuple``.""" return self.get_start(), self.get_end() def point_from_proportion(self, alpha: float) -> Point3D: points = self.points i, subalpha = integer_interpolate(0, len(points) - 1, alpha) return interpolate(points[i], points[i + 1], subalpha) def pfp(self, alpha: float) -> Point3D: """Abbreviation for point_from_proportion""" return self.point_from_proportion(alpha) def get_pieces(self, n_pieces: int) -> OpenGLMobject: template = self.copy() template.submobjects = [] alphas = np.linspace(0, 1, n_pieces + 1) return OpenGLGroup( *( template.copy().pointwise_become_partial(self, a1, a2) for a1, a2 in zip(alphas[:-1], alphas[1:], strict=True) ) ) def get_z_index_reference_point(self) -> Point3D: # TODO, better place to define default z_index_group? z_index_group = getattr(self, "z_index_group", self) return z_index_group.get_center() # Match other mobject properties def match_color(self, mobject: OpenGLMobject) -> Self: """Match the color with the color of another :class:`~.OpenGLMobject`.""" return self.set_color(mobject.get_color()) def match_dim_size( self, mobject: OpenGLMobject, dim: int, **kwargs: Any, ) -> Self: """Match the specified dimension with the dimension of another :class:`~.OpenGLMobject`.""" return self.rescale_to_fit(mobject.length_over_dim(dim), dim, **kwargs) def match_width(self, mobject: OpenGLMobject, **kwargs: Any) -> Self: """Match the width with the width of another :class:`~.OpenGLMobject`.""" return self.match_dim_size(mobject, 0, **kwargs) def match_height(self, mobject: OpenGLMobject, **kwargs: Any) -> Self: """Match the height with the height of another :class:`~.OpenGLMobject`.""" return self.match_dim_size(mobject, 1, **kwargs) def match_depth(self, mobject: OpenGLMobject, **kwargs: Any) -> Self: """Match the depth with the depth of another :class:`~.OpenGLMobject`.""" return self.match_dim_size(mobject, 2, **kwargs) def match_coord( self, mobject: OpenGLMobject, dim: int, direction: Vector3DLike = ORIGIN ) -> Self: """Match the coordinates with the coordinates of another :class:`~.OpenGLMobject`.""" return self.set_coord( mobject.get_coord(dim, direction), dim=dim, direction=direction, ) def match_x(self, mobject: OpenGLMobject, direction: Vector3DLike = ORIGIN) -> Self: """Match x coord. to the x coord. of another :class:`~.OpenGLMobject`.""" return self.match_coord(mobject, 0, direction) def match_y(self, mobject: OpenGLMobject, direction: Vector3DLike = ORIGIN) -> Self: """Match y coord. to the x coord. of another :class:`~.OpenGLMobject`.""" return self.match_coord(mobject, 1, direction) def match_z(self, mobject: OpenGLMobject, direction: Vector3DLike = ORIGIN) -> Self: """Match z coord. to the x coord. of another :class:`~.OpenGLMobject`.""" return self.match_coord(mobject, 2, direction) def align_to( self, mobject_or_point: OpenGLMobject | Point3DLike, direction: Vector3DLike = ORIGIN, ) -> Self: """ Examples: mob1.align_to(mob2, UP) moves mob1 vertically so that its top edge lines ups with mob2's top edge. mob1.align_to(mob2, alignment_vect = RIGHT) moves mob1 horizontally so that it's center is directly above/below the center of mob2 """ point: Point3DLike if isinstance(mobject_or_point, OpenGLMobject): point = mobject_or_point.get_bounding_box_point(direction) else: point = mobject_or_point for dim in range(self.dim): if direction[dim] != 0: self.set_coord(point[dim], dim, direction) return self def get_group_class(self) -> type[OpenGLGroup]: return OpenGLGroup @staticmethod def get_mobject_type_class() -> type[OpenGLMobject]: """Return the base class of this mobject type.""" return OpenGLMobject # Alignment def align_data_and_family(self, mobject: OpenGLMobject) -> Self: self.align_family(mobject) self.align_data(mobject) return self def align_data(self, mobject: OpenGLMobject) -> Self: # In case any data arrays get resized when aligned to shader data # self.refresh_shader_data() for mob1, mob2 in zip(self.get_family(), mobject.get_family(), strict=False): # Separate out how points are treated so that subclasses # can handle that case differently if they choose mob1.align_points(mob2) for key in mob1.data.keys() & mob2.data.keys(): if key == "points": continue arr1 = mob1.data[key] arr2 = mob2.data[key] if len(arr2) > len(arr1): mob1.data[key] = resize_preserving_order(arr1, len(arr2)) elif len(arr1) > len(arr2): mob2.data[key] = resize_preserving_order(arr2, len(arr1)) return self def align_points(self, mobject: OpenGLMobject) -> Self: max_len = max(self.get_num_points(), mobject.get_num_points()) for mob in (self, mobject): mob.resize_points(max_len, resize_func=resize_preserving_order) return self def align_family(self, mobject: OpenGLMobject) -> Self: mob1 = self mob2 = mobject n1 = len(mob1) n2 = len(mob2) if n1 != n2: mob1.add_n_more_submobjects(max(0, n2 - n1)) mob2.add_n_more_submobjects(max(0, n1 - n2)) # Recurse for sm1, sm2 in zip(mob1.submobjects, mob2.submobjects, strict=True): sm1.align_family(sm2) return self def push_self_into_submobjects(self) -> Self: copy = self.deepcopy() copy.submobjects = [] self.resize_points(0) self.add(copy) return self def add_n_more_submobjects(self, n: int) -> Self: if n == 0: return self curr = len(self.submobjects) if curr == 0: # If empty, simply add n point mobjects null_mob = self.copy() null_mob.set_points([self.get_center()]) self.submobjects = [null_mob.copy() for k in range(n)] return self target = curr + n repeat_indices = (np.arange(target) * curr) // target split_factors = [(repeat_indices == i).sum() for i in range(curr)] new_submobs = [] for submob, sf in zip(self.submobjects, split_factors, strict=True): new_submobs.append(submob) for _ in range(1, sf): new_submob = submob.copy() # If the submobject is at all transparent, then # make the copy completely transparent if submob.get_opacity() < 1: new_submob.set_opacity(0) new_submobs.append(new_submob) self.submobjects = new_submobs return self # Interpolate def interpolate( self, mobject1: OpenGLMobject, mobject2: OpenGLMobject, alpha: float, path_func: PathFuncType = straight_path(), ) -> Self: """Turns this :class:`~.OpenGLMobject` into an interpolation between ``mobject1`` and ``mobject2``. Examples -------- .. manim:: DotInterpolation :save_last_frame: class DotInterpolation(Scene): def construct(self): dotR = Dot(color=DARK_GREY) dotR.shift(2 * RIGHT) dotL = Dot(color=WHITE) dotL.shift(2 * LEFT) dotMiddle = OpenGLVMobject().interpolate(dotL, dotR, alpha=0.3) self.add(dotL, dotR, dotMiddle) """ for key in self.data: if key in self.locked_data_keys: continue if len(self.data[key]) == 0: continue if key not in mobject1.data or key not in mobject2.data: continue func = path_func if key in ("points", "bounding_box") else interpolate self.data[key][:] = func(mobject1.data[key], mobject2.data[key], alpha) for key in self.uniforms: if key != "fixed_orientation_center": self.uniforms[key] = interpolate( mobject1.uniforms[key], mobject2.uniforms[key], alpha, ) else: self.uniforms["fixed_orientation_center"] = tuple( interpolate( np.array(mobject1.uniforms["fixed_orientation_center"]), np.array(mobject2.uniforms["fixed_orientation_center"]), alpha, ) ) return self def pointwise_become_partial( self, mobject: OpenGLMobject, a: float, b: float ) -> Self: """ Set points in such a way as to become only part of mobject. Inputs 0 <= a < b <= 1 determine what portion of mobject to become. Returns `self` to allow method chaining. """ return self # To implement in subclass def become( self, mobject: OpenGLMobject, match_height: bool = False, match_width: bool = False, match_depth: bool = False, match_center: bool = False, stretch: bool = False, ) -> Self: """Edit all data and submobjects to be identical to another :class:`~.OpenGLMobject` .. note:: If both match_height and match_width are ``True`` then the transformed :class:`~.OpenGLMobject` will match the height first and then the width Parameters ---------- match_height If ``True``, then the transformed :class:`~.OpenGLMobject` will match the height of the original match_width If ``True``, then the transformed :class:`~.OpenGLMobject` will match the width of the original match_depth If ``True``, then the transformed :class:`~.OpenGLMobject` will match the depth of the original match_center If ``True``, then the transformed :class:`~.OpenGLMobject` will match the center of the original stretch If ``True``, then the transformed :class:`~.OpenGLMobject` will stretch to fit the proportions of the original Examples -------- .. manim:: BecomeScene class BecomeScene(Scene): def construct(self): circ = Circle(fill_color=RED, fill_opacity=0.8) square = Square(fill_color=BLUE, fill_opacity=0.2) self.add(circ) self.wait(0.5) circ.become(square) self.wait(0.5) """ if stretch: mobject.stretch_to_fit_height(self.height) mobject.stretch_to_fit_width(self.width) mobject.stretch_to_fit_depth(self.depth) else: if match_height: mobject.match_height(self) if match_width: mobject.match_width(self) if match_depth: mobject.match_depth(self) if match_center: mobject.move_to(self.get_center()) self.align_family(mobject) for sm1, sm2 in zip(self.get_family(), mobject.get_family(), strict=True): sm1.set_data(sm2.data) sm1.set_uniforms(sm2.uniforms) self.refresh_bounding_box(recurse_down=True) return self # Locking data def lock_data(self, keys: Iterable[str]) -> None: """ To speed up some animations, particularly transformations, it can be handy to acknowledge which pieces of data won't change during the animation so that calls to interpolate can skip this, and so that it's not read into the shader_wrapper objects needlessly """ if self.has_updaters: return # Be sure shader data has most up to date information self.refresh_shader_data() self.locked_data_keys = set(keys) def lock_matching_data( self, mobject1: OpenGLMobject, mobject2: OpenGLMobject ) -> Self: for sm, sm1, sm2 in zip( self.get_family(), mobject1.get_family(), mobject2.get_family(), strict=False, ): keys = sm.data.keys() & sm1.data.keys() & sm2.data.keys() sm.lock_data( list( filter( lambda key: np.all(sm1.data[key] == sm2.data[key]), keys, ), ), ) return self def unlock_data(self) -> None: for mob in self.get_family(): mob.locked_data_keys = set() # Operations touching shader uniforms @affects_shader_info_id def fix_in_frame(self) -> Self: self.is_fixed_in_frame = 1.0 return self @affects_shader_info_id def fix_orientation(self) -> Self: self.is_fixed_orientation = 1.0 self.fixed_orientation_center = tuple(self.get_center()) self.depth_test = True return self @affects_shader_info_id def unfix_from_frame(self) -> Self: self.is_fixed_in_frame = 0.0 return self @affects_shader_info_id def unfix_orientation(self) -> Self: self.is_fixed_orientation = 0.0 self.fixed_orientation_center = (0, 0, 0) self.depth_test = False return self @affects_shader_info_id def apply_depth_test(self) -> Self: self.depth_test = True return self @affects_shader_info_id def deactivate_depth_test(self) -> Self: self.depth_test = False return self # Shader code manipulation def replace_shader_code(self, old_code: str, new_code: str) -> Self: # TODO, will this work with VMobject structure, given # that it does not simpler return shader_wrappers of # family? for wrapper in self.get_shader_wrapper_list(): wrapper.replace_code(old_code, new_code) return self def set_color_by_code(self, glsl_code: str) -> Self: """ Takes a snippet of code and inserts it into a context which has the following variables: vec4 color, vec3 point, vec3 unit_normal. The code should change the color variable """ self.replace_shader_code("///// INSERT COLOR FUNCTION HERE /////", glsl_code) return self def set_color_by_xyz_func( self, glsl_snippet: str, min_value: float = -5.0, max_value: float = 5.0, colormap: str = "viridis", ) -> Self: """ Pass in a glsl expression in terms of x, y and z which returns a float. """ # TODO, add a version of this which changes the point data instead # of the shader code for char in "xyz": glsl_snippet = glsl_snippet.replace(char, "point." + char) # TODO: get_colormap_list does not exist # See https://github.com/ManimCommunity/manim/issues/4176 rgb_list = get_colormap_list(colormap) # type: ignore[name-defined] self.set_color_by_code( f"color.rgb = float_to_color({glsl_snippet}, {float(min_value)}, {float(max_value)}, {get_colormap_code(rgb_list)});", ) return self # For shader data def refresh_shader_wrapper_id(self) -> Self: self.get_shader_wrapper().refresh_id() return self def get_shader_wrapper(self) -> "ShaderWrapper": # noqa: UP037 from manim.renderer.shader_wrapper import ShaderWrapper # if hasattr(self, "shader_wrapper"): # return self.shader_wrapper self.shader_wrapper: ShaderWrapper = ShaderWrapper( vert_data=self.get_shader_data(), vert_indices=self.get_shader_vert_indices(), uniforms=self.get_shader_uniforms(), depth_test=self.depth_test, texture_paths=self.texture_paths, render_primitive=self.render_primitive, shader_folder=self.__class__.shader_folder, ) return self.shader_wrapper def get_shader_wrapper_list(self) -> Sequence["ShaderWrapper"]: # noqa: UP037 shader_wrappers = it.chain( [self.get_shader_wrapper()], *(sm.get_shader_wrapper_list() for sm in self.submobjects), ) batches = batch_by_property(shader_wrappers, lambda sw: sw.get_id()) result: list["ShaderWrapper"] = [] # noqa: UP037 for wrapper_group, _ in batches: shader_wrapper = wrapper_group[0] if not shader_wrapper.is_valid(): continue shader_wrapper.combine_with(*wrapper_group[1:]) if len(shader_wrapper.vert_data) > 0: result.append(shader_wrapper) return result def check_data_alignment(self, array: _ShaderData, data_key: str) -> Self: # Makes sure that self.data[key] can be broadcast into # the given array, meaning its length has to be either 1 # or the length of the array d_len = len(self.data[data_key]) if d_len != 1 and d_len != len(array): self.data[data_key] = resize_with_interpolation( self.data[data_key], len(array), ) return self def get_resized_shader_data_array(self, length: float) -> _ShaderData: # If possible, try to populate an existing array, rather # than recreating it each frame points = self.points shader_data = cast(_ShaderData, np.zeros(len(points), dtype=self.shader_dtype)) return shader_data def read_data_to_shader( self, shader_data: _ShaderData, # has structured data type, ex. ("point", np.float32, (3,)) shader_data_key: str, data_key: str, ) -> None: if data_key in self.locked_data_keys: return self.check_data_alignment(shader_data, data_key) shader_data[shader_data_key] = self.data[data_key] def get_shader_data(self) -> _ShaderData: shader_data = self.get_resized_shader_data_array(self.get_num_points()) self.read_data_to_shader(shader_data, "point", "points") return shader_data def refresh_shader_data(self) -> None: self.get_shader_data() def get_shader_uniforms(self) -> dict[str, Any]: return self.uniforms def get_shader_vert_indices(self) -> Sequence[int] | None: return self.shader_indices @property def submobjects(self) -> list[OpenGLMobject]: return self._submobjects if hasattr(self, "_submobjects") else [] @submobjects.setter def submobjects(self, submobject_list: Iterable[OpenGLMobject]) -> None: self.remove(*self.submobjects) self.add(*submobject_list) # Errors def throw_error_if_no_points(self) -> None: if not self.has_points(): message = ( "Cannot call OpenGLMobject.{} " + "for a OpenGLMobject with no points" ) caller_name = sys._getframe(1).f_code.co_name raise Exception(message.format(caller_name)) class OpenGLGroup(OpenGLMobject): def __init__(self, *mobjects: OpenGLMobject, **kwargs: Any) -> None: super().__init__(**kwargs) self.add(*mobjects) class OpenGLPoint(OpenGLMobject): def __init__( self, location: Point3DLike = ORIGIN, artificial_width: float = 1e-6, artificial_height: float = 1e-6, **kwargs: Any, ) -> None: self.artificial_width: float = artificial_width self.artificial_height: float = artificial_height super().__init__(**kwargs) self.set_location(location) @override def get_width(self) -> float: return self.artificial_width @override def get_height(self) -> float: return self.artificial_height def get_location(self) -> Point3D: return cast(Point3D, self.points[0]).copy() @override def get_bounding_box_point(self, *args: object, **kwargs: Any) -> Point3D: return self.get_location() def set_location(self, new_loc: Point3DLike) -> None: self.set_points(np.array(new_loc, ndmin=2, dtype=float)) class _AnimationBuilder: def __init__(self, mobject: OpenGLMobject) -> None: self.mobject: OpenGLMobject = mobject self.mobject.generate_target() self.overridden_animation: Animation | None = None self.is_chaining: bool = False self.methods: list[MethodWithArgs] = [] # Whether animation args can be passed self.cannot_pass_args: bool = False self.anim_args: dict[str, object] = {} def __call__(self, **kwargs: Any) -> Self: if self.cannot_pass_args: raise ValueError( "Animation arguments must be passed before accessing methods and can only be passed once", ) self.anim_args = kwargs self.cannot_pass_args = True return self def __getattr__(self, method_name: str) -> Callable[..., Self]: method = getattr(self.mobject.target, method_name) has_overridden_animation = hasattr(method, "_override_animate") if (self.is_chaining and has_overridden_animation) or self.overridden_animation: raise NotImplementedError( "Method chaining is currently not supported for overridden animations", ) # NOTE: using `Self` here should not be a problem, because it's equivalent to a `TypeVar` introduced in `__getattr__`. # For this reason, here it's still in scope and can be used (that's why pyright does not flag this as an error). # However, mypy currently does not seem to understand this: hence the `type: ignore` comment. def update_target(*method_args: object, **method_kwargs: object) -> Self: # type: ignore[type-var, misc] if has_overridden_animation: self.overridden_animation = cast( "Callable[..., Animation]", method._override_animate )( self.mobject, *method_args, anim_args=self.anim_args, **method_kwargs, ) else: self.methods.append(MethodWithArgs(method, method_args, method_kwargs)) method(*method_args, **method_kwargs) return self self.is_chaining = True self.cannot_pass_args = True return update_target def build(self) -> "Animation": # noqa: UP037 from manim.animation.transform import _MethodAnimation # NOTE: To fix this mypy error, we'll need to update `_MethodAnimation` to accept `Mobject | OpenGLMobject` instead of `Mobject`. # Once that is done, the `type: ignore` comment below won't be necessary anymore and mypy will emit a corresponding warning. anim = self.overridden_animation or _MethodAnimation(self.mobject, self.methods) # type: ignore[arg-type] for attr, value in self.anim_args.items(): setattr(anim, attr, value) return anim _Decorated = TypeVar("_Decorated", bound=Callable[..., "Animation"]) class _OverrideAnimateDecorator(Protocol): # The slash divider on the next line prevents a mypy error in line 3176. def __call__(self, decorated: _Decorated, /) -> _Decorated: ... def override_animate(method: types.FunctionType) -> _OverrideAnimateDecorator: r"""Decorator for overriding method animations. This allows to specify a method (returning an :class:`~.Animation`) which is called when the decorated method is used with the ``.animate`` syntax for animating the application of a method. .. seealso:: :attr:`OpenGLMobject.animate` .. note:: Overridden methods cannot be combined with normal or other overridden methods using method chaining with the ``.animate`` syntax. Examples -------- .. manim:: AnimationOverrideExample class CircleWithContent(VGroup): def __init__(self, content): super().__init__() self.circle = Circle() self.content = content self.add(self.circle, content) content.move_to(self.circle.get_center()) def clear_content(self): self.remove(self.content) self.content = None @override_animate(clear_content) def _clear_content_animation(self, anim_args=None): if anim_args is None: anim_args = {} anim = Uncreate(self.content, **anim_args) self.clear_content() return anim class AnimationOverrideExample(Scene): def construct(self): t = Text("hello!") my_mobject = CircleWithContent(t) self.play(Create(my_mobject)) self.play(my_mobject.animate.clear_content()) self.wait() """ def decorator(animation_method: _Decorated) -> _Decorated: method._override_animate = animation_method # type: ignore[attr-defined] return animation_method return decorator ManimCommunity-manim-1157b74/manim/mobject/opengl/opengl_point_cloud_mobject.py000066400000000000000000000152221515024150700300050ustar00rootroot00000000000000from __future__ import annotations __all__ = ["OpenGLPMobject", "OpenGLPGroup", "OpenGLPMPoint"] from typing import TYPE_CHECKING import moderngl import numpy as np from manim.constants import * from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.utils.bezier import interpolate from manim.utils.color import ( BLACK, PURE_YELLOW, WHITE, ParsableManimColor, color_gradient, color_to_rgba, ) from manim.utils.config_ops import _Uniforms from manim.utils.iterables import resize_with_interpolation if TYPE_CHECKING: from typing import Self from manim.typing import ( FloatRGBA_Array, FloatRGBALike_Array, Point3D_Array, Point3DLike_Array, ) __all__ = ["OpenGLPMobject", "OpenGLPGroup", "OpenGLPMPoint"] class OpenGLPMobject(OpenGLMobject): shader_folder = "true_dot" # Scale for consistency with cairo units OPENGL_POINT_RADIUS_SCALE_FACTOR = 0.01 shader_dtype = [ ("point", np.float32, (3,)), ("color", np.float32, (4,)), ] point_radius = _Uniforms() def __init__( self, stroke_width: float = 2.0, color: ParsableManimColor = PURE_YELLOW, render_primitive: int = moderngl.POINTS, **kwargs, ): self.stroke_width = stroke_width super().__init__(color=color, render_primitive=render_primitive, **kwargs) self.point_radius = ( self.stroke_width * OpenGLPMobject.OPENGL_POINT_RADIUS_SCALE_FACTOR ) def reset_points(self) -> Self: self.rgbas: FloatRGBA_Array = np.zeros((1, 4)) self.points: Point3D_Array = np.zeros((0, 3)) return self def get_array_attrs(self): return ["points", "rgbas"] def add_points( self, points: Point3DLike_Array, rgbas: FloatRGBALike_Array | None = None, color: ParsableManimColor | None = None, opacity: float | None = None, ) -> Self: """Add points. Points must be a Nx3 numpy array. Rgbas must be a Nx4 numpy array if it is not None. """ if rgbas is None and color is None: color = PURE_YELLOW self.append_points(points) # rgbas array will have been resized with points if color is not None: if opacity is None: opacity = self.rgbas[-1, 3] new_rgbas = np.repeat([color_to_rgba(color, opacity)], len(points), axis=0) elif rgbas is not None: new_rgbas = rgbas elif len(rgbas) != len(points): raise ValueError("points and rgbas must have same length") self.rgbas = np.append(self.rgbas, new_rgbas, axis=0) return self def thin_out(self, factor=5): """Removes all but every nth point for n = factor""" for mob in self.family_members_with_points(): num_points = mob.get_num_points() def thin_func(num_points=num_points): return np.arange(0, num_points, factor) if len(mob.points) == len(mob.rgbas): mob.set_rgba_array_direct(mob.rgbas[thin_func()]) mob.set_points(mob.points[thin_func()]) return self def set_color_by_gradient(self, *colors): self.rgbas = np.array( list(map(color_to_rgba, color_gradient(*colors, self.get_num_points()))), ) return self def set_colors_by_radial_gradient( self, center=None, radius=1, inner_color=WHITE, outer_color=BLACK, ): start_rgba, end_rgba = list(map(color_to_rgba, [inner_color, outer_color])) if center is None: center = self.get_center() for mob in self.family_members_with_points(): distances = np.abs(self.points - center) alphas = np.linalg.norm(distances, axis=1) / radius mob.rgbas = np.array( np.array( [interpolate(start_rgba, end_rgba, alpha) for alpha in alphas], ), ) return self def match_colors(self, pmobject): self.rgbas[:] = resize_with_interpolation(pmobject.rgbas, self.get_num_points()) return self def fade_to(self, color, alpha, family=True): rgbas = interpolate(self.rgbas, color_to_rgba(color), alpha) for mob in self.submobjects: mob.fade_to(color, alpha, family) self.set_rgba_array_direct(rgbas) return self def filter_out(self, condition): for mob in self.family_members_with_points(): to_keep = ~np.apply_along_axis(condition, 1, mob.points) for key in mob.data: mob.data[key] = mob.data[key][to_keep] return self def sort_points(self, function=lambda p: p[0]): """function is any map from R^3 to R""" for mob in self.family_members_with_points(): indices = np.argsort(np.apply_along_axis(function, 1, mob.points)) for key in mob.data: mob.data[key] = mob.data[key][indices] return self def ingest_submobjects(self): for key in self.data: self.data[key] = np.vstack([sm.data[key] for sm in self.get_family()]) return self def point_from_proportion(self, alpha): index = alpha * (self.get_num_points() - 1) return self.points[int(index)] def pointwise_become_partial(self, pmobject, a, b): lower_index = int(a * pmobject.get_num_points()) upper_index = int(b * pmobject.get_num_points()) for key in self.data: self.data[key] = pmobject.data[key][lower_index:upper_index] return self def get_shader_data(self): shader_data = np.zeros(len(self.points), dtype=self.shader_dtype) self.read_data_to_shader(shader_data, "point", "points") self.read_data_to_shader(shader_data, "color", "rgbas") return shader_data @staticmethod def get_mobject_type_class(): return OpenGLPMobject class OpenGLPGroup(OpenGLPMobject): def __init__(self, *pmobs, **kwargs): if not all(isinstance(m, OpenGLPMobject) for m in pmobs): raise Exception("All submobjects must be of type OpenglPMObject") super().__init__(**kwargs) self.add(*pmobs) def fade_to(self, color, alpha, family=True): if family: for mob in self.submobjects: mob.fade_to(color, alpha, family) class OpenGLPMPoint(OpenGLPMobject): def __init__(self, location=ORIGIN, stroke_width=4.0, **kwargs): self.location = location super().__init__(stroke_width=stroke_width, **kwargs) def init_points(self): self.points = np.array([self.location], dtype=np.float32) ManimCommunity-manim-1157b74/manim/mobject/opengl/opengl_surface.py000066400000000000000000000400441515024150700254130ustar00rootroot00000000000000from __future__ import annotations from collections.abc import Iterable from pathlib import Path from typing import TYPE_CHECKING import moderngl import numpy as np from PIL import Image from manim.constants import * from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.utils.bezier import integer_interpolate, interpolate from manim.utils.color import * from manim.utils.config_ops import _Data, _Uniforms from manim.utils.images import change_to_rgba_array, get_full_raster_image_path from manim.utils.iterables import listify from manim.utils.space_ops import normalize_along_axis if TYPE_CHECKING: import numpy.typing as npt from manim.typing import Point3D_Array, Vector3D_Array __all__ = ["OpenGLSurface", "OpenGLTexturedSurface"] class OpenGLSurface(OpenGLMobject): r"""Creates a Surface. Parameters ---------- uv_func The function that defines the surface. u_range The range of the ``u`` variable: ``(u_min, u_max)``. v_range The range of the ``v`` variable: ``(v_min, v_max)``. resolution The number of samples taken of the surface. axes Axes on which the surface is to be drawn. Optional parameter used when coloring a surface by z-value. color Color of the surface. Defaults to grey. colorscale Colors of the surface. Optional parameter used when coloring a surface by values. Passing a list of colors and an axes will color the surface by z-value. Passing a list of tuples in the form ``(color, pivot)`` allows user-defined pivots where the color transitions. colorscale_axis Defines the axis on which the colorscale is applied (0 = x, 1 = y, 2 = z), default is z-axis (2). opacity Opacity of the surface from 0 being fully transparent to 1 being fully opaque. Defaults to 1. """ shader_dtype = [ ("point", np.float32, (3,)), ("du_point", np.float32, (3,)), ("dv_point", np.float32, (3,)), ("color", np.float32, (4,)), ] shader_folder = "surface" def __init__( self, uv_func=None, u_range=None, v_range=None, # Resolution counts number of points sampled, which for # each coordinate is one more than the the number of # rows/columns of approximating squares resolution=None, axes=None, color=GREY, colorscale=None, colorscale_axis=2, opacity=1.0, gloss=0.3, shadow=0.4, prefered_creation_axis=1, # For du and dv steps. Much smaller and numerical error # can crop up in the shaders. epsilon=1e-5, render_primitive=moderngl.TRIANGLES, depth_test=True, shader_folder=None, **kwargs: Any, ): self.passed_uv_func = uv_func self.u_range = u_range if u_range is not None else (0, 1) self.v_range = v_range if v_range is not None else (0, 1) # Resolution counts number of points sampled, which for # each coordinate is one more than the the number of # rows/columns of approximating squares self.resolution = resolution if resolution is not None else (101, 101) self.axes = axes self.colorscale = colorscale self.colorscale_axis = colorscale_axis self.prefered_creation_axis = prefered_creation_axis # For du and dv steps. Much smaller and numerical error # can crop up in the shaders. self.epsilon = epsilon self.triangle_indices = None super().__init__( color=color, opacity=opacity, gloss=gloss, shadow=shadow, shader_folder=shader_folder if shader_folder is not None else "surface", render_primitive=render_primitive, depth_test=depth_test, **kwargs, ) self.compute_triangle_indices() def uv_func(self, u, v): # To be implemented in subclasses if self.passed_uv_func: return self.passed_uv_func(u, v) return (u, v, 0.0) def init_points(self): dim = self.dim nu, nv = self.resolution u_range = np.linspace(*self.u_range, nu) v_range = np.linspace(*self.v_range, nv) # Get three lists: # - Points generated by pure uv values # - Those generated by values nudged by du # - Those generated by values nudged by dv point_lists = [] for du, dv in [(0, 0), (self.epsilon, 0), (0, self.epsilon)]: uv_grid = np.array([[[u + du, v + dv] for v in v_range] for u in u_range]) point_grid = np.apply_along_axis(lambda p: self.uv_func(*p), 2, uv_grid) point_lists.append(point_grid.reshape((nu * nv, dim))) # Rather than tracking normal vectors, the points list will hold on to the # infinitesimal nudged values alongside the original values. This way, one # can perform all the manipulations they'd like to the surface, and normals # are still easily recoverable. self.set_points(np.vstack(point_lists)) def compute_triangle_indices(self): # TODO, if there is an event which changes # the resolution of the surface, make sure # this is called. nu, nv = self.resolution if nu == 0 or nv == 0: self.triangle_indices = np.zeros(0, dtype=int) return index_grid = np.arange(nu * nv).reshape((nu, nv)) indices = np.zeros(6 * (nu - 1) * (nv - 1), dtype=int) indices[0::6] = index_grid[:-1, :-1].flatten() # Top left indices[1::6] = index_grid[+1:, :-1].flatten() # Bottom left indices[2::6] = index_grid[:-1, +1:].flatten() # Top right indices[3::6] = index_grid[:-1, +1:].flatten() # Top right indices[4::6] = index_grid[+1:, :-1].flatten() # Bottom left indices[5::6] = index_grid[+1:, +1:].flatten() # Bottom right self.triangle_indices = indices def get_triangle_indices(self): return self.triangle_indices def get_surface_points_and_nudged_points( self, ) -> tuple[Point3D_Array, Point3D_Array, Point3D_Array]: points = self.points k = len(points) // 3 return points[:k], points[k : 2 * k], points[2 * k :] def get_unit_normals(self) -> Vector3D_Array: s_points, du_points, dv_points = self.get_surface_points_and_nudged_points() normals = np.cross( (du_points - s_points) / self.epsilon, (dv_points - s_points) / self.epsilon, ) return normalize_along_axis(normals, 1) def pointwise_become_partial(self, smobject, a, b, axis=None): assert isinstance(smobject, OpenGLSurface) if axis is None: axis = self.prefered_creation_axis if a <= 0 and b >= 1: self.match_points(smobject) return self nu, nv = smobject.resolution self.set_points( np.vstack( [ self.get_partial_points_array( arr.copy(), a, b, (nu, nv, 3), axis=axis, ) for arr in smobject.get_surface_points_and_nudged_points() ], ), ) return self def get_partial_points_array(self, points, a, b, resolution, axis): if len(points) == 0: return points nu, nv = resolution[:2] points = points.reshape(resolution) max_index = resolution[axis] - 1 lower_index, lower_residue = integer_interpolate(0, max_index, a) upper_index, upper_residue = integer_interpolate(0, max_index, b) if axis == 0: points[:lower_index] = interpolate( points[lower_index], points[lower_index + 1], lower_residue, ) points[upper_index + 1 :] = interpolate( points[upper_index], points[upper_index + 1], upper_residue, ) else: shape = (nu, 1, resolution[2]) points[:, :lower_index] = interpolate( points[:, lower_index], points[:, lower_index + 1], lower_residue, ).reshape(shape) points[:, upper_index + 1 :] = interpolate( points[:, upper_index], points[:, upper_index + 1], upper_residue, ).reshape(shape) return points.reshape((nu * nv, *resolution[2:])) def sort_faces_back_to_front(self, vect=OUT): tri_is = self.triangle_indices indices = list(range(len(tri_is) // 3)) points = self.points def index_dot(index): return np.dot(points[tri_is[3 * index]], vect) indices.sort(key=index_dot) for k in range(3): tri_is[k::3] = tri_is[k::3][indices] return self # For shaders def get_shader_data(self): """Called by parent Mobject to calculate and return the shader data. Returns ------- shader_dtype An array containing the shader data (vertices and color of each vertex) """ s_points, du_points, dv_points = self.get_surface_points_and_nudged_points() shader_data = np.zeros(len(s_points), dtype=self.shader_dtype) if "points" not in self.locked_data_keys: shader_data["point"] = s_points shader_data["du_point"] = du_points shader_data["dv_point"] = dv_points if self.colorscale: if not hasattr(self, "color_by_val"): self.color_by_val = self._get_color_by_value(s_points) shader_data["color"] = self.color_by_val else: self.fill_in_shader_color_info(shader_data) return shader_data def fill_in_shader_color_info(self, shader_data): """Fills in the shader color data when the surface is all one color. Parameters ---------- shader_data The vertices of the surface. Returns ------- shader_dtype An array containing the shader data (vertices and color of each vertex) """ self.read_data_to_shader(shader_data, "color", "rgbas") return shader_data def _get_color_by_value(self, s_points): """Matches each vertex to a color associated to it's z-value. Parameters ---------- s_points The vertices of the surface. Returns ------- List A list of colors matching the vertex inputs. """ if type(self.colorscale[0]) in (list, tuple): new_colors, pivots = [ [i for i, j in self.colorscale], [j for i, j in self.colorscale], ] else: new_colors = self.colorscale pivot_min = self.axes.z_range[0] pivot_max = self.axes.z_range[1] pivot_frequency = (pivot_max - pivot_min) / (len(new_colors) - 1) pivots = np.arange( start=pivot_min, stop=pivot_max + pivot_frequency, step=pivot_frequency, ) return_colors = [] for point in s_points: axis_value = self.axes.point_to_coords(point)[self.colorscale_axis] if axis_value <= pivots[0]: return_colors.append(color_to_rgba(new_colors[0], self.opacity)) elif axis_value >= pivots[-1]: return_colors.append(color_to_rgba(new_colors[-1], self.opacity)) else: for i, pivot in enumerate(pivots): if pivot > axis_value: color_index = (axis_value - pivots[i - 1]) / ( pivots[i] - pivots[i - 1] ) color_index = max(min(color_index, 1), 0) temp_color = interpolate_color( new_colors[i - 1], new_colors[i], color_index, ) break return_colors.append(color_to_rgba(temp_color, self.opacity)) return return_colors def get_shader_vert_indices(self): return self.get_triangle_indices() class OpenGLSurfaceGroup(OpenGLSurface): def __init__(self, *parametric_surfaces, resolution=None, **kwargs): self.resolution = (0, 0) if resolution is None else resolution super().__init__(uv_func=None, **kwargs) self.add(*parametric_surfaces) def init_points(self): pass # Needed? class OpenGLTexturedSurface(OpenGLSurface): shader_dtype = [ ("point", np.float32, (3,)), ("du_point", np.float32, (3,)), ("dv_point", np.float32, (3,)), ("im_coords", np.float32, (2,)), ("opacity", np.float32, (1,)), ] shader_folder = "textured_surface" im_coords = _Data() opacity = _Data() num_textures = _Uniforms() def __init__( self, uv_surface: OpenGLSurface, image_file: str | Path | npt.NDArray, dark_image_file: str | Path = None, image_mode: str | Iterable[str] = "RGBA", shader_folder: str | Path = None, **kwargs, ): self.uniforms = {} if not isinstance(uv_surface, OpenGLSurface): raise Exception("uv_surface must be of type OpenGLSurface") if isinstance(image_file, np.ndarray): image_file = change_to_rgba_array(image_file) # Set texture information if isinstance(image_mode, (str, Path)): image_mode = [image_mode] * 2 image_mode_light, image_mode_dark = image_mode texture_paths = { "LightTexture": self.get_image_from_file( image_file, image_mode_light, ), "DarkTexture": self.get_image_from_file( dark_image_file or image_file, image_mode_dark, ), } if dark_image_file: self.num_textures = 2 self.uv_surface = uv_surface self.uv_func = uv_surface.uv_func self.u_range = uv_surface.u_range self.v_range = uv_surface.v_range self.resolution = uv_surface.resolution self.gloss = self.uv_surface.gloss super().__init__(texture_paths=texture_paths, **kwargs) def get_image_from_file( self, image_file: str | Path, image_mode: str, ) -> Image.Image: image_file = get_full_raster_image_path(image_file) return Image.open(image_file).convert(image_mode) def init_data(self): super().init_data() self.im_coords = np.zeros((0, 2)) self.opacity = np.zeros((0, 1)) def init_points(self): nu, nv = self.uv_surface.resolution self.set_points(self.uv_surface.points) self.im_coords = np.array( [ [u, v] for u in np.linspace(0, 1, nu) for v in np.linspace(1, 0, nv) # Reverse y-direction ], ) def init_colors(self): self.opacity = np.array([self.uv_surface.rgbas[:, 3]]) def set_opacity(self, opacity, recurse=True): for mob in self.get_family(recurse): mob.opacity = np.array([[o] for o in listify(opacity)]) return self def pointwise_become_partial(self, tsmobject, a, b, axis=1): super().pointwise_become_partial(tsmobject, a, b, axis) im_coords = self.im_coords im_coords[:] = tsmobject.im_coords if a <= 0 and b >= 1: return self nu, nv = tsmobject.resolution im_coords[:] = self.get_partial_points_array(im_coords, a, b, (nu, nv, 2), axis) return self def fill_in_shader_color_info(self, shader_data): self.read_data_to_shader(shader_data, "opacity", "opacity") self.read_data_to_shader(shader_data, "im_coords", "im_coords") return shader_data ManimCommunity-manim-1157b74/manim/mobject/opengl/opengl_three_dimensions.py000066400000000000000000000035541515024150700273270ustar00rootroot00000000000000from __future__ import annotations from typing import Any import numpy as np from manim.mobject.opengl.opengl_surface import OpenGLSurface from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVGroup, OpenGLVMobject __all__ = ["OpenGLSurfaceMesh"] class OpenGLSurfaceMesh(OpenGLVGroup): def __init__( self, uv_surface: OpenGLSurface, resolution: tuple[int, int] | None = None, stroke_width: float = 1, normal_nudge: float = 1e-2, depth_test: bool = True, flat_stroke: bool = False, **kwargs: Any, ): if not isinstance(uv_surface, OpenGLSurface): raise Exception("uv_surface must be of type OpenGLSurface") self.uv_surface = uv_surface self.resolution = resolution if resolution is not None else (21, 21) self.normal_nudge = normal_nudge super().__init__( stroke_width=stroke_width, depth_test=depth_test, flat_stroke=flat_stroke, **kwargs, ) def init_points(self) -> None: uv_surface = self.uv_surface full_nu, full_nv = uv_surface.resolution part_nu, part_nv = self.resolution u_indices = np.linspace(0, full_nu, part_nu).astype(int) v_indices = np.linspace(0, full_nv, part_nv).astype(int) points, du_points, dv_points = uv_surface.get_surface_points_and_nudged_points() normals = uv_surface.get_unit_normals() nudged_points = points + self.normal_nudge * normals for ui in u_indices: path = OpenGLVMobject() full_ui = full_nv * ui path.set_points_smoothly(nudged_points[full_ui : full_ui + full_nv]) self.add(path) for vi in v_indices: path = OpenGLVMobject() path.set_points_smoothly(nudged_points[vi::full_nv]) self.add(path) ManimCommunity-manim-1157b74/manim/mobject/opengl/opengl_vectorized_mobject.py000066400000000000000000001757411515024150700276610ustar00rootroot00000000000000from __future__ import annotations import itertools as it import operator as op from collections.abc import Callable, Iterable, Sequence from functools import reduce, wraps from typing import Any, Self import moderngl import numpy as np from manim import config from manim.constants import * from manim.mobject.opengl.opengl_mobject import OpenGLMobject, OpenGLPoint from manim.renderer.shader_wrapper import ShaderWrapper from manim.typing import Point3D, Point3DLike, Point3DLike_Array from manim.utils.bezier import ( bezier, bezier_remap, get_quadratic_approximation_of_cubic, get_smooth_cubic_bezier_handle_points, integer_interpolate, interpolate, partial_bezier_points, proportions_along_bezier_curve_for_point, ) from manim.utils.color import BLACK, WHITE, ManimColor, ParsableManimColor from manim.utils.config_ops import _Data from manim.utils.iterables import make_even, resize_with_interpolation, tuplify from manim.utils.space_ops import ( angle_between_vectors, cross2d, earclip_triangulation, get_unit_normal, shoelace_direction, z_to_vector, ) __all__ = [ "triggers_refreshed_triangulation", "OpenGLVMobject", "OpenGLVGroup", "OpenGLVectorizedPoint", "OpenGLCurvesAsSubmobjects", "OpenGLDashedVMobject", ] def triggers_refreshed_triangulation(func): @wraps(func) def wrapper(self, *args, **kwargs): old_points = np.empty((0, 3)) for mob in self.family_members_with_points(): old_points = np.concatenate((old_points, mob.points), axis=0) func(self, *args, **kwargs) new_points = np.empty((0, 3)) for mob in self.family_members_with_points(): new_points = np.concatenate((new_points, mob.points), axis=0) if not np.array_equal(new_points, old_points): self.refresh_triangulation() self.refresh_unit_normal() return self return wrapper class OpenGLVMobject(OpenGLMobject): """A vectorized mobject.""" fill_dtype = [ ("point", np.float32, (3,)), ("unit_normal", np.float32, (3,)), ("color", np.float32, (4,)), ("vert_index", np.float32, (1,)), ] stroke_dtype = [ ("point", np.float32, (3,)), ("prev_point", np.float32, (3,)), ("next_point", np.float32, (3,)), ("unit_normal", np.float32, (3,)), ("stroke_width", np.float32, (1,)), ("color", np.float32, (4,)), ] stroke_shader_folder = "quadratic_bezier_stroke" fill_shader_folder = "quadratic_bezier_fill" # TODO: although these are called "rgba" in singular, they are used as # FloatRGBA_Arrays and should be called instead "rgbas" in plural for consistency. # The same should probably apply for "stroke_width" and "unit_normal". fill_rgba = _Data() stroke_rgba = _Data() stroke_width = _Data() unit_normal = _Data() def __init__( self, fill_color: ParsableManimColor | None = None, fill_opacity: float = 0.0, stroke_color: ParsableManimColor | None = None, stroke_opacity: float = 1.0, stroke_width: float = DEFAULT_STROKE_WIDTH, draw_stroke_behind_fill: bool = False, # Indicates that it will not be displayed, but # that it should count in parent mobject's path pre_function_handle_to_anchor_scale_factor: float = 0.01, make_smooth_after_applying_functions: float = False, background_image_file: str | None = None, # This is within a pixel # TODO, do we care about accounting for # varying zoom levels? tolerance_for_point_equality: float = 1e-8, n_points_per_curve: int = 3, long_lines: bool = False, should_subdivide_sharp_curves: bool = False, should_remove_null_curves: bool = False, # Could also be "bevel", "miter", "round" joint_type: LineJointType | None = None, flat_stroke: bool = True, render_primitive=moderngl.TRIANGLES, triangulation_locked: bool = False, **kwargs, ): self.data = {} self.fill_opacity = fill_opacity self.stroke_opacity = stroke_opacity self.stroke_width = stroke_width self.draw_stroke_behind_fill = draw_stroke_behind_fill # Indicates that it will not be displayed, but # that it should count in parent mobject's path self.pre_function_handle_to_anchor_scale_factor = ( pre_function_handle_to_anchor_scale_factor ) self.make_smooth_after_applying_functions = make_smooth_after_applying_functions self.background_image_file = background_image_file # This is within a pixel # TODO, do we care about accounting for # varying zoom levels? self.tolerance_for_point_equality = tolerance_for_point_equality self.n_points_per_curve = n_points_per_curve self.long_lines = long_lines self.should_subdivide_sharp_curves = should_subdivide_sharp_curves self.should_remove_null_curves = should_remove_null_curves if joint_type is None: joint_type = LineJointType.AUTO self.joint_type = joint_type self.flat_stroke = flat_stroke self.render_primitive = render_primitive self.triangulation_locked = triangulation_locked self.needs_new_triangulation = True self.triangulation = np.zeros(0, dtype="i4") self.orientation = 1 self.fill_data = None self.stroke_data = None self.fill_shader_wrapper = None self.stroke_shader_wrapper = None self.init_shader_data() super().__init__(**kwargs) self.refresh_unit_normal() if fill_color is not None: self.fill_color = ManimColor.parse(fill_color) if stroke_color is not None: self.stroke_color = ManimColor.parse(stroke_color) def _assert_valid_submobjects(self, submobjects: Iterable[OpenGLVMobject]) -> Self: return self._assert_valid_submobjects_internal(submobjects, OpenGLVMobject) def get_group_class(self): return OpenGLVGroup @staticmethod def get_mobject_type_class(): return OpenGLVMobject @property def submobjects(self) -> Sequence[OpenGLVMobject]: return self._submobjects if hasattr(self, "_submobjects") else [] @submobjects.setter def submobjects(self, submobject_list: Iterable[OpenGLVMobject]) -> None: self.remove(*self.submobjects) self.add(*submobject_list) def init_data(self): super().init_data() self.data.pop("rgbas") self.fill_rgba = np.zeros((1, 4)) self.stroke_rgba = np.zeros((1, 4)) self.unit_normal = np.zeros((1, 3)) # stroke_width belongs to self.data, but is defined through init_colors+set_stroke # Colors def init_colors(self): self.set_fill( color=self.fill_color or self.color, opacity=self.fill_opacity, ) self.set_stroke( color=self.stroke_color or self.color, width=self.stroke_width, opacity=self.stroke_opacity, background=self.draw_stroke_behind_fill, ) self.set_gloss(self.gloss) self.set_flat_stroke(self.flat_stroke) return self def set_fill( self, color: ParsableManimColor | None = None, opacity: float | None = None, recurse: bool = True, ) -> OpenGLVMobject: """Set the fill color and fill opacity of a :class:`OpenGLVMobject`. Parameters ---------- color Fill color of the :class:`OpenGLVMobject`. opacity Fill opacity of the :class:`OpenGLVMobject`. recurse If ``True``, the fill color of all submobjects is also set. Returns ------- OpenGLVMobject self. For chaining purposes. Examples -------- .. manim:: SetFill :save_last_frame: class SetFill(Scene): def construct(self): square = Square().scale(2).set_fill(WHITE,1) circle1 = Circle().set_fill(GREEN,0.8) circle2 = Circle().set_fill(YELLOW) # No fill_opacity circle3 = Circle().set_fill(color = '#FF2135', opacity = 0.2) group = Group(circle1,circle2,circle3).arrange() self.add(square) self.add(group) See Also -------- :meth:`~.OpenGLVMobject.set_style` """ if opacity is not None: self.fill_opacity = opacity if recurse: for submobject in self.submobjects: submobject.set_fill(color, opacity, recurse) self.set_rgba_array(color, opacity, "fill_rgba", recurse) return self def set_stroke( self, color=None, width=None, opacity=None, background=None, recurse=True, ): if opacity is not None: self.stroke_opacity = opacity if recurse: for submobject in self.submobjects: submobject.set_stroke( color=color, width=width, opacity=opacity, background=background, recurse=recurse, ) self.set_rgba_array(color, opacity, "stroke_rgba", recurse) if width is not None: for mob in self.get_family(recurse): if isinstance(width, np.ndarray): mob.stroke_width = width else: mob.stroke_width = np.array([[width] for width in tuplify(width)]) if background is not None: for mob in self.get_family(recurse): mob.draw_stroke_behind_fill = background return self def set_style( self, fill_color=None, fill_opacity=None, fill_rgba=None, stroke_color=None, stroke_opacity=None, stroke_rgba=None, stroke_width=None, gloss=None, shadow=None, recurse=True, ): if fill_rgba is not None: self.fill_rgba = resize_with_interpolation(fill_rgba, len(fill_rgba)) else: self.set_fill(color=fill_color, opacity=fill_opacity, recurse=recurse) if stroke_rgba is not None: self.stroke_rgba = resize_with_interpolation(stroke_rgba, len(fill_rgba)) self.set_stroke(width=stroke_width) else: self.set_stroke( color=stroke_color, width=stroke_width, opacity=stroke_opacity, recurse=recurse, ) if gloss is not None: self.set_gloss(gloss, recurse=recurse) if shadow is not None: self.set_shadow(shadow, recurse=recurse) return self def get_style(self): return { "fill_rgba": self.fill_rgba, "stroke_rgba": self.stroke_rgba, "stroke_width": self.stroke_width, "gloss": self.gloss, "shadow": self.shadow, } def match_style(self, vmobject, recurse=True): vmobject_style = vmobject.get_style() if config.renderer == RendererType.OPENGL: vmobject_style["stroke_width"] = vmobject_style["stroke_width"][0][0] vmobject_style["fill_opacity"] = self.get_fill_opacity() self.set_style(**vmobject_style, recurse=False) if recurse: # Does its best to match up submobject lists, and # match styles accordingly submobs1, submobs2 = self.submobjects, vmobject.submobjects if len(submobs1) == 0: return self elif len(submobs2) == 0: submobs2 = [vmobject] for sm1, sm2 in zip(*make_even(submobs1, submobs2), strict=True): sm1.match_style(sm2) return self def set_color(self, color, opacity=None, recurse=True): if opacity is not None: self.opacity = opacity self.set_fill(color, opacity=opacity, recurse=recurse) self.set_stroke(color, opacity=opacity, recurse=recurse) return self def set_opacity(self, opacity, recurse=True): self.set_fill(opacity=opacity, recurse=recurse) self.set_stroke(opacity=opacity, recurse=recurse) return self def fade(self, darkness=0.5, recurse=True): factor = 1.0 - darkness self.set_fill( opacity=factor * self.get_fill_opacity(), recurse=False, ) self.set_stroke( opacity=factor * self.get_stroke_opacity(), recurse=False, ) super().fade(darkness, recurse) return self # Todo im not quite sure why we are doing this def get_fill_colors(self): return [ManimColor.from_rgb(rgba[:3]) for rgba in self.fill_rgba] def get_fill_opacities(self): return self.fill_rgba[:, 3] def get_stroke_colors(self): return [ManimColor.from_rgb(rgba[:3]) for rgba in self.stroke_rgba] def get_stroke_opacities(self): return self.stroke_rgba[:, 3] def get_stroke_widths(self): return self.stroke_width # TODO, it's weird for these to return the first of various lists # rather than the full information def get_fill_color(self): """ If there are multiple colors (for gradient) this returns the first one """ return self.get_fill_colors()[0] def get_fill_opacity(self): """ If there are multiple opacities, this returns the first """ return self.get_fill_opacities()[0] def get_stroke_color(self): return self.get_stroke_colors()[0] def get_stroke_width(self): return self.get_stroke_widths()[0] def get_stroke_opacity(self): return self.get_stroke_opacities()[0] def get_color(self): if not self.has_fill(): return self.get_stroke_color() return self.get_fill_color() def get_colors(self): if self.has_stroke(): return self.get_stroke_colors() return self.get_fill_colors() stroke_color = property(get_stroke_color, set_stroke) color = property(get_color, set_color) fill_color = property(get_fill_color, set_fill) def has_stroke(self): stroke_widths = self.get_stroke_widths() stroke_opacities = self.get_stroke_opacities() return ( stroke_widths is not None and stroke_opacities is not None and any(stroke_widths) and any(stroke_opacities) ) def has_fill(self): fill_opacities = self.get_fill_opacities() return fill_opacities is not None and any(fill_opacities) def get_opacity(self): if self.has_fill(): return self.get_fill_opacity() return self.get_stroke_opacity() def set_flat_stroke(self, flat_stroke=True, recurse=True): for mob in self.get_family(recurse): mob.flat_stroke = flat_stroke return self def get_flat_stroke(self): return self.flat_stroke # Points def set_anchors_and_handles(self, anchors1, handles, anchors2): assert len(anchors1) == len(handles) == len(anchors2) nppc = self.n_points_per_curve new_points = np.zeros((nppc * len(anchors1), self.dim)) arrays = [anchors1, handles, anchors2] for index, array in enumerate(arrays): new_points[index::nppc] = array self.set_points(new_points) return self def start_new_path(self, point): assert self.get_num_points() % self.n_points_per_curve == 0 self.append_points([point]) return self def add_cubic_bezier_curve( self, anchor1: Point3DLike, handle1: Point3DLike, handle2: Point3DLike, anchor2: Point3DLike, ): new_points = get_quadratic_approximation_of_cubic( anchor1, handle1, handle2, anchor2, ) self.append_points(new_points) def add_cubic_bezier_curve_to(self, handle1, handle2, anchor): """Add cubic bezier curve to the path.""" self.throw_error_if_no_points() quadratic_approx = get_quadratic_approximation_of_cubic( self.get_last_point(), handle1, handle2, anchor, ) if self.has_new_path_started(): self.append_points(quadratic_approx[1:]) else: self.append_points(quadratic_approx) def add_quadratic_bezier_curve_to(self, handle, anchor): self.throw_error_if_no_points() if self.has_new_path_started(): self.append_points([handle, anchor]) else: self.append_points([self.get_last_point(), handle, anchor]) def add_line_to(self, point: Sequence[float]) -> OpenGLVMobject: """Add a straight line from the last point of OpenGLVMobject to the given point. Parameters ---------- point end of the straight line. """ end = self.points[-1] alphas = np.linspace(0, 1, self.n_points_per_curve) if self.long_lines: halfway = interpolate(end, point, 0.5) points = [interpolate(end, halfway, a) for a in alphas] + [ interpolate(halfway, point, a) for a in alphas ] else: points = [interpolate(end, point, a) for a in alphas] if self.has_new_path_started(): points = points[1:] self.append_points(points) return self def add_smooth_curve_to(self, point): if self.has_new_path_started(): self.add_line_to(point) else: self.throw_error_if_no_points() new_handle = self.get_reflection_of_last_handle() self.add_quadratic_bezier_curve_to(new_handle, point) return self def add_smooth_cubic_curve_to(self, handle, point): self.throw_error_if_no_points() new_handle = self.get_reflection_of_last_handle() self.add_cubic_bezier_curve_to(new_handle, handle, point) def has_new_path_started(self): return self.get_num_points() % self.n_points_per_curve == 1 def get_last_point(self): return self.points[-1] def get_reflection_of_last_handle(self): points = self.points return 2 * points[-1] - points[-2] def close_path(self): if not self.is_closed(): self.add_line_to(self.get_subpaths()[-1][0]) def is_closed(self): return self.consider_points_equals(self.points[0], self.points[-1]) def subdivide_sharp_curves(self, angle_threshold=30 * DEGREES, recurse=True): vmobs = [vm for vm in self.get_family(recurse) if vm.has_points()] for vmob in vmobs: new_points = [] for tup in vmob.get_bezier_tuples(): angle = angle_between_vectors(tup[1] - tup[0], tup[2] - tup[1]) if angle > angle_threshold: n = int(np.ceil(angle / angle_threshold)) alphas = np.linspace(0, 1, n + 1) new_points.extend( [ partial_bezier_points(tup, a1, a2) for a1, a2 in zip(alphas[:-1], alphas[1:], strict=True) ], ) else: new_points.append(tup) vmob.set_points(np.vstack(new_points)) return self def add_points_as_corners(self, points): for point in points: self.add_line_to(point) return points def set_points_as_corners(self, points: Point3DLike_Array) -> OpenGLVMobject: """Given an array of points, set them as corner of the vmobject. To achieve that, this algorithm sets handles aligned with the anchors such that the resultant bezier curve will be the segment between the two anchors. Parameters ---------- points Array of points that will be set as corners. Returns ------- OpenGLVMobject self. For chaining purposes. """ nppc = self.n_points_per_curve points = np.array(points) self.set_anchors_and_handles( *(interpolate(points[:-1], points[1:], a) for a in np.linspace(0, 1, nppc)) ) return self def set_points_smoothly( self, points: Point3DLike_Array, true_smooth: bool = False ) -> Self: self.set_points_as_corners(points) self.make_smooth() return self def change_anchor_mode(self, mode): """Changes the anchor mode of the bezier curves. This will modify the handles. There can be only three modes, "jagged", "approx_smooth" and "true_smooth". Returns ------- OpenGLVMobject For chaining purposes. """ assert mode in ("jagged", "approx_smooth", "true_smooth") nppc = self.n_points_per_curve for submob in self.family_members_with_points(): subpaths = submob.get_subpaths() submob.clear_points() for subpath in subpaths: anchors = np.vstack([subpath[::nppc], subpath[-1:]]) new_subpath = np.array(subpath) if mode == "approx_smooth": # TODO: get_smooth_quadratic_bezier_handle_points is not defined new_subpath[1::nppc] = get_smooth_quadratic_bezier_handle_points( anchors, ) elif mode == "true_smooth": h1, h2 = get_smooth_cubic_bezier_handle_points(anchors) new_subpath = get_quadratic_approximation_of_cubic( anchors[:-1], h1, h2, anchors[1:], ) elif mode == "jagged": new_subpath[1::nppc] = 0.5 * (anchors[:-1] + anchors[1:]) submob.append_points(new_subpath) submob.refresh_triangulation() return self def make_smooth(self): """ This will double the number of points in the mobject, so should not be called repeatedly. It also means transforming between states before and after calling this might have strange artifacts """ self.change_anchor_mode("true_smooth") return self def make_approximately_smooth(self): """ Unlike make_smooth, this will not change the number of points, but it also does not result in a perfectly smooth curve. It's most useful when the points have been sampled at a not-too-low rate from a continuous function, as in the case of ParametricCurve """ self.change_anchor_mode("approx_smooth") return self def make_jagged(self): self.change_anchor_mode("jagged") return self def add_subpath(self, points): assert len(points) % self.n_points_per_curve == 0 self.append_points(points) return self def append_vectorized_mobject(self, vectorized_mobject): new_points = list(vectorized_mobject.points) if self.has_new_path_started(): # Remove last point, which is starting # a new path self.resize_data(len(self.points - 1)) self.append_points(new_points) return self # def consider_points_equals(self, p0, p1): return np.linalg.norm(p1 - p0) < self.tolerance_for_point_equality # Information about the curve def force_direction(self, target_direction: str): """Makes sure that points are either directed clockwise or counterclockwise. Parameters ---------- target_direction Either ``"CW"`` or ``"CCW"``. """ if target_direction not in ("CW", "CCW"): raise ValueError('Invalid input for force_direction. Use "CW" or "CCW"') if self.get_direction() != target_direction: self.reverse_points() return self def reverse_direction(self): """Reverts the point direction by inverting the point order. Returns ------- :class:`OpenGLVMobject` Returns self. Examples -------- .. manim:: ChangeOfDirection class ChangeOfDirection(Scene): def construct(self): ccw = RegularPolygon(5) ccw.shift(LEFT) cw = RegularPolygon(5) cw.shift(RIGHT).reverse_direction() self.play(Create(ccw), Create(cw), run_time=4) """ self.set_points(self.points[::-1]) return self def get_bezier_tuples_from_points(self, points): nppc = self.n_points_per_curve remainder = len(points) % nppc points = points[: len(points) - remainder] return points.reshape((-1, nppc, 3)) def get_bezier_tuples(self): return self.get_bezier_tuples_from_points(self.points) def get_subpaths_from_points(self, points): nppc = self.n_points_per_curve diffs = points[nppc - 1 : -1 : nppc] - points[nppc::nppc] splits = (diffs * diffs).sum(1) > self.tolerance_for_point_equality split_indices = np.arange(nppc, len(points), nppc, dtype=int)[splits] # split_indices = filter( # lambda n: not self.consider_points_equals(points[n - 1], points[n]), # range(nppc, len(points), nppc) # ) split_indices = [0, *split_indices, len(points)] return [ points[i1:i2] for i1, i2 in zip(split_indices[:-1], split_indices[1:], strict=True) if (i2 - i1) >= nppc ] def get_subpaths(self): """Returns subpaths formed by the curves of the OpenGLVMobject. Subpaths are ranges of curves with each pair of consecutive curves having their end/start points coincident. Returns ------- Tuple subpaths. """ return self.get_subpaths_from_points(self.points) def get_nth_curve_points(self, n: int) -> np.ndarray: """Returns the points defining the nth curve of the vmobject. Parameters ---------- n index of the desired bezier curve. Returns ------- np.ndarray points defininf the nth bezier curve (anchors, handles) """ assert n < self.get_num_curves() nppc = self.n_points_per_curve return self.points[nppc * n : nppc * (n + 1)] def get_nth_curve_function(self, n: int) -> Callable[[float], np.ndarray]: """Returns the expression of the nth curve. Parameters ---------- n index of the desired curve. Returns ------- typing.Callable[float] expression of the nth bezier curve. """ return bezier(self.get_nth_curve_points(n)) def get_nth_curve_function_with_length( self, n: int, sample_points: int | None = None, ) -> tuple[Callable[[float], np.ndarray], float]: """Returns the expression of the nth curve along with its (approximate) length. Parameters ---------- n The index of the desired curve. sample_points The number of points to sample to find the length. Returns ------- curve : Callable[[float], np.ndarray] The function for the nth curve. length : :class:`float` The length of the nth curve. """ if sample_points is None: sample_points = 10 curve = self.get_nth_curve_function(n) norms = self.get_nth_curve_length_pieces(n, sample_points) length = np.sum(norms) return curve, length def get_num_curves(self) -> int: """Returns the number of curves of the vmobject. Returns ------- int number of curves. of the vmobject. """ return self.get_num_points() // self.n_points_per_curve def get_nth_curve_length( self, n: int, sample_points: int | None = None, ) -> float: """Returns the (approximate) length of the nth curve. Parameters ---------- n The index of the desired curve. sample_points The number of points to sample to find the length. Returns ------- length : :class:`float` The length of the nth curve. """ _, length = self.get_nth_curve_function_with_length(n, sample_points) return length def get_curve_functions( self, ) -> Iterable[Callable[[float], np.ndarray]]: """Gets the functions for the curves of the mobject. Returns ------- Iterable[Callable[[float], np.ndarray]] The functions for the curves. """ num_curves = self.get_num_curves() for n in range(num_curves): yield self.get_nth_curve_function(n) def get_nth_curve_length_pieces( self, n: int, sample_points: int | None = None, ) -> np.ndarray: """Returns the array of short line lengths used for length approximation. Parameters ---------- n The index of the desired curve. sample_points The number of points to sample to find the length. Returns ------- np.ndarray The short length-pieces of the nth curve. """ if sample_points is None: sample_points = 10 curve = self.get_nth_curve_function(n) points = np.array([curve(a) for a in np.linspace(0, 1, sample_points)]) diffs = points[1:] - points[:-1] norms = np.apply_along_axis(np.linalg.norm, 1, diffs) return norms def get_curve_functions_with_lengths( self, **kwargs ) -> Iterable[tuple[Callable[[float], np.ndarray], float]]: """Gets the functions and lengths of the curves for the mobject. Parameters ---------- **kwargs The keyword arguments passed to :meth:`get_nth_curve_function_with_length` Returns ------- Iterable[Tuple[Callable[[float], np.ndarray], float]] The functions and lengths of the curves. """ num_curves = self.get_num_curves() for n in range(num_curves): yield self.get_nth_curve_function_with_length(n, **kwargs) def point_from_proportion(self, alpha: float) -> Point3D: """Gets the point at a proportion along the path of the :class:`OpenGLVMobject`. Parameters ---------- alpha The proportion along the the path of the :class:`OpenGLVMobject`. Returns ------- :class:`Point3D` The point on the :class:`OpenGLVMobject`. Raises ------ :exc:`ValueError` If ``alpha`` is not between 0 and 1. :exc:`Exception` If the :class:`OpenGLVMobject` has no points. """ if alpha < 0 or alpha > 1: raise ValueError(f"Alpha {alpha} not between 0 and 1.") self.throw_error_if_no_points() if alpha == 1: return self.points[-1] curves_and_lengths = tuple(self.get_curve_functions_with_lengths()) target_length = alpha * np.sum( np.fromiter((length for _, length in curves_and_lengths), dtype=np.float64) ) current_length = 0 for curve, length in curves_and_lengths: if current_length + length >= target_length: if length != 0: residue = (target_length - current_length) / length else: residue = 0 return curve(residue) current_length += length def proportion_from_point( self, point: Point3DLike, ) -> float: """Returns the proportion along the path of the :class:`OpenGLVMobject` a particular given point is at. Parameters ---------- point The Cartesian coordinates of the point which may or may not lie on the :class:`OpenGLVMobject` Returns ------- float The proportion along the path of the :class:`OpenGLVMobject`. Raises ------ :exc:`ValueError` If ``point`` does not lie on the curve. :exc:`Exception` If the :class:`OpenGLVMobject` has no points. """ self.throw_error_if_no_points() # Iterate over each bezier curve that the ``VMobject`` is composed of, checking # if the point lies on that curve. If it does not lie on that curve, add # the whole length of the curve to ``target_length`` and move onto the next # curve. If the point does lie on the curve, add how far along the curve # the point is to ``target_length``. # Then, divide ``target_length`` by the total arc length of the shape to get # the proportion along the ``VMobject`` the point is at. num_curves = self.get_num_curves() total_length = self.get_arc_length() target_length = 0 for n in range(num_curves): control_points = self.get_nth_curve_points(n) length = self.get_nth_curve_length(n) proportions_along_bezier = proportions_along_bezier_curve_for_point( point, control_points, ) if len(proportions_along_bezier) > 0: proportion_along_nth_curve = max(proportions_along_bezier) target_length += length * proportion_along_nth_curve break target_length += length else: raise ValueError(f"Point {point} does not lie on this curve.") alpha = target_length / total_length return alpha def get_anchors_and_handles(self) -> Iterable[np.ndarray]: """ Returns anchors1, handles, anchors2, where (anchors1[i], handles[i], anchors2[i]) will be three points defining a quadratic bezier curve for any i in range(0, len(anchors1)) """ nppc = self.n_points_per_curve points = self.points return [points[i::nppc] for i in range(nppc)] def get_start_anchors(self) -> np.ndarray: """Returns the start anchors of the bezier curves. Returns ------- np.ndarray Starting anchors """ return self.points[0 :: self.n_points_per_curve] def get_end_anchors(self) -> np.ndarray: """Return the starting anchors of the bezier curves. Returns ------- np.ndarray Starting anchors """ nppc = self.n_points_per_curve return self.points[nppc - 1 :: nppc] def get_anchors(self) -> Iterable[np.ndarray]: """Returns the anchors of the curves forming the OpenGLVMobject. Returns ------- Iterable[np.ndarray] The anchors. """ points = self.points if len(points) == 1: return points s = self.get_start_anchors() e = self.get_end_anchors() return list(it.chain.from_iterable(zip(s, e, strict=True))) def get_points_without_null_curves(self, atol=1e-9): nppc = self.n_points_per_curve points = self.points distinct_curves = reduce( op.or_, [ (abs(points[i::nppc] - points[0::nppc]) > atol).any(1) for i in range(1, nppc) ], ) return points[distinct_curves.repeat(nppc)] def get_arc_length(self, sample_points_per_curve: int | None = None) -> float: """Return the approximated length of the whole curve. Parameters ---------- sample_points_per_curve Number of sample points per curve used to approximate the length. More points result in a better approximation. Returns ------- float The length of the :class:`OpenGLVMobject`. """ return np.sum( length for _, length in self.get_curve_functions_with_lengths( sample_points=sample_points_per_curve, ) ) def get_area_vector(self): # Returns a vector whose length is the area bound by # the polygon formed by the anchor points, pointing # in a direction perpendicular to the polygon according # to the right hand rule. if not self.has_points(): return np.zeros(3) nppc = self.n_points_per_curve points = self.points p0 = points[0::nppc] p1 = points[nppc - 1 :: nppc] # Each term goes through all edges [(x1, y1, z1), (x2, y2, z2)] return 0.5 * np.array( [ sum( (p0[:, 1] + p1[:, 1]) * (p1[:, 2] - p0[:, 2]), ), # Add up (y1 + y2)*(z2 - z1) sum( (p0[:, 2] + p1[:, 2]) * (p1[:, 0] - p0[:, 0]), ), # Add up (z1 + z2)*(x2 - x1) sum( (p0[:, 0] + p1[:, 0]) * (p1[:, 1] - p0[:, 1]), ), # Add up (x1 + x2)*(y2 - y1) ], ) def get_direction(self): """Uses :func:`~.space_ops.shoelace_direction` to calculate the direction. The direction of points determines in which direction the object is drawn, clockwise or counterclockwise. Examples -------- The default direction of a :class:`~.Circle` is counterclockwise:: >>> from manim import Circle >>> Circle().get_direction() 'CCW' Returns ------- :class:`str` Either ``"CW"`` or ``"CCW"``. """ return shoelace_direction(self.get_start_anchors()) def get_unit_normal(self, recompute=False): if not recompute: return self.unit_normal[0] if len(self.points) < 3: return OUT area_vect = self.get_area_vector() area = np.linalg.norm(area_vect) if area > 0: return area_vect / area else: points = self.points return get_unit_normal( points[1] - points[0], points[2] - points[1], ) def refresh_unit_normal(self): for mob in self.get_family(): mob.unit_normal[:] = mob.get_unit_normal(recompute=True) return self # Alignment def align_points(self, vmobject): # TODO: This shortcut can be a bit over eager. What if they have the same length, but different subpath lengths? if self.get_num_points() == len(vmobject.points): return for mob in self, vmobject: # If there are no points, add one to # where the "center" is if not mob.has_points(): mob.start_new_path(mob.get_center()) # If there's only one point, turn it into # a null curve if mob.has_new_path_started(): mob.add_line_to(mob.points[0]) # Figure out what the subpaths are, and align subpaths1 = self.get_subpaths() subpaths2 = vmobject.get_subpaths() n_subpaths = max(len(subpaths1), len(subpaths2)) # Start building new ones new_subpaths1 = [] new_subpaths2 = [] nppc = self.n_points_per_curve def get_nth_subpath(path_list, n): if n >= len(path_list): # Create a null path at the very end return [path_list[-1][-1]] * nppc path = path_list[n] # Check for useless points at the end of the path and remove them # https://github.com/ManimCommunity/manim/issues/1959 while len(path) > nppc: # If the last nppc points are all equal to the preceding point if self.consider_points_equals(path[-nppc:], path[-nppc - 1]): path = path[:-nppc] else: break return path for n in range(n_subpaths): sp1 = np.asarray(get_nth_subpath(subpaths1, n)) sp2 = np.asarray(get_nth_subpath(subpaths2, n)) diff1 = max(0, (len(sp2) - len(sp1)) // nppc) diff2 = max(0, (len(sp1) - len(sp2)) // nppc) sp1 = self.insert_n_curves_to_point_list(diff1, sp1) sp2 = self.insert_n_curves_to_point_list(diff2, sp2) new_subpaths1.append(sp1) new_subpaths2.append(sp2) self.set_points(np.vstack(new_subpaths1)) vmobject.set_points(np.vstack(new_subpaths2)) return self def insert_n_curves(self, n: int, recurse=True) -> OpenGLVMobject: """Inserts n curves to the bezier curves of the vmobject. Parameters ---------- n Number of curves to insert. Returns ------- OpenGLVMobject for chaining. """ for mob in self.get_family(recurse): if mob.get_num_curves() > 0: new_points = mob.insert_n_curves_to_point_list(n, mob.points) # TODO, this should happen in insert_n_curves_to_point_list if mob.has_new_path_started(): new_points = np.vstack([new_points, mob.get_last_point()]) mob.set_points(new_points) return self def insert_n_curves_to_point_list(self, n: int, points: np.ndarray) -> np.ndarray: """Given an array of k points defining a bezier curves (anchors and handles), returns points defining exactly k + n bezier curves. Parameters ---------- n Number of desired curves. points Starting points. Returns ------- np.ndarray Points generated. """ nppc = self.n_points_per_curve if len(points) == 1: return np.repeat(points, nppc * n, 0) bezier_tuples = self.get_bezier_tuples_from_points(points) current_number_of_curves = len(bezier_tuples) new_number_of_curves = current_number_of_curves + n new_bezier_tuples = bezier_remap(bezier_tuples, new_number_of_curves) new_points = new_bezier_tuples.reshape(-1, 3) return new_points def interpolate(self, mobject1, mobject2, alpha, *args, **kwargs): super().interpolate(mobject1, mobject2, alpha, *args, **kwargs) if config["use_projection_fill_shaders"]: self.refresh_triangulation() else: if self.has_fill(): tri1 = mobject1.get_triangulation() tri2 = mobject2.get_triangulation() if len(tri1) != len(tri2) or not np.all(tri1 == tri2): self.refresh_triangulation() return self def pointwise_become_partial( self, vmobject: OpenGLVMobject, a: float, b: float, remap: bool = True ) -> OpenGLVMobject: """Given two bounds a and b, transforms the points of the self vmobject into the points of the vmobject passed as parameter with respect to the bounds. Points here stand for control points of the bezier curves (anchors and handles) Parameters ---------- vmobject The vmobject that will serve as a model. a upper-bound. b lower-bound remap if the point amount should be kept the same (True) This option should be manually set to False if keeping the number of points is not needed """ assert isinstance(vmobject, OpenGLVMobject) # Partial curve includes three portions: # - A middle section, which matches the curve exactly # - A start, which is some ending portion of an inner cubic # - An end, which is the starting portion of a later inner cubic if a <= 0 and b >= 1: self.set_points(vmobject.points) return self bezier_triplets = vmobject.get_bezier_tuples() num_quadratics = len(bezier_triplets) # The following two lines will compute which bezier curves of the given mobject need to be processed. # The residue basically indicates the proportion of the selected Bรจzier curve. # Ex: if lower_index is 3, and lower_residue is 0.4, then the algorithm will append to the points 0.4 of the third bezier curve lower_index, lower_residue = integer_interpolate(0, num_quadratics, a) upper_index, upper_residue = integer_interpolate(0, num_quadratics, b) self.clear_points() if num_quadratics == 0: return self if lower_index == upper_index: self.append_points( partial_bezier_points( bezier_triplets[lower_index], lower_residue, upper_residue, ), ) else: self.append_points( partial_bezier_points(bezier_triplets[lower_index], lower_residue, 1), ) inner_points = bezier_triplets[lower_index + 1 : upper_index] if len(inner_points) > 0: if remap: new_triplets = bezier_remap(inner_points, num_quadratics - 2) else: new_triplets = bezier_triplets self.append_points(np.asarray(new_triplets).reshape(-1, 3)) self.append_points( partial_bezier_points(bezier_triplets[upper_index], 0, upper_residue), ) return self def get_subcurve(self, a: float, b: float) -> OpenGLVMobject: """Returns the subcurve of the OpenGLVMobject between the interval [a, b]. The curve is a OpenGLVMobject itself. Parameters ---------- a The lower bound. b The upper bound. Returns ------- OpenGLVMobject The subcurve between of [a, b] """ vmob = self.copy() vmob.pointwise_become_partial(self, a, b) return vmob # Related to triangulation def refresh_triangulation(self) -> Self: for mob in self.get_family(): mob.needs_new_triangulation = True return self def get_triangulation(self, normal_vector=None): # Figure out how to triangulate the interior to know # how to send the points as to the vertex shader. # First triangles come directly from the points if normal_vector is None: normal_vector = self.get_unit_normal() if not self.needs_new_triangulation: return self.triangulation points = self.points if len(points) <= 1: self.triangulation = np.zeros(0, dtype="i4") self.needs_new_triangulation = False return self.triangulation if not np.isclose(normal_vector, OUT).all(): # Rotate points such that unit normal vector is OUT points = np.dot(points, z_to_vector(normal_vector)) indices = np.arange(len(points), dtype=int) b0s = points[0::3] b1s = points[1::3] b2s = points[2::3] v01s = b1s - b0s v12s = b2s - b1s crosses = cross2d(v01s, v12s) convexities = np.sign(crosses) atol = self.tolerance_for_point_equality end_of_loop = np.zeros(len(b0s), dtype=bool) end_of_loop[:-1] = (np.abs(b2s[:-1] - b0s[1:]) > atol).any(1) end_of_loop[-1] = True concave_parts = convexities < 0 # These are the vertices to which we'll apply a polygon triangulation inner_vert_indices = np.hstack( [ indices[0::3], indices[1::3][concave_parts], indices[2::3][end_of_loop], ], ) inner_vert_indices.sort() rings = np.arange(1, len(inner_vert_indices) + 1)[inner_vert_indices % 3 == 2] # Triangulate inner_verts = points[inner_vert_indices] inner_tri_indices = inner_vert_indices[ earclip_triangulation(inner_verts, rings) ] tri_indices = np.hstack([indices, inner_tri_indices]) self.triangulation = tri_indices self.needs_new_triangulation = False return tri_indices @triggers_refreshed_triangulation def set_points(self, points): super().set_points(points) return self @triggers_refreshed_triangulation def set_data(self, data): super().set_data(data) return self # TODO, how to be smart about tangents here? @triggers_refreshed_triangulation def apply_function(self, function, make_smooth=False, **kwargs): super().apply_function(function, **kwargs) if self.make_smooth_after_applying_functions or make_smooth: self.make_approximately_smooth() return self @triggers_refreshed_triangulation def apply_points_function(self, *args, **kwargs): super().apply_points_function(*args, **kwargs) return self @triggers_refreshed_triangulation def flip(self, *args, **kwargs): super().flip(*args, **kwargs) return self # For shaders def init_shader_data(self): self.fill_data = np.zeros(0, dtype=self.fill_dtype) self.stroke_data = np.zeros(0, dtype=self.stroke_dtype) self.fill_shader_wrapper = ShaderWrapper( vert_data=self.fill_data, vert_indices=np.zeros(0, dtype="i4"), shader_folder=self.fill_shader_folder, render_primitive=self.render_primitive, ) self.stroke_shader_wrapper = ShaderWrapper( vert_data=self.stroke_data, shader_folder=self.stroke_shader_folder, render_primitive=self.render_primitive, ) def refresh_shader_wrapper_id(self): for wrapper in [self.fill_shader_wrapper, self.stroke_shader_wrapper]: wrapper.refresh_id() return self def get_fill_shader_wrapper(self): self.update_fill_shader_wrapper() return self.fill_shader_wrapper def update_fill_shader_wrapper(self): self.fill_shader_wrapper.vert_data = self.get_fill_shader_data() self.fill_shader_wrapper.vert_indices = self.get_triangulation() self.fill_shader_wrapper.uniforms = self.get_fill_uniforms() self.fill_shader_wrapper.depth_test = self.depth_test def get_stroke_shader_wrapper(self): self.update_stroke_shader_wrapper() return self.stroke_shader_wrapper def update_stroke_shader_wrapper(self): self.stroke_shader_wrapper.vert_data = self.get_stroke_shader_data() self.stroke_shader_wrapper.uniforms = self.get_stroke_uniforms() self.stroke_shader_wrapper.depth_test = self.depth_test def get_shader_wrapper_list(self): # Build up data lists fill_shader_wrappers = [] stroke_shader_wrappers = [] back_stroke_shader_wrappers = [] for submob in self.family_members_with_points(): if submob.has_fill() and not config["use_projection_fill_shaders"]: fill_shader_wrappers.append(submob.get_fill_shader_wrapper()) if submob.has_stroke() and not config["use_projection_stroke_shaders"]: ssw = submob.get_stroke_shader_wrapper() if submob.draw_stroke_behind_fill: back_stroke_shader_wrappers.append(ssw) else: stroke_shader_wrappers.append(ssw) # Combine data lists wrapper_lists = [ back_stroke_shader_wrappers, fill_shader_wrappers, stroke_shader_wrappers, ] result = [] for wlist in wrapper_lists: if wlist: wrapper = wlist[0] wrapper.combine_with(*wlist[1:]) result.append(wrapper) return result def get_stroke_uniforms(self): result = dict(super().get_shader_uniforms()) result["joint_type"] = self.joint_type.value result["flat_stroke"] = float(self.flat_stroke) return result def get_fill_uniforms(self): return { "is_fixed_in_frame": float(self.is_fixed_in_frame), "is_fixed_orientation": float(self.is_fixed_orientation), "fixed_orientation_center": self.fixed_orientation_center, "gloss": self.gloss, "shadow": self.shadow, } def get_stroke_shader_data(self): points = self.points if len(self.stroke_data) != len(points): self.stroke_data = np.zeros(len(points), dtype=OpenGLVMobject.stroke_dtype) if "points" not in self.locked_data_keys: nppc = self.n_points_per_curve self.stroke_data["point"] = points self.stroke_data["prev_point"][:nppc] = points[-nppc:] self.stroke_data["prev_point"][nppc:] = points[:-nppc] self.stroke_data["next_point"][:-nppc] = points[nppc:] self.stroke_data["next_point"][-nppc:] = points[:nppc] self.read_data_to_shader(self.stroke_data, "color", "stroke_rgba") self.read_data_to_shader(self.stroke_data, "stroke_width", "stroke_width") self.read_data_to_shader(self.stroke_data, "unit_normal", "unit_normal") return self.stroke_data def get_fill_shader_data(self): points = self.points if len(self.fill_data) != len(points): self.fill_data = np.zeros(len(points), dtype=OpenGLVMobject.fill_dtype) self.fill_data["vert_index"][:, 0] = range(len(points)) self.read_data_to_shader(self.fill_data, "point", "points") self.read_data_to_shader(self.fill_data, "color", "fill_rgba") self.read_data_to_shader(self.fill_data, "unit_normal", "unit_normal") return self.fill_data def refresh_shader_data(self): self.get_fill_shader_data() self.get_stroke_shader_data() def get_fill_shader_vert_indices(self): return self.get_triangulation() class OpenGLVGroup(OpenGLVMobject): """A group of vectorized mobjects. This can be used to group multiple :class:`~.OpenGLVMobject` instances together in order to scale, move, ... them together. Examples -------- To add :class:`~.OpenGLVMobject`s to a :class:`~.OpenGLVGroup`, you can either use the :meth:`~.OpenGLVGroup.add` method, or use the `+` and `+=` operators. Similarly, you can subtract elements of a OpenGLVGroup via :meth:`~.OpenGLVGroup.remove` method, or `-` and `-=` operators: .. doctest:: >>> from manim import config >>> original_renderer = config.renderer >>> config.renderer = "opengl" >>> from manim import Triangle, Square >>> from manim.opengl import OpenGLVGroup >>> config.renderer >>> vg = OpenGLVGroup() >>> triangle, square = Triangle(), Square() >>> vg.add(triangle) OpenGLVGroup(Triangle) >>> vg + square # a new OpenGLVGroup is constructed OpenGLVGroup(Triangle, Square) >>> vg # not modified OpenGLVGroup(Triangle) >>> vg += square # modifies vg >>> vg OpenGLVGroup(Triangle, Square) >>> vg.remove(triangle) OpenGLVGroup(Square) >>> vg - square # a new OpenGLVGroup is constructed OpenGLVGroup() >>> vg # not modified OpenGLVGroup(Square) >>> vg -= square # modifies vg >>> vg OpenGLVGroup() >>> config.renderer = original_renderer .. manim:: ArcShapeIris :save_last_frame: class ArcShapeIris(Scene): def construct(self): colors = [DARK_BROWN, BLUE_E, BLUE_D, BLUE_A, TEAL_B, GREEN_B, YELLOW_E] radius = [1 + rad * 0.1 for rad in range(len(colors))] circles_group = OpenGLVGroup() # zip(radius, color) makes the iterator [(radius[i], color[i]) for i in range(radius)] circles_group.add(*[Circle(radius=rad, stroke_width=10, color=col) for rad, col in zip(radius, colors)]) self.add(circles_group) """ def __init__(self, *vmobjects: OpenGLVMobject, **kwargs: Any): super().__init__(**kwargs) self.add(*vmobjects) def __repr__(self): return ( self.__class__.__name__ + "(" + ", ".join(str(mob) for mob in self.submobjects) + ")" ) def __str__(self): return ( f"{self.__class__.__name__} of {len(self.submobjects)} " f"submobject{'s' if len(self.submobjects) > 0 else ''}" ) def add(self, *vmobjects: OpenGLVMobject): """Checks if all passed elements are an instance of OpenGLVMobject and then add them to submobjects Parameters ---------- vmobjects List of OpenGLVMobject to add Returns ------- :class:`OpenGLVGroup` Raises ------ TypeError If one element of the list is not an instance of OpenGLVMobject Examples -------- .. manim:: AddToOpenGLVGroup class AddToOpenGLVGroup(Scene): def construct(self): circle_red = Circle(color=RED) circle_green = Circle(color=GREEN) circle_blue = Circle(color=BLUE) circle_red.shift(LEFT) circle_blue.shift(RIGHT) gr = OpenGLVGroup(circle_red, circle_green) gr2 = OpenGLVGroup(circle_blue) # Constructor uses add directly self.add(gr,gr2) self.wait() gr += gr2 # Add group to another self.play( gr.animate.shift(DOWN), ) gr -= gr2 # Remove group self.play( # Animate groups separately gr.animate.shift(LEFT), gr2.animate.shift(UP), ) self.play( #Animate groups without modification (gr+gr2).animate.shift(RIGHT) ) self.play( # Animate group without component (gr-circle_red).animate.shift(RIGHT) ) """ return super().add(*vmobjects) def __add__(self, vmobject): return OpenGLVGroup(*self.submobjects, vmobject) def __iadd__(self, vmobject): return self.add(vmobject) def __sub__(self, vmobject): copy = OpenGLVGroup(*self.submobjects) copy.remove(vmobject) return copy def __isub__(self, vmobject): return self.remove(vmobject) def __setitem__(self, key: int, value: OpenGLVMobject | Sequence[OpenGLVMobject]): """Override the [] operator for item assignment. Parameters ---------- key The index of the submobject to be assigned value The vmobject value to assign to the key Returns ------- None Tests ----- .. doctest:: >>> from manim import config >>> original_renderer = config.renderer >>> config.renderer = "opengl" >>> vgroup = OpenGLVGroup(OpenGLVMobject()) >>> new_obj = OpenGLVMobject() >>> vgroup[0] = new_obj >>> config.renderer = original_renderer """ self._assert_valid_submobjects(tuplify(value)) self.submobjects[key] = value class OpenGLVectorizedPoint(OpenGLPoint, OpenGLVMobject): def __init__( self, location=ORIGIN, color=BLACK, fill_opacity=0, stroke_width=0, artificial_width=0.01, artificial_height=0.01, **kwargs, ): self.artificial_width = artificial_width self.artificial_height = artificial_height super().__init__( color=color, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs ) self.set_points(np.array([location])) class OpenGLCurvesAsSubmobjects(OpenGLVGroup): """Convert a curve's elements to submobjects. Examples -------- .. manim:: LineGradientExample :save_last_frame: class LineGradientExample(Scene): def construct(self): curve = ParametricFunction(lambda t: [t, np.sin(t), 0], t_range=[-PI, PI, 0.01], stroke_width=10) new_curve = CurvesAsSubmobjects(curve) new_curve.set_color_by_gradient(BLUE, RED) self.add(new_curve.shift(UP), curve) """ def __init__(self, vmobject, **kwargs): super().__init__(**kwargs) for tup in vmobject.get_bezier_tuples(): part = OpenGLVMobject() part.set_points(tup) part.match_style(vmobject) self.add(part) class OpenGLDashedVMobject(OpenGLVMobject): """A :class:`OpenGLVMobject` composed of dashes instead of lines. Examples -------- .. manim:: DashedVMobjectExample :save_last_frame: class DashedVMobjectExample(Scene): def construct(self): r = 0.5 top_row = OpenGLVGroup() # Increasing num_dashes for dashes in range(2, 12): circ = DashedVMobject(Circle(radius=r, color=WHITE), num_dashes=dashes) top_row.add(circ) middle_row = OpenGLVGroup() # Increasing dashed_ratio for ratio in np.arange(1 / 11, 1, 1 / 11): circ = DashedVMobject( Circle(radius=r, color=WHITE), dashed_ratio=ratio ) middle_row.add(circ) sq = DashedVMobject(Square(1.5, color=RED)) penta = DashedVMobject(RegularPolygon(5, color=BLUE)) bottom_row = OpenGLVGroup(sq, penta) top_row.arrange(buff=0.4) middle_row.arrange() bottom_row.arrange(buff=1) everything = OpenGLVGroup(top_row, middle_row, bottom_row).arrange(DOWN, buff=1) self.add(everything) """ def __init__( self, vmobject: OpenGLVMobject, num_dashes: int = 15, dashed_ratio: float = 0.5, color: ParsableManimColor = WHITE, **kwargs, ): self.dashed_ratio = dashed_ratio self.num_dashes = num_dashes super().__init__(color=color, **kwargs) r = self.dashed_ratio n = self.num_dashes if num_dashes > 0: # Assuming total length is 1 dash_len = r / n void_len = (1 - r) / n if vmobject.is_closed() else (1 - r) / (n - 1) self.add( *( vmobject.get_subcurve( i * (dash_len + void_len), i * (dash_len + void_len) + dash_len, ) for i in range(n) ) ) # Family is already taken care of by get_subcurve # implementation self.match_style(vmobject, recurse=False) ManimCommunity-manim-1157b74/manim/mobject/svg/000077500000000000000000000000001515024150700213565ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/mobject/svg/__init__.py000066400000000000000000000002021515024150700234610ustar00rootroot00000000000000"""Mobjects related to SVG images. Modules ======= .. autosummary:: :toctree: ../reference ~brace ~svg_mobject """ ManimCommunity-manim-1157b74/manim/mobject/svg/brace.py000066400000000000000000000365201515024150700230120ustar00rootroot00000000000000"""Mobject representing curly braces.""" from __future__ import annotations __all__ = ["Brace", "BraceLabel", "ArcBrace", "BraceText", "BraceBetweenPoints"] from typing import TYPE_CHECKING, Any, Self import numpy as np import svgelements as se from manim._config import config from manim.mobject.geometry.arc import Arc from manim.mobject.geometry.line import Line from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.text.tex_mobject import MathTex, SingleStringMathTex, Tex from manim.mobject.text.text_mobject import Text from ...animation.animation import Animation from ...animation.composition import AnimationGroup from ...animation.fading import FadeIn from ...animation.growing import GrowFromCenter from ...constants import * from ...mobject.types.vectorized_mobject import VMobject from ...utils.color import BLACK from ..svg.svg_mobject import VMobjectFromSVGPath if TYPE_CHECKING: from manim.typing import Point3D, Point3DLike, Vector3D, Vector3DLike from manim.utils.color.core import ParsableManimColor class Brace(VMobjectFromSVGPath): """Takes a mobject and draws a brace adjacent to it. Passing a direction vector determines the direction from which the brace is drawn. By default it is drawn from below. Parameters ---------- mobject The mobject adjacent to which the brace is placed. direction : The direction from which the brace faces the mobject. See Also -------- :class:`BraceBetweenPoints` Examples -------- .. manim:: BraceExample :save_last_frame: class BraceExample(Scene): def construct(self): s = Square() self.add(s) for i in np.linspace(0.1,1.0,4): br = Brace(s, sharpness=i) t = Text(f"sharpness= {i}").next_to(br, RIGHT) self.add(t) self.add(br) VGroup(*self.mobjects).arrange(DOWN, buff=0.2) """ def __init__( self, mobject: Mobject, direction: Vector3DLike = DOWN, buff: float = 0.2, sharpness: float = 2, stroke_width: float = 0, fill_opacity: float = 1.0, background_stroke_width: float = 0, background_stroke_color: ParsableManimColor = BLACK, **kwargs: Any, ): path_string_template = ( "m0.01216 0c-0.01152 0-0.01216 6.103e-4 -0.01216 0.01311v0.007762c0.06776 " "0.122 0.1799 0.1455 0.2307 0.1455h{0}c0.03046 3.899e-4 0.07964 0.00449 " "0.1246 0.02636 0.0537 0.02695 0.07418 0.05816 0.08648 0.07769 0.001562 " "0.002538 0.004539 0.002563 0.01098 0.002563 0.006444-2e-8 0.009421-2.47e-" "5 0.01098-0.002563 0.0123-0.01953 0.03278-0.05074 0.08648-0.07769 0.04491" "-0.02187 0.09409-0.02597 0.1246-0.02636h{0}c0.05077 0 0.1629-0.02346 " "0.2307-0.1455v-0.007762c-1.78e-6 -0.0125-6.365e-4 -0.01311-0.01216-0.0131" "1-0.006444-3.919e-8 -0.009348 2.448e-5 -0.01091 0.002563-0.0123 0.01953-" "0.03278 0.05074-0.08648 0.07769-0.04491 0.02187-0.09416 0.02597-0.1246 " "0.02636h{1}c-0.04786 0-0.1502 0.02094-0.2185 0.1256-0.06833-0.1046-0.1706" "-0.1256-0.2185-0.1256h{1}c-0.03046-3.899e-4 -0.07972-0.004491-0.1246-0.02" "636-0.0537-0.02695-0.07418-0.05816-0.08648-0.07769-0.001562-0.002538-" "0.004467-0.002563-0.01091-0.002563z" ) default_min_width = 0.90552 self.buff = buff angle = -np.arctan2(*direction[:2]) + np.pi mobject.rotate(-angle, about_point=ORIGIN) left = mobject.get_corner(DOWN + LEFT) right = mobject.get_corner(DOWN + RIGHT) target_width = right[0] - left[0] linear_section_length = max( 0, (target_width * sharpness - default_min_width) / 2, ) path = se.Path( path_string_template.format( linear_section_length, -linear_section_length, ) ) super().__init__( path_obj=path, stroke_width=stroke_width, fill_opacity=fill_opacity, background_stroke_width=background_stroke_width, background_stroke_color=background_stroke_color, **kwargs, ) self.flip(RIGHT) self.stretch_to_fit_width(target_width) self.shift(left - self.get_corner(UP + LEFT) + self.buff * DOWN) for mob in mobject, self: mob.rotate(angle, about_point=ORIGIN) def put_at_tip(self, mob: Mobject, use_next_to: bool = True, **kwargs: Any) -> Self: """Puts the given mobject at the brace tip. Parameters ---------- mob The mobject to be placed at the tip. use_next_to If true, then :meth:`next_to` is used to place the mobject at the tip. kwargs Any additional keyword arguments are passed to :meth:`next_to` which is used to put the mobject next to the brace tip. """ if use_next_to: mob.next_to(self.get_tip(), np.round(self.get_direction()), **kwargs) else: mob.move_to(self.get_tip()) buff = kwargs.get("buff", DEFAULT_MOBJECT_TO_MOBJECT_BUFFER) shift_distance = mob.width / 2.0 + buff mob.shift(self.get_direction() * shift_distance) return self def get_text(self, *text: str, **kwargs: Any) -> Tex: """Places the text at the brace tip. Parameters ---------- text The text to be placed at the brace tip. kwargs Any additional keyword arguments are passed to :meth:`.put_at_tip` which is used to position the text at the brace tip. Returns ------- :class:`~.Tex` """ text_mob = Tex(*text) self.put_at_tip(text_mob, **kwargs) return text_mob def get_tex(self, *tex: str, **kwargs: Any) -> MathTex: """Places the tex at the brace tip. Parameters ---------- tex The tex to be placed at the brace tip. kwargs Any further keyword arguments are passed to :meth:`.put_at_tip` which is used to position the tex at the brace tip. Returns ------- :class:`~.MathTex` """ tex_mob = MathTex(*tex) self.put_at_tip(tex_mob, **kwargs) return tex_mob def get_tip(self) -> Point3D: """Returns the point at the brace tip.""" # Returns the position of the seventh point in the path, which is the tip. if config["renderer"] == "opengl": return self.points[34] return self.points[28] # = 7*4 def get_direction(self) -> Vector3D: """Returns the direction from the center to the brace tip.""" vect = self.get_tip() - self.get_center() return vect / np.linalg.norm(vect) class BraceLabel(VMobject, metaclass=ConvertToOpenGL): """Create a brace with a label attached. Parameters ---------- obj The mobject adjacent to which the brace is placed. text The label text. brace_direction The direction of the brace. By default ``DOWN``. label_constructor A class or function used to construct a mobject representing the label. By default :class:`~.MathTex`. font_size The font size of the label, passed to the ``label_constructor``. buff The buffer between the mobject and the brace. brace_config Arguments to be passed to :class:`.Brace`. kwargs Additional arguments to be passed to :class:`~.VMobject`. """ def __init__( self, obj: Mobject, text: str, brace_direction: Vector3DLike = DOWN, label_constructor: type[SingleStringMathTex | Text] = MathTex, font_size: float = DEFAULT_FONT_SIZE, buff: float = 0.2, brace_config: dict[str, Any] | None = None, **kwargs: Any, ): self.label_constructor = label_constructor super().__init__(**kwargs) self.brace_direction = brace_direction if brace_config is None: brace_config = {} self.brace = Brace(obj, brace_direction, buff, **brace_config) if isinstance(text, (tuple, list)): self.label: VMobject = self.label_constructor( *text, font_size=font_size, **kwargs ) else: self.label = self.label_constructor(str(text), font_size=font_size) self.brace.put_at_tip(self.label) self.add(self.brace, self.label) def creation_anim( self, label_anim: type[Animation] = FadeIn, brace_anim: type[Animation] = GrowFromCenter, ) -> AnimationGroup: return AnimationGroup(brace_anim(self.brace), label_anim(self.label)) def shift_brace(self, obj: Mobject, **kwargs: Any) -> Self: if isinstance(obj, list): obj = self.get_group_class()(*obj) self.brace = Brace(obj, self.brace_direction, **kwargs) self.brace.put_at_tip(self.label) return self def change_label(self, *text: str, **kwargs: Any) -> Self: self.remove(self.label) self.label = self.label_constructor(*text, **kwargs) # type: ignore[arg-type] self.brace.put_at_tip(self.label) self.add(self.label) return self def change_brace_label(self, obj: Mobject, *text: str, **kwargs: Any) -> Self: self.shift_brace(obj) self.change_label(*text, **kwargs) return self class BraceText(BraceLabel): """Create a brace with a text label attached. Parameters ---------- obj The mobject adjacent to which the brace is placed. text The label text. brace_direction The direction of the brace. By default ``DOWN``. label_constructor A class or function used to construct a mobject representing the label. By default :class:`~.Text`. font_size The font size of the label, passed to the ``label_constructor``. buff The buffer between the mobject and the brace. brace_config Arguments to be passed to :class:`.Brace`. kwargs Additional arguments to be passed to :class:`~.VMobject`. Examples -------- .. manim:: BraceTextExample :save_last_frame: class BraceTextExample(Scene): def construct(self): s1 = Square().move_to(2*LEFT) self.add(s1) br1 = BraceText(s1, "Label") self.add(br1) s2 = Square().move_to(2*RIGHT) self.add(s2) br2 = BraceText(s2, "Label") br2.change_label("new") self.add(br2) self.wait(0.1) """ def __init__( self, obj: Mobject, text: str, label_constructor: type[SingleStringMathTex | Text] = Text, **kwargs: Any, ): super().__init__(obj, text, label_constructor=label_constructor, **kwargs) class BraceBetweenPoints(Brace): """Similar to Brace, but instead of taking a mobject it uses 2 points to place the brace. A fitting direction for the brace is computed, but it still can be manually overridden. If the points go from left to right, the brace is drawn from below. Swapping the points places the brace on the opposite side. Parameters ---------- point_1 : The first point. point_2 : The second point. direction : The direction from which the brace faces towards the points. Examples -------- .. manim:: BraceBPExample class BraceBPExample(Scene): def construct(self): p1 = [0,0,0] p2 = [1,2,0] brace = BraceBetweenPoints(p1,p2) self.play(Create(NumberPlane())) self.play(Create(brace)) self.wait(2) """ def __init__( self, point_1: Point3DLike, point_2: Point3DLike, direction: Vector3DLike = ORIGIN, **kwargs: Any, ): if all(direction == ORIGIN): line_vector = np.array(point_2) - np.array(point_1) direction = np.array([line_vector[1], -line_vector[0], 0]) super().__init__(Line(point_1, point_2), direction=direction, **kwargs) class ArcBrace(Brace): """Creates a :class:`~Brace` that wraps around an :class:`~.Arc`. The direction parameter allows the brace to be applied from outside or inside the arc. .. warning:: The :class:`ArcBrace` is smaller for arcs with smaller radii. .. note:: The :class:`ArcBrace` is initially a vertical :class:`Brace` defined by the length of the :class:`~.Arc`, but is scaled down to match the start and end angles. An exponential function is then applied after it is shifted based on the radius of the arc. The scaling effect is not applied for arcs with radii smaller than 1 to prevent over-scaling. Parameters ---------- arc The :class:`~.Arc` that wraps around the :class:`Brace` mobject. direction The direction from which the brace faces the arc. ``LEFT`` for inside the arc, and ``RIGHT`` for the outside. Example ------- .. manim:: ArcBraceExample :save_last_frame: :ref_classes: Arc class ArcBraceExample(Scene): def construct(self): arc_1 = Arc(radius=1.5,start_angle=0,angle=2*PI/3).set_color(RED) brace_1 = ArcBrace(arc_1,LEFT) group_1 = VGroup(arc_1,brace_1) arc_2 = Arc(radius=3,start_angle=0,angle=5*PI/6).set_color(YELLOW) brace_2 = ArcBrace(arc_2) group_2 = VGroup(arc_2,brace_2) arc_3 = Arc(radius=0.5,start_angle=-0,angle=PI).set_color(BLUE) brace_3 = ArcBrace(arc_3) group_3 = VGroup(arc_3,brace_3) arc_4 = Arc(radius=0.2,start_angle=0,angle=3*PI/2).set_color(GREEN) brace_4 = ArcBrace(arc_4) group_4 = VGroup(arc_4,brace_4) arc_group = VGroup(group_1, group_2, group_3, group_4).arrange_in_grid(buff=1.5) self.add(arc_group.center()) """ def __init__( self, arc: Arc | None = None, direction: Vector3DLike = RIGHT, **kwargs: Any, ): if arc is None: arc = Arc(start_angle=-1, angle=2, radius=1) arc_end_angle = arc.start_angle + arc.angle line = Line(UP * arc.start_angle, UP * arc_end_angle) scale_shift = RIGHT * np.log(arc.radius) if arc.radius >= 1: line.scale(arc.radius, about_point=ORIGIN) super().__init__(line, direction=direction, **kwargs) self.scale(1 / (arc.radius), about_point=ORIGIN) else: super().__init__(line, direction=direction, **kwargs) if arc.radius >= 0.3: self.shift(scale_shift) else: self.shift(RIGHT * np.log(0.3)) self.apply_complex_function(np.exp) self.shift(arc.get_arc_center()) ManimCommunity-manim-1157b74/manim/mobject/svg/svg_mobject.py000066400000000000000000000560341515024150700242420ustar00rootroot00000000000000"""Mobjects generated from an SVG file.""" from __future__ import annotations import os from pathlib import Path from typing import Any from xml.etree import ElementTree as ET import numpy as np import svgelements as se from manim import config, logger from manim.utils.color import ManimColor, ParsableManimColor from ...constants import RIGHT from ...utils.bezier import get_quadratic_approximation_of_cubic from ...utils.images import get_full_vector_image_path from ...utils.iterables import hash_obj from ..geometry.arc import Circle from ..geometry.line import Line from ..geometry.polygram import Polygon, Rectangle, RoundedRectangle from ..opengl.opengl_compatibility import ConvertToOpenGL from ..types.vectorized_mobject import VGroup, VMobject __all__ = ["SVGMobject", "VMobjectFromSVGPath"] SVG_HASH_TO_MOB_MAP: dict[int, SVGMobject] = {} def _convert_point_to_3d(x: float, y: float) -> np.ndarray: return np.array([x, y, 0.0]) class SVGMobject(VMobject, metaclass=ConvertToOpenGL): """A vectorized mobject created from importing an SVG file. Parameters ---------- file_name The path to the SVG file. should_center Whether or not the mobject should be centered after being imported. height The target height of the mobject, set to 2 Manim units by default. If the height and width are both set to ``None``, the mobject is imported without being scaled. width The target width of the mobject, set to ``None`` by default. If the height and the width are both set to ``None``, the mobject is imported without being scaled. color The color (both fill and stroke color) of the mobject. If ``None`` (the default), the colors set in the SVG file are used. opacity The opacity (both fill and stroke opacity) of the mobject. If ``None`` (the default), the opacity set in the SVG file is used. fill_color The fill color of the mobject. If ``None`` (the default), the fill colors set in the SVG file are used. fill_opacity The fill opacity of the mobject. If ``None`` (the default), the fill opacities set in the SVG file are used. stroke_color The stroke color of the mobject. If ``None`` (the default), the stroke colors set in the SVG file are used. stroke_opacity The stroke opacity of the mobject. If ``None`` (the default), the stroke opacities set in the SVG file are used. stroke_width The stroke width of the mobject. If ``None`` (the default), the stroke width values set in the SVG file are used. svg_default A dictionary in which fallback values for unspecified properties of elements in the SVG file are defined. If ``None`` (the default), ``color``, ``opacity``, ``fill_color`` ``fill_opacity``, ``stroke_color``, and ``stroke_opacity`` are set to ``None``, and ``stroke_width`` is set to 0. path_string_config A dictionary with keyword arguments passed to :class:`.VMobjectFromSVGPath` used for importing path elements. If ``None`` (the default), no additional arguments are passed. use_svg_cache If True (default), the svg inputs (e.g. file_name, settings) will be used as a key and a copy of the created mobject will be saved using that key to be quickly retrieved if the same inputs need be processed later. For large SVGs which are used only once, this can be omitted to improve performance. kwargs Further arguments passed to the parent class. """ def __init__( self, file_name: str | os.PathLike | None = None, should_center: bool = True, height: float | None = 2, width: float | None = None, color: ParsableManimColor | None = None, opacity: float | None = None, fill_color: ParsableManimColor | None = None, fill_opacity: float | None = None, stroke_color: ParsableManimColor | None = None, stroke_opacity: float | None = None, stroke_width: float | None = None, svg_default: dict | None = None, path_string_config: dict | None = None, use_svg_cache: bool = True, **kwargs: Any, ): super().__init__(color=None, stroke_color=None, fill_color=None, **kwargs) # process keyword arguments self.file_name = Path(file_name) if file_name is not None else None self.should_center = should_center self.svg_height = height self.svg_width = width self.color = ManimColor(color) self.opacity = opacity self.fill_color = fill_color self.fill_opacity = fill_opacity # type: ignore[assignment] self.stroke_color = stroke_color self.stroke_opacity = stroke_opacity # type: ignore[assignment] self.stroke_width = stroke_width # type: ignore[assignment] self.id_to_vgroup_dict: dict[str, VGroup] = {} if self.stroke_width is None: self.stroke_width = 0 if svg_default is None: svg_default = { "color": None, "opacity": None, "fill_color": None, "fill_opacity": None, "stroke_width": 0, "stroke_color": None, "stroke_opacity": None, } self.svg_default = svg_default if path_string_config is None: path_string_config = {} self.path_string_config = path_string_config self.init_svg_mobject(use_svg_cache=use_svg_cache) self.set_style( fill_color=fill_color, fill_opacity=fill_opacity, stroke_color=stroke_color, stroke_opacity=stroke_opacity, stroke_width=stroke_width, ) self.move_into_position() def init_svg_mobject(self, use_svg_cache: bool) -> None: """Checks whether the SVG has already been imported and generates it if not. See also -------- :meth:`.SVGMobject.generate_mobject` """ if use_svg_cache: hash_val = hash_obj(self.hash_seed) if hash_val in SVG_HASH_TO_MOB_MAP: mob = SVG_HASH_TO_MOB_MAP[hash_val].copy() self.add(*mob) self.id_to_vgroup_dict = mob.id_to_vgroup_dict return self.generate_mobject() if use_svg_cache: SVG_HASH_TO_MOB_MAP[hash_val] = self.copy() @property def hash_seed(self) -> tuple: """A unique hash representing the result of the generated mobject points. Used as keys in the ``SVG_HASH_TO_MOB_MAP`` caching dictionary. """ return ( self.__class__.__name__, self.svg_default, self.path_string_config, self.file_name, config.renderer, ) def generate_mobject(self) -> None: """Parse the SVG and translate its elements to submobjects.""" file_path = self.get_file_path() element_tree = ET.parse(file_path) new_tree = self.modify_xml_tree(element_tree) # type: ignore[arg-type] # Create a temporary svg file to dump modified svg to be parsed modified_file_path = file_path.with_name(f"{file_path.stem}_{file_path.suffix}") new_tree.write(modified_file_path) svg = se.SVG.parse(modified_file_path) modified_file_path.unlink() mobjects, mobject_dict = self.get_mobjects_from(svg) self.add(*mobjects) self.id_to_vgroup_dict = mobject_dict self.flip(RIGHT) # Flip y def get_file_path(self) -> Path: """Search for an existing file based on the specified file name.""" if self.file_name is None: raise ValueError("Must specify file for SVGMobject") return get_full_vector_image_path(self.file_name) def modify_xml_tree(self, element_tree: ET.ElementTree) -> ET.ElementTree: """Modifies the SVG element tree to include default style information. Parameters ---------- element_tree The parsed element tree from the SVG file. """ config_style_dict = self.generate_config_style_dict() style_keys = ( "fill", "fill-opacity", "stroke", "stroke-opacity", "stroke-width", "style", ) root = element_tree.getroot() root_style_dict = {k: v for k, v in root.attrib.items() if k in style_keys} # type: ignore[union-attr] new_root = ET.Element("svg", {}) config_style_node = ET.SubElement(new_root, "g", config_style_dict) root_style_node = ET.SubElement(config_style_node, "g", root_style_dict) root_style_node.extend(root) # type: ignore[arg-type] return ET.ElementTree(new_root) def generate_config_style_dict(self) -> dict[str, str]: """Generate a dictionary holding the default style information.""" keys_converting_dict = { "fill": ("color", "fill_color"), "fill-opacity": ("opacity", "fill_opacity"), "stroke": ("color", "stroke_color"), "stroke-opacity": ("opacity", "stroke_opacity"), "stroke-width": ("stroke_width",), } svg_default_dict = self.svg_default result = {} for svg_key, style_keys in keys_converting_dict.items(): for style_key in style_keys: if svg_default_dict[style_key] is None: continue result[svg_key] = str(svg_default_dict[style_key]) return result def get_mobjects_from( self, svg: se.SVG ) -> tuple[list[VMobject], dict[str, VGroup]]: """Convert the elements of the SVG to a list of mobjects. Parameters ---------- svg The parsed SVG file. """ result: list[VMobject] = [] stack: list[tuple[se.SVGElement, int]] = [] stack.append((svg, 1)) group_id_number = 0 vgroup_stack: list[str] = ["root"] vgroup_names: list[str] = ["root"] vgroups: dict[str, VGroup] = {"root": VGroup()} while len(stack) > 0: element, depth = stack.pop() # Reduce stack heights vgroup_stack = vgroup_stack[0:(depth)] try: group_name = str(element.values["id"]) except Exception: group_name = f"numbered_group_{group_id_number}" group_id_number += 1 vg = VGroup() vgroup_names.append(group_name) vgroup_stack.append(group_name) vgroups[group_name] = vg if isinstance(element, (se.Group, se.Use)): stack.extend((subelement, depth + 1) for subelement in element[::-1]) # Add element to the parent vgroup try: if isinstance( element, ( se.Path, se.SimpleLine, se.Rect, se.Circle, se.Ellipse, se.Polygon, se.Polyline, se.Text, ), ): mob = self.get_mob_from_shape_element(element) if mob is not None: result.append(mob) for parent_name in vgroup_stack[:-1]: vgroups[parent_name].add(mob) except Exception as e: logger.error(f"Exception occurred in 'get_mobjects_from'. Details: {e}") return result, vgroups def get_mob_from_shape_element(self, shape: se.SVGElement) -> VMobject | None: if isinstance(shape, se.Path): mob: VMobject | None = self.path_to_mobject(shape) elif isinstance(shape, se.SimpleLine): mob = self.line_to_mobject(shape) elif isinstance(shape, se.Rect): mob = self.rect_to_mobject(shape) elif isinstance(shape, (se.Circle, se.Ellipse)): mob = self.ellipse_to_mobject(shape) elif isinstance(shape, se.Polygon): mob = self.polygon_to_mobject(shape) elif isinstance(shape, se.Polyline): mob = self.polyline_to_mobject(shape) elif isinstance(shape, se.Text): mob = self.text_to_mobject(shape) else: logger.warning(f"Unsupported element type: {type(shape)}") mob = None if mob is None or not mob.has_points(): return mob self.apply_style_to_mobject(mob, shape) if isinstance(shape, se.Transformable) and shape.apply: self.handle_transform(mob, shape.transform) return mob @staticmethod def handle_transform(mob: VMobject, matrix: se.Matrix) -> VMobject: """Apply SVG transformations to the converted mobject. Parameters ---------- mob The converted mobject. matrix The transformation matrix determined from the SVG transformation. """ mat = np.array([[matrix.a, matrix.c], [matrix.b, matrix.d]]) vec = np.array([matrix.e, matrix.f, 0.0]) mob.apply_matrix(mat) mob.shift(vec) return mob @staticmethod def apply_style_to_mobject(mob: VMobject, shape: se.GraphicObject) -> VMobject: """Apply SVG style information to the converted mobject. Parameters ---------- mob The converted mobject. shape The parsed SVG element. """ mob.set_style( stroke_width=shape.stroke_width, stroke_color=shape.stroke.hexrgb, stroke_opacity=shape.stroke.opacity, fill_color=shape.fill.hexrgb, fill_opacity=shape.fill.opacity, ) return mob def path_to_mobject(self, path: se.Path) -> VMobjectFromSVGPath: """Convert a path element to a vectorized mobject. Parameters ---------- path The parsed SVG path. """ return VMobjectFromSVGPath(path, **self.path_string_config) @staticmethod def line_to_mobject(line: se.Line) -> Line: """Convert a line element to a vectorized mobject. Parameters ---------- line The parsed SVG line. """ return Line( start=_convert_point_to_3d(line.x1, line.y1), end=_convert_point_to_3d(line.x2, line.y2), ) @staticmethod def rect_to_mobject(rect: se.Rect) -> Rectangle: """Convert a rectangle element to a vectorized mobject. Parameters ---------- rect The parsed SVG rectangle. """ if rect.rx == 0 or rect.ry == 0: mob = Rectangle( width=rect.width, height=rect.height, ) else: mob = RoundedRectangle( width=rect.width, height=rect.height * rect.rx / rect.ry, corner_radius=rect.rx, ) mob.stretch_to_fit_height(rect.height) mob.shift( _convert_point_to_3d(rect.x + rect.width / 2, rect.y + rect.height / 2) ) return mob @staticmethod def ellipse_to_mobject(ellipse: se.Ellipse | se.Circle) -> Circle: """Convert an ellipse or circle element to a vectorized mobject. Parameters ---------- ellipse The parsed SVG ellipse or circle. """ mob = Circle(radius=ellipse.rx) if ellipse.rx != ellipse.ry: mob.stretch_to_fit_height(2 * ellipse.ry) mob.shift(_convert_point_to_3d(ellipse.cx, ellipse.cy)) return mob @staticmethod def polygon_to_mobject(polygon: se.Polygon) -> Polygon: """Convert a polygon element to a vectorized mobject. Parameters ---------- polygon The parsed SVG polygon. """ points = [_convert_point_to_3d(*point) for point in polygon] return Polygon(*points) def polyline_to_mobject(self, polyline: se.Polyline) -> VMobject: """Convert a polyline element to a vectorized mobject. Parameters ---------- polyline The parsed SVG polyline. """ points = [_convert_point_to_3d(*point) for point in polyline] vmobject_class = self.get_mobject_type_class() return vmobject_class().set_points_as_corners(points) @staticmethod def text_to_mobject(text: se.Text) -> VMobject: """Convert a text element to a vectorized mobject. .. warning:: Not yet implemented. Parameters ---------- text The parsed SVG text. """ logger.warning(f"Unsupported element type: {type(text)}") return # type: ignore[return-value] def move_into_position(self) -> None: """Scale and move the generated mobject into position.""" if self.should_center: self.center() if self.svg_height is not None: self.set(height=self.svg_height) if self.svg_width is not None: self.set(width=self.svg_width) class VMobjectFromSVGPath(VMobject, metaclass=ConvertToOpenGL): """A vectorized mobject representing an SVG path. .. note:: The ``long_lines``, ``should_subdivide_sharp_curves``, and ``should_remove_null_curves`` keyword arguments are only respected with the OpenGL renderer. Parameters ---------- path_obj A parsed SVG path object. long_lines Whether or not straight lines in the vectorized mobject are drawn in one or two segments. should_subdivide_sharp_curves Whether or not to subdivide subcurves further in case two segments meet at an angle that is sharper than a given threshold. should_remove_null_curves Whether or not to remove subcurves of length 0. kwargs Further keyword arguments are passed to the parent class. """ def __init__( self, path_obj: se.Path, long_lines: bool = False, should_subdivide_sharp_curves: bool = False, should_remove_null_curves: bool = False, **kwargs: Any, ): # Get rid of arcs path_obj.approximate_arcs_with_quads() self.path_obj = path_obj self.long_lines = long_lines self.should_subdivide_sharp_curves = should_subdivide_sharp_curves self.should_remove_null_curves = should_remove_null_curves super().__init__(**kwargs) def generate_points(self) -> None: # TODO: cache mobject in a re-importable way self.handle_commands() if config.renderer == "opengl": if self.should_subdivide_sharp_curves: # For a healthy triangulation later self.subdivide_sharp_curves() if self.should_remove_null_curves: # Get rid of any null curves self.set_points(self.get_points_without_null_curves()) def init_points(self) -> None: self.generate_points() def handle_commands(self) -> None: all_points: list[np.ndarray] = [] last_move: np.ndarray = None curve_start = None last_true_move = None def move_pen(pt: np.ndarray, *, true_move: bool = False) -> None: nonlocal last_move, curve_start, last_true_move last_move = pt if curve_start is None: curve_start = last_move if true_move: last_true_move = last_move if self.n_points_per_curve == 4: def add_cubic( start: np.ndarray, cp1: np.ndarray, cp2: np.ndarray, end: np.ndarray ) -> None: nonlocal all_points assert len(all_points) % 4 == 0, len(all_points) all_points += [start, cp1, cp2, end] move_pen(end) def add_quad(start: np.ndarray, cp: np.ndarray, end: np.ndarray) -> None: add_cubic(start, (start + cp + cp) / 3, (cp + cp + end) / 3, end) move_pen(end) def add_line(start: np.ndarray, end: np.ndarray) -> None: add_cubic( start, (start + start + end) / 3, (start + end + end) / 3, end ) move_pen(end) else: def add_cubic( start: np.ndarray, cp1: np.ndarray, cp2: np.ndarray, end: np.ndarray ) -> None: nonlocal all_points assert len(all_points) % 3 == 0, len(all_points) two_quads = get_quadratic_approximation_of_cubic( start, cp1, cp2, end, ) all_points += two_quads[:3].tolist() all_points += two_quads[3:].tolist() move_pen(end) def add_quad(start: np.ndarray, cp: np.ndarray, end: np.ndarray) -> None: nonlocal all_points assert len(all_points) % 3 == 0, len(all_points) all_points += [start, cp, end] move_pen(end) def add_line(start: np.ndarray, end: np.ndarray) -> None: add_quad(start, (start + end) / 2, end) move_pen(end) for segment in self.path_obj: segment_class = segment.__class__ if segment_class == se.Move: move_pen(_convert_point_to_3d(*segment.end), true_move=True) elif segment_class == se.Line: add_line(last_move, _convert_point_to_3d(*segment.end)) elif segment_class == se.QuadraticBezier: add_quad( last_move, _convert_point_to_3d(*segment.control), _convert_point_to_3d(*segment.end), ) elif segment_class == se.CubicBezier: add_cubic( last_move, _convert_point_to_3d(*segment.control1), _convert_point_to_3d(*segment.control2), _convert_point_to_3d(*segment.end), ) elif segment_class == se.Close: # If the SVG path naturally ends at the beginning of the curve, # we do *not* need to draw a closing line. To account for floating # point precision, we use a small value to compare the two points. if abs(np.linalg.norm(last_move - last_true_move)) > 0.0001: add_line(last_move, last_true_move) curve_start = None else: raise AssertionError(f"Not implemented: {segment_class}") self.points = np.array(all_points, ndmin=2, dtype="float64") # If we have no points, make sure the array is shaped properly # (0 rows tall by 3 columns wide) so future operations can # add or remove points correctly. if len(all_points) == 0: self.points = np.reshape(self.points, (0, 3)) ManimCommunity-manim-1157b74/manim/mobject/table.py000066400000000000000000001217441515024150700222310ustar00rootroot00000000000000r"""Mobjects representing tables. Examples -------- .. manim:: TableExamples :save_last_frame: class TableExamples(Scene): def construct(self): t0 = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")], top_left_entry=Text("TOP")) t0.add_highlighted_cell((2,2), color=GREEN) x_vals = np.linspace(-2,2,5) y_vals = np.exp(x_vals) t1 = DecimalTable( [x_vals, y_vals], row_labels=[MathTex("x"), MathTex("f(x)")], include_outer_lines=True) t1.add(t1.get_cell((2,2), color=RED)) t2 = MathTable( [["+", 0, 5, 10], [0, 0, 5, 10], [2, 2, 7, 12], [4, 4, 9, 14]], include_outer_lines=True) t2.get_horizontal_lines()[:3].set_color(BLUE) t2.get_vertical_lines()[:3].set_color(BLUE) t2.get_horizontal_lines()[:3].set_z_index(1) cross = VGroup( Line(UP + LEFT, DOWN + RIGHT), Line(UP + RIGHT, DOWN + LEFT)) a = Circle().set_color(RED).scale(0.5) b = cross.set_color(BLUE).scale(0.5) t3 = MobjectTable( [[a.copy(),b.copy(),a.copy()], [b.copy(),a.copy(),a.copy()], [a.copy(),b.copy(),b.copy()]]) t3.add(Line( t3.get_corner(DL), t3.get_corner(UR) ).set_color(RED)) vals = np.arange(1,21).reshape(5,4) t4 = IntegerTable( vals, include_outer_lines=True ) g1 = Group(t0, t1).scale(0.5).arrange(buff=1).to_edge(UP, buff=1) g2 = Group(t2, t3, t4).scale(0.5).arrange(buff=1).to_edge(DOWN, buff=1) self.add(g1, g2) """ from __future__ import annotations __all__ = [ "Table", "MathTable", "MobjectTable", "IntegerTable", "DecimalTable", ] import itertools as it from collections.abc import Callable, Iterable, Sequence from manim.mobject.geometry.line import Line from manim.mobject.geometry.polygram import Polygon from manim.mobject.geometry.shape_matchers import BackgroundRectangle from manim.mobject.text.numbers import DecimalNumber, Integer from manim.mobject.text.tex_mobject import MathTex from manim.mobject.text.text_mobject import Paragraph from ..animation.animation import Animation from ..animation.composition import AnimationGroup from ..animation.creation import Create, Write from ..animation.fading import FadeIn from ..mobject.types.vectorized_mobject import VGroup, VMobject from ..utils.color import BLACK, PURE_YELLOW, ManimColor, ParsableManimColor from .utils import get_vectorized_mobject_class class Table(VGroup): r"""A mobject that displays a table on the screen. Parameters ---------- table A 2D array or list of lists. Content of the table has to be a valid input for the callable set in ``element_to_mobject``. row_labels List of :class:`~.VMobject` representing the labels of each row. col_labels List of :class:`~.VMobject` representing the labels of each column. top_left_entry The top-left entry of the table, can only be specified if row and column labels are given. v_buff Vertical buffer passed to :meth:`~.Mobject.arrange_in_grid`, by default 0.8. h_buff Horizontal buffer passed to :meth:`~.Mobject.arrange_in_grid`, by default 1.3. include_outer_lines ``True`` if the table should include outer lines, by default False. add_background_rectangles_to_entries ``True`` if background rectangles should be added to entries, by default ``False``. entries_background_color Background color of entries if ``add_background_rectangles_to_entries`` is ``True``. include_background_rectangle ``True`` if the table should have a background rectangle, by default ``False``. background_rectangle_color Background color of table if ``include_background_rectangle`` is ``True``. element_to_mobject The :class:`~.Mobject` class applied to the table entries. by default :class:`~.Paragraph`. For common choices, see :mod:`~.text_mobject`/:mod:`~.tex_mobject`. element_to_mobject_config Custom configuration passed to :attr:`element_to_mobject`, by default {}. arrange_in_grid_config Dict passed to :meth:`~.Mobject.arrange_in_grid`, customizes the arrangement of the table. line_config Dict passed to :class:`~.Line`, customizes the lines of the table. kwargs Additional arguments to be passed to :class:`~.VGroup`. Examples -------- .. manim:: TableExamples :save_last_frame: class TableExamples(Scene): def construct(self): t0 = Table( [["This", "is a"], ["simple", "Table in \\n Manim."]]) t1 = Table( [["This", "is a"], ["simple", "Table."]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) t1.add_highlighted_cell((2,2), color=YELLOW) t2 = Table( [["This", "is a"], ["simple", "Table."]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")], top_left_entry=Star().scale(0.3), include_outer_lines=True, arrange_in_grid_config={"cell_alignment": RIGHT}) t2.add(t2.get_cell((2,2), color=RED)) t3 = Table( [["This", "is a"], ["simple", "Table."]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")], top_left_entry=Star().scale(0.3), include_outer_lines=True, line_config={"stroke_width": 1, "color": YELLOW}) t3.remove(*t3.get_vertical_lines()) g = Group( t0,t1,t2,t3 ).scale(0.7).arrange_in_grid(buff=1) self.add(g) .. manim:: BackgroundRectanglesExample :save_last_frame: class BackgroundRectanglesExample(Scene): def construct(self): background = Rectangle(height=6.5, width=13) background.set_fill(opacity=.5) background.set_color([TEAL, RED, YELLOW]) self.add(background) t0 = Table( [["This", "is a"], ["simple", "Table."]], add_background_rectangles_to_entries=True) t1 = Table( [["This", "is a"], ["simple", "Table."]], include_background_rectangle=True) g = Group(t0, t1).scale(0.7).arrange(buff=0.5) self.add(g) """ def __init__( self, table: Iterable[Iterable[float | str | VMobject]], row_labels: Iterable[VMobject] | None = None, col_labels: Iterable[VMobject] | None = None, top_left_entry: VMobject | None = None, v_buff: float = 0.8, h_buff: float = 1.3, include_outer_lines: bool = False, add_background_rectangles_to_entries: bool = False, entries_background_color: ParsableManimColor = BLACK, include_background_rectangle: bool = False, background_rectangle_color: ParsableManimColor = BLACK, element_to_mobject: Callable[ [float | str | VMobject], VMobject, ] = Paragraph, element_to_mobject_config: dict = {}, arrange_in_grid_config: dict = {}, line_config: dict = {}, **kwargs, ): self.row_labels = row_labels self.col_labels = col_labels self.top_left_entry = top_left_entry self.row_dim = len(table) self.col_dim = len(table[0]) self.v_buff = v_buff self.h_buff = h_buff self.include_outer_lines = include_outer_lines self.add_background_rectangles_to_entries = add_background_rectangles_to_entries self.entries_background_color = ManimColor(entries_background_color) self.include_background_rectangle = include_background_rectangle self.background_rectangle_color = ManimColor(background_rectangle_color) self.element_to_mobject = element_to_mobject self.element_to_mobject_config = element_to_mobject_config self.arrange_in_grid_config = arrange_in_grid_config self.line_config = line_config for row in table: if len(row) == len(table[0]): pass else: raise ValueError("Not all rows in table have the same length.") super().__init__(**kwargs) mob_table = self._table_to_mob_table(table) self.elements_without_labels = VGroup(*it.chain(*mob_table)) mob_table = self._add_labels(mob_table) self._organize_mob_table(mob_table) self.elements = VGroup(*it.chain(*mob_table)) if len(self.elements[0].get_all_points()) == 0: self.elements.remove(self.elements[0]) self.add(self.elements) self.center() self.mob_table = mob_table self._add_horizontal_lines() self._add_vertical_lines() if self.add_background_rectangles_to_entries: self.add_background_to_entries(color=self.entries_background_color) if self.include_background_rectangle: self.add_background_rectangle(color=self.background_rectangle_color) def _table_to_mob_table( self, table: Iterable[Iterable[float | str | VMobject]], ) -> list: """Initializes the entries of ``table`` as :class:`~.VMobject`. Parameters ---------- table A 2D array or list of lists. Content of the table has to be a valid input for the callable set in ``element_to_mobject``. Returns -------- List List of :class:`~.VMobject` from the entries of ``table``. """ return [ [ self.element_to_mobject(item, **self.element_to_mobject_config) for item in row ] for row in table ] def _organize_mob_table(self, table: Iterable[Iterable[VMobject]]) -> VGroup: """Arranges the :class:`~.VMobject` of ``table`` in a grid. Parameters ---------- table A 2D iterable object with :class:`~.VMobject` entries. Returns -------- :class:`~.VGroup` The :class:`~.VMobject` of the ``table`` in a :class:`~.VGroup` already arranged in a table-like grid. """ help_table = VGroup() for i, row in enumerate(table): for j, _ in enumerate(row): help_table.add(table[i][j]) help_table.arrange_in_grid( rows=len(table), cols=len(table[0]), buff=(self.h_buff, self.v_buff), **self.arrange_in_grid_config, ) return help_table def _add_labels(self, mob_table: VGroup) -> VGroup: """Adds labels to an in a grid arranged :class:`~.VGroup`. Parameters ---------- mob_table An in a grid organized class:`~.VGroup`. Returns -------- :class:`~.VGroup` Returns the ``mob_table`` with added labels. """ if self.row_labels is not None: for k in range(len(self.row_labels)): mob_table[k] = [self.row_labels[k]] + mob_table[k] if self.col_labels is not None: if self.row_labels is not None: if self.top_left_entry is not None: col_labels = [self.top_left_entry] + self.col_labels mob_table.insert(0, col_labels) else: # Placeholder to use arrange_in_grid if top_left_entry is not set. # Import OpenGLVMobject to work with --renderer=opengl dummy_mobject = get_vectorized_mobject_class()() col_labels = [dummy_mobject] + self.col_labels mob_table.insert(0, col_labels) else: mob_table.insert(0, self.col_labels) return mob_table def _add_horizontal_lines(self) -> Table: """Adds the horizontal lines to the table.""" anchor_left = self.get_left()[0] - 0.5 * self.h_buff anchor_right = self.get_right()[0] + 0.5 * self.h_buff line_group = VGroup() if self.include_outer_lines: anchor = self.get_rows()[0].get_top()[1] + 0.5 * self.v_buff line = Line( [anchor_left, anchor, 0], [anchor_right, anchor, 0], **self.line_config ) line_group.add(line) self.add(line) anchor = self.get_rows()[-1].get_bottom()[1] - 0.5 * self.v_buff line = Line( [anchor_left, anchor, 0], [anchor_right, anchor, 0], **self.line_config ) line_group.add(line) self.add(line) for k in range(len(self.mob_table) - 1): anchor = self.get_rows()[k + 1].get_top()[1] + 0.5 * ( self.get_rows()[k].get_bottom()[1] - self.get_rows()[k + 1].get_top()[1] ) line = Line( [anchor_left, anchor, 0], [anchor_right, anchor, 0], **self.line_config ) line_group.add(line) self.add(line) self.horizontal_lines = line_group return self def _add_vertical_lines(self) -> Table: """Adds the vertical lines to the table""" anchor_top = self.get_rows().get_top()[1] + 0.5 * self.v_buff anchor_bottom = self.get_rows().get_bottom()[1] - 0.5 * self.v_buff line_group = VGroup() if self.include_outer_lines: anchor = self.get_columns()[0].get_left()[0] - 0.5 * self.h_buff line = Line( [anchor, anchor_top, 0], [anchor, anchor_bottom, 0], **self.line_config ) line_group.add(line) self.add(line) anchor = self.get_columns()[-1].get_right()[0] + 0.5 * self.h_buff line = Line( [anchor, anchor_top, 0], [anchor, anchor_bottom, 0], **self.line_config ) line_group.add(line) self.add(line) for k in range(len(self.mob_table[0]) - 1): anchor = self.get_columns()[k + 1].get_left()[0] + 0.5 * ( self.get_columns()[k].get_right()[0] - self.get_columns()[k + 1].get_left()[0] ) line = Line( [anchor, anchor_bottom, 0], [anchor, anchor_top, 0], **self.line_config ) line_group.add(line) self.add(line) self.vertical_lines = line_group return self def get_horizontal_lines(self) -> VGroup: """Return the horizontal lines of the table. Returns -------- :class:`~.VGroup` :class:`~.VGroup` containing all the horizontal lines of the table. Examples -------- .. manim:: GetHorizontalLinesExample :save_last_frame: class GetHorizontalLinesExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) table.get_horizontal_lines().set_color(RED) self.add(table) """ return self.horizontal_lines def get_vertical_lines(self) -> VGroup: """Return the vertical lines of the table. Returns -------- :class:`~.VGroup` :class:`~.VGroup` containing all the vertical lines of the table. Examples -------- .. manim:: GetVerticalLinesExample :save_last_frame: class GetVerticalLinesExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) table.get_vertical_lines()[0].set_color(RED) self.add(table) """ return self.vertical_lines def get_columns(self) -> VGroup: """Return columns of the table as a :class:`~.VGroup` of :class:`~.VGroup`. Returns -------- :class:`~.VGroup` :class:`~.VGroup` containing each column in a :class:`~.VGroup`. Examples -------- .. manim:: GetColumnsExample :save_last_frame: class GetColumnsExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) table.add(SurroundingRectangle(table.get_columns()[1])) self.add(table) """ return VGroup( *( VGroup(*(row[i] for row in self.mob_table)) for i in range(len(self.mob_table[0])) ) ) def get_rows(self) -> VGroup: """Return the rows of the table as a :class:`~.VGroup` of :class:`~.VGroup`. Returns -------- :class:`~.VGroup` :class:`~.VGroup` containing each row in a :class:`~.VGroup`. Examples -------- .. manim:: GetRowsExample :save_last_frame: class GetRowsExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) table.add(SurroundingRectangle(table.get_rows()[1])) self.add(table) """ return VGroup(*(VGroup(*row) for row in self.mob_table)) def set_column_colors(self, *colors: Iterable[ParsableManimColor]) -> Table: """Set individual colors for each column of the table. Parameters ---------- colors An iterable of colors; each color corresponds to a column. Examples -------- .. manim:: SetColumnColorsExample :save_last_frame: class SetColumnColorsExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")] ).set_column_colors([RED,BLUE], GREEN) self.add(table) """ columns = self.get_columns() for color, column in zip(colors, columns, strict=False): column.set_color(color) return self def set_row_colors(self, *colors: Iterable[ParsableManimColor]) -> Table: """Set individual colors for each row of the table. Parameters ---------- colors An iterable of colors; each color corresponds to a row. Examples -------- .. manim:: SetRowColorsExample :save_last_frame: class SetRowColorsExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")] ).set_row_colors([RED,BLUE], GREEN) self.add(table) """ rows = self.get_rows() for color, row in zip(colors, rows, strict=False): row.set_color(color) return self def get_entries( self, pos: Sequence[int] | None = None, ) -> VMobject | VGroup: """Return the individual entries of the table (including labels) or one specific entry if the parameter, ``pos``, is set. Parameters ---------- pos The position of a specific entry on the table. ``(1,1)`` being the top left entry of the table. Returns ------- Union[:class:`~.VMobject`, :class:`~.VGroup`] :class:`~.VGroup` containing all entries of the table (including labels) or the :class:`~.VMobject` at the given position if ``pos`` is set. Examples -------- .. manim:: GetEntriesExample :save_last_frame: class GetEntriesExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) ent = table.get_entries() for item in ent: item.set_color(random_bright_color()) table.get_entries((2,2)).rotate(PI) self.add(table) """ if pos is not None: if ( self.row_labels is not None and self.col_labels is not None and self.top_left_entry is None ): index = len(self.mob_table[0]) * (pos[0] - 1) + pos[1] - 2 return self.elements[index] else: index = len(self.mob_table[0]) * (pos[0] - 1) + pos[1] - 1 return self.elements[index] else: return self.elements def get_entries_without_labels( self, pos: Sequence[int] | None = None, ) -> VMobject | VGroup: """Return the individual entries of the table (without labels) or one specific entry if the parameter, ``pos``, is set. Parameters ---------- pos The position of a specific entry on the table. ``(1,1)`` being the top left entry of the table (without labels). Returns ------- Union[:class:`~.VMobject`, :class:`~.VGroup`] :class:`~.VGroup` containing all entries of the table (without labels) or the :class:`~.VMobject` at the given position if ``pos`` is set. Examples -------- .. manim:: GetEntriesWithoutLabelsExample :save_last_frame: class GetEntriesWithoutLabelsExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) ent = table.get_entries_without_labels() colors = [BLUE, GREEN, YELLOW, RED] for k in range(len(colors)): ent[k].set_color(colors[k]) table.get_entries_without_labels((2,2)).rotate(PI) self.add(table) """ if pos is not None: index = self.col_dim * (pos[0] - 1) + pos[1] - 1 return self.elements_without_labels[index] else: return self.elements_without_labels def get_row_labels(self) -> VGroup: """Return the row labels of the table. Returns ------- :class:`~.VGroup` :class:`~.VGroup` containing the row labels of the table. Examples -------- .. manim:: GetRowLabelsExample :save_last_frame: class GetRowLabelsExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) lab = table.get_row_labels() for item in lab: item.set_color(random_bright_color()) self.add(table) """ return VGroup(*self.row_labels) def get_col_labels(self) -> VGroup: """Return the column labels of the table. Returns -------- :class:`~.VGroup` VGroup containing the column labels of the table. Examples -------- .. manim:: GetColLabelsExample :save_last_frame: class GetColLabelsExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) lab = table.get_col_labels() for item in lab: item.set_color(random_bright_color()) self.add(table) """ return VGroup(*self.col_labels) def get_labels(self) -> VGroup: """Returns the labels of the table. Returns -------- :class:`~.VGroup` :class:`~.VGroup` containing all the labels of the table. Examples -------- .. manim:: GetLabelsExample :save_last_frame: class GetLabelsExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) lab = table.get_labels() colors = [BLUE, GREEN, YELLOW, RED] for k in range(len(colors)): lab[k].set_color(colors[k]) self.add(table) """ label_group = VGroup() if self.top_left_entry is not None: label_group.add(self.top_left_entry) for label in (self.col_labels, self.row_labels): if label is not None: label_group.add(*label) return label_group def add_background_to_entries(self, color: ParsableManimColor = BLACK) -> Table: """Adds a black :class:`~.BackgroundRectangle` to each entry of the table.""" for mob in self.get_entries(): mob.add_background_rectangle(color=ManimColor(color)) return self def get_cell(self, pos: Sequence[int] = (1, 1), **kwargs) -> Polygon: """Returns one specific cell as a rectangular :class:`~.Polygon` without the entry. Parameters ---------- pos The position of a specific entry on the table. ``(1,1)`` being the top left entry of the table. kwargs Additional arguments to be passed to :class:`~.Polygon`. Returns ------- :class:`~.Polygon` Polygon mimicking one specific cell of the Table. Examples -------- .. manim:: GetCellExample :save_last_frame: class GetCellExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) cell = table.get_cell((2,2), color=RED) self.add(table, cell) """ row = self.get_rows()[pos[0] - 1] col = self.get_columns()[pos[1] - 1] edge_UL = [ col.get_left()[0] - self.h_buff / 2, row.get_top()[1] + self.v_buff / 2, 0, ] edge_UR = [ col.get_right()[0] + self.h_buff / 2, row.get_top()[1] + self.v_buff / 2, 0, ] edge_DL = [ col.get_left()[0] - self.h_buff / 2, row.get_bottom()[1] - self.v_buff / 2, 0, ] edge_DR = [ col.get_right()[0] + self.h_buff / 2, row.get_bottom()[1] - self.v_buff / 2, 0, ] rec = Polygon(edge_UL, edge_UR, edge_DR, edge_DL, **kwargs) return rec def get_highlighted_cell( self, pos: Sequence[int] = (1, 1), color: ParsableManimColor = PURE_YELLOW, **kwargs, ) -> BackgroundRectangle: """Returns a :class:`~.BackgroundRectangle` of the cell at the given position. Parameters ---------- pos The position of a specific entry on the table. ``(1,1)`` being the top left entry of the table. color The color used to highlight the cell. kwargs Additional arguments to be passed to :class:`~.BackgroundRectangle`. Examples -------- .. manim:: GetHighlightedCellExample :save_last_frame: class GetHighlightedCellExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) highlight = table.get_highlighted_cell((2,2), color=GREEN) table.add_to_back(highlight) self.add(table) """ cell = self.get_cell(pos) bg_cell = BackgroundRectangle(cell, color=ManimColor(color), **kwargs) return bg_cell def add_highlighted_cell( self, pos: Sequence[int] = (1, 1), color: ParsableManimColor = PURE_YELLOW, **kwargs, ) -> Table: """Highlights one cell at a specific position on the table by adding a :class:`~.BackgroundRectangle`. Parameters ---------- pos The position of a specific entry on the table. ``(1,1)`` being the top left entry of the table. color The color used to highlight the cell. kwargs Additional arguments to be passed to :class:`~.BackgroundRectangle`. Examples -------- .. manim:: AddHighlightedCellExample :save_last_frame: class AddHighlightedCellExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")]) table.add_highlighted_cell((2,2), color=GREEN) self.add(table) """ bg_cell = self.get_highlighted_cell(pos, color=ManimColor(color), **kwargs) self.add_to_back(bg_cell) entry = self.get_entries(pos) entry.background_rectangle = bg_cell return self def create( self, lag_ratio: float = 1, line_animation: Callable[[VMobject | VGroup], Animation] = Create, label_animation: Callable[[VMobject | VGroup], Animation] = Write, element_animation: Callable[[VMobject | VGroup], Animation] = Create, entry_animation: Callable[[VMobject | VGroup], Animation] = FadeIn, **kwargs, ) -> AnimationGroup: """Customized create-type function for tables. Parameters ---------- lag_ratio The lag ratio of the animation. line_animation The animation style of the table lines, see :mod:`~.creation` for examples. label_animation The animation style of the table labels, see :mod:`~.creation` for examples. element_animation The animation style of the table elements, see :mod:`~.creation` for examples. entry_animation The entry animation of the table background, see :mod:`~.creation` for examples. kwargs Further arguments passed to the creation animations. Returns ------- :class:`~.AnimationGroup` AnimationGroup containing creation of the lines and of the elements. Examples -------- .. manim:: CreateTableExample class CreateTableExample(Scene): def construct(self): table = Table( [["First", "Second"], ["Third","Fourth"]], row_labels=[Text("R1"), Text("R2")], col_labels=[Text("C1"), Text("C2")], include_outer_lines=True) self.play(table.create()) self.wait() """ animations: Sequence[Animation] = [ line_animation( VGroup(self.vertical_lines, self.horizontal_lines), **kwargs, ), element_animation(self.elements_without_labels.set_z_index(2), **kwargs), ] if self.get_labels(): animations += [ label_animation(self.get_labels(), **kwargs), ] if self.get_entries(): for entry in self.elements_without_labels: try: animations += [ entry_animation( entry.background_rectangle, **kwargs, ) ] except AttributeError: continue return AnimationGroup(*animations, lag_ratio=lag_ratio) def scale(self, scale_factor: float, **kwargs): # h_buff and v_buff must be adjusted so that Table.get_cell # can construct an accurate polygon for a cell. self.h_buff *= scale_factor self.v_buff *= scale_factor super().scale(scale_factor, **kwargs) return self class MathTable(Table): """A specialized :class:`~.Table` mobject for use with LaTeX. Examples -------- .. manim:: MathTableExample :save_last_frame: class MathTableExample(Scene): def construct(self): t0 = MathTable( [["+", 0, 5, 10], [0, 0, 5, 10], [2, 2, 7, 12], [4, 4, 9, 14]], include_outer_lines=True) self.add(t0) """ def __init__( self, table: Iterable[Iterable[float | str]], element_to_mobject: Callable[[float | str], VMobject] = MathTex, **kwargs, ): """ Special case of :class:`~.Table` with `element_to_mobject` set to :class:`~.MathTex`. Every entry in `table` is set in a Latex `align` environment. Parameters ---------- table A 2d array or list of lists. Content of the table have to be valid input for :class:`~.MathTex`. element_to_mobject The :class:`~.Mobject` class applied to the table entries. Set as :class:`~.MathTex`. kwargs Additional arguments to be passed to :class:`~.Table`. """ super().__init__( table, element_to_mobject=element_to_mobject, **kwargs, ) class MobjectTable(Table): """A specialized :class:`~.Table` mobject for use with :class:`~.Mobject`. Examples -------- .. manim:: MobjectTableExample :save_last_frame: class MobjectTableExample(Scene): def construct(self): cross = VGroup( Line(UP + LEFT, DOWN + RIGHT), Line(UP + RIGHT, DOWN + LEFT), ) a = Circle().set_color(RED).scale(0.5) b = cross.set_color(BLUE).scale(0.5) t0 = MobjectTable( [[a.copy(),b.copy(),a.copy()], [b.copy(),a.copy(),a.copy()], [a.copy(),b.copy(),b.copy()]] ) line = Line( t0.get_corner(DL), t0.get_corner(UR) ).set_color(RED) self.add(t0, line) """ def __init__( self, table: Iterable[Iterable[VMobject]], element_to_mobject: Callable[[VMobject], VMobject] = lambda m: m, **kwargs, ): """ Special case of :class:`~.Table` with ``element_to_mobject`` set to an identity function. Here, every item in ``table`` must already be of type :class:`~.Mobject`. Parameters ---------- table A 2D array or list of lists. Content of the table must be of type :class:`~.Mobject`. element_to_mobject The :class:`~.Mobject` class applied to the table entries. Set as ``lambda m : m`` to return itself. kwargs Additional arguments to be passed to :class:`~.Table`. """ super().__init__(table, element_to_mobject=element_to_mobject, **kwargs) class IntegerTable(Table): r"""A specialized :class:`~.Table` mobject for use with :class:`~.Integer`. Examples -------- .. manim:: IntegerTableExample :save_last_frame: class IntegerTableExample(Scene): def construct(self): t0 = IntegerTable( [[0,30,45,60,90], [90,60,45,30,0]], col_labels=[ MathTex(r"\frac{ \sqrt{0} }{2}"), MathTex(r"\frac{ \sqrt{1} }{2}"), MathTex(r"\frac{ \sqrt{2} }{2}"), MathTex(r"\frac{ \sqrt{3} }{2}"), MathTex(r"\frac{ \sqrt{4} }{2}")], row_labels=[MathTex(r"\sin"), MathTex(r"\cos")], h_buff=1, element_to_mobject_config={"unit": r"^{\circ}"}) self.add(t0) """ def __init__( self, table: Iterable[Iterable[float | str]], element_to_mobject: Callable[[float | str], VMobject] = Integer, **kwargs, ): """ Special case of :class:`~.Table` with `element_to_mobject` set to :class:`~.Integer`. Will round if there are decimal entries in the table. Parameters ---------- table A 2d array or list of lists. Content of the table has to be valid input for :class:`~.Integer`. element_to_mobject The :class:`~.Mobject` class applied to the table entries. Set as :class:`~.Integer`. kwargs Additional arguments to be passed to :class:`~.Table`. """ super().__init__(table, element_to_mobject=element_to_mobject, **kwargs) class DecimalTable(Table): """A specialized :class:`~.Table` mobject for use with :class:`~.DecimalNumber` to display decimal entries. Examples -------- .. manim:: DecimalTableExample :save_last_frame: class DecimalTableExample(Scene): def construct(self): x_vals = [-2,-1,0,1,2] y_vals = np.exp(x_vals) t0 = DecimalTable( [x_vals, y_vals], row_labels=[MathTex("x"), MathTex("f(x)=e^{x}")], h_buff=1, element_to_mobject_config={"num_decimal_places": 2}) self.add(t0) """ def __init__( self, table: Iterable[Iterable[float | str]], element_to_mobject: Callable[[float | str], VMobject] = DecimalNumber, element_to_mobject_config: dict = {"num_decimal_places": 1}, **kwargs, ): """ Special case of :class:`~.Table` with ``element_to_mobject`` set to :class:`~.DecimalNumber`. By default, ``num_decimal_places`` is set to 1. Will round/truncate the decimal places based on the provided ``element_to_mobject_config``. Parameters ---------- table A 2D array, or a list of lists. Content of the table must be valid input for :class:`~.DecimalNumber`. element_to_mobject The :class:`~.Mobject` class applied to the table entries. Set as :class:`~.DecimalNumber`. element_to_mobject_config Element to mobject config, here set as {"num_decimal_places": 1}. kwargs Additional arguments to be passed to :class:`~.Table`. """ super().__init__( table, element_to_mobject=element_to_mobject, element_to_mobject_config=element_to_mobject_config, **kwargs, ) ManimCommunity-manim-1157b74/manim/mobject/text/000077500000000000000000000000001515024150700215435ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/mobject/text/__init__.py000066400000000000000000000002741515024150700236570ustar00rootroot00000000000000"""Mobjects used to display Text using Pango or LaTeX. Modules ======= .. autosummary:: :toctree: ../reference ~code_mobject ~numbers ~tex_mobject ~text_mobject """ ManimCommunity-manim-1157b74/manim/mobject/text/code_mobject.py000066400000000000000000000224341515024150700245370ustar00rootroot00000000000000"""Mobject representing highlighted source code listings.""" from __future__ import annotations __all__ = [ "Code", ] import re from pathlib import Path from typing import Any, Literal from bs4 import BeautifulSoup, Tag from pygments import highlight from pygments.formatters.html import HtmlFormatter from pygments.lexers import get_lexer_by_name, guess_lexer, guess_lexer_for_filename from pygments.styles import get_all_styles from manim.constants import * from manim.mobject.geometry.arc import Dot from manim.mobject.geometry.shape_matchers import SurroundingRectangle from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.typing import StrPath from manim.utils.color import WHITE, ManimColor class Code(VMobject, metaclass=ConvertToOpenGL): """A highlighted source code listing. Examples -------- Normal usage:: listing = Code( "helloworldcpp.cpp", tab_width=4, formatter_style="emacs", background="window", language="cpp", background_config={"stroke_color": WHITE}, paragraph_config={"font": "Noto Sans Mono"}, ) We can also render code passed as a string. As the automatic language detection can be a bit flaky, it is recommended to specify the language explicitly: .. manim:: CodeFromString :save_last_frame: class CodeFromString(Scene): def construct(self): code = '''from manim import Scene, Square class FadeInSquare(Scene): def construct(self): s = Square() self.play(FadeIn(s)) self.play(s.animate.scale(2)) self.wait()''' rendered_code = Code( code_string=code, language="python", background="window", background_config={"stroke_color": "maroon"}, ) self.add(rendered_code) Parameters ---------- code_file The path to the code file to display. code_string Alternatively, the code string to display. language The programming language of the code. If not specified, it will be guessed from the file extension or the code itself. formatter_style The style to use for the code highlighting. Defaults to ``"vim"``. A list of all available styles can be obtained by calling :meth:`.Code.get_styles_list`. tab_width The width of a tab character in spaces. Defaults to 4. add_line_numbers Whether to display line numbers. Defaults to ``True``. line_numbers_from The first line number to display. Defaults to 1. background The type of background to use. Can be either ``"rectangle"`` (the default) or ``"window"``. background_config Keyword arguments passed to the background constructor. Default settings are stored in the class attribute :attr:`.default_background_config` (which can also be modified directly). paragraph_config Keyword arguments passed to the constructor of the :class:`.Paragraph` objects holding the code, and the line numbers. Default settings are stored in the class attribute :attr:`.default_paragraph_config` (which can also be modified directly). """ _styles_list_cache: list[str] | None = None default_background_config: dict[str, Any] = { "buff": 0.3, "fill_color": ManimColor("#222"), "stroke_color": WHITE, "corner_radius": 0.2, "stroke_width": 1, "fill_opacity": 1, } default_paragraph_config: dict[str, Any] = { "font": "Monospace", "font_size": 24, "line_spacing": 0.5, "disable_ligatures": True, } code: VMobject def __init__( self, code_file: StrPath | None = None, code_string: str | None = None, language: str | None = None, formatter_style: str = "vim", tab_width: int = 4, add_line_numbers: bool = True, line_numbers_from: int = 1, background: Literal["rectangle", "window"] = "rectangle", background_config: dict[str, Any] | None = None, paragraph_config: dict[str, Any] | None = None, ): super().__init__() if code_file is not None: code_file = Path(code_file) code_string = code_file.read_text(encoding="utf-8") lexer = guess_lexer_for_filename(code_file.name, code_string) elif code_string is not None: if language is not None: lexer = get_lexer_by_name(language) else: lexer = guess_lexer(code_string) else: raise ValueError("Either a code file or a code string must be specified.") code_string = code_string.expandtabs(tabsize=tab_width) formatter = HtmlFormatter( style=formatter_style, noclasses=True, cssclasses="", ) soup = BeautifulSoup( highlight(code_string, lexer, formatter), features="html.parser" ) self._code_html = soup.find("pre") assert isinstance(self._code_html, Tag) # as we are using Paragraph to render the text, we need to find the character indices # of the segments of changed color in the HTML code color_ranges = [] current_line_color_ranges = [] current_line_char_index = 0 for child in self._code_html.children: if child.name == "span": try: child_style = child["style"] match_ = re.match( r"color: (#[A-Fa-f0-9]{6}|#[A-Fa-f0-9]{3})", child_style ) color = None if match_ is None else match_.group(1) except KeyError: color = None current_line_color_ranges.append( ( current_line_char_index, current_line_char_index + len(child.text), color, ) ) current_line_char_index += len(child.text) else: for char in child.text: if char == "\n": color_ranges.append(current_line_color_ranges) current_line_color_ranges = [] current_line_char_index = 0 else: current_line_char_index += 1 color_ranges.append(current_line_color_ranges) code_lines = self._code_html.get_text().removesuffix("\n").split("\n") if paragraph_config is None: paragraph_config = {} base_paragraph_config = self.default_paragraph_config.copy() base_paragraph_config.update(paragraph_config) from manim.mobject.text.text_mobject import Paragraph self.code_lines = Paragraph( *code_lines, **base_paragraph_config, ) for line, color_range in zip(self.code_lines, color_ranges, strict=False): for start, end, color in color_range: line[start:end].set_color(color) if add_line_numbers: base_paragraph_config.update({"alignment": "right"}) self.line_numbers = Paragraph( *[ str(i) for i in range( line_numbers_from, line_numbers_from + len(self.code_lines) ) ], **base_paragraph_config, ) self.line_numbers.next_to(self.code_lines, direction=LEFT).align_to( self.code_lines, UP ) self.add(self.line_numbers) for line in self.code_lines: line.submobjects = [c for c in line if not isinstance(c, Dot)] self.add(self.code_lines) if background_config is None: background_config = {} background_config_base = self.default_background_config.copy() background_config_base.update(background_config) if background == "rectangle": self.background = SurroundingRectangle( self, **background_config_base, ) elif background == "window": buttons = VGroup( Dot(radius=0.1, stroke_width=0, color=button_color) for button_color in ["#ff5f56", "#ffbd2e", "#27c93f"] ).arrange(RIGHT, buff=0.1) buttons.next_to(self, UP, buff=0.1).align_to(self, LEFT).shift(LEFT * 0.1) self.background = SurroundingRectangle( VGroup(self, buttons), **background_config_base, ) buttons.shift(UP * 0.1 + LEFT * 0.1) self.background.add(buttons) else: raise ValueError(f"Unknown background type: {background}") self.add_to_back(self.background) @classmethod def get_styles_list(cls) -> list[str]: """Get the list of all available formatter styles.""" if cls._styles_list_cache is None: cls._styles_list_cache = list(get_all_styles()) return cls._styles_list_cache ManimCommunity-manim-1157b74/manim/mobject/text/numbers.py000066400000000000000000000415111515024150700235720ustar00rootroot00000000000000"""Mobjects representing numbers.""" from __future__ import annotations __all__ = ["DecimalNumber", "Integer", "Variable"] from typing import Any, Self import numpy as np from manim import config from manim.constants import * from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.text.tex_mobject import MathTex, SingleStringMathTex, Tex from manim.mobject.text.text_mobject import Text from manim.mobject.types.vectorized_mobject import VMobject from manim.mobject.value_tracker import ValueTracker from manim.typing import Vector3DLike string_to_mob_map: dict[str, SingleStringMathTex] = {} class DecimalNumber(VMobject, metaclass=ConvertToOpenGL): r"""An mobject representing a decimal number. Parameters ---------- number The numeric value to be displayed. It can later be modified using :meth:`.set_value`. num_decimal_places The number of decimal places after the decimal separator. Values are automatically rounded. mob_class The class for rendering digits and units, by default :class:`.MathTex`. include_sign Set to ``True`` to include a sign for positive numbers and zero. group_with_commas When ``True`` thousands groups are separated by commas for readability. digit_buff_per_font_unit Additional spacing between digits. Scales with font size. show_ellipsis When a number has been truncated by rounding, indicate with an ellipsis (``...``). unit A unit string which can be placed to the right of the numerical values. unit_buff_per_font_unit An additional spacing between the numerical values and the unit. A value of ``unit_buff_per_font_unit=0.003`` gives a decent spacing. Scales with font size. include_background_rectangle Adds a background rectangle to increase contrast on busy scenes. edge_to_fix Assuring right- or left-alignment of the full object. font_size Size of the font. Examples -------- .. manim:: MovingSquareWithUpdaters class MovingSquareWithUpdaters(Scene): def construct(self): decimal = DecimalNumber( 0, show_ellipsis=True, num_decimal_places=3, include_sign=True, unit=r"\text{M-Units}", unit_buff_per_font_unit=0.003 ) square = Square().to_edge(UP) decimal.add_updater(lambda d: d.next_to(square, RIGHT)) decimal.add_updater(lambda d: d.set_value(square.get_center()[1])) self.add(square, decimal) self.play( square.animate.to_edge(DOWN), rate_func=there_and_back, run_time=5, ) self.wait() """ def __init__( self, number: float = 0, num_decimal_places: int = 2, mob_class: type[SingleStringMathTex] = MathTex, include_sign: bool = False, group_with_commas: bool = True, digit_buff_per_font_unit: float = 0.001, show_ellipsis: bool = False, unit: str | None = None, # Aligned to bottom unless it starts with "^" unit_buff_per_font_unit: float = 0, include_background_rectangle: bool = False, edge_to_fix: Vector3DLike = LEFT, font_size: float = DEFAULT_FONT_SIZE, stroke_width: float = 0, fill_opacity: float = 1.0, **kwargs: Any, ): super().__init__(**kwargs, fill_opacity=fill_opacity, stroke_width=stroke_width) self.number = number self.num_decimal_places = num_decimal_places self.include_sign = include_sign self.mob_class = mob_class self.group_with_commas = group_with_commas self.digit_buff_per_font_unit = digit_buff_per_font_unit self.show_ellipsis = show_ellipsis self.unit = unit self.unit_buff_per_font_unit = unit_buff_per_font_unit self.include_background_rectangle = include_background_rectangle self.edge_to_fix = edge_to_fix self._font_size = font_size self.fill_opacity = fill_opacity self.initial_config = kwargs.copy() self.initial_config.update( { "num_decimal_places": num_decimal_places, "include_sign": include_sign, "group_with_commas": group_with_commas, "digit_buff_per_font_unit": digit_buff_per_font_unit, "show_ellipsis": show_ellipsis, "unit": unit, "unit_buff_per_font_unit": unit_buff_per_font_unit, "include_background_rectangle": include_background_rectangle, "edge_to_fix": edge_to_fix, "font_size": font_size, "stroke_width": stroke_width, "fill_opacity": fill_opacity, }, ) self._set_submobjects_from_number(number) self.init_colors() @property def font_size(self) -> float: """The font size of the tex mobject.""" return_value: float = self.height / self.initial_height * self._font_size return return_value @font_size.setter def font_size(self, font_val: float) -> None: if font_val <= 0: raise ValueError("font_size must be greater than 0.") elif self.height > 0: # sometimes manim generates a SingleStringMathex mobject with 0 height. # can't be scaled regardless and will error without the elif. # scale to a factor of the initial height so that setting # font_size does not depend on current size. self.scale(font_val / self.font_size) def _set_submobjects_from_number(self, number: float) -> None: self.number = number self.submobjects = [] num_string = self._get_num_string(number) self.add(*(map(self._string_to_mob, num_string))) # Add non-numerical bits if self.show_ellipsis: self.add( self._string_to_mob("\\dots", SingleStringMathTex, color=self.color), ) self.arrange( buff=self.digit_buff_per_font_unit * self._font_size, aligned_edge=DOWN, ) if self.unit is not None: self.unit_sign = self._string_to_mob(self.unit, SingleStringMathTex) self.add( self.unit_sign.next_to( self, direction=RIGHT, buff=(self.unit_buff_per_font_unit + self.digit_buff_per_font_unit) * self._font_size, aligned_edge=DOWN, ) ) self.move_to(ORIGIN) # Handle alignment of parts that should be aligned # to the bottom for i, c in enumerate(num_string): if c == "-" and len(num_string) > i + 1: self[i].align_to(self[i + 1], UP) self[i].shift(self[i + 1].height * DOWN / 2) elif c == ",": self[i].shift(self[i].height * DOWN / 2) if self.unit and self.unit.startswith("^"): self.unit_sign.align_to(self, UP) # track the initial height to enable scaling via font_size self.initial_height: float = self.height if self.include_background_rectangle: self.add_background_rectangle() def _get_num_string(self, number: float | complex) -> str: if isinstance(number, complex): formatter = self._get_complex_formatter() else: formatter = self._get_formatter() num_string = formatter.format(number) rounded_num = np.round(number, self.num_decimal_places) if num_string.startswith("-") and rounded_num == 0: num_string = "+" + num_string[1:] if self.include_sign else num_string[1:] return num_string def _string_to_mob( self, string: str, mob_class: type[SingleStringMathTex] | None = None, **kwargs: Any, ) -> VMobject: if mob_class is None: mob_class = self.mob_class if string not in string_to_mob_map: string_to_mob_map[string] = mob_class(string, **kwargs) mob = string_to_mob_map[string].copy() mob.font_size = self._font_size return mob def _get_formatter(self, **kwargs: Any) -> str: """ Configuration is based first off instance attributes, but overwritten by any kew word argument. Relevant key words: - include_sign - group_with_commas - num_decimal_places - field_name (e.g. 0 or 0.real) """ config = { attr: getattr(self, attr) for attr in [ "include_sign", "group_with_commas", "num_decimal_places", ] } config.update(kwargs) return "".join( [ "{", config.get("field_name", ""), ":", "+" if config["include_sign"] else "", "," if config["group_with_commas"] else "", ".", str(config["num_decimal_places"]), "f", "}", ], ) def _get_complex_formatter(self) -> str: return "".join( [ self._get_formatter(field_name="0.real"), self._get_formatter(field_name="0.imag", include_sign=True), "i", ], ) def set_value(self, number: float) -> Self: """Set the value of the :class:`~.DecimalNumber` to a new number. Parameters ---------- number The value that will overwrite the current number of the :class:`~.DecimalNumber`. """ # creates a new number mob via `set_submobjects_from_number` # then matches the properties (color, font_size, etc...) # of the previous mobject to the new one # old_family needed with cairo old_family = self.get_family() old_font_size = self.font_size move_to_point = self.get_edge_center(self.edge_to_fix) old_submobjects = self.submobjects self._set_submobjects_from_number(number) self.font_size = old_font_size self.move_to(move_to_point, self.edge_to_fix) for sm1, sm2 in zip(self.submobjects, old_submobjects, strict=False): sm1.match_style(sm2) if config.renderer == RendererType.CAIRO: for mob in old_family: # Dumb hack...due to how scene handles families # of animated mobjects # for compatibility with updaters to not leave first number in place while updating, # not needed with opengl renderer mob.points[:] = 0 self.init_colors() return self def get_value(self) -> float: return self.number def increment_value(self, delta_t: float = 1) -> None: self.set_value(self.get_value() + delta_t) class Integer(DecimalNumber): """A class for displaying Integers. Examples -------- .. manim:: IntegerExample :save_last_frame: class IntegerExample(Scene): def construct(self): self.add(Integer(number=2.5).set_color(ORANGE).scale(2.5).set_x(-0.5).set_y(0.8)) self.add(Integer(number=3.14159, show_ellipsis=True).set_x(3).set_y(3.3).scale(3.14159)) self.add(Integer(number=42).set_x(2.5).set_y(-2.3).set_color_by_gradient(BLUE, TEAL).scale(1.7)) self.add(Integer(number=6.28).set_x(-1.5).set_y(-2).set_color(YELLOW).scale(1.4)) """ def __init__( self, number: float = 0, num_decimal_places: int = 0, **kwargs: Any ) -> None: super().__init__(number=number, num_decimal_places=num_decimal_places, **kwargs) def get_value(self) -> int: return int(np.round(super().get_value())) class Variable(VMobject, metaclass=ConvertToOpenGL): """A class for displaying text that shows "label = value" with the value continuously updated from a :class:`~.ValueTracker`. Parameters ---------- var The initial value you need to keep track of and display. label The label for your variable. Raw strings are convertex to :class:`~.MathTex` objects. var_type The class used for displaying the number. Defaults to :class:`DecimalNumber`. num_decimal_places The number of decimal places to display in your variable. Defaults to 2. If `var_type` is an :class:`Integer`, this parameter is ignored. kwargs Other arguments to be passed to `~.Mobject`. Attributes ---------- label : Union[:class:`str`, :class:`~.Tex`, :class:`~.MathTex`, :class:`~.Text`, :class:`~.SingleStringMathTex`] The label for your variable, for example ``x = ...``. tracker : :class:`~.ValueTracker` Useful in updating the value of your variable on-screen. value : Union[:class:`DecimalNumber`, :class:`Integer`] The tex for the value of your variable. Examples -------- Normal usage:: # DecimalNumber type var = 0.5 on_screen_var = Variable(var, Text("var"), num_decimal_places=3) # Integer type int_var = 0 on_screen_int_var = Variable(int_var, Text("int_var"), var_type=Integer) # Using math mode for the label on_screen_int_var = Variable(int_var, "{a}_{i}", var_type=Integer) .. manim:: VariablesWithValueTracker class VariablesWithValueTracker(Scene): def construct(self): var = 0.5 on_screen_var = Variable(var, Text("var"), num_decimal_places=3) # You can also change the colours for the label and value on_screen_var.label.set_color(RED) on_screen_var.value.set_color(GREEN) self.play(Write(on_screen_var)) # The above line will just display the variable with # its initial value on the screen. If you also wish to # update it, you can do so by accessing the `tracker` attribute self.wait() var_tracker = on_screen_var.tracker var = 10.5 self.play(var_tracker.animate.set_value(var)) self.wait() int_var = 0 on_screen_int_var = Variable( int_var, Text("int_var"), var_type=Integer ).next_to(on_screen_var, DOWN) on_screen_int_var.label.set_color(RED) on_screen_int_var.value.set_color(GREEN) self.play(Write(on_screen_int_var)) self.wait() var_tracker = on_screen_int_var.tracker var = 10.5 self.play(var_tracker.animate.set_value(var)) self.wait() # If you wish to have a somewhat more complicated label for your # variable with subscripts, superscripts, etc. the default class # for the label is MathTex subscript_label_var = 10 on_screen_subscript_var = Variable(subscript_label_var, "{a}_{i}").next_to( on_screen_int_var, DOWN ) self.play(Write(on_screen_subscript_var)) self.wait() .. manim:: VariableExample class VariableExample(Scene): def construct(self): start = 2.0 x_var = Variable(start, 'x', num_decimal_places=3) sqr_var = Variable(start**2, 'x^2', num_decimal_places=3) Group(x_var, sqr_var).arrange(DOWN) sqr_var.add_updater(lambda v: v.tracker.set_value(x_var.tracker.get_value()**2)) self.add(x_var, sqr_var) self.play(x_var.tracker.animate.set_value(5), run_time=2, rate_func=linear) self.wait(0.1) """ def __init__( self, var: float, label: str | Tex | MathTex | Text | SingleStringMathTex, var_type: type[DecimalNumber | Integer] = DecimalNumber, num_decimal_places: int = 2, **kwargs: Any, ): self.label = MathTex(label) if isinstance(label, str) else label equals = MathTex("=").next_to(self.label, RIGHT) self.label.add(equals) self.tracker = ValueTracker(var) if var_type == DecimalNumber: self.value = DecimalNumber( self.tracker.get_value(), num_decimal_places=num_decimal_places, ) elif var_type == Integer: self.value = Integer(self.tracker.get_value()) self.value.add_updater(lambda v: v.set_value(self.tracker.get_value())).next_to( self.label, RIGHT, ) super().__init__(**kwargs) self.add(self.label, self.value) ManimCommunity-manim-1157b74/manim/mobject/text/tex_mobject.py000066400000000000000000000640551515024150700244320ustar00rootroot00000000000000r"""Mobjects representing text rendered using LaTeX. .. important:: See the corresponding tutorial :ref:`rendering-with-latex` .. note:: Just as you can use :class:`~.Text` (from the module :mod:`~.text_mobject`) to add text to your videos, you can use :class:`~.Tex` and :class:`~.MathTex` to insert LaTeX. """ from __future__ import annotations from manim.utils.color import BLACK, ParsableManimColor __all__ = [ "SingleStringMathTex", "MathTex", "Tex", "BulletedList", "Title", ] import operator as op import re from collections.abc import Iterable from functools import reduce from textwrap import dedent from typing import Any, Self from manim import config, logger from manim.constants import * from manim.mobject.geometry.line import Line from manim.mobject.svg.svg_mobject import SVGMobject from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.utils.tex import TexTemplate from manim.utils.tex_file_writing import tex_to_svg_file from ..opengl.opengl_compatibility import ConvertToOpenGL MATHTEX_SUBSTRING = "substring" class SingleStringMathTex(SVGMobject): """Elementary building block for rendering text with LaTeX. Tests ----- Check that creating a :class:`~.SingleStringMathTex` object works:: >>> SingleStringMathTex('Test') # doctest: +SKIP SingleStringMathTex('Test') """ def __init__( self, tex_string: str, stroke_width: float = 0, should_center: bool = True, height: float | None = None, organize_left_to_right: bool = False, tex_environment: str | None = "align*", tex_template: TexTemplate | None = None, font_size: float = DEFAULT_FONT_SIZE, color: ParsableManimColor | None = None, **kwargs: Any, ): if color is None: color = VMobject().color self._font_size = font_size self.organize_left_to_right = organize_left_to_right self.tex_environment = tex_environment if tex_template is None: tex_template = config["tex_template"] self.tex_template: TexTemplate = tex_template self.tex_string = tex_string file_name = tex_to_svg_file( self._get_modified_expression(tex_string), environment=self.tex_environment, tex_template=self.tex_template, ) super().__init__( file_name=file_name, should_center=should_center, stroke_width=stroke_width, height=height, color=color, path_string_config={ "should_subdivide_sharp_curves": True, "should_remove_null_curves": True, }, **kwargs, ) self.init_colors() # used for scaling via font_size.setter self.initial_height = self.height if height is None: self.font_size = self._font_size if self.organize_left_to_right: self._organize_submobjects_left_to_right() def __repr__(self) -> str: return f"{type(self).__name__}({repr(self.tex_string)})" @property def font_size(self) -> float: """The font size of the tex mobject.""" return self.height / self.initial_height / SCALE_FACTOR_PER_FONT_POINT @font_size.setter def font_size(self, font_val: float) -> None: if font_val <= 0: raise ValueError("font_size must be greater than 0.") elif self.height > 0: # sometimes manim generates a SingleStringMathex mobject with 0 height. # can't be scaled regardless and will error without the elif. # scale to a factor of the initial height so that setting # font_size does not depend on current size. self.scale(font_val / self.font_size) def _get_modified_expression(self, tex_string: str) -> str: result = tex_string result = result.strip() result = self._modify_special_strings(result) return result def _modify_special_strings(self, tex: str) -> str: tex = tex.strip() should_add_filler = reduce( op.or_, [ # Fraction line needs something to be over tex == "\\over", tex == "\\overline", # Make sure sqrt has overbar tex == "\\sqrt", tex == "\\sqrt{", # Need to add blank subscript or superscript tex.endswith("_"), tex.endswith("^"), tex.endswith("dot"), ], ) if should_add_filler: filler = "{\\quad}" tex += filler if tex == "\\substack": tex = "\\quad" if tex == "": tex = "\\quad" # To keep files from starting with a line break if tex.startswith("\\\\"): tex = tex.replace("\\\\", "\\quad\\\\") # Handle imbalanced \left and \right num_lefts, num_rights = ( len([s for s in tex.split(substr)[1:] if s and s[0] in "(){}[]|.\\"]) for substr in ("\\left", "\\right") ) if num_lefts != num_rights: tex = tex.replace("\\left", "\\big") tex = tex.replace("\\right", "\\big") tex = self._remove_stray_braces(tex) for context in ["array"]: begin_in = ("\\begin{%s}" % context) in tex # noqa: UP031 end_in = ("\\end{%s}" % context) in tex # noqa: UP031 if begin_in ^ end_in: # Just turn this into a blank string, # which means caller should leave a # stray \\begin{...} with other symbols tex = "" return tex def _remove_stray_braces(self, tex: str) -> str: r""" Makes :class:`~.MathTex` resilient to unmatched braces. This is important when the braces in the TeX code are spread over multiple arguments as in, e.g., ``MathTex(r"e^{i", r"\tau} = 1")``. """ # "\{" does not count (it's a brace literal), but "\\{" counts (it's a new line and then brace) num_lefts = tex.count("{") - tex.count("\\{") + tex.count("\\\\{") num_rights = tex.count("}") - tex.count("\\}") + tex.count("\\\\}") while num_rights > num_lefts: tex = "{" + tex num_lefts += 1 while num_lefts > num_rights: tex = tex + "}" num_rights += 1 return tex def _organize_submobjects_left_to_right(self) -> Self: self.sort(lambda p: p[0]) return self def get_tex_string(self) -> str: return self.tex_string def init_colors(self, propagate_colors: bool = True) -> Self: for submobject in self.submobjects: # needed to preserve original (non-black) # TeX colors of individual submobjects if submobject.color != BLACK: continue submobject.color = self.color if config.renderer == RendererType.OPENGL: submobject.init_colors() elif config.renderer == RendererType.CAIRO: submobject.init_colors(propagate_colors=propagate_colors) return self class MathTex(SingleStringMathTex): r"""A string compiled with LaTeX in math mode. Examples -------- .. manim:: Formula :save_last_frame: class Formula(Scene): def construct(self): t = MathTex(r"\int_a^b f'(x) dx = f(b)- f(a)") self.add(t) Notes ----- Double-brace notation ``{{ ... }}`` can be used to split a single string argument into multiple submobjects without having to pass separate strings:: MathTex(r"{{ a^2 }} + {{ b^2 }} = {{ c^2 }}") Each ``{{ ... }}`` group and every piece of text between groups becomes its own submobject, which is useful for :class:`~.TransformMatchingTex` animations. For ``{{`` to be recognised as a group opener it must appear either at the very start of the string or be immediately preceded by a whitespace character. ``{{`` that follows non-whitespace โ€” such as in ``\frac{{{n}}}{k}`` or ``a^{{2}}`` โ€” is left untouched, so ordinary nested-brace LaTeX is not accidentally split. To prevent an unintentional split, insert a space between the two braces: ``{{ ... }}`` โ†’ ``{ { ... } }``. Tests ----- Check that creating a :class:`~.MathTex` works:: >>> MathTex('a^2 + b^2 = c^2') # doctest: +SKIP MathTex('a^2 + b^2 = c^2') Check that double brace group splitting works correctly:: >>> t1 = MathTex('{{ a }} + {{ b }} = {{ c }}') # doctest: +SKIP >>> len(t1.submobjects) # doctest: +SKIP 5 >>> t2 = MathTex(r"\frac{1}{a+b\sqrt{2}}") # doctest: +SKIP >>> len(t2.submobjects) # doctest: +SKIP 1 """ def __init__( self, *tex_strings: str, arg_separator: str = " ", substrings_to_isolate: Iterable[str] | None = None, tex_to_color_map: dict[str, ParsableManimColor] | None = None, tex_environment: str | None = "align*", **kwargs: Any, ): self.tex_template = kwargs.pop("tex_template", config["tex_template"]) self.arg_separator = arg_separator self.substrings_to_isolate = ( [] if substrings_to_isolate is None else list(substrings_to_isolate) ) if tex_to_color_map is None: self.tex_to_color_map: dict[str, ParsableManimColor] = {} else: self.tex_to_color_map = tex_to_color_map self.substrings_to_isolate.extend(self.tex_to_color_map.keys()) self.tex_environment = tex_environment self.brace_notation_split_occurred = False self.tex_strings = self._prepare_tex_strings(tex_strings) self.matched_strings_and_ids: list[tuple[str, str]] = [] try: joined_string = self._join_tex_strings_with_unique_deliminters( self.tex_strings, self.substrings_to_isolate ) super().__init__( joined_string, tex_environment=self.tex_environment, tex_template=self.tex_template, **kwargs, ) # Save the original tex_string self.tex_string = self.arg_separator.join(self.tex_strings) self._break_up_by_substrings() except ValueError as compilation_error: if self.brace_notation_split_occurred: logger.error( dedent( """\ A group of double braces, {{ ... }}, was detected in your string. Manim splits TeX strings at the double braces, which might have caused the current compilation error. If you didn't use the double brace split intentionally, add spaces between the braces to avoid the automatic splitting: {{ ... }} --> { { ... } }. """, ), ) raise compilation_error self.set_color_by_tex_to_color_map(self.tex_to_color_map) if self.organize_left_to_right: self._organize_submobjects_left_to_right() def _prepare_tex_strings(self, tex_strings: Iterable[str]) -> list[str]: # Deal with the case where tex_strings contains integers instead # of strings. tex_strings_validated = [ string if isinstance(string, str) else str(string) for string in tex_strings ] # Locate double curly bracers and split on them. tex_strings_validated_two = [] for tex_string in tex_strings_validated: split = self._split_double_braces(tex_string) tex_strings_validated_two.extend(split) if len(tex_strings_validated_two) > len(tex_strings_validated): self.brace_notation_split_occurred = True return [string for string in tex_strings_validated_two if len(string) > 0] @staticmethod def _split_double_braces(tex_string: str) -> list[str]: r"""Split *tex_string* on Manim's ``{{ ... }}`` double-brace notation. Rules that avoid false positives on ordinary LaTeX source: * ``{{`` is only treated as a group opener when it appears at the very start of the string or is immediately preceded by a whitespace character. Naturally-occurring ``{{`` in LaTeX is usually preceded by non-whitespace (e.g. ``\frac{{{n}}}{k}`` or ``a^{{2}}``), so the whitespace guard eliminates the most common false positives without any brace-depth bookkeeping on the outer string. * Inside an open group the depth of *real* LaTeX braces is tracked. ``}}`` only closes the Manim group when the inner depth is zero, so ``{{ a^{b^{c}} }}`` is handled correctly. * Escape sequences are consumed as two-character units in priority order: ``\\`` first (escaped backslash), then ``\{`` / ``\}`` (escaped braces). This ensures e.g. ``\\}}`` is read as an escaped backslash followed by a real ``}}`` rather than as ``\`` + ``\}`` + lone ``}``. """ segments: list[str] = [] current = "" i = 0 inside_manim = False inner_depth = 0 while i < len(tex_string): # --- consume escape sequences as atomic units --- if tex_string[i] == "\\" and i + 1 < len(tex_string): next_ch = tex_string[i + 1] if next_ch == "\\" or next_ch in "{}": # \\ (escaped backslash) checked before \{ / \} so that # the second \ in \\ is never mistaken for an escape prefix. current += tex_string[i : i + 2] i += 2 continue if not inside_manim: # {{ opens a Manim group only at start-of-string or after whitespace. if tex_string[i : i + 2] == "{{" and ( i == 0 or tex_string[i - 1].isspace() ): segments.append(current) current = "" inside_manim = True inner_depth = 0 i += 2 else: current += tex_string[i] i += 1 else: if tex_string[i] == "{": inner_depth += 1 current += tex_string[i] i += 1 elif ( tex_string[i] == "}" and inner_depth == 0 and tex_string[i : i + 2] == "}}" ): # }} at inner depth 0 closes the Manim group. segments.append(current) current = "" inside_manim = False i += 2 elif tex_string[i] == "}": inner_depth -= 1 current += tex_string[i] i += 1 else: current += tex_string[i] i += 1 segments.append(current) return segments def _join_tex_strings_with_unique_deliminters( self, tex_strings: list[str], substrings_to_isolate: Iterable[str] ) -> str: joined_string = "" ssIdx = 0 for idx, tex_string in enumerate(tex_strings): string_part = rf"\special{{dvisvgm:raw }}" self.matched_strings_and_ids.append((tex_string, f"unique{idx:03d}")) # Try to match with all substrings_to_isolate and apply the first match # then match again (on the rest of the string) and continue until no # characters are left in the string unprocessed_string = str(tex_string) processed_string = "" while len(unprocessed_string) > 0: first_match = self._locate_first_match( substrings_to_isolate, unprocessed_string ) if first_match: processed, unprocessed_string = self._handle_match( ssIdx, first_match ) processed_string = processed_string + processed ssIdx += 1 else: processed_string = processed_string + unprocessed_string unprocessed_string = "" string_part += processed_string if idx < len(tex_strings) - 1: string_part += self.arg_separator string_part += r"\special{dvisvgm:raw }" joined_string = joined_string + string_part return joined_string def _locate_first_match( self, substrings_to_isolate: Iterable[str], unprocessed_string: str ) -> re.Match | None: first_match_start = len(unprocessed_string) first_match_length = 0 first_match = None for substring in substrings_to_isolate: match = re.match(f"(.*?)({re.escape(substring)})(.*)", unprocessed_string) if match and len(match.group(1)) < first_match_start: first_match = match first_match_start = len(match.group(1)) first_match_length = len(match.group(2)) elif match and len(match.group(1)) == first_match_start: # Break ties by looking at length of matches. if first_match_length < len(match.group(2)): first_match = match first_match_start = len(match.group(1)) first_match_length = len(match.group(2)) return first_match def _handle_match(self, ssIdx: int, first_match: re.Match) -> tuple[str, str]: pre_match = first_match.group(1) matched_string = first_match.group(2) post_match = first_match.group(3) pre_string = ( rf"\special{{dvisvgm:raw }}" ) post_string = r"\special{dvisvgm:raw }" self.matched_strings_and_ids.append( (matched_string, f"unique{ssIdx:03d}{MATHTEX_SUBSTRING}") ) processed_string = pre_match + pre_string + matched_string + post_string unprocessed_string = post_match return processed_string, unprocessed_string @property def _substring_matches(self) -> list[tuple[str, str]]: """Return only the 'ss' (substring_to_isolate) matches.""" return [ (tex, id_) for tex, id_ in self.matched_strings_and_ids if id_.endswith(MATHTEX_SUBSTRING) ] @property def _main_matches(self) -> list[tuple[str, str]]: """Return only the main tex_string matches.""" return [ (tex, id_) for tex, id_ in self.matched_strings_and_ids if not id_.endswith(MATHTEX_SUBSTRING) ] def _break_up_by_substrings(self) -> Self: """ Reorganize existing submobjects one layer deeper based on the structure of tex_strings (as a list of tex_strings) """ new_submobjects: list[VMobject] = [] try: for tex_string, tex_string_id in self._main_matches: mtp = MathTexPart() mtp.tex_string = tex_string mtp.add(*self.id_to_vgroup_dict[tex_string_id].submobjects) new_submobjects.append(mtp) except KeyError: logger.error( f"MathTex: Could not find SVG group for tex part '{tex_string}' (id: {tex_string_id}). Using fallback to root group." ) new_submobjects.append(self.id_to_vgroup_dict["root"]) self.submobjects = new_submobjects return self def get_part_by_tex(self, tex: str, **kwargs: Any) -> VGroup | None: for tex_str, match_id in self.matched_strings_and_ids: if tex_str == tex: return self.id_to_vgroup_dict[match_id] return None def set_color_by_tex( self, tex: str, color: ParsableManimColor, **kwargs: Any ) -> Self: for tex_str, match_id in self.matched_strings_and_ids: if tex_str == tex: self.id_to_vgroup_dict[match_id].set_color(color) return self def set_opacity_by_tex( self, tex: str, opacity: float = 0.5, remaining_opacity: float | None = None, **kwargs: Any, ) -> Self: """ Sets the opacity of the tex specified. If 'remaining_opacity' is specified, then the remaining tex will be set to that opacity. Parameters ---------- tex The tex to set the opacity of. opacity Default 0.5. The opacity to set the tex to remaining_opacity Default None. The opacity to set the remaining tex to. If None, then the remaining tex will not be changed """ if remaining_opacity is not None: self.set_opacity(opacity=remaining_opacity) for tex_str, match_id in self.matched_strings_and_ids: if tex_str == tex: self.id_to_vgroup_dict[match_id].set_opacity(opacity) return self def set_color_by_tex_to_color_map( self, texs_to_color_map: dict[str, ParsableManimColor], **kwargs: Any ) -> Self: for texs, color in list(texs_to_color_map.items()): for match in self.matched_strings_and_ids: if match[0] == texs: self.id_to_vgroup_dict[match[1]].set_color(color) return self def index_of_part(self, part: MathTex) -> int: split_self = self.split() if part not in split_self: raise ValueError("Trying to get index of part not in MathTex") return split_self.index(part) def sort_alphabetically(self) -> None: self.submobjects.sort(key=lambda m: m.get_tex_string()) class MathTexPart(VMobject, metaclass=ConvertToOpenGL): tex_string: str def __repr__(self) -> str: return f"{type(self).__name__}({repr(self.tex_string)})" class Tex(MathTex): r"""A string compiled with LaTeX in normal mode. The color can be set using the ``color`` argument. Any parts of the ``tex_string`` that are colored by the TeX commands ``\color`` or ``\textcolor`` will retain their original color. Tests ----- Check whether writing a LaTeX string works:: >>> Tex('The horse does not eat cucumber salad.') # doctest: +SKIP Tex('The horse does not eat cucumber salad.') """ def __init__( self, *tex_strings: str, arg_separator: str = "", tex_environment: str | None = "center", **kwargs: Any, ): super().__init__( *tex_strings, arg_separator=arg_separator, tex_environment=tex_environment, **kwargs, ) class BulletedList(Tex): """A bulleted list. Examples -------- .. manim:: BulletedListExample :save_last_frame: class BulletedListExample(Scene): def construct(self): blist = BulletedList("Item 1", "Item 2", "Item 3", height=2, width=2) blist.set_color_by_tex("Item 1", RED) blist.set_color_by_tex("Item 2", GREEN) blist.set_color_by_tex("Item 3", BLUE) self.add(blist) """ def __init__( self, *items: str, buff: float = MED_LARGE_BUFF, dot_scale_factor: float = 2, tex_environment: str | None = None, **kwargs: Any, ): self.buff = buff self.dot_scale_factor = dot_scale_factor self.tex_environment = tex_environment line_separated_items = [s + "\\\\" for s in items] super().__init__( *line_separated_items, tex_environment=tex_environment, **kwargs, ) for part in self: dot = MathTex("\\cdot").scale(self.dot_scale_factor) dot.next_to(part[0], LEFT, SMALL_BUFF) part.add_to_back(dot) self.arrange(DOWN, aligned_edge=LEFT, buff=self.buff) def fade_all_but(self, index_or_string: int | str, opacity: float = 0.5) -> None: arg = index_or_string if isinstance(arg, str): part: VGroup | VMobject | None = self.get_part_by_tex(arg) if part is None: raise Exception( f"Could not locate part by provided tex string '{arg}'." ) elif isinstance(arg, int): part = self.submobjects[arg] else: raise TypeError(f"Expected int or string, got {arg}") for other_part in self.submobjects: if other_part is part: other_part.set_fill(opacity=1) else: other_part.set_fill(opacity=opacity) class Title(Tex): """A mobject representing an underlined title. Examples -------- .. manim:: TitleExample :save_last_frame: import manim class TitleExample(Scene): def construct(self): banner = ManimBanner() title = Title(f"Manim version {manim.__version__}") self.add(banner, title) """ def __init__( self, *text_parts: str, include_underline: bool = True, match_underline_width_to_text: bool = False, underline_buff: float = MED_SMALL_BUFF, **kwargs: Any, ): self.include_underline = include_underline self.match_underline_width_to_text = match_underline_width_to_text self.underline_buff = underline_buff super().__init__(*text_parts, **kwargs) self.to_edge(UP) if self.include_underline: underline_width = config["frame_width"] - 2 underline = Line(LEFT, RIGHT) underline.next_to(self, DOWN, buff=self.underline_buff) if self.match_underline_width_to_text: underline.match_width(self) else: underline.width = underline_width self.add(underline) self.underline = underline ManimCommunity-manim-1157b74/manim/mobject/text/text_mobject.py000066400000000000000000001614471515024150700246210ustar00rootroot00000000000000"""Mobjects used for displaying (non-LaTeX) text. .. note:: Just as you can use :class:`~.Tex` and :class:`~.MathTex` (from the module :mod:`~.tex_mobject`) to insert LaTeX to your videos, you can use :class:`~.Text` to to add normal text. .. important:: See the corresponding tutorial :ref:`using-text-objects`, especially for information about fonts. The simplest way to add text to your animations is to use the :class:`~.Text` class. It uses the Pango library to render text. With Pango, you are also able to render non-English alphabets like `ไฝ ๅฅฝ` or `ใ“ใ‚“ใซใกใฏ` or `์•ˆ๋…•ํ•˜์„ธ์š”` or `ู…ุฑุญุจุง ุจุงู„ุนุงู„ู…`. Examples -------- .. manim:: HelloWorld :save_last_frame: class HelloWorld(Scene): def construct(self): text = Text('Hello world').scale(3) self.add(text) .. manim:: TextAlignment :save_last_frame: class TextAlignment(Scene): def construct(self): title = Text("K-means clustering and Logistic Regression", color=WHITE) title.scale(0.75) self.add(title.to_edge(UP)) t1 = Text("1. Measuring").set_color(WHITE) t2 = Text("2. Clustering").set_color(WHITE) t3 = Text("3. Regression").set_color(WHITE) t4 = Text("4. Prediction").set_color(WHITE) x = VGroup(t1, t2, t3, t4).arrange(direction=DOWN, aligned_edge=LEFT).scale(0.7).next_to(ORIGIN,DR) x.set_opacity(0.5) x.submobjects[1].set_opacity(1) self.add(x) """ from __future__ import annotations import functools __all__ = ["Text", "Paragraph", "MarkupText", "register_font"] import copy import hashlib import re from collections.abc import Iterable, Iterator, Sequence from contextlib import contextmanager from itertools import chain from pathlib import Path from typing import TYPE_CHECKING, Any import manimpango import numpy as np from manimpango import MarkupUtils, PangoUtils, TextSetting from manim import config, logger from manim.constants import * from manim.mobject.geometry.arc import Dot from manim.mobject.svg.svg_mobject import SVGMobject from manim.mobject.types.vectorized_mobject import VGroup, VMobject from manim.typing import Point3D from manim.utils.color import ManimColor, ParsableManimColor, color_gradient if TYPE_CHECKING: from typing import Self from manim.typing import Point3D TEXT_MOB_SCALE_FACTOR = 0.05 DEFAULT_LINE_SPACING_SCALE = 0.3 TEXT2SVG_ADJUSTMENT_FACTOR = 4.8 __all__ = ["Text", "Paragraph", "MarkupText", "register_font"] def remove_invisible_chars(mobject: VMobject) -> VMobject: """Function to remove unwanted invisible characters from some mobjects. Parameters ---------- mobject Any SVGMobject from which we want to remove unwanted invisible characters. Returns ------- :class:`~.SVGMobject` The SVGMobject without unwanted invisible characters. """ mobject_without_dots = VGroup() if isinstance(mobject[0], VGroup): for submob in mobject: mobject_without_dots.add( VGroup(k for k in submob if not isinstance(k, Dot)) ) else: mobject_without_dots.add(*(k for k in mobject if not isinstance(k, Dot))) return mobject_without_dots class Paragraph(VGroup): r"""Display a paragraph of text. For a given :class:`.Paragraph` ``par``, the attribute ``par.chars`` is a :class:`.VGroup` containing all the lines. In this context, every line is constructed as a :class:`.VGroup` of characters contained in the line. Parameters ---------- line_spacing Represents the spacing between lines. Defaults to -1, which means auto. alignment Defines the alignment of paragraph. Defaults to None. Possible values are "left", "right" or "center". Examples -------- Normal usage:: paragraph = Paragraph( "this is a awesome", "paragraph", "With \nNewlines", "\tWith Tabs", " With Spaces", "With Alignments", "center", "left", "right", ) Remove unwanted invisible characters:: self.play(Transform(remove_invisible_chars(paragraph.chars[0:2]), remove_invisible_chars(paragraph.chars[3][0:3])) """ def __init__( self, *text: str, line_spacing: float = -1, alignment: str | None = None, **kwargs: Any, ): self.line_spacing = line_spacing self.alignment = alignment self.consider_spaces_as_chars = kwargs.get("disable_ligatures", False) super().__init__() lines_str = "\n".join(list(text)) self.lines_text = Text(lines_str, line_spacing=line_spacing, **kwargs) lines_str_list = lines_str.split("\n") self.chars = self._gen_chars(lines_str_list) self.lines = [list(self.chars), [self.alignment] * len(self.chars)] self.lines_initial_positions = [line.get_center() for line in self.lines[0]] self.add(*self.lines[0]) self.move_to(np.array([0, 0, 0])) if self.alignment: self._set_all_lines_alignments(self.alignment) def _gen_chars(self, lines_str_list: list) -> VGroup: """Function to convert a list of plain strings to a VGroup of VGroups of chars. Parameters ---------- lines_str_list List of plain text strings. Returns ------- :class:`~.VGroup` The generated 2d-VGroup of chars. """ char_index_counter = 0 chars = self.get_group_class()() for line_no in range(len(lines_str_list)): line_str = lines_str_list[line_no] # Count all the characters in line_str # Spaces may or may not count as characters if self.consider_spaces_as_chars: char_count = len(line_str) else: char_count = 0 for char in line_str: if not char.isspace(): char_count += 1 chars.add(self.get_group_class()()) chars[line_no].add( *self.lines_text.chars[ char_index_counter : char_index_counter + char_count ] ) char_index_counter += char_count if self.consider_spaces_as_chars: # If spaces count as characters, count the extra \n character # which separates Paragraph's lines to avoid issues char_index_counter += 1 return chars def _set_all_lines_alignments(self, alignment: str) -> Paragraph: """Function to set all line's alignment to a specific value. Parameters ---------- alignment Defines the alignment of paragraph. Possible values are "left", "right", "center". """ for line_no in range(len(self.lines[0])): self._change_alignment_for_a_line(alignment, line_no) return self def _set_line_alignment(self, alignment: str, line_no: int) -> Paragraph: """Function to set one line's alignment to a specific value. Parameters ---------- alignment Defines the alignment of paragraph. Possible values are "left", "right", "center". line_no Defines the line number for which we want to set given alignment. """ self._change_alignment_for_a_line(alignment, line_no) return self def _set_all_lines_to_initial_positions(self) -> Paragraph: """Set all lines to their initial positions.""" self.lines[1] = [None] * len(self.lines[0]) for line_no in range(len(self.lines[0])): self[line_no].move_to( self.get_center() + self.lines_initial_positions[line_no], ) return self def _set_line_to_initial_position(self, line_no: int) -> Paragraph: """Function to set one line to initial positions. Parameters ---------- line_no Defines the line number for which we want to set given alignment. """ self.lines[1][line_no] = None self[line_no].move_to(self.get_center() + self.lines_initial_positions[line_no]) return self def _change_alignment_for_a_line(self, alignment: str, line_no: int) -> None: """Function to change one line's alignment to a specific value. Parameters ---------- alignment Defines the alignment of paragraph. Possible values are "left", "right", "center". line_no Defines the line number for which we want to set given alignment. """ self.lines[1][line_no] = alignment if self.lines[1][line_no] == "center": self[line_no].move_to( np.array([self.get_center()[0], self[line_no].get_center()[1], 0]), ) elif self.lines[1][line_no] == "right": self[line_no].move_to( np.array( [ self.get_right()[0] - self[line_no].width / 2, self[line_no].get_center()[1], 0, ], ), ) elif self.lines[1][line_no] == "left": self[line_no].move_to( np.array( [ self.get_left()[0] + self[line_no].width / 2, self[line_no].get_center()[1], 0, ], ), ) class Text(SVGMobject): r"""Display (non-LaTeX) text rendered using `Pango `_. Text objects behave like a :class:`.VGroup`-like iterable of all characters in the given text. In particular, slicing is possible. Parameters ---------- text The text that needs to be created as a mobject. font The font family to be used to render the text. This is either a system font or one loaded with `register_font()`. Note that font family names may be different across operating systems. warn_missing_font If True (default), Manim will issue a warning if the font does not exist in the (case-sensitive) list of fonts returned from `manimpango.list_fonts()`. Returns ------- :class:`Text` The mobject-like :class:`.VGroup`. Examples --------- .. manim:: Example1Text :save_last_frame: class Example1Text(Scene): def construct(self): text = Text('Hello world').scale(3) self.add(text) .. manim:: TextColorExample :save_last_frame: class TextColorExample(Scene): def construct(self): text1 = Text('Hello world', color=BLUE).scale(3) text2 = Text('Hello world', gradient=(BLUE, GREEN)).scale(3).next_to(text1, DOWN) self.add(text1, text2) .. manim:: TextItalicAndBoldExample :save_last_frame: class TextItalicAndBoldExample(Scene): def construct(self): text1 = Text("Hello world", slant=ITALIC) text2 = Text("Hello world", t2s={'world':ITALIC}) text3 = Text("Hello world", weight=BOLD) text4 = Text("Hello world", t2w={'world':BOLD}) text5 = Text("Hello world", t2c={'o':YELLOW}, disable_ligatures=True) text6 = Text( "Visit us at docs.manim.community", t2c={"docs.manim.community": YELLOW}, disable_ligatures=True, ) text6.scale(1.3).shift(DOWN) self.add(text1, text2, text3, text4, text5 , text6) Group(*self.mobjects).arrange(DOWN, buff=.8).set(height=config.frame_height-LARGE_BUFF) .. manim:: TextMoreCustomization :save_last_frame: class TextMoreCustomization(Scene): def construct(self): text1 = Text( 'Google', t2c={'[:1]': '#3174f0', '[1:2]': '#e53125', '[2:3]': '#fbb003', '[3:4]': '#3174f0', '[4:5]': '#269a43', '[5:]': '#e53125'}, font_size=58).scale(3) self.add(text1) As :class:`Text` uses Pango to render text, rendering non-English characters is easily possible: .. manim:: MultipleFonts :save_last_frame: class MultipleFonts(Scene): def construct(self): morning = Text("เฎตเฎฃเฎ•เฏเฎ•เฎฎเฏ", font="sans-serif") japanese = Text( "ๆ—ฅๆœฌใธใ‚ˆใ†ใ“ใ", t2c={"ๆ—ฅๆœฌ": BLUE} ) # works same as ``Text``. mess = Text("Multi-Language", weight=BOLD) russ = Text("ะ—ะดั€ะฐะฒัั‚ะฒัƒะนั‚ะต เคฎเคธ เคจเคฎ เคฎ ", font="sans-serif") hin = Text("เคจเคฎเคธเฅเคคเฅ‡", font="sans-serif") arb = Text( "ุตุจุงุญ ุงู„ุฎูŠุฑ \n ุชุดุฑูุช ุจู…ู‚ุงุจู„ุชูƒ", font="sans-serif" ) # don't mix RTL and LTR languages nothing shows up then ;-) chinese = Text("่‡‚็Œฟใ€Œ้ป›ๆฏ”ใ€ๅธถ่‘—ๅญฉๅญ", font="sans-serif") self.add(morning, japanese, mess, russ, hin, arb, chinese) for i,mobj in enumerate(self.mobjects): mobj.shift(DOWN*(i-3)) .. manim:: PangoRender :quality: low class PangoRender(Scene): def construct(self): morning = Text("เฎตเฎฃเฎ•เฏเฎ•เฎฎเฏ", font="sans-serif") self.play(Write(morning)) self.wait(2) Tests ----- Check that the creation of :class:`~.Text` works:: >>> Text('The horse does not eat cucumber salad.') Text('The horse does not eat cucumber salad.') """ @staticmethod @functools.cache def font_list() -> list[str]: value: list[str] = manimpango.list_fonts() return value def __init__( self, text: str, fill_opacity: float = 1.0, stroke_width: float = 0, color: ParsableManimColor | None = None, font_size: float = DEFAULT_FONT_SIZE, line_spacing: float = -1, font: str = "", slant: str = NORMAL, weight: str = NORMAL, t2c: dict[str, str] | None = None, t2f: dict[str, str] | None = None, t2g: dict[str, Iterable[ParsableManimColor]] | None = None, t2s: dict[str, str] | None = None, t2w: dict[str, str] | None = None, gradient: Iterable[ParsableManimColor] | None = None, tab_width: int = 4, warn_missing_font: bool = True, # Mobject height: float | None = None, width: float | None = None, should_center: bool = True, disable_ligatures: bool = False, use_svg_cache: bool = False, **kwargs: Any, ): self.line_spacing = line_spacing if font and warn_missing_font: fonts_list = Text.font_list() # handle special case of sans/sans-serif if font.lower() == "sans-serif": font = "sans" if font not in fonts_list: # check if the capitalized version is in the supported fonts if font.capitalize() in fonts_list: font = font.capitalize() elif font.lower() in fonts_list: font = font.lower() elif font.title() in fonts_list: font = font.title() else: logger.warning(f"Font {font} not in {fonts_list}.") self.font = font self._font_size = float(font_size) # needs to be a float or else size is inflated when font_size = 24 # (unknown cause) self.slant = slant self.weight = weight self.gradient = gradient self.tab_width = tab_width if t2c is None: t2c = {} if t2f is None: t2f = {} if t2g is None: t2g = {} if t2s is None: t2s = {} if t2w is None: t2w = {} # If long form arguments are present, they take precedence t2c = kwargs.pop("text2color", t2c) t2f = kwargs.pop("text2font", t2f) t2g = kwargs.pop("text2gradient", t2g) t2s = kwargs.pop("text2slant", t2s) t2w = kwargs.pop("text2weight", t2w) assert t2c is not None assert t2f is not None assert t2g is not None assert t2s is not None assert t2w is not None self.t2c: dict[str, str] = {k: ManimColor(v).to_hex() for k, v in t2c.items()} self.t2f: dict[str, str] = t2f self.t2g: dict[str, Iterable[ParsableManimColor]] = t2g self.t2s: dict[str, str] = t2s self.t2w: dict[str, str] = t2w self.original_text = text self.disable_ligatures = disable_ligatures text_without_tabs = text if text.find("\t") != -1: text_without_tabs = text.replace("\t", " " * self.tab_width) self.text = text_without_tabs if self.line_spacing == -1: self.line_spacing = ( self._font_size + self._font_size * DEFAULT_LINE_SPACING_SCALE ) else: self.line_spacing = self._font_size + self._font_size * self.line_spacing parsed_color: ManimColor = ManimColor(color) if color else VMobject().color file_name = self._text2svg(parsed_color.to_hex()) PangoUtils.remove_last_M(file_name) super().__init__( file_name, fill_opacity=fill_opacity, stroke_width=stroke_width, height=height, width=width, should_center=should_center, use_svg_cache=use_svg_cache, **kwargs, ) self.text = text if self.disable_ligatures: self.submobjects = [*self._gen_chars()] self.chars = self.get_group_class()(*self.submobjects) self.text = text_without_tabs.replace(" ", "").replace("\n", "") nppc = self.n_points_per_curve for each in self: if len(each.points) == 0: continue points = each.points curve_start = points[0] assert len(curve_start) == self.dim, curve_start # Some of the glyphs in this text might not be closed, # so we close them by identifying when one curve ends # but it is not where the next curve starts. # It is more efficient to temporarily create a list # of points and add them one at a time, then turn them # into a numpy array at the end, rather than creating # new numpy arrays every time a point or fixing line # is added (which is O(n^2) for numpy arrays). closed_curve_points: list[Point3D] = [] # OpenGL has points be part of quadratic Bezier curves; # Cairo uses cubic Bezier curves. if nppc == 3: # RendererType.OPENGL def add_line_to(end: Point3D) -> None: nonlocal closed_curve_points start = closed_curve_points[-1] closed_curve_points += [ start, (start + end) / 2, end, ] else: # RendererType.CAIRO def add_line_to(end: Point3D) -> None: nonlocal closed_curve_points start = closed_curve_points[-1] closed_curve_points += [ start, (start + start + end) / 3, (start + end + end) / 3, end, ] for index, point in enumerate(points): closed_curve_points.append(point) if ( index != len(points) - 1 and (index + 1) % nppc == 0 and any(point != points[index + 1]) ): # Add straight line from last point on this curve to the # start point on the next curve. We represent the line # as a cubic bezier curve where the two control points # are half-way between the start and stop point. add_line_to(curve_start) curve_start = points[index + 1] # Make sure last curve is closed add_line_to(curve_start) each.points = np.array(closed_curve_points, ndmin=2) # anti-aliasing if height is None and width is None: self.scale(TEXT_MOB_SCALE_FACTOR) self.initial_height = self.height def __repr__(self) -> str: return f"Text({repr(self.original_text)})" @property def font_size(self) -> float: return ( self.height / self.initial_height / TEXT_MOB_SCALE_FACTOR * 2.4 * self._font_size / DEFAULT_FONT_SIZE ) @font_size.setter def font_size(self, font_val: float) -> None: # TODO: use pango's font size scaling. if font_val <= 0: raise ValueError("font_size must be greater than 0.") else: self.scale(font_val / self.font_size) def _gen_chars(self) -> VGroup: chars = self.get_group_class()() submobjects_char_index = 0 for char_index in range(len(self.text)): if self.text[char_index].isspace(): space = Dot(radius=0, fill_opacity=0, stroke_opacity=0) if char_index == 0: space.move_to(self.submobjects[submobjects_char_index].get_center()) else: space.move_to( self.submobjects[submobjects_char_index - 1].get_center(), ) chars.add(space) else: chars.add(self.submobjects[submobjects_char_index]) submobjects_char_index += 1 return chars def _find_indexes(self, word: str, text: str) -> list[tuple[int, int]]: """Finds the indexes of ``text`` in ``word``.""" temp = re.match(r"\[([0-9\-]{0,}):([0-9\-]{0,})\]", word) if temp: start = int(temp.group(1)) if temp.group(1) != "" else 0 end = int(temp.group(2)) if temp.group(2) != "" else len(text) start = len(text) + start if start < 0 else start end = len(text) + end if end < 0 else end return [ (start, end), ] indexes = [] index = text.find(word) while index != -1: indexes.append((index, index + len(word))) index = text.find(word, index + len(word)) return indexes def _text2hash(self, color: ParsableManimColor) -> str: """Generates ``sha256`` hash for file name.""" settings = ( "PANGO" + self.font + self.slant + self.weight + str(color) ) # to differentiate Text and CairoText settings += str(self.t2f) + str(self.t2s) + str(self.t2w) + str(self.t2c) settings += str(self.line_spacing) + str(self._font_size) settings += str(self.disable_ligatures) settings += str(self.gradient) id_str = self.text + settings hasher = hashlib.sha256() hasher.update(id_str.encode()) return hasher.hexdigest()[:16] def _merge_settings( self, left_setting: TextSetting, right_setting: TextSetting, default_args: dict[str, Iterable[str]], ) -> TextSetting: contained = right_setting.end < left_setting.end new_setting = copy.copy(left_setting) if contained else copy.copy(right_setting) new_setting.start = right_setting.end if contained else left_setting.end left_setting.end = right_setting.start if not contained: right_setting.end = new_setting.start for arg in default_args: left = getattr(left_setting, arg) right = getattr(right_setting, arg) default = default_args[arg] if left != default and getattr(right_setting, arg) != default: raise ValueError( f"Ambiguous style for text '{self.text[right_setting.start : right_setting.end]}':" + f"'{arg}' cannot be both '{left}' and '{right}'." ) setattr(right_setting, arg, left if left != default else right) return new_setting def _get_settings_from_t2xs( self, t2xs: Sequence[tuple[dict[str, str], str]], default_args: dict[str, Iterable[str]], ) -> list[TextSetting]: settings = [] t2xwords = set(chain(*([*t2x.keys()] for t2x, _ in t2xs))) for word in t2xwords: setting_args = { arg: str(t2x[word]) if word in t2x else default_args[arg] # NOTE: when t2x[word] is a ManimColor, str will yield the # hex representation for t2x, arg in t2xs } for start, end in self._find_indexes(word, self.text): settings.append(TextSetting(start, end, **setting_args)) return settings def _get_settings_from_gradient( self, default_args: dict[str, Any] ) -> list[TextSetting]: settings = [] args = copy.copy(default_args) if self.gradient: colors: list[ManimColor] = color_gradient(self.gradient, len(self.text)) for i in range(len(self.text)): args["color"] = colors[i].to_hex() settings.append(TextSetting(i, i + 1, **args)) for word, gradient in self.t2g.items(): colors = color_gradient(gradient, len(word)) for start, end in self._find_indexes(word, self.text): for i in range(start, end): args["color"] = colors[i - start].to_hex() settings.append(TextSetting(i, i + 1, **args)) return settings def _text2settings(self, color: ParsableManimColor) -> list[TextSetting]: """Converts the texts and styles to a setting for parsing.""" t2xs: list[tuple[dict[str, str], str]] = [ (self.t2f, "font"), (self.t2s, "slant"), (self.t2w, "weight"), (self.t2c, "color"), ] # setting_args requires values to be strings default_args: dict[str, Any] = { arg: getattr(self, arg) if arg != "color" else color for _, arg in t2xs } settings = self._get_settings_from_t2xs(t2xs, default_args) settings.extend(self._get_settings_from_gradient(default_args)) # Handle overlaps settings.sort(key=lambda setting: setting.start) for index, setting in enumerate(settings): if index + 1 == len(settings): break next_setting = settings[index + 1] if setting.end > next_setting.start: new_setting = self._merge_settings(setting, next_setting, default_args) new_index = index + 1 while ( new_index < len(settings) and settings[new_index].start < new_setting.start ): new_index += 1 settings.insert(new_index, new_setting) # Set all text settings (default font, slant, weight) temp_settings = settings.copy() start = 0 for setting in settings: if setting.start != start: temp_settings.append(TextSetting(start, setting.start, **default_args)) start = setting.end if start != len(self.text): temp_settings.append(TextSetting(start, len(self.text), **default_args)) settings = sorted(temp_settings, key=lambda setting: setting.start) line_num = 0 if re.search(r"\n", self.text): for for_start, for_end in self._find_indexes("\n", self.text): for setting in settings: if setting.line_num == -1: setting.line_num = line_num if for_start < setting.end: line_num += 1 new_setting = copy.copy(setting) setting.end = for_end new_setting.start = for_end new_setting.line_num = line_num settings.append(new_setting) settings.sort(key=lambda setting: setting.start) break for setting in settings: if setting.line_num == -1: setting.line_num = line_num return settings def _text2svg(self, color: ParsableManimColor) -> str: """Convert the text to SVG using Pango.""" size = self._font_size line_spacing = self.line_spacing size /= TEXT2SVG_ADJUSTMENT_FACTOR line_spacing /= TEXT2SVG_ADJUSTMENT_FACTOR dir_name = config.get_dir("text_dir") dir_name.mkdir(parents=True, exist_ok=True) hash_name = self._text2hash(color) file_name = dir_name / (hash_name + ".svg") if file_name.exists(): svg_file = str(file_name.resolve()) else: settings = self._text2settings(color) width = config["pixel_width"] height = config["pixel_height"] svg_file = manimpango.text2svg( settings, size, line_spacing, self.disable_ligatures, str(file_name.resolve()), START_X, START_Y, width, height, self.text, ) return svg_file def init_colors(self, propagate_colors: bool = True) -> Self: if config.renderer == RendererType.OPENGL: super().init_colors() elif config.renderer == RendererType.CAIRO: super().init_colors(propagate_colors=propagate_colors) return self class MarkupText(SVGMobject): r"""Display (non-LaTeX) text rendered using `Pango `_. Text objects behave like a :class:`.VGroup`-like iterable of all characters in the given text. In particular, slicing is possible. **What is PangoMarkup?** PangoMarkup is a small markup language like html and it helps you avoid using "range of characters" while coloring or styling a piece a Text. You can use this language with :class:`~.MarkupText`. A simple example of a marked-up string might be:: Blue text is cool!" and it can be used with :class:`~.MarkupText` as .. manim:: MarkupExample :save_last_frame: class MarkupExample(Scene): def construct(self): text = MarkupText('Blue text is cool!"') self.add(text) A more elaborate example would be: .. manim:: MarkupElaborateExample :save_last_frame: class MarkupElaborateExample(Scene): def construct(self): text = MarkupText( 'ุงูŽ' 'ู„ู’ุนูŽุฑ' 'ูŽุจููŠ' 'ู‘ูŽุฉ' 'ู' ) self.add(text) PangoMarkup can also contain XML features such as numeric character entities such as ``©`` for ยฉ can be used too. The most general markup tag is ````, then there are some convenience tags. Here is a list of supported tags: - ``bold``, ``italic`` and ``bold+italic`` - ``underline`` and ``strike through`` - ``typewriter font`` - ``bigger font`` and ``smaller font`` - ``superscript`` and ``subscript`` - ``double underline`` - ``error underline`` - ``overline`` - ``strikethrough`` - ``temporary change of font`` - ``temporary change of color`` - ``temporary change of color`` - ``temporary gradient`` For ```` markup, colors can be specified either as hex triples like ``#aabbcc`` or as named CSS colors like ``AliceBlue``. The ```` tag is handled by Manim rather than Pango, and supports hex triplets or Manim constants like ``RED`` or ``RED_A``. If you want to use Manim constants like ``RED_A`` together with ````, you will need to use Python's f-String syntax as follows:: MarkupText(f'here you go') If your text contains ligatures, the :class:`MarkupText` class may incorrectly determine the first and last letter when creating the gradient. This is due to the fact that ``fl`` are two separate characters, but might be set as one single glyph - a ligature. If your language does not depend on ligatures, consider setting ``disable_ligatures`` to ``True``. If you must use ligatures, the ``gradient`` tag supports an optional attribute ``offset`` which can be used to compensate for that error. For example: - ``example`` to *start* the gradient one letter earlier - ``example`` to *end* the gradient one letter earlier - ``example`` to *start* the gradient two letters earlier and *end* it one letter earlier Specifying a second offset may be necessary if the text to be colored does itself contain ligatures. The same can happen when using HTML entities for special chars. When using ``underline``, ``overline`` or ``strikethrough`` together with ```` tags, you will also need to use the offset, because underlines are additional paths in the final :class:`SVGMobject`. Check out the following example. Escaping of special characters: ``>`` **should** be written as ``>`` whereas ``<`` and ``&`` *must* be written as ``<`` and ``&``. You can find more information about Pango markup formatting at the corresponding documentation page: `Pango Markup `_. Please be aware that not all features are supported by this class and that the ```` tag mentioned above is not supported by Pango. Parameters ---------- text The text that needs to be created as mobject. fill_opacity The fill opacity, with 1 meaning opaque and 0 meaning transparent. stroke_width Stroke width. font_size Font size. line_spacing Line spacing. font Global font setting for the entire text. Local overrides are possible. slant Global slant setting, e.g. `NORMAL` or `ITALIC`. Local overrides are possible. weight Global weight setting, e.g. `NORMAL` or `BOLD`. Local overrides are possible. gradient Global gradient setting. Local overrides are possible. warn_missing_font If True (default), Manim will issue a warning if the font does not exist in the (case-sensitive) list of fonts returned from `manimpango.list_fonts()`. Returns ------- :class:`MarkupText` The text displayed in form of a :class:`.VGroup`-like mobject. Examples --------- .. manim:: BasicMarkupExample :save_last_frame: class BasicMarkupExample(Scene): def construct(self): text1 = MarkupText("foo bar foobar") text2 = MarkupText("foo bar big small") text3 = MarkupText("H2O and H3O+") text4 = MarkupText("type help for help") text5 = MarkupText( 'foo bar' ) group = VGroup(text1, text2, text3, text4, text5).arrange(DOWN) self.add(group) .. manim:: ColorExample :save_last_frame: class ColorExample(Scene): def construct(self): text1 = MarkupText( f'all in red except this', color=RED ) text2 = MarkupText("nice gradient", gradient=(BLUE, GREEN)) text3 = MarkupText( 'nice intermediate gradient', gradient=(BLUE, GREEN), ) text4 = MarkupText( 'fl ligature causing trouble here' ) text5 = MarkupText( 'fl ligature defeated with offset' ) text6 = MarkupText( 'fl ligature floating inside' ) text7 = MarkupText( 'fl ligature floating inside' ) group = VGroup(text1, text2, text3, text4, text5, text6, text7).arrange(DOWN) self.add(group) .. manim:: UnderlineExample :save_last_frame: class UnderlineExample(Scene): def construct(self): text1 = MarkupText( 'bla' ) text2 = MarkupText( 'xxxaabby' ) text3 = MarkupText( 'xxxaabby' ) text4 = MarkupText( 'xxxaabby' ) text5 = MarkupText( 'xxxaabby' ) group = VGroup(text1, text2, text3, text4, text5).arrange(DOWN) self.add(group) .. manim:: FontExample :save_last_frame: class FontExample(Scene): def construct(self): text1 = MarkupText( 'all in sans except this', font="sans" ) text2 = MarkupText( 'mixing fonts is ugly' ) text3 = MarkupText("special char > or >") text4 = MarkupText("special char < and &") group = VGroup(text1, text2, text3, text4).arrange(DOWN) self.add(group) .. manim:: NewlineExample :save_last_frame: class NewlineExample(Scene): def construct(self): text = MarkupText('foooooo\nbaaaar') self.add(text) .. manim:: NoLigaturesExample :save_last_frame: class NoLigaturesExample(Scene): def construct(self): text1 = MarkupText('floating') text2 = MarkupText('floating', disable_ligatures=True) group = VGroup(text1, text2).arrange(DOWN) self.add(group) As :class:`MarkupText` uses Pango to render text, rendering non-English characters is easily possible: .. manim:: MultiLanguage :save_last_frame: class MultiLanguage(Scene): def construct(self): morning = MarkupText("เฎตเฎฃเฎ•เฏเฎ•เฎฎเฏ", font="sans-serif") japanese = MarkupText( 'ๆ—ฅๆœฌใธใ‚ˆใ†ใ“ใ' ) # works as in ``Text``. mess = MarkupText("Multi-Language", weight=BOLD) russ = MarkupText("ะ—ะดั€ะฐะฒัั‚ะฒัƒะนั‚ะต เคฎเคธ เคจเคฎ เคฎ ", font="sans-serif") hin = MarkupText("เคจเคฎเคธเฅเคคเฅ‡", font="sans-serif") chinese = MarkupText("่‡‚็Œฟใ€Œ้ป›ๆฏ”ใ€ๅธถ่‘—ๅญฉๅญ", font="sans-serif") group = VGroup(morning, japanese, mess, russ, hin, chinese).arrange(DOWN) self.add(group) You can justify the text by passing :attr:`justify` parameter. .. manim:: JustifyText class JustifyText(Scene): def construct(self): ipsum_text = ( "Lorem ipsum dolor sit amet, consectetur adipiscing elit." "Praesent feugiat metus sit amet iaculis pulvinar. Nulla posuere " "quam a ex aliquam, eleifend consectetur tellus viverra. Aliquam " "fermentum interdum justo, nec rutrum elit pretium ac. Nam quis " "leo pulvinar, dignissim est at, venenatis nisi." ) justified_text = MarkupText(ipsum_text, justify=True).scale(0.4) not_justified_text = MarkupText(ipsum_text, justify=False).scale(0.4) just_title = Title("Justified") njust_title = Title("Not Justified") self.add(njust_title, not_justified_text) self.play( FadeOut(not_justified_text), FadeIn(justified_text), FadeOut(njust_title), FadeIn(just_title), ) self.wait(1) Tests ----- Check that the creation of :class:`~.MarkupText` works:: >>> MarkupText('The horse does not eat cucumber salad.') MarkupText('The horse does not eat cucumber salad.') """ @staticmethod @functools.cache def font_list() -> list[str]: value: list[str] = manimpango.list_fonts() return value def __init__( self, text: str, fill_opacity: float = 1, stroke_width: float = 0, color: ParsableManimColor | None = None, font_size: float = DEFAULT_FONT_SIZE, line_spacing: float = -1, font: str = "", slant: str = NORMAL, weight: str = NORMAL, justify: bool = False, gradient: Iterable[ParsableManimColor] | None = None, tab_width: int = 4, height: int | None = None, width: int | None = None, should_center: bool = True, disable_ligatures: bool = False, warn_missing_font: bool = True, **kwargs: Any, ): self.text = text self.line_spacing: float = line_spacing if font and warn_missing_font: fonts_list = Text.font_list() # handle special case of sans/sans-serif if font.lower() == "sans-serif": font = "sans" if font not in fonts_list: # check if the capitalized version is in the supported fonts if font.capitalize() in fonts_list: font = font.capitalize() elif font.lower() in fonts_list: font = font.lower() elif font.title() in fonts_list: font = font.title() else: logger.warning(f"Font {font} not in {fonts_list}.") self.font = font self._font_size = float(font_size) self.slant = slant self.weight = weight self.gradient = gradient self.tab_width = tab_width self.justify = justify self.original_text = text self.disable_ligatures = disable_ligatures text_without_tabs = text if "\t" in text: text_without_tabs = text.replace("\t", " " * self.tab_width) colormap = self._extract_color_tags() if len(colormap) > 0: logger.warning( 'Using tags in MarkupText is deprecated. Please use instead.', ) gradientmap = self._extract_gradient_tags() validate_error = MarkupUtils.validate(self.text) if validate_error: raise ValueError(validate_error) if self.line_spacing == -1: self.line_spacing = ( self._font_size + self._font_size * DEFAULT_LINE_SPACING_SCALE ) else: self.line_spacing = self._font_size + self._font_size * self.line_spacing parsed_color: ManimColor = ManimColor(color) if color else VMobject().color file_name = self._text2svg(parsed_color) PangoUtils.remove_last_M(file_name) super().__init__( file_name, fill_opacity=fill_opacity, stroke_width=stroke_width, height=height, width=width, should_center=should_center, **kwargs, ) self.chars = self.get_group_class()(*self.submobjects) self.text = text_without_tabs.replace(" ", "").replace("\n", "") nppc = self.n_points_per_curve for each in self: if len(each.points) == 0: continue points = each.points curve_start = points[0] assert len(curve_start) == self.dim, curve_start # Some of the glyphs in this text might not be closed, # so we close them by identifying when one curve ends # but it is not where the next curve starts. # It is more efficient to temporarily create a list # of points and add them one at a time, then turn them # into a numpy array at the end, rather than creating # new numpy arrays every time a point or fixing line # is added (which is O(n^2) for numpy arrays). closed_curve_points: list[Point3D] = [] # OpenGL has points be part of quadratic Bezier curves; # Cairo uses cubic Bezier curves. if nppc == 3: # RendererType.OPENGL def add_line_to(end: Point3D) -> None: nonlocal closed_curve_points start = closed_curve_points[-1] closed_curve_points += [ start, (start + end) / 2, end, ] else: # RendererType.CAIRO def add_line_to(end: Point3D) -> None: nonlocal closed_curve_points start = closed_curve_points[-1] closed_curve_points += [ start, (start + start + end) / 3, (start + end + end) / 3, end, ] for index, point in enumerate(points): closed_curve_points.append(point) if ( index != len(points) - 1 and (index + 1) % nppc == 0 and any(point != points[index + 1]) ): # Add straight line from last point on this curve to the # start point on the next curve. add_line_to(curve_start) curve_start = points[index + 1] # Make sure last curve is closed add_line_to(curve_start) each.points = np.array(closed_curve_points, ndmin=2) if self.gradient: self.set_color_by_gradient(*self.gradient) for col in colormap: self.chars[ col["start"] - col["start_offset"] : col["end"] - col["start_offset"] - col["end_offset"] ].set_color(self._parse_color(col["color"])) for grad in gradientmap: self.chars[ grad["start"] - grad["start_offset"] : grad["end"] - grad["start_offset"] - grad["end_offset"] ].set_color_by_gradient( *(self._parse_color(grad["from"]), self._parse_color(grad["to"])) ) # anti-aliasing if height is None and width is None: self.scale(TEXT_MOB_SCALE_FACTOR) self.initial_height = self.height @property def font_size(self) -> float: return ( self.height / self.initial_height / TEXT_MOB_SCALE_FACTOR * 2.4 * self._font_size / DEFAULT_FONT_SIZE ) @font_size.setter def font_size(self, font_val: float) -> None: # TODO: use pango's font size scaling. if font_val <= 0: raise ValueError("font_size must be greater than 0.") else: self.scale(font_val / self.font_size) def _text2hash(self, color: ParsableManimColor) -> str: """Generates ``sha256`` hash for file name.""" settings = ( "MARKUPPANGO" + self.font + self.slant + self.weight + ManimColor(color).to_hex().lower() ) # to differentiate from classical Pango Text settings += str(self.line_spacing) + str(self._font_size) settings += str(self.disable_ligatures) settings += str(self.justify) id_str = self.text + settings hasher = hashlib.sha256() hasher.update(id_str.encode()) return hasher.hexdigest()[:16] def _text2svg(self, color: ParsableManimColor | None) -> str: """Convert the text to SVG using Pango.""" color = ManimColor(color) size = self._font_size line_spacing: float = self.line_spacing size /= TEXT2SVG_ADJUSTMENT_FACTOR line_spacing /= TEXT2SVG_ADJUSTMENT_FACTOR dir_name = config.get_dir("text_dir") dir_name.mkdir(parents=True, exist_ok=True) hash_name = self._text2hash(color) file_name = dir_name / (hash_name + ".svg") if file_name.exists(): svg_file: str = str(file_name.resolve()) else: final_text = ( f'{self.text}' if color is not None else self.text ) logger.debug(f"Setting Text {self.text}") svg_file = MarkupUtils.text2svg( final_text, self.font, self.slant, self.weight, size, line_spacing, self.disable_ligatures, str(file_name.resolve()), START_X, START_Y, 600, # width 400, # height justify=self.justify, pango_width=500, ) return svg_file def _count_real_chars(self, s: str) -> int: """Counts characters that will be displayed. This is needed for partial coloring or gradients, because space counts to the text's `len`, but has no corresponding character. """ count = 0 level = 0 # temporarily replace HTML entities by single char s = re.sub("&[^;]+;", "x", s) for c in s: if c == "<": level += 1 if c == ">" and level > 0: level -= 1 elif c != " " and c != "\t" and level == 0: count += 1 return count def _extract_gradient_tags(self) -> list[dict[str, Any]]: """Used to determine which parts (if any) of the string should be formatted with a gradient. Removes the ```` tag, as it is not part of Pango's markup and would cause an error. """ tags = re.finditer( r'(.+?)', self.original_text, re.S, ) gradientmap: list[dict[str, Any]] = [] for tag in tags: start = self._count_real_chars(self.original_text[: tag.start(0)]) end = start + self._count_real_chars(tag.group(5)) offsets = tag.group(4).split(",") if tag.group(4) else [0] start_offset = int(offsets[0]) if offsets[0] else 0 end_offset = int(offsets[1]) if len(offsets) == 2 and offsets[1] else 0 gradientmap.append( { "start": start, "end": end, "from": tag.group(1), "to": tag.group(2), "start_offset": start_offset, "end_offset": end_offset, }, ) self.text = re.sub( "]+>(.+?)", r"\1", self.text, count=0, flags=re.S ) return gradientmap def _parse_color(self, col: str) -> str: """Parse color given in ```` or ```` tags.""" if re.match("#[0-9a-f]{6}", col): return col else: return ManimColor(col).to_hex() def _extract_color_tags(self) -> list[dict[str, Any]]: """Used to determine which parts (if any) of the string should be formatted with a custom color. Removes the ```` tag, as it is not part of Pango's markup and would cause an error. Note: Using the ```` tags is deprecated. As soon as the legacy syntax is gone, this function will be removed. """ tags = re.finditer( r'(.+?)', self.original_text, re.S, ) colormap: list[dict[str, Any]] = [] for tag in tags: start = self._count_real_chars(self.original_text[: tag.start(0)]) end = start + self._count_real_chars(tag.group(4)) offsets = tag.group(3).split(",") if tag.group(3) else [0] start_offset = int(offsets[0]) if offsets[0] else 0 end_offset = int(offsets[1]) if len(offsets) == 2 and offsets[1] else 0 colormap.append( { "start": start, "end": end, "color": tag.group(1), "start_offset": start_offset, "end_offset": end_offset, }, ) self.text = re.sub( "]+>(.+?)", r"\1", self.text, count=0, flags=re.S ) return colormap def __repr__(self) -> str: return f"MarkupText({repr(self.original_text)})" @contextmanager def register_font(font_file: str | Path) -> Iterator[None]: """Temporarily add a font file to Pango's search path. This searches for the font_file at various places. The order it searches it described below. 1. Absolute path. 2. In ``assets/fonts`` folder. 3. In ``font/`` folder. 4. In the same directory. Parameters ---------- font_file The font file to add. Examples -------- Use ``with register_font(...)`` to add a font file to search path. .. code-block:: python with register_font("path/to/font_file.ttf"): a = Text("Hello", font="Custom Font Name") Raises ------ FileNotFoundError: If the font doesn't exists. AttributeError: If this method is used on macOS. .. important :: This method is available for macOS for ``ManimPango>=v0.2.3``. Using this method with previous releases will raise an :class:`AttributeError` on macOS. """ input_folder = Path(config.input_file).parent.resolve() possible_paths = [ Path(font_file), input_folder / "assets/fonts" / font_file, input_folder / "fonts" / font_file, input_folder / font_file, ] for path in possible_paths: path = path.resolve() if path.exists(): file_path = path logger.debug("Found file at %s", file_path.absolute()) break else: error = f"Can't find {font_file}. Checked paths: {possible_paths}" raise FileNotFoundError(error) try: assert manimpango.register_font(str(file_path)) yield finally: manimpango.unregister_font(str(file_path)) ManimCommunity-manim-1157b74/manim/mobject/three_d/000077500000000000000000000000001515024150700221715ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/mobject/three_d/__init__.py000066400000000000000000000002321515024150700242770ustar00rootroot00000000000000"""Three-dimensional mobjects. Modules ======= .. autosummary:: :toctree: ../reference ~polyhedra ~three_d_utils ~three_dimensions """ ManimCommunity-manim-1157b74/manim/mobject/three_d/polyhedra.py000066400000000000000000000364761515024150700245520ustar00rootroot00000000000000"""General polyhedral class and platonic solids.""" from __future__ import annotations from collections.abc import Hashable from typing import TYPE_CHECKING, Any import numpy as np from manim.mobject.geometry.polygram import Polygon from manim.mobject.graph import Graph from manim.mobject.three_d.three_dimensions import Dot3D from manim.mobject.types.vectorized_mobject import VGroup from manim.utils.qhull import QuickHull if TYPE_CHECKING: from manim.mobject.mobject import Mobject from manim.typing import Point3D, Point3DLike_Array __all__ = [ "Polyhedron", "Tetrahedron", "Octahedron", "Icosahedron", "Dodecahedron", "ConvexHull3D", ] class Polyhedron(VGroup): """An abstract polyhedra class. In this implementation, polyhedra are defined with a list of vertex coordinates in space, and a list of faces. This implementation mirrors that of a standard polyhedral data format (OFF, object file format). Parameters ---------- vertex_coords A list of coordinates of the corresponding vertices in the polyhedron. Each coordinate will correspond to a vertex. The vertices are indexed with the usual indexing of Python. faces_list A list of faces. Each face is a sublist containing the indices of the vertices that form the corners of that face. faces_config Configuration for the polygons representing the faces of the polyhedron. graph_config Configuration for the graph containing the vertices and edges of the polyhedron. Examples -------- To understand how to create a custom polyhedra, let's use the example of a rather simple one - a square pyramid. .. manim:: SquarePyramidScene :save_last_frame: class SquarePyramidScene(ThreeDScene): def construct(self): self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) vertex_coords = [ [1, 1, 0], [1, -1, 0], [-1, -1, 0], [-1, 1, 0], [0, 0, 2] ] faces_list = [ [0, 1, 4], [1, 2, 4], [2, 3, 4], [3, 0, 4], [0, 1, 2, 3] ] pyramid = Polyhedron(vertex_coords, faces_list) self.add(pyramid) In defining the polyhedron above, we first defined the coordinates of the vertices. These are the corners of the square base, given as the first four coordinates in the vertex list, and the apex, the last coordinate in the list. Next, we define the faces of the polyhedron. The triangular surfaces of the pyramid are polygons with two adjacent vertices in the base and the vertex at the apex as corners. We thus define these surfaces in the first four elements of our face list. The last element defines the base of the pyramid. The graph and faces of polyhedra can also be accessed and modified directly, after instantiation. They are stored in the `graph` and `faces` attributes respectively. .. manim:: PolyhedronSubMobjects :save_last_frame: class PolyhedronSubMobjects(ThreeDScene): def construct(self): self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) octahedron = Octahedron(edge_length = 3) octahedron.graph[0].set_color(RED) octahedron.faces[2].set_color(YELLOW) self.add(octahedron) """ def __init__( self, vertex_coords: Point3DLike_Array, faces_list: list[list[int]], faces_config: dict[str, str | int | float | bool] = {}, graph_config: dict[str, Any] = {}, ): super().__init__() self.faces_config = dict( {"fill_opacity": 0.5, "shade_in_3d": True}, **faces_config ) self.graph_config = dict( { "vertex_type": Dot3D, "edge_config": { "stroke_opacity": 0, # I find that having the edges visible makes the polyhedra look weird }, }, **graph_config, ) self.vertex_coords = vertex_coords self.vertex_indices = list(range(len(self.vertex_coords))) self.layout: dict[Hashable, Any] = dict(enumerate(self.vertex_coords)) self.faces_list = faces_list self.face_coords = [[self.layout[j] for j in i] for i in faces_list] self.edges = self.get_edges(self.faces_list) self.faces = self.create_faces(self.face_coords) self.graph = Graph( self.vertex_indices, self.edges, layout=self.layout, **self.graph_config ) self.add(self.faces, self.graph) self.add_updater(self.update_faces) def get_edges(self, faces_list: list[list[int]]) -> list[tuple[int, int]]: """Creates list of cyclic pairwise tuples.""" edges: list[tuple[int, int]] = [] for face in faces_list: edges += zip(face, face[1:] + face[:1], strict=True) return edges def create_faces( self, face_coords: Point3DLike_Array, ) -> VGroup: """Creates VGroup of faces from a list of face coordinates.""" face_group = VGroup() for face in face_coords: face_group.add(Polygon(*face, **self.faces_config)) return face_group def update_faces(self, m: Mobject) -> None: face_coords = self.extract_face_coords() new_faces = self.create_faces(face_coords) self.faces.match_points(new_faces) def extract_face_coords(self) -> Point3DLike_Array: """Extracts the coordinates of the vertices in the graph. Used for updating faces. """ new_vertex_coords = [self.graph[v].get_center() for v in self.graph.vertices] layout = dict(enumerate(new_vertex_coords)) return [[layout[j] for j in i] for i in self.faces_list] class Tetrahedron(Polyhedron): """A tetrahedron, one of the five platonic solids. It has 4 faces, 6 edges, and 4 vertices. Parameters ---------- edge_length The length of an edge between any two vertices. Examples -------- .. manim:: TetrahedronScene :save_last_frame: class TetrahedronScene(ThreeDScene): def construct(self): self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) obj = Tetrahedron() self.add(obj) """ def __init__(self, edge_length: float = 1, **kwargs: Any): unit = edge_length * np.sqrt(2) / 4 super().__init__( vertex_coords=[ np.array([unit, unit, unit]), np.array([unit, -unit, -unit]), np.array([-unit, unit, -unit]), np.array([-unit, -unit, unit]), ], faces_list=[[0, 1, 2], [3, 0, 2], [0, 1, 3], [3, 1, 2]], **kwargs, ) class Octahedron(Polyhedron): """An octahedron, one of the five platonic solids. It has 8 faces, 12 edges and 6 vertices. Parameters ---------- edge_length The length of an edge between any two vertices. Examples -------- .. manim:: OctahedronScene :save_last_frame: class OctahedronScene(ThreeDScene): def construct(self): self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) obj = Octahedron() self.add(obj) """ def __init__(self, edge_length: float = 1, **kwargs: Any): unit = edge_length * np.sqrt(2) / 2 super().__init__( vertex_coords=[ np.array([unit, 0, 0]), np.array([-unit, 0, 0]), np.array([0, unit, 0]), np.array([0, -unit, 0]), np.array([0, 0, unit]), np.array([0, 0, -unit]), ], faces_list=[ [2, 4, 1], [0, 4, 2], [4, 3, 0], [1, 3, 4], [3, 5, 0], [1, 5, 3], [2, 5, 1], [0, 5, 2], ], **kwargs, ) class Icosahedron(Polyhedron): """An icosahedron, one of the five platonic solids. It has 20 faces, 30 edges and 12 vertices. Parameters ---------- edge_length The length of an edge between any two vertices. Examples -------- .. manim:: IcosahedronScene :save_last_frame: class IcosahedronScene(ThreeDScene): def construct(self): self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) obj = Icosahedron() self.add(obj) """ def __init__(self, edge_length: float = 1, **kwargs: Any): unit_a = edge_length * ((1 + np.sqrt(5)) / 4) unit_b = edge_length * (1 / 2) super().__init__( vertex_coords=[ np.array([0, unit_b, unit_a]), np.array([0, -unit_b, unit_a]), np.array([0, unit_b, -unit_a]), np.array([0, -unit_b, -unit_a]), np.array([unit_b, unit_a, 0]), np.array([unit_b, -unit_a, 0]), np.array([-unit_b, unit_a, 0]), np.array([-unit_b, -unit_a, 0]), np.array([unit_a, 0, unit_b]), np.array([unit_a, 0, -unit_b]), np.array([-unit_a, 0, unit_b]), np.array([-unit_a, 0, -unit_b]), ], faces_list=[ [1, 8, 0], [1, 5, 7], [8, 5, 1], [7, 3, 5], [5, 9, 3], [8, 9, 5], [3, 2, 9], [9, 4, 2], [8, 4, 9], [0, 4, 8], [6, 4, 0], [6, 2, 4], [11, 2, 6], [3, 11, 2], [0, 6, 10], [10, 1, 0], [10, 7, 1], [11, 7, 3], [10, 11, 7], [10, 11, 6], ], **kwargs, ) class Dodecahedron(Polyhedron): """A dodecahedron, one of the five platonic solids. It has 12 faces, 30 edges and 20 vertices. Parameters ---------- edge_length The length of an edge between any two vertices. Examples -------- .. manim:: DodecahedronScene :save_last_frame: class DodecahedronScene(ThreeDScene): def construct(self): self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) obj = Dodecahedron() self.add(obj) """ def __init__(self, edge_length: float = 1, **kwargs: Any): unit_a = edge_length * ((1 + np.sqrt(5)) / 4) unit_b = edge_length * ((3 + np.sqrt(5)) / 4) unit_c = edge_length * (1 / 2) super().__init__( vertex_coords=[ np.array([unit_a, unit_a, unit_a]), np.array([unit_a, unit_a, -unit_a]), np.array([unit_a, -unit_a, unit_a]), np.array([unit_a, -unit_a, -unit_a]), np.array([-unit_a, unit_a, unit_a]), np.array([-unit_a, unit_a, -unit_a]), np.array([-unit_a, -unit_a, unit_a]), np.array([-unit_a, -unit_a, -unit_a]), np.array([0, unit_c, unit_b]), np.array([0, unit_c, -unit_b]), np.array([0, -unit_c, -unit_b]), np.array([0, -unit_c, unit_b]), np.array([unit_c, unit_b, 0]), np.array([-unit_c, unit_b, 0]), np.array([unit_c, -unit_b, 0]), np.array([-unit_c, -unit_b, 0]), np.array([unit_b, 0, unit_c]), np.array([-unit_b, 0, unit_c]), np.array([unit_b, 0, -unit_c]), np.array([-unit_b, 0, -unit_c]), ], faces_list=[ [18, 16, 0, 12, 1], [3, 18, 16, 2, 14], [3, 10, 9, 1, 18], [1, 9, 5, 13, 12], [0, 8, 4, 13, 12], [2, 16, 0, 8, 11], [4, 17, 6, 11, 8], [17, 19, 5, 13, 4], [19, 7, 15, 6, 17], [6, 15, 14, 2, 11], [19, 5, 9, 10, 7], [7, 10, 3, 14, 15], ], **kwargs, ) class ConvexHull3D(Polyhedron): """A convex hull for a set of points Parameters ---------- points The points to consider. tolerance The tolerance used for quickhull. kwargs Forwarded to the parent constructor. Examples -------- .. manim:: ConvexHull3DExample :save_last_frame: :quality: high class ConvexHull3DExample(ThreeDScene): def construct(self): self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) points = [ [ 1.93192757, 0.44134585, -1.52407061], [-0.93302521, 1.23206983, 0.64117067], [-0.44350918, -0.61043677, 0.21723705], [-0.42640268, -1.05260843, 1.61266094], [-1.84449637, 0.91238739, -1.85172623], [ 1.72068132, -0.11880457, 0.51881751], [ 0.41904805, 0.44938012, -1.86440686], [ 0.83864666, 1.66653337, 1.88960123], [ 0.22240514, -0.80986286, 1.34249326], [-1.29585759, 1.01516189, 0.46187522], [ 1.7776499, -1.59550796, -1.70240747], [ 0.80065226, -0.12530398, 1.70063977], [ 1.28960948, -1.44158255, 1.39938582], [-0.93538943, 1.33617705, -0.24852643], [-1.54868271, 1.7444399, -0.46170734] ] hull = ConvexHull3D( *points, faces_config = {"stroke_opacity": 0}, graph_config = { "vertex_type": Dot3D, "edge_config": { "stroke_color": BLUE, "stroke_width": 2, "stroke_opacity": 0.05, } } ) dots = VGroup(*[Dot3D(point) for point in points]) self.add(hull) self.add(dots) """ def __init__(self, *points: Point3D, tolerance: float = 1e-5, **kwargs: Any): # Build Convex Hull array = np.array(points) hull = QuickHull(tolerance) hull.build(array) # Setup Lists vertices = [] faces = [] # Extract Faces c = 0 d = {} facets = set(hull.facets) - hull.removed for facet in facets: tmp = set() for subfacet in facet.subfacets: for point in subfacet.points: if point not in d: vertices.append(point.coordinates) d[point] = c c += 1 tmp.add(point) faces.append([d[point] for point in tmp]) # Call Polyhedron super().__init__( vertex_coords=vertices, faces_list=faces, **kwargs, ) ManimCommunity-manim-1157b74/manim/mobject/three_d/three_d_utils.py000066400000000000000000000042771515024150700254070ustar00rootroot00000000000000"""Utility functions for three-dimensional mobjects.""" from __future__ import annotations __all__ = [ "get_3d_vmob_gradient_start_and_end_points", "get_3d_vmob_start_corner_index", "get_3d_vmob_end_corner_index", "get_3d_vmob_start_corner", "get_3d_vmob_end_corner", "get_3d_vmob_unit_normal", "get_3d_vmob_start_corner_unit_normal", "get_3d_vmob_end_corner_unit_normal", ] from typing import TYPE_CHECKING, Literal import numpy as np from manim.constants import ORIGIN, UP from manim.utils.space_ops import get_unit_normal if TYPE_CHECKING: from manim.typing import Point3D, Vector3D from ..types.vectorized_mobject import VMobject def get_3d_vmob_gradient_start_and_end_points( vmob: VMobject, ) -> tuple[Point3D, Point3D]: return ( get_3d_vmob_start_corner(vmob), get_3d_vmob_end_corner(vmob), ) def get_3d_vmob_start_corner_index(vmob: VMobject) -> Literal[0]: return 0 def get_3d_vmob_end_corner_index(vmob: VMobject) -> int: return ((len(vmob.points) - 1) // 6) * 3 def get_3d_vmob_start_corner(vmob: VMobject) -> Point3D: if vmob.get_num_points() == 0: return np.array(ORIGIN) return vmob.points[get_3d_vmob_start_corner_index(vmob)] def get_3d_vmob_end_corner(vmob: VMobject) -> Point3D: if vmob.get_num_points() == 0: return np.array(ORIGIN) return vmob.points[get_3d_vmob_end_corner_index(vmob)] def get_3d_vmob_unit_normal(vmob: VMobject, point_index: int) -> Vector3D: n_points = vmob.get_num_points() if len(vmob.get_anchors()) <= 2: return np.array(UP) i = point_index im3 = i - 3 if i > 2 else (n_points - 4) ip3 = i + 3 if i < (n_points - 3) else 3 unit_normal = get_unit_normal( vmob.points[ip3] - vmob.points[i], vmob.points[im3] - vmob.points[i], ) if np.linalg.norm(unit_normal) == 0: return np.array(UP) return unit_normal def get_3d_vmob_start_corner_unit_normal(vmob: VMobject) -> Vector3D: return get_3d_vmob_unit_normal(vmob, get_3d_vmob_start_corner_index(vmob)) def get_3d_vmob_end_corner_unit_normal(vmob: VMobject) -> Vector3D: return get_3d_vmob_unit_normal(vmob, get_3d_vmob_end_corner_index(vmob)) ManimCommunity-manim-1157b74/manim/mobject/three_d/three_dimensions.py000066400000000000000000001170721515024150700261120ustar00rootroot00000000000000"""Three-dimensional mobjects.""" from __future__ import annotations __all__ = [ "ThreeDVMobject", "Surface", "Sphere", "Dot3D", "Cube", "Prism", "Cone", "Arrow3D", "Cylinder", "Line3D", "Torus", ] from collections.abc import Callable, Iterable, Sequence from typing import TYPE_CHECKING, Any, Literal, Self import numpy as np from manim import config, logger from manim.constants import * from manim.mobject.geometry.arc import Circle from manim.mobject.geometry.polygram import Square from manim.mobject.mobject import * from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.types.vectorized_mobject import VectorizedPoint, VGroup, VMobject from manim.utils.color import ( BLUE, BLUE_D, BLUE_E, LIGHT_GREY, WHITE, ManimColor, ParsableManimColor, interpolate_color, ) from manim.utils.space_ops import normalize, perpendicular_bisector, z_to_vector if TYPE_CHECKING: from manim.mobject.graphing.coordinate_systems import ThreeDAxes from manim.typing import Point3D, Point3DLike, Vector3D, Vector3DLike class ThreeDVMobject(VMobject, metaclass=ConvertToOpenGL): u_index: int v_index: int u1: float u2: float v1: float v2: float def __init__(self, shade_in_3d: bool = True, **kwargs: Any): super().__init__(shade_in_3d=shade_in_3d, **kwargs) class Surface(VGroup, metaclass=ConvertToOpenGL): """Creates a Parametric Surface using a checkerboard pattern. Parameters ---------- func The function defining the :class:`Surface`. u_range The range of the ``u`` variable: ``(u_min, u_max)``. v_range The range of the ``v`` variable: ``(v_min, v_max)``. resolution The number of samples taken of the :class:`Surface`. A tuple can be used to define different resolutions for ``u`` and ``v`` respectively. fill_color The color of the :class:`Surface`. Ignored if ``checkerboard_colors`` is set. fill_opacity The opacity of the :class:`Surface`, from 0 being fully transparent to 1 being fully opaque. Defaults to 1. checkerboard_colors ng individual faces alternating colors. Overrides ``fill_color``. stroke_color Color of the stroke surrounding each face of :class:`Surface`. stroke_width Width of the stroke surrounding each face of :class:`Surface`. Defaults to 0.5. should_make_jagged Changes the anchor mode of the Bรฉzier curves from smooth to jagged. Defaults to ``False``. Examples -------- .. manim:: ParaSurface :save_last_frame: class ParaSurface(ThreeDScene): def func(self, u, v): return np.array([np.cos(u) * np.cos(v), np.cos(u) * np.sin(v), u]) def construct(self): axes = ThreeDAxes(x_range=[-4,4], x_length=8) surface = Surface( lambda u, v: axes.c2p(*self.func(u, v)), u_range=[-PI, PI], v_range=[0, TAU], resolution=8, ) self.set_camera_orientation(theta=70 * DEGREES, phi=75 * DEGREES) self.add(axes, surface) """ def __init__( self, func: Callable[[float, float], np.ndarray], u_range: tuple[float, float] = (0, 1), v_range: tuple[float, float] = (0, 1), resolution: int | Sequence[int] = 32, surface_piece_config: dict = {}, fill_color: ParsableManimColor = BLUE_D, fill_opacity: float = 1.0, checkerboard_colors: Iterable[ParsableManimColor] | Literal[False] = [ BLUE_D, BLUE_E, ], stroke_color: ParsableManimColor = LIGHT_GREY, stroke_width: float = 0.5, should_make_jagged: bool = False, pre_function_handle_to_anchor_scale_factor: float = 0.00001, **kwargs: Any, ) -> None: self.u_range = u_range self.v_range = v_range super().__init__( fill_color=fill_color, fill_opacity=fill_opacity, stroke_color=stroke_color, stroke_width=stroke_width, **kwargs, ) self.resolution = resolution self.surface_piece_config = surface_piece_config self.checkerboard_colors: list[ManimColor] | Literal[False] if checkerboard_colors is False: self.checkerboard_colors = checkerboard_colors else: self.checkerboard_colors = [ManimColor(i) for i in checkerboard_colors] self.should_make_jagged = should_make_jagged self.pre_function_handle_to_anchor_scale_factor = ( pre_function_handle_to_anchor_scale_factor ) self._func = func self._setup_in_uv_space() self.apply_function(lambda p: func(p[0], p[1])) if self.should_make_jagged: self.make_jagged() def func(self, u: float, v: float) -> np.ndarray: return self._func(u, v) def _get_u_values_and_v_values(self) -> tuple[np.ndarray, np.ndarray]: if isinstance(self.resolution, int): u_res = v_res = self.resolution else: u_res, v_res = self.resolution u_values = np.linspace(*self.u_range, u_res + 1) v_values = np.linspace(*self.v_range, v_res + 1) return u_values, v_values def _setup_in_uv_space(self) -> None: u_values, v_values = self._get_u_values_and_v_values() faces = VGroup() for i in range(len(u_values) - 1): for j in range(len(v_values) - 1): u1, u2 = u_values[i : i + 2] v1, v2 = v_values[j : j + 2] face = ThreeDVMobject() face.set_points_as_corners( [ [u1, v1, 0], [u2, v1, 0], [u2, v2, 0], [u1, v2, 0], [u1, v1, 0], ], ) faces.add(face) face.u_index = i face.v_index = j face.u1 = u1 face.u2 = u2 face.v1 = v1 face.v2 = v2 faces.set_fill(color=self.fill_color, opacity=self.fill_opacity) faces.set_stroke( color=self.stroke_color, width=self.stroke_width, opacity=self.stroke_opacity, ) self.add(*faces) if self.checkerboard_colors: self.set_fill_by_checkerboard(*self.checkerboard_colors) def set_fill_by_checkerboard( self, *colors: ParsableManimColor, opacity: float | None = None ) -> Self: """Sets the fill_color of each face of :class:`Surface` in an alternating pattern. Parameters ---------- colors List of colors for alternating pattern. opacity The fill_opacity of :class:`Surface`, from 0 being fully transparent to 1 being fully opaque. Returns ------- :class:`~.Surface` The parametric surface with an alternating pattern. """ n_colors = len(colors) for face in self: c_index = (face.u_index + face.v_index) % n_colors face.set_fill(colors[c_index], opacity=opacity) return self def set_fill_by_value( self, axes: ThreeDAxes, colorscale: Iterable[ParsableManimColor] | Iterable[tuple[ParsableManimColor, float]] | None = None, axis: int = 2, **kwargs: Any, ) -> Self: """Sets the color of each mobject of a parametric surface to a color relative to its axis-value. Parameters ---------- axes The axes for the parametric surface, which will be used to map axis-values to colors. colorscale A list of colors, ordered from lower axis-values to higher axis-values. If a list of tuples is passed containing colors paired with numbers, then those numbers will be used as the pivots. axis The chosen axis to use for the color mapping. (0 = x, 1 = y, 2 = z) Returns ------- :class:`~.Surface` The parametric surface with a gradient applied by value. For chaining. Examples -------- .. manim:: FillByValueExample :save_last_frame: class FillByValueExample(ThreeDScene): def construct(self): resolution_fa = 8 self.set_camera_orientation(phi=75 * DEGREES, theta=-160 * DEGREES) axes = ThreeDAxes(x_range=(0, 5, 1), y_range=(0, 5, 1), z_range=(-1, 1, 0.5)) def param_surface(u, v): x = u y = v z = np.sin(x) * np.cos(y) return z surface_plane = Surface( lambda u, v: axes.c2p(u, v, param_surface(u, v)), resolution=(resolution_fa, resolution_fa), v_range=[0, 5], u_range=[0, 5], ) surface_plane.set_style(fill_opacity=1) surface_plane.set_fill_by_value(axes=axes, colorscale=[(RED, -0.5), (YELLOW, 0), (GREEN, 0.5)], axis=2) self.add(axes, surface_plane) """ if "colors" in kwargs and colorscale is None: colorscale = kwargs.pop("colors") if kwargs: raise ValueError( "Unsupported keyword argument(s): " f"{', '.join(str(key) for key in kwargs)}" ) if colorscale is None: logger.warning( "The value passed to the colorscale keyword argument was None, " "the surface fill color has not been changed" ) return self colorscale_list = list(colorscale) ranges = [axes.x_range, axes.y_range, axes.z_range] assert isinstance(colorscale_list, list) new_colors: list[ManimColor] if type(colorscale_list[0]) is tuple and len(colorscale_list[0]) == 2: new_colors, pivots = [ [ManimColor(i) for i, j in colorscale_list], [j for i, j in colorscale_list], ] else: new_colors = [ManimColor(i) for i in colorscale_list] current_range = ranges[axis] assert current_range is not None pivot_min = current_range[0] pivot_max = current_range[1] pivot_frequency = (pivot_max - pivot_min) / (len(new_colors) - 1) pivots = np.arange( start=pivot_min, stop=pivot_max + pivot_frequency, step=pivot_frequency, ) for mob in self.family_members_with_points(): axis_value = axes.point_to_coords(mob.get_midpoint())[axis] if axis_value <= pivots[0]: mob.set_color(new_colors[0]) elif axis_value >= pivots[-1]: mob.set_color(new_colors[-1]) else: for i, pivot in enumerate(pivots): if pivot > axis_value: color_index = (axis_value - pivots[i - 1]) / ( pivots[i] - pivots[i - 1] ) color_index = min(color_index, 1) mob_color = interpolate_color( new_colors[i - 1], new_colors[i], color_index, ) if config.renderer == RendererType.OPENGL: assert isinstance(mob, OpenGLMobject) mob.set_color(mob_color, recurse=False) elif config.renderer == RendererType.CAIRO: mob.set_color(mob_color, family=False) break return self # Specific shapes class Sphere(Surface): """A three-dimensional sphere. Parameters ---------- center Center of the :class:`Sphere`. radius The radius of the :class:`Sphere`. resolution The number of samples taken of the :class:`Sphere`. A tuple can be used to define different resolutions for ``u`` and ``v`` respectively. u_range The range of the ``u`` variable: ``(u_min, u_max)``. v_range The range of the ``v`` variable: ``(v_min, v_max)``. Examples -------- .. manim:: ExampleSphere :save_last_frame: class ExampleSphere(ThreeDScene): def construct(self): self.set_camera_orientation(phi=PI / 6, theta=PI / 6) sphere1 = Sphere( center=(3, 0, 0), radius=1, resolution=(20, 20), u_range=[0.001, PI - 0.001], v_range=[0, TAU] ) sphere1.set_color(RED) self.add(sphere1) sphere2 = Sphere(center=(-1, -3, 0), radius=2, resolution=(18, 18)) sphere2.set_color(GREEN) self.add(sphere2) sphere3 = Sphere(center=(-1, 2, 0), radius=2, resolution=(16, 16)) sphere3.set_color(BLUE) self.add(sphere3) """ def __init__( self, center: Point3DLike = ORIGIN, radius: float = 1, resolution: int | Sequence[int] | None = None, u_range: tuple[float, float] = (0, TAU), v_range: tuple[float, float] = (0, PI), **kwargs: Any, ) -> None: if config.renderer == RendererType.OPENGL: res_value = (101, 51) elif config.renderer == RendererType.CAIRO: res_value = (24, 12) else: raise Exception("Unknown renderer") resolution = resolution if resolution is not None else res_value self.radius = radius super().__init__( self.func, resolution=resolution, u_range=u_range, v_range=v_range, **kwargs, ) self.shift(center) def func(self, u: float, v: float) -> Point3D: """The z values defining the :class:`Sphere` being plotted. Returns ------- :class:`Point3D` The z values defining the :class:`Sphere`. """ return self.radius * np.array( [np.cos(u) * np.sin(v), np.sin(u) * np.sin(v), -np.cos(v)], ) class Dot3D(Sphere): """A spherical dot. Parameters ---------- point The location of the dot. radius The radius of the dot. color The color of the :class:`Dot3D`. resolution The number of samples taken of the :class:`Dot3D`. A tuple can be used to define different resolutions for ``u`` and ``v`` respectively. Examples -------- .. manim:: Dot3DExample :save_last_frame: class Dot3DExample(ThreeDScene): def construct(self): self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES) axes = ThreeDAxes() dot_1 = Dot3D(point=axes.coords_to_point(0, 0, 1), color=RED) dot_2 = Dot3D(point=axes.coords_to_point(2, 0, 0), radius=0.1, color=BLUE) dot_3 = Dot3D(point=[0, 0, 0], radius=0.1, color=ORANGE) self.add(axes, dot_1, dot_2,dot_3) """ def __init__( self, point: Point3D = ORIGIN, radius: float = DEFAULT_DOT_RADIUS, color: ParsableManimColor = WHITE, resolution: int | tuple[int, int] | None = (8, 8), **kwargs: Any, ) -> None: super().__init__(center=point, radius=radius, resolution=resolution, **kwargs) self.set_color(color) class Cube(VGroup): """A three-dimensional cube. Parameters ---------- side_length Length of each side of the :class:`Cube`. fill_opacity The opacity of the :class:`Cube`, from 0 being fully transparent to 1 being fully opaque. Defaults to 0.75. fill_color The color of the :class:`Cube`. stroke_width The width of the stroke surrounding each face of the :class:`Cube`. Examples -------- .. manim:: CubeExample :save_last_frame: class CubeExample(ThreeDScene): def construct(self): self.set_camera_orientation(phi=75*DEGREES, theta=-45*DEGREES) axes = ThreeDAxes() cube = Cube(side_length=3, fill_opacity=0.7, fill_color=BLUE) self.add(cube) """ def __init__( self, side_length: float = 2, fill_opacity: float = 0.75, fill_color: ParsableManimColor = BLUE, stroke_width: float = 0, **kwargs: Any, ) -> None: self.side_length = side_length super().__init__( fill_color=fill_color, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs, ) def generate_points(self) -> None: """Creates the sides of the :class:`Cube`.""" for vect in IN, OUT, LEFT, RIGHT, UP, DOWN: face = Square( side_length=self.side_length, shade_in_3d=True, joint_type=LineJointType.BEVEL, ) face.flip() face.shift(self.side_length * OUT / 2.0) face.apply_matrix(z_to_vector(vect)) self.add(face) def init_points(self) -> None: self.generate_points() class Prism(Cube): """A right rectangular prism (or rectangular cuboid). Defined by the length of each side in ``[x, y, z]`` format. Parameters ---------- dimensions Dimensions of the :class:`Prism` in ``[x, y, z]`` format. Examples -------- .. manim:: ExamplePrism :save_last_frame: class ExamplePrism(ThreeDScene): def construct(self): self.set_camera_orientation(phi=60 * DEGREES, theta=150 * DEGREES) prismSmall = Prism(dimensions=[1, 2, 3]).rotate(PI / 2) prismLarge = Prism(dimensions=[1.5, 3, 4.5]).move_to([2, 0, 0]) self.add(prismSmall, prismLarge) """ def __init__( self, dimensions: Vector3DLike = [3, 2, 1], **kwargs: Any, ) -> None: self.dimensions = dimensions super().__init__(**kwargs) def generate_points(self) -> None: """Creates the sides of the :class:`Prism`.""" super().generate_points() for dim, value in enumerate(self.dimensions): self.rescale_to_fit(value, dim, stretch=True) class Cone(Surface): """A circular cone. Can be defined using 2 parameters: its height, and its base radius. The polar angle, theta, can be calculated using arctan(base_radius / height) The spherical radius, r, is calculated using the pythagorean theorem. Parameters ---------- base_radius The base radius from which the cone tapers. height The height measured from the plane formed by the base_radius to the apex of the cone. direction The direction of the apex. show_base Whether to show the base plane or not. v_range The azimuthal angle to start and end at. u_min The radius at the apex. checkerboard_colors Show checkerboard grid texture on the cone. Examples -------- .. manim:: ExampleCone :save_last_frame: class ExampleCone(ThreeDScene): def construct(self): axes = ThreeDAxes() cone = Cone(direction=X_AXIS+Y_AXIS+2*Z_AXIS, resolution=8) self.set_camera_orientation(phi=5*PI/11, theta=PI/9) self.add(axes, cone) """ def __init__( self, base_radius: float = 1, height: float = 1, direction: Vector3DLike = Z_AXIS, show_base: bool = False, v_range: tuple[float, float] = (0, TAU), u_min: float = 0, checkerboard_colors: Iterable[ParsableManimColor] | Literal[False] = False, **kwargs: Any, ) -> None: self.direction = np.array(direction) self.theta = PI - np.arctan(base_radius / height) super().__init__( self.func, v_range=v_range, u_range=(u_min, np.sqrt(base_radius**2 + height**2)), checkerboard_colors=checkerboard_colors, **kwargs, ) # used for rotations self.new_height = height self._current_theta = 0 self._current_phi = 0 self.base_circle = Circle( radius=base_radius, color=self.fill_color, fill_opacity=self.fill_opacity, stroke_width=0, ) self.base_circle.shift(height * IN) self._set_start_and_end_attributes(direction) if show_base: self.add(self.base_circle) self._rotate_to_direction() def func(self, u: float, v: float) -> Point3D: """Converts from spherical coordinates to cartesian. Parameters ---------- u The radius. v The azimuthal angle. Returns ------- :class:`numpy.array` Points defining the :class:`Cone`. """ r = u phi = v return np.array( [ r * np.sin(self.theta) * np.cos(phi), r * np.sin(self.theta) * np.sin(phi), r * np.cos(self.theta), ], ) def get_start(self) -> Point3D: return self.start_point.get_center() def get_end(self) -> Point3D: return self.end_point.get_center() def _rotate_to_direction(self) -> None: x, y, z = self.direction r = np.sqrt(x**2 + y**2 + z**2) theta = np.arccos(z / r) if r > 0 else 0 if x == 0: if y == 0: # along the z axis phi = 0 else: phi = np.arctan(np.inf) if y < 0: phi += PI else: phi = np.arctan(y / x) if x < 0: phi += PI # Undo old rotation (in reverse order) self.rotate(-self._current_phi, Z_AXIS, about_point=ORIGIN) self.rotate(-self._current_theta, Y_AXIS, about_point=ORIGIN) # Do new rotation self.rotate(theta, Y_AXIS, about_point=ORIGIN) self.rotate(phi, Z_AXIS, about_point=ORIGIN) # Store values self._current_theta = theta self._current_phi = phi def set_direction(self, direction: Vector3DLike) -> None: """Changes the direction of the apex of the :class:`Cone`. Parameters ---------- direction The direction of the apex. """ self.direction = np.array(direction) self._rotate_to_direction() def get_direction(self) -> Vector3D: """Returns the current direction of the apex of the :class:`Cone`. Returns ------- direction : :class:`numpy.array` The direction of the apex. """ return self.direction def _set_start_and_end_attributes(self, direction: Vector3D) -> None: normalized_direction = direction * np.linalg.norm(direction) start = self.base_circle.get_center() end = start + normalized_direction * self.new_height self.start_point = VectorizedPoint(start) self.end_point = VectorizedPoint(end) self.add(self.start_point, self.end_point) class Cylinder(Surface): """A cylinder, defined by its height, radius and direction, Parameters ---------- radius The radius of the cylinder. height The height of the cylinder. direction The direction of the central axis of the cylinder. v_range The height along the height axis (given by direction) to start and end on. show_ends Whether to show the end caps or not. resolution The number of samples taken of the :class:`Cylinder`. A tuple can be used to define different resolutions for ``u`` and ``v`` respectively. Examples -------- .. manim:: ExampleCylinder :save_last_frame: class ExampleCylinder(ThreeDScene): def construct(self): axes = ThreeDAxes() cylinder = Cylinder(radius=2, height=3) self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) self.add(axes, cylinder) """ def __init__( self, radius: float = 1, height: float = 2, direction: Vector3DLike = Z_AXIS, v_range: tuple[float, float] = (0, TAU), show_ends: bool = True, resolution: int | tuple[int, int] = (24, 24), **kwargs: Any, ) -> None: self._height = height self.radius = radius super().__init__( self.func, resolution=resolution, u_range=(-self._height / 2, self._height / 2), v_range=v_range, **kwargs, ) if show_ends: self.add_bases() self._current_phi = 0 self._current_theta = 0 self.set_direction(direction) def func(self, u: float, v: float) -> np.ndarray: """Converts from cylindrical coordinates to cartesian. Parameters ---------- u The height. v The azimuthal angle. Returns ------- :class:`numpy.ndarray` Points defining the :class:`Cylinder`. """ height = u phi = v r = self.radius return np.array([r * np.cos(phi), r * np.sin(phi), height]) def add_bases(self) -> None: """Adds the end caps of the cylinder.""" opacity: float if config.renderer == RendererType.OPENGL: assert isinstance(self, OpenGLMobject) color = self.color opacity = self.opacity elif config.renderer == RendererType.CAIRO: color = self.fill_color opacity = self.fill_opacity self.base_top = Circle( radius=self.radius, color=color, fill_opacity=opacity, shade_in_3d=True, stroke_width=0, ) self.base_top.shift(self.u_range[1] * IN) self.base_bottom = Circle( radius=self.radius, color=color, fill_opacity=opacity, shade_in_3d=True, stroke_width=0, ) self.base_bottom.shift(self.u_range[0] * IN) self.add(self.base_top, self.base_bottom) def _rotate_to_direction(self) -> None: x, y, z = self.direction r = np.sqrt(x**2 + y**2 + z**2) theta = np.arccos(z / r) if r > 0 else 0 if x == 0: if y == 0: # along the z axis phi = 0 else: # along the x axis phi = np.arctan(np.inf) if y < 0: phi += PI else: phi = np.arctan(y / x) if x < 0: phi += PI # undo old rotation (in reverse direction) self.rotate(-self._current_phi, Z_AXIS, about_point=ORIGIN) self.rotate(-self._current_theta, Y_AXIS, about_point=ORIGIN) # do new rotation self.rotate(theta, Y_AXIS, about_point=ORIGIN) self.rotate(phi, Z_AXIS, about_point=ORIGIN) # store new values self._current_theta = theta self._current_phi = phi def set_direction(self, direction: Vector3DLike) -> None: """Sets the direction of the central axis of the :class:`Cylinder`. Parameters ---------- direction : :class:`numpy.array` The direction of the central axis of the :class:`Cylinder`. """ # if get_norm(direction) is get_norm(self.direction): # pass self.direction = direction self._rotate_to_direction() def get_direction(self) -> np.ndarray: """Returns the direction of the central axis of the :class:`Cylinder`. Returns ------- direction : :class:`numpy.array` The direction of the central axis of the :class:`Cylinder`. """ return self.direction class Line3D(Cylinder): """A cylindrical line, for use in ThreeDScene. Parameters ---------- start The start point of the line. end The end point of the line. thickness The thickness of the line. color The color of the line. resolution The resolution of the line. By default this value is the number of points the line will sampled at. If you want the line to also come out checkered, use a tuple. For example, for a line made of 24 points with 4 checker points on each cylinder, pass the tuple (4, 24). Examples -------- .. manim:: ExampleLine3D :save_last_frame: class ExampleLine3D(ThreeDScene): def construct(self): axes = ThreeDAxes() line = Line3D(start=np.array([0, 0, 0]), end=np.array([2, 2, 2])) self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) self.add(axes, line) """ def __init__( self, start: Point3DLike = LEFT, end: Point3DLike = RIGHT, thickness: float = 0.02, color: ParsableManimColor | None = None, resolution: int | tuple[int, int] = 24, **kwargs: Any, ): self.thickness = thickness self.resolution: tuple[int, int] = ( (2, resolution) if isinstance(resolution, int) else resolution ) start = np.array(start, dtype=np.float64) end = np.array(end, dtype=np.float64) self.set_start_and_end_attrs(start, end, **kwargs) if color is not None: self.set_color(color) def set_start_and_end_attrs( self, start: Point3DLike, end: Point3DLike, **kwargs: Any ) -> None: """Sets the start and end points of the line. If either ``start`` or ``end`` are :class:`Mobjects <.Mobject>`, this gives their centers. Parameters ---------- start Starting point or :class:`Mobject`. end Ending point or :class:`Mobject`. """ rough_start = self.pointify(start) rough_end = self.pointify(end) self.vect = rough_end - rough_start self.length = np.linalg.norm(self.vect) self.direction: Vector3D = normalize(self.vect) # Now that we know the direction between them, # we can the appropriate boundary point from # start and end, if they're mobjects self.start = self.pointify(start, self.direction) self.end = self.pointify(end, -self.direction) super().__init__( height=np.linalg.norm(self.vect), radius=self.thickness, direction=self.direction, resolution=self.resolution, **kwargs, ) self.shift((self.start + self.end) / 2) def pointify( self, mob_or_point: Mobject | Point3DLike, direction: Vector3DLike | None = None, ) -> Point3D: """Gets a point representing the center of the :class:`Mobjects <.Mobject>`. Parameters ---------- mob_or_point :class:`Mobjects <.Mobject>` or point whose center should be returned. direction If an edge of a :class:`Mobjects <.Mobject>` should be returned, the direction of the edge. Returns ------- :class:`numpy.array` Center of the :class:`Mobjects <.Mobject>` or point, or edge if direction is given. """ if isinstance(mob_or_point, (Mobject, OpenGLMobject)): mob = mob_or_point if direction is None: return mob.get_center() else: return mob.get_boundary_point(direction) return np.array(mob_or_point) def get_start(self) -> Point3D: """Returns the starting point of the :class:`Line3D`. Returns ------- start : :class:`numpy.array` Starting point of the :class:`Line3D`. """ return self.start def get_end(self) -> Point3D: """Returns the ending point of the :class:`Line3D`. Returns ------- end : :class:`numpy.array` Ending point of the :class:`Line3D`. """ return self.end @classmethod def parallel_to( cls, line: Line3D, point: Point3DLike = ORIGIN, length: float = 5, **kwargs: Any, ) -> Line3D: """Returns a line parallel to another line going through a given point. Parameters ---------- line The line to be parallel to. point The point to pass through. length Length of the parallel line. kwargs Additional parameters to be passed to the class. Returns ------- :class:`Line3D` Line parallel to ``line``. Examples -------- .. manim:: ParallelLineExample :save_last_frame: class ParallelLineExample(ThreeDScene): def construct(self): self.set_camera_orientation(PI / 3, -PI / 4) ax = ThreeDAxes((-5, 5), (-5, 5), (-5, 5), 10, 10, 10) line1 = Line3D(RIGHT * 2, UP + OUT, color=RED) line2 = Line3D.parallel_to(line1, color=YELLOW) self.add(ax, line1, line2) """ np_point = np.asarray(point) vect = normalize(line.vect) return cls( np_point + vect * length / 2, np_point - vect * length / 2, **kwargs, ) @classmethod def perpendicular_to( cls, line: Line3D, point: Point3DLike = ORIGIN, length: float = 5, **kwargs: Any, ) -> Line3D: """Returns a line perpendicular to another line going through a given point. Parameters ---------- line The line to be perpendicular to. point The point to pass through. length Length of the perpendicular line. kwargs Additional parameters to be passed to the class. Returns ------- :class:`Line3D` Line perpendicular to ``line``. Examples -------- .. manim:: PerpLineExample :save_last_frame: class PerpLineExample(ThreeDScene): def construct(self): self.set_camera_orientation(PI / 3, -PI / 4) ax = ThreeDAxes((-5, 5), (-5, 5), (-5, 5), 10, 10, 10) line1 = Line3D(RIGHT * 2, UP + OUT, color=RED) line2 = Line3D.perpendicular_to(line1, color=BLUE) self.add(ax, line1, line2) """ np_point = np.asarray(point) norm = np.cross(line.vect, np_point - line.start) if all(np.linalg.norm(norm) == np.zeros(3)): raise ValueError("Could not find the perpendicular.") start, end = perpendicular_bisector([line.start, line.end], norm) vect = normalize(end - start) return cls( np_point + vect * length / 2, np_point - vect * length / 2, **kwargs, ) class Arrow3D(Line3D): """An arrow made out of a cylindrical line and a conical tip. Parameters ---------- start The start position of the arrow. end The end position of the arrow. thickness The thickness of the arrow. height The height of the conical tip. base_radius The base radius of the conical tip. color The color of the arrow. resolution The resolution of the arrow line. Examples -------- .. manim:: ExampleArrow3D :save_last_frame: class ExampleArrow3D(ThreeDScene): def construct(self): axes = ThreeDAxes() arrow = Arrow3D( start=np.array([0, 0, 0]), end=np.array([2, 2, 2]), resolution=8 ) self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) self.add(axes, arrow) """ def __init__( self, start: Point3DLike = LEFT, end: Point3DLike = RIGHT, thickness: float = 0.02, height: float = 0.3, base_radius: float = 0.08, color: ParsableManimColor = WHITE, resolution: int | tuple[int, int] = 24, **kwargs: Any, ) -> None: super().__init__( start=start, end=end, thickness=thickness, color=color, resolution=resolution, **kwargs, ) self.length = np.linalg.norm(self.vect) self.set_start_and_end_attrs( self.start, self.end - height * self.direction, **kwargs, ) self.cone = Cone( direction=self.direction, base_radius=base_radius, height=height, **kwargs, ) np_end = np.asarray(end, dtype=np.float64) self.cone.shift(np_end) self.end_point = VectorizedPoint(np_end) self.add(self.end_point, self.cone) self.set_color(color) def get_end(self) -> np.ndarray: return self.end_point.get_center() class Torus(Surface): """A torus. Parameters ---------- major_radius Distance from the center of the tube to the center of the torus. minor_radius Radius of the tube. u_range The range of the ``u`` variable: ``(u_min, u_max)``. v_range The range of the ``v`` variable: ``(v_min, v_max)``. resolution The number of samples taken of the :class:`Torus`. A tuple can be used to define different resolutions for ``u`` and ``v`` respectively. Examples -------- .. manim :: ExampleTorus :save_last_frame: class ExampleTorus(ThreeDScene): def construct(self): axes = ThreeDAxes() torus = Torus() self.set_camera_orientation(phi=75 * DEGREES, theta=30 * DEGREES) self.add(axes, torus) """ def __init__( self, major_radius: float = 3, minor_radius: float = 1, u_range: tuple[float, float] = (0, TAU), v_range: tuple[float, float] = (0, TAU), resolution: int | tuple[int, int] | None = None, **kwargs: Any, ) -> None: if config.renderer == RendererType.OPENGL: res_value = (101, 101) elif config.renderer == RendererType.CAIRO: res_value = (24, 24) resolution = resolution if resolution is not None else res_value self.R = major_radius self.r = minor_radius super().__init__( self.func, u_range=u_range, v_range=v_range, resolution=resolution, **kwargs, ) def func(self, u: float, v: float) -> Point3D: """The z values defining the :class:`Torus` being plotted. Returns ------- :class:`numpy.ndarray` The z values defining the :class:`Torus`. """ P = np.array([np.cos(u), np.sin(u), 0]) return (self.R - self.r * np.cos(v)) * P - self.r * np.sin(v) * OUT ManimCommunity-manim-1157b74/manim/mobject/types/000077500000000000000000000000001515024150700217235ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/mobject/types/__init__.py000066400000000000000000000002541515024150700240350ustar00rootroot00000000000000"""Specialized mobject base classes. Modules ======= .. autosummary:: :toctree: ../reference ~image_mobject ~point_cloud_mobject ~vectorized_mobject """ ManimCommunity-manim-1157b74/manim/mobject/types/image_mobject.py000066400000000000000000000301411515024150700250610ustar00rootroot00000000000000"""Mobjects representing raster images.""" from __future__ import annotations __all__ = ["AbstractImageMobject", "ImageMobject", "ImageMobjectFromCamera"] import pathlib from typing import TYPE_CHECKING, Any import numpy as np from PIL import Image from PIL.Image import Resampling from manim.mobject.geometry.shape_matchers import SurroundingRectangle from ... import config from ...camera.moving_camera import MovingCamera from ...constants import * from ...mobject.mobject import Mobject from ...utils.bezier import interpolate from ...utils.color import ( WHITE, YELLOW_C, ManimColor, ParsableManimColor, color_to_int_rgb, ) from ...utils.images import change_to_rgba_array, get_full_raster_image_path __all__ = ["ImageMobject", "ImageMobjectFromCamera"] if TYPE_CHECKING: from typing import Self import numpy.typing as npt from manim.typing import PixelArray, StrPath from ...camera.moving_camera import MovingCamera class AbstractImageMobject(Mobject): """ Automatically filters out black pixels Parameters ---------- scale_to_resolution At this resolution the image is placed pixel by pixel onto the screen, so it will look the sharpest and best. This is a custom parameter of ImageMobject so that rendering a scene with e.g. the ``--quality low`` or ``--quality medium`` flag for faster rendering won't effect the position of the image on the screen. """ def __init__( self, scale_to_resolution: int, pixel_array_dtype: str = "uint8", resampling_algorithm: Resampling = Resampling.BICUBIC, **kwargs: Any, ) -> None: self.pixel_array_dtype = pixel_array_dtype self.scale_to_resolution = scale_to_resolution self.set_resampling_algorithm(resampling_algorithm) super().__init__(**kwargs) def get_pixel_array(self) -> PixelArray: raise NotImplementedError() def set_color( # type: ignore[override] self, color: ParsableManimColor = YELLOW_C, alpha: Any = None, family: bool = True, ) -> AbstractImageMobject: # Likely to be implemented in subclasses, but no obligation raise NotImplementedError() def set_resampling_algorithm(self, resampling_algorithm: int) -> Self: """ Sets the interpolation method for upscaling the image. By default the image is interpolated using bicubic algorithm. This method lets you change it. Interpolation is done internally using Pillow, and the function besides the string constants describing the algorithm accepts the Pillow integer constants. Parameters ---------- resampling_algorithm An integer constant described in the Pillow library, or one from the RESAMPLING_ALGORITHMS global dictionary, under the following keys: * 'bicubic' or 'cubic' * 'nearest' or 'none' * 'box' * 'bilinear' or 'linear' * 'hamming' * 'lanczos' or 'antialias' """ if resampling_algorithm not in RESAMPLING_ALGORITHMS.values(): raise ValueError( "resampling_algorithm has to be an int, one of the values defined in " "RESAMPLING_ALGORITHMS or a Pillow resampling filter constant. " "Available algorithms: 'bicubic' (or 'cubic'), 'nearest' (or 'none'), " "'bilinear' (or 'linear').", ) self.resampling_algorithm = resampling_algorithm return self def reset_points(self) -> Self: """Sets :attr:`points` to be the four image corners.""" self.points = np.array( [ UP + LEFT, UP + RIGHT, DOWN + LEFT, DOWN + RIGHT, ], ) self.center() h, w = self.get_pixel_array().shape[:2] if self.scale_to_resolution: height = h / self.scale_to_resolution * config["frame_height"] else: height = 3 # this is the case for ImageMobjectFromCamera self.stretch_to_fit_height(height) self.stretch_to_fit_width(height * w / h) return self class ImageMobject(AbstractImageMobject): """Displays an Image from a numpy array or a file. Parameters ---------- scale_to_resolution At this resolution the image is placed pixel by pixel onto the screen, so it will look the sharpest and best. This is a custom parameter of ImageMobject so that rendering a scene with e.g. the ``--quality low`` or ``--quality medium`` flag for faster rendering won't effect the position of the image on the screen. Example ------- .. manim:: ImageFromArray :save_last_frame: class ImageFromArray(Scene): def construct(self): image = ImageMobject(np.uint8([[0, 100, 30, 200], [255, 0, 5, 33]])) image.height = 7 self.add(image) Changing interpolation style: .. manim:: ImageInterpolationEx :save_last_frame: class ImageInterpolationEx(Scene): def construct(self): img = ImageMobject(np.uint8([[63, 0, 0, 0], [0, 127, 0, 0], [0, 0, 191, 0], [0, 0, 0, 255] ])) img.height = 3 group = Group() algorithm_texts = ["nearest", "linear", "cubic"] for algorithm_text in algorithm_texts: algorithm = RESAMPLING_ALGORITHMS[algorithm_text] img_copy = img.copy().set_resampling_algorithm(algorithm) img_copy.add(Text(algorithm_text).scale(0.5).next_to(img_copy, UP)) group.add(img_copy) group.arrange() self.add(group) """ def __init__( self, filename_or_array: StrPath | npt.NDArray, scale_to_resolution: int = QUALITIES[DEFAULT_QUALITY]["pixel_height"], invert: bool = False, image_mode: str = "RGBA", **kwargs: Any, ) -> None: self.fill_opacity: float = 1 self.stroke_opacity: float = 1 self.invert_image = invert self.image_mode = image_mode if isinstance(filename_or_array, (str, pathlib.PurePath)): path = get_full_raster_image_path(filename_or_array) image = Image.open(path).convert(self.image_mode) self.pixel_array = np.array(image) self.path = path else: self.pixel_array = np.array(filename_or_array) self.pixel_array_dtype = kwargs.get("pixel_array_dtype", "uint8") self.pixel_array = change_to_rgba_array( self.pixel_array, self.pixel_array_dtype ) if self.invert_image: self.pixel_array[:, :, :3] = ( np.iinfo(self.pixel_array_dtype).max - self.pixel_array[:, :, :3] ) self.orig_alpha_pixel_array = self.pixel_array[:, :, 3].copy() super().__init__(scale_to_resolution, **kwargs) def get_pixel_array(self) -> PixelArray: """A simple getter method.""" return self.pixel_array def set_color( # type: ignore[override] self, color: ParsableManimColor = YELLOW_C, alpha: Any = None, family: bool = True, ) -> Self: rgb = color_to_int_rgb(color) self.pixel_array[:, :, :3] = rgb if alpha is not None: self.pixel_array[:, :, 3] = int(255 * alpha) for submob in self.submobjects: submob.set_color(color, alpha, family) self.color = ManimColor(color) return self def set_opacity(self, alpha: float) -> Self: """Sets the image's opacity. Parameters ---------- alpha The alpha value of the object, 1 being opaque and 0 being transparent. """ self.pixel_array[:, :, 3] = self.orig_alpha_pixel_array * alpha self.stroke_opacity = alpha return self def fade(self, darkness: float = 0.5, family: bool = True) -> Self: """Sets the image's opacity using a 1 - alpha relationship. Parameters ---------- darkness The alpha value of the object, 1 being transparent and 0 being opaque. family Whether the submobjects of the ImageMobject should be affected. """ self.set_opacity(1 - darkness) super().fade(darkness, family) return self def interpolate_color( self, mobject1: Mobject, mobject2: Mobject, alpha: float ) -> None: """Interpolates the array of pixel color values from one ImageMobject into an array of equal size in the target ImageMobject. Parameters ---------- mobject1 The ImageMobject to transform from. mobject2 The ImageMobject to transform into. alpha Used to track the lerp relationship. Not opacity related. """ assert isinstance(mobject1, ImageMobject) assert isinstance(mobject2, ImageMobject) assert mobject1.pixel_array.shape == mobject2.pixel_array.shape, ( f"Mobject pixel array shapes incompatible for interpolation.\n" f"Mobject 1 ({mobject1}) : {mobject1.pixel_array.shape}\n" f"Mobject 2 ({mobject2}) : {mobject2.pixel_array.shape}" ) self.fill_opacity = interpolate( mobject1.fill_opacity, mobject2.fill_opacity, alpha, ) self.stroke_opacity = interpolate( mobject1.stroke_opacity, mobject2.stroke_opacity, alpha, ) self.pixel_array = interpolate( mobject1.pixel_array, mobject2.pixel_array, alpha, ).astype(self.pixel_array_dtype) def get_style(self) -> dict[str, Any]: return { "fill_color": ManimColor(self.color.to_rgb()).to_hex(), "fill_opacity": self.fill_opacity, } # TODO, add the ability to have the dimensions/orientation of this # mobject more strongly tied to the frame of the camera it contains, # in the case where that's a MovingCamera class ImageMobjectFromCamera(AbstractImageMobject): def __init__( self, camera: MovingCamera, default_display_frame_config: dict[str, Any] | None = None, **kwargs: Any, ) -> None: self.camera = camera if default_display_frame_config is None: default_display_frame_config = { "stroke_width": 3, "stroke_color": WHITE, "buff": 0, } self.default_display_frame_config = default_display_frame_config self.pixel_array = self.camera.pixel_array super().__init__(scale_to_resolution=False, **kwargs) # TODO: Get rid of this. def get_pixel_array(self) -> PixelArray: self.pixel_array = self.camera.pixel_array return self.pixel_array def add_display_frame(self, **kwargs: Any) -> Self: config = dict(self.default_display_frame_config) config.update(kwargs) self.display_frame = SurroundingRectangle(self, **config) self.add(self.display_frame) return self def interpolate_color( self, mobject1: Mobject, mobject2: Mobject, alpha: float ) -> None: assert isinstance(mobject1, ImageMobjectFromCamera) assert isinstance(mobject2, ImageMobjectFromCamera) assert mobject1.pixel_array.shape == mobject2.pixel_array.shape, ( f"Mobject pixel array shapes incompatible for interpolation.\n" f"Mobject 1 ({mobject1}) : {mobject1.pixel_array.shape}\n" f"Mobject 2 ({mobject2}) : {mobject2.pixel_array.shape}" ) self.pixel_array = interpolate( mobject1.pixel_array, mobject2.pixel_array, alpha, ).astype(self.pixel_array_dtype) ManimCommunity-manim-1157b74/manim/mobject/types/point_cloud_mobject.py000066400000000000000000000331111515024150700263160ustar00rootroot00000000000000"""Mobjects representing point clouds.""" from __future__ import annotations __all__ = ["PMobject", "Mobject1D", "Mobject2D", "PGroup", "PointCloudDot", "Point"] from collections.abc import Callable from typing import TYPE_CHECKING, Any import numpy as np from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_point_cloud_mobject import OpenGLPMobject from ...constants import * from ...mobject.mobject import Mobject from ...utils.bezier import interpolate from ...utils.color import ( BLACK, PURE_YELLOW, WHITE, ManimColor, ParsableManimColor, color_gradient, color_to_rgba, rgba_to_color, ) from ...utils.iterables import stretch_array_to_length __all__ = ["PMobject", "Mobject1D", "Mobject2D", "PGroup", "PointCloudDot", "Point"] if TYPE_CHECKING: from typing import Self import numpy.typing as npt from manim.typing import ( FloatRGBA_Array, FloatRGBALike_Array, ManimFloat, Point3D_Array, Point3DLike, Point3DLike_Array, ) class PMobject(Mobject, metaclass=ConvertToOpenGL): """A disc made of a cloud of Dots Examples -------- .. manim:: PMobjectExample :save_last_frame: class PMobjectExample(Scene): def construct(self): pG = PGroup() # This is just a collection of PMobject's # As the scale factor increases, the number of points # removed increases. for sf in range(1, 9 + 1): p = PointCloudDot(density=20, radius=1).thin_out(sf) # PointCloudDot is a type of PMobject # and can therefore be added to a PGroup pG.add(p) # This organizes all the shapes in a grid. pG.arrange_in_grid() self.add(pG) """ def __init__(self, stroke_width: int = DEFAULT_STROKE_WIDTH, **kwargs: Any) -> None: self.stroke_width = stroke_width super().__init__(**kwargs) def reset_points(self) -> Self: self.rgbas: FloatRGBA_Array = np.zeros((0, 4)) self.points: Point3D_Array = np.zeros((0, 3)) return self def get_array_attrs(self) -> list[str]: return super().get_array_attrs() + ["rgbas"] def add_points( self, points: Point3DLike_Array, rgbas: FloatRGBALike_Array | None = None, color: ParsableManimColor | None = None, alpha: float = 1.0, ) -> Self: """Add points. Points must be a Nx3 numpy array. Rgbas must be a Nx4 numpy array if it is not None. """ if not isinstance(points, np.ndarray): points = np.array(points) num_new_points = len(points) self.points = np.append(self.points, points, axis=0) if rgbas is None: color = ManimColor(color) if color else self.color rgbas = np.repeat([color_to_rgba(color, alpha)], num_new_points, axis=0) elif len(rgbas) != len(points): raise ValueError("points and rgbas must have same length") self.rgbas = np.append(self.rgbas, rgbas, axis=0) return self def set_color( self, color: ParsableManimColor = PURE_YELLOW, family: bool = True ) -> Self: rgba = color_to_rgba(color) mobs = self.family_members_with_points() if family else [self] for mob in mobs: mob.rgbas[:, :] = rgba self.color = ManimColor.parse(color) return self def get_stroke_width(self) -> int: return self.stroke_width def set_stroke_width(self, width: int, family: bool = True) -> Self: mobs = self.family_members_with_points() if family else [self] for mob in mobs: mob.stroke_width = width return self def set_color_by_gradient(self, *colors: ParsableManimColor) -> Self: self.rgbas = np.array( list(map(color_to_rgba, color_gradient(colors, len(self.points)))), ) return self def set_colors_by_radial_gradient( self, center: Point3DLike | None = None, radius: float = 1, inner_color: ParsableManimColor = WHITE, outer_color: ParsableManimColor = BLACK, ) -> Self: start_rgba, end_rgba = list(map(color_to_rgba, [inner_color, outer_color])) if center is None: center = self.get_center() for mob in self.family_members_with_points(): distances = np.abs(self.points - center) alphas = np.linalg.norm(distances, axis=1) / radius mob.rgbas = np.array( np.array( [interpolate(start_rgba, end_rgba, alpha) for alpha in alphas], ), ) return self def match_colors(self, mobject: Mobject) -> Self: Mobject.align_data(self, mobject) self.rgbas = np.array(mobject.rgbas) return self def filter_out(self, condition: npt.NDArray) -> Self: for mob in self.family_members_with_points(): to_eliminate = ~np.apply_along_axis(condition, 1, mob.points) mob.points = mob.points[to_eliminate] mob.rgbas = mob.rgbas[to_eliminate] return self def thin_out(self, factor: int = 5) -> Self: """Removes all but every nth point for n = factor""" for mob in self.family_members_with_points(): num_points = self.get_num_points() mob.apply_over_attr_arrays( lambda arr, n=num_points: arr[np.arange(0, n, factor)], # type: ignore[misc] ) return self def sort_points( self, function: Callable[[npt.NDArray[ManimFloat]], float] = lambda p: p[0] ) -> Self: """Function is any map from R^3 to R""" for mob in self.family_members_with_points(): indices = np.argsort(np.apply_along_axis(function, 1, mob.points)) mob.apply_over_attr_arrays(lambda arr, idx=indices: arr[idx]) # type: ignore[misc] return self def fade_to( self, color: ParsableManimColor, alpha: float, family: bool = True ) -> Self: self.rgbas = interpolate(self.rgbas, color_to_rgba(color), alpha) for mob in self.submobjects: mob.fade_to(color, alpha, family) return self def get_all_rgbas(self) -> npt.NDArray: return self.get_merged_array("rgbas") def ingest_submobjects(self) -> Self: attrs = self.get_array_attrs() arrays = list(map(self.get_merged_array, attrs)) for attr, array in zip(attrs, arrays, strict=True): setattr(self, attr, array) self.submobjects = [] return self def get_color(self) -> ManimColor: return rgba_to_color(self.rgbas[0, :]) def point_from_proportion(self, alpha: float) -> Any: index = alpha * (self.get_num_points() - 1) return self.points[np.floor(index)] @staticmethod def get_mobject_type_class() -> type[PMobject]: return PMobject # Alignment def align_points_with_larger(self, larger_mobject: Mobject) -> None: assert isinstance(larger_mobject, PMobject) self.apply_over_attr_arrays( lambda a: stretch_array_to_length(a, larger_mobject.get_num_points()), ) def get_point_mobject(self, center: Point3DLike | None = None) -> Point: if center is None: center = self.get_center() return Point(center) def interpolate_color( self, mobject1: Mobject, mobject2: Mobject, alpha: float ) -> Self: self.rgbas = interpolate(mobject1.rgbas, mobject2.rgbas, alpha) self.set_stroke_width( interpolate( mobject1.get_stroke_width(), mobject2.get_stroke_width(), alpha, ), ) return self def pointwise_become_partial(self, mobject: Mobject, a: float, b: float) -> None: lower_index, upper_index = (int(x * mobject.get_num_points()) for x in (a, b)) for attr in self.get_array_attrs(): full_array = getattr(mobject, attr) partial_array = full_array[lower_index:upper_index] setattr(self, attr, partial_array) # TODO, Make the two implementations below non-redundant class Mobject1D(PMobject, metaclass=ConvertToOpenGL): def __init__(self, density: int = DEFAULT_POINT_DENSITY_1D, **kwargs: Any) -> None: self.density = density self.epsilon = 1.0 / self.density super().__init__(**kwargs) def add_line( self, start: npt.NDArray, end: npt.NDArray, color: ParsableManimColor | None = None, ) -> None: start, end = list(map(np.array, [start, end])) length = np.linalg.norm(end - start) if length == 0: points = np.array([start]) else: epsilon = self.epsilon / length points = np.array( [interpolate(start, end, t) for t in np.arange(0, 1, epsilon)] ) self.add_points(points, color=color) class Mobject2D(PMobject, metaclass=ConvertToOpenGL): def __init__(self, density: int = DEFAULT_POINT_DENSITY_2D, **kwargs: Any) -> None: self.density = density self.epsilon = 1.0 / self.density super().__init__(**kwargs) class PGroup(PMobject): """A group for several point mobjects. Examples -------- .. manim:: PgroupExample :save_last_frame: class PgroupExample(Scene): def construct(self): p1 = PointCloudDot(radius=1, density=20, color=BLUE) p1.move_to(4.5 * LEFT) p2 = PointCloudDot() p3 = PointCloudDot(radius=1.5, stroke_width=2.5, color=PINK) p3.move_to(4.5 * RIGHT) pList = PGroup(p1, p2, p3) self.add(pList) """ def __init__(self, *pmobs: Any, **kwargs: Any) -> None: if not all(isinstance(m, (PMobject, OpenGLPMobject)) for m in pmobs): raise ValueError( "All submobjects must be of type PMobject or OpenGLPMObject" " if using the opengl renderer", ) super().__init__(**kwargs) self.add(*pmobs) def fade_to( self, color: ParsableManimColor, alpha: float, family: bool = True ) -> Self: if family: for mob in self.submobjects: mob.fade_to(color, alpha, family) return self class PointCloudDot(Mobject1D): """A disc made of a cloud of dots. Examples -------- .. manim:: PointCloudDotExample :save_last_frame: class PointCloudDotExample(Scene): def construct(self): cloud_1 = PointCloudDot(color=RED) cloud_2 = PointCloudDot(stroke_width=4, radius=1) cloud_3 = PointCloudDot(density=15) group = Group(cloud_1, cloud_2, cloud_3).arrange() self.add(group) .. manim:: PointCloudDotExample2 class PointCloudDotExample2(Scene): def construct(self): plane = ComplexPlane() cloud = PointCloudDot(color=RED) self.add( plane, cloud ) self.wait() self.play( cloud.animate.apply_complex_function(lambda z: np.exp(z)) ) """ def __init__( self, center: Point3DLike = ORIGIN, radius: float = 2.0, stroke_width: int = 2, density: int = DEFAULT_POINT_DENSITY_1D, color: ManimColor = PURE_YELLOW, **kwargs: Any, ) -> None: self.radius = radius self.epsilon = 1.0 / density super().__init__( stroke_width=stroke_width, density=density, color=color, **kwargs ) self.shift(center) def init_points(self) -> None: self.reset_points() self.generate_points() def generate_points(self) -> None: self.add_points( np.array( [ r * (np.cos(theta) * RIGHT + np.sin(theta) * UP) for r in np.arange(self.epsilon, self.radius, self.epsilon) # Num is equal to int(stop - start)/ (step + 1) reformulated. for theta in np.linspace( 0, 2 * np.pi, num=int(2 * np.pi * (r + self.epsilon) / self.epsilon), ) ] ), ) class Point(PMobject): """A mobject representing a point. Examples -------- .. manim:: ExamplePoint :save_last_frame: class ExamplePoint(Scene): def construct(self): colorList = [RED, GREEN, BLUE, YELLOW] for i in range(200): point = Point(location=[0.63 * np.random.randint(-4, 4), 0.37 * np.random.randint(-4, 4), 0], color=np.random.choice(colorList)) self.add(point) for i in range(200): point = Point(location=[0.37 * np.random.randint(-4, 4), 0.63 * np.random.randint(-4, 4), 0], color=np.random.choice(colorList)) self.add(point) self.add(point) """ def __init__( self, location: Point3DLike = ORIGIN, color: ManimColor = BLACK, **kwargs: Any ) -> None: self.location = location super().__init__(color=color, **kwargs) def init_points(self) -> None: self.reset_points() self.generate_points() self.set_points([self.location]) def generate_points(self) -> None: self.add_points(np.array([self.location])) ManimCommunity-manim-1157b74/manim/mobject/types/vectorized_mobject.py000066400000000000000000003057351515024150700261730ustar00rootroot00000000000000"""Mobjects that use vector graphics.""" from __future__ import annotations __all__ = [ "VMobject", "VGroup", "VDict", "VectorizedPoint", "CurvesAsSubmobjects", "DashedVMobject", ] import itertools as it import sys from collections.abc import Callable, Hashable, Iterable, Mapping, Sequence from typing import TYPE_CHECKING, Any, Literal import numpy as np from PIL.Image import Image from manim import config from manim.constants import * from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.mobject.three_d.three_d_utils import ( get_3d_vmob_gradient_start_and_end_points, ) from manim.utils.bezier import ( bezier, bezier_remap, get_smooth_cubic_bezier_handle_points, integer_interpolate, interpolate, partial_bezier_points, proportions_along_bezier_curve_for_point, ) from manim.utils.color import BLACK, WHITE, ManimColor, ParsableManimColor from manim.utils.iterables import ( make_even, resize_array, stretch_array_to_length, tuplify, ) from manim.utils.space_ops import rotate_vector, shoelace_direction if TYPE_CHECKING: from typing import Self import numpy.typing as npt from manim.typing import ( CubicBezierPath, CubicBezierPointsLike, CubicSpline, FloatRGBA, FloatRGBA_Array, ManimFloat, MappingFunction, Point2DLike, Point3D, Point3D_Array, Point3DLike, Point3DLike_Array, Vector3D, Vector3DLike, ) # TODO # - Change cubic curve groups to have 4 points instead of 3 # - Change sub_path idea accordingly # - No more mark_paths_closed, instead have the camera test # if last point in close to first point # - Think about length of self.points. Always 0 or 1 mod 4? # That's kind of weird. class VMobject(Mobject): """A vectorized mobject. Parameters ---------- background_stroke_color The purpose of background stroke is to have something that won't overlap fill, e.g. For text against some textured background. sheen_factor When a color c is set, there will be a second color computed based on interpolating c to WHITE by with sheen_factor, and the display will gradient to this secondary color in the direction of sheen_direction. close_new_points Indicates that it will not be displayed, but that it should count in parent mobject's path tolerance_for_point_equality This is within a pixel joint_type The line joint type used to connect the curve segments of this vectorized mobject. See :class:`.LineJointType` for options. """ sheen_factor = 0.0 def __init__( self, fill_color: ParsableManimColor | None = None, fill_opacity: float = 0.0, stroke_color: ParsableManimColor | None = None, stroke_opacity: float = 1.0, stroke_width: float = DEFAULT_STROKE_WIDTH, background_stroke_color: ParsableManimColor | None = BLACK, background_stroke_opacity: float = 1.0, background_stroke_width: float = 0, sheen_factor: float = 0.0, joint_type: LineJointType | None = None, sheen_direction: Vector3DLike = UL, close_new_points: bool = False, pre_function_handle_to_anchor_scale_factor: float = 0.01, make_smooth_after_applying_functions: bool = False, background_image: Image | str | None = None, shade_in_3d: bool = False, # TODO, do we care about accounting for varying zoom levels? tolerance_for_point_equality: float = 1e-6, n_points_per_cubic_curve: int = 4, cap_style: CapStyleType = CapStyleType.AUTO, **kwargs: Any, ): self.fill_opacity = fill_opacity self.stroke_opacity = stroke_opacity self.stroke_width = stroke_width if background_stroke_color is not None: self.background_stroke_color: ManimColor = ManimColor( background_stroke_color ) self.background_stroke_opacity: float = background_stroke_opacity self.background_stroke_width: float = background_stroke_width self.sheen_factor: float = sheen_factor self.joint_type: LineJointType = ( LineJointType.AUTO if joint_type is None else joint_type ) self.sheen_direction = sheen_direction self.close_new_points: bool = close_new_points self.pre_function_handle_to_anchor_scale_factor: float = ( pre_function_handle_to_anchor_scale_factor ) self.make_smooth_after_applying_functions: bool = ( make_smooth_after_applying_functions ) self.background_image: Image | str | None = background_image self.shade_in_3d: bool = shade_in_3d self.tolerance_for_point_equality: float = tolerance_for_point_equality self.n_points_per_cubic_curve: int = n_points_per_cubic_curve self._bezier_t_values: npt.NDArray[float] = np.linspace( 0, 1, n_points_per_cubic_curve ) self.cap_style: CapStyleType = cap_style super().__init__(**kwargs) self.submobjects: list[VMobject] # TODO: Find where color overwrites are happening and remove the color doubling # if "color" in kwargs: # fill_color = kwargs["color"] # stroke_color = kwargs["color"] if fill_color is not None: self.fill_color = ManimColor.parse(fill_color) if stroke_color is not None: self.stroke_color = ManimColor.parse(stroke_color) def _assert_valid_submobjects(self, submobjects: Iterable[VMobject]) -> Self: return self._assert_valid_submobjects_internal(submobjects, VMobject) # OpenGL compatibility @property def n_points_per_curve(self) -> int: return self.n_points_per_cubic_curve def get_group_class(self) -> type[VGroup]: return VGroup @staticmethod def get_mobject_type_class() -> type[VMobject]: return VMobject # Colors def init_colors(self, propagate_colors: bool = True) -> Self: self.set_fill( color=self.fill_color, opacity=self.fill_opacity, family=propagate_colors, ) self.set_stroke( color=self.stroke_color, width=self.stroke_width, opacity=self.stroke_opacity, family=propagate_colors, ) self.set_background_stroke( color=self.background_stroke_color, width=self.background_stroke_width, opacity=self.background_stroke_opacity, family=propagate_colors, ) self.set_sheen( factor=self.sheen_factor, direction=self.sheen_direction, family=propagate_colors, ) if not propagate_colors: for submobject in self.submobjects: submobject.init_colors(propagate_colors=False) return self def generate_rgbas_array( self, color: ParsableManimColor | Iterable[ManimColor] | None, opacity: float | Iterable[float], ) -> FloatRGBA: """ First arg can be either a color, or a tuple/list of colors. Likewise, opacity can either be a float, or a tuple of floats. If self.sheen_factor is not zero, and only one color was passed in, a second slightly light color will automatically be added for the gradient """ colors: list[ManimColor] = [ ManimColor(c) if (c is not None) else BLACK for c in tuplify(color) ] opacities: list[float] = [ o if (o is not None) else 0.0 for o in tuplify(opacity) ] rgbas: FloatRGBA_Array = np.array( [ c.to_rgba_with_alpha(o) for c, o in zip(*make_even(colors, opacities), strict=True) ], ) sheen_factor = self.get_sheen_factor() if sheen_factor != 0 and len(rgbas) == 1: light_rgbas = np.array(rgbas) light_rgbas[:, :3] += sheen_factor np.clip(light_rgbas, 0, 1, out=light_rgbas) rgbas = np.append(rgbas, light_rgbas, axis=0) return rgbas def update_rgbas_array( self, array_name: str, color: ParsableManimColor | Iterable[ManimColor] | None = None, opacity: float | None = None, ) -> Self: rgbas = self.generate_rgbas_array(color, opacity) if not hasattr(self, array_name): setattr(self, array_name, rgbas) return self # Match up current rgbas array with the newly calculated # one. 99% of the time they'll be the same. curr_rgbas = getattr(self, array_name) if len(curr_rgbas) < len(rgbas): curr_rgbas = stretch_array_to_length(curr_rgbas, len(rgbas)) setattr(self, array_name, curr_rgbas) elif len(rgbas) < len(curr_rgbas): rgbas = stretch_array_to_length(rgbas, len(curr_rgbas)) # Only update rgb if color was not None, and only # update alpha channel if opacity was passed in if color is not None: curr_rgbas[:, :3] = rgbas[:, :3] if opacity is not None: curr_rgbas[:, 3] = rgbas[:, 3] return self def set_fill( self, color: ParsableManimColor | None = None, opacity: float | None = None, family: bool = True, ) -> Self: """Set the fill color and fill opacity of a :class:`VMobject`. Parameters ---------- color Fill color of the :class:`VMobject`. opacity Fill opacity of the :class:`VMobject`. family If ``True``, the fill color of all submobjects is also set. Returns ------- :class:`VMobject` ``self`` Examples -------- .. manim:: SetFill :save_last_frame: class SetFill(Scene): def construct(self): square = Square().scale(2).set_fill(WHITE,1) circle1 = Circle().set_fill(GREEN,0.8) circle2 = Circle().set_fill(YELLOW) # No fill_opacity circle3 = Circle().set_fill(color = '#FF2135', opacity = 0.2) group = Group(circle1,circle2,circle3).arrange() self.add(square) self.add(group) See Also -------- :meth:`~.VMobject.set_style` """ if family: for submobject in self.submobjects: submobject.set_fill(color, opacity, family) self.update_rgbas_array("fill_rgbas", color, opacity) self.fill_rgbas: FloatRGBA_Array if opacity is not None: self.fill_opacity = opacity return self def set_stroke( self, color: ParsableManimColor = None, width: float | None = None, opacity: float | None = None, background=False, family: bool = True, ) -> Self: if family: for submobject in self.submobjects: submobject.set_stroke(color, width, opacity, background, family) if background: array_name = "background_stroke_rgbas" width_name = "background_stroke_width" opacity_name = "background_stroke_opacity" else: array_name = "stroke_rgbas" width_name = "stroke_width" opacity_name = "stroke_opacity" self.update_rgbas_array(array_name, color, opacity) if width is not None: setattr(self, width_name, width) if opacity is not None: setattr(self, opacity_name, opacity) if color is not None and background: if isinstance(color, (list, tuple)): self.background_stroke_color = ManimColor.parse(color) else: self.background_stroke_color = ManimColor(color) return self def set_cap_style(self, cap_style: CapStyleType) -> Self: """ Sets the cap style of the :class:`VMobject`. Parameters ---------- cap_style The cap style to be set. See :class:`.CapStyleType` for options. Returns ------- :class:`VMobject` ``self`` Examples -------- .. manim:: CapStyleExample :save_last_frame: class CapStyleExample(Scene): def construct(self): line = Line(LEFT, RIGHT, color=YELLOW, stroke_width=20) line.set_cap_style(CapStyleType.ROUND) self.add(line) """ self.cap_style = cap_style return self def set_background_stroke(self, **kwargs) -> Self: kwargs["background"] = True self.set_stroke(**kwargs) return self def set_style( self, fill_color: ParsableManimColor | None = None, fill_opacity: float | None = None, stroke_color: ParsableManimColor | None = None, stroke_width: float | None = None, stroke_opacity: float | None = None, background_stroke_color: ParsableManimColor | None = None, background_stroke_width: float | None = None, background_stroke_opacity: float | None = None, sheen_factor: float | None = None, sheen_direction: Vector3DLike | None = None, background_image: Image | str | None = None, family: bool = True, ) -> Self: self.set_fill(color=fill_color, opacity=fill_opacity, family=family) self.set_stroke( color=stroke_color, width=stroke_width, opacity=stroke_opacity, family=family, ) self.set_background_stroke( color=background_stroke_color, width=background_stroke_width, opacity=background_stroke_opacity, family=family, ) if sheen_factor: self.set_sheen( factor=sheen_factor, direction=sheen_direction, family=family, ) if background_image: self.color_using_background_image(background_image) return self def get_style(self, simple: bool = False) -> dict: ret = { "stroke_opacity": self.get_stroke_opacity(), "stroke_width": self.get_stroke_width(), } # TODO: FIX COLORS HERE if simple: ret["fill_color"] = self.get_fill_color() ret["fill_opacity"] = self.get_fill_opacity() ret["stroke_color"] = self.get_stroke_color() else: ret["fill_color"] = self.get_fill_colors() ret["fill_opacity"] = self.get_fill_opacities() ret["stroke_color"] = self.get_stroke_colors() ret["background_stroke_color"] = self.get_stroke_colors(background=True) ret["background_stroke_width"] = self.get_stroke_width(background=True) ret["background_stroke_opacity"] = self.get_stroke_opacity(background=True) ret["sheen_factor"] = self.get_sheen_factor() ret["sheen_direction"] = self.get_sheen_direction() ret["background_image"] = self.get_background_image() return ret def match_style(self, vmobject: VMobject, family: bool = True) -> Self: self.set_style(**vmobject.get_style(), family=False) if family: # Does its best to match up submobject lists, and # match styles accordingly submobs1, submobs2 = self.submobjects, vmobject.submobjects if len(submobs1) == 0: return self elif len(submobs2) == 0: submobs2 = [vmobject] for sm1, sm2 in zip(*make_even(submobs1, submobs2), strict=True): sm1.match_style(sm2) return self def set_color(self, color: ParsableManimColor, family: bool = True) -> Self: self.set_fill(color, family=family) self.set_stroke(color, family=family) return self def set_opacity(self, opacity: float, family: bool = True) -> Self: self.set_fill(opacity=opacity, family=family) self.set_stroke(opacity=opacity, family=family) self.set_stroke(opacity=opacity, family=family, background=True) return self def scale( self, scale_factor: float, scale_stroke: bool = False, *, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: r"""Scale the size by a factor. Default behavior is to scale about the center of the vmobject. Parameters ---------- scale_factor The scaling factor :math:`\alpha`. If :math:`0 < |\alpha|ย < 1`, the mobject will shrink, and for :math:`|\alpha| > 1` it will grow. Furthermore, if :math:`\alpha < 0`, the mobject is also flipped. scale_stroke Boolean determining if the object's outline is scaled when the object is scaled. If enabled, and object with 2px outline is scaled by a factor of .5, it will have an outline of 1px. kwargs Additional keyword arguments passed to :meth:`~.Mobject.scale`. Returns ------- :class:`VMobject` ``self`` Examples -------- .. manim:: MobjectScaleExample :save_last_frame: class MobjectScaleExample(Scene): def construct(self): c1 = Circle(1, RED).set_x(-1) c2 = Circle(1, GREEN).set_x(1) vg = VGroup(c1, c2) vg.set_stroke(width=50) self.add(vg) self.play( c1.animate.scale(.25), c2.animate.scale(.25, scale_stroke=True) ) See also -------- :meth:`move_to` """ if scale_stroke: self.set_stroke(width=abs(scale_factor) * self.get_stroke_width()) self.set_stroke( width=abs(scale_factor) * self.get_stroke_width(background=True), background=True, ) super().scale(scale_factor, about_point=about_point, about_edge=about_edge) return self def fade(self, darkness: float = 0.5, family: bool = True) -> Self: factor = 1.0 - darkness self.set_fill(opacity=factor * self.get_fill_opacity(), family=False) self.set_stroke(opacity=factor * self.get_stroke_opacity(), family=False) self.set_background_stroke( opacity=factor * self.get_stroke_opacity(background=True), family=False, ) super().fade(darkness, family) return self def get_fill_rgbas(self) -> FloatRGBA_Array: try: return self.fill_rgbas except AttributeError: return np.zeros((1, 4)) def get_fill_color(self) -> ManimColor: """ If there are multiple colors (for gradient) this returns the first one """ return self.get_fill_colors()[0] fill_color = property(get_fill_color, set_fill) def get_fill_opacity(self) -> ManimFloat: """ If there are multiple opacities, this returns the first """ return self.get_fill_opacities()[0] # TODO: Does this just do a copy? # TODO: I have the feeling that this function should not return None, does that have any usage ? def get_fill_colors(self) -> list[ManimColor | None]: return [ ManimColor(rgba[:3]) if rgba.any() else None for rgba in self.get_fill_rgbas() ] def get_fill_opacities(self) -> npt.NDArray[ManimFloat]: return self.get_fill_rgbas()[:, 3] def get_stroke_rgbas(self, background: bool = False) -> FloatRGBA_Array: try: if background: self.background_stroke_rgbas: FloatRGBA_Array rgbas = self.background_stroke_rgbas else: self.stroke_rgbas: FloatRGBA_Array rgbas = self.stroke_rgbas return rgbas except AttributeError: return np.zeros((1, 4)) def get_stroke_color(self, background: bool = False) -> ManimColor | None: return self.get_stroke_colors(background)[0] stroke_color = property(get_stroke_color, set_stroke) def get_stroke_width(self, background: bool = False) -> float: if background: width = self.background_stroke_width else: width = self.stroke_width if isinstance(width, str): width = int(width) return max(0.0, width) def get_stroke_opacity(self, background: bool = False) -> ManimFloat: return self.get_stroke_opacities(background)[0] def get_stroke_colors(self, background: bool = False) -> list[ManimColor | None]: return [ ManimColor(rgba[:3]) if rgba.any() else None for rgba in self.get_stroke_rgbas(background) ] def get_stroke_opacities(self, background: bool = False) -> npt.NDArray[ManimFloat]: return self.get_stroke_rgbas(background)[:, 3] def get_color(self) -> ManimColor: if np.all(self.get_fill_opacities() == 0): return self.get_stroke_color() return self.get_fill_color() color: ManimColor = property(get_color, set_color) def set_sheen_direction(self, direction: Vector3DLike, family: bool = True) -> Self: """Sets the direction of the applied sheen. Parameters ---------- direction Direction from where the gradient is applied. Examples -------- Normal usage:: Circle().set_sheen_direction(UP) See Also -------- :meth:`~.VMobject.set_sheen` :meth:`~.VMobject.rotate_sheen_direction` """ direction_copy = np.array(direction) if family: for submob in self.get_family(): submob.sheen_direction = direction_copy.copy() else: self.sheen_direction = direction_copy return self def rotate_sheen_direction( self, angle: float, axis: Vector3DLike = OUT, family: bool = True ) -> Self: """Rotates the direction of the applied sheen. Parameters ---------- angle Angle by which the direction of sheen is rotated. axis Axis of rotation. Examples -------- Normal usage:: Circle().set_sheen_direction(UP).rotate_sheen_direction(PI) See Also -------- :meth:`~.VMobject.set_sheen_direction` """ if family: for submob in self.get_family(): submob.sheen_direction = rotate_vector( submob.sheen_direction, angle, axis, ) else: self.sheen_direction = rotate_vector(self.sheen_direction, angle, axis) return self def set_sheen( self, factor: float, direction: Vector3DLike | None = None, family: bool = True ) -> Self: """Applies a color gradient from a direction. Parameters ---------- factor The extent of lustre/gradient to apply. If negative, the gradient starts from black, if positive the gradient starts from white and changes to the current color. direction Direction from where the gradient is applied. Examples -------- .. manim:: SetSheen :save_last_frame: class SetSheen(Scene): def construct(self): circle = Circle(fill_opacity=1).set_sheen(-0.3, DR) self.add(circle) """ if family: for submob in self.submobjects: submob.set_sheen(factor, direction, family) self.sheen_factor: float = factor if direction is not None: # family set to false because recursion will # already be handled above self.set_sheen_direction(direction, family=False) # Reset color to put sheen_factor into effect if factor != 0: self.set_stroke(self.get_stroke_color(), family=family) self.set_fill(self.get_fill_color(), family=family) return self def get_sheen_direction(self) -> Vector3D: return np.array(self.sheen_direction) def get_sheen_factor(self) -> float: return self.sheen_factor def get_gradient_start_and_end_points(self) -> tuple[Point3D, Point3D]: if self.shade_in_3d: return get_3d_vmob_gradient_start_and_end_points(self) else: direction = self.get_sheen_direction() c = self.get_center() bases = np.array( [self.get_edge_center(vect) - c for vect in [RIGHT, UP, OUT]], ).transpose() offset = np.dot(bases, direction) return (c - offset, c + offset) def color_using_background_image(self, background_image: Image | str) -> Self: self.background_image: Image | str = background_image self.set_color(WHITE) for submob in self.submobjects: submob.color_using_background_image(background_image) return self def get_background_image(self) -> Image | str: return self.background_image def match_background_image(self, vmobject: VMobject) -> Self: self.color_using_background_image(vmobject.get_background_image()) return self def set_shade_in_3d( self, value: bool = True, z_index_as_group: bool = False ) -> Self: for submob in self.get_family(): submob.shade_in_3d = value if z_index_as_group: submob.z_index_group = self return self def set_points(self, points: Point3DLike_Array) -> Self: self.points: Point3D_Array = np.array(points) return self def resize_points( self, new_length: int, resize_func: Callable[[Point3D_Array, int], Point3D_Array] = resize_array, ) -> Self: """Resize the array of anchor points and handles to have the specified size. Parameters ---------- new_length The new (total) number of points. resize_func A function mapping a Numpy array (the points) and an integer (the target size) to a Numpy array. The default implementation is based on Numpy's ``resize`` function. """ if new_length != len(self.points): self.points = resize_func(self.points, new_length) return self def set_anchors_and_handles( self, anchors1: Point3DLike_Array, handles1: Point3DLike_Array, handles2: Point3DLike_Array, anchors2: Point3DLike_Array, ) -> Self: """Given two sets of anchors and handles, process them to set them as anchors and handles of the VMobject. anchors1[i], handles1[i], handles2[i] and anchors2[i] define the i-th bezier curve of the vmobject. There are four hardcoded parameters and this is a problem as it makes the number of points per cubic curve unchangeable from 4 (two anchors and two handles). Returns ------- :class:`VMobject` ``self`` """ assert len(anchors1) == len(handles1) == len(handles2) == len(anchors2) nppcc = self.n_points_per_cubic_curve # 4 total_len = nppcc * len(anchors1) self.points = np.empty((total_len, self.dim)) # the following will, from the four sets, dispatch them in points such that # self.points = [ # anchors1[0], handles1[0], handles2[0], anchors1[0], anchors1[1], # handles1[1], ... # ] arrays = [anchors1, handles1, handles2, anchors2] for index, array in enumerate(arrays): self.points[index::nppcc] = array return self def clear_points(self) -> None: # TODO: shouldn't this return self instead of None? self.points = np.zeros((0, self.dim)) def append_points(self, new_points: Point3DLike_Array) -> Self: """Append the given ``new_points`` to the end of :attr:`VMobject.points`. Parameters ---------- new_points An array of 3D points to append. Returns ------- :class:`VMobject` The VMobject itself, after appending ``new_points``. """ # TODO, check that number new points is a multiple of 4? # or else that if len(self.points) % 4 == 1, then # len(new_points) % 4 == 3? n = len(self.points) points = np.empty((n + len(new_points), self.dim)) points[:n] = self.points points[n:] = new_points self.points = points return self def start_new_path(self, point: Point3DLike) -> Self: """Append a ``point`` to the :attr:`VMobject.points`, which will be the beginning of a new Bรฉzier curve in the path given by the points. If there's an unfinished curve at the end of :attr:`VMobject.points`, complete it by appending the last Bรฉzier curve's start anchor as many times as needed. Parameters ---------- point A 3D point to append to :attr:`VMobject.points`. Returns ------- :class:`VMobject` The VMobject itself, after appending ``point`` and starting a new curve. """ n_points = len(self.points) nppc = self.n_points_per_curve if n_points % nppc != 0: # close the open path by appending the last # start anchor sufficiently often last_anchor = self.get_start_anchors()[-1] closure = [last_anchor] * (nppc - (n_points % nppc)) self.append_points(closure + [point]) else: self.append_points([point]) return self def add_cubic_bezier_curve( self, anchor1: Point3DLike, handle1: Point3DLike, handle2: Point3DLike, anchor2: Point3DLike, ) -> None: # TODO, check the len(self.points) % 4 == 0? self.append_points([anchor1, handle1, handle2, anchor2]) # what type is curves? def add_cubic_bezier_curves(self, curves) -> None: self.append_points(curves.flatten()) def add_cubic_bezier_curve_to( self, handle1: Point3DLike, handle2: Point3DLike, anchor: Point3DLike, ) -> Self: """Add cubic bezier curve to the path. NOTE : the first anchor is not a parameter as by default the end of the last sub-path! Parameters ---------- handle1 first handle handle2 second handle anchor anchor Returns ------- :class:`VMobject` ``self`` """ self.throw_error_if_no_points() new_points = [handle1, handle2, anchor] if self.has_new_path_started(): self.append_points(new_points) else: self.append_points([self.get_last_point()] + new_points) return self def add_quadratic_bezier_curve_to( self, handle: Point3DLike, anchor: Point3DLike, ) -> Self: """Add Quadratic bezier curve to the path. Returns ------- :class:`VMobject` ``self`` """ # How does one approximate a quadratic with a cubic? # refer to the Wikipedia page on Bezier curves # https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Degree_elevation, accessed Jan 20, 2021 # 1. Copy the end points, and then # 2. Place the 2 middle control points 2/3 along the line segments # from the end points to the quadratic curve's middle control point. # I think that's beautiful. self.add_cubic_bezier_curve_to( 2 / 3 * handle + 1 / 3 * self.get_last_point(), 2 / 3 * handle + 1 / 3 * anchor, anchor, ) return self def add_line_to(self, point: Point3DLike) -> Self: """Add a straight line from the last point of VMobject to the given point. Parameters ---------- point The end of the straight line. Returns ------- :class:`VMobject` ``self`` """ self.add_cubic_bezier_curve_to( *( interpolate(self.get_last_point(), point, t) for t in self._bezier_t_values[1:] ) ) return self def add_smooth_curve_to(self, *points: Point3DLike) -> Self: """Creates a smooth curve from given points and add it to the VMobject. If two points are passed in, the first is interpreted as a handle, the second as an anchor. Parameters ---------- points Points (anchor and handle, or just anchor) to add a smooth curve from Returns ------- :class:`VMobject` ``self`` Raises ------ ValueError If 0 or more than 2 points are given. """ # TODO remove the value error and just add two parameters with one optional if len(points) == 1: handle2 = None new_anchor = points[0] elif len(points) == 2: handle2, new_anchor = points else: name = sys._getframe(0).f_code.co_name raise ValueError(f"Only call {name} with 1 or 2 points") if self.has_new_path_started(): self.add_line_to(new_anchor) else: self.throw_error_if_no_points() last_h2, last_a2 = self.points[-2:] last_tangent = last_a2 - last_h2 handle1 = last_a2 + last_tangent if handle2 is None: to_anchor_vect = new_anchor - last_a2 new_tangent = rotate_vector(last_tangent, PI, axis=to_anchor_vect) handle2 = new_anchor - new_tangent self.append_points([last_a2, handle1, handle2, new_anchor]) return self def has_new_path_started(self) -> bool: nppcc = self.n_points_per_cubic_curve # 4 # A new path starting is defined by a control point which is not part of a bezier subcurve. return len(self.points) % nppcc == 1 def get_last_point(self) -> Point3D: return self.points[-1] def is_closed(self) -> bool: # TODO use consider_points_equals_2d ? return self.consider_points_equals(self.points[0], self.points[-1]) def close_path(self) -> None: if not self.is_closed(): self.add_line_to(self.get_subpaths()[-1][0]) def add_points_as_corners(self, points: Point3DLike_Array) -> Self: """Append multiple straight lines at the end of :attr:`VMobject.points`, which connect the given ``points`` in order starting from the end of the current path. These ``points`` would be therefore the corners of the new polyline appended to the path. Parameters ---------- points An array of 3D points representing the corners of the polyline to append to :attr:`VMobject.points`. Returns ------- :class:`VMobject` The VMobject itself, after appending the straight lines to its path. """ self.throw_error_if_no_points() points = np.asarray(points).reshape(-1, self.dim) num_points = points.shape[0] if num_points == 0: return self start_corners = np.empty((num_points, self.dim)) start_corners[0] = self.points[-1] start_corners[1:] = points[:-1] end_corners = points if self.has_new_path_started(): # Remove the last point from the new path self.points = self.points[:-1] nppcc = self.n_points_per_cubic_curve new_points = np.empty((nppcc * start_corners.shape[0], self.dim)) new_points[::nppcc] = start_corners new_points[nppcc - 1 :: nppcc] = end_corners for i, t in enumerate(self._bezier_t_values): new_points[i::nppcc] = interpolate(start_corners, end_corners, t) self.append_points(new_points) return self def set_points_as_corners(self, points: Point3DLike_Array) -> Self: """Given an array of points, set them as corners of the :class:`VMobject`. To achieve that, this algorithm sets handles aligned with the anchors such that the resultant Bรฉzier curve will be the segment between the two anchors. Parameters ---------- points Array of points that will be set as corners. Returns ------- :class:`VMobject` The VMobject itself, after setting the new points as corners. Examples -------- .. manim:: PointsAsCornersExample :save_last_frame: class PointsAsCornersExample(Scene): def construct(self): corners = ( # create square UR, UL, DL, DR, UR, # create crosses DL, UL, DR ) vmob = VMobject(stroke_color=RED) vmob.set_points_as_corners(corners).scale(2) self.add(vmob) """ points = np.array(points) # This will set the handles aligned with the anchors. # Id est, a bezier curve will be the segment from the two anchors such that the handles belongs to this segment. self.set_anchors_and_handles( *(interpolate(points[:-1], points[1:], t) for t in self._bezier_t_values) ) return self def set_points_smoothly(self, points: Point3DLike_Array) -> Self: self.set_points_as_corners(points) self.make_smooth() return self def change_anchor_mode(self, mode: Literal["jagged", "smooth"]) -> Self: """Changes the anchor mode of the bezier curves. This will modify the handles. There can be only two modes, "jagged", and "smooth". Returns ------- :class:`VMobject` ``self`` """ assert mode in ["jagged", "smooth"], 'mode must be either "jagged" or "smooth"' nppcc = self.n_points_per_cubic_curve for submob in self.family_members_with_points(): subpaths = submob.get_subpaths() submob.clear_points() # A subpath can be composed of several bezier curves. for subpath in subpaths: # This will retrieve the anchors of the subpath, by selecting every n element in the array subpath # The append is needed as the last element is not reached when slicing with numpy. anchors = np.append(subpath[::nppcc], subpath[-1:], 0) if mode == "smooth": h1, h2 = get_smooth_cubic_bezier_handle_points(anchors) else: # mode == "jagged" # The following will make the handles aligned with the anchors, thus making the bezier curve a segment a1 = anchors[:-1] a2 = anchors[1:] h1 = interpolate(a1, a2, 1.0 / 3) h2 = interpolate(a1, a2, 2.0 / 3) new_subpath = np.array(subpath) new_subpath[1::nppcc] = h1 new_subpath[2::nppcc] = h2 submob.append_points(new_subpath) return self def make_smooth(self) -> Self: return self.change_anchor_mode("smooth") def make_jagged(self) -> Self: return self.change_anchor_mode("jagged") def add_subpath(self, points: CubicBezierPathLike) -> Self: assert len(points) % 4 == 0 self.append_points(points) return self def append_vectorized_mobject(self, vectorized_mobject: VMobject) -> None: if self.has_new_path_started(): # Remove last point, which is starting # a new path self.points = self.points[:-1] self.append_points(vectorized_mobject.points) def apply_function( self, function: MappingFunction, *, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: factor = self.pre_function_handle_to_anchor_scale_factor self.scale_handle_to_anchor_distances(factor) super().apply_function(function) self.scale_handle_to_anchor_distances(1.0 / factor) if self.make_smooth_after_applying_functions: self.make_smooth() return self def rotate( self, angle: float, axis: Vector3DLike = OUT, *, about_point: Point3DLike | None = None, about_edge: Vector3DLike | None = None, ) -> Self: self.rotate_sheen_direction(angle, axis) super().rotate(angle, axis, about_point=about_point, about_edge=about_edge) return self def scale_handle_to_anchor_distances(self, factor: float) -> Self: """If the distance between a given handle point H and its associated anchor point A is d, then it changes H to be a distances factor*d away from A, but so that the line from A to H doesn't change. This is mostly useful in the context of applying a (differentiable) function, to preserve tangency properties. One would pull all the handles closer to their anchors, apply the function then push them out again. Parameters ---------- factor The factor used for scaling. Returns ------- :class:`VMobject` ``self`` """ for submob in self.family_members_with_points(): if len(submob.points) < self.n_points_per_cubic_curve: # The case that a bezier quad is not complete (there is no bezier curve as there is not enough control points.) continue a1, h1, h2, a2 = submob.get_anchors_and_handles() a1_to_h1 = h1 - a1 a2_to_h2 = h2 - a2 new_h1 = a1 + factor * a1_to_h1 new_h2 = a2 + factor * a2_to_h2 submob.set_anchors_and_handles(a1, new_h1, new_h2, a2) return self # def consider_points_equals(self, p0: Point3DLike, p1: Point3DLike) -> bool: return np.allclose(p0, p1, atol=self.tolerance_for_point_equality) def consider_points_equals_2d(self, p0: Point2DLike, p1: Point2DLike) -> bool: """Determine if two points are close enough to be considered equal. This uses the algorithm from np.isclose(), but expanded here for the 2D point case. NumPy is overkill for such a small question. Parameters ---------- p0 first point p1 second point Returns ------- bool whether two points considered close. """ rtol = 1.0e-5 # default from np.isclose() atol = self.tolerance_for_point_equality if abs(p0[0] - p1[0]) > atol + rtol * abs(p1[0]): return False return abs(p0[1] - p1[1]) <= atol + rtol * abs(p1[1]) # Information about line def get_cubic_bezier_tuples_from_points( self, points: CubicBezierPathLike ) -> CubicBezierPoints_Array: return np.array(self.gen_cubic_bezier_tuples_from_points(points)) def gen_cubic_bezier_tuples_from_points( self, points: CubicBezierPathLike ) -> tuple[CubicBezierPointsLike, ...]: """Returns the bezier tuples from an array of points. self.points is a list of the anchors and handles of the bezier curves of the mobject (ie [anchor1, handle1, handle2, anchor2, anchor3 ..]) This algorithm basically retrieve them by taking an element every n, where n is the number of control points of the bezier curve. Parameters ---------- points Points from which control points will be extracted. Returns ------- tuple Bezier control points. """ nppcc = self.n_points_per_cubic_curve remainder = len(points) % nppcc points = points[: len(points) - remainder] # Basically take every nppcc element. return tuple(points[i : i + nppcc] for i in range(0, len(points), nppcc)) def get_cubic_bezier_tuples(self) -> CubicBezierPoints_Array: return self.get_cubic_bezier_tuples_from_points(self.points) def _gen_subpaths_from_points( self, points: CubicBezierPath, filter_func: Callable[[int], bool], ) -> Iterable[CubicSpline]: """Given an array of points defining the bezier curves of the vmobject, return subpaths formed by these points. Here, Two bezier curves form a path if at least two of their anchors are evaluated True by the relation defined by filter_func. The algorithm every bezier tuple (anchors and handles) in ``self.points`` (by regrouping each n elements, where n is the number of points per cubic curve)), and evaluate the relation between two anchors with filter_func. NOTE : The filter_func takes an int n as parameter, and will evaluate the relation between points[n] and points[n - 1]. This should probably be changed so the function takes two points as parameters. Parameters ---------- points points defining the bezier curve. filter_func Filter-func defining the relation. Returns ------- Iterable[CubicSpline] subpaths formed by the points. """ nppcc = self.n_points_per_cubic_curve filtered = filter(filter_func, range(nppcc, len(points), nppcc)) split_indices = [0] + list(filtered) + [len(points)] return ( points[i1:i2] for i1, i2 in zip(split_indices[:-1], split_indices[1:], strict=True) if (i2 - i1) >= nppcc ) def get_subpaths_from_points(self, points: CubicBezierPath) -> list[CubicSpline]: return list( self._gen_subpaths_from_points( points, lambda n: not self.consider_points_equals(points[n - 1], points[n]), ), ) def gen_subpaths_from_points_2d( self, points: CubicBezierPath ) -> Iterable[CubicSpline]: return self._gen_subpaths_from_points( points, lambda n: not self.consider_points_equals_2d(points[n - 1], points[n]), ) def get_subpaths(self) -> list[CubicSpline]: """Returns subpaths formed by the curves of the VMobject. Subpaths are ranges of curves with each pair of consecutive curves having their end/start points coincident. Returns ------- list[CubicSpline] subpaths. """ return self.get_subpaths_from_points(self.points) def get_nth_curve_points(self, n: int) -> CubicBezierPoints: """Returns the points defining the nth curve of the vmobject. Parameters ---------- n index of the desired bezier curve. Returns ------- CubicBezierPoints points defining the nth bezier curve (anchors, handles) """ assert n < self.get_num_curves() nppcc = self.n_points_per_cubic_curve return self.points[nppcc * n : nppcc * (n + 1)] def get_nth_curve_function(self, n: int) -> Callable[[float], Point3D]: """Returns the expression of the nth curve. Parameters ---------- n index of the desired curve. Returns ------- Callable[float, Point3D] expression of the nth bezier curve. """ return bezier(self.get_nth_curve_points(n)) def get_nth_curve_length_pieces( self, n: int, sample_points: int | None = None, ) -> npt.NDArray[ManimFloat]: """Returns the array of short line lengths used for length approximation. Parameters ---------- n The index of the desired curve. sample_points The number of points to sample to find the length. Returns ------- The short length-pieces of the nth curve. """ if sample_points is None: sample_points = 10 curve = self.get_nth_curve_function(n) points = np.array([curve(a) for a in np.linspace(0, 1, sample_points)]) diffs = points[1:] - points[:-1] norms = np.linalg.norm(diffs, axis=1) return norms def get_nth_curve_length( self, n: int, sample_points: int | None = None, ) -> float: """Returns the (approximate) length of the nth curve. Parameters ---------- n The index of the desired curve. sample_points The number of points to sample to find the length. Returns ------- length : :class:`float` The length of the nth curve. """ _, length = self.get_nth_curve_function_with_length(n, sample_points) return length def get_nth_curve_function_with_length( self, n: int, sample_points: int | None = None, ) -> tuple[Callable[[float], Point3D], float]: """Returns the expression of the nth curve along with its (approximate) length. Parameters ---------- n The index of the desired curve. sample_points The number of points to sample to find the length. Returns ------- curve : Callable[[float], Point3D] The function for the nth curve. length : :class:`float` The length of the nth curve. """ curve = self.get_nth_curve_function(n) norms = self.get_nth_curve_length_pieces(n, sample_points=sample_points) length = np.sum(norms) return curve, length def get_num_curves(self) -> int: """Returns the number of curves of the vmobject. Returns ------- int number of curves of the vmobject. """ nppcc = self.n_points_per_cubic_curve return len(self.points) // nppcc def get_curve_functions( self, ) -> Iterable[Callable[[float], Point3D]]: """Gets the functions for the curves of the mobject. Returns ------- Iterable[Callable[[float], Point3D]] The functions for the curves. """ num_curves = self.get_num_curves() for n in range(num_curves): yield self.get_nth_curve_function(n) def get_curve_functions_with_lengths( self, **kwargs ) -> Iterable[tuple[Callable[[float], Point3D], float]]: """Gets the functions and lengths of the curves for the mobject. Parameters ---------- **kwargs The keyword arguments passed to :meth:`get_nth_curve_function_with_length` Returns ------- Iterable[tuple[Callable[[float], Point3D], float]] The functions and lengths of the curves. """ num_curves = self.get_num_curves() for n in range(num_curves): yield self.get_nth_curve_function_with_length(n, **kwargs) def point_from_proportion(self, alpha: float) -> Point3D: """Gets the point at a proportion along the path of the :class:`VMobject`. Parameters ---------- alpha The proportion along the the path of the :class:`VMobject`. Returns ------- :class:`numpy.ndarray` The point on the :class:`VMobject`. Raises ------ :exc:`ValueError` If ``alpha`` is not between 0 and 1. :exc:`Exception` If the :class:`VMobject` has no points. Example ------- .. manim:: PointFromProportion :save_last_frame: class PointFromProportion(Scene): def construct(self): line = Line(2*DL, 2*UR) self.add(line) colors = (RED, BLUE, YELLOW) proportions = (1/4, 1/2, 3/4) for color, proportion in zip(colors, proportions): self.add(Dot(color=color).move_to( line.point_from_proportion(proportion) )) """ if alpha < 0 or alpha > 1: raise ValueError(f"Alpha {alpha} not between 0 and 1.") self.throw_error_if_no_points() if alpha == 1: return self.points[-1] curves_and_lengths = tuple(self.get_curve_functions_with_lengths()) target_length = alpha * sum(length for _, length in curves_and_lengths) current_length = 0 for curve, length in curves_and_lengths: if current_length + length >= target_length: if length != 0: residue = (target_length - current_length) / length else: residue = 0 return curve(residue) current_length += length raise Exception( "Not sure how you reached here, please file a bug report at https://github.com/ManimCommunity/manim/issues/new/choose" ) def proportion_from_point( self, point: Point3DLike, ) -> float: """Returns the proportion along the path of the :class:`VMobject` a particular given point is at. Parameters ---------- point The Cartesian coordinates of the point which may or may not lie on the :class:`VMobject` Returns ------- float The proportion along the path of the :class:`VMobject`. Raises ------ :exc:`ValueError` If ``point`` does not lie on the curve. :exc:`Exception` If the :class:`VMobject` has no points. """ self.throw_error_if_no_points() # Iterate over each bezier curve that the ``VMobject`` is composed of, checking # if the point lies on that curve. If it does not lie on that curve, add # the whole length of the curve to ``target_length`` and move onto the next # curve. If the point does lie on the curve, add how far along the curve # the point is to ``target_length``. # Then, divide ``target_length`` by the total arc length of the shape to get # the proportion along the ``VMobject`` the point is at. num_curves = self.get_num_curves() total_length = self.get_arc_length() target_length = 0 for n in range(num_curves): control_points = self.get_nth_curve_points(n) length = self.get_nth_curve_length(n) proportions_along_bezier = proportions_along_bezier_curve_for_point( point, control_points, ) if len(proportions_along_bezier) > 0: proportion_along_nth_curve = max(proportions_along_bezier) target_length += length * proportion_along_nth_curve break target_length += length else: raise ValueError(f"Point {point} does not lie on this curve.") alpha = target_length / total_length return alpha def get_anchors_and_handles(self) -> list[Point3D_Array]: """Returns anchors1, handles1, handles2, anchors2, where (anchors1[i], handles1[i], handles2[i], anchors2[i]) will be four points defining a cubic bezier curve for any i in range(0, len(anchors1)) Returns ------- `list[Point3D_Array]` Iterable of the anchors and handles. """ nppcc = self.n_points_per_cubic_curve return [self.points[i::nppcc] for i in range(nppcc)] def get_start_anchors(self) -> Point3D_Array: """Returns the start anchors of the bezier curves. Returns ------- Point3D_Array Starting anchors """ return self.points[:: self.n_points_per_cubic_curve] def get_end_anchors(self) -> Point3D_Array: """Return the end anchors of the bezier curves. Returns ------- Point3D_Array Starting anchors """ nppcc = self.n_points_per_cubic_curve return self.points[nppcc - 1 :: nppcc] def get_anchors(self) -> list[Point3D]: """Returns the anchors of the curves forming the VMobject. Returns ------- Point3D_Array The anchors. """ if self.points.shape[0] == 1: return self.points s = self.get_start_anchors() e = self.get_end_anchors() return list(it.chain.from_iterable(zip(s, e, strict=True))) def get_points_defining_boundary(self) -> Point3D_Array: # Probably returns all anchors, but this is weird regarding the name of the method. return np.array( tuple(it.chain(*(sm.get_anchors() for sm in self.get_family()))) ) def get_arc_length(self, sample_points_per_curve: int | None = None) -> float: """Return the approximated length of the whole curve. Parameters ---------- sample_points_per_curve Number of sample points per curve used to approximate the length. More points result in a better approximation. Returns ------- float The length of the :class:`VMobject`. """ return sum( length for _, length in self.get_curve_functions_with_lengths( sample_points=sample_points_per_curve, ) ) # Alignment def align_points(self, vmobject: VMobject) -> Self: """Adds points to self and vmobject so that they both have the same number of subpaths, with corresponding subpaths each containing the same number of points. Points are added either by subdividing curves evenly along the subpath, or by creating new subpaths consisting of a single point repeated. Parameters ---------- vmobject The object to align points with. Returns ------- :class:`VMobject` ``self`` See also -------- :meth:`~.Mobject.interpolate`, :meth:`~.Mobject.align_data` """ self.align_rgbas(vmobject) # TODO: This shortcut can be a bit over eager. What if they have the same length, but different subpath lengths? if self.get_num_points() == vmobject.get_num_points(): return for mob in self, vmobject: # If there are no points, add one to # wherever the "center" is if mob.has_no_points(): mob.start_new_path(mob.get_center()) # If there's only one point, turn it into # a null curve if mob.has_new_path_started(): mob.add_line_to(mob.get_last_point()) # Figure out what the subpaths are subpaths1 = self.get_subpaths() subpaths2 = vmobject.get_subpaths() n_subpaths = max(len(subpaths1), len(subpaths2)) # Start building new ones new_path1 = np.zeros((0, self.dim)) new_path2 = np.zeros((0, self.dim)) nppcc = self.n_points_per_cubic_curve def get_nth_subpath(path_list, n): if n >= len(path_list): # Create a null path at the very end return [path_list[-1][-1]] * nppcc path = path_list[n] # Check for useless points at the end of the path and remove them # https://github.com/ManimCommunity/manim/issues/1959 while len(path) > nppcc: # If the last nppc points are all equal to the preceding point if self.consider_points_equals(path[-nppcc:], path[-nppcc - 1]): path = path[:-nppcc] else: break return path for n in range(n_subpaths): # For each pair of subpaths, add points until they are the same length sp1 = get_nth_subpath(subpaths1, n) sp2 = get_nth_subpath(subpaths2, n) diff1 = max(0, (len(sp2) - len(sp1)) // nppcc) diff2 = max(0, (len(sp1) - len(sp2)) // nppcc) sp1 = self.insert_n_curves_to_point_list(diff1, sp1) sp2 = self.insert_n_curves_to_point_list(diff2, sp2) new_path1 = np.append(new_path1, sp1, axis=0) new_path2 = np.append(new_path2, sp2, axis=0) self.set_points(new_path1) vmobject.set_points(new_path2) return self def insert_n_curves(self, n: int) -> Self: """Inserts n curves to the bezier curves of the vmobject. Parameters ---------- n Number of curves to insert. Returns ------- :class:`VMobject` ``self`` """ new_path_point = None if self.has_new_path_started(): new_path_point = self.get_last_point() new_points = self.insert_n_curves_to_point_list(n, self.points) self.set_points(new_points) if new_path_point is not None: self.append_points([new_path_point]) return self def insert_n_curves_to_point_list( self, n: int, points: BezierPathLike ) -> BezierPath: """Given an array of k points defining a bezier curves (anchors and handles), returns points defining exactly k + n bezier curves. Parameters ---------- n Number of desired curves. points Starting points. Returns ------- Points generated. """ if len(points) == 1: nppcc = self.n_points_per_cubic_curve return np.repeat(points, nppcc * n, 0) bezier_tuples = self.get_cubic_bezier_tuples_from_points(points) current_number_of_curves = len(bezier_tuples) new_number_of_curves = current_number_of_curves + n new_bezier_tuples = bezier_remap(bezier_tuples, new_number_of_curves) new_points = new_bezier_tuples.reshape(-1, 3) return new_points def align_rgbas(self, vmobject: VMobject) -> Self: attrs = ["fill_rgbas", "stroke_rgbas", "background_stroke_rgbas"] for attr in attrs: a1 = getattr(self, attr) a2 = getattr(vmobject, attr) if len(a1) > len(a2): new_a2 = stretch_array_to_length(a2, len(a1)) setattr(vmobject, attr, new_a2) elif len(a2) > len(a1): new_a1 = stretch_array_to_length(a1, len(a2)) setattr(self, attr, new_a1) return self def get_point_mobject(self, center: Point3DLike | None = None) -> VectorizedPoint: if center is None: center = self.get_center() point = VectorizedPoint(center) point.match_style(self) return point def interpolate_color( self, mobject1: VMobject, mobject2: VMobject, alpha: float ) -> None: attrs = [ "fill_rgbas", "stroke_rgbas", "background_stroke_rgbas", "stroke_width", "background_stroke_width", "sheen_direction", "sheen_factor", ] for attr in attrs: setattr( self, attr, interpolate(getattr(mobject1, attr), getattr(mobject2, attr), alpha), ) if alpha == 1.0: val = getattr(mobject2, attr) if isinstance(val, np.ndarray): val = val.copy() setattr(self, attr, val) def pointwise_become_partial( self, vmobject: VMobject, a: float, b: float, ) -> Self: """Given a 2nd :class:`.VMobject` ``vmobject``, a lower bound ``a`` and an upper bound ``b``, modify this :class:`.VMobject`'s points to match the portion of the Bรฉzier spline described by ``vmobject.points`` with the parameter ``t`` between ``a`` and ``b``. Parameters ---------- vmobject The :class:`.VMobject` that will serve as a model. a The lower bound for ``t``. b The upper bound for ``t`` Returns ------- :class:`.VMobject` The :class:`.VMobject` itself, after the transformation. Raises ------ TypeError If ``vmobject`` is not an instance of :class:`VMobject`. """ if not isinstance(vmobject, VMobject): raise TypeError( f"Expected a VMobject, got value {vmobject} of type " f"{type(vmobject).__name__}." ) # Partial curve includes three portions: # - A middle section, which matches the curve exactly. # - A start, which is some ending portion of an inner cubic. # - An end, which is the starting portion of a later inner cubic. if a <= 0 and b >= 1: self.set_points(vmobject.points) return self num_curves = vmobject.get_num_curves() if num_curves == 0: return self # The following two lines will compute which Bรฉzier curves of the given Mobject must be processed. # The residue indicates the proportion of the selected Bรฉzier curve which must be selected. # # Example: if num_curves is 10, a is 0.34 and b is 0.78, then: # - lower_index is 3 and lower_residue is 0.4, which means the algorithm will look at the 3rd Bรฉzier # and select its part which ranges from t=0.4 to t=1. # - upper_index is 7 and upper_residue is 0.8, which means the algorithm will look at the 7th Bรฉzier # and select its part which ranges from t=0 to t=0.8. lower_index, lower_residue = integer_interpolate(0, num_curves, a) upper_index, upper_residue = integer_interpolate(0, num_curves, b) nppc = self.n_points_per_curve # Copy vmobject.points if vmobject is self to prevent unintended in-place modification vmobject_points = ( vmobject.points.copy() if self is vmobject else vmobject.points ) # If both indices coincide, get a part of a single Bรฉzier curve. if lower_index == upper_index: # Look at the "lower_index"-th Bรฉzier curve and select its part from # t=lower_residue to t=upper_residue. self.points = partial_bezier_points( vmobject_points[nppc * lower_index : nppc * (lower_index + 1)], lower_residue, upper_residue, ) else: # Allocate space for (upper_index-lower_index+1) Bรฉzier curves. self.points = np.empty((nppc * (upper_index - lower_index + 1), self.dim)) # Look at the "lower_index"-th Bezier curve and select its part from # t=lower_residue to t=1. This is the first curve in self.points. self.points[:nppc] = partial_bezier_points( vmobject_points[nppc * lower_index : nppc * (lower_index + 1)], lower_residue, 1, ) # If there are more curves between the "lower_index"-th and the # "upper_index"-th Bรฉziers, add them all to self.points. self.points[nppc:-nppc] = vmobject_points[ nppc * (lower_index + 1) : nppc * upper_index ] # Look at the "upper_index"-th Bรฉzier curve and select its part from # t=0 to t=upper_residue. This is the last curve in self.points. self.points[-nppc:] = partial_bezier_points( vmobject_points[nppc * upper_index : nppc * (upper_index + 1)], 0, upper_residue, ) return self def get_subcurve(self, a: float, b: float) -> Self: """Returns the subcurve of the VMobject between the interval [a, b]. The curve is a VMobject itself. Parameters ---------- a The lower bound. b The upper bound. Returns ------- VMobject The subcurve between of [a, b] """ if self.is_closed() and a > b: vmob = self.copy() vmob.pointwise_become_partial(self, a, 1) vmob2 = self.copy() vmob2.pointwise_become_partial(self, 0, b) vmob.append_vectorized_mobject(vmob2) else: vmob = self.copy() vmob.pointwise_become_partial(self, a, b) return vmob def get_direction(self) -> Literal["CW", "CCW"]: """Uses :func:`~.space_ops.shoelace_direction` to calculate the direction. The direction of points determines in which direction the object is drawn, clockwise or counterclockwise. Examples -------- The default direction of a :class:`~.Circle` is counterclockwise:: >>> from manim import Circle >>> Circle().get_direction() 'CCW' Returns ------- :class:`str` Either ``"CW"`` or ``"CCW"``. """ return shoelace_direction(self.get_start_anchors()) def reverse_direction(self) -> Self: """Reverts the point direction by inverting the point order. Returns ------- :class:`VMobject` Returns self. Examples -------- .. manim:: ChangeOfDirection class ChangeOfDirection(Scene): def construct(self): ccw = RegularPolygon(5) ccw.shift(LEFT) cw = RegularPolygon(5) cw.shift(RIGHT).reverse_direction() self.play(Create(ccw), Create(cw), run_time=4) """ self.points = self.points[::-1] return self def force_direction(self, target_direction: Literal["CW", "CCW"]) -> Self: """Makes sure that points are either directed clockwise or counterclockwise. Parameters ---------- target_direction Either ``"CW"`` or ``"CCW"``. """ if target_direction not in ("CW", "CCW"): raise ValueError('Invalid input for force_direction. Use "CW" or "CCW"') if self.get_direction() != target_direction: # Since we already assured the input is CW or CCW, # and the directions don't match, we just reverse self.reverse_direction() return self class VGroup(VMobject, metaclass=ConvertToOpenGL): """A group of vectorized mobjects. This can be used to group multiple :class:`~.VMobject` instances together in order to scale, move, ... them together. Notes ----- When adding the same mobject more than once, repetitions are ignored. Use :meth:`.Mobject.copy` to create a separate copy which can then be added to the group. Examples -------- To add :class:`~.VMobject`s to a :class:`~.VGroup`, you can either use the :meth:`~.VGroup.add` method, or use the `+` and `+=` operators. Similarly, you can subtract elements of a VGroup via :meth:`~.VGroup.remove` method, or `-` and `-=` operators: >>> from manim import Triangle, Square, VGroup >>> vg = VGroup() >>> triangle, square = Triangle(), Square() >>> vg.add(triangle) VGroup(Triangle) >>> vg + square # a new VGroup is constructed VGroup(Triangle, Square) >>> vg # not modified VGroup(Triangle) >>> vg += square >>> vg # modifies vg VGroup(Triangle, Square) >>> vg.remove(triangle) VGroup(Square) >>> vg - square # a new VGroup is constructed VGroup() >>> vg # not modified VGroup(Square) >>> vg -= square >>> vg # modifies vg VGroup() .. manim:: ArcShapeIris :save_last_frame: class ArcShapeIris(Scene): def construct(self): colors = [DARK_BROWN, BLUE_E, BLUE_D, BLUE_A, TEAL_B, GREEN_B, YELLOW_E] radius = [1 + rad * 0.1 for rad in range(len(colors))] circles_group = VGroup() # zip(radius, color) makes the iterator [(radius[i], color[i]) for i in range(radius)] circles_group.add(*[Circle(radius=rad, stroke_width=10, color=col) for rad, col in zip(radius, colors)]) self.add(circles_group) """ def __init__( self, *vmobjects: VMobject | Iterable[VMobject], **kwargs: Any ) -> None: super().__init__(**kwargs) self.add(*vmobjects) def __repr__(self) -> str: return f"{self.__class__.__name__}({', '.join(str(mob) for mob in self.submobjects)})" def __str__(self) -> str: return ( f"{self.__class__.__name__} of {len(self.submobjects)} " f"submobject{'s' if len(self.submobjects) > 0 else ''}" ) def add( self, *vmobjects: VMobject | Iterable[VMobject], ) -> Self: """Checks if all passed elements are an instance, or iterables of VMobject and then adds them to submobjects Parameters ---------- vmobjects List or iterable of VMobjects to add Returns ------- :class:`VGroup` Raises ------ TypeError If one element of the list, or iterable is not an instance of VMobject Examples -------- The following example shows how to add individual or multiple `VMobject` instances through the `VGroup` constructor and its `.add()` method. .. manim:: AddToVGroup class AddToVGroup(Scene): def construct(self): circle_red = Circle(color=RED) circle_green = Circle(color=GREEN) circle_blue = Circle(color=BLUE) circle_red.shift(LEFT) circle_blue.shift(RIGHT) gr = VGroup(circle_red, circle_green) gr2 = VGroup(circle_blue) # Constructor uses add directly self.add(gr,gr2) self.wait() gr += gr2 # Add group to another self.play( gr.animate.shift(DOWN), ) gr -= gr2 # Remove group self.play( # Animate groups separately gr.animate.shift(LEFT), gr2.animate.shift(UP), ) self.play( #Animate groups without modification (gr+gr2).animate.shift(RIGHT) ) self.play( # Animate group without component (gr-circle_red).animate.shift(RIGHT) ) A `VGroup` can be created using iterables as well. Keep in mind that all generated values from an iterable must be an instance of `VMobject`. This is demonstrated below: .. manim:: AddIterableToVGroupExample :save_last_frame: class AddIterableToVGroupExample(Scene): def construct(self): v = VGroup( Square(), # Singular VMobject instance [Circle(), Triangle()], # List of VMobject instances Dot(), (Dot() for _ in range(2)), # Iterable that generates VMobjects ) v.arrange() self.add(v) To facilitate this, the iterable is unpacked before its individual instances are added to the `VGroup`. As a result, when you index a `VGroup`, you will never get back an iterable. Instead, you will always receive `VMobject` instances, including those that were part of the iterable/s that you originally added to the `VGroup`. """ def get_type_error_message(invalid_obj, invalid_indices): return ( f"Only values of type {vmobject_render_type.__name__} can be added " "as submobjects of VGroup, but the value " f"{repr(invalid_obj)} (at index {invalid_indices[1]} of " f"parameter {invalid_indices[0]}) is of type " f"{type(invalid_obj).__name__}." ) vmobject_render_type = ( OpenGLVMobject if config.renderer == RendererType.OPENGL else VMobject ) valid_vmobjects = [] for i, vmobject in enumerate(vmobjects): if isinstance(vmobject, vmobject_render_type): valid_vmobjects.append(vmobject) elif isinstance(vmobject, Iterable) and not isinstance( vmobject, (Mobject, OpenGLMobject) ): for j, subvmobject in enumerate(vmobject): if not isinstance(subvmobject, vmobject_render_type): raise TypeError(get_type_error_message(subvmobject, (i, j))) valid_vmobjects.append(subvmobject) elif isinstance(vmobject, Iterable) and isinstance( vmobject, (Mobject, OpenGLMobject) ): raise TypeError( f"{get_type_error_message(vmobject, (i, 0))} " "You can try adding this value into a Group instead." ) else: raise TypeError(get_type_error_message(vmobject, (i, 0))) return super().add(*valid_vmobjects) def __add__(self, vmobject: VMobject) -> Self: return VGroup(*self.submobjects, vmobject) def __iadd__(self, vmobject: VMobject) -> Self: return self.add(vmobject) def __sub__(self, vmobject: VMobject) -> Self: copy = VGroup(*self.submobjects) copy.remove(vmobject) return copy def __isub__(self, vmobject: VMobject) -> Self: return self.remove(vmobject) def __setitem__(self, key: int, value: VMobject | Sequence[VMobject]) -> None: """Override the [] operator for item assignment. Parameters ---------- key The index of the submobject to be assigned value The vmobject value to assign to the key Returns ------- None Tests ----- Check that item assignment does not raise error:: >>> vgroup = VGroup(VMobject()) >>> new_obj = VMobject() >>> vgroup[0] = new_obj """ self._assert_valid_submobjects(tuplify(value)) self.submobjects[key] = value class VDict(VMobject, metaclass=ConvertToOpenGL): """A VGroup-like class, also offering submobject access by key, like a python dict Parameters ---------- mapping_or_iterable The parameter specifying the key-value mapping of keys and mobjects. show_keys Whether to also display the key associated with the mobject. This might be useful when debugging, especially when there are a lot of mobjects in the :class:`VDict`. Defaults to False. kwargs Other arguments to be passed to `Mobject`. Attributes ---------- show_keys : :class:`bool` Whether to also display the key associated with the mobject. This might be useful when debugging, especially when there are a lot of mobjects in the :class:`VDict`. When displayed, the key is towards the left of the mobject. Defaults to False. submob_dict : :class:`dict` Is the actual python dictionary that is used to bind the keys to the mobjects. Examples -------- .. manim:: ShapesWithVDict class ShapesWithVDict(Scene): def construct(self): square = Square().set_color(RED) circle = Circle().set_color(YELLOW).next_to(square, UP) # create dict from list of tuples each having key-mobject pair pairs = [("s", square), ("c", circle)] my_dict = VDict(pairs, show_keys=True) # display it just like a VGroup self.play(Create(my_dict)) self.wait() text = Tex("Some text").set_color(GREEN).next_to(square, DOWN) # add a key-value pair by wrapping it in a single-element list of tuple # after attrs branch is merged, it will be easier like `.add(t=text)` my_dict.add([("t", text)]) self.wait() rect = Rectangle().next_to(text, DOWN) # can also do key assignment like a python dict my_dict["r"] = rect # access submobjects like a python dict my_dict["t"].set_color(PURPLE) self.play(my_dict["t"].animate.scale(3)) self.wait() # also supports python dict styled reassignment my_dict["t"] = Tex("Some other text").set_color(BLUE) self.wait() # remove submobject by key my_dict.remove("t") self.wait() self.play(Uncreate(my_dict["s"])) self.wait() self.play(FadeOut(my_dict["c"])) self.wait() self.play(FadeOut(my_dict["r"], shift=DOWN)) self.wait() # you can also make a VDict from an existing dict of mobjects plain_dict = { 1: Integer(1).shift(DOWN), 2: Integer(2).shift(2 * DOWN), 3: Integer(3).shift(3 * DOWN), } vdict_from_plain_dict = VDict(plain_dict) vdict_from_plain_dict.shift(1.5 * (UP + LEFT)) self.play(Create(vdict_from_plain_dict)) # you can even use zip vdict_using_zip = VDict(zip(["s", "c", "r"], [Square(), Circle(), Rectangle()])) vdict_using_zip.shift(1.5 * RIGHT) self.play(Create(vdict_using_zip)) self.wait() """ def __init__( self, mapping_or_iterable: ( Mapping[Hashable, VMobject] | Iterable[tuple[Hashable, VMobject]] ) = {}, show_keys: bool = False, **kwargs, ) -> None: super().__init__(**kwargs) self.show_keys = show_keys self.submob_dict = {} self.add(mapping_or_iterable) def __repr__(self) -> str: return f"{self.__class__.__name__}({repr(self.submob_dict)})" def add( self, mapping_or_iterable: ( Mapping[Hashable, VMobject] | Iterable[tuple[Hashable, VMobject]] ), ) -> Self: """Adds the key-value pairs to the :class:`VDict` object. Also, it internally adds the value to the `submobjects` :class:`list` of :class:`~.Mobject`, which is responsible for actual on-screen display. Parameters --------- mapping_or_iterable The parameter specifying the key-value mapping of keys and mobjects. Returns ------- :class:`VDict` Returns the :class:`VDict` object on which this method was called. Examples -------- Normal usage:: square_obj = Square() my_dict.add([("s", square_obj)]) """ for key, value in dict(mapping_or_iterable).items(): self.add_key_value_pair(key, value) return self def remove(self, key: Hashable) -> Self: """Removes the mobject from the :class:`VDict` object having the key `key` Also, it internally removes the mobject from the `submobjects` :class:`list` of :class:`~.Mobject`, (which is responsible for removing it from the screen) Parameters ---------- key The key of the submoject to be removed. Returns ------- :class:`VDict` Returns the :class:`VDict` object on which this method was called. Examples -------- Normal usage:: my_dict.remove("square") """ if key not in self.submob_dict: raise KeyError(f"The given key '{key!s}' is not present in the VDict") super().remove(self.submob_dict[key]) del self.submob_dict[key] return self def __getitem__(self, key: Hashable): """Override the [] operator for item retrieval. Parameters ---------- key The key of the submoject to be accessed Returns ------- :class:`VMobject` The submobject corresponding to the key `key` Examples -------- Normal usage:: self.play(Create(my_dict["s"])) """ submob = self.submob_dict[key] return submob def __setitem__(self, key: Hashable, value: VMobject) -> None: """Override the [] operator for item assignment. Parameters ---------- key The key of the submoject to be assigned value The submobject to bind the key to Returns ------- None Examples -------- Normal usage:: square_obj = Square() my_dict["sq"] = square_obj """ if key in self.submob_dict: self.remove(key) self.add([(key, value)]) def __delitem__(self, key: Hashable): """Override the del operator for deleting an item. Parameters ---------- key The key of the submoject to be deleted Returns ------- None Examples -------- :: >>> from manim import * >>> my_dict = VDict({'sq': Square()}) >>> 'sq' in my_dict True >>> del my_dict['sq'] >>> 'sq' in my_dict False Notes ----- Removing an item from a VDict does not remove that item from any Scene that the VDict is part of. """ del self.submob_dict[key] def __contains__(self, key: Hashable): """Override the in operator. Parameters ---------- key The key to check membership of. Returns ------- :class:`bool` Examples -------- :: >>> from manim import * >>> my_dict = VDict({'sq': Square()}) >>> 'sq' in my_dict True """ return key in self.submob_dict def get_all_submobjects(self) -> list[list]: """To get all the submobjects associated with a particular :class:`VDict` object Returns ------- :class:`dict_values` All the submobjects associated with the :class:`VDict` object Examples -------- Normal usage:: for submob in my_dict.get_all_submobjects(): self.play(Create(submob)) """ submobjects = self.submob_dict.values() return submobjects def add_key_value_pair(self, key: Hashable, value: VMobject) -> None: """A utility function used by :meth:`add` to add the key-value pair to :attr:`submob_dict`. Not really meant to be used externally. Parameters ---------- key The key of the submobject to be added. value The mobject associated with the key Returns ------- None Raises ------ TypeError If the value is not an instance of VMobject Examples -------- Normal usage:: square_obj = Square() self.add_key_value_pair("s", square_obj) """ self._assert_valid_submobjects([value]) mob = value if self.show_keys: # This import is here and not at the top to avoid circular import from manim.mobject.text.tex_mobject import Tex key_text = Tex(str(key)).next_to(value, LEFT) mob.add(key_text) self.submob_dict[key] = mob super().add(value) class VectorizedPoint(VMobject, metaclass=ConvertToOpenGL): def __init__( self, location: Point3DLike = ORIGIN, color: ManimColor = BLACK, fill_opacity: float = 0, stroke_width: float = 0, artificial_width: float = 0.01, artificial_height: float = 0.01, **kwargs, ) -> None: self.artificial_width = artificial_width self.artificial_height = artificial_height super().__init__( color=color, fill_opacity=fill_opacity, stroke_width=stroke_width, **kwargs, ) self.set_points(np.array([location])) basecls = OpenGLVMobject if config.renderer == RendererType.OPENGL else VMobject @basecls.width.getter def width(self) -> float: return self.artificial_width @basecls.height.getter def height(self) -> float: return self.artificial_height def get_location(self) -> Point3D: return np.array(self.points[0]) def set_location(self, new_loc: Point3D): self.set_points(np.array([new_loc])) class CurvesAsSubmobjects(VGroup): """Convert a curve's elements to submobjects. Examples -------- .. manim:: LineGradientExample :save_last_frame: class LineGradientExample(Scene): def construct(self): curve = ParametricFunction(lambda t: [t, np.sin(t), 0], t_range=[-PI, PI, 0.01], stroke_width=10) new_curve = CurvesAsSubmobjects(curve) new_curve.set_color_by_gradient(BLUE, RED) self.add(new_curve.shift(UP), curve) """ def __init__(self, vmobject: VMobject, **kwargs) -> None: super().__init__(**kwargs) tuples = vmobject.get_cubic_bezier_tuples() for tup in tuples: part = VMobject() part.set_points(tup) part.match_style(vmobject) self.add(part) def point_from_proportion(self, alpha: float) -> Point3D: """Gets the point at a proportion along the path of the :class:`CurvesAsSubmobjects`. Parameters ---------- alpha The proportion along the the path of the :class:`CurvesAsSubmobjects`. Returns ------- :class:`numpy.ndarray` The point on the :class:`CurvesAsSubmobjects`. Raises ------ :exc:`ValueError` If ``alpha`` is not between 0 and 1. :exc:`Exception` If the :class:`CurvesAsSubmobjects` has no submobjects, or no submobject has points. """ if alpha < 0 or alpha > 1: raise ValueError(f"Alpha {alpha} not between 0 and 1.") self._throw_error_if_no_submobjects() submobjs_with_pts = self._get_submobjects_with_points() if alpha == 1: return submobjs_with_pts[-1].points[-1] submobjs_arc_lengths = tuple( part.get_arc_length() for part in submobjs_with_pts ) total_length = sum(submobjs_arc_lengths) target_length = alpha * total_length current_length = 0 for i, part in enumerate(submobjs_with_pts): part_length = submobjs_arc_lengths[i] if current_length + part_length >= target_length: residue = (target_length - current_length) / part_length return part.point_from_proportion(residue) current_length += part_length def _throw_error_if_no_submobjects(self): if len(self.submobjects) == 0: caller_name = sys._getframe(1).f_code.co_name raise Exception( f"Cannot call CurvesAsSubmobjects. {caller_name} for a CurvesAsSubmobject with no submobjects" ) def _get_submobjects_with_points(self): submobjs_with_pts = tuple( part for part in self.submobjects if len(part.points) > 0 ) if len(submobjs_with_pts) == 0: caller_name = sys._getframe(1).f_code.co_name raise Exception( f"Cannot call CurvesAsSubmobjects. {caller_name} for a CurvesAsSubmobject whose submobjects have no points" ) return submobjs_with_pts class DashedVMobject(VMobject, metaclass=ConvertToOpenGL): """A :class:`VMobject` composed of dashes instead of lines. Parameters ---------- vmobject The object that will get dashed num_dashes Number of dashes to add. dashed_ratio Ratio of dash to empty space. dash_offset Shifts the starting point of dashes along the path. Value 1 shifts by one full dash length. equal_lengths If ``True``, dashes will be (approximately) equally long. If ``False``, dashes will be split evenly in the curve's input t variable (legacy behavior). Examples -------- .. manim:: DashedVMobjectExample :save_last_frame: class DashedVMobjectExample(Scene): def construct(self): r = 0.5 top_row = VGroup() # Increasing num_dashes for dashes in range(1, 12): circ = DashedVMobject(Circle(radius=r, color=WHITE), num_dashes=dashes) top_row.add(circ) middle_row = VGroup() # Increasing dashed_ratio for ratio in np.arange(1 / 11, 1, 1 / 11): circ = DashedVMobject( Circle(radius=r, color=WHITE), dashed_ratio=ratio ) middle_row.add(circ) func1 = FunctionGraph(lambda t: t**5,[-1,1],color=WHITE) func_even = DashedVMobject(func1,num_dashes=6,equal_lengths=True) func_stretched = DashedVMobject(func1, num_dashes=6, equal_lengths=False) bottom_row = VGroup(func_even,func_stretched) top_row.arrange(buff=0.3) middle_row.arrange() bottom_row.arrange(buff=1) everything = VGroup(top_row, middle_row, bottom_row).arrange(DOWN, buff=1) self.add(everything) """ def __init__( self, vmobject: VMobject, num_dashes: int = 15, dashed_ratio: float = 0.5, dash_offset: float = 0, color: ManimColor = WHITE, equal_lengths: bool = True, **kwargs, ) -> None: self.dashed_ratio = dashed_ratio self.num_dashes = num_dashes super().__init__(color=color, **kwargs) # Work on a copy to avoid mutating the caller's mobject (e.g. removing tips). base_vmobject = vmobject vmobject = base_vmobject.copy() # TipableVMobject instances (Arrow, Vector, etc.) carry tips as submobjects. # When dashing such objects, each subcurve would otherwise include its own # tip, leading to many overlapping arrowheads. Pop tips from the working # copy and re-attach them only once after the dashes are created. tips = None if hasattr(vmobject, "pop_tips"): popped_tips = vmobject.pop_tips() if len(popped_tips.submobjects) > 0: tips = popped_tips r = self.dashed_ratio n = self.num_dashes if n > 0: # Assuming total length is 1 dash_len = r / n if vmobject.is_closed(): void_len = (1 - r) / n else: void_len = 1 - r if n == 1 else (1 - r) / (n - 1) period = dash_len + void_len phase_shift = (dash_offset % 1) * period if vmobject.is_closed(): # noqa: SIM108 # closed curves have equal amount of dashes and voids pattern_len = 1 else: # open curves start and end with a dash, so the whole dash pattern with the last void is longer pattern_len = 1 + void_len dash_starts = [((i * period + phase_shift) % pattern_len) for i in range(n)] dash_ends = [ ((i * period + dash_len + phase_shift) % pattern_len) for i in range(n) ] # closed shapes can handle overflow at the 0-point # open shapes need special treatment for it if not vmobject.is_closed(): # due to phase shift being [0...1] range, always the last dash element needs attention for overflow # if an entire dash moves out of the shape end: if dash_ends[-1] > 1 and dash_starts[-1] > 1: # remove the last element since it is out-of-bounds dash_ends.pop() dash_starts.pop() elif dash_ends[-1] < dash_len: # if it overflowed if ( dash_starts[-1] < 1 ): # if the beginning of the piece is still in range dash_starts.append(0) dash_ends.append(dash_ends[-1]) dash_ends[-2] = 1 else: dash_starts[-1] = 0 elif dash_starts[-1] > (1 - dash_len): dash_ends[-1] = 1 if equal_lengths: # calculate the entire length by adding up short line-pieces norms = np.array(0) for k in range(vmobject.get_num_curves()): norms = np.append(norms, vmobject.get_nth_curve_length_pieces(k)) # add up length-pieces in array form length_vals = np.cumsum(norms) ref_points = np.linspace(0, 1, length_vals.size) curve_length = length_vals[-1] self.add( *( vmobject.get_subcurve( np.interp( dash_starts[i] * curve_length, length_vals, ref_points, ), np.interp( dash_ends[i] * curve_length, length_vals, ref_points, ), ) for i in range(len(dash_starts)) ) ) else: self.add( *( vmobject.get_subcurve( dash_starts[i], dash_ends[i], ) for i in range(len(dash_starts)) ) ) # Family is already taken care of by get_subcurve # implementation if config.renderer == RendererType.OPENGL: self.match_style(base_vmobject, recurse=False) else: self.match_style(base_vmobject, family=False) if tips is not None: self.add(*tips.submobjects) ManimCommunity-manim-1157b74/manim/mobject/utils.py000066400000000000000000000063111515024150700222720ustar00rootroot00000000000000"""Utilities for working with mobjects.""" from __future__ import annotations __all__ = [ "get_mobject_class", "get_point_mobject_class", "get_vectorized_mobject_class", ] from .._config import config from ..constants import RendererType from .mobject import Mobject from .opengl.opengl_mobject import OpenGLMobject from .opengl.opengl_point_cloud_mobject import OpenGLPMobject from .opengl.opengl_vectorized_mobject import OpenGLVMobject from .types.point_cloud_mobject import PMobject from .types.vectorized_mobject import VMobject def get_mobject_class() -> type: """Gets the base mobject class, depending on the currently active renderer. .. NOTE:: This method is intended to be used in the code base of Manim itself or in plugins where code should work independent of the selected renderer. Examples -------- The function has to be explicitly imported. We test that the name of the returned class is one of the known mobject base classes:: >>> from manim.mobject.utils import get_mobject_class >>> get_mobject_class().__name__ in ['Mobject', 'OpenGLMobject'] True """ if config.renderer == RendererType.CAIRO: return Mobject if config.renderer == RendererType.OPENGL: return OpenGLMobject raise NotImplementedError( "Base mobjects are not implemented for the active renderer." ) def get_vectorized_mobject_class() -> type: """Gets the vectorized mobject class, depending on the currently active renderer. .. NOTE:: This method is intended to be used in the code base of Manim itself or in plugins where code should work independent of the selected renderer. Examples -------- The function has to be explicitly imported. We test that the name of the returned class is one of the known mobject base classes:: >>> from manim.mobject.utils import get_vectorized_mobject_class >>> get_vectorized_mobject_class().__name__ in ['VMobject', 'OpenGLVMobject'] True """ if config.renderer == RendererType.CAIRO: return VMobject if config.renderer == RendererType.OPENGL: return OpenGLVMobject raise NotImplementedError( "Vectorized mobjects are not implemented for the active renderer." ) def get_point_mobject_class() -> type: """Gets the point cloud mobject class, depending on the currently active renderer. .. NOTE:: This method is intended to be used in the code base of Manim itself or in plugins where code should work independent of the selected renderer. Examples -------- The function has to be explicitly imported. We test that the name of the returned class is one of the known mobject base classes:: >>> from manim.mobject.utils import get_point_mobject_class >>> get_point_mobject_class().__name__ in ['PMobject', 'OpenGLPMobject'] True """ if config.renderer == RendererType.CAIRO: return PMobject if config.renderer == RendererType.OPENGL: return OpenGLPMobject raise NotImplementedError( "Point cloud mobjects are not implemented for the active renderer." ) ManimCommunity-manim-1157b74/manim/mobject/value_tracker.py000066400000000000000000000220211515024150700237550ustar00rootroot00000000000000"""Simple mobjects that can be used for storing (and updating) a value.""" from __future__ import annotations __all__ = ["ValueTracker", "ComplexValueTracker"] from typing import TYPE_CHECKING, Any import numpy as np from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_compatibility import ConvertToOpenGL from manim.utils.paths import straight_path if TYPE_CHECKING: from typing import Self from manim.typing import PathFuncType class ValueTracker(Mobject, metaclass=ConvertToOpenGL): """A mobject that can be used for tracking (real-valued) parameters. Useful for animating parameter changes. Not meant to be displayed. Instead the position encodes some number, often one which another animation or continual_animation uses for its update function, and by treating it as a mobject it can still be animated and manipulated just like anything else. This value changes continuously when animated using the :attr:`animate` syntax. Examples -------- .. manim:: ValueTrackerExample class ValueTrackerExample(Scene): def construct(self): number_line = NumberLine() pointer = Vector(DOWN) label = MathTex("x").add_updater(lambda m: m.next_to(pointer, UP)) tracker = ValueTracker(0) pointer.add_updater( lambda m: m.next_to( number_line.n2p(tracker.get_value()), UP ) ) self.add(number_line, pointer,label) tracker += 1.5 self.wait(1) tracker -= 4 self.wait(0.5) self.play(tracker.animate.set_value(5)) self.wait(0.5) self.play(tracker.animate.set_value(3)) self.play(tracker.animate.increment_value(-2)) self.wait(0.5) .. note:: You can also link ValueTrackers to updaters. In this case, you have to make sure that the ValueTracker is added to the scene by ``add`` .. manim:: ValueTrackerExample class ValueTrackerExample(Scene): def construct(self): tracker = ValueTracker(0) label = Dot(radius=3).add_updater(lambda x : x.set_x(tracker.get_value())) self.add(label) self.add(tracker) tracker.add_updater(lambda mobject, dt: mobject.increment_value(dt)) self.wait(2) """ def __init__(self, value: float = 0, **kwargs: Any) -> None: super().__init__(**kwargs) self.set(points=np.zeros((1, 3))) self.set_value(value) def get_value(self) -> float: """Get the current value of this ValueTracker.""" value: float = self.points[0, 0] return value def set_value(self, value: float) -> Self: """Sets a new scalar value to the ValueTracker.""" self.points[0, 0] = value return self def increment_value(self, d_value: float) -> Self: """Increments (adds) a scalar value to the ValueTracker.""" self.set_value(self.get_value() + d_value) return self def __bool__(self) -> bool: """Return whether the value of this ValueTracker evaluates as true.""" return bool(self.get_value()) def __add__(self, d_value: float | Mobject) -> ValueTracker: """Return a new :class:`ValueTracker` whose value is the current tracker's value plus ``d_value``. """ if isinstance(d_value, Mobject): raise ValueError( "Cannot increment ValueTracker by a Mobject. Please provide a scalar value." ) return ValueTracker(self.get_value() + d_value) def __iadd__(self, d_value: float | Mobject) -> Self: """adds ``+=`` syntax to increment the value of the ValueTracker.""" if isinstance(d_value, Mobject): raise ValueError( "Cannot increment ValueTracker by a Mobject. Please provide a scalar value." ) self.increment_value(d_value) return self def __floordiv__(self, d_value: float) -> ValueTracker: """Return a new :class:`ValueTracker` whose value is the floor division of the current tracker's value by ``d_value``. """ return ValueTracker(self.get_value() // d_value) def __ifloordiv__(self, d_value: float) -> Self: """Set the value of this ValueTracker to the floor division of the current value by ``d_value``.""" self.set_value(self.get_value() // d_value) return self def __mod__(self, d_value: float) -> ValueTracker: """Return a new :class:`ValueTracker` whose value is the current tracker's value modulo ``d_value``. """ return ValueTracker(self.get_value() % d_value) def __imod__(self, d_value: float) -> Self: """Set the value of this ValueTracker to the current value modulo ``d_value``.""" self.set_value(self.get_value() % d_value) return self def __mul__(self, d_value: float) -> ValueTracker: """Return a new :class:`ValueTracker` whose value is the current tracker's value multiplied by ``d_value``. """ return ValueTracker(self.get_value() * d_value) def __imul__(self, d_value: float) -> Self: """Set the value of this ValueTracker to the product of the current value and ``d_value``.""" self.set_value(self.get_value() * d_value) return self def __pow__(self, d_value: float) -> ValueTracker: """Return a new :class:`ValueTracker` whose value is the current tracker's value raised to the power of ``d_value``. """ return ValueTracker(self.get_value() ** d_value) def __ipow__(self, d_value: float) -> Self: """Set the value of this ValueTracker to the current value raised to the power of ``d_value``.""" self.set_value(self.get_value() ** d_value) return self def __sub__(self, d_value: float | Mobject) -> ValueTracker: """Return a new :class:`ValueTracker` whose value is the current tracker's value minus ``d_value``. """ if isinstance(d_value, Mobject): raise ValueError( "Cannot decrement ValueTracker by a Mobject. Please provide a scalar value." ) return ValueTracker(self.get_value() - d_value) def __isub__(self, d_value: float | Mobject) -> Self: """Adds ``-=`` syntax to decrement the value of the ValueTracker.""" if isinstance(d_value, Mobject): raise ValueError( "Cannot decrement ValueTracker by a Mobject. Please provide a scalar value." ) self.increment_value(-d_value) return self def __truediv__(self, d_value: float) -> ValueTracker: """Return a new :class:`ValueTracker` whose value is the current tracker's value divided by ``d_value``. """ return ValueTracker(self.get_value() / d_value) def __itruediv__(self, d_value: float) -> Self: """Sets the value of this ValueTracker to the current value divided by ``d_value``.""" self.set_value(self.get_value() / d_value) return self def interpolate( self, mobject1: Mobject, mobject2: Mobject, alpha: float, path_func: PathFuncType = straight_path(), ) -> Self: """Turns ``self`` into an interpolation between ``mobject1`` and ``mobject2``.""" self.set(points=path_func(mobject1.points, mobject2.points, alpha)) return self class ComplexValueTracker(ValueTracker): """Tracks a complex-valued parameter. The value is internally stored as a points array [a, b, 0]. This can be accessed directly to represent the value geometrically, see the usage example. When the value is set through :attr:`animate`, the value will take a straight path from the source point to the destination point. Examples -------- .. manim:: ComplexValueTrackerExample class ComplexValueTrackerExample(Scene): def construct(self): tracker = ComplexValueTracker(-2+1j) dot = Dot().add_updater( lambda x: x.move_to(tracker.points) ) self.add(NumberPlane(), dot) self.play(tracker.animate.set_value(3+2j)) self.play(tracker.animate.set_value(tracker.get_value() * 1j)) self.play(tracker.animate.set_value(tracker.get_value() - 2j)) self.play(tracker.animate.set_value(tracker.get_value() / (-2 + 3j))) """ def get_value(self) -> complex: # type: ignore [override] """Get the current value of this ComplexValueTracker as a complex number.""" return complex(*self.points[0, :2]) def set_value(self, value: complex | float) -> Self: """Sets a new complex value to the ComplexValueTracker.""" z = complex(value) self.points[0, :2] = (z.real, z.imag) return self ManimCommunity-manim-1157b74/manim/mobject/vector_field.py000066400000000000000000001161021515024150700235770ustar00rootroot00000000000000"""Mobjects representing vector fields.""" from __future__ import annotations __all__ = [ "VectorField", "ArrowVectorField", "StreamLines", ] import itertools as it import random from collections.abc import Callable, Iterable, Sequence from math import ceil, floor from typing import TYPE_CHECKING import numpy as np from PIL import Image from manim.animation.updaters.update import UpdateFromAlphaFunc from manim.mobject.geometry.line import Vector from manim.mobject.graphing.coordinate_systems import CoordinateSystem from .. import config from ..animation.composition import AnimationGroup, Succession from ..animation.creation import Create from ..animation.indication import ShowPassingFlash from ..constants import OUT, RIGHT, UP, RendererType from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VGroup from ..mobject.utils import get_vectorized_mobject_class from ..utils.bezier import interpolate, inverse_interpolate from ..utils.color import ( BLUE_E, GREEN, RED, YELLOW, ManimColor, ParsableManimColor, color_to_rgb, rgb_to_color, ) from ..utils.rate_functions import ease_out_sine, linear from ..utils.simple_functions import sigmoid if TYPE_CHECKING: from manim.typing import ( FloatRGB, FloatRGB_Array, FloatRGBA_Array, Point3D, Vector3D, ) DEFAULT_SCALAR_FIELD_COLORS: list = [BLUE_E, GREEN, YELLOW, RED] class VectorField(VGroup): """A vector field. Vector fields are based on a function defining a vector at every position. This class does by default not include any visible elements but provides methods to move other :class:`~.Mobject` s along the vector field. Parameters ---------- func The function defining the rate of change at every position of the `VectorField`. color The color of the vector field. If set, position-specific coloring is disabled. color_scheme A function mapping a vector to a single value. This value gives the position in the color gradient defined using `min_color_scheme_value`, `max_color_scheme_value` and `colors`. min_color_scheme_value The value of the color_scheme function to be mapped to the first color in `colors`. Lower values also result in the first color of the gradient. max_color_scheme_value The value of the color_scheme function to be mapped to the last color in `colors`. Higher values also result in the last color of the gradient. colors The colors defining the color gradient of the vector field. kwargs Additional arguments to be passed to the :class:`~.VGroup` constructor """ def __init__( self, func: Callable[[Point3D], Vector3D], color: ParsableManimColor | None = None, color_scheme: Callable[[Vector3D], float] | None = None, min_color_scheme_value: float = 0, max_color_scheme_value: float = 2, colors: Sequence[ParsableManimColor] = DEFAULT_SCALAR_FIELD_COLORS, **kwargs, ): super().__init__(**kwargs) self.func = func if color is None: self.single_color = False if color_scheme is None: def color_scheme(vec: Vector3D) -> float: return np.linalg.norm(vec) self.color_scheme = color_scheme # TODO maybe other default for direction? self.rgbs: FloatRGB_Array = np.array(list(map(color_to_rgb, colors))) def pos_to_rgb(pos: Point3D) -> FloatRGB: vec = self.func(pos) color_value = np.clip( self.color_scheme(vec), min_color_scheme_value, max_color_scheme_value, ) alpha = inverse_interpolate( min_color_scheme_value, max_color_scheme_value, color_value, ) alpha *= len(self.rgbs) - 1 c1: FloatRGB = self.rgbs[int(alpha)] c2: FloatRGB = self.rgbs[min(int(alpha + 1), len(self.rgbs) - 1)] alpha %= 1 return interpolate(c1, c2, alpha) self.pos_to_rgb = pos_to_rgb self.pos_to_color = lambda pos: rgb_to_color(self.pos_to_rgb(pos)) else: self.single_color = True self.color = ManimColor.parse(color) self.submob_movement_updater = None @staticmethod def shift_func( func: Callable[[np.ndarray], np.ndarray], shift_vector: np.ndarray, ) -> Callable[[np.ndarray], np.ndarray]: """Shift a vector field function. Parameters ---------- func The function defining a vector field. shift_vector The shift to be applied to the vector field. Returns ------- `Callable[[np.ndarray], np.ndarray]` The shifted vector field function. """ return lambda p: func(p - shift_vector) @staticmethod def scale_func( func: Callable[[np.ndarray], np.ndarray], scalar: float, ) -> Callable[[np.ndarray], np.ndarray]: """Scale a vector field function. Parameters ---------- func The function defining a vector field. scalar The scalar to be applied to the vector field. Examples -------- .. manim:: ScaleVectorFieldFunction class ScaleVectorFieldFunction(Scene): def construct(self): func = lambda pos: np.sin(pos[1]) * RIGHT + np.cos(pos[0]) * UP vector_field = ArrowVectorField(func) self.add(vector_field) self.wait() func = VectorField.scale_func(func, 0.5) self.play(vector_field.animate.become(ArrowVectorField(func))) self.wait() Returns ------- `Callable[[np.ndarray], np.ndarray]` The scaled vector field function. """ return lambda p: func(p * scalar) def fit_to_coordinate_system(self, coordinate_system: CoordinateSystem): """Scale the vector field to fit a coordinate system. This method is useful when the vector field is defined in a coordinate system different from the one used to display the vector field. This method can only be used once because it transforms the origin of each vector. Parameters ---------- coordinate_system The coordinate system to fit the vector field to. """ self.apply_function(lambda pos: coordinate_system.coords_to_point(*pos)) def nudge( self, mob: Mobject, dt: float = 1, substeps: int = 1, pointwise: bool = False, ) -> VectorField: """Nudge a :class:`~.Mobject` along the vector field. Parameters ---------- mob The mobject to move along the vector field dt A scalar to the amount the mobject is moved along the vector field. The actual distance is based on the magnitude of the vector field. substeps The amount of steps the whole nudge is divided into. Higher values give more accurate approximations. pointwise Whether to move the mobject along the vector field. If `False` the vector field takes effect on the center of the given :class:`~.Mobject`. If `True` the vector field takes effect on the points of the individual points of the :class:`~.Mobject`, potentially distorting it. Returns ------- VectorField This vector field. Examples -------- .. manim:: Nudging class Nudging(Scene): def construct(self): func = lambda pos: np.sin(pos[1] / 2) * RIGHT + np.cos(pos[0] / 2) * UP vector_field = ArrowVectorField( func, x_range=[-7, 7, 1], y_range=[-4, 4, 1], length_func=lambda x: x / 2 ) self.add(vector_field) circle = Circle(radius=2).shift(LEFT) self.add(circle.copy().set_color(GRAY)) dot = Dot().move_to(circle) vector_field.nudge(circle, -2, 60, True) vector_field.nudge(dot, -2, 60) circle.add_updater(vector_field.get_nudge_updater(pointwise=True)) dot.add_updater(vector_field.get_nudge_updater()) self.add(circle, dot) self.wait(6) """ def runge_kutta(self, p: Sequence[float], step_size: float) -> float: """Returns the change in position of a point along a vector field. Parameters ---------- p The position of each point being moved along the vector field. step_size A scalar that is used to determine how much a point is shifted in a single step. Returns ------- float How much the point is shifted. """ k_1 = self.func(p) k_2 = self.func(p + step_size * (k_1 * 0.5)) k_3 = self.func(p + step_size * (k_2 * 0.5)) k_4 = self.func(p + step_size * k_3) return step_size / 6.0 * (k_1 + 2.0 * k_2 + 2.0 * k_3 + k_4) step_size = dt / substeps for _ in range(substeps): if pointwise: mob.apply_function(lambda p: p + runge_kutta(self, p, step_size)) else: mob.shift(runge_kutta(self, mob.get_center(), step_size)) return self def nudge_submobjects( self, dt: float = 1, substeps: int = 1, pointwise: bool = False, ) -> VectorField: """Apply a nudge along the vector field to all submobjects. Parameters ---------- dt A scalar to the amount the mobject is moved along the vector field. The actual distance is based on the magnitude of the vector field. substeps The amount of steps the whole nudge is divided into. Higher values give more accurate approximations. pointwise Whether to move the mobject along the vector field. See :meth:`nudge` for details. Returns ------- VectorField This vector field. """ for mob in self.submobjects: self.nudge(mob, dt, substeps, pointwise) return self def get_nudge_updater( self, speed: float = 1, pointwise: bool = False, ) -> Callable[[Mobject, float], Mobject]: """Get an update function to move a :class:`~.Mobject` along the vector field. When used with :meth:`~.Mobject.add_updater`, the mobject will move along the vector field, where its speed is determined by the magnitude of the vector field. Parameters ---------- speed At `speed=1` the distance a mobject moves per second is equal to the magnitude of the vector field along its path. The speed value scales the speed of such a mobject. pointwise Whether to move the mobject along the vector field. See :meth:`nudge` for details. Returns ------- Callable[[Mobject, float], Mobject] The update function. """ return lambda mob, dt: self.nudge(mob, dt * speed, pointwise=pointwise) def start_submobject_movement( self, speed: float = 1, pointwise: bool = False, ) -> VectorField: """Start continuously moving all submobjects along the vector field. Calling this method multiple times will result in removing the previous updater created by this method. Parameters ---------- speed The speed at which to move the submobjects. See :meth:`get_nudge_updater` for details. pointwise Whether to move the mobject along the vector field. See :meth:`nudge` for details. Returns ------- VectorField This vector field. """ self.stop_submobject_movement() self.submob_movement_updater = lambda mob, dt: mob.nudge_submobjects( dt * speed, pointwise=pointwise, ) self.add_updater(self.submob_movement_updater) return self def stop_submobject_movement(self) -> VectorField: """Stops the continuous movement started using :meth:`start_submobject_movement`. Returns ------- VectorField This vector field. """ self.remove_updater(self.submob_movement_updater) self.submob_movement_updater = None return self def get_colored_background_image(self, sampling_rate: int = 5) -> Image.Image: """Generate an image that displays the vector field. The color at each position is calculated by passing the positing through a series of steps: Calculate the vector field function at that position, map that vector to a single value using `self.color_scheme` and finally generate a color from that value using the color gradient. Parameters ---------- sampling_rate The stepsize at which pixels get included in the image. Lower values give more accurate results, but may take a long time to compute. Returns ------- Image.Imgae The vector field image. """ if self.single_color: raise ValueError( "There is no point in generating an image if the vector field uses a single color.", ) ph = int(config["pixel_height"] / sampling_rate) pw = int(config["pixel_width"] / sampling_rate) fw = config["frame_width"] fh = config["frame_height"] points_array = np.zeros((ph, pw, 3)) x_array = np.linspace(-fw / 2, fw / 2, pw) y_array = np.linspace(fh / 2, -fh / 2, ph) x_array = x_array.reshape((1, len(x_array))) y_array = y_array.reshape((len(y_array), 1)) x_array = x_array.repeat(ph, axis=0) y_array.repeat(pw, axis=1) # TODO why not y_array = y_array.repeat(...)? points_array[:, :, 0] = x_array points_array[:, :, 1] = y_array rgbs = np.apply_along_axis(self.pos_to_rgb, 2, points_array) return Image.fromarray((rgbs * 255).astype("uint8")) def get_vectorized_rgba_gradient_function( self, start: float, end: float, colors: Iterable[ParsableManimColor], ) -> Callable[[Sequence[float], float], FloatRGBA_Array]: """ Generates a gradient of rgbas as a numpy array Parameters ---------- start start value used for inverse interpolation at :func:`~.inverse_interpolate` end end value used for inverse interpolation at :func:`~.inverse_interpolate` colors list of colors to generate the gradient Returns ------- function to generate the gradients as numpy arrays representing rgba values """ rgbs: FloatRGB_Array = np.array([color_to_rgb(c) for c in colors]) def func(values: Sequence[float], opacity: float = 1.0) -> FloatRGBA_Array: alphas = inverse_interpolate(start, end, np.array(values)) alphas = np.clip(alphas, 0, 1) scaled_alphas = alphas * (len(rgbs) - 1) indices = scaled_alphas.astype(int) next_indices = np.clip(indices + 1, 0, len(rgbs) - 1) inter_alphas = scaled_alphas % 1 inter_alphas = inter_alphas.repeat(3).reshape((len(indices), 3)) new_rgbs: FloatRGB_Array = interpolate( rgbs[indices], rgbs[next_indices], inter_alphas ) new_rgbas: FloatRGBA_Array = np.concatenate( (new_rgbs, np.full([len(new_rgbs), 1], opacity)), axis=1, ) return new_rgbas return func class ArrowVectorField(VectorField): """A :class:`VectorField` represented by a set of change vectors. Vector fields are always based on a function defining the :class:`~.Vector` at every position. The values of this functions is displayed as a grid of vectors. By default the color of each vector is determined by it's magnitude. Other color schemes can be used however. Parameters ---------- func The function defining the rate of change at every position of the vector field. color The color of the vector field. If set, position-specific coloring is disabled. color_scheme A function mapping a vector to a single value. This value gives the position in the color gradient defined using `min_color_scheme_value`, `max_color_scheme_value` and `colors`. min_color_scheme_value The value of the color_scheme function to be mapped to the first color in `colors`. Lower values also result in the first color of the gradient. max_color_scheme_value The value of the color_scheme function to be mapped to the last color in `colors`. Higher values also result in the last color of the gradient. colors The colors defining the color gradient of the vector field. x_range A sequence of x_min, x_max, delta_x y_range A sequence of y_min, y_max, delta_y z_range A sequence of z_min, z_max, delta_z three_dimensions Enables three_dimensions. Default set to False, automatically turns True if z_range is not None. length_func The function determining the displayed size of the vectors. The actual size of the vector is passed, the returned value will be used as display size for the vector. By default this is used to cap the displayed size of vectors to reduce the clutter. opacity The opacity of the arrows. vector_config Additional arguments to be passed to the :class:`~.Vector` constructor kwargs Additional arguments to be passed to the :class:`~.VGroup` constructor Examples -------- .. manim:: BasicUsage :save_last_frame: class BasicUsage(Scene): def construct(self): func = lambda pos: ((pos[0] * UR + pos[1] * LEFT) - pos) / 3 self.add(ArrowVectorField(func)) .. manim:: SizingAndSpacing class SizingAndSpacing(Scene): def construct(self): func = lambda pos: np.sin(pos[0] / 2) * UR + np.cos(pos[1] / 2) * LEFT vf = ArrowVectorField(func, x_range=[-7, 7, 1]) self.add(vf) self.wait() length_func = lambda x: x / 3 vf2 = ArrowVectorField(func, x_range=[-7, 7, 1], length_func=length_func) self.play(vf.animate.become(vf2)) self.wait() .. manim:: Coloring :save_last_frame: class Coloring(Scene): def construct(self): func = lambda pos: pos - LEFT * 5 colors = [RED, YELLOW, BLUE, DARK_GRAY] min_radius = Circle(radius=2, color=colors[0]).shift(LEFT * 5) max_radius = Circle(radius=10, color=colors[-1]).shift(LEFT * 5) vf = ArrowVectorField( func, min_color_scheme_value=2, max_color_scheme_value=10, colors=colors ) self.add(vf, min_radius, max_radius) """ def __init__( self, func: Callable[[np.ndarray], np.ndarray], color: ParsableManimColor | None = None, color_scheme: Callable[[np.ndarray], float] | None = None, min_color_scheme_value: float = 0, max_color_scheme_value: float = 2, colors: Sequence[ParsableManimColor] = DEFAULT_SCALAR_FIELD_COLORS, # Determining Vector positions: x_range: Sequence[float] = None, y_range: Sequence[float] = None, z_range: Sequence[float] = None, three_dimensions: bool = False, # Automatically True if z_range is set # Takes in actual norm, spits out displayed norm length_func: Callable[[float], float] = lambda norm: 0.45 * sigmoid(norm), opacity: float = 1.0, vector_config: dict | None = None, **kwargs, ): self.x_range = x_range or [ floor(-config["frame_width"] / 2), ceil(config["frame_width"] / 2), ] self.y_range = y_range or [ floor(-config["frame_height"] / 2), ceil(config["frame_height"] / 2), ] self.ranges = [self.x_range, self.y_range] if three_dimensions or z_range: self.z_range = z_range or self.y_range.copy() self.ranges += [self.z_range] else: self.ranges += [[0, 0]] for i in range(len(self.ranges)): if len(self.ranges[i]) == 2: self.ranges[i] += [0.5] self.ranges[i][1] += self.ranges[i][2] self.x_range, self.y_range, self.z_range = self.ranges super().__init__( func, color, color_scheme, min_color_scheme_value, max_color_scheme_value, colors, **kwargs, ) self.length_func = length_func self.opacity = opacity if vector_config is None: vector_config = {} self.vector_config = vector_config self.func = func x_range = np.arange(*self.x_range) y_range = np.arange(*self.y_range) z_range = np.arange(*self.z_range) self.add( *[ self.get_vector(x * RIGHT + y * UP + z * OUT) for x, y, z in it.product(x_range, y_range, z_range) ] ) self.set_opacity(self.opacity) def get_vector(self, point: np.ndarray): """Creates a vector in the vector field. The created vector is based on the function of the vector field and is rooted in the given point. Color and length fit the specifications of this vector field. Parameters ---------- point The root point of the vector. """ output = np.array(self.func(point)) norm = np.linalg.norm(output) if norm != 0: output *= self.length_func(norm) / norm vect = Vector(output, **self.vector_config) vect.shift(point) if self.single_color: vect.set_color(self.color) else: vect.set_color(self.pos_to_color(point)) return vect class StreamLines(VectorField): """StreamLines represent the flow of a :class:`VectorField` using the trace of moving agents. Vector fields are always based on a function defining the vector at every position. The values of this functions is displayed by moving many agents along the vector field and showing their trace. Parameters ---------- func The function defining the rate of change at every position of the vector field. color The color of the vector field. If set, position-specific coloring is disabled. color_scheme A function mapping a vector to a single value. This value gives the position in the color gradient defined using `min_color_scheme_value`, `max_color_scheme_value` and `colors`. min_color_scheme_value The value of the color_scheme function to be mapped to the first color in `colors`. Lower values also result in the first color of the gradient. max_color_scheme_value The value of the color_scheme function to be mapped to the last color in `colors`. Higher values also result in the last color of the gradient. colors The colors defining the color gradient of the vector field. x_range A sequence of x_min, x_max, delta_x y_range A sequence of y_min, y_max, delta_y z_range A sequence of z_min, z_max, delta_z three_dimensions Enables three_dimensions. Default set to False, automatically turns True if z_range is not None. noise_factor The amount by which the starting position of each agent is altered along each axis. Defaults to :code:`delta_y / 2` if not defined. n_repeats The number of agents generated at each starting point. dt The factor by which the distance an agent moves per step is stretched. Lower values result in a better approximation of the trajectories in the vector field. virtual_time The time the agents get to move in the vector field. Higher values therefore result in longer stream lines. However, this whole time gets simulated upon creation. max_anchors_per_line The maximum number of anchors per line. Lines with more anchors get reduced in complexity, not in length. padding The distance agents can move out of the generation area before being terminated. stroke_width The stroke with of the stream lines. opacity The opacity of the stream lines. Examples -------- .. manim:: BasicUsage :save_last_frame: class BasicUsage(Scene): def construct(self): func = lambda pos: ((pos[0] * UR + pos[1] * LEFT) - pos) / 3 self.add(StreamLines(func)) .. manim:: SpawningAndFlowingArea :save_last_frame: class SpawningAndFlowingArea(Scene): def construct(self): func = lambda pos: np.sin(pos[0]) * UR + np.cos(pos[1]) * LEFT + pos / 5 stream_lines = StreamLines( func, x_range=[-3, 3, 0.2], y_range=[-2, 2, 0.2], padding=1 ) spawning_area = Rectangle(width=6, height=4) flowing_area = Rectangle(width=8, height=6) labels = [Tex("Spawning Area"), Tex("Flowing Area").shift(DOWN * 2.5)] for lbl in labels: lbl.add_background_rectangle(opacity=0.6, buff=0.05) self.add(stream_lines, spawning_area, flowing_area, *labels) """ def __init__( self, func: Callable[[np.ndarray], np.ndarray], color: ParsableManimColor | None = None, color_scheme: Callable[[np.ndarray], float] | None = None, min_color_scheme_value: float = 0, max_color_scheme_value: float = 2, colors: Sequence[ParsableManimColor] = DEFAULT_SCALAR_FIELD_COLORS, # Determining stream line starting positions: x_range: Sequence[float] = None, y_range: Sequence[float] = None, z_range: Sequence[float] = None, three_dimensions: bool = False, noise_factor: float | None = None, n_repeats=1, # Determining how lines are drawn dt=0.05, virtual_time=3, max_anchors_per_line=100, padding=3, # Determining stream line appearance: stroke_width=1, opacity=1, **kwargs, ): self.x_range = x_range or [ floor(-config["frame_width"] / 2), ceil(config["frame_width"] / 2), ] self.y_range = y_range or [ floor(-config["frame_height"] / 2), ceil(config["frame_height"] / 2), ] self.ranges = [self.x_range, self.y_range] if three_dimensions or z_range: self.z_range = z_range or self.y_range.copy() self.ranges += [self.z_range] else: self.ranges += [[0, 0]] for i in range(len(self.ranges)): if len(self.ranges[i]) == 2: self.ranges[i] += [0.5] self.ranges[i][1] += self.ranges[i][2] self.x_range, self.y_range, self.z_range = self.ranges super().__init__( func, color, color_scheme, min_color_scheme_value, max_color_scheme_value, colors, **kwargs, ) self.noise_factor = ( noise_factor if noise_factor is not None else self.y_range[2] / 2 ) self.n_repeats = n_repeats self.virtual_time = virtual_time self.max_anchors_per_line = max_anchors_per_line self.padding = padding self.stroke_width = stroke_width half_noise = self.noise_factor / 2 rng = np.random.default_rng(0) start_points = np.array( [ (x - half_noise) * RIGHT + (y - half_noise) * UP + (z - half_noise) * OUT + self.noise_factor * rng.random(3) for n in range(self.n_repeats) for x in np.arange(*self.x_range) for y in np.arange(*self.y_range) for z in np.arange(*self.z_range) ], ) def outside_box(p): return ( p[0] < self.x_range[0] - self.padding or p[0] > self.x_range[1] + self.padding - self.x_range[2] or p[1] < self.y_range[0] - self.padding or p[1] > self.y_range[1] + self.padding - self.y_range[2] or p[2] < self.z_range[0] - self.padding or p[2] > self.z_range[1] + self.padding - self.z_range[2] ) max_steps = ceil(virtual_time / dt) + 1 if not self.single_color: self.background_img = self.get_colored_background_image() if config["renderer"] == RendererType.OPENGL: self.values_to_rgbas = self.get_vectorized_rgba_gradient_function( min_color_scheme_value, max_color_scheme_value, colors, ) for point in start_points: points = [point] for _ in range(max_steps): last_point = points[-1] new_point = last_point + dt * func(last_point) if outside_box(new_point): break points.append(new_point) step = max_steps if not step: continue line = get_vectorized_mobject_class()() line.duration = step * dt step = max(1, int(len(points) / self.max_anchors_per_line)) line.set_points_smoothly(points[::step]) if self.single_color: line.set_stroke( color=self.color, width=self.stroke_width, opacity=opacity ) else: if config.renderer == RendererType.OPENGL: # scaled for compatibility with cairo line.set_stroke(width=self.stroke_width / 4.0) norms = np.array( [np.linalg.norm(self.func(point)) for point in line.points], ) line.set_rgba_array_direct( self.values_to_rgbas(norms, opacity), name="stroke_rgba", ) else: if np.any(self.z_range != np.array([0, 0.5, 0.5])): line.set_stroke( [self.pos_to_color(p) for p in line.get_anchors()], ) else: line.color_using_background_image(self.background_img) line.set_stroke(width=self.stroke_width, opacity=opacity) self.add(line) self.stream_lines = [*self.submobjects] def create( self, lag_ratio: float | None = None, run_time: Callable[[float], float] | None = None, **kwargs, ) -> AnimationGroup: """The creation animation of the stream lines. The stream lines appear in random order. Parameters ---------- lag_ratio The lag ratio of the animation. If undefined, it will be selected so that the total animation length is 1.5 times the run time of each stream line creation. run_time The run time of every single stream line creation. The runtime of the whole animation might be longer due to the `lag_ratio`. If undefined, the virtual time of the stream lines is used as run time. Returns ------- :class:`~.AnimationGroup` The creation animation of the stream lines. Examples -------- .. manim:: StreamLineCreation class StreamLineCreation(Scene): def construct(self): func = lambda pos: (pos[0] * UR + pos[1] * LEFT) - pos stream_lines = StreamLines( func, color=YELLOW, x_range=[-7, 7, 1], y_range=[-4, 4, 1], stroke_width=3, virtual_time=1, # use shorter lines max_anchors_per_line=5, # better performance with fewer anchors ) self.play(stream_lines.create()) # uses virtual_time as run_time self.wait() """ if run_time is None: run_time = self.virtual_time if lag_ratio is None: lag_ratio = run_time / 2 / len(self.submobjects) animations = [ Create(line, run_time=run_time, **kwargs) for line in self.stream_lines ] random.shuffle(animations) return AnimationGroup(*animations, lag_ratio=lag_ratio) def start_animation( self, warm_up: bool = True, flow_speed: float = 1, time_width: float = 0.3, rate_func: Callable[[float], float] = linear, line_animation_class: type[ShowPassingFlash] = ShowPassingFlash, **kwargs, ) -> None: """Animates the stream lines using an updater. The stream lines will continuously flow Parameters ---------- warm_up If `True` the animation is initialized line by line. Otherwise it starts with all lines shown. flow_speed At `flow_speed=1` the distance the flow moves per second is equal to the magnitude of the vector field along its path. The speed value scales the speed of this flow. time_width The proportion of the stream line shown while being animated rate_func The rate function of each stream line flashing line_animation_class The animation class being used Examples -------- .. manim:: ContinuousMotion class ContinuousMotion(Scene): def construct(self): func = lambda pos: np.sin(pos[0] / 2) * UR + np.cos(pos[1] / 2) * LEFT stream_lines = StreamLines(func, stroke_width=3, max_anchors_per_line=30) self.add(stream_lines) stream_lines.start_animation(warm_up=False, flow_speed=1.5) self.wait(stream_lines.virtual_time / stream_lines.flow_speed) """ for line in self.stream_lines: run_time = line.duration / flow_speed line.anim = line_animation_class( line, run_time=run_time, rate_func=rate_func, time_width=time_width, **kwargs, ) line.anim.begin() line.time = random.random() * self.virtual_time if warm_up: line.time *= -1 self.add(line.anim.mobject) def updater(mob, dt): for line in mob.stream_lines: line.time += dt * flow_speed if line.time >= self.virtual_time: line.time -= self.virtual_time line.anim.interpolate(np.clip(line.time / line.anim.run_time, 0, 1)) self.add_updater(updater) self.flow_animation = updater self.flow_speed = flow_speed self.time_width = time_width def end_animation(self) -> AnimationGroup: """End the stream line animation smoothly. Returns an animation resulting in fully displayed stream lines without a noticeable cut. Returns ------- :class:`~.AnimationGroup` The animation fading out the running stream animation. Raises ------ ValueError if no stream line animation is running Examples -------- .. manim:: EndAnimation class EndAnimation(Scene): def construct(self): func = lambda pos: np.sin(pos[0] / 2) * UR + np.cos(pos[1] / 2) * LEFT stream_lines = StreamLines( func, stroke_width=3, max_anchors_per_line=5, virtual_time=1, color=BLUE ) self.add(stream_lines) stream_lines.start_animation(warm_up=False, flow_speed=1.5, time_width=0.5) self.wait(1) self.play(stream_lines.end_animation()) """ if self.flow_animation is None: raise ValueError("You have to start the animation before fading it out.") def hide_and_wait(mob, alpha): if alpha == 0: mob.set_stroke(opacity=0) elif alpha == 1: mob.set_stroke(opacity=1) def finish_updater_cycle(line, alpha): line.time += dt * self.flow_speed line.anim.interpolate(min(line.time / line.anim.run_time, 1)) if alpha == 1: self.remove(line.anim.mobject) line.anim.finish() max_run_time = self.virtual_time / self.flow_speed creation_rate_func = ease_out_sine creation_staring_speed = creation_rate_func(0.001) * 1000 creation_run_time = ( max_run_time / (1 + self.time_width) * creation_staring_speed ) # creation_run_time is calculated so that the creation animation starts at the same speed # as the regular line flash animation but eases out. dt = 1 / config["frame_rate"] animations = [] self.remove_updater(self.flow_animation) self.flow_animation = None for line in self.stream_lines: create = Create( line, run_time=creation_run_time, rate_func=creation_rate_func, ) if line.time <= 0: animations.append( Succession( UpdateFromAlphaFunc( line, hide_and_wait, run_time=-line.time / self.flow_speed, ), create, ), ) self.remove(line.anim.mobject) line.anim.finish() else: remaining_time = max_run_time - line.time / self.flow_speed animations.append( Succession( UpdateFromAlphaFunc( line, finish_updater_cycle, run_time=remaining_time, ), create, ), ) return AnimationGroup(*animations) # TODO: Variant of StreamLines that is able to respond to changes in the vector field function ManimCommunity-manim-1157b74/manim/opengl/000077500000000000000000000000001515024150700204205ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/opengl/__init__.py000066400000000000000000000011101515024150700225220ustar00rootroot00000000000000from __future__ import annotations import contextlib with contextlib.suppress(ImportError): from dearpygui import dearpygui as dpg from manim.mobject.opengl.dot_cloud import * from manim.mobject.opengl.opengl_image_mobject import * from manim.mobject.opengl.opengl_mobject import * from manim.mobject.opengl.opengl_point_cloud_mobject import * from manim.mobject.opengl.opengl_surface import * from manim.mobject.opengl.opengl_three_dimensions import * from manim.mobject.opengl.opengl_vectorized_mobject import * from ..renderer.shader import * from ..utils.opengl import * ManimCommunity-manim-1157b74/manim/plugins/000077500000000000000000000000001515024150700206155ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/plugins/__init__.py000066400000000000000000000006141515024150700227270ustar00rootroot00000000000000from __future__ import annotations from manim._config import config, logger from manim.plugins.plugins_flags import get_plugins, list_plugins __all__ = [ "get_plugins", "list_plugins", ] requested_plugins: set[str] = set(config["plugins"]) missing_plugins = requested_plugins - set(get_plugins().keys()) if missing_plugins: logger.warning("Missing Plugins: %s", missing_plugins) ManimCommunity-manim-1157b74/manim/plugins/plugins_flags.py000066400000000000000000000011401515024150700240200ustar00rootroot00000000000000"""Plugin Managing Utility""" from __future__ import annotations from importlib.metadata import entry_points from typing import Any from manim._config import console __all__ = ["list_plugins"] def get_plugins() -> dict[str, Any]: plugins: dict[str, Any] = { entry_point.name: entry_point.load() for entry_point in entry_points(group="manim.plugins") } return plugins def list_plugins() -> None: console.print("[green bold]Plugins:[/green bold]", justify="left") plugins = get_plugins() for plugin_name in plugins: console.print(f" โ€ข {plugin_name}") ManimCommunity-manim-1157b74/manim/py.typed000066400000000000000000000000001515024150700206210ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/000077500000000000000000000000001515024150700207425ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/__init__.py000066400000000000000000000000001515024150700230410ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/cairo_renderer.py000066400000000000000000000226121515024150700243020ustar00rootroot00000000000000from __future__ import annotations from collections.abc import Iterable from typing import TYPE_CHECKING, Any import numpy as np from manim.utils.hashing import get_hash_from_play_call from .. import config, logger from ..camera.camera import Camera from ..mobject.mobject import Mobject, _AnimationBuilder from ..scene.scene_file_writer import SceneFileWriter from ..utils.exceptions import EndSceneEarlyException from ..utils.iterables import list_update if TYPE_CHECKING: from manim.animation.animation import Animation from manim.scene.scene import Scene from ..typing import PixelArray __all__ = ["CairoRenderer"] class CairoRenderer: """A renderer using Cairo. Attributes ---------- num_plays : int Number of play() functions in the scene. time : float Time elapsed since initialisation of scene. """ def __init__( self, file_writer_class: type[SceneFileWriter] = SceneFileWriter, camera_class: type[Camera] | None = None, skip_animations: bool = False, **kwargs: Any, ): # All of the following are set to EITHER the value passed via kwargs, # OR the value stored in the global config dict at the time of # _instance construction_. self._file_writer_class = file_writer_class camera_cls = camera_class if camera_class is not None else Camera self.camera = camera_cls() self._original_skipping_status = skip_animations self.skip_animations = skip_animations self.animations_hashes: list[str | None] = [] self.num_plays = 0 self.time = 0.0 self.static_image: PixelArray | None = None def init_scene(self, scene: Scene) -> None: self.file_writer: Any = self._file_writer_class( self, scene.__class__.__name__, ) def play( self, scene: Scene, *args: Animation | Mobject | _AnimationBuilder, **kwargs: Any, ) -> None: # Reset skip_animations to the original state. # Needed when rendering only some animations, and skipping others. self.skip_animations = self._original_skipping_status self.update_skipping_status() scene.compile_animation_data(*args, **kwargs) if self.skip_animations: logger.debug(f"Skipping animation {self.num_plays}") hash_current_animation = None self.time += scene.duration else: if config["disable_caching"]: logger.info("Caching disabled.") hash_current_animation = f"uncached_{self.num_plays:05}" else: assert scene.animations is not None hash_current_animation = get_hash_from_play_call( scene, self.camera, scene.animations, scene.mobjects, ) if self.file_writer.is_already_cached(hash_current_animation): logger.info( f"Animation {self.num_plays} : Using cached data (hash : %(hash_current_animation)s)", {"hash_current_animation": hash_current_animation}, ) self.skip_animations = True self.time += scene.duration # adding None as a partial movie file will make file_writer ignore the latter. self.file_writer.add_partial_movie_file(hash_current_animation) self.animations_hashes.append(hash_current_animation) logger.debug( "List of the first few animation hashes of the scene: %(h)s", {"h": str(self.animations_hashes[:5])}, ) self.file_writer.begin_animation(not self.skip_animations) scene.begin_animations() # Save a static image, to avoid rendering non moving objects. self.save_static_frame_data(scene, scene.static_mobjects) if scene.is_current_animation_frozen_frame(): self.update_frame(scene, mobjects=scene.moving_mobjects) # self.duration stands for the total run time of all the animations. # In this case, as there is only a wait, it will be the length of the wait. self.freeze_current_frame(scene.duration) else: scene.play_internal() self.file_writer.end_animation(not self.skip_animations) self.num_plays += 1 def update_frame( # TODO Description in Docstring self, scene: Scene, mobjects: Iterable[Mobject] | None = None, include_submobjects: bool = True, ignore_skipping: bool = True, **kwargs: Any, ) -> None: """Update the frame. Parameters ---------- scene mobjects list of mobjects include_submobjects ignore_skipping **kwargs """ if self.skip_animations and not ignore_skipping: return if not mobjects: mobjects = list_update( scene.mobjects, scene.foreground_mobjects, ) if self.static_image is not None: self.camera.set_frame_to_background(self.static_image) else: self.camera.reset() kwargs["include_submobjects"] = include_submobjects self.camera.capture_mobjects(mobjects, **kwargs) def render( self, scene: Scene, time: float, moving_mobjects: Iterable[Mobject] | None = None, ) -> None: self.update_frame(scene, moving_mobjects) self.add_frame(self.get_frame()) def get_frame(self) -> PixelArray: """Gets the current frame as NumPy array. Returns ------- PixelArray NumPy array of pixel values of each pixel in screen. The shape of the array is height x width x 3. """ return np.array(self.camera.pixel_array) def add_frame(self, frame: PixelArray, num_frames: int = 1) -> None: """Adds a frame to the video_file_stream Parameters ---------- frame The frame to add, as a pixel array. num_frames The number of times to add frame. """ dt = 1 / self.camera.frame_rate if self.skip_animations: return self.time += num_frames * dt self.file_writer.write_frame(frame, num_frames=num_frames) def freeze_current_frame(self, duration: float) -> None: """Adds a static frame to the movie for a given duration. The static frame is the current frame. Parameters ---------- duration [description] """ dt = 1 / self.camera.frame_rate self.add_frame( self.get_frame(), num_frames=int(duration / dt), ) def show_frame(self, scene: Scene) -> None: """Opens the current frame in the Default Image Viewer of your system. """ self.update_frame(scene, ignore_skipping=True) self.camera.get_image().show() def save_static_frame_data( self, scene: Scene, static_mobjects: Iterable[Mobject], ) -> PixelArray | None: """Compute and save the static frame, that will be reused at each frame to avoid unnecessarily computing static mobjects. Parameters ---------- scene The scene played. static_mobjects Static mobjects of the scene. If None, self.static_image is set to None. Returns ------- PixelArray | None The static image computed. The return value is None if there are no static mobjects in the scene. """ self.static_image = None if not static_mobjects: return None self.update_frame(scene, mobjects=static_mobjects) self.static_image = self.get_frame() return self.static_image def update_skipping_status(self) -> None: """This method is used internally to check if the current animation needs to be skipped or not. It also checks if the number of animations that were played correspond to the number of animations that need to be played, and raises an EndSceneEarlyException if they don't correspond. """ # there is always at least one section -> no out of bounds here if self.file_writer.sections[-1].skip_animations: self.skip_animations = True if config["save_last_frame"]: self.skip_animations = True if ( config.from_animation_number > 0 and self.num_plays < config.from_animation_number ): self.skip_animations = True if ( config.upto_animation_number >= 0 and self.num_plays > config.upto_animation_number ): self.skip_animations = True raise EndSceneEarlyException() def scene_finished(self, scene: Scene) -> None: # If no animations in scene, render an image instead if self.num_plays: self.file_writer.finish() elif config.write_to_movie: config.save_last_frame = True config.write_to_movie = False else: self.static_image = None self.update_frame(scene) if config["save_last_frame"]: self.static_image = None self.update_frame(scene) self.file_writer.save_image(self.camera.get_image()) ManimCommunity-manim-1157b74/manim/renderer/opengl_renderer.py000066400000000000000000001230131515024150700244660ustar00rootroot00000000000000from __future__ import annotations import contextlib import itertools as it import time import typing from functools import cached_property from typing import TYPE_CHECKING, Any, Self import moderngl import numpy as np from moderngl import Framebuffer from PIL import Image from typing_extensions import override from manim import config, logger from manim.mobject.opengl.opengl_mobject import ( OpenGLMobject, OpenGLPoint, ) from manim.mobject.opengl.opengl_vectorized_mobject import OpenGLVMobject from manim.typing import MatrixMN, Point3D from manim.utils.caching import handle_caching_play from manim.utils.color import color_to_rgba from manim.utils.exceptions import EndSceneEarlyException from manim.utils.paths import straight_path from ..constants import * from ..scene.scene_file_writer import SceneFileWriter from ..utils import opengl from ..utils.simple_functions import clip from ..utils.space_ops import ( angle_of_vector, quaternion_from_angle_axis, quaternion_mult, rotation_matrix_transpose, rotation_matrix_transpose_from_quaternion, ) from .shader import Mesh, Shader from .vectorized_mobject_rendering import ( render_opengl_vectorized_mobject_fill, render_opengl_vectorized_mobject_stroke, ) if TYPE_CHECKING: from collections.abc import Iterable from typing import Self from manim.animation.animation import Animation from manim.mobject.mobject import Mobject, _AnimationBuilder from manim.scene.scene import Scene from manim.typing import ( FloatRGBA, PathFuncType, Point3DLike, RGBAPixelArray, Vector3DLike, ) from manim.utils.color.core import ParsableManimColor from manim.utils.opengl import FlattenedMatrix4x4 from .opengl_renderer_window import Window __all__ = ["OpenGLCamera", "OpenGLRenderer"] class OpenGLCamera(OpenGLMobject): """ An OpenGL-based camera for 3D scene rendering. Attributes ---------- frame_shape : tuple[float, float] The width and height of the camera frame. center_point : np.ndarray The center point of the camera in 3D space. euler_angles : np.ndarray The Euler angles (theta, phi, gamma) representing the camera's orientation. focal_distance : float The focal distance of the camera. light_source_position : np.ndarray The position of the light source in 3D space. orthographic : bool Whether the camera uses orthographic projection instead of perspective. minimum_polar_angle : float The minimum polar angle for camera rotation. maximum_polar_angle : float The maximum polar angle for camera rotation. inverse_rotation_matrix : np.ndarray The inverse rotation matrix of the camera. """ def __init__( self, frame_shape: tuple[float, float] | None = None, center_point: Point3DLike | None = None, # Theta, phi, gamma euler_angles: Point3DLike | None = None, focal_distance: float = 2.0, light_source_position: Point3DLike | None = None, orthographic: bool = False, minimum_polar_angle: float = -PI / 2, maximum_polar_angle: float = PI / 2, model_matrix: MatrixMN | None = None, **kwargs: Any, ) -> None: """ Initializes an OpenGLCamera instance. Parameters ---------- frame_shape : tuple[float, float], optional The width and height of the camera frame. If not provided, defaults to the global manim config values `frame_width` and `frame_height`. center_point : Point3DLike, optional The center point of the camera in 3D space. If not provided, defaults to the origin (0, 0, 0). euler_angles : Point3DLike, optional The Euler angles (theta, phi, gamma) representing the camera's orientation. If not provided, defaults to (0, 0, 0) (i.e., no rotation). focal_distance : float, optional The focal distance of the camera. Default is 2.0. light_source_position : Point3DLike, optional The position of the light source in 3D space. If not provided, defaults to (-10, 10, 10). orthographic : bool, optional Whether the camera uses orthographic projection instead of perspective. Default is False (perspective). minimum_polar_angle : float, optional The minimum polar angle in radian for camera rotation. Default is -ฯ€/2, i.e. no restriction. maximum_polar_angle : float, optional The maximum polar angle in radian for camera rotation. Default is ฯ€/2, i.e. no restriction. model_matrix : MatrixMN, optional The initial model matrix [1]_ for the camera. If not provided, defaults to a translation matrix that positions the camera at (0, 0, 11). **kwargs : Any Additional keyword arguments passed to the OpenGLMobject constructor. References ---------- .. [1] Wikipedia, "Camera matrix", https://en.wikipedia.org/wiki/Camera_matrix """ self.use_z_index = True self.frame_rate = 60 self.orthographic = orthographic self.minimum_polar_angle = minimum_polar_angle self.maximum_polar_angle = maximum_polar_angle if self.orthographic: self.projection_matrix = opengl.orthographic_projection_matrix() self.unformatted_projection_matrix = opengl.orthographic_projection_matrix( format_=False, ) else: self.projection_matrix = opengl.perspective_projection_matrix() self.unformatted_projection_matrix = opengl.perspective_projection_matrix( format_=False, ) if frame_shape is None: self.frame_shape = (config["frame_width"], config["frame_height"]) else: self.frame_shape = frame_shape if center_point is None: self.center_point = ORIGIN else: self.center_point = np.asarray(center_point, dtype=float) if model_matrix is None: model_matrix = opengl.translation_matrix(0, 0, 11) self.focal_distance = focal_distance self.light_source_position = np.asarray( light_source_position or [-10, 10, 10], dtype=float ) self.light_source = OpenGLPoint(self.light_source_position) self.default_model_matrix = model_matrix super().__init__(model_matrix=model_matrix, should_render=False, **kwargs) euler_angles = np.asarray(euler_angles or [0, 0, 0], dtype=float) self.euler_angles: Point3D = euler_angles self.refresh_rotation_matrix() def get_position(self) -> Point3D: """Retrieve the camera's position in 3D space.""" return self.model_matrix[:, 3][:3] def set_position(self, position: Point3D) -> Self: """Set the camera's position in 3D space.""" self.model_matrix[:, 3][:3] = position return self @cached_property def formatted_view_matrix(self) -> FlattenedMatrix4x4: """The formatted view matrix for shader input.""" return opengl.matrix_to_shader_input(self.unformatted_view_matrix) @cached_property def unformatted_view_matrix(self) -> MatrixMN: return typing.cast(MatrixMN, np.linalg.inv(self.model_matrix)) def init_points(self) -> None: """Initialize the camera's points based on frame shape and center point.""" self.set_points([ORIGIN, LEFT, RIGHT, DOWN, UP]) self.set_width(self.frame_shape[0], stretch=True) self.set_height(self.frame_shape[1], stretch=True) self.move_to(self.center_point) def to_default_state(self) -> Self: """Reset the camera to its default state (config frame size, centered at origin, no rotation). """ self.center() self.set_height(config["frame_height"]) self.set_width(config["frame_width"]) self.set_euler_angles(0, 0, 0) self.model_matrix = self.default_model_matrix return self def refresh_rotation_matrix(self) -> None: """Refresh the camera's inverse rotation matrix based on its Euler angles.""" # Rotate based on camera orientation theta, phi, gamma = self.euler_angles quat = quaternion_mult( quaternion_from_angle_axis(theta, OUT, axis_normalized=True), quaternion_from_angle_axis(phi, RIGHT, axis_normalized=True), quaternion_from_angle_axis(gamma, OUT, axis_normalized=True), ) self.inverse_rotation_matrix = rotation_matrix_transpose_from_quaternion( np.asarray(quat, dtype=float) ) @override def rotate( self, angle: float, axis: Vector3DLike = OUT, about_point: Point3DLike | None = None, **kwargs: Any, ) -> Self: """ Rotate the camera by a given angle around a specified axis. Parameters ---------- angle : float The angle in radians to rotate the camera. axis : Vector3DLike, optional The axis around which to rotate the camera. Default is OUT (z-axis). about_point : Point3DLike, optional Ignored. For OpenGLCamera, rotation is always about the camera's center. **kwargs : Any Not used for OpenGLCamera. Passing additional keyword arguments has no effect. Returns ------- Self The rotated camera instance. Returned for chaining. """ curr_rot_T = self.inverse_rotation_matrix added_rot_T = rotation_matrix_transpose(angle, axis) new_rot_T = np.dot(curr_rot_T, added_rot_T) Fz = new_rot_T[2] phi = np.arccos(Fz[2]) theta = angle_of_vector(Fz[:2]) + PI / 2 partial_rot_T = np.dot( rotation_matrix_transpose(phi, RIGHT), rotation_matrix_transpose(theta, OUT), ) gamma = angle_of_vector(np.dot(partial_rot_T, new_rot_T.T)[:, 0]) self.set_euler_angles(theta, phi, gamma) return self def set_euler_angles( self, theta: float | None = None, phi: float | None = None, gamma: float | None = None, ) -> Self: """ Set the camera's Euler angles [1]_ (theta, phi, gamma). Parameters ---------- theta : float | None, optional The angle in radians for rotation around the OUT (z) axis. If None, the current theta value is retained. phi : float | None, optional The angle in radians for rotation around the RIGHT (x) axis. If None, the current phi value is retained. gamma : float | None, optional The angle in radians for rotation around the OUT (z) axis. If None, the current gamma value is retained. Returns ------- Self The camera instance with updated Euler angles. Returned for chaining. See Also -------- set_theta : Set the theta Euler angle. set_phi : Set the phi Euler angle. set_gamma : Set the gamma Euler angle. References ---------- .. [1] Wikipedia, "Euler angles", https://en.wikipedia.org/wiki/Euler_angles """ if theta is not None: self.euler_angles[0] = theta if phi is not None: self.euler_angles[1] = phi if gamma is not None: self.euler_angles[2] = gamma self.refresh_rotation_matrix() return self def set_theta(self, theta: float) -> Self: """ Set the camera's theta Euler angle (in radians). See Also -------- set_euler_angles : Set all Euler angles at once. set_phi : Set the phi Euler angle. set_gamma : Set the gamma Euler angle. """ return self.set_euler_angles(theta=theta) def set_phi(self, phi: float) -> Self: """ Set the camera's phi Euler angle (in radians). See Also -------- set_euler_angles : Set all Euler angles at once. set_theta : Set the theta Euler angle. set_gamma : Set the gamma Euler angle. """ return self.set_euler_angles(phi=phi) def set_gamma(self, gamma: float) -> Self: """ Set the camera's gamma Euler angle (in radians). See Also -------- set_euler_angles : Set all Euler angles at once. set_theta : Set the theta Euler angle. set_phi : Set the phi Euler angle. """ return self.set_euler_angles(gamma=gamma) def increment_theta(self, dtheta: float) -> Self: """ Increment the camera's theta Euler angle by a given amount (in radians). See Also -------- set_euler_angles : Set all Euler angles at once. set_theta : Set the theta Euler angle. """ self.euler_angles[0] += dtheta self.refresh_rotation_matrix() return self def increment_phi(self, dphi: float) -> Self: """ Increment the camera's phi Euler angle by a given amount (in radians). See Also -------- set_euler_angles : Set all Euler angles at once. set_phi : Set the phi Euler angle. """ phi = self.euler_angles[1] new_phi = clip(phi + dphi, -PI / 2, PI / 2) self.euler_angles[1] = new_phi self.refresh_rotation_matrix() return self def increment_gamma(self, dgamma: float) -> Self: """ Increment the camera's gamma Euler angle by a given amount (in radians). See Also -------- set_euler_angles : Set all Euler angles at once. set_gamma : Set the gamma Euler angle. """ self.euler_angles[2] += dgamma self.refresh_rotation_matrix() return self def get_shape(self) -> tuple[float, float]: """Retrieve the width and height of the camera frame.""" return (self.get_width(), self.get_height()) def get_center(self) -> Point3D: """ Retrieve the center point of the camera in 3D space. Notes ----- The center point is assumed to be the first point in the camera's points array. """ # Assumes first point is at the center return typing.cast(Point3D, self.points[0]) def get_width(self) -> float: """Retrieve the width of the camera frame.""" points = self.points out = points[2, 0] - points[1, 0] return float(out) def get_height(self) -> float: """Retrieve the height of the camera frame.""" points = self.points out = points[4, 1] - points[3, 1] return float(out) # return points[4, 1] - points[3, 1] def get_focal_distance(self) -> float: """Retrieve the focal distance of the camera.""" return self.focal_distance * self.get_height() @override def interpolate( self, mobject1: OpenGLMobject, mobject2: OpenGLMobject, alpha: float, path_func: PathFuncType = straight_path(), ) -> Self: super().interpolate(mobject1, mobject2, alpha, path_func) self.refresh_rotation_matrix() return self class OpenGLRenderer: """ An OpenGL-based renderer. Attributes ---------- animation_elapsed_time : float The elapsed time of the current animation. animation_start_time : float The start time of the current animation. animations_hashes : list[str | None] List of animation hashes for caching. anti_alias_width : float The width used for anti-aliasing in pixel units. background_color : FloatRGBA The background color of the renderer. camera : OpenGLCamera The camera used for rendering. num_plays : float The number of animation plays executed. path_to_texture_id : dict[str, int] Mapping from texture file paths to OpenGL texture IDs. pressed_keys : set[int] Set of currently pressed key codes. skip_animations : bool Whether animations are currently being skipped. time : float The total elapsed time for the renderer. window : Window | None The window used for previewing, if any. """ def __init__( self, file_writer_class: type[SceneFileWriter] = SceneFileWriter, skip_animations: bool = False, ) -> None: """Initializes the OpenGLRenderer. Parameters ---------- file_writer_class : type[SceneFileWriter], optional The class to use for writing scene files, by default SceneFileWriter. skip_animations : bool, optional Whether to skip animations during rendering, by default False. """ # Measured in pixel widths, used for vector graphics self.anti_alias_width = 1.5 self._file_writer_class = file_writer_class self._original_skipping_status = skip_animations self.skip_animations = skip_animations self.animation_start_time = 0.0 self.animation_elapsed_time = 0.0 self.time = 0.0 self.animations_hashes: list[str | None] = [] self.num_plays = 0 self.camera = OpenGLCamera() self.pressed_keys: set[int] = set() self.window: Window | None = None self.path_to_texture_id: dict[str, int] = {} self.background_color = config["background_color"] def init_scene(self, scene: Scene) -> None: """ Initializes the OpenGL rendering context and related resources for the given scene. Set up: - the file writer - the background color - the OpenGL context - the window (if needed) Parameters ---------- scene : Scene The scene to be rendered """ self.partial_movie_files: list[str | None] = [] self.file_writer: SceneFileWriter = self._file_writer_class( self, scene.__class__.__name__, ) self.scene = scene self.background_color = config["background_color"] if self.should_create_window(): from .opengl_renderer_window import Window self.window = Window(self) self.context = self.window.ctx self.frame_buffer_object = self.context.detect_framebuffer() else: # self.window = None try: self.context = moderngl.create_context(standalone=True) except Exception: self.context = moderngl.create_context( standalone=True, backend="egl", ) self.frame_buffer_object = self.get_frame_buffer_object(self.context, 0) self.frame_buffer_object.use() self.context.enable(moderngl.BLEND) self.context.wireframe = config["enable_wireframe"] self.context.blend_func = ( moderngl.SRC_ALPHA, moderngl.ONE_MINUS_SRC_ALPHA, moderngl.ONE, moderngl.ONE, ) def should_create_window(self) -> bool: """ Determine whether a window should be created for rendering based on the current configuration. Notes ----- A windows is always created if the 'force_window' configuration is enabled. """ if config["force_window"]: logger.warning( "'--force_window' is enabled, this is intended for debugging purposes " "and may impact performance if used when outputting files", ) return True return ( config["preview"] and not config["save_last_frame"] and not config["format"] and not config["write_to_movie"] and not config["dry_run"] ) def get_pixel_shape(self) -> tuple[int, int] | None: """ Retrieve the pixel dimensions of the current frame buffer object (2D). Returns ------- width : int The width of the frame buffer in pixels. height : int The height of the frame buffer in pixels. """ frame_buffer: Framebuffer | None = getattr(self, "frame_buffer_object", None) if frame_buffer is None: return None _, _, pixel_width, pixel_height = frame_buffer.viewport return pixel_width, pixel_height def refresh_perspective_uniforms(self, camera: OpenGLCamera) -> None: """ Update the perspective-related uniform variables used in the OpenGL renderer based on the current camera settings. Parameters ---------- camera : OpenGLCamera The camera object from which to extract perspective and lighting information. Raises ------ ValueError If the renderer's pixel shape is not available. """ pixel_shape = self.get_pixel_shape() if pixel_shape is None: msg = "Pixel shape is None, cannot refresh perspective uniforms." raise ValueError(msg) pixel_width, pixel_height = pixel_shape frame_width, frame_height = camera.get_shape() # TODO, this should probably be a mobject uniform, with # the camera taking care of the conversion factor anti_alias_width = self.anti_alias_width / (pixel_height / frame_height) # Orient light rotation = camera.inverse_rotation_matrix light_pos: Point3D = camera.light_source.get_location() light_pos = np.dot(rotation, light_pos) self.perspective_uniforms = { "frame_shape": camera.get_shape(), "anti_alias_width": anti_alias_width, "camera_center": tuple(camera.get_center()), "camera_rotation": tuple(np.array(rotation).T.flatten()), "light_source_position": tuple(light_pos), "focal_distance": camera.get_focal_distance(), } def render_mobject(self, mobject: OpenGLMobject | OpenGLVMobject) -> None: """ Render an OpenGL mobject (either OpenGLMobject or OpenGLVMobject) using the appropriate shaders and rendering pipeline. Parameters ---------- mobject : OpenGLMobject | OpenGLVMobject The mobject to render. Must be an instance of OpenGLMobject or OpenGLVMobject. Raises ------ TypeError If a shader texture is not a moderngl.Uniform or moderngl.UniformBlock. """ if isinstance(mobject, OpenGLVMobject): if config["use_projection_fill_shaders"]: render_opengl_vectorized_mobject_fill(self, mobject) if config["use_projection_stroke_shaders"]: render_opengl_vectorized_mobject_stroke(self, mobject) shader_wrapper_list = mobject.get_shader_wrapper_list() # Convert ShaderWrappers to Meshes. for shader_wrapper in shader_wrapper_list: folder = shader_wrapper.shader_folder shader = Shader( context=self.context, name=str(folder) if folder is not None else None ) # Set textures. for name, path in shader_wrapper.texture_paths.items(): tid = self.get_texture_id(str(path)) shader_texture = shader.shader_program[name] if not isinstance( shader_texture, (moderngl.Uniform, moderngl.UniformBlock) ): msg = ( f"Shader texture must be a uniform, got {type(shader_texture)}" ) raise TypeError(msg) shader_texture.value = tid # Set uniforms. for name, value in it.chain( shader_wrapper.uniforms.items(), self.perspective_uniforms.items(), ): with contextlib.suppress(KeyError): shader.set_uniform(name, value) try: # TODO: make the type of 'camera' generic in the 'Scene' class # to avoid the cast here cam = typing.cast("OpenGLCamera", self.scene.camera) shader.set_uniform("u_view_matrix", cam.formatted_view_matrix) shader.set_uniform("u_projection_matrix", cam.projection_matrix) except KeyError: pass # Set depth test. if shader_wrapper.depth_test: self.context.enable(moderngl.DEPTH_TEST) else: self.context.disable(moderngl.DEPTH_TEST) # Render. vert_indices = shader_wrapper.vert_indices mesh = Mesh( shader, shader_wrapper.vert_data, indices=np.asarray(vert_indices) if vert_indices is not None else None, use_depth_test=shader_wrapper.depth_test, primitive=mobject.render_primitive, ) mesh.set_uniforms(self) mesh.render() def get_texture_id(self, path: str) -> int: """ Retrieves the OpenGL texture ID associated with the given image file path. Automatically creates a new texture it it has not been loaded before. Parameters ---------- path : str The file path to the texture image. Returns ------- int The OpenGL texture ID corresponding to the given path. """ return ( self.path_to_texture_id[path] if path in self.path_to_texture_id else self._create_texture(path) ) def _create_texture(self, image_path: str) -> int: """ Create an OpenGL texture from the given image file path, get its texture ID, and store it in `self.path_to_texture_id[image_path]`. Parameters ---------- image_path : str The file path to the image to be loaded as a texture. Returns ------- int The texture ID assigned to the newly created texture. """ with Image.open(image_path) as img: tid = len(self.path_to_texture_id) # grayscale image if img.mode == "L": components = 1 swizzle = "RRR1" else: # convert everything to RGBA for consistency img = img.convert("RGBA") components = 4 swizzle = "RGBA" texture = self.context.texture( size=img.size, components=components, data=img.tobytes(), ) texture.repeat_x = False texture.repeat_y = False texture.filter = (moderngl.NEAREST, moderngl.NEAREST) texture.swizzle = swizzle texture.use(location=tid) self.path_to_texture_id[image_path] = tid return tid def update_skipping_status(self) -> None: """ Check and update the skipping status for the current animation (self.skip_animations flag) based on the configuration settings. Parameters ---------- None Raises ------ EndSceneEarlyException If the number of played animations exceeds the configured upper bound. """ # there is always at least one section -> no out of bounds here if self.file_writer.sections[-1].skip_animations: self.skip_animations = True if ( config.from_animation_number > 0 and self.num_plays < config.from_animation_number ): self.skip_animations = True if ( config.upto_animation_number >= 0 and self.num_plays > config.upto_animation_number ): self.skip_animations = True raise EndSceneEarlyException() @handle_caching_play def play( self, scene: Scene, *animations: Animation | Mobject | _AnimationBuilder, **kwargs: Any, ) -> None: """ Plays the given animations or mobjects in the specified scene. "Playing" here refers to the process of compiling animation data, beginning the animations, updating frames, and finalizing the animation in the context of the renderer. Parameters ---------- scene Scene The scene in which to play the animations. *animations Animation | Mobject | _AnimationBuilder The animations, mobjects, or animation builders to play. **kwargs Any Additional keyword arguments to pass to the animation compilation. """ # TODO: Handle data locking / unlocking. self.animation_start_time = time.time() self.file_writer.begin_animation(not self.skip_animations) scene.compile_animation_data(*animations, **kwargs) scene.begin_animations() if scene.is_current_animation_frozen_frame(): self.update_frame(scene) if not self.skip_animations: self.file_writer.write_frame( self, num_frames=int(config.frame_rate * scene.duration) ) if self.window is not None: self.window.swap_buffers() while time.time() - self.animation_start_time < scene.duration: pass self.animation_elapsed_time = scene.duration else: scene.play_internal() self.file_writer.end_animation(not self.skip_animations) self.time += scene.duration self.num_plays += 1 def clear_screen(self) -> None: """ Clears the current frame buffer and updates the display window accordingly. The screen is cleared using the background color specified in the renderer. """ self.frame_buffer_object.clear(*self.background_color) if self.window is None: return self.window.swap_buffers() def render( self, scene: Scene, frame_offset: float, moving_mobjects: list[Mobject] ) -> None: """ Renders a single frame of the given scene using OpenGL. Parameters ---------- scene : Scene The scene to render. frame_offset : float The time offset for the current frame in seconds. If no window is present, this parameter is ignored, and a frame is a true snapshot of the scene at the current time. moving_mobjects : list[Mobject] List of mobjects that are currently moving and need to be updated. Not used at all, kept for compatibility with other renderers. Notes ----- - Updates the frame for the scene. - If animations are skipped, the method returns early. - Writes the current frame using the file writer. - If a window is present, swaps buffers and continues updating frames until the animation elapsed time reaches the frame offset. """ self.update_frame(scene) if self.skip_animations: return self.file_writer.write_frame(self) if self.window is not None: self.window.swap_buffers() while self.animation_elapsed_time < frame_offset: self.update_frame(scene) self.window.swap_buffers() def update_frame(self, scene: Scene) -> None: """ Update and render the current frame for the given scene. Performs the following steps: 1. Clear the frame buffer with the background color. 2. Refresh camera perspective uniforms for rendering. 3. Iterate through all mobjects in the scene, rendering those marked for display. 4. Iterate through all mesh objects in the scene, setting their uniforms and rendering them. 5. Update the elapsed animation time. Parameters ---------- scene : Scene The scene to render the frame for. """ self.frame_buffer_object.clear(*self.background_color) # TODO: make the type of 'camera' generic in the 'Scene' class # to avoid the cast here cam = typing.cast("OpenGLCamera", scene.camera) self.refresh_perspective_uniforms(cam) for mobject in scene.mobjects: if not mobject.should_render: continue # TODO: make the type of 'mobject' generic in the 'Scene' class # to avoid the cast here mobj = typing.cast("OpenGLMobject | OpenGLVMobject", mobject) self.render_mobject(mobj) for obj in scene.meshes: for mesh in obj.get_meshes(): mesh.set_uniforms(self) mesh.render() self.animation_elapsed_time = time.time() - self.animation_start_time def scene_finished(self, scene: Scene) -> None: """ Handle the finalization process after a scene has finished rendering. Performs the following actions: - If any plays (animations) have occurred, finalizes the file writing process. - If no plays have occurred but movie writing is enabled, disables movie writing to avoid creating an empty movie file. - If the configuration requires saving the last frame, updates and saves the final image of the scene. Parameters ---------- scene : Scene The scene that has finished rendering. """ # When num_plays is 0, no images have been output, so output a single # image in this case if self.num_plays > 0: self.file_writer.finish() elif self.num_plays == 0 and config.write_to_movie: config.write_to_movie = False if self.should_save_last_frame(): config.save_last_frame = True self.update_frame(scene) self.file_writer.save_image(self.get_image()) def should_save_last_frame(self) -> bool: """ Determine whether the last frame of the scene should be saved, i.e. if one of the following conditions is met: - The configuration option 'save_last_frame' is enabled. - The scene is not in interactive mode. - This is the first play (i.e., num_plays == 0). """ if config["save_last_frame"]: return True if self.scene.interactive_mode: return False return self.num_plays == 0 def get_image(self) -> Image.Image: """ Get the current OpenGL frame buffer as a PIL Image. Returns ------- Image.Image The image representation of the current frame buffer. Raises ------ ValueError If the pixel shape cannot be determined. Notes ----- The image is constructed from raw RGBA buffer data, with the origin at the bottom-left. """ raw_buffer_data = self.get_raw_frame_buffer_object_data() pixel_shape = self.get_pixel_shape() if pixel_shape is None: msg = "Pixel shape is None, cannot get image." raise ValueError(msg) image = Image.frombytes( "RGBA", # mode (rgb, a for alpha (transparency))) pixel_shape, # size raw_buffer_data, # data "raw", # decoder_name # *args for the decoder "RGBA", # raw mode 0, # stride (O = no extra padding) -1, # orientation (-1 = bottom to top, 1 = top to bottom) ) return image def save_static_frame_data( self, scene: Scene, static_mobjects: Iterable[Mobject] ) -> None: pass def get_frame_buffer_object( self, context: moderngl.Context, samples: int = 0 ) -> Framebuffer: """ Creates and returns a framebuffer object configured with color and depth attachments. Parameters ---------- context : moderngl.Context The ModernGL context used to create the framebuffer and its attachments. samples : int, optional The number of samples for multisample anti-aliasing (MSAA)[1]_. Default is 0 (no MSAA). Returns ------- Framebuffer A framebuffer object with a color texture attachment and a depth renderbuffer attachment, both sized according to the current configuration's pixel width and height. Notes ----- Framebuffer's color attachment is supposed RGBA. Pixel dimensions are taken from the global config of Manim. References ---------- .. [1] Wikipedia, "Multisample anti-aliasing", https://en.wikipedia.org/wiki/Multisample_anti-aliasing """ pixel_width = config["pixel_width"] pixel_height = config["pixel_height"] num_channels = 4 return context.framebuffer( color_attachments=context.texture( (pixel_width, pixel_height), components=num_channels, samples=samples, ), depth_attachment=context.depth_renderbuffer( (pixel_width, pixel_height), samples=samples, ), ) def get_raw_frame_buffer_object_data(self, dtype: str = "f1") -> bytes: """ Get the raw data from the current frame buffer object as bytes. This method reads the pixel data from the frame buffer object using the specified data type. The data is read with 4 color channels (typically RGBA). Args: dtype (str, optional): The data type to use when reading the buffer. Defaults to "f1" (i.e., float with 1 byte). Returns: bytes: The raw pixel data from the frame buffer object. """ # Copy blocks from the fbo_msaa to the drawn fbo using Blit # pw, ph = self.get_pixel_shape() # gl.glBindFramebuffer(gl.GL_READ_FRAMEBUFFER, self.fbo_msaa.glo) # gl.glBindFramebuffer(gl.GL_DRAW_FRAMEBUFFER, self.fbo.glo) # gl.glBlitFramebuffer( # 0, 0, pw, ph, 0, 0, pw, ph, gl.GL_COLOR_BUFFER_BIT, gl.GL_LINEAR # ) num_channels = 4 ret: bytes = self.frame_buffer_object.read( viewport=self.frame_buffer_object.viewport, components=num_channels, dtype=dtype, ) return ret def get_frame(self) -> RGBAPixelArray: """ Get the current frame buffer as a Numpy array of RGBA pixel values. Returns ------- RGBAPixelArray A Numpy array of shape (height, width, 4) containing the RGBA pixel data of the current frame, with dtype uint8. Raises ------ ValueError If the pixel shape cannot be determined. """ # get current pixel values as numpy data in order to test output raw = self.get_raw_frame_buffer_object_data(dtype="f1") pixel_shape = self.get_pixel_shape() if pixel_shape is None: msg = "Pixel shape is None, cannot get frame." raise ValueError(msg) result_dimensions = (pixel_shape[1], pixel_shape[0], 4) np_buf = np.frombuffer(raw, dtype="uint8").reshape(result_dimensions) np_buf = np.flipud(np_buf) return np_buf # Returns offset from the bottom left corner in pixels. # top_left flag should be set to True when using a GUI framework # where the (0,0) is at the top left: e.g. PySide6 def pixel_coords_to_space_coords( self, px: float, py: float, relative: bool = False, top_left: bool = False ) -> Point3D: """ Converts pixel coordinates to space (scene) coordinates. top_left flag should be set to True when using a GUI framework where the (0,0) is at the top left: e.g. PySide6. Parameters ---------- px : float The x-coordinate in pixel space. py : float The y-coordinate in pixel space. relative : bool, optional If True, returns coordinates relative to the frame (normalized to [-1, 1]). If False, returns absolute space coordinates. Default is False. top_left : bool, optional If True, treats the origin (0, 0) as the top-left corner of the pixel space. If False, treats the origin as the bottom-left. Default is False. Returns ------- Point3D The corresponding coordinates in space as a NumPy array of shape (3,). Notes ----- If the pixel shape is not available, returns the origin [0, 0, 0]. """ pixel_shape = self.get_pixel_shape() if pixel_shape is None: return typing.cast(Point3D, np.array([0.0, 0.0, 0.0])) pixel_width, pixel_height = pixel_shape frame_height = config["frame_height"] frame_center = self.camera.get_center() if relative: # relative -> just normalize to [-1, 1] return 2 * np.array([px / pixel_width, py / pixel_height, 0]) scale = frame_height / pixel_height y_direction = -1 if top_left else 1 return typing.cast( Point3D, frame_center + scale * np.array( [(px - pixel_width / 2), y_direction * (py - pixel_height / 2), 0.0] ), ) @property def background_color(self) -> FloatRGBA: """The background color of the renderer (RGBA format).""" return self._background_color @background_color.setter def background_color(self, value: ParsableManimColor) -> None: self._background_color = color_to_rgba(value, 1.0) ManimCommunity-manim-1157b74/manim/renderer/opengl_renderer_window.py000066400000000000000000000136571515024150700260710ustar00rootroot00000000000000from __future__ import annotations from typing import TYPE_CHECKING, Any import moderngl_window as mglw from moderngl_window.context.pyglet.window import Window as PygletWindow from moderngl_window.timers.clock import Timer from screeninfo import Monitor, get_monitors from .. import __version__, config if TYPE_CHECKING: from .opengl_renderer import OpenGLRenderer __all__ = ["Window"] class Window(PygletWindow): fullscreen = False resizable = True gl_version = (3, 3) vsync = True cursor = True def __init__( self, renderer: OpenGLRenderer, window_size: str | tuple[int, ...] = config.window_size, **kwargs: Any, ) -> None: monitors = get_monitors() mon_index = config.window_monitor monitor = monitors[min(mon_index, len(monitors) - 1)] invalid_window_size_error_message = ( "window_size must be specified either as 'default', a string of the form " "'width,height', or a tuple of 2 ints of the form (width, height)." ) if isinstance(window_size, tuple): if len(window_size) != 2: raise ValueError(invalid_window_size_error_message) size = window_size elif window_size == "default": # make window_width half the width of the monitor # but make it full screen if --fullscreen window_width = monitor.width if not config.fullscreen: window_width //= 2 # by default window_height = 9/16 * window_width window_height = int( window_width * config.frame_height // config.frame_width, ) size = (window_width, window_height) elif len(window_size.split(",")) == 2: (window_width, window_height) = tuple(map(int, window_size.split(","))) size = (window_width, window_height) else: raise ValueError(invalid_window_size_error_message) super().__init__(size=size) self.title = f"Manim Community {__version__}" self.size = size self.renderer = renderer mglw.activate_context(window=self) self.timer = Timer() self.config = mglw.WindowConfig(ctx=self.ctx, wnd=self, timer=self.timer) self.timer.start() self.swap_buffers() initial_position = self.find_initial_position(size, monitor) self.position = initial_position # Delegate event handling to scene. def on_mouse_motion(self, x: int, y: int, dx: int, dy: int) -> None: super().on_mouse_motion(x, y, dx, dy) point = self.renderer.pixel_coords_to_space_coords(x, y) d_point = self.renderer.pixel_coords_to_space_coords(dx, dy, relative=True) self.renderer.scene.on_mouse_motion(point, d_point) def on_mouse_scroll(self, x: int, y: int, x_offset: float, y_offset: float) -> None: super().on_mouse_scroll(x, y, x_offset, y_offset) point = self.renderer.pixel_coords_to_space_coords(x, y) offset = self.renderer.pixel_coords_to_space_coords( x_offset, y_offset, relative=True, ) self.renderer.scene.on_mouse_scroll(point, offset) def on_key_press(self, symbol: int, modifiers: int) -> bool: self.renderer.pressed_keys.add(symbol) event_handled: bool = super().on_key_press(symbol, modifiers) self.renderer.scene.on_key_press(symbol, modifiers) return event_handled def on_key_release(self, symbol: int, modifiers: int) -> None: if symbol in self.renderer.pressed_keys: self.renderer.pressed_keys.remove(symbol) super().on_key_release(symbol, modifiers) self.renderer.scene.on_key_release(symbol, modifiers) def on_mouse_drag( self, x: int, y: int, dx: int, dy: int, buttons: int, modifiers: int ) -> None: super().on_mouse_drag(x, y, dx, dy, buttons, modifiers) point = self.renderer.pixel_coords_to_space_coords(x, y) d_point = self.renderer.pixel_coords_to_space_coords(dx, dy, relative=True) self.renderer.scene.on_mouse_drag(point, d_point, buttons, modifiers) def find_initial_position( self, size: tuple[int, int], monitor: Monitor ) -> tuple[int, int]: custom_position = config.window_position window_width, window_height = size # Position might be specified with a string of the form x,y for integers x and y if len(custom_position) == 1: raise ValueError( "window_position must specify both Y and X positions (Y/X -> UR). Also accepts LEFT/RIGHT/ORIGIN/UP/DOWN.", ) # in the form Y/X (UR) if custom_position in ["LEFT", "RIGHT"]: custom_position = "O" + custom_position[0] elif custom_position in ["UP", "DOWN"]: custom_position = custom_position[0] + "O" elif custom_position == "ORIGIN": custom_position = "O" * 2 elif "," in custom_position: pos_y, pos_x = tuple(map(int, custom_position.split(","))) return (pos_x, pos_y) # Alternatively, it might be specified with a string like # UR, OO, DL, etc. specifying what corner it should go to char_to_n = {"L": 0, "U": 0, "O": 1, "R": 2, "D": 2} width_diff: int = monitor.width - window_width height_diff: int = monitor.height - window_height return ( monitor.x + char_to_n[custom_position[1]] * width_diff // 2, -monitor.y + char_to_n[custom_position[0]] * height_diff // 2, ) def on_mouse_press(self, x: int, y: int, button: int, modifiers: int) -> None: super().on_mouse_press(x, y, button, modifiers) point = self.renderer.pixel_coords_to_space_coords(x, y) mouse_button_map = { 1: "LEFT", 2: "MOUSE", 4: "RIGHT", } self.renderer.scene.on_mouse_press(point, mouse_button_map[button], modifiers) ManimCommunity-manim-1157b74/manim/renderer/shader.py000066400000000000000000000412571515024150700225730ustar00rootroot00000000000000from __future__ import annotations import contextlib import inspect import re import textwrap from collections.abc import Callable, Iterator, Sequence from pathlib import Path from typing import TYPE_CHECKING, Any, Self, TypeAlias import moderngl import numpy as np import numpy.typing as npt if TYPE_CHECKING: from manim.renderer.opengl_renderer import OpenGLRenderer MeshTimeBasedUpdater: TypeAlias = Callable[["Object3D", float], None] MeshNonTimeBasedUpdater: TypeAlias = Callable[["Object3D"], None] MeshUpdater: TypeAlias = MeshNonTimeBasedUpdater | MeshTimeBasedUpdater from manim.typing import MatrixMN, Point3D from .. import config from ..utils import opengl SHADER_FOLDER = Path(__file__).parent / "shaders" shader_program_cache: dict[str, moderngl.Program] = {} file_path_to_code_map: dict[Path, str] = {} __all__ = [ "Object3D", "Mesh", "Shader", "FullScreenQuad", ] def get_shader_code_from_file(file_path: Path) -> str: if file_path in file_path_to_code_map: return file_path_to_code_map[file_path] source = file_path.read_text() include_lines = re.finditer( r"^#include (?P.*\.glsl)$", source, flags=re.MULTILINE, ) for match in include_lines: include_path = match.group("include_path") included_code = get_shader_code_from_file( file_path.parent / include_path, ) source = source.replace(match.group(0), included_code) file_path_to_code_map[file_path] = source return source def filter_attributes( unfiltered_attributes: npt.NDArray, attributes: Sequence[str] ) -> npt.NDArray: # Construct attributes for only those needed by the shader. filtered_attributes_dtype = [] for i, dtype_name in enumerate(unfiltered_attributes.dtype.names): if dtype_name in attributes: filtered_attributes_dtype.append( ( dtype_name, unfiltered_attributes.dtype[i].subdtype[0].str, unfiltered_attributes.dtype[i].shape, ), ) filtered_attributes = np.zeros( unfiltered_attributes[unfiltered_attributes.dtype.names[0]].shape[0], dtype=filtered_attributes_dtype, ) for dtype_name in unfiltered_attributes.dtype.names: if dtype_name in attributes: filtered_attributes[dtype_name] = unfiltered_attributes[dtype_name] return filtered_attributes class Object3D: def __init__(self, *children: Object3D): self.model_matrix = np.eye(4) self.normal_matrix = np.eye(4) self.children: list[Object3D] = [] self.parent: Object3D | None = None self.add(*children) self.init_updaters() # TODO: Use path_func. def interpolate(self, start: Object3D, end: Object3D, alpha: float, _: Any) -> None: self.model_matrix = (1 - alpha) * start.model_matrix + alpha * end.model_matrix self.normal_matrix = ( 1 - alpha ) * start.normal_matrix + alpha * end.normal_matrix def single_copy(self) -> Object3D: copy = Object3D() copy.model_matrix = self.model_matrix.copy() copy.normal_matrix = self.normal_matrix.copy() return copy def copy(self) -> Object3D: node_to_copy = {} bfs = [self] while bfs: node = bfs.pop(0) bfs.extend(node.children) node_copy = node.single_copy() node_to_copy[node] = node_copy # Add the copy to the copy of the parent. if node.parent is not None and node is not self: node_to_copy[node.parent].add(node_copy) return node_to_copy[self] def add(self, *children: Object3D) -> None: for child in children: if child.parent is not None: raise Exception( "Attempt to add child that's already added to another Object3D", ) self.remove(*children, current_children_only=False) self.children.extend(children) for child in children: child.parent = self def remove(self, *children: Object3D, current_children_only: bool = True) -> None: if current_children_only: for child in children: if child.parent != self: raise Exception( "Attempt to remove child that isn't added to this Object3D", ) self.children = list(filter(lambda child: child not in children, self.children)) for child in children: child.parent = None def get_position(self) -> Point3D: return self.model_matrix[:, 3][:3] def set_position(self, position: Point3D) -> Self: self.model_matrix[:, 3][:3] = position return self def get_meshes(self) -> Iterator[Mesh]: dfs = [self] while dfs: parent = dfs.pop() if isinstance(parent, Mesh): yield parent dfs.extend(parent.children) def get_family(self) -> Iterator[Object3D]: dfs = [self] while dfs: parent = dfs.pop() yield parent dfs.extend(parent.children) def align_data_and_family(self, _: Any) -> None: pass def hierarchical_model_matrix(self) -> MatrixMN: if self.parent is None: return self.model_matrix model_matrices = [self.model_matrix] current_object = self while current_object.parent is not None: model_matrices.append(current_object.parent.model_matrix) current_object = current_object.parent return np.linalg.multi_dot(list(reversed(model_matrices))) def hierarchical_normal_matrix(self) -> MatrixMN: if self.parent is None: return self.normal_matrix[:3, :3] normal_matrices = [self.normal_matrix] current_object = self while current_object.parent is not None: normal_matrices.append(current_object.parent.model_matrix) current_object = current_object.parent return np.linalg.multi_dot(list(reversed(normal_matrices)))[:3, :3] def init_updaters(self) -> None: self.time_based_updaters: list[MeshTimeBasedUpdater] = [] self.non_time_updaters: list[MeshNonTimeBasedUpdater] = [] self.has_updaters = False self.updating_suspended = False def update(self, dt: float = 0) -> Self: if not self.has_updaters or self.updating_suspended: return self for time_based_updater in self.time_based_updaters: time_based_updater(self, dt) for non_time_based_updater in self.non_time_updaters: non_time_based_updater(self) return self def get_time_based_updaters(self) -> list[MeshTimeBasedUpdater]: return self.time_based_updaters def has_time_based_updater(self) -> bool: return len(self.time_based_updaters) > 0 def get_updaters(self) -> list[MeshUpdater]: return self.time_based_updaters + self.non_time_updaters def add_updater( self, update_function: MeshUpdater, index: int | None = None, call_updater: bool = True, ) -> Self: if "dt" in inspect.signature(update_function).parameters: self._add_time_based_updater(update_function, index) # type: ignore[arg-type] else: self._add_non_time_updater(update_function, index) # type: ignore[arg-type] self.refresh_has_updater_status() if call_updater: self.update() return self def _add_time_based_updater( self, update_function: MeshTimeBasedUpdater, index: int | None = None ) -> None: if index is None: self.time_based_updaters.append(update_function) else: self.time_based_updaters.insert(index, update_function) def _add_non_time_updater( self, update_function: MeshNonTimeBasedUpdater, index: int | None = None ) -> None: if index is None: self.non_time_updaters.append(update_function) else: self.non_time_updaters.insert(index, update_function) def remove_updater(self, update_function: MeshUpdater) -> Self: while update_function in self.time_based_updaters: self.time_based_updaters.remove(update_function) # type: ignore[arg-type] while update_function in self.non_time_updaters: self.non_time_updaters.remove(update_function) # type: ignore[arg-type] self.refresh_has_updater_status() return self def clear_updaters(self) -> Self: self.time_based_updaters = [] self.non_time_updaters = [] self.refresh_has_updater_status() return self def match_updaters(self, mesh: Object3D) -> Self: self.clear_updaters() for updater in mesh.get_updaters(): self.add_updater(updater) return self def suspend_updating(self) -> Self: self.updating_suspended = True return self def resume_updating(self, call_updater: bool = True) -> Self: self.updating_suspended = False if call_updater: self.update(dt=0) return self def refresh_has_updater_status(self) -> Self: self.has_updaters = len(self.get_updaters()) > 0 return self class Mesh(Object3D): def __init__( self, shader: Shader | None = None, attributes: npt.NDArray | None = None, geometry: Mesh | None = None, material: Shader | None = None, indices: npt.NDArray | None = None, use_depth_test: bool = True, primitive: int = moderngl.TRIANGLES, ): super().__init__() if shader is not None and attributes is not None: self.shader: Shader = shader self.attributes = attributes self.indices = indices elif geometry is not None and material is not None: self.shader = material self.attributes = geometry.attributes self.indices = geometry.indices else: raise Exception( "Mesh requires either attributes and a Shader or a Geometry and a " "Material", ) self.use_depth_test = use_depth_test self.primitive = primitive self.skip_render: bool = False self.init_updaters() def single_copy(self) -> Mesh: copy = Mesh( attributes=self.attributes.copy(), shader=self.shader, indices=self.indices.copy() if self.indices is not None else None, use_depth_test=self.use_depth_test, primitive=self.primitive, ) copy.skip_render = self.skip_render copy.model_matrix = self.model_matrix.copy() copy.normal_matrix = self.normal_matrix.copy() # TODO: Copy updaters? return copy def set_uniforms(self, renderer: OpenGLRenderer) -> None: self.shader.set_uniform( "u_model_matrix", opengl.matrix_to_shader_input(self.model_matrix), ) self.shader.set_uniform("u_view_matrix", renderer.camera.formatted_view_matrix) self.shader.set_uniform( "u_projection_matrix", renderer.camera.projection_matrix, ) def render(self) -> None: if self.skip_render: return if self.use_depth_test: self.shader.context.enable(moderngl.DEPTH_TEST) else: self.shader.context.disable(moderngl.DEPTH_TEST) shader_attribute_names: list[str] = [] for member_name, member in self.shader.shader_program._members.items(): if isinstance(member, moderngl.Attribute): shader_attribute_names.append(member_name) filtered_shader_attributes = filter_attributes( self.attributes, shader_attribute_names ) vertex_buffer_object = self.shader.context.buffer( filtered_shader_attributes.tobytes() ) if self.indices is None: index_buffer_object = None else: vert_index_data = self.indices.astype("i4").tobytes() if vert_index_data: index_buffer_object = self.shader.context.buffer(vert_index_data) else: index_buffer_object = None vertex_array_object = self.shader.context.simple_vertex_array( self.shader.shader_program, vertex_buffer_object, *filtered_shader_attributes.dtype.names, index_buffer=index_buffer_object, ) vertex_array_object.render(self.primitive) vertex_buffer_object.release() vertex_array_object.release() if index_buffer_object is not None: index_buffer_object.release() class Shader: def __init__( self, context: moderngl.Context, name: str | None = None, source: dict[str, Any] | None = None, ): global shader_program_cache self.context = context self.name = name self.source = source # See if the program is cached. if ( self.name in shader_program_cache and shader_program_cache[self.name].ctx == self.context ): self.shader_program = shader_program_cache[self.name] elif self.source is not None: # Generate the shader from inline code if it was passed. self.shader_program = context.program(**self.source) elif self.name is not None: # Search for a file containing the shader. source_dict = {} source_dict_key = { "vert": "vertex_shader", "frag": "fragment_shader", "geom": "geometry_shader", } shader_folder = SHADER_FOLDER / self.name for shader_file in shader_folder.iterdir(): shader_file_path = shader_folder / shader_file shader_source = get_shader_code_from_file(shader_file_path) source_dict[source_dict_key[shader_file_path.stem]] = shader_source self.shader_program = context.program(**source_dict) else: raise Exception("Must either pass shader name or shader source.") # Cache the shader. if self.name is not None and self.name not in shader_program_cache: shader_program_cache[self.name] = self.shader_program def set_uniform(self, name: str, value: Any) -> None: with contextlib.suppress(KeyError): self.shader_program[name] = value class FullScreenQuad(Mesh): def __init__( self, context: moderngl.Context, fragment_shader_source: str | None = None, fragment_shader_name: str | None = None, ): if fragment_shader_source is None and fragment_shader_name is None: raise Exception("Must either pass shader name or shader source.") if fragment_shader_name is not None: # Use the name. shader_file_path = SHADER_FOLDER / f"{fragment_shader_name}.frag" fragment_shader_source = get_shader_code_from_file(shader_file_path) elif fragment_shader_source is not None: fragment_shader_source = textwrap.dedent(fragment_shader_source.lstrip()) shader = Shader( context, source={ "vertex_shader": """ #version 330 in vec4 in_vert; uniform mat4 u_model_view_matrix; uniform mat4 u_projection_matrix; void main() {{ vec4 camera_space_vertex = u_model_view_matrix * in_vert; vec4 clip_space_vertex = u_projection_matrix * camera_space_vertex; gl_Position = clip_space_vertex; }} """, "fragment_shader": fragment_shader_source, }, ) attributes = np.zeros(6, dtype=[("in_vert", np.float32, (4,))]) attributes["in_vert"] = np.array( [ [-config["frame_x_radius"], -config["frame_y_radius"], 0, 1], [-config["frame_x_radius"], config["frame_y_radius"], 0, 1], [config["frame_x_radius"], config["frame_y_radius"], 0, 1], [-config["frame_x_radius"], -config["frame_y_radius"], 0, 1], [config["frame_x_radius"], -config["frame_y_radius"], 0, 1], [config["frame_x_radius"], config["frame_y_radius"], 0, 1], ], ) shader.set_uniform("u_model_view_matrix", opengl.view_matrix()) shader.set_uniform( "u_projection_matrix", opengl.orthographic_projection_matrix(), ) super().__init__(shader, attributes) def render(self) -> None: super().render() ManimCommunity-manim-1157b74/manim/renderer/shader_wrapper.py000066400000000000000000000147611515024150700243330ustar00rootroot00000000000000from __future__ import annotations import copy import logging import re from collections.abc import Mapping, Sequence from pathlib import Path from typing import TYPE_CHECKING, Self, TypeAlias import moderngl import numpy as np import numpy.typing as npt if TYPE_CHECKING: from manim.typing import FloatRGBLike_Array # Mobjects that should be rendered with # the same shader will be organized and # clumped together based on keeping track # of a dict holding all the relevant information # to that shader __all__ = ["ShaderWrapper"] logger = logging.getLogger("manim") def get_shader_dir(): return Path(__file__).parent / "shaders" def find_file(file_name: Path, directories: list[Path]) -> Path: # Check if what was passed in is already a valid path to a file if file_name.exists(): return file_name possible_paths = (directory / file_name for directory in directories) for path in possible_paths: if path.exists(): return path else: logger.debug(f"{path} does not exist.") raise OSError(f"{file_name} not Found") _ShaderDType: TypeAlias = np.void _ShaderData: TypeAlias = npt.NDArray[_ShaderDType] class ShaderWrapper: def __init__( self, vert_data: _ShaderData = None, vert_indices: Sequence[int] | None = None, shader_folder: Path | str | None = None, # A dictionary mapping names of uniform variables uniforms: dict[str, float | tuple[float, ...]] | None = None, # A dictionary mapping names to filepaths for textures. texture_paths: Mapping[str, Path | str] | None = None, depth_test: bool = False, render_primitive: int | str = moderngl.TRIANGLE_STRIP, ): self.vert_data: _ShaderData = vert_data self.vert_indices: Sequence[int] | None = vert_indices self.vert_attributes: tuple[str, ...] | None = vert_data.dtype.names self.shader_folder: Path = Path(shader_folder or "") self.uniforms: dict[str, float | tuple[float, ...]] = uniforms or {} self.texture_paths: Mapping[str, str | Path] = texture_paths or {} self.depth_test: bool = depth_test self.render_primitive: str = str(render_primitive) self.init_program_code() self.refresh_id() def copy(self): result = copy.copy(self) result.vert_data = np.array(self.vert_data) if result.vert_indices is not None: result.vert_indices = np.array(self.vert_indices) if self.uniforms: result.uniforms = dict(self.uniforms) if self.texture_paths: result.texture_paths = dict(self.texture_paths) return result def is_valid(self) -> bool: return all( [ self.vert_data is not None, self.program_code["vertex_shader"] is not None, self.program_code["fragment_shader"] is not None, ], ) def get_id(self) -> str: return self.id def get_program_id(self) -> int: return self.program_id def create_id(self): # A unique id for a shader return "|".join( map( str, [ self.program_id, self.uniforms, self.texture_paths, self.depth_test, self.render_primitive, ], ), ) def refresh_id(self) -> None: self.program_id: int = self.create_program_id() self.id: str = self.create_id() def create_program_id(self): return hash( "".join( self.program_code[f"{name}_shader"] or "" for name in ("vertex", "geometry", "fragment") ), ) def init_program_code(self): def get_code(name: str) -> str | None: return get_shader_code_from_file( self.shader_folder / f"{name}.glsl", ) self.program_code: dict[str, str | None] = { "vertex_shader": get_code("vert"), "geometry_shader": get_code("geom"), "fragment_shader": get_code("frag"), } def get_program_code(self): return self.program_code def replace_code(self, old: str, new: str) -> None: code_map = self.program_code for name, code in code_map.items(): if code: code_map[name] = re.sub(old, new, code) self.refresh_id() def combine_with(self, *shader_wrappers: "ShaderWrapper") -> Self: # noqa: UP037 # Assume they are of the same type if len(shader_wrappers) == 0: return self if self.vert_indices is not None: num_verts = len(self.vert_data) indices_list = [self.vert_indices] data_list = [self.vert_data] for sw in shader_wrappers: indices_list.append(sw.vert_indices + num_verts) data_list.append(sw.vert_data) num_verts += len(sw.vert_data) self.vert_indices = np.hstack(indices_list) self.vert_data = np.hstack(data_list) else: self.vert_data = np.hstack( [self.vert_data, *(sw.vert_data for sw in shader_wrappers)], ) return self # For caching filename_to_code_map: dict = {} def get_shader_code_from_file(filename: Path) -> str | None: if filename in filename_to_code_map: return filename_to_code_map[filename] try: filepath = find_file( filename, directories=[get_shader_dir(), Path("/")], ) except OSError: return None result = filepath.read_text() # To share functionality between shaders, some functions are read in # from other files an inserted into the relevant strings before # passing to ctx.program for compiling # Replace "#INSERT " lines with relevant code insertions = re.findall( r"^#include ../include/.*\.glsl$", result, flags=re.MULTILINE, ) for line in insertions: inserted_code = get_shader_code_from_file( Path() / "include" / line.replace("#include ../include/", ""), ) if inserted_code is None: return None result = result.replace(line, inserted_code) filename_to_code_map[filename] = result return result def get_colormap_code(rgb_list: FloatRGBLike_Array) -> str: data = ",".join("vec3({}, {}, {})".format(*rgb) for rgb in rgb_list) return f"vec3[{len(rgb_list)}]({data})" ManimCommunity-manim-1157b74/manim/renderer/shaders/000077500000000000000000000000001515024150700223735ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/default/000077500000000000000000000000001515024150700240175ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/default/frag.glsl000066400000000000000000000001421515024150700256160ustar00rootroot00000000000000#version 330 uniform vec4 u_color; out vec4 frag_color; void main() { frag_color = u_color; } ManimCommunity-manim-1157b74/manim/renderer/shaders/default/vert.glsl000066400000000000000000000003501515024150700256600ustar00rootroot00000000000000#version 330 in vec3 in_vert; uniform mat4 u_model_matrix; uniform mat4 u_view_matrix; uniform mat4 u_projection_matrix; void main() { gl_Position = u_projection_matrix * u_view_matrix * u_model_matrix * vec4(in_vert, 1.0); } ManimCommunity-manim-1157b74/manim/renderer/shaders/design.frag000066400000000000000000000003301515024150700245010ustar00rootroot00000000000000#version 330 out vec4 frag_color; void main() { vec2 st = gl_FragCoord.xy / vec2(854, 360); vec3 color = vec3(0.0); st *= 3.0; st = fract(st); color = vec3(st, 0.0); frag_color = vec4(color, 1.0); } ManimCommunity-manim-1157b74/manim/renderer/shaders/design_2.frag000066400000000000000000000017011515024150700247250ustar00rootroot00000000000000#version 330 uniform vec2 u_resolution; out vec4 frag_color; #define PI 3.14159265358979323846 vec2 rotate2D(vec2 _st, float _angle){ _st -= 0.5; _st = mat2(cos(_angle),-sin(_angle), sin(_angle),cos(_angle)) * _st; _st += 0.5; return _st; } vec2 tile(vec2 _st, float _zoom){ _st *= _zoom; return fract(_st); } float box(vec2 _st, vec2 _size, float _smoothEdges){ _size = vec2(0.5)-_size*0.5; vec2 aa = vec2(_smoothEdges*0.5); vec2 uv = smoothstep(_size,_size+aa,_st); uv *= smoothstep(_size,_size+aa,vec2(1.0)-_st); return uv.x*uv.y; } void main(void){ vec2 st = gl_FragCoord.xy/u_resolution.xy; vec3 color = vec3(0.0); // Divide the space in 4 st = tile(st,4.); // Use a matrix to rotate the space 45 degrees st = rotate2D(st,PI*0.25); // Draw a square color = vec3(box(st,vec2(0.7),0.01)); // color = vec3(st,0.0); frag_color = vec4(color,1.0); } ManimCommunity-manim-1157b74/manim/renderer/shaders/design_3.frag000066400000000000000000000024251515024150700247320ustar00rootroot00000000000000#version 330 uniform vec3 u_resolution; uniform float u_time; out vec4 frag_color; vec3 palette(float d){ return mix(vec3(0.2,0.7,0.9),vec3(1.,0.,1.),d); } vec2 rotate(vec2 p,float a){ float c = cos(a); float s = sin(a); return p*mat2(c,s,-s,c); } float map(vec3 p){ for( int i = 0; i<8; ++i){ float t = u_time*0.1; p.xz =rotate(p.xz,t); p.xy =rotate(p.xy,t*1.89); p.xz = abs(p.xz); p.xz-=.5; } return dot(sign(p),p)/5.; } vec4 rm (vec3 ro, vec3 rd){ float t = 0.; vec3 col = vec3(0.); float d; for(float i =0.; i<64.; i++){ vec3 p = ro + rd*t; d = map(p)*.5; if(d<0.02){ break; } if(d>100.){ break; } //col+=vec3(0.6,0.8,0.8)/(400.*(d)); col+=palette(length(p)*.1)/(400.*(d)); t+=d; } return vec4(col,1./(d*100.)); } void main(void){ vec2 uv = (gl_FragCoord.xy-(u_resolution.xy/2.))/u_resolution.x; vec3 ro = vec3(0.,0.,-50.); ro.xz = rotate(ro.xz,u_time); vec3 cf = normalize(-ro); vec3 cs = normalize(cross(cf,vec3(0.,1.,0.))); vec3 cu = normalize(cross(cf,cs)); vec3 uuv = ro+cf*3. + uv.x*cs + uv.y*cu; vec3 rd = normalize(uuv-ro); vec4 col = rm(ro,rd); frag_color = vec4(col.xyz, 1); } ManimCommunity-manim-1157b74/manim/renderer/shaders/image/000077500000000000000000000000001515024150700234555ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/image/frag.glsl000066400000000000000000000003101515024150700252510ustar00rootroot00000000000000#version 330 uniform sampler2D Texture; in vec2 v_im_coords; in float v_opacity; out vec4 frag_color; void main() { frag_color = texture(Texture, v_im_coords); frag_color.a = v_opacity; } ManimCommunity-manim-1157b74/manim/renderer/shaders/image/vert.glsl000066400000000000000000000007131515024150700253210ustar00rootroot00000000000000#version 330 #include ../include/camera_uniform_declarations.glsl uniform sampler2D Texture; in vec3 point; in vec2 im_coords; in float opacity; out vec2 v_im_coords; out float v_opacity; // Analog of import for manim only #include ../include/get_gl_Position.glsl #include ../include/position_point_into_frame.glsl void main(){ v_im_coords = im_coords; v_opacity = opacity; gl_Position = get_gl_Position(position_point_into_frame(point)); } ManimCommunity-manim-1157b74/manim/renderer/shaders/include/000077500000000000000000000000001515024150700240165ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/include/NOTE.md000066400000000000000000000011061515024150700251030ustar00rootroot00000000000000There seems to be no analog to #include in C++ for OpenGL shaders. While there are other options for sharing code between shaders, a lot of them aren't great, especially if the goal is to have all the logic for which specific bits of code to share handled in the shader file itself. So the way manim currently works is to replace any line which looks like #INSERT with the code from one of the files in this folder. The functions in this file often include reference to uniforms which are assumed to be part of the surrounding context into which they are inserted. ManimCommunity-manim-1157b74/manim/renderer/shaders/include/add_light.glsl000066400000000000000000000031001515024150700266120ustar00rootroot00000000000000///// INSERT COLOR_MAP FUNCTION HERE ///// vec4 add_light(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, float gloss, float shadow){ ///// INSERT COLOR FUNCTION HERE ///// // The line above may be replaced by arbitrary code snippets, as per // the method Mobject.set_color_by_code if(gloss == 0.0 && shadow == 0.0) return color; // TODO, do we actually want this? It effectively treats surfaces as two-sided if(unit_normal.z < 0){ unit_normal *= -1; } // TODO, read this in as a uniform? float camera_distance = 6; // Assume everything has already been rotated such that camera is in the z-direction vec3 to_camera = vec3(0, 0, camera_distance) - point; vec3 to_light = light_coords - point; vec3 light_reflection = -to_light + 2 * unit_normal * dot(to_light, unit_normal); float dot_prod = dot(normalize(light_reflection), normalize(to_camera)); float shine = gloss * exp(-3 * pow(1 - dot_prod, 2)); float dp2 = dot(normalize(to_light), unit_normal); float darkening = mix(1, max(dp2, 0), shadow); return vec4( darkening * mix(color.rgb, vec3(1.0), shine), color.a ); } vec4 finalize_color(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, float gloss, float shadow){ // Put insertion here instead return add_light(color, point, unit_normal, light_coords, gloss, shadow); } ManimCommunity-manim-1157b74/manim/renderer/shaders/include/camera_uniform_declarations.glsl000066400000000000000000000003761515024150700324260ustar00rootroot00000000000000uniform vec2 frame_shape; uniform float anti_alias_width; uniform vec3 camera_center; uniform mat3 camera_rotation; uniform float is_fixed_in_frame; uniform float is_fixed_orientation; uniform vec3 fixed_orientation_center; uniform float focal_distance; ManimCommunity-manim-1157b74/manim/renderer/shaders/include/finalize_color.glsl000066400000000000000000000035101515024150700276770ustar00rootroot00000000000000vec3 float_to_color(float value, float min_val, float max_val, vec3[9] colormap_data){ float alpha = clamp((value - min_val) / (max_val - min_val), 0.0, 1.0); int disc_alpha = min(int(alpha * 8), 7); return mix( colormap_data[disc_alpha], colormap_data[disc_alpha + 1], 8.0 * alpha - disc_alpha ); } vec4 add_light(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, float gloss, float shadow){ if(gloss == 0.0 && shadow == 0.0) return color; // TODO, do we actually want this? It effectively treats surfaces as two-sided if(unit_normal.z < 0){ unit_normal *= -1; } // TODO, read this in as a uniform? float camera_distance = 6; // Assume everything has already been rotated such that camera is in the z-direction vec3 to_camera = vec3(0, 0, camera_distance) - point; vec3 to_light = light_coords - point; vec3 light_reflection = -to_light + 2 * unit_normal * dot(to_light, unit_normal); float dot_prod = dot(normalize(light_reflection), normalize(to_camera)); float shine = gloss * exp(-3 * pow(1 - dot_prod, 2)); float dp2 = dot(normalize(to_light), unit_normal); float darkening = mix(1, max(dp2, 0), shadow); return vec4( darkening * mix(color.rgb, vec3(1.0), shine), color.a ); } vec4 finalize_color(vec4 color, vec3 point, vec3 unit_normal, vec3 light_coords, float gloss, float shadow){ ///// INSERT COLOR FUNCTION HERE ///// // The line above may be replaced by arbitrary code snippets, as per // the method Mobject.set_color_by_code return add_light(color, point, unit_normal, light_coords, gloss, shadow); } ManimCommunity-manim-1157b74/manim/renderer/shaders/include/get_gl_Position.glsl000066400000000000000000000023351515024150700300310ustar00rootroot00000000000000// Assumes the following uniforms exist in the surrounding context: // uniform vec2 frame_shape; // uniform float focal_distance; // uniform float is_fixed_in_frame; // uniform float is_fixed_orientation; // uniform vec3 fixed_orientation_center; const vec2 DEFAULT_FRAME_SHAPE = vec2(8.0 * 16.0 / 9.0, 8.0); float perspective_scale_factor(float z, float focal_distance){ return max(0.0, focal_distance / (focal_distance - z)); } vec4 get_gl_Position(vec3 point){ vec4 result = vec4(point, 1.0); if(!bool(is_fixed_in_frame)){ result.x *= 2.0 / frame_shape.x; result.y *= 2.0 / frame_shape.y; float psf = perspective_scale_factor(result.z, focal_distance); if (psf > 0){ result.xy *= psf; // TODO, what's the better way to do this? // This is to keep vertices too far out of frame from getting cut. result.z *= 0.01; } } else{ if (!bool(is_fixed_orientation)){ result.x *= 2.0 / DEFAULT_FRAME_SHAPE.x; result.y *= 2.0 / DEFAULT_FRAME_SHAPE.y; } else{ result.x *= 2.0 / frame_shape.x; result.y *= 2.0 / frame_shape.y; } } result.z *= -1; return result; } get_rotated_surface_unit_normal_vector.glsl000066400000000000000000000010471515024150700346260ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/include// Assumes the following uniforms exist in the surrounding context: // uniform vec3 camera_center; // uniform mat3 camera_rotation; vec3 get_rotated_surface_unit_normal_vector(vec3 point, vec3 du_point, vec3 dv_point){ vec3 cp = cross( (du_point - point), (dv_point - point) ); if(length(cp) == 0){ // Instead choose a normal to just dv_point - point in the direction of point vec3 v2 = dv_point - point; cp = cross(cross(v2, point), v2); } return normalize(rotate_point_into_frame(cp)); } ManimCommunity-manim-1157b74/manim/renderer/shaders/include/get_unit_normal.glsl000066400000000000000000000014051515024150700300670ustar00rootroot00000000000000vec3 get_unit_normal(in vec3[3] points){ float tol = 1e-6; vec3 v1 = normalize(points[1] - points[0]); vec3 v2 = normalize(points[2] - points[0]); vec3 cp = cross(v1, v2); float cp_norm = length(cp); if(cp_norm < tol){ // Three points form a line, so find a normal vector // to that line in the plane shared with the z-axis vec3 k_hat = vec3(0.0, 0.0, 1.0); vec3 new_cp = cross(cross(v2, k_hat), v2); float new_cp_norm = length(new_cp); if(new_cp_norm < tol){ // We only come here if all three points line up // on the z-axis. return vec3(0.0, -1.0, 0.0); // return k_hat; } return new_cp / new_cp_norm; } return cp / cp_norm; } ManimCommunity-manim-1157b74/manim/renderer/shaders/include/position_point_into_frame.glsl000066400000000000000000000013461515024150700321650ustar00rootroot00000000000000// Assumes the following uniforms exist in the surrounding context: // uniform float is_fixed_in_frame; // uniform float is_fixed_orientation; // uniform vec3 fixed_orientation_center; // uniform vec3 camera_center; // uniform mat3 camera_rotation; vec3 rotate_point_into_frame(vec3 point){ if(bool(is_fixed_in_frame)){ return point; } return camera_rotation * point; } vec3 position_point_into_frame(vec3 point){ if(bool(is_fixed_in_frame)){ return point; } if(bool(is_fixed_orientation)){ vec3 new_center = rotate_point_into_frame(fixed_orientation_center); return point + (new_center - fixed_orientation_center); } return rotate_point_into_frame(point - camera_center); } ManimCommunity-manim-1157b74/manim/renderer/shaders/include/quadratic_bezier_distance.glsl000066400000000000000000000054451515024150700321000ustar00rootroot00000000000000// Must be inserted in a context with a definition for modify_distance_for_endpoints // All of this is with respect to a curve that's been rotated/scaled // so that b0 = (0, 0) and b1 = (1, 0). That is, b2 entirely // determines the shape of the curve vec2 bezier(float t, vec2 b2){ // Quick returns for the 0 and 1 cases if (t == 0) return vec2(0, 0); else if (t == 1) return b2; // Everything else return vec2( 2 * t * (1 - t) + b2.x * t*t, b2.y * t * t ); } float cube_root(float x){ return sign(x) * pow(abs(x), 1.0 / 3.0); } int cubic_solve(float a, float b, float c, float d, out float roots[3]){ // Normalize so a = 1 b = b / a; c = c / a; d = d / a; float p = c - b*b / 3.0; float q = b * (2.0*b*b - 9.0*c) / 27.0 + d; float p3 = p*p*p; float disc = q*q + 4.0*p3 / 27.0; float offset = -b / 3.0; if(disc >= 0.0){ float z = sqrt(disc); float u = (-q + z) / 2.0; float v = (-q - z) / 2.0; u = cube_root(u); v = cube_root(v); roots[0] = offset + u + v; return 1; } float u = sqrt(-p / 3.0); float v = acos(-sqrt( -27.0 / p3) * q / 2.0) / 3.0; float m = cos(v); float n = sin(v) * 1.732050808; float all_roots[3] = float[3]( offset + u * (n - m), offset - u * (n + m), offset + u * (m + m) ); // Only accept roots with a positive derivative int n_valid_roots = 0; for(int i = 0; i < 3; i++){ float r = all_roots[i]; if(3*r*r + 2*b*r + c > 0){ roots[n_valid_roots] = r; n_valid_roots++; } } return n_valid_roots; } float dist_to_line(vec2 p, vec2 b2){ float t = clamp(p.x / b2.x, 0, 1); float dist; if(t == 0) dist = length(p); else if(t == 1) dist = distance(p, b2); else dist = abs(p.y); return modify_distance_for_endpoints(p, dist, t); } float dist_to_point_on_curve(vec2 p, float t, vec2 b2){ t = clamp(t, 0, 1); return modify_distance_for_endpoints( p, length(p - bezier(t, b2)), t ); } float min_dist_to_curve(vec2 p, vec2 b2, float degree){ // Check if curve is really a a line if(degree == 1) return dist_to_line(p, b2); // Try finding the exact sdf by solving the equation // (d/dt) dist^2(t) = 0, which amount to the following // cubic. float xm2 = uv_b2.x - 2.0; float y = uv_b2.y; float a = xm2*xm2 + y*y; float b = 3 * xm2; float c = -(p.x*xm2 + p.y*y) + 2; float d = -p.x; float roots[3]; int n = cubic_solve(a, b, c, d, roots); // At most 2 roots will have been populated. float d0 = dist_to_point_on_curve(p, roots[0], b2); if(n == 1) return d0; float d1 = dist_to_point_on_curve(p, roots[1], b2); return min(d0, d1); } ManimCommunity-manim-1157b74/manim/renderer/shaders/include/quadratic_bezier_geometry_functions.glsl000066400000000000000000000052731515024150700342300ustar00rootroot00000000000000float cross2d(vec2 v, vec2 w){ return v.x * w.y - w.x * v.y; } mat3 get_xy_to_uv(vec2 b0, vec2 b1){ mat3 shift = mat3( 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, -b0.x, -b0.y, 1.0 ); float sf = length(b1 - b0); vec2 I = (b1 - b0) / sf; vec2 J = vec2(-I.y, I.x); mat3 rotate = mat3( I.x, J.x, 0.0, I.y, J.y, 0.0, 0.0, 0.0, 1.0 ); return (1 / sf) * rotate * shift; } // Orthogonal matrix to convert to a uv space defined so that // b0 goes to [0, 0] and b1 goes to [1, 0] mat4 get_xyz_to_uv(vec3 b0, vec3 b1, vec3 unit_normal){ mat4 shift = mat4( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -b0.x, -b0.y, -b0.z, 1 ); float scale_factor = length(b1 - b0); vec3 I = (b1 - b0) / scale_factor; vec3 K = unit_normal; vec3 J = cross(K, I); // Transpose (hence inverse) of matrix taking // i-hat to I, k-hat to unit_normal, and j-hat to their cross mat4 rotate = mat4( I.x, J.x, K.x, 0.0, I.y, J.y, K.y, 0.0, I.z, J.z, K.z, 0.0, 0.0, 0.0, 0.0, 1.0 ); return (1 / scale_factor) * rotate * shift; } // Returns 0 for null curve, 1 for linear, 2 for quadratic. // Populates new_points with bezier control points for the curve, // which for quadratics will be the same, but for linear and null // might change. The idea is to inform the caller of the degree, // while also passing tangency information in the linear case. // float get_reduced_control_points(vec3 b0, vec3 b1, vec3 b2, out vec3 new_points[3]){ float get_reduced_control_points(in vec3 points[3], out vec3 new_points[3]){ float length_threshold = 1e-6; float angle_threshold = 5e-2; vec3 p0 = points[0]; vec3 p1 = points[1]; vec3 p2 = points[2]; vec3 v01 = (p1 - p0); vec3 v12 = (p2 - p1); float dot_prod = clamp(dot(normalize(v01), normalize(v12)), -1, 1); bool aligned = acos(dot_prod) < angle_threshold; bool distinct_01 = length(v01) > length_threshold; // v01 is considered nonzero bool distinct_12 = length(v12) > length_threshold; // v12 is considered nonzero int n_uniques = int(distinct_01) + int(distinct_12); bool quadratic = (n_uniques == 2) && !aligned; bool linear = (n_uniques == 1) || ((n_uniques == 2) && aligned); bool constant = (n_uniques == 0); if(quadratic){ new_points[0] = p0; new_points[1] = p1; new_points[2] = p2; return 2.0; }else if(linear){ new_points[0] = p0; new_points[1] = (p0 + p2) / 2.0; new_points[2] = p2; return 1.0; }else{ new_points[0] = p0; new_points[1] = p0; new_points[2] = p0; return 0.0; } } ManimCommunity-manim-1157b74/manim/renderer/shaders/manim_coords/000077500000000000000000000000001515024150700250455ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/manim_coords/frag.glsl000066400000000000000000000001421515024150700266440ustar00rootroot00000000000000#version 330 uniform vec4 u_color; out vec4 frag_color; void main() { frag_color = u_color; } ManimCommunity-manim-1157b74/manim/renderer/shaders/manim_coords/vert.glsl000066400000000000000000000004371515024150700267140ustar00rootroot00000000000000#version 330 in vec4 in_vert; uniform mat4 u_model_view_matrix; uniform mat4 u_projection_matrix; void main() { vec4 camera_space_vertex = u_model_view_matrix * in_vert; vec4 clip_space_vertex = u_projection_matrix * camera_space_vertex; gl_Position = clip_space_vertex; } ManimCommunity-manim-1157b74/manim/renderer/shaders/quadratic_bezier_fill/000077500000000000000000000000001515024150700267165ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/quadratic_bezier_fill/frag.glsl000066400000000000000000000034541515024150700305260ustar00rootroot00000000000000#version 330 #include ../include/camera_uniform_declarations.glsl in vec4 color; in float fill_all; // Either 0 or 1e in float uv_anti_alias_width; in vec3 xyz_coords; in float orientation; in vec2 uv_coords; in vec2 uv_b2; in float bezier_degree; out vec4 frag_color; // Needed for quadratic_bezier_distance insertion below float modify_distance_for_endpoints(vec2 p, float dist, float t){ return dist; } #include ../include/quadratic_bezier_distance.glsl float sdf(){ if(bezier_degree < 2){ return abs(uv_coords[1]); } float u2 = uv_b2.x; float v2 = uv_b2.y; // For really flat curves, just take the distance to x-axis if(abs(v2 / u2) < 0.1 * uv_anti_alias_width){ return abs(uv_coords[1]); } // For flat-ish curves, take the curve else if(abs(v2 / u2) < 0.5 * uv_anti_alias_width){ return min_dist_to_curve(uv_coords, uv_b2, bezier_degree); } // I know, I don't love this amount of arbitrary-seeming branching either, // but a number of strange dimples and bugs pop up otherwise. // This converts uv_coords to yet another space where the bezier points sit on // (0, 0), (1/2, 0) and (1, 1), so that the curve can be expressed implicityly // as y = x^2. mat2 to_simple_space = mat2( v2, 0, 2 - u2, 4 * v2 ); vec2 p = to_simple_space * uv_coords; // Sign takes care of whether we should be filling the inside or outside of curve. float sgn = orientation * sign(v2); float Fp = (p.x * p.x - p.y); if(sgn * Fp < 0){ return 0.0; }else{ return min_dist_to_curve(uv_coords, uv_b2, bezier_degree); } } void main() { if (color.a == 0) discard; frag_color = color; if (fill_all == 1.0) return; frag_color.a *= smoothstep(1, 0, sdf() / uv_anti_alias_width); } ManimCommunity-manim-1157b74/manim/renderer/shaders/quadratic_bezier_fill/geom.glsl000066400000000000000000000067301515024150700305360ustar00rootroot00000000000000#version 330 layout (triangles) in; layout (triangle_strip, max_vertices = 5) out; uniform float anti_alias_width; // Needed for get_gl_Position uniform vec2 frame_shape; uniform float focal_distance; uniform float is_fixed_in_frame; uniform float is_fixed_orientation; uniform vec3 fixed_orientation_center; // Needed for finalize_color uniform vec3 light_source_position; uniform float gloss; uniform float shadow; in vec3 bp[3]; in vec3 v_global_unit_normal[3]; in vec4 v_color[3]; in float v_vert_index[3]; out vec4 color; out float fill_all; out float uv_anti_alias_width; out vec3 xyz_coords; out float orientation; // uv space is where b0 = (0, 0), b1 = (1, 0), and transform is orthogonal out vec2 uv_coords; out vec2 uv_b2; out float bezier_degree; // Analog of import for manim only #include ../include/quadratic_bezier_geometry_functions.glsl #include ../include/get_gl_Position.glsl #include ../include/get_unit_normal.glsl #include ../include/finalize_color.glsl void emit_vertex_wrapper(vec3 point, int index){ color = finalize_color( v_color[index], point, v_global_unit_normal[index], light_source_position, gloss, shadow ); xyz_coords = point; gl_Position = get_gl_Position(xyz_coords); EmitVertex(); } void emit_simple_triangle(){ for(int i = 0; i < 3; i++){ emit_vertex_wrapper(bp[i], i); } EndPrimitive(); } void emit_pentagon(vec3[3] points, vec3 normal){ vec3 p0 = points[0]; vec3 p1 = points[1]; vec3 p2 = points[2]; // Tangent vectors vec3 t01 = normalize(p1 - p0); vec3 t12 = normalize(p2 - p1); // Vectors perpendicular to the curve in the plane of the curve pointing outside the curve vec3 p0_perp = cross(t01, normal); vec3 p2_perp = cross(t12, normal); bool fill_inside = orientation > 0; float aaw = anti_alias_width; vec3 corners[5]; if(fill_inside){ // Note, straight lines will also fall into this case, and since p0_perp and p2_perp // will point to the right of the curve, it's just what we want corners = vec3[5]( p0 + aaw * p0_perp, p0, p1 + 0.5 * aaw * (p0_perp + p2_perp), p2, p2 + aaw * p2_perp ); }else{ corners = vec3[5]( p0, p0 - aaw * p0_perp, p1, p2 - aaw * p2_perp, p2 ); } mat4 xyz_to_uv = get_xyz_to_uv(p0, p1, normal); uv_b2 = (xyz_to_uv * vec4(p2, 1)).xy; uv_anti_alias_width = anti_alias_width / length(p1 - p0); for(int i = 0; i < 5; i++){ vec3 corner = corners[i]; uv_coords = (xyz_to_uv * vec4(corner, 1)).xy; int j = int(sign(i - 1) + 1); // Maps i = [0, 1, 2, 3, 4] onto j = [0, 0, 1, 2, 2] emit_vertex_wrapper(corner, j); } EndPrimitive(); } void main(){ // If vert indices are sequential, don't fill all fill_all = float( (v_vert_index[1] - v_vert_index[0]) != 1.0 || (v_vert_index[2] - v_vert_index[1]) != 1.0 ); if(fill_all == 1.0){ emit_simple_triangle(); return; } vec3 new_bp[3]; bezier_degree = get_reduced_control_points(vec3[3](bp[0], bp[1], bp[2]), new_bp); vec3 local_unit_normal = get_unit_normal(new_bp); orientation = sign(dot(v_global_unit_normal[0], local_unit_normal)); if(bezier_degree >= 1){ emit_pentagon(new_bp, local_unit_normal); } // Don't emit any vertices for bezier_degree 0 } ManimCommunity-manim-1157b74/manim/renderer/shaders/quadratic_bezier_fill/vert.glsl000066400000000000000000000010131515024150700305540ustar00rootroot00000000000000#version 330 #include ../include/camera_uniform_declarations.glsl in vec3 point; in vec3 unit_normal; in vec4 color; in float vert_index; out vec3 bp; // Bezier control point out vec3 v_global_unit_normal; out vec4 v_color; out float v_vert_index; // Analog of import for manim only #include ../include/position_point_into_frame.glsl void main(){ bp = position_point_into_frame(point.xyz); v_global_unit_normal = rotate_point_into_frame(unit_normal.xyz); v_color = color; v_vert_index = vert_index; } ManimCommunity-manim-1157b74/manim/renderer/shaders/quadratic_bezier_stroke/000077500000000000000000000000001515024150700272775ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/quadratic_bezier_stroke/frag.glsl000066400000000000000000000051731515024150700311070ustar00rootroot00000000000000#version 330 #include ../include/camera_uniform_declarations.glsl in vec2 uv_coords; in vec2 uv_b2; in float uv_stroke_width; in vec4 color; in float uv_anti_alias_width; in float has_prev; in float has_next; in float bevel_start; in float bevel_end; in float angle_from_prev; in float angle_to_next; in float bezier_degree; out vec4 frag_color; float cross2d(vec2 v, vec2 w){ return v.x * w.y - w.x * v.y; } float modify_distance_for_endpoints(vec2 p, float dist, float t){ float buff = 0.5 * uv_stroke_width - uv_anti_alias_width; // Check the beginning of the curve if(t == 0){ // Clip the start if(has_prev == 0) return max(dist, -p.x + buff); // Bevel start if(bevel_start == 1){ float a = angle_from_prev; mat2 rot = mat2( cos(a), sin(a), -sin(a), cos(a) ); // Dist for intersection of two lines float bevel_d = max(abs(p.y), abs((rot * p).y)); // Dist for union of this intersection with the real curve // intersected with radius 2 away from curve to smooth out // really sharp corners return max(min(dist, bevel_d), dist / 2); } // Otherwise, start will be rounded off }else if(t == 1){ // Check the end of the curve // TODO, too much code repetition vec2 v21 = (bezier_degree == 2) ? vec2(1, 0) - uv_b2 : vec2(-1, 0); float len_v21 = length(v21); if(len_v21 == 0){ v21 = -uv_b2; len_v21 = length(v21); } float perp_dist = dot(p - uv_b2, v21) / len_v21; if(has_next == 0) return max(dist, -perp_dist + buff); // Bevel end if(bevel_end == 1){ float a = -angle_to_next; mat2 rot = mat2( cos(a), sin(a), -sin(a), cos(a) ); vec2 v21_unit = v21 / length(v21); float bevel_d = max( abs(cross2d(p - uv_b2, v21_unit)), abs(cross2d((rot * (p - uv_b2)), v21_unit)) ); return max(min(dist, bevel_d), dist / 2); } // Otherwise, end will be rounded off } return dist; } #include ../include/quadratic_bezier_distance.glsl void main() { if (uv_stroke_width == 0) discard; float dist_to_curve = min_dist_to_curve(uv_coords, uv_b2, bezier_degree); // An sdf for the region around the curve we wish to color. float signed_dist = abs(dist_to_curve) - 0.5 * uv_stroke_width; frag_color = color; frag_color.a *= smoothstep(0.5, -0.5, signed_dist / uv_anti_alias_width); } ManimCommunity-manim-1157b74/manim/renderer/shaders/quadratic_bezier_stroke/geom.glsl000066400000000000000000000215431515024150700311160ustar00rootroot00000000000000#version 330 layout (triangles) in; layout (triangle_strip, max_vertices = 5) out; // Needed for get_gl_Position uniform vec2 frame_shape; uniform float focal_distance; uniform float is_fixed_in_frame; uniform float is_fixed_orientation; uniform vec3 fixed_orientation_center; uniform float anti_alias_width; uniform float flat_stroke; //Needed for lighting uniform vec3 light_source_position; uniform float joint_type; uniform float gloss; uniform float shadow; in vec3 bp[3]; in vec3 prev_bp[3]; in vec3 next_bp[3]; in vec3 v_global_unit_normal[3]; in vec4 v_color[3]; in float v_stroke_width[3]; out vec4 color; out float uv_stroke_width; out float uv_anti_alias_width; out float has_prev; out float has_next; out float bevel_start; out float bevel_end; out float angle_from_prev; out float angle_to_next; out float bezier_degree; out vec2 uv_coords; out vec2 uv_b2; // Codes for joint types const float AUTO_JOINT = 0; const float ROUND_JOINT = 1; const float BEVEL_JOINT = 2; const float MITER_JOINT = 3; const float PI = 3.141592653; #include ../include/quadratic_bezier_geometry_functions.glsl #include ../include/get_gl_Position.glsl #include ../include/get_unit_normal.glsl #include ../include/finalize_color.glsl void flatten_points(in vec3[3] points, out vec2[3] flat_points){ for(int i = 0; i < 3; i++){ float sf = perspective_scale_factor(points[i].z, focal_distance); flat_points[i] = sf * points[i].xy; } } float angle_between_vectors(vec2 v1, vec2 v2){ float v1_norm = length(v1); float v2_norm = length(v2); if(v1_norm == 0 || v2_norm == 0) return 0.0; float dp = dot(v1, v2) / (v1_norm * v2_norm); float angle = acos(clamp(dp, -1.0, 1.0)); float sn = sign(cross2d(v1, v2)); return sn * angle; } bool find_intersection(vec2 p0, vec2 v0, vec2 p1, vec2 v1, out vec2 intersection){ // Find the intersection of a line passing through // p0 in the direction v0 and one passing through p1 in // the direction p1. // That is, find a solutoin to p0 + v0 * t = p1 + v1 * s float det = -v0.x * v1.y + v1.x * v0.y; if(det == 0) return false; float t = cross2d(p0 - p1, v1) / det; intersection = p0 + v0 * t; return true; } void create_joint(float angle, vec2 unit_tan, float buff, vec2 static_c0, out vec2 changing_c0, vec2 static_c1, out vec2 changing_c1){ float shift; if(abs(angle) < 1e-3){ // No joint shift = 0; }else if(joint_type == MITER_JOINT){ shift = buff * (-1.0 - cos(angle)) / sin(angle); }else{ // For a Bevel joint shift = buff * (1.0 - cos(angle)) / sin(angle); } changing_c0 = static_c0 - shift * unit_tan; changing_c1 = static_c1 + shift * unit_tan; } // This function is responsible for finding the corners of // a bounding region around the bezier curve, which can be // emitted as a triangle fan int get_corners(vec2 controls[3], int degree, float stroke_widths[3], out vec2 corners[5]){ vec2 p0 = controls[0]; vec2 p1 = controls[1]; vec2 p2 = controls[2]; // Unit vectors for directions between control points vec2 v10 = normalize(p0 - p1); vec2 v12 = normalize(p2 - p1); vec2 v01 = -v10; vec2 v21 = -v12; vec2 p0_perp = vec2(-v01.y, v01.x); // Pointing to the left of the curve from p0 vec2 p2_perp = vec2(-v12.y, v12.x); // Pointing to the left of the curve from p2 // aaw is the added width given around the polygon for antialiasing. // In case the normal is faced away from (0, 0, 1), the vector to the // camera, this is scaled up. float aaw = anti_alias_width; float buff0 = 0.5 * stroke_widths[0] + aaw; float buff2 = 0.5 * stroke_widths[2] + aaw; float aaw0 = (1 - has_prev) * aaw; float aaw2 = (1 - has_next) * aaw; vec2 c0 = p0 - buff0 * p0_perp + aaw0 * v10; vec2 c1 = p0 + buff0 * p0_perp + aaw0 * v10; vec2 c2 = p2 + buff2 * p2_perp + aaw2 * v12; vec2 c3 = p2 - buff2 * p2_perp + aaw2 * v12; // Account for previous and next control points if(has_prev > 0) create_joint(angle_from_prev, v01, buff0, c0, c0, c1, c1); if(has_next > 0) create_joint(angle_to_next, v21, buff2, c3, c3, c2, c2); // Linear case is the simplest if(degree == 1){ // The order of corners should be for a triangle_strip. Last entry is a dummy corners = vec2[5](c0, c1, c3, c2, vec2(0.0)); return 4; } // Otherwise, form a pentagon around the curve float orientation = sign(cross2d(v01, v12)); // Positive for ccw curves if(orientation > 0) corners = vec2[5](c0, c1, p1, c2, c3); else corners = vec2[5](c1, c0, p1, c3, c2); // Replace corner[2] with convex hull point accounting for stroke width find_intersection(corners[0], v01, corners[4], v21, corners[2]); return 5; } void set_adjascent_info(vec2 c0, vec2 tangent, int degree, vec2 adj[3], out float bevel, out float angle ){ bool linear_adj = (angle_between_vectors(adj[1] - adj[0], adj[2] - adj[1]) < 1e-3); angle = angle_between_vectors(c0 - adj[1], tangent); // Decide on joint type bool one_linear = (degree == 1 || linear_adj); bool should_bevel = ( (joint_type == AUTO_JOINT && one_linear) || joint_type == BEVEL_JOINT ); bevel = should_bevel ? 1.0 : 0.0; } void find_joint_info(vec2 controls[3], vec2 prev[3], vec2 next[3], int degree){ float tol = 1e-6; // Made as floats not bools so they can be passed to the frag shader has_prev = float(distance(prev[2], controls[0]) < tol); has_next = float(distance(next[0], controls[2]) < tol); if(bool(has_prev)){ vec2 tangent = controls[1] - controls[0]; set_adjascent_info( controls[0], tangent, degree, prev, bevel_start, angle_from_prev ); } if(bool(has_next)){ vec2 tangent = controls[1] - controls[2]; set_adjascent_info( controls[2], tangent, degree, next, bevel_end, angle_to_next ); angle_to_next *= -1; } } void main() { // Convert control points to a standard form if they are linear or null vec3 controls[3]; vec3 prev[3]; vec3 next[3]; bezier_degree = get_reduced_control_points(vec3[3](bp[0], bp[1], bp[2]), controls); if(bezier_degree == 0.0) return; // Null curve int degree = int(bezier_degree); get_reduced_control_points(vec3[3](prev_bp[0], prev_bp[1], prev_bp[2]), prev); get_reduced_control_points(vec3[3](next_bp[0], next_bp[1], next_bp[2]), next); // Adjust stroke width based on distance from the camera float scaled_strokes[3]; for(int i = 0; i < 3; i++){ float sf = perspective_scale_factor(controls[i].z, focal_distance); if(bool(flat_stroke)){ vec3 to_cam = normalize(vec3(0.0, 0.0, focal_distance) - controls[i]); sf *= abs(dot(v_global_unit_normal[i], to_cam)); } scaled_strokes[i] = v_stroke_width[i] * sf; } // Control points are projected to the xy plane before drawing, which in turn // gets translated to a uv plane. The z-coordinate information will be remembered // by what's sent out to gl_Position, and by how it affects the lighting and stroke width vec2 flat_controls[3]; vec2 flat_prev[3]; vec2 flat_next[3]; flatten_points(controls, flat_controls); flatten_points(prev, flat_prev); flatten_points(next, flat_next); find_joint_info(flat_controls, flat_prev, flat_next, degree); // Corners of a bounding region around curve vec2 corners[5]; int n_corners = get_corners(flat_controls, degree, scaled_strokes, corners); int index_map[5] = int[5](0, 0, 1, 2, 2); if(n_corners == 4) index_map[2] = 2; // Find uv conversion matrix mat3 xy_to_uv = get_xy_to_uv(flat_controls[0], flat_controls[1]); float scale_factor = length(flat_controls[1] - flat_controls[0]); uv_anti_alias_width = anti_alias_width / scale_factor; uv_b2 = (xy_to_uv * vec3(flat_controls[2], 1.0)).xy; // Emit each corner for(int i = 0; i < n_corners; i++){ uv_coords = (xy_to_uv * vec3(corners[i], 1.0)).xy; uv_stroke_width = scaled_strokes[index_map[i]] / scale_factor; // Apply some lighting to the color before sending out. // vec3 xyz_coords = vec3(corners[i], controls[index_map[i]].z); vec3 xyz_coords = vec3(corners[i], controls[index_map[i]].z); color = finalize_color( v_color[index_map[i]], xyz_coords, v_global_unit_normal[index_map[i]], light_source_position, gloss, shadow ); gl_Position = vec4( get_gl_Position(vec3(corners[i], 0.0)).xy, get_gl_Position(controls[index_map[i]]).zw ); EmitVertex(); } EndPrimitive(); } ManimCommunity-manim-1157b74/manim/renderer/shaders/quadratic_bezier_stroke/vert.glsl000066400000000000000000000013471515024150700311470ustar00rootroot00000000000000#version 330 #include ../include/camera_uniform_declarations.glsl in vec3 point; in vec3 prev_point; in vec3 next_point; in vec3 unit_normal; in float stroke_width; in vec4 color; // Bezier control point out vec3 bp; out vec3 prev_bp; out vec3 next_bp; out vec3 v_global_unit_normal; out float v_stroke_width; out vec4 v_color; const float STROKE_WIDTH_CONVERSION = 0.01; #include ../include/position_point_into_frame.glsl void main(){ bp = position_point_into_frame(point); prev_bp = position_point_into_frame(prev_point); next_bp = position_point_into_frame(next_point); v_global_unit_normal = rotate_point_into_frame(unit_normal); v_stroke_width = STROKE_WIDTH_CONVERSION * stroke_width; v_color = color; } ManimCommunity-manim-1157b74/manim/renderer/shaders/simple_vert.glsl000066400000000000000000000004501515024150700256060ustar00rootroot00000000000000#version 330 #include ../include/camera_uniform_declarations.glsl in vec3 point; // Analog of import for manim only #include ../include/get_gl_Position.glsl #include ../include/position_point_into_frame.glsl void main(){ gl_Position = get_gl_Position(position_point_into_frame(point)); } ManimCommunity-manim-1157b74/manim/renderer/shaders/surface/000077500000000000000000000000001515024150700240235ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/surface/frag.glsl000066400000000000000000000006141515024150700256260ustar00rootroot00000000000000#version 330 uniform vec3 light_source_position; uniform float gloss; uniform float shadow; in vec3 xyz_coords; in vec3 v_normal; in vec4 v_color; out vec4 frag_color; #include ../include/finalize_color.glsl void main() { frag_color = finalize_color( v_color, xyz_coords, normalize(v_normal), light_source_position, gloss, shadow ); } ManimCommunity-manim-1157b74/manim/renderer/shaders/surface/vert.glsl000066400000000000000000000010671515024150700256720ustar00rootroot00000000000000#version 330 #include ../include/camera_uniform_declarations.glsl in vec3 point; in vec3 du_point; in vec3 dv_point; in vec4 color; out vec3 xyz_coords; out vec3 v_normal; out vec4 v_color; #include ../include/position_point_into_frame.glsl #include ../include/get_gl_Position.glsl #include ../include/get_rotated_surface_unit_normal_vector.glsl void main(){ xyz_coords = position_point_into_frame(point); v_normal = get_rotated_surface_unit_normal_vector(point, du_point, dv_point); v_color = color; gl_Position = get_gl_Position(xyz_coords); } ManimCommunity-manim-1157b74/manim/renderer/shaders/test/000077500000000000000000000000001515024150700233525ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/test/frag.glsl000066400000000000000000000001401515024150700251470ustar00rootroot00000000000000#version 330 in vec4 v_color; out vec4 frag_color; void main() { frag_color = v_color; } ManimCommunity-manim-1157b74/manim/renderer/shaders/test/vert.glsl000066400000000000000000000002301515024150700252100ustar00rootroot00000000000000#version 330 in vec2 in_vert; in vec4 in_color; out vec4 v_color; void main() { v_color = in_color; gl_Position = vec4(in_vert, 0.0, 1.0); } ManimCommunity-manim-1157b74/manim/renderer/shaders/textured_surface/000077500000000000000000000000001515024150700257475ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/textured_surface/frag.glsl000066400000000000000000000016741515024150700275610ustar00rootroot00000000000000#version 330 uniform sampler2D LightTexture; uniform sampler2D DarkTexture; uniform float num_textures; uniform vec3 light_source_position; uniform float gloss; uniform float shadow; in vec3 xyz_coords; in vec3 v_normal; in vec2 v_im_coords; in float v_opacity; out vec4 frag_color; #include ../include/finalize_color.glsl const float dark_shift = 0.2; void main() { vec4 color = texture(LightTexture, v_im_coords); if(num_textures == 2.0){ vec4 dark_color = texture(DarkTexture, v_im_coords); float dp = dot( normalize(light_source_position - xyz_coords), normalize(v_normal) ); float alpha = smoothstep(-dark_shift, dark_shift, dp); color = mix(dark_color, color, alpha); } frag_color = finalize_color( color, xyz_coords, normalize(v_normal), light_source_position, gloss, shadow ); frag_color.a = v_opacity; } ManimCommunity-manim-1157b74/manim/renderer/shaders/textured_surface/vert.glsl000066400000000000000000000012071515024150700276120ustar00rootroot00000000000000#version 330 #include ../include/camera_uniform_declarations.glsl in vec3 point; in vec3 du_point; in vec3 dv_point; in vec2 im_coords; in float opacity; out vec3 xyz_coords; out vec3 v_normal; out vec2 v_im_coords; out float v_opacity; #include ../include/position_point_into_frame.glsl #include ../include/get_gl_Position.glsl #include ../include/get_rotated_surface_unit_normal_vector.glsl void main(){ xyz_coords = position_point_into_frame(point); v_normal = get_rotated_surface_unit_normal_vector(point, du_point, dv_point); v_im_coords = im_coords; v_opacity = opacity; gl_Position = get_gl_Position(xyz_coords); } ManimCommunity-manim-1157b74/manim/renderer/shaders/true_dot/000077500000000000000000000000001515024150700242205ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/true_dot/frag.glsl000066400000000000000000000014271515024150700260260ustar00rootroot00000000000000#version 330 uniform vec3 light_source_position; uniform float gloss; uniform float shadow; uniform float anti_alias_width; in vec4 color; in float point_radius; in vec2 center; in vec2 point; out vec4 frag_color; #include ../include/finalize_color.glsl void main() { vec2 diff = point - center; float dist = length(diff); float signed_dist = dist - point_radius; if (signed_dist > 0.5 * anti_alias_width){ discard; } vec3 normal = vec3(diff / point_radius, sqrt(1 - (dist * dist) / (point_radius * point_radius))); frag_color = finalize_color( color, vec3(point.xy, 0.0), normal, light_source_position, gloss, shadow ); frag_color.a *= smoothstep(0.5, -0.5, signed_dist / anti_alias_width); } ManimCommunity-manim-1157b74/manim/renderer/shaders/true_dot/geom.glsl000066400000000000000000000021151515024150700260310ustar00rootroot00000000000000#version 330 layout (points) in; layout (triangle_strip, max_vertices = 4) out; // Needed for get_gl_Position uniform vec2 frame_shape; uniform float focal_distance; uniform float is_fixed_in_frame; uniform float is_fixed_orientation; uniform vec3 fixed_orientation_center; uniform float anti_alias_width; in vec3 v_point[1]; in float v_point_radius[1]; in vec4 v_color[1]; out vec4 color; out float point_radius; out vec2 center; out vec2 point; #include ../include/get_gl_Position.glsl void main() { color = v_color[0]; point_radius = v_point_radius[0]; center = v_point[0].xy; point_radius = v_point_radius[0] / max(1.0 - v_point[0].z / focal_distance / frame_shape.y, 0.0); float rpa = point_radius + anti_alias_width; for(int i = 0; i < 4; i++){ // To account for perspective int x_index = 2 * (i % 2) - 1; int y_index = 2 * (i / 2) - 1; vec3 corner = v_point[0] + vec3(x_index * rpa, y_index * rpa, 0.0); gl_Position = get_gl_Position(corner); point = corner.xy; EmitVertex(); } EndPrimitive(); } ManimCommunity-manim-1157b74/manim/renderer/shaders/true_dot/vert.glsl000066400000000000000000000005521515024150700260650ustar00rootroot00000000000000#version 330 #include ../include/camera_uniform_declarations.glsl in vec3 point; in vec4 color; uniform float point_radius; out vec3 v_point; out float v_point_radius; out vec4 v_color; #include ../include/position_point_into_frame.glsl void main(){ v_point = position_point_into_frame(point); v_point_radius = point_radius; v_color = color; } ManimCommunity-manim-1157b74/manim/renderer/shaders/vectorized_mobject_fill/000077500000000000000000000000001515024150700272625ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/vectorized_mobject_fill/frag.glsl000066400000000000000000000005041515024150700310630ustar00rootroot00000000000000#version 330 in vec4 v_color; in vec2 v_texture_coords; flat in int v_texture_mode; out vec4 frag_color; void main() { float curve_func = v_texture_coords[0] * v_texture_coords[0] - v_texture_coords[1]; if (v_texture_mode * curve_func >= 0.0) { frag_color = v_color; } else { discard; } } ManimCommunity-manim-1157b74/manim/renderer/shaders/vectorized_mobject_fill/vert.glsl000066400000000000000000000006631515024150700311320ustar00rootroot00000000000000#version 330 uniform mat4 u_model_view_matrix; uniform mat4 u_projection_matrix; in vec3 in_vert; in vec4 in_color; in vec2 texture_coords; in int texture_mode; out vec4 v_color; out vec2 v_texture_coords; flat out int v_texture_mode; void main() { v_color = in_color; v_texture_coords = texture_coords; v_texture_mode = texture_mode; gl_Position = u_projection_matrix * u_model_view_matrix * vec4(in_vert, 1.0); } ManimCommunity-manim-1157b74/manim/renderer/shaders/vectorized_mobject_stroke/000077500000000000000000000000001515024150700276435ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/vectorized_mobject_stroke/frag.glsl000066400000000000000000000052401515024150700314460ustar00rootroot00000000000000#version 330 in float v_degree; in float v_thickness; in vec2 uv_point; in vec2[3] uv_curve; in vec4 v_color; out vec4 frag_color; // https://www.shadertoy.com/view/ltXSDB // Test if point p crosses line (a, b), returns sign of result float testCross(vec2 a, vec2 b, vec2 p) { return sign((b.y-a.y) * (p.x-a.x) - (b.x-a.x) * (p.y-a.y)); } // Determine which side we're on (using barycentric parameterization) float signBezier(vec2 A, vec2 B, vec2 C, vec2 p) { vec2 a = C - A, b = B - A, c = p - A; vec2 bary = vec2(c.x*b.y-b.x*c.y,a.x*c.y-c.x*a.y) / (a.x*b.y-b.x*a.y); vec2 d = vec2(bary.y * 0.5, 0.0) + 1.0 - bary.x - bary.y; return mix(sign(d.x * d.x - d.y), mix(-1.0, 1.0, step(testCross(A, B, p) * testCross(B, C, p), 0.0)), step((d.x - d.y), 0.0)) * testCross(A, C, B); } // Solve cubic equation for roots vec3 solveCubic(float a, float b, float c) { float p = b - a*a / 3.0, p3 = p*p*p; float q = a * (2.0*a*a - 9.0*b) / 27.0 + c; float d = q*q + 4.0*p3 / 27.0; float offset = -a / 3.0; if(d >= 0.0) { float z = sqrt(d); vec2 x = (vec2(z, -z) - q) / 2.0; vec2 uv = sign(x)*pow(abs(x), vec2(1.0/3.0)); return vec3(offset + uv.x + uv.y); } float v = acos(-sqrt(-27.0 / p3) * q / 2.0) / 3.0; float m = cos(v), n = sin(v)*1.732050808; return vec3(m + m, -n - m, n - m) * sqrt(-p / 3.0) + offset; } // Find the signed distance from a point to a bezier curve float sdBezier(vec2 A, vec2 B, vec2 C, vec2 p) { B = mix(B + vec2(1e-4), B, abs(sign(B * 2.0 - A - C))); vec2 a = B - A, b = A - B * 2.0 + C, c = a * 2.0, d = A - p; vec3 k = vec3(3.*dot(a,b),2.*dot(a,a)+dot(d,b),dot(d,a)) / dot(b,b); vec3 t = clamp(solveCubic(k.x, k.y, k.z), 0.0, 1.0); vec2 pos = A + (c + b*t.x)*t.x; float dis = length(pos - p); pos = A + (c + b*t.y)*t.y; dis = min(dis, length(pos - p)); pos = A + (c + b*t.z)*t.z; dis = min(dis, length(pos - p)); return dis * signBezier(A, B, C, p); } // https://www.shadertoy.com/view/llcfR7 float dLine(vec2 p1, vec2 p2, vec2 x) { vec4 colA = vec4(clamp (5.0 - length (x - p1), 0.0, 1.0)); vec4 colB = vec4(clamp (5.0 - length (x - p2), 0.0, 1.0)); vec2 a_p1 = x - p1; vec2 p2_p1 = p2 - p1; float h = clamp (dot (a_p1, p2_p1) / dot (p2_p1, p2_p1), 0.0, 1.0); return length (a_p1 - p2_p1 * h); } void main() { float distance; if (v_degree == 2.0) { distance = sdBezier(uv_curve[0], uv_curve[1], uv_curve[2], uv_point); } else { distance = dLine(uv_curve[0], uv_curve[2], uv_point); } if (abs(distance) < v_thickness) { frag_color = v_color; } else { discard; } } ManimCommunity-manim-1157b74/manim/renderer/shaders/vectorized_mobject_stroke/vert.glsl000066400000000000000000000105161515024150700315110ustar00rootroot00000000000000#version 330 uniform vec3 manim_unit_normal; uniform mat4 u_model_view_matrix; uniform mat4 u_projection_matrix; in vec3[3] current_curve; in vec2 tile_coordinate; in vec4 in_color; in float in_width; out float v_degree; out float v_thickness; out vec2 uv_point; out vec2[3] uv_curve; out vec4 v_color; int get_degree(in vec3 points[3], out vec3 normal) { float length_threshold = 1e-6; float angle_threshold = 5e-2; vec3 v01 = (points[1] - points[0]); vec3 v12 = (points[2] - points[1]); float dot_prod = clamp(dot(normalize(v01), normalize(v12)), -1, 1); bool aligned = acos(dot_prod) < angle_threshold; bool distinct_01 = length(v01) > length_threshold; // v01 is considered nonzero bool distinct_12 = length(v12) > length_threshold; // v12 is considered nonzero int num_distinct = int(distinct_01) + int(distinct_12); bool quadratic = (num_distinct == 2) && !aligned; bool linear = (num_distinct == 1) || ((num_distinct == 2) && aligned); bool constant = (num_distinct == 0); if (quadratic) { // If the curve is quadratic pass a normal vector to the caller. normal = normalize(cross(v01, v12)); return 2; } else if (linear) { return 1; } else { return 0; } } // https://iquilezles.org/www/articles/bezierbbox/bezierbbox.htm vec4 bboxBezier(in vec2 p0, in vec2 p1, in vec2 p2) { vec2 mi = min(p0, p2); vec2 ma = max(p0, p2); if (p1.x < mi.x || p1.x > ma.x || p1.y < mi.y || p1.y > ma.y) { vec2 t = clamp((p0 - p1) / (p0 - 2.0 * p1 + p2), 0.0, 1.0); vec2 s = 1.0 - t; vec2 q = s * s * p0 + 2.0 * s * t * p1 + t * t * p2; mi = min(mi, q); ma = max(ma, q); } return vec4(mi, ma); } vec2 convert_to_uv(vec3 x_unit, vec3 y_unit, vec3 point) { return vec2(dot(point, x_unit), dot(point, y_unit)); } vec3 convert_from_uv(vec3 translation, vec3 x_unit, vec3 y_unit, vec2 point) { vec3 untranslated_point = point[0] * x_unit + point[1] * y_unit; return untranslated_point + translation; } void main() { float thickness_multiplier = 0.004; v_color = in_color; vec3 computed_normal; v_degree = get_degree(current_curve, computed_normal); vec3 tile_x_unit = normalize(current_curve[2] - current_curve[0]); vec3 unit_normal; vec3 tile_y_unit; if (v_degree == 0) { tile_y_unit = vec3(0.0, 0.0, 0.0); } else if (v_degree == 1) { // Since the curve forms a straight line there's no way to compute a normal. unit_normal = manim_unit_normal; tile_y_unit = cross(unit_normal, tile_x_unit); } else { // Prefer to use a computed normal vector rather than the one from manim. unit_normal = computed_normal; // Ensure tile_y_unit is pointing toward p1 from p0. tile_y_unit = cross(unit_normal, tile_x_unit); if (dot(tile_y_unit, current_curve[1] - current_curve[0]) < 0) { tile_y_unit *= -1; } } // Project the curve onto the tile. for(int i = 0; i < 3; i++) { uv_curve[i] = convert_to_uv(tile_x_unit, tile_y_unit, current_curve[i]); } // Compute the curve's bounding box. vec4 uv_bounding_box = bboxBezier(uv_curve[0], uv_curve[1], uv_curve[2]); vec3 tile_translation = unit_normal * dot(current_curve[0], unit_normal); vec3 bounding_box_min = convert_from_uv(tile_translation, tile_x_unit, tile_y_unit, uv_bounding_box.xy); vec3 bounding_box_max = convert_from_uv(tile_translation, tile_x_unit, tile_y_unit, uv_bounding_box.zw); vec3 bounding_box_vec = bounding_box_max - bounding_box_min; vec3 tile_origin = bounding_box_min; vec3 tile_x_vec = tile_x_unit * dot(tile_x_unit, bounding_box_vec); vec3 tile_y_vec = tile_y_unit * dot(tile_y_unit, bounding_box_vec); // Expand the tile according to the line's thickness. v_thickness = thickness_multiplier * in_width; tile_origin = current_curve[0] - v_thickness * (tile_x_unit + tile_y_unit); tile_x_vec += 2 * v_thickness * tile_x_unit; tile_y_vec += 2 * v_thickness * tile_y_unit; vec3 tile_point = tile_origin + \ tile_coordinate[0] * tile_x_vec + \ tile_coordinate[1] * tile_y_vec; gl_Position = u_projection_matrix * u_model_view_matrix * vec4(tile_point, 1.0); uv_point = convert_to_uv(tile_x_unit, tile_y_unit, tile_point); } ManimCommunity-manim-1157b74/manim/renderer/shaders/vertex_colors/000077500000000000000000000000001515024150700252715ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/renderer/shaders/vertex_colors/frag.glsl000066400000000000000000000001351515024150700270720ustar00rootroot00000000000000#version 330 in vec4 v_color; out vec4 frag_color; void main() { frag_color = v_color; } ManimCommunity-manim-1157b74/manim/renderer/shaders/vertex_colors/vert.glsl000066400000000000000000000004311515024150700271320ustar00rootroot00000000000000#version 330 uniform mat4 u_model_matrix; uniform mat4 u_view_matrix; uniform mat4 u_projection_matrix; in vec4 in_vert; in vec4 in_color; out vec4 v_color; void main() { v_color = in_color; gl_Position = u_projection_matrix * u_view_matrix * u_model_matrix * in_vert; } ManimCommunity-manim-1157b74/manim/renderer/vectorized_mobject_rendering.py000066400000000000000000000233671515024150700272450ustar00rootroot00000000000000from __future__ import annotations from collections import defaultdict from collections.abc import Iterable, Sequence from typing import TYPE_CHECKING import numpy as np if TYPE_CHECKING: from manim.renderer.opengl_renderer import ( OpenGLRenderer, OpenGLVMobject, ) from manim.typing import MatrixMN from ..utils import opengl from ..utils.space_ops import cross2d, earclip_triangulation from .shader import Shader __all__ = [ "render_opengl_vectorized_mobject_fill", "render_opengl_vectorized_mobject_stroke", ] def build_matrix_lists( mob: OpenGLVMobject, ) -> defaultdict[tuple[float, ...], list[OpenGLVMobject]]: root_hierarchical_matrix = mob.hierarchical_model_matrix() matrix_to_mobject_list = defaultdict(list) if mob.has_points(): matrix_to_mobject_list[tuple(root_hierarchical_matrix.ravel())].append(mob) mobject_to_hierarchical_matrix = {mob: root_hierarchical_matrix} dfs = [mob] while dfs: parent = dfs.pop() for child in parent.submobjects: child_hierarchical_matrix = ( mobject_to_hierarchical_matrix[parent] @ child.model_matrix ) mobject_to_hierarchical_matrix[child] = child_hierarchical_matrix if child.has_points(): matrix_to_mobject_list[tuple(child_hierarchical_matrix.ravel())].append( child, ) dfs.append(child) return matrix_to_mobject_list def render_opengl_vectorized_mobject_fill( renderer: OpenGLRenderer, mobject: OpenGLVMobject ) -> None: matrix_to_mobject_list = build_matrix_lists(mobject) for matrix_tuple, mobject_list in matrix_to_mobject_list.items(): model_matrix = np.array(matrix_tuple).reshape((4, 4)) render_mobject_fills_with_matrix(renderer, model_matrix, mobject_list) def render_mobject_fills_with_matrix( renderer: OpenGLRenderer, model_matrix: MatrixMN, mobjects: Iterable[OpenGLVMobject], ) -> None: # Precompute the total number of vertices for which to reserve space. # Note that triangulate_mobject() will cache its results. total_size = 0 for submob in mobjects: total_size += triangulate_mobject(submob).shape[0] attributes = np.empty( total_size, dtype=[ ("in_vert", np.float32, (3,)), ("in_color", np.float32, (4,)), ("texture_coords", np.float32, (2,)), ("texture_mode", np.int32), ], ) write_offset = 0 for submob in mobjects: if not submob.has_points(): continue mobject_triangulation = triangulate_mobject(submob) end_offset = write_offset + mobject_triangulation.shape[0] attributes[write_offset:end_offset] = mobject_triangulation attributes["in_color"][write_offset:end_offset] = np.repeat( submob.fill_rgba, mobject_triangulation.shape[0], axis=0, ) write_offset = end_offset fill_shader = Shader(renderer.context, name="vectorized_mobject_fill") fill_shader.set_uniform( "u_model_view_matrix", opengl.matrix_to_shader_input( renderer.camera.unformatted_view_matrix @ model_matrix, ), ) fill_shader.set_uniform( "u_projection_matrix", renderer.camera.projection_matrix, ) vbo = renderer.context.buffer(attributes.tobytes()) vao = renderer.context.simple_vertex_array( fill_shader.shader_program, vbo, *attributes.dtype.names, ) vao.render() vao.release() vbo.release() def triangulate_mobject(mob: OpenGLVMobject) -> np.ndarray: if not mob.needs_new_triangulation: return mob.triangulation # Figure out how to triangulate the interior to know # how to send the points as to the vertex shader. # First triangles come directly from the points # normal_vector = mob.get_unit_normal() points = mob.points b0s = points[0::3] b1s = points[1::3] b2s = points[2::3] v01s = b1s - b0s v12s = b2s - b1s crosses = cross2d(v01s, v12s) convexities = np.sign(crosses) if mob.orientation == 1: concave_parts = convexities > 0 convex_parts = convexities <= 0 else: concave_parts = convexities < 0 convex_parts = convexities >= 0 # These are the vertices to which we'll apply a polygon triangulation atol = mob.tolerance_for_point_equality end_of_loop = np.zeros(len(b0s), dtype=bool) end_of_loop[:-1] = (np.abs(b2s[:-1] - b0s[1:]) > atol).any(1) end_of_loop[-1] = True indices = np.arange(len(points), dtype=int) inner_vert_indices = np.hstack( [ indices[0::3], indices[1::3][concave_parts], indices[2::3][end_of_loop], ], ) inner_vert_indices.sort() rings = np.arange(1, len(inner_vert_indices) + 1)[inner_vert_indices % 3 == 2] # Triangulate inner_verts = points[inner_vert_indices] inner_tri_indices = inner_vert_indices[earclip_triangulation(inner_verts, rings)] bezier_triangle_indices = np.reshape(indices, (-1, 3)) concave_triangle_indices = np.reshape(bezier_triangle_indices[concave_parts], (-1)) convex_triangle_indices = np.reshape(bezier_triangle_indices[convex_parts], (-1)) points = points[ np.hstack( [ concave_triangle_indices, convex_triangle_indices, inner_tri_indices, ], ) ] texture_coords = np.tile( [ [0.0, 0.0], [0.5, 0.0], [1.0, 1.0], ], (points.shape[0] // 3, 1), ) texture_mode = np.hstack( ( np.ones(concave_triangle_indices.shape[0]), -1 * np.ones(convex_triangle_indices.shape[0]), np.zeros(inner_tri_indices.shape[0]), ), ) attributes = np.zeros( points.shape[0], dtype=[ ("in_vert", np.float32, (3,)), ("in_color", np.float32, (4,)), ("texture_coords", np.float32, (2,)), ("texture_mode", np.int32), ], ) attributes["in_vert"] = points attributes["texture_coords"] = texture_coords attributes["texture_mode"] = texture_mode mob.triangulation = attributes mob.needs_new_triangulation = False return attributes def render_opengl_vectorized_mobject_stroke( renderer: OpenGLRenderer, mobject: OpenGLVMobject ) -> None: matrix_to_mobject_list = build_matrix_lists(mobject) for matrix_tuple, mobject_list in matrix_to_mobject_list.items(): model_matrix = np.array(matrix_tuple).reshape((4, 4)) render_mobject_strokes_with_matrix(renderer, model_matrix, mobject_list) def render_mobject_strokes_with_matrix( renderer: OpenGLRenderer, model_matrix: MatrixMN, mobjects: Sequence[OpenGLVMobject], ) -> None: # Precompute the total number of vertices for which to reserve space. total_size = 0 for submob in mobjects: total_size += submob.points.shape[0] points = np.empty((total_size, 3)) colors = np.empty((total_size, 4)) widths = np.empty(total_size) write_offset = 0 for submob in mobjects: if not submob.has_points(): continue end_offset = write_offset + submob.points.shape[0] points[write_offset:end_offset] = submob.points if submob.stroke_rgba.shape[0] == points[write_offset:end_offset].shape[0]: colors[write_offset:end_offset] = submob.stroke_rgba else: colors[write_offset:end_offset] = np.repeat( submob.stroke_rgba, submob.points.shape[0], axis=0, ) widths[write_offset:end_offset] = np.repeat( submob.stroke_width, submob.points.shape[0], ) write_offset = end_offset stroke_data = np.zeros( len(points), dtype=[ # ("previous_curve", np.float32, (3, 3)), ("current_curve", np.float32, (3, 3)), # ("next_curve", np.float32, (3, 3)), ("tile_coordinate", np.float32, (2,)), ("in_color", np.float32, (4,)), ("in_width", np.float32), ], ) stroke_data["in_color"] = colors stroke_data["in_width"] = widths curves = np.reshape(points, (-1, 3, 3)) # stroke_data["previous_curve"] = np.repeat(np.roll(curves, 1, axis=0), 3, axis=0) stroke_data["current_curve"] = np.repeat(curves, 3, axis=0) # stroke_data["next_curve"] = np.repeat(np.roll(curves, -1, axis=0), 3, axis=0) # Repeat each vertex in order to make a tile. stroke_data = np.tile(stroke_data, 2) stroke_data["tile_coordinate"] = np.vstack( ( np.tile( [ [0.0, 0.0], [0.0, 1.0], [1.0, 1.0], ], (len(points) // 3, 1), ), np.tile( [ [0.0, 0.0], [1.0, 0.0], [1.0, 1.0], ], (len(points) // 3, 1), ), ), ) shader = Shader(renderer.context, "vectorized_mobject_stroke") shader.set_uniform( "u_model_view_matrix", opengl.matrix_to_shader_input( renderer.camera.unformatted_view_matrix @ model_matrix, ), ) shader.set_uniform("u_projection_matrix", renderer.camera.projection_matrix) shader.set_uniform("manim_unit_normal", tuple(-mobjects[0].unit_normal[0])) vbo = renderer.context.buffer(stroke_data.tobytes()) vao = renderer.context.simple_vertex_array( shader.shader_program, vbo, *stroke_data.dtype.names ) renderer.frame_buffer_object.use() vao.render() vao.release() vbo.release() ManimCommunity-manim-1157b74/manim/scene/000077500000000000000000000000001515024150700202315ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/scene/__init__.py000066400000000000000000000000001515024150700223300ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/scene/moving_camera_scene.py000066400000000000000000000114011515024150700245640ustar00rootroot00000000000000"""A scene whose camera can be moved around. .. SEEALSO:: :mod:`.moving_camera` Examples -------- .. manim:: ChangingCameraWidthAndRestore class ChangingCameraWidthAndRestore(MovingCameraScene): def construct(self): text = Text("Hello World").set_color(BLUE) self.add(text) self.camera.frame.save_state() self.play(self.camera.frame.animate.set(width=text.width * 1.2)) self.wait(0.3) self.play(Restore(self.camera.frame)) .. manim:: MovingCameraCenter class MovingCameraCenter(MovingCameraScene): def construct(self): s = Square(color=RED, fill_opacity=0.5).move_to(2 * LEFT) t = Triangle(color=GREEN, fill_opacity=0.5).move_to(2 * RIGHT) self.wait(0.3) self.add(s, t) self.play(self.camera.frame.animate.move_to(s)) self.wait(0.3) self.play(self.camera.frame.animate.move_to(t)) .. manim:: MovingAndZoomingCamera class MovingAndZoomingCamera(MovingCameraScene): def construct(self): s = Square(color=BLUE, fill_opacity=0.5).move_to(2 * LEFT) t = Triangle(color=YELLOW, fill_opacity=0.5).move_to(2 * RIGHT) self.add(s, t) self.play(self.camera.frame.animate.move_to(s).set(width=s.width*2)) self.wait(0.3) self.play(self.camera.frame.animate.move_to(t).set(width=t.width*2)) self.play(self.camera.frame.animate.move_to(ORIGIN).set(width=14)) .. manim:: MovingCameraOnGraph class MovingCameraOnGraph(MovingCameraScene): def construct(self): self.camera.frame.save_state() ax = Axes(x_range=[-1, 10], y_range=[-1, 10]) graph = ax.plot(lambda x: np.sin(x), color=WHITE, x_range=[0, 3 * PI]) dot_1 = Dot(ax.i2gp(graph.t_min, graph)) dot_2 = Dot(ax.i2gp(graph.t_max, graph)) self.add(ax, graph, dot_1, dot_2) self.play(self.camera.frame.animate.scale(0.5).move_to(dot_1)) self.play(self.camera.frame.animate.move_to(dot_2)) self.play(Restore(self.camera.frame)) self.wait() .. manim:: SlidingMultipleScenes class SlidingMultipleScenes(MovingCameraScene): def construct(self): def create_scene(number): frame = Rectangle(width=16,height=9) circ = Circle().shift(LEFT) text = Tex(f"This is Scene {str(number)}").next_to(circ, RIGHT) frame.add(circ,text) return frame group = VGroup(*(create_scene(i) for i in range(4))).arrange_in_grid(buff=4) self.add(group) self.camera.auto_zoom(group[0], animate=False) for scene in group: self.play(self.camera.auto_zoom(scene)) self.wait() self.play(self.camera.auto_zoom(group, margin=2)) """ from __future__ import annotations __all__ = ["MovingCameraScene"] from typing import Any from manim.animation.animation import Animation from manim.mobject.mobject import Mobject from ..camera.camera import Camera from ..camera.moving_camera import MovingCamera from ..scene.scene import Scene from ..utils.family import extract_mobject_family_members from ..utils.iterables import list_update class MovingCameraScene(Scene): """ This is a Scene, with special configurations and properties that make it suitable for cases where the camera must be moved around. Note: Examples are included in the moving_camera_scene module documentation, see below in the 'see also' section. .. SEEALSO:: :mod:`.moving_camera_scene` :class:`.MovingCamera` """ def __init__( self, camera_class: type[Camera] = MovingCamera, **kwargs: Any ) -> None: super().__init__(camera_class=camera_class, **kwargs) def get_moving_mobjects(self, *animations: Animation) -> list[Mobject]: """ This method returns a list of all of the Mobjects in the Scene that are moving, that are also in the animations passed. Parameters ---------- *animations The Animations whose mobjects will be checked. """ moving_mobjects = super().get_moving_mobjects(*animations) all_moving_mobjects = extract_mobject_family_members(moving_mobjects) movement_indicators = self.renderer.camera.get_mobjects_indicating_movement() # type: ignore[union-attr] for movement_indicator in movement_indicators: if movement_indicator in all_moving_mobjects: # When one of these is moving, the camera should # consider all mobjects to be moving return list_update(self.mobjects, moving_mobjects) return moving_mobjects ManimCommunity-manim-1157b74/manim/scene/scene.py000066400000000000000000002114001515024150700216760ustar00rootroot00000000000000"""Basic canvas for animations.""" from __future__ import annotations from manim.utils.parameter_parsing import flatten_iterable_parameters from ..mobject.mobject import _AnimationBuilder __all__ = ["Scene"] import copy import datetime import inspect import platform import random import threading import time from dataclasses import dataclass from pathlib import Path from queue import Queue import srt from manim.scene.section import DefaultSectionType try: import dearpygui.dearpygui as dpg dearpygui_imported = True dpg.create_context() window = dpg.generate_uuid() except ImportError: dearpygui_imported = False from collections.abc import Callable, Iterable, Sequence from typing import TYPE_CHECKING, Any import numpy as np from tqdm import tqdm from watchdog.events import DirModifiedEvent, FileModifiedEvent, FileSystemEventHandler from watchdog.observers import Observer from manim import __version__ from manim.data_structures import MethodWithArgs from manim.mobject.mobject import Mobject from manim.mobject.opengl.opengl_mobject import OpenGLPoint from .. import config, logger from ..animation.animation import Animation, Wait, prepare_animation from ..camera.camera import Camera from ..constants import * from ..renderer.cairo_renderer import CairoRenderer from ..renderer.opengl_renderer import OpenGLCamera, OpenGLMobject, OpenGLRenderer from ..renderer.shader import Object3D from ..utils import opengl, space_ops from ..utils.exceptions import EndSceneEarlyException, RerunSceneException from ..utils.family import extract_mobject_family_members from ..utils.family_ops import restructure_list_to_exclude_certain_family_members from ..utils.file_ops import open_media_file from ..utils.iterables import list_difference_update, list_update from ..utils.module_ops import scene_classes_from_file if TYPE_CHECKING: from types import FrameType from typing import Self, TypeAlias from manim.typing import Point3D SceneInteractAction: TypeAlias = ( MethodWithArgs | "SceneInteractContinue" | "SceneInteractRerun" ) """The SceneInteractAction type alias is used for elements in the queue used by :meth:`.Scene.interact()`. The elements can be one of the following three: - a :class:`~.MethodWithArgs` object, which represents a :class:`Scene` method to be called along with its args and kwargs, - a :class:`~.SceneInteractContinue` object, indicating that the scene interaction is over and the scene will continue rendering after that, or - a :class:`~.SceneInteractRerun` object, indicating that the scene should render again. """ @dataclass class SceneInteractContinue: """Object which, when encountered in :meth:`.Scene.interact`, triggers the end of the scene interaction, continuing with the rest of the animations, if any. This object can be queued in :attr:`.Scene.queue` for later use in :meth:`.Scene.interact`. Attributes ---------- sender : str The name of the entity which issued the end of the scene interaction, such as ``"gui"`` or ``"keyboard"``. """ __slots__ = ["sender"] sender: str class SceneInteractRerun: """Object which, when encountered in :meth:`.Scene.interact`, triggers the rerun of the scene. This object can be queued in :attr:`.Scene.queue` for later use in :meth:`.Scene.interact`. Attributes ---------- sender : str The name of the entity which issued the rerun of the scene, such as ``"gui"``, ``"keyboard"``, ``"play"`` or ``"file"``. kwargs : dict[str, Any] Additional keyword arguments when rerunning the scene. Currently, only ``"from_animation_number"`` is being used, which determines the animation from which to start rerunning the scene. """ __slots__ = ["sender", "kwargs"] def __init__(self, sender: str, **kwargs: Any) -> None: self.sender = sender self.kwargs = kwargs class RerunSceneHandler(FileSystemEventHandler): """A class to handle rerunning a Scene after the input file is modified.""" def __init__(self, queue: Queue[SceneInteractAction]) -> None: super().__init__() self.queue = queue def on_modified(self, event: DirModifiedEvent | FileModifiedEvent) -> None: self.queue.put(SceneInteractRerun("file")) class Scene: """A Scene is the canvas of your animation. The primary role of :class:`Scene` is to provide the user with tools to manage mobjects and animations. Generally speaking, a manim script consists of a class that derives from :class:`Scene` whose :meth:`Scene.construct` method is overridden by the user's code. Mobjects are displayed on screen by calling :meth:`Scene.add` and removed from screen by calling :meth:`Scene.remove`. All mobjects currently on screen are kept in :attr:`Scene.mobjects`. Animations are played by calling :meth:`Scene.play`. A :class:`Scene` is rendered internally by calling :meth:`Scene.render`. This in turn calls :meth:`Scene.setup`, :meth:`Scene.construct`, and :meth:`Scene.tear_down`, in that order. It is not recommended to override the ``__init__`` method in user Scenes. For code that should be ran before a Scene is rendered, use :meth:`Scene.setup` instead. Examples -------- Override the :meth:`Scene.construct` method with your code. .. code-block:: python class MyScene(Scene): def construct(self): self.play(Write(Text("Hello World!"))) """ def __init__( self, renderer: CairoRenderer | OpenGLRenderer | None = None, camera_class: type[Camera] = Camera, always_update_mobjects: bool = False, random_seed: int | None = None, skip_animations: bool = False, ) -> None: self.camera_class = camera_class self.always_update_mobjects = always_update_mobjects self.random_seed = random_seed if random_seed is not None else config.seed self.skip_animations = skip_animations self.animations: list[Animation] | None = None self.stop_condition: Callable[[], bool] | None = None self.moving_mobjects: list[Mobject] = [] self.static_mobjects: list[Mobject] = [] self.time_progression: tqdm[float] | None = None self.duration: float = 0.0 self.last_t = 0.0 self.queue: Queue[SceneInteractAction] = Queue() self.skip_animation_preview = False self.meshes: list[Object3D] = [] self.camera_target = ORIGIN self.widgets: list[dict[str, Any]] = [] self.dearpygui_imported = dearpygui_imported self.updaters: list[Callable[[float], None]] = [] self.key_to_function_map: dict[str, Callable[[], None]] = {} self.mouse_press_callbacks: list[Callable[[], None]] = [] self.interactive_mode = False if config.renderer == RendererType.OPENGL: # Items associated with interaction self.mouse_point = OpenGLPoint() self.mouse_drag_point = OpenGLPoint() if renderer is None: renderer = OpenGLRenderer() if renderer is None: self.renderer: CairoRenderer | OpenGLRenderer = CairoRenderer( # TODO: Is it a suitable approach to make an instance of # the self.camera_class here? camera_class=self.camera_class, skip_animations=self.skip_animations, ) else: self.renderer = renderer self.renderer.init_scene(self) self.mobjects: list[Mobject] = [] # TODO, remove need for foreground mobjects self.foreground_mobjects: list[Mobject] = [] random.seed(self.random_seed) np.random.seed(self.random_seed) # noqa: NPY002 (only way to set seed globally) @property def camera(self) -> Camera | OpenGLCamera: return self.renderer.camera @property def time(self) -> float: """The time since the start of the scene.""" return self.renderer.time def __deepcopy__(self, clone_from_id: dict[int, Any]) -> Scene: cls = self.__class__ result = cls.__new__(cls) clone_from_id[id(self)] = result for k, v in self.__dict__.items(): if k in ["renderer", "time_progression"]: continue if k == "camera_class": setattr(result, k, v) setattr(result, k, copy.deepcopy(v, clone_from_id)) return result def render(self, preview: bool = False) -> bool: """ Renders this Scene. Parameters --------- preview If true, opens scene in a file viewer. """ self.setup() try: self.construct() except EndSceneEarlyException: pass except RerunSceneException: self.remove(*self.mobjects) # TODO: The CairoRenderer does not have the method clear_screen() self.renderer.clear_screen() # type: ignore[union-attr] self.renderer.num_plays = 0 return True self.tear_down() # We have to reset these settings in case of multiple renders. self.renderer.scene_finished(self) # Show info only if animations are rendered or to get image if ( self.renderer.num_plays or config["format"] == "png" or config["save_last_frame"] ): logger.info( f"Rendered {str(self)}\nPlayed {self.renderer.num_plays} animations", ) # If preview open up the render after rendering. if preview: config["preview"] = True if config["preview"] or config["show_in_file_browser"]: open_media_file(self.renderer.file_writer) return False def setup(self) -> None: """ This is meant to be implemented by any scenes which are commonly subclassed, and have some common setup involved before the construct method is called. """ pass def tear_down(self) -> None: """ This is meant to be implemented by any scenes which are commonly subclassed, and have some common method to be invoked before the scene ends. """ pass def construct(self) -> None: """Add content to the Scene. From within :meth:`Scene.construct`, display mobjects on screen by calling :meth:`Scene.add` and remove them from screen by calling :meth:`Scene.remove`. All mobjects currently on screen are kept in :attr:`Scene.mobjects`. Play animations by calling :meth:`Scene.play`. Notes ----- Initialization code should go in :meth:`Scene.setup`. Termination code should go in :meth:`Scene.tear_down`. Examples -------- A typical manim script includes a class derived from :class:`Scene` with an overridden :meth:`Scene.construct` method: .. code-block:: python class MyScene(Scene): def construct(self): self.play(Write(Text("Hello World!"))) See Also -------- :meth:`Scene.setup` :meth:`Scene.render` :meth:`Scene.tear_down` """ pass # To be implemented in subclasses def next_section( self, name: str = "unnamed", section_type: str = DefaultSectionType.NORMAL, skip_animations: bool = False, ) -> None: """Create separation here; the last section gets finished and a new one gets created. ``skip_animations`` skips the rendering of all animations in this section. Refer to :doc:`the documentation` on how to use sections. """ self.renderer.file_writer.next_section(name, section_type, skip_animations) def __str__(self) -> str: return self.__class__.__name__ def get_attrs(self, *keys: str) -> list[Any]: """ Gets attributes of a scene given the attribute's identifier/name. Parameters ---------- *keys Name(s) of the argument(s) to return the attribute of. Returns ------- list List of attributes of the passed identifiers. """ return [getattr(self, key) for key in keys] def update_mobjects(self, dt: float) -> None: """ Begins updating all mobjects in the Scene. Parameters ---------- dt Change in time between updates. Defaults (mostly) to 1/frames_per_second """ for mobj in self.mobjects: mobj.update(dt) def update_meshes(self, dt: float) -> None: for obj in self.meshes: for mesh in obj.get_family(): mesh.update(dt) def update_self(self, dt: float) -> None: """Run all scene updater functions. Among all types of update functions (mobject updaters, mesh updaters, scene updaters), scene update functions are called last. Parameters ---------- dt Scene time since last update. See Also -------- :meth:`.Scene.add_updater` :meth:`.Scene.remove_updater` """ for func in self.updaters: func(dt) def should_update_mobjects(self) -> bool: """ Returns True if the mobjects of this scene should be updated. In particular, this checks whether - the :attr:`always_update_mobjects` attribute of :class:`.Scene` is set to ``True``, - the :class:`.Scene` itself has time-based updaters attached, - any mobject in this :class:`.Scene` has time-based updaters attached. This is only called when a single Wait animation is played. """ assert self.animations is not None wait_animation = self.animations[0] assert isinstance(wait_animation, Wait) if wait_animation.is_static_wait is None: should_update = ( self.always_update_mobjects or self.updaters or wait_animation.stop_condition is not None or any( mob.has_time_based_updater() for mob in self.get_mobject_family_members() ) ) wait_animation.is_static_wait = not should_update return not wait_animation.is_static_wait def get_top_level_mobjects(self) -> list[Mobject]: """ Returns all mobjects which are not submobjects. Returns ------- list List of top level mobjects. """ # Return only those which are not in the family # of another mobject from the scene families = [m.get_family() for m in self.mobjects] def is_top_level(mobject: Mobject) -> bool: num_families = sum((mobject in family) for family in families) return num_families == 1 return list(filter(is_top_level, self.mobjects)) def get_mobject_family_members(self) -> list[Mobject]: """ Returns list of family-members of all mobjects in scene. If a Circle() and a VGroup(Rectangle(),Triangle()) were added, it returns not only the Circle(), Rectangle() and Triangle(), but also the VGroup() object. Returns ------- list List of mobject family members. """ if config.renderer == RendererType.OPENGL: family_members = [] for mob in self.mobjects: family_members.extend(mob.get_family()) return family_members else: assert config.renderer == RendererType.CAIRO return extract_mobject_family_members( self.mobjects, use_z_index=self.renderer.camera.use_z_index, ) def add(self, *mobjects: Mobject | OpenGLMobject) -> Self: """ Mobjects will be displayed, from background to foreground in the order with which they are added. Parameters --------- *mobjects Mobjects to add. Returns ------- Scene The same scene after adding the Mobjects in. """ if config.renderer == RendererType.OPENGL: new_mobjects = [] new_meshes: list[Object3D] = [] for mobject_or_mesh in mobjects: if isinstance(mobject_or_mesh, Object3D): new_meshes.append(mobject_or_mesh) else: new_mobjects.append(mobject_or_mesh) self.remove(*new_mobjects) # type: ignore[arg-type] self.mobjects += new_mobjects # type: ignore[arg-type] self.remove(*new_meshes) # type: ignore[arg-type] self.meshes += new_meshes else: assert config.renderer == RendererType.CAIRO new_and_foreground_mobjects: list[Mobject] = [ *mobjects, # type: ignore[list-item] *self.foreground_mobjects, ] self.restructure_mobjects(to_remove=new_and_foreground_mobjects) self.mobjects += new_and_foreground_mobjects if self.moving_mobjects: self.restructure_mobjects( to_remove=new_and_foreground_mobjects, mobject_list_name="moving_mobjects", ) self.moving_mobjects += new_and_foreground_mobjects return self def add_mobjects_from_animations(self, animations: list[Animation]) -> None: curr_mobjects = self.get_mobject_family_members() for animation in animations: if animation.is_introducer(): continue # Anything animated that's not already in the # scene gets added to the scene mob = animation.mobject if mob is not None and mob not in curr_mobjects: self.add(mob) curr_mobjects += mob.get_family() # type: ignore[arg-type] def remove(self, *mobjects: Mobject) -> Self: """ Removes mobjects in the passed list of mobjects from the scene and the foreground, by removing them from "mobjects" and "foreground_mobjects" Parameters ---------- *mobjects The mobjects to remove. """ if config.renderer == RendererType.OPENGL: mobjects_to_remove = [] meshes_to_remove: set[Object3D] = set() mobject_or_mesh: Mobject for mobject_or_mesh in mobjects: if isinstance(mobject_or_mesh, Object3D): meshes_to_remove.add(mobject_or_mesh) else: mobjects_to_remove.append(mobject_or_mesh) self.mobjects = restructure_list_to_exclude_certain_family_members( self.mobjects, mobjects_to_remove, ) def lambda_function(mesh: Object3D) -> bool: return mesh not in set(meshes_to_remove) self.meshes = list( filter(lambda_function, self.meshes), ) return self else: assert config.renderer == RendererType.CAIRO for list_name in "mobjects", "foreground_mobjects": self.restructure_mobjects(mobjects, list_name, False) return self def replace(self, old_mobject: Mobject, new_mobject: Mobject) -> None: """Replace one mobject in the scene with another, preserving draw order. If ``old_mobject`` is a submobject of some other Mobject (e.g. a :class:`.Group`), the new_mobject will replace it inside the group, without otherwise changing the parent mobject. Parameters ---------- old_mobject The mobject to be replaced. Must be present in the scene. new_mobject A mobject which must not already be in the scene. """ if old_mobject is None or new_mobject is None: raise ValueError("Specified mobjects cannot be None") def replace_in_list( mobj_list: list[Mobject], old_m: Mobject, new_m: Mobject ) -> bool: # Avoid duplicate references to the same object in self.mobjects if new_m in mobj_list: if old_m is new_m: # In this case, one could say that the old Mobject was already found. # No replacement is needed, since old_m is new_m, so no action is required. # This might be unexpected, so raise a warning. logger.warning( f"Attempted to replace {type(old_m).__name__} " "with itself in Scene.mobjects." ) return True mobj_list.remove(new_m) # We use breadth-first search because some Mobjects get very deep and # we expect top-level elements to be the most common targets for replace. for i in range(0, len(mobj_list)): # Is this the old mobject? if mobj_list[i] == old_m: # If so, write the new object to the same spot and stop looking. mobj_list[i] = new_m return True # Now check all the children of all these mobs. for mob in mobj_list: # noqa: SIM110 if replace_in_list(mob.submobjects, old_m, new_m): # If we found it in a submobject, stop looking. return True # If we did not find the mobject in the mobject list or any submobjects, # (or the list was empty), indicate we did not make the replacement. return False # Make use of short-circuiting conditionals to check mobjects and then # foreground_mobjects replaced = replace_in_list( self.mobjects, old_mobject, new_mobject ) or replace_in_list(self.foreground_mobjects, old_mobject, new_mobject) if not replaced: raise ValueError(f"Could not find {old_mobject} in scene") def add_updater(self, func: Callable[[float], None]) -> None: """Add an update function to the scene. The scene updater functions are run every frame, and they are the last type of updaters to run. .. WARNING:: When using the Cairo renderer, scene updaters that modify mobjects are not detected in the same way that mobject updaters are. To be more concrete, a mobject only modified via a scene updater will not necessarily be added to the list of *moving mobjects* and thus might not be updated every frame. TL;DR: Use mobject updaters to update mobjects. Parameters ---------- func The updater function. It takes a float, which is the time difference since the last update (usually equal to the frame rate). See also -------- :meth:`.Scene.remove_updater` :meth:`.Scene.update_self` """ self.updaters.append(func) def remove_updater(self, func: Callable[[float], None]) -> None: """Remove an update function from the scene. Parameters ---------- func The updater function to be removed. See also -------- :meth:`.Scene.add_updater` :meth:`.Scene.update_self` """ self.updaters = [f for f in self.updaters if f is not func] def restructure_mobjects( self, to_remove: Sequence[Mobject], mobject_list_name: str = "mobjects", extract_families: bool = True, ) -> Scene: """ tl:wr If your scene has a Group(), and you removed a mobject from the Group, this dissolves the group and puts the rest of the mobjects directly in self.mobjects or self.foreground_mobjects. In cases where the scene contains a group, e.g. Group(m1, m2, m3), but one of its submobjects is removed, e.g. scene.remove(m1), the list of mobjects will be edited to contain other submobjects, but not m1, e.g. it will now insert m2 and m3 to where the group once was. Parameters ---------- to_remove The Mobject to remove. mobject_list_name The list of mobjects ("mobjects", "foreground_mobjects" etc) to remove from. extract_families Whether the mobject's families should be recursively extracted. Returns ------- Scene The Scene mobject with restructured Mobjects. """ if extract_families: to_remove = extract_mobject_family_members( to_remove, use_z_index=self.renderer.camera.use_z_index, ) _list = getattr(self, mobject_list_name) new_list = self.get_restructured_mobject_list(_list, to_remove) setattr(self, mobject_list_name, new_list) return self def get_restructured_mobject_list( self, mobjects: Iterable[Mobject], to_remove: Iterable[Mobject] ) -> list[Mobject]: """ Given a list of mobjects and a list of mobjects to be removed, this filters out the removable mobjects from the list of mobjects. Parameters ---------- mobjects The Mobjects to check. to_remove The list of mobjects to remove. Returns ------- list The list of mobjects with the mobjects to remove removed. """ new_mobjects: list[Mobject] = [] def add_safe_mobjects_from_list( list_to_examine: Iterable[Mobject], set_to_remove: set[Mobject] ) -> None: for mob in list_to_examine: if mob in set_to_remove: continue intersect = set_to_remove.intersection(mob.get_family()) if intersect: add_safe_mobjects_from_list(mob.submobjects, intersect) else: new_mobjects.append(mob) add_safe_mobjects_from_list(mobjects, set(to_remove)) return new_mobjects # TODO, remove this, and calls to this def add_foreground_mobjects(self, *mobjects: Mobject) -> Scene: """ Adds mobjects to the foreground, and internally to the list foreground_mobjects, and mobjects. Parameters ---------- *mobjects The Mobjects to add to the foreground. Returns ------ Scene The Scene, with the foreground mobjects added. """ self.foreground_mobjects = list_update(self.foreground_mobjects, mobjects) self.add(*mobjects) return self def add_foreground_mobject(self, mobject: Mobject) -> Scene: """ Adds a single mobject to the foreground, and internally to the list foreground_mobjects, and mobjects. Parameters ---------- mobject The Mobject to add to the foreground. Returns ------ Scene The Scene, with the foreground mobject added. """ return self.add_foreground_mobjects(mobject) def remove_foreground_mobjects(self, *to_remove: Mobject) -> Scene: """ Removes mobjects from the foreground, and internally from the list foreground_mobjects. Parameters ---------- *to_remove The mobject(s) to remove from the foreground. Returns ------ Scene The Scene, with the foreground mobjects removed. """ self.restructure_mobjects(to_remove, "foreground_mobjects") return self def remove_foreground_mobject(self, mobject: Mobject) -> Scene: """ Removes a single mobject from the foreground, and internally from the list foreground_mobjects. Parameters ---------- mobject The mobject to remove from the foreground. Returns ------ Scene The Scene, with the foreground mobject removed. """ return self.remove_foreground_mobjects(mobject) def bring_to_front(self, *mobjects: Mobject) -> Scene: """ Adds the passed mobjects to the scene again, pushing them to he front of the scene. Parameters ---------- *mobjects The mobject(s) to bring to the front of the scene. Returns ------ Scene The Scene, with the mobjects brought to the front of the scene. """ self.add(*mobjects) return self def bring_to_back(self, *mobjects: Mobject) -> Scene: """ Removes the mobject from the scene and adds them to the back of the scene. Parameters ---------- *mobjects The mobject(s) to push to the back of the scene. Returns ------ Scene The Scene, with the mobjects pushed to the back of the scene. """ self.remove(*mobjects) self.mobjects = list(mobjects) + self.mobjects return self def clear(self) -> Self: """ Removes all mobjects present in self.mobjects and self.foreground_mobjects from the scene. Returns ------ Scene The Scene, with all of its mobjects in self.mobjects and self.foreground_mobjects removed. """ self.mobjects = [] self.foreground_mobjects = [] return self def get_moving_mobjects(self, *animations: Animation) -> list[Mobject]: """ Gets all moving mobjects in the passed animation(s). Parameters ---------- *animations The animations to check for moving mobjects. Returns ------ list The list of mobjects that could be moving in the Animation(s) """ # Go through mobjects from start to end, and # as soon as there's one that needs updating of # some kind per frame, return the list from that # point forward. # Imported inside the method to avoid cyclic import. from ..animation.composition import AnimationGroup def _collect_animation_mobjects( nested_animations: Iterable[Animation], ) -> list[Mobject | OpenGLMobject]: animation_mobjects: list[Mobject | OpenGLMobject] = [] for anim in nested_animations: if isinstance(anim, AnimationGroup): animation_mobjects.extend( _collect_animation_mobjects(anim.animations), ) else: animation_mobjects.extend(anim.mobject.get_family()) return animation_mobjects animation_mobjects = _collect_animation_mobjects(animations) mobjects = self.get_mobject_family_members() for i, mob in enumerate(mobjects): update_possibilities = [ mob in animation_mobjects, len(mob.get_family_updaters()) > 0, mob in self.foreground_mobjects, ] if any(update_possibilities): return mobjects[i:] return [] def get_moving_and_static_mobjects( self, animations: Iterable[Animation] ) -> tuple[list[Mobject], list[Mobject]]: all_mobjects = list_update(self.mobjects, self.foreground_mobjects) all_mobject_families = extract_mobject_family_members( all_mobjects, use_z_index=self.renderer.camera.use_z_index, only_those_with_points=True, ) moving_mobjects = self.get_moving_mobjects(*animations) all_moving_mobject_families = extract_mobject_family_members( moving_mobjects, use_z_index=self.renderer.camera.use_z_index, ) static_mobjects = list_difference_update( all_mobject_families, all_moving_mobject_families, ) return all_moving_mobject_families, static_mobjects def compile_animations( self, *args: Animation | Mobject | _AnimationBuilder, **kwargs: Any, ) -> list[Animation]: """ Creates _MethodAnimations from any _AnimationBuilders and updates animation kwargs with kwargs passed to play(). Parameters ---------- *args Animations to be played. **kwargs Configuration for the call to play(). Returns ------- Tuple[:class:`Animation`] Animations to be played. """ animations = [] arg_anims = flatten_iterable_parameters(args) # Allow passing a generator to self.play instead of comma separated arguments for arg in arg_anims: try: animations.append(prepare_animation(arg)) # type: ignore[arg-type] except TypeError as e: if inspect.ismethod(arg): raise TypeError( "Passing Mobject methods to Scene.play is no longer" " supported. Use Mobject.animate instead.", ) from e else: raise TypeError( f"Unexpected argument {arg} passed to Scene.play().", ) from e for animation in animations: for k, v in kwargs.items(): setattr(animation, k, v) return animations def _get_animation_time_progression( self, animations: list[Animation], duration: float ) -> tqdm[float]: """ You will hardly use this when making your own animations. This method is for Manim's internal use. Uses :func:`~.get_time_progression` to obtain a CommandLine ProgressBar whose ``fill_time`` is dependent on the qualities of the passed Animation, Parameters ---------- animations The list of animations to get the time progression for. duration duration of wait time Returns ------- time_progression The CommandLine Progress Bar. """ if len(animations) == 1 and isinstance(animations[0], Wait): stop_condition = animations[0].stop_condition if stop_condition is not None: time_progression = self.get_time_progression( duration, f"Waiting for {stop_condition.__name__}", n_iterations=-1, # So it doesn't show % progress override_skip_animations=True, ) else: time_progression = self.get_time_progression( duration, f"Waiting {self.renderer.num_plays}", ) else: time_progression = self.get_time_progression( duration, "".join( [ f"Animation {self.renderer.num_plays}: ", str(animations[0]), (", etc." if len(animations) > 1 else ""), ], ), ) return time_progression def get_time_progression( self, run_time: float, description: str, n_iterations: int | None = None, override_skip_animations: bool = False, ) -> tqdm[float]: """ You will hardly use this when making your own animations. This method is for Manim's internal use. Returns a CommandLine ProgressBar whose ``fill_time`` is dependent on the ``run_time`` of an animation, the iterations to perform in that animation and a bool saying whether or not to consider the skipped animations. Parameters ---------- run_time The ``run_time`` of the animation. n_iterations The number of iterations in the animation. override_skip_animations Whether or not to show skipped animations in the progress bar. Returns ------- time_progression The CommandLine Progress Bar. """ if self.renderer.skip_animations and not override_skip_animations: times: Iterable[float] = [run_time] else: step = 1 / config["frame_rate"] times = np.arange(0, run_time, step) time_progression = tqdm( times, desc=description, total=n_iterations, leave=config["progress_bar"] == "leave", ascii=True if platform.system() == "Windows" else None, disable=config["progress_bar"] == "none", ) return time_progression @classmethod def validate_run_time( cls, run_time: float, method: Callable[[Any], Any], parameter_name: str = "run_time", ) -> float: method_name = f"{cls.__name__}.{method.__name__}()" if run_time <= 0: raise ValueError( f"{method_name} has a {parameter_name} of " f"{run_time:g} <= 0 seconds which Manim cannot render. " f"The {parameter_name} must be a positive number." ) # config.frame_rate holds the number of frames per second fps = config.frame_rate seconds_per_frame = 1 / fps if run_time < seconds_per_frame: logger.warning( f"The original {parameter_name} of {method_name}, " f"{run_time:g} seconds, is too short for the current frame " f"rate of {fps:g} FPS. Rendering with the shortest possible " f"{parameter_name} of {seconds_per_frame:g} seconds instead." ) run_time = seconds_per_frame return run_time def get_run_time(self, animations: list[Animation]) -> float: """ Gets the total run time for a list of animations. Parameters ---------- animations A list of the animations whose total ``run_time`` is to be calculated. Returns ------- float The total ``run_time`` of all of the animations in the list. """ run_time = max(animation.run_time for animation in animations) run_time = self.validate_run_time(run_time, self.play, "total run_time") return run_time def play( self, *args: Animation | Mobject | _AnimationBuilder, subcaption: str | None = None, subcaption_duration: float | None = None, subcaption_offset: float = 0, **kwargs: Any, ) -> None: r"""Plays an animation in this scene. Parameters ---------- args Animations to be played. subcaption The content of the external subcaption that should be added during the animation. subcaption_duration The duration for which the specified subcaption is added. If ``None`` (the default), the run time of the animation is taken. subcaption_offset An offset (in seconds) for the start time of the added subcaption. kwargs All other keywords are passed to the renderer. """ # If we are in interactive embedded mode, make sure this is running on the main thread (required for OpenGL) if ( self.interactive_mode and config.renderer == RendererType.OPENGL and threading.current_thread().name != "MainThread" ): # TODO: are these actually being used? kwargs.update( { "subcaption": subcaption, "subcaption_duration": subcaption_duration, "subcaption_offset": subcaption_offset, } ) self.queue.put(SceneInteractRerun("play", **kwargs)) return start_time = self.time self.renderer.play(self, *args, **kwargs) run_time = self.time - start_time if subcaption: if subcaption_duration is None: subcaption_duration = run_time # The start of the subcaption needs to be offset by the # run_time of the animation because it is added after # the animation has already been played (and Scene.time # has already been updated). self.add_subcaption( content=subcaption, duration=subcaption_duration, offset=-run_time + subcaption_offset, ) def wait( self, duration: float = DEFAULT_WAIT_TIME, stop_condition: Callable[[], bool] | None = None, frozen_frame: bool | None = None, ) -> None: """Plays a "no operation" animation. Parameters ---------- duration The run time of the animation. stop_condition A function without positional arguments that is evaluated every time a frame is rendered. The animation only stops when the return value of the function is truthy, or when the time specified in ``duration`` passes. frozen_frame If True, updater functions are not evaluated, and the animation outputs a frozen frame. If False, updater functions are called and frames are rendered as usual. If None (the default), the scene tries to determine whether or not the frame is frozen on its own. See also -------- :class:`.Wait`, :meth:`.should_mobjects_update` """ duration = self.validate_run_time(duration, self.wait, "duration") self.play( Wait( run_time=duration, stop_condition=stop_condition, frozen_frame=frozen_frame, ) ) def pause(self, duration: float = DEFAULT_WAIT_TIME) -> None: """Pauses the scene (i.e., displays a frozen frame). This is an alias for :meth:`.wait` with ``frozen_frame`` set to ``True``. Parameters ---------- duration The duration of the pause. See also -------- :meth:`.wait`, :class:`.Wait` """ duration = self.validate_run_time(duration, self.pause, "duration") self.wait(duration=duration, frozen_frame=True) def wait_until( self, stop_condition: Callable[[], bool], max_time: float = 60 ) -> None: """Wait until a condition is satisfied, up to a given maximum duration. Parameters ---------- stop_condition A function with no arguments that determines whether or not the scene should keep waiting. max_time The maximum wait time in seconds. """ max_time = self.validate_run_time(max_time, self.wait_until, "max_time") self.wait(max_time, stop_condition=stop_condition) def compile_animation_data( self, *animations: Animation | Mobject | _AnimationBuilder, **play_kwargs: Any, ) -> Self | None: """Given a list of animations, compile the corresponding static and moving mobjects, and gather the animation durations. This also begins the animations. Parameters ---------- animations Animation or mobject with mobject method and params play_kwargs Named parameters affecting what was passed in ``animations``, e.g. ``run_time``, ``lag_ratio`` and so on. Returns ------- self, None None if there is nothing to play, or self otherwise. """ # NOTE TODO : returns statement of this method are wrong. It should return nothing, as it makes a little sense to get any information from this method. # The return are kept to keep webgl renderer from breaking. if len(animations) == 0: raise ValueError("Called Scene.play with no animations") self.animations = self.compile_animations(*animations, **play_kwargs) self.add_mobjects_from_animations(self.animations) self.last_t = 0 self.stop_condition = None self.moving_mobjects = [] self.static_mobjects = [] self.duration = self.get_run_time(self.animations) if len(self.animations) == 1 and isinstance(self.animations[0], Wait): if self.should_update_mobjects(): self.update_mobjects(dt=0) # Any problems with this? self.stop_condition = self.animations[0].stop_condition else: # Static image logic when the wait is static is done by the renderer, not here. self.animations[0].is_static_wait = True return None return self def begin_animations(self) -> None: """Start the animations of the scene.""" assert self.animations is not None for animation in self.animations: animation._setup_scene(self) animation.begin() if config.renderer == RendererType.CAIRO: # Paint all non-moving objects onto the screen, so they don't # have to be rendered every frame ( self.moving_mobjects, self.static_mobjects, ) = self.get_moving_and_static_mobjects(self.animations) def is_current_animation_frozen_frame(self) -> bool: """Returns whether the current animation produces a static frame (generally a Wait).""" assert self.animations is not None return ( isinstance(self.animations[0], Wait) and len(self.animations) == 1 and self.animations[0].is_static_wait ) def play_internal(self, skip_rendering: bool = False) -> None: """ This method is used to prep the animations for rendering, apply the arguments and parameters required to them, render them, and write them to the video file. Parameters ---------- skip_rendering Whether the rendering should be skipped, by default False """ assert self.animations is not None self.duration = self.get_run_time(self.animations) self.time_progression = self._get_animation_time_progression( self.animations, self.duration, ) for t in self.time_progression: self.update_to_time(t) if not skip_rendering and not self.skip_animation_preview: self.renderer.render(self, t, self.moving_mobjects) if self.stop_condition is not None and self.stop_condition(): self.time_progression.close() break for animation in self.animations: animation.finish() animation.clean_up_from_scene(self) if not self.renderer.skip_animations: self.update_mobjects(0) # TODO: The OpenGLRenderer does not have the property static.image. self.renderer.static_image = None # type: ignore[union-attr] # Closing the progress bar at the end of the play. self.time_progression.close() def check_interactive_embed_is_valid(self) -> bool: assert isinstance(self.renderer, OpenGLRenderer) if config["force_window"]: return True if self.skip_animation_preview: logger.warning( "Disabling interactive embed as 'skip_animation_preview' is enabled", ) return False elif config["write_to_movie"]: logger.warning("Disabling interactive embed as 'write_to_movie' is enabled") return False elif config["format"]: logger.warning( "Disabling interactive embed as '--format' is set as " + config["format"], ) return False elif not self.renderer.window: logger.warning("Disabling interactive embed as no window was created") return False elif config.dry_run: logger.warning("Disabling interactive embed as dry_run is enabled") return False return True def interactive_embed(self) -> None: """Like embed(), but allows for screen interaction.""" assert isinstance(self.camera, OpenGLCamera) assert isinstance(self.renderer, OpenGLRenderer) if not self.check_interactive_embed_is_valid(): return self.interactive_mode = True from IPython.terminal.embed import InteractiveShellEmbed def ipython(shell: InteractiveShellEmbed, namespace: dict[str, Any]) -> None: import manim.opengl def load_module_into_namespace( module: Any, namespace: dict[str, Any] ) -> None: for name in dir(module): namespace[name] = getattr(module, name) load_module_into_namespace(manim, namespace) load_module_into_namespace(manim.opengl, namespace) def embedded_rerun(*args: Any, **kwargs: Any) -> None: self.queue.put(SceneInteractRerun("keyboard")) shell.exiter() namespace["rerun"] = embedded_rerun shell(local_ns=namespace) self.queue.put(SceneInteractContinue("keyboard")) def get_embedded_method(method_name: str) -> Callable[..., None]: method = getattr(self, method_name) def embedded_method(*args: Any, **kwargs: Any) -> None: self.queue.put(MethodWithArgs(method, args, kwargs)) return embedded_method currentframe: FrameType = inspect.currentframe() # type: ignore[assignment] local_namespace = currentframe.f_back.f_locals # type: ignore[union-attr] for method in ("play", "wait", "add", "remove"): embedded_method = get_embedded_method(method) # Allow for calling scene methods without prepending 'self.'. local_namespace[method] = embedded_method from sqlite3 import connect from IPython.core.getipython import get_ipython from traitlets.config import Config cfg = Config() cfg.TerminalInteractiveShell.confirm_exit = False if get_ipython() is None: shell = InteractiveShellEmbed.instance(config=cfg) else: shell = InteractiveShellEmbed(config=cfg) hist = get_ipython().history_manager hist.db = connect(hist.hist_file, check_same_thread=False) keyboard_thread = threading.Thread( target=ipython, args=(shell, local_namespace), ) # run as daemon to kill thread when main thread exits if not shell.pt_app: keyboard_thread.daemon = True keyboard_thread.start() if self.dearpygui_imported and config["enable_gui"]: if not dpg.is_dearpygui_running(): gui_thread = threading.Thread( target=self._configure_pygui, kwargs={"update": False}, ) gui_thread.start() else: self._configure_pygui(update=True) self.camera.model_matrix = self.camera.default_model_matrix self.interact(shell, keyboard_thread) # from IPython.terminal.embed import InteractiveShellEmbed def interact(self, shell: Any, keyboard_thread: threading.Thread) -> None: assert isinstance(self.renderer, OpenGLRenderer) event_handler = RerunSceneHandler(self.queue) file_observer = Observer() file_observer.schedule(event_handler, config["input_file"], recursive=True) file_observer.start() self.quit_interaction = False keyboard_thread_needs_join = shell.pt_app is not None assert self.queue.qsize() == 0 last_time = time.time() while not ( (self.renderer.window is not None and self.renderer.window.is_closing) or self.quit_interaction ): if not self.queue.empty(): action = self.queue.get_nowait() if isinstance(action, SceneInteractRerun): # Intentionally skip calling join() on the file thread to save time. if action.sender != "keyboard": if shell.pt_app: shell.pt_app.app.exit(exception=EOFError) file_observer.unschedule_all() raise RerunSceneException keyboard_thread.join() if "from_animation_number" in action.kwargs: config["from_animation_number"] = action.kwargs[ "from_animation_number" ] # # TODO: This option only makes sense if interactive_embed() is run at the # # end of a scene by default. # if "upto_animation_number" in action.kwargs: # config["upto_animation_number"] = action.kwargs[ # "upto_animation_number" # ] keyboard_thread.join() file_observer.unschedule_all() raise RerunSceneException elif isinstance(action, SceneInteractContinue): # Intentionally skip calling join() on the file thread to save time. if action.sender != "keyboard" and shell.pt_app: shell.pt_app.app.exit(exception=EOFError) keyboard_thread.join() # Remove exit_keyboard from the queue if necessary. while self.queue.qsize() > 0: self.queue.get() keyboard_thread_needs_join = False break else: action.method(*action.args, **action.kwargs) else: self.renderer.animation_start_time = 0 dt = time.time() - last_time last_time = time.time() self.renderer.render(self, dt, self.moving_mobjects) self.update_mobjects(dt) self.update_meshes(dt) self.update_self(dt) # Join the keyboard thread if necessary. if shell is not None and keyboard_thread_needs_join: shell.pt_app.app.exit(exception=EOFError) keyboard_thread.join() # Remove exit_keyboard from the queue if necessary. while self.queue.qsize() > 0: self.queue.get() file_observer.stop() file_observer.join() if self.dearpygui_imported and config["enable_gui"]: dpg.stop_dearpygui() if self.renderer.window is not None and self.renderer.window.is_closing: self.renderer.window.destroy() def embed(self) -> None: assert isinstance(self.renderer, OpenGLRenderer) if not config["preview"]: logger.warning("Called embed() while no preview window is available.") return if config["write_to_movie"]: logger.warning("embed() is skipped while writing to a file.") return self.renderer.animation_start_time = 0 self.renderer.render(self, -1, self.moving_mobjects) # Configure IPython shell. from IPython.terminal.embed import InteractiveShellEmbed shell = InteractiveShellEmbed() # Have the frame update after each command shell.events.register( "post_run_cell", lambda *a, **kw: self.renderer.render(self, -1, self.moving_mobjects), ) # Use the locals of the caller as the local namespace # once embedded, and add a few custom shortcuts. current_frame = inspect.currentframe() assert isinstance(current_frame, FrameType) local_ns = current_frame.f_back.f_locals # type: ignore[union-attr] # local_ns["touch"] = self.interact for method in ( "play", "wait", "add", "remove", "interact", # "clear", # "save_state", # "restore", ): local_ns[method] = getattr(self, method) shell(local_ns=local_ns, stack_depth=2) # End scene when exiting an embed. raise Exception("Exiting scene.") def _configure_pygui(self, update: bool = True) -> None: if not self.dearpygui_imported: raise RuntimeError("Attempted to use DearPyGUI when it isn't imported.") if update: dpg.delete_item(window) else: dpg.create_viewport() dpg.setup_dearpygui() dpg.show_viewport() dpg.set_viewport_title(title=f"Manim Community v{__version__}") dpg.set_viewport_width(1015) dpg.set_viewport_height(540) def rerun_callback(sender: Any, data: Any) -> None: self.queue.put(SceneInteractRerun("gui")) def continue_callback(sender: Any, data: Any) -> None: self.queue.put(SceneInteractContinue("gui")) def scene_selection_callback(sender: Any, data: Any) -> None: config["scene_names"] = (dpg.get_value(sender),) self.queue.put(SceneInteractRerun("gui")) scene_classes = scene_classes_from_file( Path(config["input_file"]), full_list=True ) # type: ignore[call-overload] scene_names = [scene_class.__name__ for scene_class in scene_classes] with dpg.window( id=window, label="Manim GUI", pos=[config["gui_location"][0], config["gui_location"][1]], width=1000, height=500, ): dpg.set_global_font_scale(2) dpg.add_button(label="Rerun", callback=rerun_callback) dpg.add_button(label="Continue", callback=continue_callback) dpg.add_combo( label="Selected scene", items=scene_names, callback=scene_selection_callback, default_value=config["scene_names"][0], ) dpg.add_separator() if len(self.widgets) != 0: with dpg.collapsing_header( label=f"{config['scene_names'][0]} widgets", default_open=True, ): for widget_config in self.widgets: widget_config_copy = widget_config.copy() name = widget_config_copy["name"] widget = widget_config_copy["widget"] if widget != "separator": del widget_config_copy["name"] del widget_config_copy["widget"] getattr(dpg, f"add_{widget}")( label=name, **widget_config_copy ) else: dpg.add_separator() if not update: dpg.start_dearpygui() def update_to_time(self, t: float) -> None: dt = t - self.last_t self.last_t = t assert self.animations is not None for animation in self.animations: animation.update_mobjects(dt) alpha = t / animation.run_time animation.interpolate(alpha) self.update_mobjects(dt) self.update_meshes(dt) self.update_self(dt) def add_subcaption( self, content: str, duration: float = 1, offset: float = 0 ) -> None: r"""Adds an entry in the corresponding subcaption file at the current time stamp. The current time stamp is obtained from ``Scene.time``. Parameters ---------- content The subcaption content. duration The duration (in seconds) for which the subcaption is shown. offset This offset (in seconds) is added to the starting time stamp of the subcaption. Examples -------- This example illustrates both possibilities for adding subcaptions to Manimations:: class SubcaptionExample(Scene): def construct(self): square = Square() circle = Circle() # first option: via the add_subcaption method self.add_subcaption("Hello square!", duration=1) self.play(Create(square)) # second option: within the call to Scene.play self.play( Transform(square, circle), subcaption="The square transforms." ) """ subtitle = srt.Subtitle( index=len(self.renderer.file_writer.subcaptions), content=content, start=datetime.timedelta(seconds=float(self.time + offset)), end=datetime.timedelta(seconds=float(self.time + offset + duration)), ) self.renderer.file_writer.subcaptions.append(subtitle) def add_sound( self, sound_file: str, time_offset: float = 0, gain: float | None = None, **kwargs: Any, ) -> None: """ This method is used to add a sound to the animation. Parameters ---------- sound_file The path to the sound file. time_offset The offset in the sound file after which the sound can be played. gain Amplification of the sound. Examples -------- .. manim:: SoundExample :no_autoplay: class SoundExample(Scene): # Source of sound under Creative Commons 0 License. https://freesound.org/people/Druminfected/sounds/250551/ def construct(self): dot = Dot().set_color(GREEN) self.add_sound("click.wav") self.add(dot) self.wait() self.add_sound("click.wav") dot.set_color(BLUE) self.wait() self.add_sound("click.wav") dot.set_color(RED) self.wait() Download the resource for the previous example `here `_ . """ if self.renderer.skip_animations: return time = self.time + time_offset self.renderer.file_writer.add_sound(sound_file, time, gain, **kwargs) def on_mouse_motion(self, point: Point3D, d_point: Point3D) -> None: assert isinstance(self.camera, OpenGLCamera) assert isinstance(self.renderer, OpenGLRenderer) self.mouse_point.move_to(point) if SHIFT_VALUE in self.renderer.pressed_keys: shift = -d_point shift[0] *= self.camera.get_width() / 2 shift[1] *= self.camera.get_height() / 2 transform = self.camera.inverse_rotation_matrix shift = np.dot(np.transpose(transform), shift) self.camera.shift(shift) def on_mouse_scroll(self, point: Point3D, offset: Point3D) -> None: assert isinstance(self.camera, OpenGLCamera) if not config.use_projection_stroke_shaders: factor = 1 + np.arctan(-2.1 * offset[1]) self.camera.scale(factor, about_point=self.camera_target) self.mouse_scroll_orbit_controls(point, offset) def on_key_press(self, symbol: int, modifiers: int) -> None: assert isinstance(self.camera, OpenGLCamera) try: char = chr(symbol) except OverflowError: logger.warning("The value of the pressed key is too large.") return if char == "r": self.camera.to_default_state() self.camera_target = np.array([0, 0, 0], dtype=np.float32) elif char == "q": self.quit_interaction = True else: if char in self.key_to_function_map: self.key_to_function_map[char]() def on_key_release(self, symbol: int, modifiers: int) -> None: pass def on_mouse_drag( self, point: Point3D, d_point: Point3D, buttons: int, modifiers: int, ) -> None: assert isinstance(self.camera, OpenGLCamera) self.mouse_drag_point.move_to(point) if buttons == 1: self.camera.increment_theta(-d_point[0]) self.camera.increment_phi(d_point[1]) elif buttons == 4: camera_x_axis = self.camera.model_matrix[:3, 0] horizontal_shift_vector = -d_point[0] * camera_x_axis vertical_shift_vector = -d_point[1] * np.cross(OUT, camera_x_axis) total_shift_vector = horizontal_shift_vector + vertical_shift_vector self.camera.shift(1.1 * total_shift_vector) self.mouse_drag_orbit_controls(point, d_point, buttons, modifiers) def mouse_scroll_orbit_controls(self, point: Point3D, offset: Point3D) -> None: assert isinstance(self.camera, OpenGLCamera) camera_to_target = self.camera_target - self.camera.get_position() camera_to_target *= np.sign(offset[1]) shift_vector = 0.01 * camera_to_target self.camera.model_matrix = ( opengl.translation_matrix(*shift_vector) @ self.camera.model_matrix ) def mouse_drag_orbit_controls( self, point: Point3D, d_point: Point3D, buttons: int, modifiers: int, ) -> None: assert isinstance(self.camera, OpenGLCamera) # Left click drag. if buttons == 1: # Translate to target the origin and rotate around the z axis. self.camera.model_matrix = ( opengl.rotation_matrix(z=-d_point[0]) @ opengl.translation_matrix(*-self.camera_target) @ self.camera.model_matrix ) # Rotation off of the z axis. camera_position = self.camera.get_position() camera_y_axis = self.camera.model_matrix[:3, 1] axis_of_rotation = space_ops.normalize( np.cross(camera_y_axis, camera_position), ) rotation_matrix = space_ops.rotation_matrix( d_point[1], axis_of_rotation, homogeneous=True, ) maximum_polar_angle = self.camera.maximum_polar_angle minimum_polar_angle = self.camera.minimum_polar_angle potential_camera_model_matrix = rotation_matrix @ self.camera.model_matrix potential_camera_location = potential_camera_model_matrix[:3, 3] potential_camera_y_axis = potential_camera_model_matrix[:3, 1] sign = ( np.sign(potential_camera_y_axis[2]) if potential_camera_y_axis[2] != 0 else 1 ) potential_polar_angle = sign * np.arccos( potential_camera_location[2] / np.linalg.norm(potential_camera_location), ) if minimum_polar_angle <= potential_polar_angle <= maximum_polar_angle: self.camera.model_matrix = potential_camera_model_matrix else: sign = np.sign(camera_y_axis[2]) if camera_y_axis[2] != 0 else 1 current_polar_angle = sign * np.arccos( camera_position[2] / np.linalg.norm(camera_position), ) if potential_polar_angle > maximum_polar_angle: polar_angle_delta = maximum_polar_angle - current_polar_angle else: polar_angle_delta = minimum_polar_angle - current_polar_angle rotation_matrix = space_ops.rotation_matrix( polar_angle_delta, axis_of_rotation, homogeneous=True, ) self.camera.model_matrix = rotation_matrix @ self.camera.model_matrix # Translate to target the original target. self.camera.model_matrix = ( opengl.translation_matrix(*self.camera_target) @ self.camera.model_matrix ) # Right click drag. elif buttons == 4: camera_x_axis = self.camera.model_matrix[:3, 0] horizontal_shift_vector = -d_point[0] * camera_x_axis vertical_shift_vector = -d_point[1] * np.cross(OUT, camera_x_axis) total_shift_vector = horizontal_shift_vector + vertical_shift_vector self.camera.model_matrix = ( opengl.translation_matrix(*total_shift_vector) @ self.camera.model_matrix ) self.camera_target += total_shift_vector def set_key_function(self, char: str, func: Callable[[], Any]) -> None: self.key_to_function_map[char] = func def on_mouse_press(self, point: Point3D, button: str, modifiers: int) -> None: for func in self.mouse_press_callbacks: func() ManimCommunity-manim-1157b74/manim/scene/scene_file_writer.py000066400000000000000000001030511515024150700242730ustar00rootroot00000000000000"""The interface between scenes and ffmpeg.""" from __future__ import annotations __all__ = ["SceneFileWriter"] import json import shutil import warnings from fractions import Fraction from pathlib import Path from queue import Queue from tempfile import NamedTemporaryFile, _TemporaryFileWrapper from threading import Thread from typing import TYPE_CHECKING, Any import av import numpy as np import srt from PIL import Image # Manim handles audio conversion through PyAV directly. Importing pydub emits a # RuntimeWarning if ffmpeg/avconv is not on PATH, even when only WAV code paths # are used (which do not need ffmpeg). Silence this specific warning. with warnings.catch_warnings(): warnings.filterwarnings( "ignore", message=r".*ffmpeg or avconv.*", category=RuntimeWarning, ) from pydub import AudioSegment from manim import __version__ from .. import config, logger from .._config.logger_utils import set_file_logger from ..constants import RendererType from ..utils.file_ops import ( add_extension_if_not_present, add_version_before_extension, guarantee_existence, is_gif_format, is_png_format, modify_atime, write_to_movie, ) from ..utils.sounds import get_full_sound_file_path from .section import DefaultSectionType, Section if TYPE_CHECKING: from av.container.output import OutputContainer from av.stream import Stream from manim.renderer.cairo_renderer import CairoRenderer from manim.renderer.opengl_renderer import OpenGLRenderer from manim.typing import PixelArray, StrPath def to_av_frame_rate(fps: float) -> Fraction: epsilon1 = 1e-4 epsilon2 = 0.02 if isinstance(fps, int): (num, denom) = (fps, 1) elif abs(fps - round(fps)) < epsilon1: (num, denom) = (round(fps), 1) else: denom = 1001 num = round(fps * denom / 1000) * 1000 if abs(fps - num / denom) >= epsilon2: raise ValueError("invalid frame rate") return Fraction(num, denom) def convert_audio( input_path: Path, output_path: Path | _TemporaryFileWrapper[bytes], codec_name: str ) -> None: with ( av.open(input_path) as input_audio, av.open(output_path, "w") as output_audio, ): input_audio_stream = input_audio.streams.audio[0] output_audio_stream = output_audio.add_stream(codec_name) for frame in input_audio.decode(input_audio_stream): for packet in output_audio_stream.encode(frame): output_audio.mux(packet) for packet in output_audio_stream.encode(): output_audio.mux(packet) class SceneFileWriter: """SceneFileWriter is the object that actually writes the animations played, into video files, using FFMPEG. This is mostly for Manim's internal use. You will rarely, if ever, have to use the methods for this class, unless tinkering with the very fabric of Manim's reality. Attributes ---------- sections : list of :class:`.Section` used to segment scene sections_output_dir : :class:`pathlib.Path` where are section videos stored output_name : str name of movie without extension and basis for section video names Some useful attributes are: "write_to_movie" (bool=False) Whether or not to write the animations into a video file. "movie_file_extension" (str=".mp4") The file-type extension of the outputted video. "partial_movie_files" List of all the partial-movie files. """ force_output_as_scene_name = False def __init__( self, renderer: CairoRenderer | OpenGLRenderer, scene_name: str, **kwargs: Any, ) -> None: self.renderer = renderer self.init_output_directories(scene_name) self.init_audio() self.frame_count = 0 self.partial_movie_files: list[str | None] = [] self.subcaptions: list[srt.Subtitle] = [] self.sections: list[Section] = [] # first section gets automatically created for convenience # if you need the first section to be skipped, add a first section by hand, it will replace this one self.next_section( name="autocreated", type_=DefaultSectionType.NORMAL, skip_animations=False ) def init_output_directories(self, scene_name: str) -> None: """Initialise output directories. Notes ----- The directories are read from ``config``, for example ``config['media_dir']``. If the target directories don't already exist, they will be created. """ if config["dry_run"]: # in dry-run mode there is no output return module_name = config.get_dir("input_file").stem if config["input_file"] else "" if SceneFileWriter.force_output_as_scene_name: self.output_name = Path(scene_name) elif config["output_file"] and not config["write_all"]: self.output_name = config.get_dir("output_file") else: self.output_name = Path(scene_name) if config["media_dir"]: image_dir = guarantee_existence( config.get_dir( "images_dir", module_name=module_name, scene_name=scene_name ), ) self.image_file_path = image_dir / add_extension_if_not_present( self.output_name, ".png" ) if write_to_movie(): movie_dir = guarantee_existence( config.get_dir( "video_dir", module_name=module_name, scene_name=scene_name ), ) self.movie_file_path = movie_dir / add_extension_if_not_present( self.output_name, config["movie_file_extension"] ) # TODO: /dev/null would be good in case sections_output_dir is used without being set (doesn't work on Windows), everyone likes defensive programming, right? self.sections_output_dir = Path("") if config.save_sections: self.sections_output_dir = guarantee_existence( config.get_dir( "sections_dir", module_name=module_name, scene_name=scene_name ) ) if is_gif_format(): self.gif_file_path = add_extension_if_not_present( self.output_name, ".gif" ) if not config["output_file"]: self.gif_file_path = add_version_before_extension( self.gif_file_path ) self.gif_file_path = movie_dir / self.gif_file_path self.partial_movie_directory = guarantee_existence( config.get_dir( "partial_movie_dir", scene_name=scene_name, module_name=module_name, ), ) if config["log_to_file"]: log_dir = guarantee_existence(config.get_dir("log_dir")) set_file_logger( scene_name=scene_name, module_name=module_name, log_dir=log_dir ) def finish_last_section(self) -> None: """Delete current section if it is empty.""" if len(self.sections) and self.sections[-1].is_empty(): self.sections.pop() def next_section(self, name: str, type_: str, skip_animations: bool) -> None: """Create segmentation cut here.""" self.finish_last_section() # images don't support sections section_video: str | None = None # don't save when None if ( not config.dry_run and write_to_movie() and config.save_sections and not skip_animations ): # relative to index file section_video = f"{self.output_name}_{len(self.sections):04}_{name}{config.movie_file_extension}" self.sections.append( Section( type_, section_video, name, skip_animations, ), ) def add_partial_movie_file(self, hash_animation: str | None) -> None: """Adds a new partial movie file path to ``scene.partial_movie_files`` and current section from a hash. This method will compute the path from the hash. In addition to that it adds the new animation to the current section. Parameters ---------- hash_animation Hash of the animation. """ if not hasattr(self, "partial_movie_directory") or not write_to_movie(): return # None has to be added to partial_movie_files to keep the right index with scene.num_plays. # i.e if an animation is skipped, scene.num_plays is still incremented and we add an element to partial_movie_file be even with num_plays. if hash_animation is None: self.partial_movie_files.append(None) self.sections[-1].partial_movie_files.append(None) else: new_partial_movie_file = str( self.partial_movie_directory / f"{hash_animation}{config['movie_file_extension']}" ) self.partial_movie_files.append(new_partial_movie_file) self.sections[-1].partial_movie_files.append(new_partial_movie_file) def get_resolution_directory(self) -> str: """Get the name of the resolution directory directly containing the video file. This method gets the name of the directory that immediately contains the video file. This name is ``p``. For example, if you are rendering an 854x480 px animation at 15fps, the name of the directory that immediately contains the video, file will be ``480p15``. The file structure should look something like:: MEDIA_DIR |--Tex |--texts |--videos |-- |--p |--partial_movie_files |--.mp4 |--.srt Returns ------- :class:`str` The name of the directory. """ pixel_height = config["pixel_height"] frame_rate = config["frame_rate"] return f"{pixel_height}p{frame_rate}" # Sound def init_audio(self) -> None: """Preps the writer for adding audio to the movie.""" self.includes_sound = False def create_audio_segment(self) -> None: """Creates an empty, silent, Audio Segment.""" self.audio_segment = AudioSegment.silent() def add_audio_segment( self, new_segment: AudioSegment, time: float | None = None, gain_to_background: float | None = None, ) -> None: """This method adds an audio segment from an AudioSegment type object and suitable parameters. Parameters ---------- new_segment The audio segment to add time the timestamp at which the sound should be added. gain_to_background The gain of the segment from the background. """ if not self.includes_sound: self.includes_sound = True self.create_audio_segment() segment = self.audio_segment curr_end = segment.duration_seconds if time is None: time = curr_end if time < 0: raise ValueError("Adding sound at timestamp < 0") new_end = time + new_segment.duration_seconds diff = new_end - curr_end if diff > 0: segment = segment.append( AudioSegment.silent(int(np.ceil(diff * 1000))), crossfade=0, ) self.audio_segment = segment.overlay( new_segment, position=int(1000 * time), gain_during_overlay=gain_to_background, ) def add_sound( self, sound_file: StrPath, time: float | None = None, gain: float | None = None, **kwargs: Any, ) -> None: """This method adds an audio segment from a sound file. Parameters ---------- sound_file The path to the sound file. time The timestamp at which the audio should be added. gain The gain of the given audio segment. **kwargs This method uses add_audio_segment, so any keyword arguments used there can be referenced here. """ file_path = get_full_sound_file_path(sound_file) # we assume files with .wav / .raw suffix are actually # .wav and .raw files, respectively. if file_path.suffix not in (".wav", ".raw"): # we need to pass delete=False to work on Windows # TODO: figure out a way to cache the wav file generated (benchmark needed) with NamedTemporaryFile(suffix=".wav", delete=False) as wav_file_path: convert_audio(file_path, wav_file_path, "pcm_s16le") new_segment = AudioSegment.from_file(wav_file_path.name) logger.info(f"Automatically converted {file_path} to .wav") Path(wav_file_path.name).unlink() else: new_segment = AudioSegment.from_file(file_path) if gain: new_segment = new_segment.apply_gain(gain) self.add_audio_segment(new_segment, time, **kwargs) # Writers def begin_animation( self, allow_write: bool = False, file_path: StrPath | None = None ) -> None: """Used internally by manim to stream the animation to FFMPEG for displaying or writing to a file. Parameters ---------- allow_write Whether or not to write to a video file. """ if write_to_movie() and allow_write: self.open_partial_movie_stream(file_path=file_path) def end_animation(self, allow_write: bool = False) -> None: """Internally used by Manim to stop streaming to FFMPEG gracefully. Parameters ---------- allow_write Whether or not to write to a video file. """ if write_to_movie() and allow_write: self.close_partial_movie_stream() def listen_and_write(self) -> None: """For internal use only: blocks until new frame is available on the queue.""" while True: num_frames, frame_data = self.queue.get() if frame_data is None: break self.encode_and_write_frame(frame_data, num_frames) def encode_and_write_frame(self, frame: PixelArray, num_frames: int) -> None: """For internal use only: takes a given frame in ``np.ndarray`` format and writes it to the stream """ for _ in range(num_frames): # Notes: precomputing reusing packets does not work! # I.e., you cannot do `packets = encode(...)` # and reuse it, as it seems that `mux(...)` # consumes the packet. # The same issue applies for `av_frame`, # reusing it renders weird-looking frames. av_frame = av.VideoFrame.from_ndarray(frame, format="rgba") for packet in self.video_stream.encode(av_frame): self.video_container.mux(packet) def write_frame( self, frame_or_renderer: PixelArray | OpenGLRenderer, num_frames: int = 1 ) -> None: """Used internally by Manim to write a frame to the FFMPEG input buffer. Parameters ---------- frame_or_renderer Pixel array of the frame. num_frames The number of times to write frame. """ if write_to_movie(): if isinstance(frame_or_renderer, np.ndarray): frame = frame_or_renderer else: frame = ( frame_or_renderer.get_frame() if config.renderer == RendererType.OPENGL else frame_or_renderer ) msg = (num_frames, frame) self.queue.put(msg) if is_png_format() and not config["dry_run"]: if isinstance(frame_or_renderer, np.ndarray): image = Image.fromarray(frame_or_renderer) else: image = ( frame_or_renderer.get_image() if config.renderer == RendererType.OPENGL else Image.fromarray(frame_or_renderer) ) target_dir = self.image_file_path.parent / self.image_file_path.stem extension = self.image_file_path.suffix self.output_image( image, target_dir, extension, config["zero_pad"], ) def output_image( self, image: Image.Image, target_dir: StrPath, ext: str, zero_pad: int ) -> None: if zero_pad: image.save(f"{target_dir}{str(self.frame_count).zfill(zero_pad)}{ext}") else: image.save(f"{target_dir}{self.frame_count}{ext}") self.frame_count += 1 def save_image(self, image: Image.Image) -> None: """This method saves the image passed to it in the default image directory. Parameters ---------- image The pixel array of the image to save. """ if config["dry_run"]: return if not config["output_file"]: self.image_file_path = add_version_before_extension(self.image_file_path) image.save(self.image_file_path) self.print_file_ready_message(self.image_file_path) def finish(self) -> None: """Finishes writing to the FFMPEG buffer or writing images to output directory. Combines the partial movie files into the whole scene. If save_last_frame is True, saves the last frame in the default image directory. """ if write_to_movie(): self.combine_to_movie() if config.save_sections: self.combine_to_section_videos() if config["flush_cache"]: self.flush_cache_directory() else: self.clean_cache() elif is_png_format() and not config["dry_run"]: target_dir = self.image_file_path.parent / self.image_file_path.stem logger.info("\n%i images ready at %s\n", self.frame_count, str(target_dir)) if self.subcaptions: self.write_subcaption_file() def open_partial_movie_stream(self, file_path: StrPath | None = None) -> None: """Open a container holding a video stream. This is used internally by Manim initialize the container holding the video stream of a partial movie file. """ if file_path is None: file_path = self.partial_movie_files[self.renderer.num_plays] self.partial_movie_file_path = file_path fps = to_av_frame_rate(config.frame_rate) partial_movie_file_codec = "libx264" partial_movie_file_pix_fmt = "yuv420p" av_options = { "an": "1", # ffmpeg: -an, no audio "crf": "23", # ffmpeg: -crf, constant rate factor (improved bitrate) } if config.movie_file_extension == ".webm": partial_movie_file_codec = "libvpx-vp9" av_options["-auto-alt-ref"] = "1" if config.transparent: partial_movie_file_pix_fmt = "yuva420p" elif config.transparent: partial_movie_file_codec = "qtrle" partial_movie_file_pix_fmt = "argb" video_container = av.open(file_path, mode="w") stream = video_container.add_stream( partial_movie_file_codec, rate=fps, options=av_options, ) stream.pix_fmt = partial_movie_file_pix_fmt stream.width = config.pixel_width stream.height = config.pixel_height self.video_container: OutputContainer = video_container self.video_stream: Stream = stream self.queue: Queue[tuple[int, PixelArray | None]] = Queue() self.writer_thread = Thread(target=self.listen_and_write, args=()) self.writer_thread.start() def close_partial_movie_stream(self) -> None: """Close the currently opened video container. Used internally by Manim to first flush the remaining packages in the video stream holding a partial file, and then close the corresponding container. """ self.queue.put((-1, None)) self.writer_thread.join() for packet in self.video_stream.encode(): self.video_container.mux(packet) self.video_container.close() logger.info( f"Animation {self.renderer.num_plays} : Partial movie file written in %(path)s", {"path": f"'{self.partial_movie_file_path}'"}, ) def is_already_cached(self, hash_invocation: str) -> bool: """Will check if a file named with `hash_invocation` exists. Parameters ---------- hash_invocation The hash corresponding to an invocation to either `scene.play` or `scene.wait`. Returns ------- :class:`bool` Whether the file exists. """ if not hasattr(self, "partial_movie_directory") or not write_to_movie(): return False path = ( self.partial_movie_directory / f"{hash_invocation}{config['movie_file_extension']}" ) return path.exists() def combine_files( self, input_files: list[str], output_file: Path, create_gif: bool = False, includes_sound: bool = False, ) -> None: file_list = self.partial_movie_directory / "partial_movie_file_list.txt" logger.debug( f"Partial movie files to combine ({len(input_files)} files): %(p)s", {"p": input_files[:5]}, ) with file_list.open("w", encoding="utf-8") as fp: fp.write("# This file is used internally by FFMPEG.\n") for pf_path in input_files: pf_path = Path(pf_path).as_posix() fp.write(f"file 'file:{pf_path}'\n") av_options = { "safe": "0", # needed to read files } if not includes_sound: av_options["an"] = "1" partial_movies_input = av.open( str(file_list), options=av_options, format="concat" ) partial_movies_stream = partial_movies_input.streams.video[0] output_container = av.open(str(output_file), mode="w") output_container.metadata["comment"] = ( f"Rendered with Manim Community v{__version__}" ) if create_gif: """The following solution was largely inspired from this comment https://github.com/imageio/imageio/issues/995#issuecomment-1580533018, and the following code https://github.com/imageio/imageio/blob/65d79140018bb7c64c0692ea72cb4093e8d632a0/imageio/plugins/pyav.py#L927-L996. """ output_stream = output_container.add_stream( codec_name="gif", ) output_stream.pix_fmt = "rgb8" if config.transparent: output_stream.pix_fmt = "pal8" output_stream.width = config.pixel_width output_stream.height = config.pixel_height output_stream.rate = to_av_frame_rate(config.frame_rate) graph = av.filter.Graph() input_buffer = graph.add_buffer(template=partial_movies_stream) split = graph.add("split") palettegen = graph.add("palettegen", "stats_mode=diff") paletteuse = graph.add( "paletteuse", "dither=bayer:bayer_scale=5:diff_mode=rectangle" ) output_sink = graph.add("buffersink") input_buffer.link_to(split) split.link_to(palettegen, 0, 0) # 1st input of split -> input of palettegen split.link_to(paletteuse, 1, 0) # 2nd output of split -> 1st input palettegen.link_to(paletteuse, 0, 1) # output of palettegen -> 2nd input paletteuse.link_to(output_sink) graph.configure() for frame in partial_movies_input.decode(video=0): graph.push(frame) graph.push(None) # EOF: https://github.com/PyAV-Org/PyAV/issues/886. frames_written = 0 while True: try: frame = graph.pull() if output_stream.codec_context.time_base is not None: frame.time_base = output_stream.codec_context.time_base frame.pts = frames_written frames_written += 1 output_container.mux(output_stream.encode(frame)) except av.error.EOFError: break for packet in output_stream.encode(): output_container.mux(packet) else: output_stream = output_container.add_stream_from_template( template=partial_movies_stream, ) if config.transparent and config.movie_file_extension == ".webm": output_stream.pix_fmt = "yuva420p" for packet in partial_movies_input.demux(partial_movies_stream): # We need to skip the "flushing" packets that `demux` generates. if packet.dts is None: continue packet.dts = None # This seems to be needed, as dts from consecutive # files may not be monotically increasing, so we let libav compute it. # We need to assign the packet to the new stream. packet.stream = output_stream output_container.mux(packet) partial_movies_input.close() output_container.close() def combine_to_movie(self) -> None: """Used internally by Manim to combine the separate partial movie files that make up a Scene into a single video file for that Scene. """ partial_movie_files = [el for el in self.partial_movie_files if el is not None] # NOTE: Here we should do a check and raise an exception if partial # movie file is empty. We can't, as a lot of stuff (in particular, in # tests) use scene initialization, and this error would be raised as # it's just an empty scene initialized. # determine output path movie_file_path = self.movie_file_path if is_gif_format(): movie_file_path = self.gif_file_path if len(partial_movie_files) == 0: # Prevent calling concat on empty list logger.info("No animations are contained in this scene.") return logger.info("Combining to Movie file.") self.combine_files( partial_movie_files, movie_file_path, is_gif_format(), self.includes_sound, ) # handle sound if self.includes_sound and config.format != "gif": sound_file_path = movie_file_path.with_suffix(".wav") # Makes sure sound file length will match video file self.add_audio_segment(AudioSegment.silent(0)) self.audio_segment.export( sound_file_path, format="wav", bitrate="312k", ) # Audio added to a VP9 encoded (webm) video file needs # to be encoded as vorbis or opus. Directly exporting # self.audio_segment with such a codec works in principle, # but tries to call ffmpeg via its CLI -- which we want # to avoid. This is why we need to do the conversion # manually. if config.movie_file_extension == ".webm": ogg_sound_file_path = sound_file_path.with_suffix(".ogg") convert_audio(sound_file_path, ogg_sound_file_path, "libvorbis") sound_file_path = ogg_sound_file_path elif config.movie_file_extension == ".mp4": # Similarly, pyav may reject wav audio in an .mp4 file; # convert to AAC. aac_sound_file_path = sound_file_path.with_suffix(".aac") convert_audio(sound_file_path, aac_sound_file_path, "aac") sound_file_path = aac_sound_file_path temp_file_path = movie_file_path.with_name( f"{movie_file_path.stem}_temp{movie_file_path.suffix}" ) av_options = { "shortest": "1", "metadata": f"comment=Rendered with Manim Community v{__version__}", } with ( av.open(movie_file_path) as video_input, av.open(sound_file_path) as audio_input, ): video_stream = video_input.streams.video[0] audio_stream = audio_input.streams.audio[0] output_container = av.open( str(temp_file_path), mode="w", options=av_options ) output_video_stream = output_container.add_stream_from_template( template=video_stream ) output_audio_stream = output_container.add_stream_from_template( template=audio_stream ) for packet in video_input.demux(video_stream): # We need to skip the "flushing" packets that `demux` generates. if packet.dts is None: continue # We need to assign the packet to the new stream. packet.stream = output_video_stream output_container.mux(packet) for packet in audio_input.demux(audio_stream): # We need to skip the "flushing" packets that `demux` generates. if packet.dts is None: continue # We need to assign the packet to the new stream. packet.stream = output_audio_stream output_container.mux(packet) output_container.close() shutil.move(str(temp_file_path), str(movie_file_path)) sound_file_path.unlink() self.print_file_ready_message(str(movie_file_path)) if write_to_movie(): for file_path in partial_movie_files: # We have to modify the accessed time so if we have to clean the cache we remove the one used the longest. modify_atime(file_path) def combine_to_section_videos(self) -> None: """Concatenate partial movie files for each section.""" self.finish_last_section() sections_index: list[dict[str, Any]] = [] for section in self.sections: # only if section does want to be saved if section.video is not None: logger.info(f"Combining partial files for section '{section.name}'") self.combine_files( section.get_clean_partial_movie_files(), self.sections_output_dir / section.video, ) sections_index.append(section.get_dict(self.sections_output_dir)) with (self.sections_output_dir / f"{self.output_name}.json").open("w") as file: json.dump(sections_index, file, indent=4) def clean_cache(self) -> None: """Will clean the cache by removing the oldest partial_movie_files.""" cached_partial_movies = [ (self.partial_movie_directory / file_name) for file_name in self.partial_movie_directory.iterdir() if file_name != "partial_movie_file_list.txt" ] if len(cached_partial_movies) > config["max_files_cached"]: number_files_to_delete = ( len(cached_partial_movies) - config["max_files_cached"] ) oldest_files_to_delete = sorted( cached_partial_movies, key=lambda path: path.stat().st_atime, )[:number_files_to_delete] for file_to_delete in oldest_files_to_delete: file_to_delete.unlink() logger.info( f"The partial movie directory is full (> {config['max_files_cached']} files). Therefore, manim has removed the {number_files_to_delete} oldest file(s)." " You can change this behaviour by changing max_files_cached in config.", ) def flush_cache_directory(self) -> None: """Delete all the cached partial movie files""" cached_partial_movies = [ self.partial_movie_directory / file_name for file_name in self.partial_movie_directory.iterdir() if file_name != "partial_movie_file_list.txt" ] for f in cached_partial_movies: f.unlink() logger.info( f"Cache flushed. {len(cached_partial_movies)} file(s) deleted in %(par_dir)s.", {"par_dir": self.partial_movie_directory}, ) def write_subcaption_file(self) -> None: """Writes the subcaption file.""" if config.output_file is None: return subcaption_file = Path(config.output_file).with_suffix(".srt") subcaption_file.write_text(srt.compose(self.subcaptions), encoding="utf-8") logger.info(f"Subcaption file has been written as {subcaption_file}") def print_file_ready_message(self, file_path: StrPath) -> None: """Prints the "File Ready" message to STDOUT.""" config["output_file"] = file_path logger.info("\nFile ready at %(file_path)s\n", {"file_path": f"'{file_path}'"}) ManimCommunity-manim-1157b74/manim/scene/section.py000066400000000000000000000072521515024150700222550ustar00rootroot00000000000000"""building blocks of segmented video API""" from __future__ import annotations from enum import Enum from pathlib import Path from typing import Any from manim import get_video_metadata __all__ = ["Section", "DefaultSectionType"] class DefaultSectionType(str, Enum): """The type of a section can be used for third party applications. A presentation system could for example use the types to created loops. Examples -------- This class can be reimplemented for more types:: class PresentationSectionType(str, Enum): # start, end, wait for continuation by user NORMAL = "presentation.normal" # start, end, immediately continue to next section SKIP = "presentation.skip" # start, end, restart, immediately continue to next section when continued by user LOOP = "presentation.loop" # start, end, restart, finish animation first when user continues COMPLETE_LOOP = "presentation.complete_loop" """ NORMAL = "default.normal" class Section: r"""A :class:`.Scene` can be segmented into multiple Sections. Refer to :doc:`the documentation` for more info. It consists of multiple animations. Attributes ---------- type\_ Can be used by a third party applications to classify different types of sections. video Path to video file with animations belonging to section relative to sections directory. If ``None``, then the section will not be saved. name Human readable, non-unique name for this section. skip_animations Skip rendering the animations in this section when ``True``. partial_movie_files Animations belonging to this section. See Also -------- :class:`.DefaultSectionType` :meth:`.CairoRenderer.update_skipping_status` :meth:`.OpenGLRenderer.update_skipping_status` """ def __init__( self, type_: str, video: str | None, name: str, skip_animations: bool ) -> None: self.type_ = type_ # None when not to be saved -> still keeps section alive self.video: str | None = video self.name = name self.skip_animations = skip_animations self.partial_movie_files: list[str | None] = [] def is_empty(self) -> bool: """Check whether this section is empty. Note that animations represented by ``None`` are also counted. """ return len(self.partial_movie_files) == 0 def get_clean_partial_movie_files(self) -> list[str]: """Return all partial movie files that are not ``None``.""" return [el for el in self.partial_movie_files if el is not None] def get_dict(self, sections_dir: Path) -> dict[str, Any]: """Get dictionary representation with metadata of output video. The output from this function is used from every section to build the sections index file. The output video must have been created in the ``sections_dir`` before executing this method. This is the main part of the Segmented Video API. """ if self.video is None: raise ValueError( f"Section '{self.name}' cannot be exported as dict, it does not have a video path assigned to it" ) video_metadata = get_video_metadata(sections_dir / self.video) return dict( { "name": self.name, "type": self.type_, "video": self.video, }, **video_metadata, ) def __repr__(self) -> str: return f"
" ManimCommunity-manim-1157b74/manim/scene/three_d_scene.py000066400000000000000000000463741515024150700234100ustar00rootroot00000000000000"""A scene suitable for rendering three-dimensional objects and animations.""" from __future__ import annotations __all__ = ["ThreeDScene", "SpecialThreeDScene"] import warnings from collections.abc import Iterable, Sequence import numpy as np from manim.mobject.geometry.line import Line from manim.mobject.graphing.coordinate_systems import ThreeDAxes from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.three_d.three_dimensions import Sphere from manim.mobject.value_tracker import ValueTracker from .. import config from ..animation.animation import Animation from ..animation.transform import Transform from ..camera.three_d_camera import ThreeDCamera from ..constants import DEGREES, RendererType from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VectorizedPoint, VGroup from ..renderer.opengl_renderer import OpenGLCamera from ..scene.scene import Scene from ..utils.config_ops import merge_dicts_recursively class ThreeDScene(Scene): """ This is a Scene, with special configurations and properties that make it suitable for Three Dimensional Scenes. """ def __init__( self, camera_class=ThreeDCamera, ambient_camera_rotation=None, default_angled_camera_orientation_kwargs=None, **kwargs, ): self.ambient_camera_rotation = ambient_camera_rotation if default_angled_camera_orientation_kwargs is None: default_angled_camera_orientation_kwargs = { "phi": 70 * DEGREES, "theta": -135 * DEGREES, } self.default_angled_camera_orientation_kwargs = ( default_angled_camera_orientation_kwargs ) super().__init__(camera_class=camera_class, **kwargs) def set_camera_orientation( self, phi: float | None = None, theta: float | None = None, gamma: float | None = None, zoom: float | None = None, focal_distance: float | None = None, frame_center: Mobject | Sequence[float] | None = None, **kwargs, ): """ This method sets the orientation of the camera in the scene. Parameters ---------- phi The polar angle i.e the angle between Z_AXIS and Camera through ORIGIN in radians. theta The azimuthal angle i.e the angle that spins the camera around the Z_AXIS. focal_distance The focal_distance of the Camera. gamma The rotation of the camera about the vector from the ORIGIN to the Camera. zoom The zoom factor of the scene. frame_center The new center of the camera frame in cartesian coordinates. """ if phi is not None: self.renderer.camera.set_phi(phi) if theta is not None: self.renderer.camera.set_theta(theta) if focal_distance is not None: self.renderer.camera.set_focal_distance(focal_distance) if gamma is not None: self.renderer.camera.set_gamma(gamma) if zoom is not None: self.renderer.camera.set_zoom(zoom) if frame_center is not None: self.renderer.camera._frame_center.move_to(frame_center) def begin_ambient_camera_rotation(self, rate: float = 0.02, about: str = "theta"): """ This method begins an ambient rotation of the camera about the Z_AXIS, in the anticlockwise direction Parameters ---------- rate The rate at which the camera should rotate about the Z_AXIS. Negative rate means clockwise rotation. about one of 3 options: ["theta", "phi", "gamma"]. defaults to theta. """ # TODO, use a ValueTracker for rate, so that it # can begin and end smoothly about: str = about.lower() try: if config.renderer == RendererType.CAIRO: trackers = { "theta": self.camera.theta_tracker, "phi": self.camera.phi_tracker, "gamma": self.camera.gamma_tracker, } x: ValueTracker = trackers[about] x.add_updater(lambda m, dt: x.increment_value(rate * dt)) self.add(x) elif config.renderer == RendererType.OPENGL: cam: OpenGLCamera = self.camera methods = { "theta": cam.increment_theta, "phi": cam.increment_phi, "gamma": cam.increment_gamma, } cam.add_updater(lambda m, dt: methods[about](rate * dt)) self.add(self.camera) except Exception as e: raise ValueError("Invalid ambient rotation angle.") from e def stop_ambient_camera_rotation(self, about="theta"): """This method stops all ambient camera rotation.""" about: str = about.lower() try: if config.renderer == RendererType.CAIRO: trackers = { "theta": self.camera.theta_tracker, "phi": self.camera.phi_tracker, "gamma": self.camera.gamma_tracker, } x: ValueTracker = trackers[about] x.clear_updaters() self.remove(x) elif config.renderer == RendererType.OPENGL: self.camera.clear_updaters() except Exception as e: raise ValueError("Invalid ambient rotation angle.") from e def begin_3dillusion_camera_rotation( self, rate: float = 1, origin_phi: float | None = None, origin_theta: float | None = None, ): """ This method creates a 3D camera rotation illusion around the current camera orientation. Parameters ---------- rate The rate at which the camera rotation illusion should operate. origin_phi The polar angle the camera should move around. Defaults to the current phi angle. origin_theta The azimutal angle the camera should move around. Defaults to the current theta angle. """ if origin_theta is None: origin_theta = self.renderer.camera.theta_tracker.get_value() if origin_phi is None: origin_phi = self.renderer.camera.phi_tracker.get_value() val_tracker_theta = ValueTracker(0) def update_theta(m, dt): val_tracker_theta.increment_value(dt * rate) val_for_left_right = 0.2 * np.sin(val_tracker_theta.get_value()) return m.set_value(origin_theta + val_for_left_right) self.renderer.camera.theta_tracker.add_updater(update_theta) self.add(self.renderer.camera.theta_tracker) val_tracker_phi = ValueTracker(0) def update_phi(m, dt): val_tracker_phi.increment_value(dt * rate) val_for_up_down = 0.1 * np.cos(val_tracker_phi.get_value()) - 0.1 return m.set_value(origin_phi + val_for_up_down) self.renderer.camera.phi_tracker.add_updater(update_phi) self.add(self.renderer.camera.phi_tracker) def stop_3dillusion_camera_rotation(self): """This method stops all illusion camera rotations.""" self.renderer.camera.theta_tracker.clear_updaters() self.remove(self.renderer.camera.theta_tracker) self.renderer.camera.phi_tracker.clear_updaters() self.remove(self.renderer.camera.phi_tracker) def move_camera( self, phi: float | None = None, theta: float | None = None, gamma: float | None = None, zoom: float | None = None, focal_distance: float | None = None, frame_center: Mobject | Sequence[float] | None = None, added_anims: Iterable[Animation] = [], **kwargs, ): """ This method animates the movement of the camera to the given spherical coordinates. Parameters ---------- phi The polar angle i.e the angle between Z_AXIS and Camera through ORIGIN in radians. theta The azimuthal angle i.e the angle that spins the camera around the Z_AXIS. focal_distance The radial focal_distance between ORIGIN and Camera. gamma The rotation of the camera about the vector from the ORIGIN to the Camera. zoom The zoom factor of the camera. frame_center The new center of the camera frame in cartesian coordinates. added_anims Any other animations to be played at the same time. """ anims = [] if config.renderer == RendererType.CAIRO: self.camera: ThreeDCamera value_tracker_pairs = [ (phi, self.camera.phi_tracker), (theta, self.camera.theta_tracker), (focal_distance, self.camera.focal_distance_tracker), (gamma, self.camera.gamma_tracker), (zoom, self.camera.zoom_tracker), ] for value, tracker in value_tracker_pairs: if value is not None: anims.append(tracker.animate.set_value(value)) if frame_center is not None: anims.append(self.camera._frame_center.animate.move_to(frame_center)) elif config.renderer == RendererType.OPENGL: cam: OpenGLCamera = self.camera cam2 = cam.copy() methods = { "theta": cam2.set_theta, "phi": cam2.set_phi, "gamma": cam2.set_gamma, "zoom": cam2.scale, "frame_center": cam2.move_to, } if frame_center is not None: if isinstance(frame_center, OpenGLMobject): frame_center = frame_center.get_center() frame_center = list(frame_center) zoom_value = None if zoom is not None: zoom_value = config.frame_height / (zoom * cam.height) for value, method in [ [theta, "theta"], [phi, "phi"], [gamma, "gamma"], [zoom_value, "zoom"], [frame_center, "frame_center"], ]: if value is not None: methods[method](value) if focal_distance is not None: warnings.warn( "focal distance of OpenGLCamera can not be adjusted.", stacklevel=2, ) anims += [Transform(cam, cam2)] self.play(*anims + added_anims, **kwargs) # These lines are added to improve performance. If manim thinks that frame_center is moving, # it is required to redraw every object. These lines remove frame_center from the Scene once # its animation is done, ensuring that manim does not think that it is moving. Since the # frame_center is never actually drawn, this shouldn't break anything. if frame_center is not None and config.renderer == RendererType.CAIRO: self.remove(self.camera._frame_center) def get_moving_mobjects(self, *animations: Animation): """ This method returns a list of all of the Mobjects in the Scene that are moving, that are also in the animations passed. Parameters ---------- *animations The animations whose mobjects will be checked. """ moving_mobjects = super().get_moving_mobjects(*animations) camera_mobjects = self.renderer.camera.get_value_trackers() + [ self.renderer.camera._frame_center, ] if any(cm in moving_mobjects for cm in camera_mobjects): return self.mobjects return moving_mobjects def add_fixed_orientation_mobjects(self, *mobjects: Mobject, **kwargs): """ This method is used to prevent the rotation and tilting of mobjects as the camera moves around. The mobject can still move in the x,y,z directions, but will always be at the angle (relative to the camera) that it was at when it was passed through this method.) Parameters ---------- *mobjects The Mobject(s) whose orientation must be fixed. **kwargs Some valid kwargs are use_static_center_func : bool center_func : function """ if config.renderer == RendererType.CAIRO: self.add(*mobjects) self.renderer.camera.add_fixed_orientation_mobjects(*mobjects, **kwargs) elif config.renderer == RendererType.OPENGL: for mob in mobjects: mob: OpenGLMobject mob.fix_orientation() self.add(mob) def add_fixed_in_frame_mobjects(self, *mobjects: Mobject): """ This method is used to prevent the rotation and movement of mobjects as the camera moves around. The mobject is essentially overlaid, and is not impacted by the camera's movement in any way. Parameters ---------- *mobjects The Mobjects whose orientation must be fixed. """ if config.renderer == RendererType.CAIRO: self.add(*mobjects) self.camera: ThreeDCamera self.camera.add_fixed_in_frame_mobjects(*mobjects) elif config.renderer == RendererType.OPENGL: for mob in mobjects: mob: OpenGLMobject mob.fix_in_frame() self.add(mob) def remove_fixed_orientation_mobjects(self, *mobjects: Mobject): """ This method "unfixes" the orientation of the mobjects passed, meaning they will no longer be at the same angle relative to the camera. This only makes sense if the mobject was passed through add_fixed_orientation_mobjects first. Parameters ---------- *mobjects The Mobjects whose orientation must be unfixed. """ if config.renderer == RendererType.CAIRO: self.renderer.camera.remove_fixed_orientation_mobjects(*mobjects) elif config.renderer == RendererType.OPENGL: for mob in mobjects: mob: OpenGLMobject mob.unfix_orientation() self.remove(mob) def remove_fixed_in_frame_mobjects(self, *mobjects: Mobject): """ This method undoes what add_fixed_in_frame_mobjects does. It allows the mobject to be affected by the movement of the camera. Parameters ---------- *mobjects The Mobjects whose position and orientation must be unfixed. """ if config.renderer == RendererType.CAIRO: self.renderer.camera.remove_fixed_in_frame_mobjects(*mobjects) elif config.renderer == RendererType.OPENGL: for mob in mobjects: mob: OpenGLMobject mob.unfix_from_frame() self.remove(mob) ## def set_to_default_angled_camera_orientation(self, **kwargs): """ This method sets the default_angled_camera_orientation to the keyword arguments passed, and sets the camera to that orientation. Parameters ---------- **kwargs Some recognised kwargs are phi, theta, focal_distance, gamma, which have the same meaning as the parameters in set_camera_orientation. """ config = dict( self.default_camera_orientation_kwargs, ) # Where doe this come from? config.update(kwargs) self.set_camera_orientation(**config) class SpecialThreeDScene(ThreeDScene): """An extension of :class:`ThreeDScene` with more settings. It has some extra configuration for axes, spheres, and an override for low quality rendering. Further key differences are: * The camera shades applicable 3DMobjects by default, except if rendering in low quality. * Some default params for Spheres and Axes have been added. """ def __init__( self, cut_axes_at_radius=True, camera_config={"should_apply_shading": True, "exponential_projection": True}, three_d_axes_config={ "num_axis_pieces": 1, "axis_config": { "unit_size": 2, "tick_frequency": 1, "numbers_with_elongated_ticks": [0, 1, 2], "stroke_width": 2, }, }, sphere_config={"radius": 2, "resolution": (24, 48)}, default_angled_camera_position={ "phi": 70 * DEGREES, "theta": -110 * DEGREES, }, # When scene is extracted with -l flag, this # configuration will override the above configuration. low_quality_config={ "camera_config": {"should_apply_shading": False}, "three_d_axes_config": {"num_axis_pieces": 1}, "sphere_config": {"resolution": (12, 24)}, }, **kwargs, ): self.cut_axes_at_radius = cut_axes_at_radius self.camera_config = camera_config self.three_d_axes_config = three_d_axes_config self.sphere_config = sphere_config self.default_angled_camera_position = default_angled_camera_position self.low_quality_config = low_quality_config if self.renderer.camera_config["pixel_width"] == config["pixel_width"]: _config = {} else: _config = self.low_quality_config _config = merge_dicts_recursively(_config, kwargs) super().__init__(**_config) def get_axes(self): """Return a set of 3D axes. Returns ------- :class:`.ThreeDAxes` A set of 3D axes. """ axes = ThreeDAxes(**self.three_d_axes_config) for axis in axes: if self.cut_axes_at_radius: p0 = axis.get_start() p1 = axis.number_to_point(-1) p2 = axis.number_to_point(1) p3 = axis.get_end() new_pieces = VGroup(Line(p0, p1), Line(p1, p2), Line(p2, p3)) for piece in new_pieces: piece.shade_in_3d = True new_pieces.match_style(axis.pieces) axis.pieces.submobjects = new_pieces.submobjects for tick in axis.tick_marks: tick.add(VectorizedPoint(1.5 * tick.get_center())) return axes def get_sphere(self, **kwargs): """ Returns a sphere with the passed keyword arguments as properties. Parameters ---------- **kwargs Any valid parameter of :class:`~.Sphere` or :class:`~.Surface`. Returns ------- :class:`~.Sphere` The sphere object. """ config = merge_dicts_recursively(self.sphere_config, kwargs) return Sphere(**config) def get_default_camera_position(self): """ Returns the default_angled_camera position. Returns ------- dict Dictionary of phi, theta, focal_distance, and gamma. """ return self.default_angled_camera_position def set_camera_to_default_position(self): """Sets the camera to its default position.""" self.set_camera_orientation(**self.default_angled_camera_position) ManimCommunity-manim-1157b74/manim/scene/vector_space_scene.py000066400000000000000000001215711515024150700244440ustar00rootroot00000000000000"""A scene suitable for vector spaces.""" from __future__ import annotations __all__ = ["VectorScene", "LinearTransformationScene"] from collections.abc import Callable, Iterable from typing import TYPE_CHECKING, Any, cast import numpy as np from manim.animation.creation import DrawBorderThenFill, Group from manim.camera.camera import Camera from manim.mobject.geometry.arc import Dot from manim.mobject.geometry.line import Arrow, Line, Vector from manim.mobject.geometry.polygram import Rectangle from manim.mobject.graphing.coordinate_systems import Axes, NumberPlane from manim.mobject.opengl.opengl_mobject import OpenGLMobject from manim.mobject.text.tex_mobject import MathTex, Tex from manim.utils.config_ops import update_dict_recursively from .. import config from ..animation.animation import Animation from ..animation.creation import Create, Write from ..animation.fading import FadeOut from ..animation.growing import GrowArrow from ..animation.transform import ApplyFunction, ApplyPointwiseFunction, Transform from ..constants import * from ..mobject.matrix import Matrix from ..mobject.mobject import Mobject from ..mobject.types.vectorized_mobject import VGroup, VMobject from ..scene.scene import Scene from ..utils.color import ( BLACK, BLUE_D, GREEN_C, GREY, PURE_YELLOW, RED_C, WHITE, ManimColor, ParsableManimColor, ) from ..utils.rate_functions import rush_from, rush_into from ..utils.space_ops import angle_of_vector if TYPE_CHECKING: from typing import Self from manim.typing import ( MappingFunction, Point3D, Point3DLike, Vector2DLike, Vector3D, Vector3DLike, ) X_COLOR = GREEN_C Y_COLOR = RED_C Z_COLOR = BLUE_D # TODO: Much of this scene type seems dependent on the coordinate system chosen. # That is, being centered at the origin with grid units corresponding to the # arbitrary space units. Change it! # # Also, methods I would have thought of as getters, like coords_to_vector, are # actually doing a lot of animating. class VectorScene(Scene): def __init__(self, basis_vector_stroke_width: float = 6.0, **kwargs: Any) -> None: super().__init__(**kwargs) self.basis_vector_stroke_width = basis_vector_stroke_width def add_plane(self, animate: bool = False, **kwargs: Any) -> NumberPlane: """ Adds a NumberPlane object to the background. Parameters ---------- animate Whether or not to animate the addition of the plane via Create. **kwargs Any valid keyword arguments accepted by NumberPlane. Returns ------- NumberPlane The NumberPlane object. """ plane = NumberPlane(**kwargs) if animate: self.play(Create(plane, lag_ratio=0.5)) self.add(plane) return plane def add_axes( self, animate: bool = False, color: ParsableManimColor | Iterable[ParsableManimColor] = WHITE, ) -> Axes: """ Adds a pair of Axes to the Scene. Parameters ---------- animate Whether or not to animate the addition of the axes through Create. color The color of the axes. Defaults to WHITE. """ axes = Axes(color=color, axis_config={"unit_size": 1}) if animate: self.play(Create(axes)) self.add(axes) return axes def lock_in_faded_grid( self, dimness: float = 0.7, axes_dimness: float = 0.5 ) -> None: """ This method freezes the NumberPlane and Axes that were already in the background, and adds new, manipulatable ones to the foreground. Parameters ---------- dimness The required dimness of the NumberPlane axes_dimness The required dimness of the Axes. """ plane = self.add_plane() axes = plane.get_axes() plane.fade(dimness) axes.set_color(WHITE) axes.fade(axes_dimness) self.add(axes) # TODO # error: Missing positional argument "scene" in call to "update_frame" of "CairoRenderer" [call-arg] self.renderer.update_frame() # type: ignore[call-arg] self.renderer.camera = Camera(self.renderer.get_frame()) self.clear() def get_vector(self, numerical_vector: Vector3DLike, **kwargs: Any) -> Arrow: """ Returns an arrow on the Plane given an input numerical vector. Parameters ---------- numerical_vector The Vector to plot. **kwargs Any valid keyword argument of Arrow. Returns ------- Arrow The Arrow representing the Vector. """ return Arrow( # TODO # error: "VectorScene" has no attribute "plane" [attr-defined] self.plane.coords_to_point(0, 0), # type: ignore[attr-defined] self.plane.coords_to_point(*numerical_vector[:2]), # type: ignore[attr-defined] buff=0, **kwargs, ) def add_vector( self, vector: Arrow | Vector3DLike, color: ParsableManimColor | Iterable[ParsableManimColor] = PURE_YELLOW, animate: bool = True, **kwargs: Any, ) -> Arrow: """ Returns the Vector after adding it to the Plane. Parameters ---------- vector It can be a pre-made graphical vector, or the coordinates of one. color The string of the hex color of the vector. This is only taken into consideration if 'vector' is not an Arrow. Defaults to YELLOW. animate Whether or not to animate the addition of the vector by using GrowArrow **kwargs Any valid keyword argument of Arrow. These are only considered if vector is not an Arrow. Returns ------- Arrow The arrow representing the vector. """ if not isinstance(vector, Arrow): vector = Vector(np.asarray(vector), color=color, **kwargs) if animate: self.play(GrowArrow(vector)) self.add(vector) return vector def write_vector_coordinates(self, vector: Vector, **kwargs: Any) -> Matrix: """ Returns a column matrix indicating the vector coordinates, after writing them to the screen. Parameters ---------- vector The arrow representing the vector. **kwargs Any valid keyword arguments of :meth:`~.Vector.coordinate_label`: Returns ------- :class:`.Matrix` The column matrix representing the vector. """ coords: Matrix = vector.coordinate_label(**kwargs) self.play(Write(coords)) return coords def get_basis_vectors( self, i_hat_color: ParsableManimColor | Iterable[ParsableManimColor] = X_COLOR, j_hat_color: ParsableManimColor | Iterable[ParsableManimColor] = Y_COLOR, ) -> VGroup: """ Returns a VGroup of the Basis Vectors (1,0) and (0,1) Parameters ---------- i_hat_color The hex colour to use for the basis vector in the x direction j_hat_color The hex colour to use for the basis vector in the y direction Returns ------- VGroup VGroup of the Vector Mobjects representing the basis vectors. """ return VGroup( *( Vector( np.asarray(vect), color=color, stroke_width=self.basis_vector_stroke_width, ) for vect, color in [([1, 0], i_hat_color), ([0, 1], j_hat_color)] ) ) def get_basis_vector_labels(self, **kwargs: Any) -> VGroup: """ Returns naming labels for the basis vectors. Parameters ---------- **kwargs Any valid keyword arguments of get_vector_label: vector, label (str,MathTex) at_tip (bool=False), direction (str="left"), rotate (bool), color (str), label_scale_factor=VECTOR_LABEL_SCALE_FACTOR (int, float), """ i_hat, j_hat = self.get_basis_vectors() return VGroup( *( self.get_vector_label( vect, label, color=color, label_scale_factor=1, **kwargs ) for vect, label, color in [ (i_hat, "\\hat{\\imath}", X_COLOR), (j_hat, "\\hat{\\jmath}", Y_COLOR), ] ) ) def get_vector_label( self, vector: Vector, label: MathTex | str, at_tip: bool = False, direction: str = "left", rotate: bool = False, color: ParsableManimColor | None = None, label_scale_factor: float = LARGE_BUFF - 0.2, ) -> MathTex: """ Returns naming labels for the passed vector. Parameters ---------- vector Vector Object for which to get the label. at_tip Whether or not to place the label at the tip of the vector. direction If the label should be on the "left" or right of the vector. rotate Whether or not to rotate it to align it with the vector. color The color to give the label. label_scale_factor How much to scale the label by. Returns ------- MathTex The MathTex of the label. """ if not isinstance(label, MathTex): if len(label) == 1: label = "\\vec{\\textbf{%s}}" % label # noqa: UP031 label = MathTex(label) if color is None: prepared_color: ParsableManimColor = vector.get_color() else: prepared_color = color label.set_color(prepared_color) assert isinstance(label, MathTex) label.scale(label_scale_factor) label.add_background_rectangle() if at_tip: vect = vector.get_vector() vect /= np.linalg.norm(vect) label.next_to(vector.get_end(), vect, buff=SMALL_BUFF) else: angle = vector.get_angle() if not rotate: label.rotate(-angle, about_point=ORIGIN) if direction == "left": temp_shift_1: Vector3D = np.asarray(label.get_bottom()) label.shift(-temp_shift_1 + 0.1 * UP) else: temp_shift_2: Vector3D = np.asarray(label.get_top()) label.shift(-temp_shift_2 + 0.1 * DOWN) label.rotate(angle, about_point=ORIGIN) label.shift((vector.get_end() - vector.get_start()) / 2) return label def label_vector( self, vector: Vector, label: MathTex | str, animate: bool = True, **kwargs: Any ) -> MathTex: """ Shortcut method for creating, and animating the addition of a label for the vector. Parameters ---------- vector The vector for which the label must be added. label The MathTex/string of the label. animate Whether or not to animate the labelling w/ Write **kwargs Any valid keyword argument of get_vector_label Returns ------- :class:`~.MathTex` The MathTex of the label. """ mathtex_label = self.get_vector_label(vector, label, **kwargs) if animate: self.play(Write(mathtex_label, run_time=1)) self.add(mathtex_label) return mathtex_label def position_x_coordinate( self, x_coord: MathTex, x_line: Line, vector: Vector3DLike, ) -> MathTex: # TODO Write DocStrings for this. x_coord.next_to(x_line, -np.sign(vector[1]) * UP) x_coord.set_color(X_COLOR) return x_coord def position_y_coordinate( self, y_coord: MathTex, y_line: Line, vector: Vector3DLike, ) -> MathTex: # TODO Write DocStrings for this. y_coord.next_to(y_line, np.sign(vector[0]) * RIGHT) y_coord.set_color(Y_COLOR) return y_coord def coords_to_vector( self, vector: Vector2DLike, coords_start: Point3DLike = 2 * RIGHT + 2 * UP, clean_up: bool = True, ) -> None: """ This method writes the vector as a column matrix (henceforth called the label), takes the values in it one by one, and form the corresponding lines that make up the x and y components of the vector. Then, an Vector() based vector is created between the lines on the Screen. Parameters ---------- vector The vector to show. coords_start The starting point of the location of the label of the vector that shows it numerically. Defaults to 2 * RIGHT + 2 * UP or (2,2) clean_up Whether or not to remove whatever this method did after it's done. """ starting_mobjects = list(self.mobjects) array = Matrix(vector) array.shift(coords_start) arrow = Vector(vector) x_line = Line(ORIGIN, vector[0] * RIGHT) y_line = Line(x_line.get_end(), arrow.get_end()) x_line.set_color(X_COLOR) y_line.set_color(Y_COLOR) mob_matrix = array.get_mob_matrix() x_coord = mob_matrix[0][0] y_coord = mob_matrix[1][0] self.play(Write(array, run_time=1)) self.wait() self.play( ApplyFunction( lambda x: self.position_x_coordinate(x, x_line, vector), # type: ignore[arg-type] x_coord, ), ) self.play(Create(x_line)) animations = [ ApplyFunction( lambda y: self.position_y_coordinate(y, y_line, vector), # type: ignore[arg-type] y_coord, ), FadeOut(array.get_brackets()), ] self.play(*animations) # TODO: Can we delete the line below? I don't think it have any purpose. # y_coord, _ = (anim.mobject for anim in animations) self.play(Create(y_line)) self.play(Create(arrow)) self.wait() if clean_up: self.clear() self.add(*starting_mobjects) def vector_to_coords( self, vector: Vector3DLike, integer_labels: bool = True, clean_up: bool = True, ) -> tuple[Matrix, Line, Line]: """ This method displays vector as a Vector() based vector, and then shows the corresponding lines that make up the x and y components of the vector. Then, a column matrix (henceforth called the label) is created near the head of the Vector. Parameters ---------- vector The vector to show. integer_labels Whether or not to round the value displayed. in the vector's label to the nearest integer clean_up Whether or not to remove whatever this method did after it's done. """ starting_mobjects = list(self.mobjects) show_creation = False if isinstance(vector, Arrow): arrow = vector vector = arrow.get_end()[:2] else: arrow = Vector(vector) show_creation = True array = arrow.coordinate_label(integer_labels=integer_labels) x_line = Line(ORIGIN, vector[0] * RIGHT) y_line = Line(x_line.get_end(), arrow.get_end()) x_line.set_color(X_COLOR) y_line.set_color(Y_COLOR) x_coord, y_coord = cast(VGroup, array.get_entries()) x_coord_start = self.position_x_coordinate(x_coord.copy(), x_line, vector) y_coord_start = self.position_y_coordinate(y_coord.copy(), y_line, vector) brackets = array.get_brackets() if show_creation: self.play(Create(arrow)) self.play(Create(x_line), Write(x_coord_start), run_time=1) self.play(Create(y_line), Write(y_coord_start), run_time=1) self.wait() self.play( Transform(x_coord_start, x_coord, lag_ratio=0), Transform(y_coord_start, y_coord, lag_ratio=0), Write(brackets, run_time=1), ) self.wait() self.remove(x_coord_start, y_coord_start, brackets) self.add(array) if clean_up: self.clear() self.add(*starting_mobjects) return array, x_line, y_line def show_ghost_movement(self, vector: Arrow | Vector2DLike | Vector3DLike) -> None: """ This method plays an animation that partially shows the entire plane moving in the direction of a particular vector. This is useful when you wish to convey the idea of mentally moving the entire plane in a direction, without actually moving the plane. Parameters ---------- vector The vector which indicates the direction of movement. """ if isinstance(vector, Arrow): vector = vector.get_end() - vector.get_start() else: vector = np.asarray(vector) if len(vector) == 2: vector = np.append(np.array(vector), 0.0) vector_cleaned: Vector3D = vector x_max = int(config["frame_x_radius"] + abs(vector_cleaned[0])) y_max = int(config["frame_y_radius"] + abs(vector_cleaned[1])) # TODO: # I think that this should be a VGroup instead of a VMobject. dots = VMobject( *( # type: ignore[arg-type] Dot(x * RIGHT + y * UP) for x in range(-x_max, x_max) for y in range(-y_max, y_max) ) ) dots.set_fill(BLACK, opacity=0) dots_halfway = dots.copy().shift(vector_cleaned / 2).set_fill(WHITE, 1) dots_end = dots.copy().shift(vector_cleaned) self.play(Transform(dots, dots_halfway, rate_func=rush_into)) self.play(Transform(dots, dots_end, rate_func=rush_from)) self.remove(dots) class LinearTransformationScene(VectorScene): """ This scene contains special methods that make it especially suitable for showing linear transformations. Parameters ---------- include_background_plane Whether or not to include the background plane in the scene. include_foreground_plane Whether or not to include the foreground plane in the scene. background_plane_kwargs Parameters to be passed to :class:`NumberPlane` to adjust the background plane. foreground_plane_kwargs Parameters to be passed to :class:`NumberPlane` to adjust the foreground plane. show_coordinates Whether or not to include the coordinates for the background plane. show_basis_vectors Whether to show the basis x_axis -> ``i_hat`` and y_axis -> ``j_hat`` vectors. basis_vector_stroke_width The ``stroke_width`` of the basis vectors. i_hat_color The color of the ``i_hat`` vector. j_hat_color The color of the ``j_hat`` vector. leave_ghost_vectors Indicates the previous position of the basis vectors following a transformation. Examples ------- .. manim:: LinearTransformationSceneExample class LinearTransformationSceneExample(LinearTransformationScene): def __init__(self, **kwargs): LinearTransformationScene.__init__( self, show_coordinates=True, leave_ghost_vectors=True, **kwargs ) def construct(self): matrix = [[1, 1], [0, 1]] self.apply_matrix(matrix) self.wait() """ def __init__( self, include_background_plane: bool = True, include_foreground_plane: bool = True, background_plane_kwargs: dict[str, Any] | None = None, foreground_plane_kwargs: dict[str, Any] | None = None, show_coordinates: bool = False, show_basis_vectors: bool = True, basis_vector_stroke_width: float = 6, i_hat_color: ParsableManimColor = X_COLOR, j_hat_color: ParsableManimColor = Y_COLOR, leave_ghost_vectors: bool = False, **kwargs: Any, ) -> None: super().__init__(**kwargs) self.include_background_plane = include_background_plane self.include_foreground_plane = include_foreground_plane self.show_coordinates = show_coordinates self.show_basis_vectors = show_basis_vectors self.basis_vector_stroke_width = basis_vector_stroke_width self.i_hat_color = ManimColor(i_hat_color) self.j_hat_color = ManimColor(j_hat_color) self.leave_ghost_vectors = leave_ghost_vectors self.background_plane_kwargs: dict[str, Any] = { "color": GREY, "axis_config": { "color": GREY, }, "background_line_style": { "stroke_color": GREY, "stroke_width": 1, }, } self.ghost_vectors = VGroup() self.foreground_plane_kwargs: dict[str, Any] = { "x_range": np.array([-config["frame_width"], config["frame_width"], 1.0]), "y_range": np.array([-config["frame_width"], config["frame_width"], 1.0]), "faded_line_ratio": 1, } self.update_default_configs( (self.foreground_plane_kwargs, self.background_plane_kwargs), (foreground_plane_kwargs, background_plane_kwargs), ) @staticmethod def update_default_configs( default_configs: Iterable[dict[str, Any]], passed_configs: Iterable[dict[str, Any] | None], ) -> None: for default_config, passed_config in zip( default_configs, passed_configs, strict=False ): if passed_config is not None: update_dict_recursively(default_config, passed_config) def setup(self) -> None: # The has_already_setup attr is to not break all the old Scenes if hasattr(self, "has_already_setup"): return self.has_already_setup = True self.background_mobjects: list[Mobject] = [] self.foreground_mobjects: list[Mobject] = [] self.transformable_mobjects: list[Mobject] = [] self.moving_vectors: list[Mobject] = [] self.transformable_labels: list[MathTex] = [] self.moving_mobjects: list[Mobject] = [] self.background_plane = NumberPlane(**self.background_plane_kwargs) if self.show_coordinates: self.background_plane.add_coordinates() if self.include_background_plane: self.add_background_mobject(self.background_plane) if self.include_foreground_plane: self.plane = NumberPlane(**self.foreground_plane_kwargs) self.add_transformable_mobject(self.plane) if self.show_basis_vectors: self.basis_vectors = self.get_basis_vectors( i_hat_color=self.i_hat_color, j_hat_color=self.j_hat_color, ) self.moving_vectors += list(self.basis_vectors) self.i_hat, self.j_hat = self.basis_vectors self.add(self.basis_vectors) def add_special_mobjects( self, mob_list: list[Mobject], *mobs_to_add: Mobject ) -> None: """ Adds mobjects to a separate list that can be tracked, if these mobjects have some extra importance. Parameters ---------- mob_list The special list to which you want to add these mobjects. *mobs_to_add The mobjects to add. """ for mobject in mobs_to_add: if mobject not in mob_list: mob_list.append(mobject) self.add(mobject) def add_background_mobject(self, *mobjects: Mobject) -> None: """ Adds the mobjects to the special list self.background_mobjects. Parameters ---------- *mobjects The mobjects to add to the list. """ self.add_special_mobjects(self.background_mobjects, *mobjects) # TODO, this conflicts with Scene.add_foreground_mobject # Please be aware that there is also the method Scene.add_foreground_mobjects. def add_foreground_mobject(self, *mobjects: Mobject) -> None: # type: ignore[override] """ Adds the mobjects to the special list self.foreground_mobjects. Parameters ---------- *mobjects The mobjects to add to the list """ self.add_special_mobjects(self.foreground_mobjects, *mobjects) def add_transformable_mobject(self, *mobjects: Mobject) -> None: """ Adds the mobjects to the special list self.transformable_mobjects. Parameters ---------- *mobjects The mobjects to add to the list. """ self.add_special_mobjects(self.transformable_mobjects, *mobjects) def add_moving_mobject( self, mobject: Mobject, target_mobject: Mobject | None = None ) -> None: """ Adds the mobject to the special list self.moving_mobject, and adds a property to the mobject called mobject.target, which keeps track of what the mobject will move to or become etc. Parameters ---------- mobject The mobjects to add to the list target_mobject What the moving_mobject goes to, etc. """ mobject.target = target_mobject self.add_special_mobjects(self.moving_mobjects, mobject) def get_ghost_vectors(self) -> VGroup: """ Returns all ghost vectors ever added to ``self``. Each element is a ``VGroup`` of two ghost vectors. """ return self.ghost_vectors def get_unit_square( self, color: ParsableManimColor | Iterable[ParsableManimColor] = PURE_YELLOW, opacity: float = 0.3, stroke_width: float = 3, ) -> Rectangle: """ Returns a unit square for the current NumberPlane. Parameters ---------- color The string of the hex color code of the color wanted. opacity The opacity of the square stroke_width The stroke_width in pixels of the border of the square Returns ------- Square """ square = self.square = Rectangle( color=color, width=self.plane.get_x_unit_size(), height=self.plane.get_y_unit_size(), stroke_color=color, stroke_width=stroke_width, fill_color=color, fill_opacity=opacity, ) square.move_to(self.plane.coords_to_point(0, 0), DL) return square def add_unit_square(self, animate: bool = False, **kwargs: Any) -> Self: """ Adds a unit square to the scene via self.get_unit_square. Parameters ---------- animate Whether or not to animate the addition with DrawBorderThenFill. **kwargs Any valid keyword arguments of self.get_unit_square() Returns ------- Square The unit square. """ square = self.get_unit_square(**kwargs) if animate: self.play( DrawBorderThenFill(square), Animation(Group(*self.moving_vectors)), ) self.add_transformable_mobject(square) self.bring_to_front(*self.moving_vectors) self.square = square return self def add_vector( self, vector: Arrow | list | tuple | np.ndarray, color: ParsableManimColor = PURE_YELLOW, animate: bool = False, **kwargs: Any, ) -> Arrow: """ Adds a vector to the scene, and puts it in the special list self.moving_vectors. Parameters ---------- vector It can be a pre-made graphical vector, or the coordinates of one. color The string of the hex color of the vector. This is only taken into consideration if 'vector' is not an Arrow. Defaults to YELLOW. **kwargs Any valid keyword argument of VectorScene.add_vector. Returns ------- Arrow The arrow representing the vector. """ vector = super().add_vector(vector, color=color, animate=animate, **kwargs) self.moving_vectors.append(vector) return vector def write_vector_coordinates(self, vector: Vector, **kwargs: Any) -> Matrix: """ Returns a column matrix indicating the vector coordinates, after writing them to the screen, and adding them to the special list self.foreground_mobjects Parameters ---------- vector The arrow representing the vector. **kwargs Any valid keyword arguments of VectorScene.write_vector_coordinates Returns ------- Matrix The column matrix representing the vector. """ coords = super().write_vector_coordinates(vector, **kwargs) self.add_foreground_mobject(coords) return coords def add_transformable_label( self, vector: Vector, label: MathTex | str, transformation_name: str | MathTex = "L", new_label: str | MathTex | None = None, **kwargs: Any, ) -> MathTex: """ Method for creating, and animating the addition of a transformable label for the vector. Parameters ---------- vector The vector for which the label must be added. label The MathTex/string of the label. transformation_name The name to give the transformation as a label. new_label What the label should display after a Linear Transformation **kwargs Any valid keyword argument of get_vector_label Returns ------- :class:`~.MathTex` The MathTex of the label. """ # TODO: Clear up types in this function. This is currently a mess. label_mob = self.label_vector(vector, label, **kwargs) if new_label: label_mob.target_text = new_label # type: ignore[attr-defined] else: label_mob.target_text = ( # type: ignore[attr-defined] f"{transformation_name}({label_mob.get_tex_string()})" ) label_mob.vector = vector # type: ignore[attr-defined] label_mob.kwargs = kwargs # type: ignore[attr-defined] if "animate" in label_mob.kwargs: label_mob.kwargs.pop("animate") self.transformable_labels.append(label_mob) return cast(MathTex, label_mob) def add_title( self, title: str | MathTex | Tex, scale_factor: float = 1.5, animate: bool = False, ) -> Self: """ Adds a title, after scaling it, adding a background rectangle, moving it to the top and adding it to foreground_mobjects adding it as a local variable of self. Returns the Scene. Parameters ---------- title What the title should be. scale_factor How much the title should be scaled by. animate Whether or not to animate the addition. Returns ------- LinearTransformationScene The scene with the title added to it. """ if not isinstance(title, (Mobject, OpenGLMobject)): title = Tex(title).scale(scale_factor) title.to_edge(UP) title.add_background_rectangle() if animate: self.play(Write(title)) self.add_foreground_mobject(title) self.title = title return self def get_matrix_transformation( self, matrix: np.ndarray | list | tuple ) -> Callable[[Point3D], Point3D]: """ Returns a function corresponding to the linear transformation represented by the matrix passed. Parameters ---------- matrix The matrix. """ return self.get_transposed_matrix_transformation(np.array(matrix).T) def get_transposed_matrix_transformation( self, transposed_matrix: np.ndarray | list | tuple ) -> Callable[[Point3D], Point3D]: """ Returns a function corresponding to the linear transformation represented by the transposed matrix passed. Parameters ---------- transposed_matrix The matrix. """ transposed_matrix = np.array(transposed_matrix) if transposed_matrix.shape == (2, 2): new_matrix = np.identity(3) new_matrix[:2, :2] = transposed_matrix transposed_matrix = new_matrix elif transposed_matrix.shape != (3, 3): raise ValueError("Matrix has bad dimensions") return lambda point: np.dot(point, transposed_matrix) def get_piece_movement(self, pieces: Iterable[Mobject]) -> Transform: """ This method returns an animation that moves an arbitrary mobject in "pieces" to its corresponding .target value. If self.leave_ghost_vectors is True, ghosts of the original positions/mobjects are left on screen Parameters ---------- pieces The pieces for which the movement must be shown. Returns ------- Animation The animation of the movement. """ v_pieces = [piece for piece in pieces if isinstance(piece, VMobject)] start = VGroup(*v_pieces) target = VGroup(*(mob.target for mob in v_pieces)) # don't add empty VGroups if self.leave_ghost_vectors and start.submobjects: # start.copy() gives a VGroup of Vectors self.ghost_vectors.add(start.copy().fade(0.7)) self.add(self.ghost_vectors[-1]) return Transform(start, target, lag_ratio=0) def get_moving_mobject_movement(self, func: MappingFunction) -> Transform: """ This method returns an animation that moves a mobject in "self.moving_mobjects" to its corresponding .target value. func is a function that determines where the .target goes. Parameters ---------- func The function that determines where the .target of the moving mobject goes. Returns ------- Animation The animation of the movement. """ for m in self.moving_mobjects: if m.target is None: m.target = m.copy() temp: Point3D = m.get_center() target_point = func(temp) m.target.move_to(target_point) return self.get_piece_movement(self.moving_mobjects) def get_vector_movement(self, func: MappingFunction) -> Transform: """ This method returns an animation that moves a mobject in "self.moving_vectors" to its corresponding .target value. func is a function that determines where the .target goes. Parameters ---------- func The function that determines where the .target of the moving mobject goes. Returns ------- Animation The animation of the movement. """ for v in self.moving_vectors: v.target = Vector(func(v.get_end()), color=v.get_color()) norm = float(np.linalg.norm(v.target.get_end())) if norm < 0.1: v.target.get_tip().scale(norm) return self.get_piece_movement(self.moving_vectors) def get_transformable_label_movement(self) -> Transform: """ This method returns an animation that moves all labels in "self.transformable_labels" to its corresponding .target . Returns ------- Animation The animation of the movement. """ for label in self.transformable_labels: # TODO: This location and lines 933 and 335 are the only locations in # the code where the target_text property is referenced. target_text: MathTex | str = label.target_text # type: ignore[assignment] label.target = self.get_vector_label( label.vector.target, # type: ignore[attr-defined] target_text, **label.kwargs, # type: ignore[arg-type] ) return self.get_piece_movement(self.transformable_labels) def apply_matrix(self, matrix: np.ndarray | list | tuple, **kwargs: Any) -> None: """ Applies the transformation represented by the given matrix to the number plane, and each vector/similar mobject on it. Parameters ---------- matrix The matrix. **kwargs Any valid keyword argument of self.apply_transposed_matrix() """ self.apply_transposed_matrix(np.array(matrix).T, **kwargs) def apply_inverse(self, matrix: np.ndarray | list | tuple, **kwargs: Any) -> None: """ This method applies the linear transformation represented by the inverse of the passed matrix to the number plane, and each vector/similar mobject on it. Parameters ---------- matrix The matrix whose inverse is to be applied. **kwargs Any valid keyword argument of self.apply_matrix() """ self.apply_matrix(np.linalg.inv(matrix), **kwargs) def apply_transposed_matrix( self, transposed_matrix: np.ndarray | list | tuple, **kwargs: Any ) -> None: """ Applies the transformation represented by the given transposed matrix to the number plane, and each vector/similar mobject on it. Parameters ---------- transposed_matrix The matrix. **kwargs Any valid keyword argument of self.apply_function() """ func = self.get_transposed_matrix_transformation(transposed_matrix) if "path_arc" not in kwargs: net_rotation = np.mean( [angle_of_vector(func(RIGHT)), angle_of_vector(func(UP)) - np.pi / 2], ) kwargs["path_arc"] = net_rotation self.apply_function(func, **kwargs) def apply_inverse_transpose( self, t_matrix: np.ndarray | list | tuple, **kwargs: Any ) -> None: """ Applies the inverse of the transformation represented by the given transposed matrix to the number plane and each vector/similar mobject on it. Parameters ---------- t_matrix The matrix. **kwargs Any valid keyword argument of self.apply_transposed_matrix() """ t_inv = np.linalg.inv(np.array(t_matrix).T).T self.apply_transposed_matrix(t_inv, **kwargs) def apply_nonlinear_transformation( self, function: Callable[[np.ndarray], np.ndarray], **kwargs: Any ) -> None: """ Applies the non-linear transformation represented by the given function to the number plane and each vector/similar mobject on it. Parameters ---------- function The function. **kwargs Any valid keyword argument of self.apply_function() """ self.plane.prepare_for_nonlinear_transform() self.apply_function(function, **kwargs) def apply_function( self, function: MappingFunction, added_anims: list[Animation] = [], **kwargs: Any, ) -> None: """ Applies the given function to each of the mobjects in self.transformable_mobjects, and plays the animation showing this. Parameters ---------- function The function that affects each point of each mobject in self.transformable_mobjects. added_anims Any other animations that need to be played simultaneously with this. **kwargs Any valid keyword argument of a self.play() call. """ if "run_time" not in kwargs: kwargs["run_time"] = 3 anims = ( [ ApplyPointwiseFunction(function, t_mob) # type: ignore[arg-type] for t_mob in self.transformable_mobjects ] + [ self.get_vector_movement(function), self.get_transformable_label_movement(), self.get_moving_mobject_movement(function), ] + [Animation(f_mob) for f_mob in self.foreground_mobjects] + added_anims ) self.play(*anims, **kwargs) ManimCommunity-manim-1157b74/manim/scene/zoomed_scene.py000066400000000000000000000166261515024150700232700ustar00rootroot00000000000000"""A scene supporting zooming in on a specified section. Examples -------- .. manim:: UseZoomedScene class UseZoomedScene(ZoomedScene): def construct(self): dot = Dot().set_color(GREEN) self.add(dot) self.wait(1) self.activate_zooming(animate=False) self.wait(1) self.play(dot.animate.shift(LEFT)) .. manim:: ChangingZoomScale class ChangingZoomScale(ZoomedScene): def __init__(self, **kwargs): ZoomedScene.__init__( self, zoom_factor=0.3, zoomed_display_height=1, zoomed_display_width=3, image_frame_stroke_width=20, zoomed_camera_config={ "default_frame_stroke_width": 3, }, **kwargs ) def construct(self): dot = Dot().set_color(GREEN) sq = Circle(fill_opacity=1, radius=0.2).next_to(dot, RIGHT) self.add(dot, sq) self.wait(1) self.activate_zooming(animate=False) self.wait(1) self.play(dot.animate.shift(LEFT * 0.3)) self.play(self.zoomed_camera.frame.animate.scale(4)) self.play(self.zoomed_camera.frame.animate.shift(0.5 * DOWN)) """ from __future__ import annotations __all__ = ["ZoomedScene"] from typing import TYPE_CHECKING, Any from ..animation.transform import ApplyMethod from ..camera.camera import Camera from ..camera.moving_camera import MovingCamera from ..camera.multi_camera import MultiCamera from ..constants import * from ..mobject.types.image_mobject import ImageMobjectFromCamera from ..renderer.opengl_renderer import OpenGLCamera from ..scene.moving_camera_scene import MovingCameraScene if TYPE_CHECKING: from manim.typing import Point3DLike, Vector3D # Note, any scenes from old videos using ZoomedScene will almost certainly # break, as it was restructured. class ZoomedScene(MovingCameraScene): """This is a Scene with special configurations made for when a particular part of the scene must be zoomed in on and displayed separately. """ def __init__( self, camera_class: type[Camera] = MultiCamera, zoomed_display_height: float = 3, zoomed_display_width: float = 3, zoomed_display_center: Point3DLike | None = None, zoomed_display_corner: Vector3D = UP + RIGHT, zoomed_display_corner_buff: float = DEFAULT_MOBJECT_TO_EDGE_BUFFER, zoomed_camera_config: dict[str, Any] = { "default_frame_stroke_width": 2, "background_opacity": 1, }, zoomed_camera_image_mobject_config: dict[str, Any] = {}, zoomed_camera_frame_starting_position: Point3DLike = ORIGIN, zoom_factor: float = 0.15, image_frame_stroke_width: float = 3, zoom_activated: bool = False, **kwargs: Any, ) -> None: self.zoomed_display_height = zoomed_display_height self.zoomed_display_width = zoomed_display_width self.zoomed_display_center = zoomed_display_center self.zoomed_display_corner = zoomed_display_corner self.zoomed_display_corner_buff = zoomed_display_corner_buff self.zoomed_camera_config = zoomed_camera_config self.zoomed_camera_image_mobject_config = zoomed_camera_image_mobject_config self.zoomed_camera_frame_starting_position = ( zoomed_camera_frame_starting_position ) self.zoom_factor = zoom_factor self.image_frame_stroke_width = image_frame_stroke_width self.zoom_activated = zoom_activated super().__init__(camera_class=camera_class, **kwargs) def setup(self) -> None: """This method is used internally by Manim to setup the scene for proper use. """ super().setup() # Initialize camera and display zoomed_camera = MovingCamera(**self.zoomed_camera_config) zoomed_display = ImageMobjectFromCamera( zoomed_camera, **self.zoomed_camera_image_mobject_config ) zoomed_display.add_display_frame() for mob in zoomed_camera.frame, zoomed_display: mob.stretch_to_fit_height(self.zoomed_display_height) mob.stretch_to_fit_width(self.zoomed_display_width) zoomed_camera.frame.scale(self.zoom_factor) # Position camera and display zoomed_camera.frame.move_to(self.zoomed_camera_frame_starting_position) if self.zoomed_display_center is not None: zoomed_display.move_to(self.zoomed_display_center) else: zoomed_display.to_corner( self.zoomed_display_corner, buff=self.zoomed_display_corner_buff, ) self.zoomed_camera = zoomed_camera self.zoomed_display = zoomed_display def activate_zooming(self, animate: bool = False) -> None: """This method is used to activate the zooming for the zoomed_camera. Parameters ---------- animate Whether or not to animate the activation of the zoomed camera. """ self.zoom_activated = True self.renderer.camera.add_image_mobject_from_camera(self.zoomed_display) # type: ignore[union-attr] if animate: self.play(self.get_zoom_in_animation()) self.play(self.get_zoomed_display_pop_out_animation()) self.add_foreground_mobjects( self.zoomed_camera.frame, self.zoomed_display, ) def get_zoom_in_animation(self, run_time: float = 2, **kwargs: Any) -> ApplyMethod: """Returns the animation of camera zooming in. Parameters ---------- run_time The run_time of the animation of the camera zooming in. **kwargs Any valid keyword arguments of ApplyMethod() Returns ------- ApplyMethod The animation of the camera zooming in. """ frame = self.zoomed_camera.frame if isinstance(self.camera, OpenGLCamera): full_frame_width, full_frame_height = self.camera.frame_shape else: full_frame_height = self.camera.frame_height full_frame_width = self.camera.frame_width frame.save_state() frame.stretch_to_fit_width(full_frame_width) frame.stretch_to_fit_height(full_frame_height) frame.center() frame.set_stroke(width=0) return ApplyMethod(frame.restore, run_time=run_time, **kwargs) def get_zoomed_display_pop_out_animation(self, **kwargs: Any) -> ApplyMethod: """This is the animation of the popping out of the mini-display that shows the content of the zoomed camera. Returns ------- ApplyMethod The Animation of the Zoomed Display popping out. """ display = self.zoomed_display display.save_state() display.replace(self.zoomed_camera.frame, stretch=True) return ApplyMethod(display.restore) def get_zoom_factor(self) -> float: """Returns the Zoom factor of the Zoomed camera. Defined as the ratio between the height of the zoomed camera and the height of the zoomed mini display. Returns ------- float The zoom factor. """ zoom_factor: float = ( self.zoomed_camera.frame.height / self.zoomed_display.height ) return zoom_factor ManimCommunity-manim-1157b74/manim/templates/000077500000000000000000000000001515024150700211325ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/templates/Axes.mtp000066400000000000000000000004711515024150700225560ustar00rootroot00000000000000class AxesTemplate(Scene): def construct(self): graph = Axes( x_range=[-1,10,1], y_range=[-1,10,1], x_length=9, y_length=6, axis_config={"include_tip":False} ) labels = graph.get_axis_labels() self.add(graph, labels) ManimCommunity-manim-1157b74/manim/templates/Default.mtp000066400000000000000000000010431515024150700232360ustar00rootroot00000000000000class DefaultTemplate(Scene): def construct(self): circle = Circle() # create a circle circle.set_fill(PINK, opacity=0.5) # set color and transparency square = Square() # create a square square.flip(RIGHT) # flip horizontally square.rotate(-3 * TAU / 8) # rotate a certain amount self.play(Create(square)) # animate the creation of the square self.play(Transform(square, circle)) # interpolate the square into the circle self.play(FadeOut(square)) # fade out animation ManimCommunity-manim-1157b74/manim/templates/MovingCamera.mtp000066400000000000000000000005071515024150700242260ustar00rootroot00000000000000class MovingCameraTemplate(MovingCameraScene): def construct(self): text = Text("Hello World").set_color(BLUE) self.add(text) self.camera.frame.save_state() self.play(self.camera.frame.animate.set(width=text.width * 1.2)) self.wait(0.3) self.play(Restore(self.camera.frame)) ManimCommunity-manim-1157b74/manim/templates/template.cfg000066400000000000000000000002061515024150700234240ustar00rootroot00000000000000[CLI] frame_rate = 30 pixel_height = 480 pixel_width = 854 background_color = BLACK background_opacity = 1 scene_names = DefaultScene ManimCommunity-manim-1157b74/manim/typing.py000066400000000000000000000636041515024150700210310ustar00rootroot00000000000000"""Custom type definitions used in Manim. .. admonition:: Note for developers :class: important Around the source code there are multiple strings which look like this: .. code-block:: ''' [CATEGORY] ''' All type aliases defined under those strings will be automatically classified under that category. If you need to define a new category, respect the format described above. """ from __future__ import annotations from collections.abc import Callable, Sequence from os import PathLike from typing import TypeAlias import numpy as np import numpy.typing as npt __all__ = [ "ManimFloat", "ManimInt", "ManimColorDType", "FloatRGB", "FloatRGBLike", "FloatRGB_Array", "FloatRGBLike_Array", "IntRGB", "IntRGBLike", "FloatRGBA", "FloatRGBALike", "FloatRGBA_Array", "FloatRGBALike_Array", "IntRGBA", "IntRGBALike", "FloatHSV", "FloatHSVLike", "FloatHSL", "FloatHSLLike", "FloatHSVA", "FloatHSVALike", "ManimColorInternal", "PointDType", "Point2D", "Point2DLike", "Point2D_Array", "Point2DLike_Array", "Point3D", "Point3DLike", "Point3D_Array", "Point3DLike_Array", "PointND", "PointNDLike", "PointND_Array", "PointNDLike_Array", "Vector2D", "Vector2DLike", "Vector2D_Array", "Vector2DLike_Array", "Vector3D", "Vector3DLike", "Vector3D_Array", "Vector3DLike_Array", "VectorND", "VectorNDLike", "VectorND_Array", "VectorNDLike_Array", "RowVector", "ColVector", "MatrixMN", "Zeros", "QuadraticBezierPoints", "QuadraticBezierPointsLike", "QuadraticBezierPoints_Array", "QuadraticBezierPointsLike_Array", "QuadraticBezierPath", "QuadraticBezierPathLike", "QuadraticSpline", "QuadraticSplineLike", "CubicBezierPoints", "CubicBezierPointsLike", "CubicBezierPoints_Array", "CubicBezierPointsLike_Array", "CubicBezierPath", "CubicBezierPathLike", "CubicSpline", "CubicSplineLike", "BezierPoints", "BezierPointsLike", "BezierPoints_Array", "BezierPointsLike_Array", "BezierPath", "BezierPathLike", "Spline", "SplineLike", "FlatBezierPoints", "FunctionOverride", "PathFuncType", "MappingFunction", "MultiMappingFunction", "PixelArray", "GrayscalePixelArray", "RGBPixelArray", "RGBAPixelArray", "StrPath", "StrOrBytesPath", ] """ [CATEGORY] Primitive data types """ ManimFloat: TypeAlias = np.float64 """A double-precision floating-point value (64 bits, or 8 bytes), according to the IEEE 754 standard. """ ManimInt: TypeAlias = np.int64 r"""A long integer (64 bits, or 8 bytes). It can take values between :math:`-2^{63}` and :math:`+2^{63} - 1`, which expressed in base 10 is a range between around :math:`-9.223 \cdot 10^{18}` and :math:`+9.223 \cdot 10^{18}`. """ """ [CATEGORY] Color types """ ManimColorDType: TypeAlias = ManimFloat """Data type used in :class:`~.ManimColorInternal`: a double-precision float between 0 and 1. """ FloatRGB: TypeAlias = npt.NDArray[ManimColorDType] """``shape: (3,)`` A :class:`numpy.ndarray` of 3 floats between 0 and 1, representing a color in RGB format. Its components describe, in order, the intensity of Red, Green, and Blue in the represented color. """ FloatRGBLike: TypeAlias = FloatRGB | tuple[float, float, float] """``shape: (3,)`` An array of 3 floats between 0 and 1, representing a color in RGB format. This represents anything which can be converted to a :class:`.FloatRGB` NumPy array. """ FloatRGB_Array: TypeAlias = npt.NDArray[ManimColorDType] """``shape: (M, 3)`` A :class:`numpy.ndarray` of many rows of 3 floats representing RGB colors. """ FloatRGBLike_Array: TypeAlias = FloatRGB_Array | Sequence[FloatRGBLike] """``shape: (M, 3)`` An array of many rows of 3 floats representing RGB colors. This represents anything which can be converted to a :class:`.FloatRGB_Array` NumPy array. """ IntRGB: TypeAlias = npt.NDArray[ManimInt] """``shape: (3,)`` A :class:`numpy.ndarray` of 3 integers between 0 and 255, representing a color in RGB format. Its components describe, in order, the intensity of Red, Green, and Blue in the represented color. """ IntRGBLike: TypeAlias = IntRGB | tuple[int, int, int] """``shape: (3,)`` An array of 3 integers between 0 and 255, representing a color in RGB format. This represents anything which can be converted to an :class:`.IntRGB` NumPy array. """ FloatRGBA: TypeAlias = npt.NDArray[ManimColorDType] """``shape: (4,)`` A :class:`numpy.ndarray` of 4 floats between 0 and 1, representing a color in RGBA format. Its components describe, in order, the intensity of Red, Green, Blue and Alpha (opacity) in the represented color. """ FloatRGBALike: TypeAlias = FloatRGBA | tuple[float, float, float, float] """``shape: (4,)`` An array of 4 floats between 0 and 1, representing a color in RGBA format. This represents anything which can be converted to a :class:`.FloatRGBA` NumPy array. """ FloatRGBA_Array: TypeAlias = npt.NDArray[ManimColorDType] """``shape: (M, 4)`` A :class:`numpy.ndarray` of many rows of 4 floats representing RGBA colors. """ FloatRGBALike_Array: TypeAlias = FloatRGBA_Array | Sequence[FloatRGBALike] """``shape: (M, 4)`` An array of many rows of 4 floats representing RGBA colors. This represents anything which can be converted to a :class:`.FloatRGBA_Array` NumPy array. """ IntRGBA: TypeAlias = npt.NDArray[ManimInt] """``shape: (4,)`` A :class:`numpy.ndarray` of 4 integers between 0 and 255, representing a color in RGBA format. Its components describe, in order, the intensity of Red, Green, Blue and Alpha (opacity) in the represented color. """ IntRGBALike: TypeAlias = IntRGBA | tuple[int, int, int, int] """``shape: (4,)`` An array of 4 integers between 0 and 255, representing a color in RGBA format. This represents anything which can be converted to an :class:`.IntRGBA` NumPy array. """ FloatHSV: TypeAlias = FloatRGB """``shape: (3,)`` A :class:`numpy.ndarray` of 3 floats between 0 and 1, representing a color in HSV (or HSB) format. Its components describe, in order, the Hue, Saturation and Value (or Brightness) in the represented color. """ FloatHSVLike: TypeAlias = FloatRGBLike """``shape: (3,)`` An array of 3 floats between 0 and 1, representing a color in HSV (or HSB) format. This represents anything which can be converted to a :class:`.FloatHSV` NumPy array. """ FloatHSVA: TypeAlias = FloatRGBA """``shape: (4,)`` A :class:`numpy.ndarray` of 4 floats between 0 and 1, representing a color in HSVA (or HSBA) format. Its components describe, in order, the Hue, Saturation and Value (or Brightness) in the represented color. """ FloatHSVALike: TypeAlias = FloatRGBALike """``shape: (4,)`` An array of 4 floats between 0 and 1, representing a color in HSVA (or HSBA) format. This represents anything which can be converted to a :class:`.FloatHSVA` NumPy array. """ FloatHSL: TypeAlias = FloatRGB """``shape: (3,)`` A :class:`numpy.ndarray` of 3 floats between 0 and 1, representing a color in HSL format. Its components describe, in order, the Hue, Saturation and Lightness in the represented color. """ FloatHSLLike: TypeAlias = FloatRGBLike """``shape: (3,)`` An array of 3 floats between 0 and 1, representing a color in HSL format. This represents anything which can be converted to a :class:`.FloatHSL` NumPy array. """ ManimColorInternal: TypeAlias = FloatRGBA """``shape: (4,)`` Internal color representation used by :class:`~.ManimColor`, following the RGBA format. It is a :class:`numpy.ndarray` consisting of 4 floats between 0 and 1, describing respectively the intensities of Red, Green, Blue and Alpha (opacity) in the represented color. """ """ [CATEGORY] Point types """ PointDType: TypeAlias = ManimFloat """Default type for arrays representing points: a double-precision floating point value. """ Point2D: TypeAlias = npt.NDArray[PointDType] """``shape: (2,)`` A NumPy array representing a 2-dimensional point: ``[float, float]``. """ Point2DLike: TypeAlias = Point2D | tuple[float, float] """``shape: (2,)`` A 2-dimensional point: ``[float, float]``. This represents anything which can be converted to a :class:`.Point2D` NumPy array. """ Point2D_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (M, 2)`` A NumPy array representing a sequence of :class:`.Point2D` objects: ``[[float, float], ...]``. """ Point2DLike_Array: TypeAlias = Point2D_Array | Sequence[Point2DLike] """``shape: (M, 2)`` An array of :class:`.Point2DLike` objects: ``[[float, float], ...]``. This represents anything which can be converted to a :class:`.Point2D_Array` NumPy array. Please refer to the documentation of the function you are using for further type information. """ Point3D: TypeAlias = npt.NDArray[PointDType] """``shape: (3,)`` A NumPy array representing a 3-dimensional point: ``[float, float, float]``. """ Point3DLike: TypeAlias = Point3D | tuple[float, float, float] """``shape: (3,)`` A 3-dimensional point: ``[float, float, float]``. This represents anything which can be converted to a :class:`.Point3D` NumPy array. """ Point3D_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (M, 3)`` A NumPy array representing a sequence of :class:`.Point3D` objects: ``[[float, float, float], ...]``. """ Point3DLike_Array: TypeAlias = Point3D_Array | Sequence[Point3DLike] """``shape: (M, 3)`` An array of :class:`.Point3DLike` objects: ``[[float, float, float], ...]``. This represents anything which can be converted to a :class:`.Point3D_Array` NumPy array. Please refer to the documentation of the function you are using for further type information. """ PointND: TypeAlias = npt.NDArray[PointDType] """``shape: (N,)`` A NumPy array representing an N-dimensional point: ``[float, ...]``. """ PointNDLike: TypeAlias = PointND | Sequence[float] """``shape: (N,)`` An N-dimensional point: ``[float, ...]``. This represents anything which can be converted to a :class:`.PointND` NumPy array. """ PointND_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (M, N)`` A NumPy array representing a sequence of :class:`.PointND` objects: ``[[float, ...], ...]``. """ PointNDLike_Array: TypeAlias = PointND_Array | Sequence[PointNDLike] """``shape: (M, N)`` An array of :class:`.PointNDLike` objects: ``[[float, ...], ...]``. This represents anything which can be converted to a :class:`.PointND_Array` NumPy array. Please refer to the documentation of the function you are using for further type information. """ """ [CATEGORY] Vector types """ Vector2D: TypeAlias = npt.NDArray[PointDType] """``shape: (2,)`` A NumPy array representing a 2-dimensional vector: ``[float, float]``. .. caution:: Do not confuse with the :class:`~.Vector` or :class:`~.Arrow` VMobjects! """ Vector2DLike: TypeAlias = npt.NDArray[PointDType] | tuple[float, float] """``shape: (2,)`` A 2-dimensional vector: ``[float, float]``. This represents anything which can be converted to a :class:`.Vector2D` NumPy array. .. caution:: Do not confuse with the :class:`~.Vector` or :class:`~.Arrow` VMobjects! """ Vector2D_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (M, 2)`` A NumPy array representing a sequence of :class:`.Vector2D` objects: ``[[float, float], ...]``. """ Vector2DLike_Array: TypeAlias = Vector2D_Array | Sequence[Vector2DLike] """``shape: (M, 2)`` An array of :class:`.Vector2DLike` objects: ``[[float, float], ...]``. This represents anything which can be converted to a :class:`.Vector2D_Array` NumPy array. """ Vector3D: TypeAlias = npt.NDArray[PointDType] """``shape: (3,)`` A NumPy array representing a 3-dimensional vector: ``[float, float, float]``. .. caution:: Do not confuse with the :class:`~.Vector` or :class:`~.Arrow3D` VMobjects! """ Vector3DLike: TypeAlias = npt.NDArray[PointDType] | tuple[float, float, float] """``shape: (3,)`` A 3-dimensional vector: ``[float, float, float]``. This represents anything which can be converted to a :class:`.Vector3D` NumPy array. .. caution:: Do not confuse with the :class:`~.Vector` or :class:`~.Arrow3D` VMobjects! """ Vector3D_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (M, 3)`` An NumPy array representing a sequence of :class:`.Vector3D` objects: ``[[float, float, float], ...]``. """ Vector3DLike_Array: TypeAlias = npt.NDArray[PointDType] | Sequence[Vector3DLike] """``shape: (M, 3)`` An array of :class:`.Vector3DLike` objects: ``[[float, float, float], ...]``. This represents anything which can be converted to a :class:`.Vector3D_Array` NumPy array. """ VectorND: TypeAlias = npt.NDArray[PointDType] """``shape (N,)`` A NumPy array representing an :math:`N`-dimensional vector: ``[float, ...]``. .. caution:: Do not confuse with the :class:`~.Vector` VMobject! This type alias is named "VectorND" instead of "Vector" to avoid potential name collisions. """ VectorNDLike: TypeAlias = npt.NDArray[PointDType] | Sequence[float] """``shape (N,)`` An :math:`N`-dimensional vector: ``[float, ...]``. This represents anything which can be converted to a :class:`.VectorND` NumPy array. .. caution:: Do not confuse with the :class:`~.Vector` VMobject! This type alias is named "VectorND" instead of "Vector" to avoid potential name collisions. """ VectorND_Array: TypeAlias = npt.NDArray[PointDType] """``shape (M, N)`` A NumPy array representing a sequence of :class:`.VectorND` objects: ``[[float, ...], ...]``. """ VectorNDLike_Array: TypeAlias = npt.NDArray[PointDType] | Sequence[VectorNDLike] """``shape (M, N)`` An array of :class:`.VectorNDLike` objects: ``[[float, ...], ...]``. This represents anything which can be converted to a :class:`.VectorND_Array` NumPy array. """ RowVector: TypeAlias = npt.NDArray[PointDType] """``shape: (1, N)`` A row vector: ``[[float, ...]]``. """ ColVector: TypeAlias = npt.NDArray[PointDType] """``shape: (N, 1)`` A column vector: ``[[float], [float], ...]``. """ """ [CATEGORY] Matrix types """ MatrixMN: TypeAlias = npt.NDArray[PointDType] """``shape: (M, N)`` A matrix: ``[[float, ...], [float, ...], ...]``. """ Zeros: TypeAlias = MatrixMN """``shape: (M, N)`` A :class:`.MatrixMN` filled with zeros, typically created with ``numpy.zeros((M, N))``. """ """ [CATEGORY] Bรฉzier types """ QuadraticBezierPoints: TypeAlias = Point3D_Array """``shape: (3, 3)`` A :class:`.Point3D_Array` of three 3D control points for a single quadratic Bรฉzier curve: ``[[float, float, float], [float, float, float], [float, float, float]]``. """ QuadraticBezierPointsLike: TypeAlias = ( QuadraticBezierPoints | tuple[Point3DLike, Point3DLike, Point3DLike] ) """``shape: (3, 3)`` A :class:`.Point3DLike_Array` of three 3D control points for a single quadratic Bรฉzier curve: ``[[float, float, float], [float, float, float], [float, float, float]]``. This represents anything which can be converted to a :class:`.QuadraticBezierPoints` NumPy array. """ QuadraticBezierPoints_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (N, 3, 3)`` A NumPy array containing :math:`N` :class:`.QuadraticBezierPoints` objects: ``[[[float, float, float], [float, float, float], [float, float, float]], ...]``. """ QuadraticBezierPointsLike_Array: TypeAlias = ( QuadraticBezierPoints_Array | Sequence[QuadraticBezierPointsLike] ) """``shape: (N, 3, 3)`` A sequence of :math:`N` :class:`.QuadraticBezierPointsLike` objects: ``[[[float, float, float], [float, float, float], [float, float, float]], ...]``. This represents anything which can be converted to a :class:`.QuadraticBezierPoints_Array` NumPy array. """ QuadraticBezierPath: TypeAlias = Point3D_Array """``shape: (3*N, 3)`` A :class:`.Point3D_Array` of :math:`3N` points, where each one of the :math:`N` consecutive blocks of 3 points represents a quadratic Bรฉzier curve: ``[[float, float, float], ...], ...]``. Please refer to the documentation of the function you are using for further type information. """ QuadraticBezierPathLike: TypeAlias = Point3DLike_Array """``shape: (3*N, 3)`` A :class:`.Point3DLike_Array` of :math:`3N` points, where each one of the :math:`N` consecutive blocks of 3 points represents a quadratic Bรฉzier curve: ``[[float, float, float], ...], ...]``. This represents anything which can be converted to a :class:`.QuadraticBezierPath` NumPy array. Please refer to the documentation of the function you are using for further type information. """ QuadraticSpline: TypeAlias = QuadraticBezierPath """``shape: (3*N, 3)`` A special case of :class:`.QuadraticBezierPath` where all the :math:`N` quadratic Bรฉzier curves are connected, forming a quadratic spline: ``[[float, float, float], ...], ...]``. Please refer to the documentation of the function you are using for further type information. """ QuadraticSplineLike: TypeAlias = QuadraticBezierPathLike """``shape: (3*N, 3)`` A special case of :class:`.QuadraticBezierPathLike` where all the :math:`N` quadratic Bรฉzier curves are connected, forming a quadratic spline: ``[[float, float, float], ...], ...]``. This represents anything which can be converted to a :class:`.QuadraticSpline` NumPy array. Please refer to the documentation of the function you are using for further type information. """ CubicBezierPoints: TypeAlias = Point3D_Array """``shape: (4, 3)`` A :class:`.Point3D_Array` of four 3D control points for a single cubic Bรฉzier curve: ``[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]``. """ CubicBezierPointsLike: TypeAlias = ( CubicBezierPoints | tuple[Point3DLike, Point3DLike, Point3DLike, Point3DLike] ) """``shape: (4, 3)`` A :class:`.Point3DLike_Array` of 4 control points for a single cubic Bรฉzier curve: ``[[float, float, float], [float, float, float], [float, float, float], [float, float, float]]``. This represents anything which can be converted to a :class:`.CubicBezierPoints` NumPy array. """ CubicBezierPoints_Array: TypeAlias = npt.NDArray[PointDType] """``shape: (N, 4, 3)`` A NumPy array containing :math:`N` :class:`.CubicBezierPoints` objects: ``[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]``. """ CubicBezierPointsLike_Array: TypeAlias = ( CubicBezierPoints_Array | Sequence[CubicBezierPointsLike] ) """``shape: (N, 4, 3)`` A sequence of :math:`N` :class:`.CubicBezierPointsLike` objects: ``[[[float, float, float], [float, float, float], [float, float, float], [float, float, float]], ...]``. This represents anything which can be converted to a :class:`.CubicBezierPoints_Array` NumPy array. """ CubicBezierPath: TypeAlias = Point3D_Array """``shape: (4*N, 3)`` A :class:`.Point3D_Array` of :math:`4N` points, where each one of the :math:`N` consecutive blocks of 4 points represents a cubic Bรฉzier curve: ``[[float, float, float], ...], ...]``. Please refer to the documentation of the function you are using for further type information. """ CubicBezierPathLike: TypeAlias = Point3DLike_Array """``shape: (4*N, 3)`` A :class:`.Point3DLike_Array` of :math:`4N` points, where each one of the :math:`N` consecutive blocks of 4 points represents a cubic Bรฉzier curve: ``[[float, float, float], ...], ...]``. This represents anything which can be converted to a :class:`.CubicBezierPath` NumPy array. Please refer to the documentation of the function you are using for further type information. """ CubicSpline: TypeAlias = CubicBezierPath """``shape: (4*N, 3)`` A special case of :class:`.CubicBezierPath` where all the :math:`N` cubic Bรฉzier curves are connected, forming a quadratic spline: ``[[float, float, float], ...], ...]``. Please refer to the documentation of the function you are using for further type information. """ CubicSplineLike: TypeAlias = CubicBezierPathLike """``shape: (4*N, 3)`` A special case of :class:`.CubicBezierPath` where all the :math:`N` cubic Bรฉzier curves are connected, forming a quadratic spline: ``[[float, float, float], ...], ...]``. This represents anything which can be converted to a :class:`.CubicSpline` NumPy array. Please refer to the documentation of the function you are using for further type information. """ BezierPoints: TypeAlias = Point3D_Array r"""``shape: (PPC, 3)`` A :class:`.Point3D_Array` of :math:`\text{PPC}` control points (:math:`\text{PPC: Points Per Curve} = n + 1`) for a single :math:`n`-th degree Bรฉzier curve: ``[[float, float, float], ...]``. Please refer to the documentation of the function you are using for further type information. """ BezierPointsLike: TypeAlias = Point3DLike_Array r"""``shape: (PPC, 3)`` A :class:`.Point3DLike_Array` of :math:`\text{PPC}` control points (:math:`\text{PPC: Points Per Curve} = n + 1`) for a single :math:`n`-th degree Bรฉzier curve: ``[[float, float, float], ...]``. This represents anything which can be converted to a :class:`.BezierPoints` NumPy array. Please refer to the documentation of the function you are using for further type information. """ BezierPoints_Array: TypeAlias = npt.NDArray[PointDType] r"""``shape: (N, PPC, 3)`` A NumPy array of :math:`N` :class:`.BezierPoints` objects containing :math:`\text{PPC}` :class:`.Point3D` objects each (:math:`\text{PPC: Points Per Curve} = n + 1`): ``[[[float, float, float], ...], ...]``. Please refer to the documentation of the function you are using for further type information. """ BezierPointsLike_Array: TypeAlias = BezierPoints_Array | Sequence[BezierPointsLike] r"""``shape: (N, PPC, 3)`` A sequence of :math:`N` :class:`.BezierPointsLike` objects containing :math:`\text{PPC}` :class:`.Point3DLike` objects each (:math:`\text{PPC: Points Per Curve} = n + 1`): ``[[[float, float, float], ...], ...]``. This represents anything which can be converted to a :class:`.BezierPoints_Array` NumPy array. Please refer to the documentation of the function you are using for further type information. """ BezierPath: TypeAlias = Point3D_Array r"""``shape: (PPC*N, 3)`` A :class:`.Point3D_Array` of :math:`\text{PPC} \cdot N` points, where each one of the :math:`N` consecutive blocks of :math:`\text{PPC}` control points (:math:`\text{PPC: Points Per Curve} = n + 1`) represents a Bรฉzier curve of :math:`n`-th degree: ``[[float, float, float], ...], ...]``. Please refer to the documentation of the function you are using for further type information. """ BezierPathLike: TypeAlias = Point3DLike_Array r"""``shape: (PPC*N, 3)`` A :class:`.Point3DLike_Array` of :math:`\text{PPC} \cdot N` points, where each one of the :math:`N` consecutive blocks of :math:`\text{PPC}` control points (:math:`\text{PPC: Points Per Curve} = n + 1`) represents a Bรฉzier curve of :math:`n`-th degree: ``[[float, float, float], ...], ...]``. This represents anything which can be converted to a :class:`.BezierPath` NumPy array. Please refer to the documentation of the function you are using for further type information. """ Spline: TypeAlias = BezierPath r"""``shape: (PPC*N, 3)`` A special case of :class:`.BezierPath` where all the :math:`N` Bรฉzier curves consisting of :math:`\text{PPC}` :class:`.Point3D` objects (:math:`\text{PPC: Points Per Curve} = n + 1`) are connected, forming an :math:`n`-th degree spline: ``[[float, float, float], ...], ...]``. Please refer to the documentation of the function you are using for further type information. """ SplineLike: TypeAlias = BezierPathLike r"""``shape: (PPC*N, 3)`` A special case of :class:`.BezierPathLike` where all the :math:`N` Bรฉzier curves consisting of :math:`\text{PPC}` :class:`.Point3D` objects (:math:`\text{PPC: Points Per Curve} = n + 1`) are connected, forming an :math:`n`-th degree spline: ``[[float, float, float], ...], ...]``. This represents anything which can be converted to a :class:`.Spline` NumPy array. Please refer to the documentation of the function you are using for further type information. """ FlatBezierPoints: TypeAlias = npt.NDArray[PointDType] | tuple[float, ...] """``shape: (3*PPC*N,)`` A flattened array of Bรฉzier control points: ``[float, ...]``. """ """ [CATEGORY] Function types """ # Due to current limitations # (see https://github.com/python/mypy/issues/14656 / 8263), # we don't specify the first argument type (Mobject). # Nor are we able to specify the return type (Animation) since we cannot import # that here. FunctionOverride: TypeAlias = Callable """Function type returning an :class:`~.Animation` for the specified :class:`~.Mobject`. """ PathFuncType: TypeAlias = Callable[[Point3DLike, Point3DLike, float], Point3DLike] """Function mapping two :class:`.Point3D` objects and an alpha value to a new :class:`.Point3D`. """ MappingFunction: TypeAlias = Callable[[Point3D], Point3D] """A function mapping a :class:`.Point3D` to another :class:`.Point3D`.""" MultiMappingFunction: TypeAlias = Callable[[Point3D_Array], Point3D_Array] """A function mapping a :class:`.Point3D_Array` to another :class:`.Point3D_Array`. """ """ [CATEGORY] Image types """ PixelArray: TypeAlias = npt.NDArray[ManimInt] """``shape: (height, width) | (height, width, 3) | (height, width, 4)`` A rasterized image with a height of ``height`` pixels and a width of ``width`` pixels. Every value in the array is an integer from 0 to 255. Every pixel is represented either by a single integer indicating its lightness (for greyscale images), an :class:`.RGB_Array_Int` or an `RGBA_Array_Int`. """ GrayscalePixelArray: TypeAlias = PixelArray """``shape: (height, width)`` A 100% opaque grayscale :class:`.PixelArray`, where every pixel value is a `ManimInt` indicating its lightness (black -> gray -> white). """ RGBPixelArray: TypeAlias = PixelArray """``shape: (height, width, 3)`` A 100% opaque :class:`.PixelArray` in color, where every pixel value is an `RGB_Array_Int` object. """ RGBAPixelArray: TypeAlias = PixelArray """``shape: (height, width, 4)`` A :class:`.PixelArray` in color where pixels can be transparent. Every pixel value is an :class:`.RGBA_Array_Int` object. """ """ [CATEGORY] Path types """ StrPath: TypeAlias = str | PathLike[str] """A string or :class:`.os.PathLike` representing a path to a directory or file. """ StrOrBytesPath: TypeAlias = str | bytes | PathLike[str] | PathLike[bytes] """A string, bytes or :class:`.os.PathLike` object representing a path to a directory or file. """ ManimCommunity-manim-1157b74/manim/utils/000077500000000000000000000000001515024150700202745ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/utils/__init__.py000066400000000000000000000000001515024150700223730ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/utils/bezier.py000066400000000000000000002075561515024150700221450ustar00rootroot00000000000000"""Utility functions related to Bรฉzier curves.""" from __future__ import annotations __all__ = [ "bezier", "partial_bezier_points", "split_bezier", "subdivide_bezier", "bezier_remap", "interpolate", "integer_interpolate", "mid", "inverse_interpolate", "match_interpolate", "get_smooth_cubic_bezier_handle_points", "is_closed", "proportions_along_bezier_curve_for_point", "point_lies_on_bezier", ] from collections.abc import Callable, Sequence from functools import reduce from typing import TYPE_CHECKING, overload import numpy as np from manim.utils.simple_functions import choose if TYPE_CHECKING: from manim.typing import ( BezierPoints, BezierPoints_Array, BezierPointsLike, BezierPointsLike_Array, ColVector, MatrixMN, Point3D, Point3D_Array, Point3DLike, Point3DLike_Array, QuadraticBezierPath, QuadraticSpline, Spline, ) # l is a commonly used name in linear algebra # ruff: noqa: E741 @overload def bezier( points: BezierPointsLike, ) -> Callable[[float | ColVector], Point3D | Point3D_Array]: ... @overload def bezier( points: Sequence[Point3DLike_Array], ) -> Callable[[float | ColVector], Point3D_Array]: ... def bezier( points: Point3D_Array | Sequence[Point3D_Array], ) -> Callable[[float | ColVector], Point3D_Array]: """Classic implementation of a Bรฉzier curve. Parameters ---------- points :math:`(d+1, 3)`-shaped array of :math:`d+1` control points defining a single Bรฉzier curve of degree :math:`d`. Alternatively, for vectorization purposes, ``points`` can also be a :math:`(d+1, M, 3)`-shaped sequence of :math:`d+1` arrays of :math:`M` control points each, which define `M` Bรฉzier curves instead. Returns ------- bezier_func : :class:`typing.Callable` [[:class:`float` | :class:`~.ColVector`], :class:`~.Point3D` | :class:`~.Point3D_Array`] Function describing the Bรฉzier curve. The behaviour of this function depends on the shape of ``points``: * If ``points`` was a :math:`(d+1, 3)` array representing a single Bรฉzier curve, then ``bezier_func`` can receive either: * a :class:`float` ``t``, in which case it returns a single :math:`(1, 3)`-shaped :class:`~.Point3D` representing the evaluation of the Bรฉzier at ``t``, or * an :math:`(n, 1)`-shaped :class:`~.ColVector` containing :math:`n` values to evaluate the Bรฉzier curve at, returning instead an :math:`(n, 3)`-shaped :class:`~.Point3D_Array` containing the points resulting from evaluating the Bรฉzier at each of the :math:`n` values. .. warning:: If passing a vector of :math:`t`-values to ``bezier_func``, it **must** be a column vector/matrix of shape :math:`(n, 1)`. Passing an 1D array of shape :math:`(n,)` is not supported and **will result in undefined behaviour**. * If ``points`` was a :math:`(d+1, M, 3)` array describing :math:`M` Bรฉzier curves, then ``bezier_func`` can receive either: * a :class:`float` ``t``, in which case it returns an :math:`(M, 3)`-shaped :class:`~.Point3D_Array` representing the evaluation of the :math:`M` Bรฉzier curves at the same value ``t``, or * an :math:`(M, 1)`-shaped :class:`~.ColVector` containing :math:`M` values, such that the :math:`i`-th Bรฉzier curve defined by ``points`` is evaluated at the corresponding :math:`i`-th value in ``t``, returning again an :math:`(M, 3)`-shaped :class:`~.Point3D_Array` containing those :math:`M` evaluations. .. warning:: Unlike the previous case, if you pass a :class:`~.ColVector` to ``bezier_func``, it **must** contain exactly :math:`M` values, each value for each of the :math:`M` Bรฉzier curves defined by ``points``. Any array of shape other than :math:`(M, 1)` **will result in undefined behaviour**. """ P = np.asarray(points) degree = P.shape[0] - 1 if degree == 0: def zero_bezier(t: float | ColVector) -> Point3D | Point3D_Array: return np.ones_like(t) * P[0] return zero_bezier if degree == 1: def linear_bezier(t: float | ColVector) -> Point3D | Point3D_Array: return P[0] + t * (P[1] - P[0]) return linear_bezier if degree == 2: def quadratic_bezier(t: float | ColVector) -> Point3D | Point3D_Array: t2 = t * t mt = 1 - t mt2 = mt * mt return mt2 * P[0] + 2 * t * mt * P[1] + t2 * P[2] return quadratic_bezier if degree == 3: def cubic_bezier(t: float | ColVector) -> Point3D | Point3D_Array: t2 = t * t t3 = t2 * t mt = 1 - t mt2 = mt * mt mt3 = mt2 * mt return mt3 * P[0] + 3 * t * mt2 * P[1] + 3 * t2 * mt * P[2] + t3 * P[3] return cubic_bezier def nth_grade_bezier(t: float | ColVector) -> Point3D | Point3D_Array: is_scalar = not isinstance(t, np.ndarray) if is_scalar: B = np.empty((1, *P.shape)) else: assert isinstance(t, np.ndarray) t = t.reshape(-1, *[1 for dim in P.shape]) B = np.empty((t.shape[0], *P.shape)) B[:] = P for i in range(degree): # After the i-th iteration (i in [0, ..., d-1]) there are evaluations at t # of (d-i) Bezier curves of grade (i+1), stored in the first d-i slots of B B[:, : degree - i] += t * (B[:, 1 : degree - i + 1] - B[:, : degree - i]) # In the end, there shall be the evaluation at t of a single Bezier curve of # grade d, stored in the first slot of B if is_scalar: val: Point3D = B[0, 0] return val return B[:, 0] return nth_grade_bezier def partial_bezier_points(points: BezierPointsLike, a: float, b: float) -> BezierPoints: r"""Given an array of ``points`` which define a Bรฉzier curve, and two numbers :math:`a, b` such that :math:`0 \le a < b \le 1`, return an array of the same size, which describes the portion of the original Bรฉzier curve on the interval :math:`[a, b]`. :func:`partial_bezier_points` is conceptually equivalent to calling :func:`split_bezier` twice and discarding unused Bรฉzier curves, but this is more efficient and doesn't waste computations. .. seealso:: See :func:`split_bezier` for an explanation on how to split Bรฉzier curves. .. note:: To find the portion of a Bรฉzier curve with :math:`t` between :math:`a` and :math:`b`: 1. Split the curve at :math:`t = a` and extract its 2nd subcurve. 2. We cannot evaluate the new subcurve at :math:`t = b` because its range of values for :math:`t` is different. To find the correct value, we need to transform the interval :math:`[a, 1]` into :math:`[0, 1]` by first subtracting :math:`a` to get :math:`[0, 1-a]` and then dividing by :math:`1-a`. Thus, our new value must be :math:`t = \frac{b - a}{1 - a}`. Define :math:`u = \frac{b - a}{1 - a}`. 3. Split the subcurve at :math:`t = u` and extract its 1st subcurve. The final portion is a linear combination of points, and thus the process can be summarized as a linear transformation by some matrix in terms of :math:`a` and :math:`b`. This matrix is given explicitly for Bรฉzier curves up to degree 3, which are often used in Manim. For higher degrees, the algorithm described previously is used. For the case of a quadratic Bรฉzier curve: * Step 1: .. math:: H'_1 = \begin{pmatrix} (1-a)^2 & 2(1-a)a & a^2 \\ 0 & (1-a) & a \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} p_0 \\ p_1 \\ p_2 \end{pmatrix} * Step 2: .. math:: H''_0 &= \begin{pmatrix} 1 & 0 & 0 \\ (1-u) & u & 0\\ (1-u)^2 & 2(1-u)u & u^2 \end{pmatrix} H'_1 \\ & \\ &= \begin{pmatrix} 1 & 0 & 0 \\ (1-u) & u & 0\\ (1-u)^2 & 2(1-u)u & u^2 \end{pmatrix} \begin{pmatrix} (1-a)^2 & 2(1-a)a & a^2 \\ 0 & (1-a) & a \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} p_0 \\ p_1 \\ p_2 \end{pmatrix} \\ & \\ &= \begin{pmatrix} (1-a)^2 & 2(1-a)a & a^2 \\ (1-a)(1-b) & a(1-b) + (1-a)b & ab \\ (1-b)^2 & 2(1-b)b & b^2 \end{pmatrix} \begin{pmatrix} p_0 \\ p_1 \\ p_2 \end{pmatrix} from where one can define a :math:`(3, 3)` matrix :math:`P_2` which, when applied over the array of ``points``, will return the desired partial quadratic Bรฉzier curve: .. math:: P_2 = \begin{pmatrix} (1-a)^2 & 2(1-a)a & a^2 \\ (1-a)(1-b) & a(1-b) + (1-a)b & ab \\ (1-b)^2 & 2(1-b)b & b^2 \end{pmatrix} Similarly, for the cubic Bรฉzier curve case, one can define the following :math:`(4, 4)` matrix :math:`P_3`: .. math:: P_3 = \begin{pmatrix} (1-a)^3 & 3(1-a)^2a & 3(1-a)a^2 & a^3 \\ (1-a)^2(1-b) & 2(1-a)a(1-b) + (1-a)^2b & a^2(1-b) + 2(1-a)ab & a^2b \\ (1-a)(1-b)^2 & a(1-b)^2 + 2(1-a)(1-b)b & 2a(1-b)b + (1-a)b^2 & ab^2 \\ (1-b)^3 & 3(1-b)^2b & 3(1-b)b^2 & b^3 \end{pmatrix} Parameters ---------- points set of points defining the bezier curve. a lower bound of the desired partial bezier curve. b upper bound of the desired partial bezier curve. Returns ------- :class:`~.BezierPoints` An array containing the control points defining the partial Bรฉzier curve. """ # Border cases if a == 1: arr = np.array(points) arr[:] = arr[-1] return arr if b == 0: arr = np.array(points) arr[:] = arr[0] return arr points = np.asarray(points) degree = points.shape[0] - 1 if degree == 3: ma, mb = 1 - a, 1 - b a2, b2, ma2, mb2 = a * a, b * b, ma * ma, mb * mb a3, b3, ma3, mb3 = a2 * a, b2 * b, ma2 * ma, mb2 * mb portion_matrix = np.array( [ [ma3, 3 * ma2 * a, 3 * ma * a2, a3], [ma2 * mb, 2 * ma * a * mb + ma2 * b, a2 * mb + 2 * ma * a * b, a2 * b], [ma * mb2, a * mb2 + 2 * ma * mb * b, 2 * a * mb * b + ma * b2, a * b2], [mb3, 3 * mb2 * b, 3 * mb * b2, b3], ] ) return portion_matrix @ points if degree == 2: ma, mb = 1 - a, 1 - b portion_matrix = np.array( [ [ma * ma, 2 * a * ma, a * a], [ma * mb, a * mb + ma * b, a * b], [mb * mb, 2 * b * mb, b * b], ] ) return portion_matrix @ points if degree == 1: direction = points[1] - points[0] return np.array( [ points[0] + a * direction, points[0] + b * direction, ] ) if degree == 0: return points # Fallback case for nth degree Bรฉziers # It is convenient that np.array copies points arr = np.array(points, dtype=float) N = arr.shape[0] # Current state for an example Bรฉzier curve C0 = [P0, P1, P2, P3]: # arr = [P0, P1, P2, P3] if a != 0: for i in range(1, N): # 1st iter: arr = [L0(a), L1(a), L2(a), P3] # 2nd iter: arr = [Q0(a), Q1(a), L2(a), P3] # 3rd iter: arr = [C0(a), Q1(a), L2(a), P3] arr[: N - i] += a * (arr[1 : N - i + 1] - arr[: N - i]) # For faster calculations we shall define mu = 1 - u = (1 - b) / (1 - a). # This is because: # L0'(u) = P0' + u(P1' - P0') # = (1-u)P0' + uP1' # = muP0' + (1-mu)P1' # = P1' + mu(P0' - P1) # In this way, one can do something similar to the first loop. # # Current state: # arr = [C0(a), Q1(a), L2(a), P3] # = [P0', P1', P2', P3'] if b != 1: mu = (1 - b) / (1 - a) for i in range(1, N): # 1st iter: arr = [P0', L0'(u), L1'(u), L2'(u)] # 2nd iter: arr = [P0', L0'(u), Q0'(u), Q1'(u)] # 3rd iter: arr = [P0', L0'(u), Q0'(u), C0'(u)] arr[i:] += mu * (arr[i - 1 : -1] - arr[i:]) return arr def split_bezier(points: BezierPointsLike, t: float) -> Spline: r"""Split a Bรฉzier curve at argument ``t`` into two curves. .. note:: .. seealso:: `A Primer on Bรฉzier Curves #10: Splitting curves. Pomax. `_ As an example for a cubic Bรฉzier curve, let :math:`p_0, p_1, p_2, p_3` be the points needed for the curve :math:`C_0 = [p_0, \ p_1, \ p_2, \ p_3]`. Define the 3 linear Bรฉziers :math:`L_0, L_1, L_2` as interpolations of :math:`p_0, p_1, p_2, p_3`: .. math:: L_0(t) &= p_0 + t(p_1 - p_0) \\ L_1(t) &= p_1 + t(p_2 - p_1) \\ L_2(t) &= p_2 + t(p_3 - p_2) Define the 2 quadratic Bรฉziers :math:`Q_0, Q_1` as interpolations of :math:`L_0, L_1, L_2`: .. math:: Q_0(t) &= L_0(t) + t(L_1(t) - L_0(t)) \\ Q_1(t) &= L_1(t) + t(L_2(t) - L_1(t)) Then :math:`C_0` is the following interpolation of :math:`Q_0` and :math:`Q_1`: .. math:: C_0(t) = Q_0(t) + t(Q_1(t) - Q_0(t)) Evaluating :math:`C_0` at a value :math:`t=t'` splits :math:`C_0` into two cubic Bรฉziers :math:`H_0` and :math:`H_1`, defined by some of the points we calculated earlier: .. math:: H_0 &= [p_0, &\ L_0(t'), &\ Q_0(t'), &\ C_0(t') &] \\ H_1 &= [p_0(t'), &\ Q_1(t'), &\ L_2(t'), &\ p_3 &] As the resulting curves are obtained from linear combinations of ``points``, everything can be encoded into a matrix for efficiency, which is done for Bรฉzier curves of degree up to 3. .. seealso:: `A Primer on Bรฉzier Curves #11: Splitting curves using matrices. Pomax. `_ For the simpler case of a quadratic Bรฉzier curve: .. math:: H_0 &= \begin{pmatrix} p_0 \\ (1-t) p_0 + t p_1 \\ (1-t)^2 p_0 + 2(1-t)t p_1 + t^2 p_2 \\ \end{pmatrix} &= \begin{pmatrix} 1 & 0 & 0 \\ (1-t) & t & 0\\ (1-t)^2 & 2(1-t)t & t^2 \end{pmatrix} \begin{pmatrix} p_0 \\ p_1 \\ p_2 \end{pmatrix} \\ & \\ H_1 &= \begin{pmatrix} (1-t)^2 p_0 + 2(1-t)t p_1 + t^2 p_2 \\ (1-t) p_1 + t p_2 \\ p_2 \end{pmatrix} &= \begin{pmatrix} (1-t)^2 & 2(1-t)t & t^2 \\ 0 & (1-t) & t \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} p_0 \\ p_1 \\ p_2 \end{pmatrix} from where one can define a :math:`(6, 3)` split matrix :math:`S_2` which can multiply the array of ``points`` to compute the return value: .. math:: S_2 &= \begin{pmatrix} 1 & 0 & 0 \\ (1-t) & t & 0 \\ (1-t)^2 & 2(1-t)t & t^2 \\ (1-t)^2 & 2(1-t)t & t^2 \\ 0 & (1-t) & t \\ 0 & 0 & 1 \end{pmatrix} \\ & \\ S_2 P &= \begin{pmatrix} 1 & 0 & 0 \\ (1-t) & t & 0 \\ (1-t)^2 & 2(1-t)t & t^2 \\ (1-t)^2 & 2(1-t)t & t^2 \\ 0 & (1-t) & t \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} p_0 \\ p_1 \\ p_2 \end{pmatrix} = \begin{pmatrix} \vert \\ H_0 \\ \vert \\ \vert \\ H_1 \\ \vert \end{pmatrix} For the previous example with a cubic Bรฉzier curve: .. math:: H_0 &= \begin{pmatrix} p_0 \\ (1-t) p_0 + t p_1 \\ (1-t)^2 p_0 + 2(1-t)t p_1 + t^2 p_2 \\ (1-t)^3 p_0 + 3(1-t)^2 t p_1 + 3(1-t)t^2 p_2 + t^3 p_3 \end{pmatrix} &= \begin{pmatrix} 1 & 0 & 0 & 0 \\ (1-t) & t & 0 & 0 \\ (1-t)^2 & 2(1-t)t & t^2 & 0 \\ (1-t)^3 & 3(1-t)^2 t & 3(1-t)t^2 & t^3 \end{pmatrix} \begin{pmatrix} p_0 \\ p_1 \\ p_2 \\ p_3 \end{pmatrix} \\ & \\ H_1 &= \begin{pmatrix} (1-t)^3 p_0 + 3(1-t)^2 t p_1 + 3(1-t)t^2 p_2 + t^3 p_3 \\ (1-t)^2 p_1 + 2(1-t)t p_2 + t^2 p_3 \\ (1-t) p_2 + t p_3 \\ p_3 \end{pmatrix} &= \begin{pmatrix} (1-t)^3 & 3(1-t)^2 t & 3(1-t)t^2 & t^3 \\ 0 & (1-t)^2 & 2(1-t)t & t^2 \\ 0 & 0 & (1-t) & t \\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} p_0 \\ p_1 \\ p_2 \\ p_3 \end{pmatrix} from where one can define a :math:`(8, 4)` split matrix :math:`S_3` which can multiply the array of ``points`` to compute the return value: .. math:: S_3 &= \begin{pmatrix} 1 & 0 & 0 & 0 \\ (1-t) & t & 0 & 0 \\ (1-t)^2 & 2(1-t)t & t^2 & 0 \\ (1-t)^3 & 3(1-t)^2 t & 3(1-t)t^2 & t^3 \\ (1-t)^3 & 3(1-t)^2 t & 3(1-t)t^2 & t^3 \\ 0 & (1-t)^2 & 2(1-t)t & t^2 \\ 0 & 0 & (1-t) & t \\ 0 & 0 & 0 & 1 \end{pmatrix} \\ & \\ S_3 P &= \begin{pmatrix} 1 & 0 & 0 & 0 \\ (1-t) & t & 0 & 0 \\ (1-t)^2 & 2(1-t)t & t^2 & 0 \\ (1-t)^3 & 3(1-t)^2 t & 3(1-t)t^2 & t^3 \\ (1-t)^3 & 3(1-t)^2 t & 3(1-t)t^2 & t^3 \\ 0 & (1-t)^2 & 2(1-t)t & t^2 \\ 0 & 0 & (1-t) & t \\ 0 & 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} p_0 \\ p_1 \\ p_2 \\ p_3 \end{pmatrix} = \begin{pmatrix} \vert \\ H_0 \\ \vert \\ \vert \\ H_1 \\ \vert \end{pmatrix} Parameters ---------- points The control points of the Bรฉzier curve. t The ``t``-value at which to split the Bรฉzier curve. Returns ------- :class:`~.Point3D_Array` An array containing the control points defining the two Bรฉzier curves. """ points = np.asarray(points) N, dim = points.shape degree = N - 1 if degree == 3: mt = 1 - t mt2 = mt * mt mt3 = mt2 * mt t2 = t * t t3 = t2 * t two_mt_t = 2 * mt * t three_mt2_t = 3 * mt2 * t three_mt_t2 = 3 * mt * t2 # Split matrix S3 explained in the docstring split_matrix = np.array( [ [1, 0, 0, 0], [mt, t, 0, 0], [mt2, two_mt_t, t2, 0], [mt3, three_mt2_t, three_mt_t2, t3], [mt3, three_mt2_t, three_mt_t2, t3], [0, mt2, two_mt_t, t2], [0, 0, mt, t], [0, 0, 0, 1], ] ) return split_matrix @ points if degree == 2: mt = 1 - t mt2 = mt * mt t2 = t * t two_tmt = 2 * t * mt # Split matrix S2 explained in the docstring split_matrix = np.array( [ [1, 0, 0], [mt, t, 0], [mt2, two_tmt, t2], [mt2, two_tmt, t2], [0, mt, t], [0, 0, 1], ] ) return split_matrix @ points if degree == 1: middle = points[0] + t * (points[1] - points[0]) return np.array([points[0], middle, middle, points[1]]) if degree == 0: return np.array([points[0], points[0]]) # Fallback case for nth degree Bรฉziers arr = np.empty((2, N, dim)) arr[1] = points arr[0, 0] = points[0] # Example for a cubic Bรฉzier # arr[0] = [P0 .. .. ..] # arr[1] = [P0 P1 P2 P3] for i in range(1, N): # 1st iter: arr[1] = [L0 L1 L2 P3] # 2nd iter: arr[1] = [Q0 Q1 L2 P3] # 3rd iter: arr[1] = [C0 Q1 L2 P3] arr[1, : N - i] += t * (arr[1, 1 : N - i + 1] - arr[1, : N - i]) # 1st iter: arr[0] = [P0 L0 .. ..] # 2nd iter: arr[0] = [P0 L0 Q0 ..] # 3rd iter: arr[0] = [P0 L0 Q0 C0] arr[0, i] = arr[1, 0] return arr.reshape(2 * N, dim) # Memos explained in subdivide_bezier docstring SUBDIVISION_MATRICES: list[dict[int, MatrixMN]] = [{} for i in range(4)] def _get_subdivision_matrix(n_points: int, n_divisions: int) -> MatrixMN: """Gets the matrix which subdivides a Bรฉzier curve of ``n_points`` control points into ``n_divisions`` parts. Auxiliary function for :func:`subdivide_bezier`. See its docstrings for an explanation of the matrix build process. Parameters ---------- n_points The number of control points of the Bรฉzier curve to subdivide. This function only handles up to 4 points. n_divisions The number of parts to subdivide the Bรฉzier curve into. Returns ------- MatrixMN The matrix which, upon multiplying the control points of the Bรฉzier curve, subdivides it into ``n_divisions`` parts. """ if n_points not in (1, 2, 3, 4): raise NotImplementedError( "This function does not support subdividing Bรฉzier " "curves with 0 or more than 4 control points." ) subdivision_matrix = SUBDIVISION_MATRICES[n_points - 1].get(n_divisions, None) if subdivision_matrix is not None: return subdivision_matrix subdivision_matrix = np.empty((n_points * n_divisions, n_points)) # Cubic Bรฉzier if n_points == 4: for i in range(n_divisions): i2 = i * i i3 = i2 * i ip1 = i + 1 ip12 = ip1 * ip1 ip13 = ip12 * ip1 nmi = n_divisions - i nmi2 = nmi * nmi nmi3 = nmi2 * nmi nmim1 = nmi - 1 nmim12 = nmim1 * nmim1 nmim13 = nmim12 * nmim1 subdivision_matrix[4 * i : 4 * (i + 1)] = np.array( [ [ nmi3, 3 * nmi2 * i, 3 * nmi * i2, i3, ], [ nmi2 * nmim1, 2 * nmi * nmim1 * i + nmi2 * ip1, nmim1 * i2 + 2 * nmi * i * ip1, i2 * ip1, ], [ nmi * nmim12, nmim12 * i + 2 * nmi * nmim1 * ip1, 2 * nmim1 * i * ip1 + nmi * ip12, i * ip12, ], [ nmim13, 3 * nmim12 * ip1, 3 * nmim1 * ip12, ip13, ], ] ) subdivision_matrix /= n_divisions * n_divisions * n_divisions # Quadratic Bรฉzier elif n_points == 3: for i in range(n_divisions): ip1 = i + 1 nmi = n_divisions - i nmim1 = nmi - 1 subdivision_matrix[3 * i : 3 * (i + 1)] = np.array( [ [nmi * nmi, 2 * i * nmi, i * i], [nmi * nmim1, i * nmim1 + ip1 * nmi, i * ip1], [nmim1 * nmim1, 2 * ip1 * nmim1, ip1 * ip1], ] ) subdivision_matrix /= n_divisions * n_divisions # Linear Bรฉzier (straight line) elif n_points == 2: aux_range = np.arange(n_divisions + 1) subdivision_matrix[::2, 1] = aux_range[:-1] subdivision_matrix[1::2, 1] = aux_range[1:] subdivision_matrix[:, 0] = subdivision_matrix[::-1, 1] subdivision_matrix /= n_divisions # Zero-degree Bรฉzier (single point) elif n_points == 1: subdivision_matrix[:] = 1 SUBDIVISION_MATRICES[n_points - 1][n_divisions] = subdivision_matrix return subdivision_matrix def subdivide_bezier(points: BezierPointsLike, n_divisions: int) -> Spline: r"""Subdivide a Bรฉzier curve into :math:`n` subcurves which have the same shape. The points at which the curve is split are located at the arguments :math:`t = \frac{i}{n}`, for :math:`i \in \{1, ..., n-1\}`. .. seealso:: * See :func:`split_bezier` for an explanation on how to split Bรฉzier curves. * See :func:`partial_bezier_points` for an extra understanding of this function. .. note:: The resulting subcurves can be expressed as linear combinations of ``points``, which can be encoded in a single matrix that is precalculated for 2nd and 3rd degree Bรฉzier curves. As an example for a quadratic Bรฉzier curve: taking inspiration from the explanation in :func:`partial_bezier_points`, where the following matrix :math:`P_2` was defined to extract the portion of a quadratic Bรฉzier curve for :math:`t \in [a, b]`: .. math:: P_2 = \begin{pmatrix} (1-a)^2 & 2(1-a)a & a^2 \\ (1-a)(1-b) & a(1-b) + (1-a)b & ab \\ (1-b)^2 & 2(1-b)b & b^2 \end{pmatrix} the plan is to replace :math:`[a, b]` with :math:`\left[ \frac{i-1}{n}, \frac{i}{n} \right], \ \forall i \in \{1, ..., n\}`. As an example for :math:`n = 2` divisions, construct :math:`P_1` for the interval :math:`\left[ 0, \frac{1}{2} \right]`, and :math:`P_2` for the interval :math:`\left[ \frac{1}{2}, 1 \right]`: .. math:: P_1 = \begin{pmatrix} 1 & 0 & 0 \\ 0.5 & 0.5 & 0 \\ 0.25 & 0.5 & 0.25 \end{pmatrix} , \quad P_2 = \begin{pmatrix} 0.25 & 0.5 & 0.25 \\ 0 & 0.5 & 0.5 \\ 0 & 0 & 1 \end{pmatrix} Therefore, the following :math:`(6, 3)` subdivision matrix :math:`D_2` can be constructed, which will subdivide an array of ``points`` into 2 parts: .. math:: D_2 = \begin{pmatrix} M_1 \\ M_2 \end{pmatrix} = \begin{pmatrix} 1 & 0 & 0 \\ 0.5 & 0.5 & 0 \\ 0.25 & 0.5 & 0.25 \\ 0.25 & 0.5 & 0.25 \\ 0 & 0.5 & 0.5 \\ 0 & 0 & 1 \end{pmatrix} For quadratic and cubic Bรฉzier curves, the subdivision matrices are memoized for efficiency. For higher degree curves, an iterative algorithm inspired by the one from :func:`split_bezier` is used instead. .. image:: /_static/bezier_subdivision_example.png Parameters ---------- points The control points of the Bรฉzier curve. n_divisions The number of curves to subdivide the Bรฉzier curve into Returns ------- :class:`~.Spline` An array containing the points defining the new :math:`n` subcurves. """ points = np.asarray(points) if n_divisions == 1: return points N, dim = points.shape if N <= 4: subdivision_matrix = _get_subdivision_matrix(N, n_divisions) return subdivision_matrix @ points # Fallback case for an nth degree Bรฉzier: successive splitting beziers = np.empty((n_divisions, N, dim)) beziers[-1] = points for curve_num in range(n_divisions - 1, 0, -1): curr = beziers[curve_num] prev = beziers[curve_num - 1] prev[0] = curr[0] a = (n_divisions - curve_num) / (n_divisions - curve_num + 1) # Current state for an example cubic Bรฉzier curve: # prev = [P0 .. .. ..] # curr = [P0 P1 P2 P3] for i in range(1, N): # 1st iter: curr = [L0 L1 L2 P3] # 2nd iter: curr = [Q0 Q1 L2 P3] # 3rd iter: curr = [C0 Q1 L2 P3] curr[: N - i] += a * (curr[1 : N - i + 1] - curr[: N - i]) # 1st iter: prev = [P0 L0 .. ..] # 2nd iter: prev = [P0 L0 Q0 ..] # 3rd iter: prev = [P0 L0 Q0 C0] prev[i] = curr[0] return beziers.reshape(n_divisions * N, dim) def bezier_remap( bezier_tuples: BezierPointsLike_Array, new_number_of_curves: int, ) -> BezierPoints_Array: """Subdivides each curve in ``bezier_tuples`` into as many parts as necessary, until the final number of curves reaches a desired amount, ``new_number_of_curves``. Parameters ---------- bezier_tuples An array of multiple Bรฉzier curves of degree :math:`d` to be remapped. The shape of this array must be ``(current_number_of_curves, nppc, dim)``, where: * ``current_number_of_curves`` is the current amount of curves in the array ``bezier_tuples``, * ``nppc`` is the amount of points per curve, such that their degree is ``nppc-1``, and * ``dim`` is the dimension of the points, usually :math:`3`. new_number_of_curves The number of curves that the output will contain. This needs to be higher than the current number. Returns ------- :class:`~.BezierPoints_Array` The new array of shape ``(new_number_of_curves, nppc, dim)``, containing the new Bรฉzier curves after the remap. """ bezier_tuples = np.asarray(bezier_tuples) current_number_of_curves, nppc, dim = bezier_tuples.shape # This is an array with values ranging from 0 # up to curr_num_curves, with repeats such that # its total length is target_num_curves. For example, # with curr_num_curves = 10, target_num_curves = 15, this # would be [0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9]. repeat_indices = ( np.arange(new_number_of_curves, dtype="i") * current_number_of_curves ) // new_number_of_curves # If the nth term of this list is k, it means # that the nth curve of our path should be split # into k pieces. # In the above example our array had the following elements # [0, 0, 1, 2, 2, 3, 4, 4, 5, 6, 6, 7, 8, 8, 9] # We have two 0s, one 1, two 2s and so on. # The split factors array would hence be: # [2, 1, 2, 1, 2, 1, 2, 1, 2, 1] split_factors = np.zeros(current_number_of_curves, dtype="i") np.add.at(split_factors, repeat_indices, 1) new_tuples = np.empty((new_number_of_curves, nppc, dim)) index = 0 for curve, sf in zip(bezier_tuples, split_factors, strict=True): new_tuples[index : index + sf] = subdivide_bezier(curve, sf).reshape( sf, nppc, dim ) index += sf return new_tuples # Linear interpolation variants @overload def interpolate(start: float, end: float, alpha: float) -> float: ... @overload def interpolate(start: float, end: float, alpha: ColVector) -> ColVector: ... @overload def interpolate(start: Point3D, end: Point3D, alpha: float) -> Point3D: ... @overload def interpolate(start: Point3D, end: Point3D, alpha: ColVector) -> Point3D_Array: ... def interpolate( start: float | Point3D, end: float | Point3D, alpha: float | ColVector, ) -> float | ColVector | Point3D | Point3D_Array: """Linearly interpolates between two values ``start`` and ``end``. Parameters ---------- start The start of the range. end The end of the range. alpha A float between 0 and 1, or an :math:`(n, 1)` column vector containing :math:`n` floats between 0 and 1 to interpolate in a vectorized fashion. Returns ------- :class:`float` | :class:`~.ColVector` | :class:`~.Point3D` | :class:`~.Point3D_Array` The result of the linear interpolation. * If ``start`` and ``end`` are of type :class:`float`, and: * ``alpha`` is also a :class:`float`, the return is simply another :class:`float`. * ``alpha`` is a :class:`~.ColVector`, the return is another :class:`~.ColVector`. * If ``start`` and ``end`` are of type :class:`~.Point3D`, and: * ``alpha`` is a :class:`float`, the return is another :class:`~.Point3D`. * ``alpha`` is a :class:`~.ColVector`, the return is a :class:`~.Point3D_Array`. """ return (1 - alpha) * start + alpha * end def integer_interpolate( start: float, end: float, alpha: float, ) -> tuple[int, float]: """ This is a variant of interpolate that returns an integer and the residual Parameters ---------- start The start of the range end The end of the range alpha a float between 0 and 1. Returns ------- tuple[int, float] This returns an integer between start and end (inclusive) representing appropriate interpolation between them, along with a "residue" representing a new proportion between the returned integer and the next one of the list. Example ------- .. code-block:: pycon >>> integer, residue = integer_interpolate(start=0, end=10, alpha=0.46) >>> np.allclose((integer, residue), (4, 0.6)) True """ if alpha >= 1: return (int(end - 1), 1.0) if alpha <= 0: return (int(start), 0) value = int(interpolate(start, end, alpha)) residue = ((end - start) * alpha) % 1 return (value, residue) @overload def mid(start: float, end: float) -> float: ... @overload def mid(start: Point3D, end: Point3D) -> Point3D: ... def mid(start: float | Point3D, end: float | Point3D) -> float | Point3D: """Returns the midpoint between two values. Parameters ---------- start The first value end The second value Returns ------- The midpoint between the two values """ return (start + end) / 2.0 @overload def inverse_interpolate(start: float, end: float, value: float) -> float: ... @overload def inverse_interpolate(start: float, end: float, value: Point3D) -> Point3D: ... @overload def inverse_interpolate(start: Point3D, end: Point3D, value: Point3D) -> Point3D: ... def inverse_interpolate( start: float | Point3D, end: float | Point3D, value: float | Point3D, ) -> float | Point3D: """Perform inverse interpolation to determine the alpha values that would produce the specified ``value`` given the ``start`` and ``end`` values or points. Parameters ---------- start The start value or point of the interpolation. end The end value or point of the interpolation. value The value or point for which the alpha value should be determined. Returns ------- The alpha values producing the given input when interpolating between ``start`` and ``end``. Example ------- .. code-block:: pycon >>> inverse_interpolate(start=2, end=6, value=4) np.float64(0.5) >>> start = np.array([1, 2, 1]) >>> end = np.array([7, 8, 11]) >>> value = np.array([4, 5, 5]) >>> inverse_interpolate(start, end, value) array([0.5, 0.5, 0.4]) """ return np.true_divide(value - start, end - start) @overload def match_interpolate( new_start: float, new_end: float, old_start: float, old_end: float, old_value: float, ) -> float: ... @overload def match_interpolate( new_start: float, new_end: float, old_start: float, old_end: float, old_value: Point3D, ) -> Point3D: ... def match_interpolate( new_start: float, new_end: float, old_start: float, old_end: float, old_value: float | Point3D, ) -> float | Point3D: """Interpolate a value from an old range to a new range. Parameters ---------- new_start The start of the new range. new_end The end of the new range. old_start The start of the old range. old_end The end of the old range. old_value The value within the old range whose corresponding value in the new range (with the same alpha value) is desired. Returns ------- The interpolated value within the new range. Examples -------- >>> from manim import match_interpolate >>> match_interpolate(0, 100, 10, 20, 15) np.float64(50.0) """ old_alpha = inverse_interpolate(old_start, old_end, old_value) return interpolate( new_start, new_end, old_alpha, ) # Figuring out which Bรฉzier curves most smoothly connect a sequence of points def get_smooth_cubic_bezier_handle_points( anchors: Point3DLike_Array, ) -> tuple[Point3D_Array, Point3D_Array]: """Given an array of anchors for a cubic spline (array of connected cubic Bรฉzier curves), compute the 1st and 2nd handle for every curve, so that the resulting spline is smooth. Parameters ---------- anchors Anchors of a cubic spline. Returns ------- :class:`tuple` [:class:`~.Point3D_Array`, :class:`~.Point3D_Array`] A tuple of two arrays: one containing the 1st handle for every curve in the cubic spline, and the other containing the 2nd handles. """ anchors = np.asarray(anchors) n_anchors = anchors.shape[0] # If there's a single anchor, there's no Bรฉzier curve. # Return empty arrays. if n_anchors == 1: dim = anchors.shape[1] return np.zeros((0, dim)), np.zeros((0, dim)) # If there are only two anchors (thus only one pair of handles), # they can only be an interpolation of these two anchors with alphas # 1/3 and 2/3, which will draw a straight line between the anchors. if n_anchors == 2: val = interpolate(anchors[0], anchors[1], np.array([[1 / 3], [2 / 3]])) return (val[0], val[1]) # Handle different cases depending on whether the points form a closed # curve or not curve_is_closed = is_closed(anchors) if curve_is_closed: return get_smooth_closed_cubic_bezier_handle_points(anchors) else: return get_smooth_open_cubic_bezier_handle_points(anchors) CP_CLOSED_MEMO = np.array([1 / 3]) UP_CLOSED_MEMO = np.array([1 / 3]) def get_smooth_closed_cubic_bezier_handle_points( anchors: Point3DLike_Array, ) -> tuple[Point3D_Array, Point3D_Array]: r"""Special case of :func:`get_smooth_cubic_bezier_handle_points`, when the ``anchors`` form a closed loop. .. note:: A system of equations must be solved to get the first handles of every Bรฉzier curve (referred to as :math:`H_1`). Then :math:`H_2` (the second handles) can be obtained separately. .. seealso:: The equations were obtained from: * `Conditions on control points for continuous curvature. (2016). Jaco Stuifbergen. `_ In general, if there are :math:`N+1` anchors, there will be :math:`N` Bรฉzier curves and thus :math:`N` pairs of handles to find. We must solve the following system of equations for the 1st handles (example for :math:`N = 5`): .. math:: \begin{pmatrix} 4 & 1 & 0 & 0 & 1 \\ 1 & 4 & 1 & 0 & 0 \\ 0 & 1 & 4 & 1 & 0 \\ 0 & 0 & 1 & 4 & 1 \\ 1 & 0 & 0 & 1 & 4 \end{pmatrix} \begin{pmatrix} H_{1,0} \\ H_{1,1} \\ H_{1,2} \\ H_{1,3} \\ H_{1,4} \end{pmatrix} = \begin{pmatrix} 4A_0 + 2A_1 \\ 4A_1 + 2A_2 \\ 4A_2 + 2A_3 \\ 4A_3 + 2A_4 \\ 4A_4 + 2A_5 \end{pmatrix} which will be expressed as :math:`RH_1 = D`. :math:`R` is almost a tridiagonal matrix, so we could use Thomas' algorithm. .. seealso:: `Tridiagonal matrix algorithm. Wikipedia. `_ However, :math:`R` has ones at the opposite corners. A solution to this is the first decomposition proposed in the link below, with :math:`\alpha = 1`: .. seealso:: `Tridiagonal matrix algorithm # Variants. Wikipedia. `_ .. math:: R = \begin{pmatrix} 4 & 1 & 0 & 0 & 1 \\ 1 & 4 & 1 & 0 & 0 \\ 0 & 1 & 4 & 1 & 0 \\ 0 & 0 & 1 & 4 & 1 \\ 1 & 0 & 0 & 1 & 4 \end{pmatrix} &= \begin{pmatrix} 3 & 1 & 0 & 0 & 0 \\ 1 & 4 & 1 & 0 & 0 \\ 0 & 1 & 4 & 1 & 0 \\ 0 & 0 & 1 & 4 & 1 \\ 0 & 0 & 0 & 1 & 3 \end{pmatrix} + \begin{pmatrix} 1 & 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 1 \end{pmatrix} \\ & \\ &= \begin{pmatrix} 3 & 1 & 0 & 0 & 0 \\ 1 & 4 & 1 & 0 & 0 \\ 0 & 1 & 4 & 1 & 0 \\ 0 & 0 & 1 & 4 & 1 \\ 0 & 0 & 0 & 1 & 3 \end{pmatrix} + \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \\ 1 \end{pmatrix} \begin{pmatrix} 1 & 0 & 0 & 0 & 1 \end{pmatrix} \\ & \\ &= T + uv^t We decompose :math:`R = T + uv^t`, where :math:`T` is a tridiagonal matrix, and :math:`u, v` are :math:`N`-D vectors such that :math:`u_0 = u_{N-1} = v_0 = v_{N-1} = 1`, and :math:`u_i = v_i = 0, \forall i \in \{1, ..., N-2\}`. Thus: .. math:: RH_1 &= D \\ \Rightarrow (T + uv^t)H_1 &= D If we find a vector :math:`q` such that :math:`Tq = u`: .. math:: \Rightarrow (T + Tqv^t)H_1 &= D \\ \Rightarrow T(I + qv^t)H_1 &= D \\ \Rightarrow H_1 &= (I + qv^t)^{-1} T^{-1} D According to Sherman-Morrison's formula: .. seealso:: `Sherman-Morrison's formula. Wikipedia. `_ .. math:: (I + qv^t)^{-1} = I - \frac{1}{1 + v^tq} qv^t If we find :math:`Y = T^{-1} D`, or in other words, if we solve for :math:`Y` in :math:`TY = D`: .. math:: H_1 &= (I + qv^t)^{-1} T^{-1} D \\ &= (I + qv^t)^{-1} Y \\ &= (I - \frac{1}{1 + v^tq} qv^t) Y \\ &= Y - \frac{1}{1 + v^tq} qv^tY Therefore, we must solve for :math:`q` and :math:`Y` in :math:`Tq = u` and :math:`TY = D`. As :math:`T` is now tridiagonal, we shall use Thomas' algorithm. Define: * :math:`a = [a_0, \ a_1, \ ..., \ a_{N-2}]` as :math:`T`'s lower diagonal of :math:`N-1` elements, such that :math:`a_0 = a_1 = ... = a_{N-2} = 1`, so this diagonal is filled with ones; * :math:`b = [b_0, \ b_1, \ ..., \ b_{N-2}, \ b_{N-1}]` as :math:`T`'s main diagonal of :math:`N` elements, such that :math:`b_0 = b_{N-1} = 3`, and :math:`b_1 = b_2 = ... = b_{N-2} = 4`; * :math:`c = [c_0, \ c_1, \ ..., \ c_{N-2}]` as :math:`T`'s upper diagonal of :math:`N-1` elements, such that :math:`c_0 = c_1 = ... = c_{N-2} = 1`: this diagonal is also filled with ones. If, according to Thomas' algorithm, we define: .. math:: c'_0 &= \frac{c_0}{b_0} & \\ c'_i &= \frac{c_i}{b_i - a_{i-1} c'_{i-1}}, & \quad \forall i \in \{1, ..., N-2\} \\ & & \\ u'_0 &= \frac{u_0}{b_0} & \\ u'_i &= \frac{u_i - a_{i-1} u'_{i-1}}{b_i - a_{i-1} c'_{i-1}}, & \quad \forall i \in \{1, ..., N-1\} \\ & & \\ D'_0 &= \frac{1}{b_0} D_0 & \\ D'_i &= \frac{1}{b_i - a_{i-1} c'_{i-1}} (D_i - a_{i-1} D'_{i-1}), & \quad \forall i \in \{1, ..., N-1\} Then: .. math:: c'_0 &= \frac{1}{3} & \\ c'_i &= \frac{1}{4 - c'_{i-1}}, & \quad \forall i \in \{1, ..., N-2\} \\ & & \\ u'_0 &= \frac{1}{3} & \\ u'_i &= \frac{-u'_{i-1}}{4 - c'_{i-1}} = -c'_i u'_{i-1}, & \quad \forall i \in \{1, ..., N-2\} \\ u'_{N-1} &= \frac{1 - u'_{N-2}}{3 - c'_{N-2}} & \\ & & \\ D'_0 &= \frac{1}{3} (4A_0 + 2A_1) & \\ D'_i &= \frac{1}{4 - c'_{i-1}} (4A_i + 2A_{i+1} - D'_{i-1}) & \\ &= c_i (4A_i + 2A_{i+1} - D'_{i-1}), & \quad \forall i \in \{1, ..., N-2\} \\ D'_{N-1} &= \frac{1}{3 - c'_{N-2}} (4A_{N-1} + 2A_N - D'_{N-2}) & Finally, we can do Backward Substitution to find :math:`q` and :math:`Y`: .. math:: q_{N-1} &= u'_{N-1} & \\ q_i &= u'_{i} - c'_i q_{i+1}, & \quad \forall i \in \{0, ..., N-2\} \\ & & \\ Y_{N-1} &= D'_{N-1} & \\ Y_i &= D'_i - c'_i Y_{i+1}, & \quad \forall i \in \{0, ..., N-2\} With those values, we can finally calculate :math:`H_1 = Y - \frac{1}{1 + v^tq} qv^tY`. Given that :math:`v_0 = v_{N-1} = 1`, and :math:`v_1 = v_2 = ... = v_{N-2} = 0`, its dot products with :math:`q` and :math:`Y` are respectively :math:`v^tq = q_0 + q_{N-1}` and :math:`v^tY = Y_0 + Y_{N-1}`. Thus: .. math:: H_1 = Y - \frac{1}{1 + q_0 + q_{N-1}} q(Y_0 + Y_{N-1}) Once we have :math:`H_1`, we can get :math:`H_2` (the array of second handles) as follows: .. math:: H_{2, i} &= 2A_{i+1} - H_{1, i+1}, & \quad \forall i \in \{0, ..., N-2\} \\ H_{2, N-1} &= 2A_0 - H_{1, 0} & Because the matrix :math:`R` always follows the same pattern (and thus :math:`T, u, v` as well), we can define a memo list for :math:`c'` and :math:`u'` to avoid recalculation. We cannot memoize :math:`D` and :math:`Y`, however, because they are always different matrices. We cannot make a memo for :math:`q` either, but we can calculate it faster because :math:`u'` can be memoized. Parameters ---------- anchors Anchors of a closed cubic spline. Returns ------- :class:`tuple` [:class:`~.Point3D_Array`, :class:`~.Point3D_Array`] A tuple of two arrays: one containing the 1st handle for every curve in the closed cubic spline, and the other containing the 2nd handles. """ global CP_CLOSED_MEMO global UP_CLOSED_MEMO A = np.asarray(anchors) N = A.shape[0] - 1 dim = A.shape[1] # Calculate cp (c prime) and up (u prime) with help from # CP_CLOSED_MEMO and UP_CLOSED_MEMO. len_memo = CP_CLOSED_MEMO.size if len_memo < N - 1: cp = np.empty(N - 1) up = np.empty(N - 1) cp[:len_memo] = CP_CLOSED_MEMO up[:len_memo] = UP_CLOSED_MEMO # Forward Substitution 1 # Calculate up (at the same time we calculate cp). for i in range(len_memo, N - 1): cp[i] = 1 / (4 - cp[i - 1]) up[i] = -cp[i] * up[i - 1] CP_CLOSED_MEMO = cp UP_CLOSED_MEMO = up else: cp = CP_CLOSED_MEMO[: N - 1] up = UP_CLOSED_MEMO[: N - 1] # The last element of u' is different cp_last_division = 1 / (3 - cp[N - 2]) up_last = cp_last_division * (1 - up[N - 2]) # Backward Substitution 1 # Calculate q. q = np.empty((N, dim)) q[N - 1] = up_last for i in range(N - 2, -1, -1): q[i] = up[i] - cp[i] * q[i + 1] # Forward Substitution 2 # Calculate Dp (D prime). Dp = np.empty((N, dim)) AUX = 4 * A[:N] + 2 * A[1:] # Vectorize the sum for efficiency. Dp[0] = AUX[0] / 3 for i in range(1, N - 1): Dp[i] = cp[i] * (AUX[i] - Dp[i - 1]) Dp[N - 1] = cp_last_division * (AUX[N - 1] - Dp[N - 2]) # Backward Substitution # Calculate Y, which is defined as a view of Dp for efficiency # and semantic convenience at the same time. Y = Dp # Y[N-1] = Dp[N-1] (redundant) for i in range(N - 2, -1, -1): Y[i] = Dp[i] - cp[i] * Y[i + 1] # Calculate H1. H1 = Y - 1 / (1 + q[0] + q[N - 1]) * q * (Y[0] + Y[N - 1]) # Calculate H2. H2 = np.empty((N, dim)) H2[0 : N - 1] = 2 * A[1:N] - H1[1:N] H2[N - 1] = 2 * A[N] - H1[0] return H1, H2 CP_OPEN_MEMO = np.array([0.5]) def get_smooth_open_cubic_bezier_handle_points( anchors: Point3DLike_Array, ) -> tuple[Point3D_Array, Point3D_Array]: r"""Special case of :func:`get_smooth_cubic_bezier_handle_points`, when the ``anchors`` do not form a closed loop. .. note:: A system of equations must be solved to get the first handles of every Bรจzier curve (referred to as :math:`H_1`). Then :math:`H_2` (the second handles) can be obtained separately. .. seealso:: The equations were obtained from: * `Smooth Bรฉzier Spline Through Prescribed Points. (2012). Particle in Cell Consulting LLC. `_ * `Conditions on control points for continuous curvature. (2016). Jaco Stuifbergen. `_ .. warning:: The equations in the first webpage have some typos which were corrected in the comments. In general, if there are :math:`N+1` anchors, there will be :math:`N` Bรฉzier curves and thus :math:`N` pairs of handles to find. We must solve the following system of equations for the 1st handles (example for :math:`N = 5`): .. math:: \begin{pmatrix} 2 & 1 & 0 & 0 & 0 \\ 1 & 4 & 1 & 0 & 0 \\ 0 & 1 & 4 & 1 & 0 \\ 0 & 0 & 1 & 4 & 1 \\ 0 & 0 & 0 & 2 & 7 \end{pmatrix} \begin{pmatrix} H_{1,0} \\ H_{1,1} \\ H_{1,2} \\ H_{1,3} \\ H_{1,4} \end{pmatrix} = \begin{pmatrix} A_0 + 2A_1 \\ 4A_1 + 2A_2 \\ 4A_2 + 2A_3 \\ 4A_3 + 2A_4 \\ 8A_4 + A_5 \end{pmatrix} which will be expressed as :math:`TH_1 = D`. :math:`T` is a tridiagonal matrix, so the system can be solved in :math:`O(N)` operations. Here we shall use Thomas' algorithm or the tridiagonal matrix algorithm. .. seealso:: `Tridiagonal matrix algorithm. Wikipedia. `_ Define: * :math:`a = [a_0, \ a_1, \ ..., \ a_{N-2}]` as :math:`T`'s lower diagonal of :math:`N-1` elements, such that :math:`a_0 = a_1 = ... = a_{N-3} = 1`, and :math:`a_{N-2} = 2`; * :math:`b = [b_0, \ b_1, \ ..., \ b_{N-2}, \ b_{N-1}]` as :math:`T`'s main diagonal of :math:`N` elements, such that :math:`b_0 = 2`, :math:`b_1 = b_2 = ... = b_{N-2} = 4`, and :math:`b_{N-1} = 7`; * :math:`c = [c_0, \ c_1, \ ..., \ c_{N-2}]` as :math:`T`'s upper diagonal of :math:`{N-1}` elements, such that :math:`c_0 = c_1 = ... = c_{N-2} = 1`: this diagonal is filled with ones. If, according to Thomas' algorithm, we define: .. math:: c'_0 &= \frac{c_0}{b_0} & \\ c'_i &= \frac{c_i}{b_i - a_{i-1} c'_{i-1}}, & \quad \forall i \in \{1, ..., N-2\} \\ & & \\ D'_0 &= \frac{1}{b_0} D_0 & \\ D'_i &= \frac{1}{b_i - a_{i-1} c'{i-1}} (D_i - a_{i-1} D'_{i-1}), & \quad \forall i \in \{1, ..., N-1\} Then: .. math:: c'_0 &= 0.5 & \\ c'_i &= \frac{1}{4 - c'_{i-1}}, & \quad \forall i \in \{1, ..., N-2\} \\ & & \\ D'_0 &= 0.5A_0 + A_1 & \\ D'_i &= \frac{1}{4 - c'_{i-1}} (4A_i + 2A_{i+1} - D'_{i-1}) & \\ &= c_i (4A_i + 2A_{i+1} - D'_{i-1}), & \quad \forall i \in \{1, ..., N-2\} \\ D'_{N-1} &= \frac{1}{7 - 2c'_{N-2}} (8A_{N-1} + A_N - 2D'_{N-2}) & Finally, we can do Backward Substitution to find :math:`H_1`: .. math:: H_{1, N-1} &= D'_{N-1} & \\ H_{1, i} &= D'_i - c'_i H_{1, i+1}, & \quad \forall i \in \{0, ..., N-2\} Once we have :math:`H_1`, we can get :math:`H_2` (the array of second handles) as follows: .. math:: H_{2, i} &= 2A_{i+1} - H_{1, i+1}, & \quad \forall i \in \{0, ..., N-2\} \\ H_{2, N-1} &= 0.5A_N + 0.5H_{1, N-1} & As the matrix :math:`T` always follows the same pattern, we can define a memo list for :math:`c'` to avoid recalculation. We cannot do the same for :math:`D`, however, because it is always a different matrix. Parameters ---------- anchors Anchors of an open cubic spline. Returns ------- :class:`tuple` [:class:`~.Point3D_Array`, :class:`~.Point3D_Array`] A tuple of two arrays: one containing the 1st handle for every curve in the open cubic spline, and the other containing the 2nd handles. """ global CP_OPEN_MEMO A = np.asarray(anchors) N = A.shape[0] - 1 dim = A.shape[1] # Calculate cp (c prime) with help from CP_OPEN_MEMO. len_memo = CP_OPEN_MEMO.size if len_memo < N - 1: cp = np.empty(N - 1) cp[:len_memo] = CP_OPEN_MEMO for i in range(len_memo, N - 1): cp[i] = 1 / (4 - cp[i - 1]) CP_OPEN_MEMO = cp else: cp = CP_OPEN_MEMO[: N - 1] # Calculate Dp (D prime). Dp = np.empty((N, dim)) Dp[0] = 0.5 * A[0] + A[1] AUX = 4 * A[1 : N - 1] + 2 * A[2:N] # Vectorize the sum for efficiency. for i in range(1, N - 1): Dp[i] = cp[i] * (AUX[i - 1] - Dp[i - 1]) Dp[N - 1] = (1 / (7 - 2 * cp[N - 2])) * (8 * A[N - 1] + A[N] - 2 * Dp[N - 2]) # Backward Substitution. # H1 (array of the first handles) is defined as a view of Dp for efficiency # and semantic convenience at the same time. H1 = Dp # H1[N-1] = Dp[N-1] (redundant) for i in range(N - 2, -1, -1): H1[i] = Dp[i] - cp[i] * H1[i + 1] # Calculate H2. H2 = np.empty((N, dim)) H2[0 : N - 1] = 2 * A[1:N] - H1[1:N] H2[N - 1] = 0.5 * (A[N] + H1[N - 1]) return H1, H2 @overload def get_quadratic_approximation_of_cubic( a0: Point3DLike, h0: Point3DLike, h1: Point3DLike, a1: Point3DLike ) -> QuadraticSpline: ... @overload def get_quadratic_approximation_of_cubic( a0: Point3DLike_Array, h0: Point3DLike_Array, h1: Point3DLike_Array, a1: Point3DLike_Array, ) -> QuadraticBezierPath: ... def get_quadratic_approximation_of_cubic( a0: Point3D | Point3D_Array, h0: Point3D | Point3D_Array, h1: Point3D | Point3D_Array, a1: Point3D | Point3D_Array, ) -> QuadraticSpline | QuadraticBezierPath: r"""If ``a0``, ``h0``, ``h1`` and ``a1`` are the control points of a cubic Bรฉzier curve, approximate the curve with two quadratic Bรฉzier curves and return an array of 6 points, where the first 3 points represent the first quadratic curve and the last 3 represent the second one. Otherwise, if ``a0``, ``h0``, ``h1`` and ``a1`` are _arrays_ of :math:`N` points representing :math:`N` cubic Bรฉzier curves, return an array of :math:`6N` points where each group of :math:`6` consecutive points approximates each of the :math:`N` curves in a similar way as above. .. note:: If the cubic spline given by the original cubic Bรฉzier curves is smooth, this algorithm will generate a quadratic spline which is also smooth. If a cubic Bรฉzier is given by .. math:: C(t) = (1-t)^3 A_0 + 3(1-t)^2 t H_0 + 3(1-t)t^2 H_1 + t^3 A_1 where :math:`A_0`, :math:`H_0`, :math:`H_1` and :math:`A_1` are its control points, then this algorithm should generate two quadratic Bรฉziers given by .. math:: Q_0(t) &= (1-t)^2 A_0 + 2(1-t)t M_0 + t^2 K \\ Q_1(t) &= (1-t)^2 K + 2(1-t)t M_1 + t^2 A_1 where :math:`M_0` and :math:`M_1` are the respective handles to be found for both curves, and :math:`K` is the end anchor of the 1st curve and the start anchor of the 2nd, which must also be found. To solve for :math:`M_0`, :math:`M_1` and :math:`K`, three conditions can be imposed: 1. :math:`Q_0'(0) = \frac{1}{2}C'(0)`. The derivative of the first quadratic curve at :math:`t = 0` should be proportional to that of the original cubic curve, also at :math:`t = 0`. Because the cubic curve is split into two parts, it is necessary to divide this by two: the speed of a point travelling through the curve should be half of the original. This gives: .. math:: Q_0'(0) &= \frac{1}{2}C'(0) \\ 2(M_0 - A_0) &= \frac{3}{2}(H_0 - A_0) \\ 2M_0 - 2A_0 &= \frac{3}{2}H_0 - \frac{3}{2}A_0 \\ 2M_0 &= \frac{3}{2}H_0 + \frac{1}{2}A_0 \\ M_0 &= \frac{1}{4}(3H_0 + A_0) 2. :math:`Q_1'(1) = \frac{1}{2}C'(1)`. The derivative of the second quadratic curve at :math:`t = 1` should be half of that of the original cubic curve for the same reasons as above, also at :math:`t = 1`. This gives: .. math:: Q_1'(1) &= \frac{1}{2}C'(1) \\ 2(A_1 - M_1) &= \frac{3}{2}(A_1 - H_1) \\ 2A_1 - 2M_1 &= \frac{3}{2}A_1 - \frac{3}{2}H_1 \\ -2M_1 &= -\frac{1}{2}A_1 - \frac{3}{2}H_1 \\ M_1 &= \frac{1}{4}(3H_1 + A_1) 3. :math:`Q_0'(1) = Q_1'(0)`. The derivatives of both quadratic curves should match at the point :math:`K`, in order for the final spline to be smooth. This gives: .. math:: Q_0'(1) &= Q_1'(0) \\ 2(K - M_0) &= 2(M_1 - K) \\ 2K - 2M_0 &= 2M_1 - 2K \\ 4K &= 2M_0 + 2M_1 \\ K &= \frac{1}{2}(M_0 + M_1) This is sufficient to find proper control points for the quadratic Bรฉzier curves. Parameters ---------- a0 The start anchor of a single cubic Bรฉzier curve, or an array of :math:`N` start anchors for :math:`N` curves. h0 The first handle of a single cubic Bรฉzier curve, or an array of :math:`N` first handles for :math:`N` curves. h1 The second handle of a single cubic Bรฉzier curve, or an array of :math:`N` second handles for :math:`N` curves. a1 The end anchor of a single cubic Bรฉzier curve, or an array of :math:`N` end anchors for :math:`N` curves. Returns ------- result An array containing either 6 points for 2 quadratic Bรฉzier curves approximating the original cubic curve, or :math:`6N` points for :math:`2N` quadratic curves approximating :math:`N` cubic curves. Raises ------ ValueError If ``a0``, ``h0``, ``h1`` and ``a1`` have different dimensions, or if their number of dimensions is not 1 or 2. """ a0c = np.asarray(a0) h0c = np.asarray(h0) h1c = np.asarray(h1) a1c = np.asarray(a1) if all(arr.ndim == 1 for arr in (a0c, h0c, h1c, a1c)): num_curves, dim = 1, a0c.shape[0] elif all(arr.ndim == 2 for arr in (a0c, h0c, h1c, a1c)): num_curves, dim = a0c.shape else: raise ValueError("All arguments must be Point3D or Point3D_Array.") m0 = 0.25 * (3 * h0c + a0c) m1 = 0.25 * (3 * h1c + a1c) k = 0.5 * (m0 + m1) result = np.empty((6 * num_curves, dim)) result[0::6] = a0c result[1::6] = m0 result[2::6] = k result[3::6] = k result[4::6] = m1 result[5::6] = a1c return result def is_closed(points: Point3D_Array) -> bool: """Returns ``True`` if the spline given by ``points`` is closed, by checking if its first and last points are close to each other, or``False`` otherwise. .. note:: This function reimplements :meth:`np.allclose`, because repeated calling of :meth:`np.allclose` for only 2 points is inefficient. Parameters ---------- points An array of points defining a spline. Returns ------- :class:`bool` Whether the first and last points of the array are close enough or not to be considered the same, thus considering the defined spline as closed. Examples -------- .. code-block:: pycon >>> import numpy as np >>> from manim import is_closed >>> is_closed( ... np.array( ... [ ... [0, 0, 0], ... [1, 2, 3], ... [3, 2, 1], ... [0, 0, 0], ... ] ... ) ... ) True >>> is_closed( ... np.array( ... [ ... [0, 0, 0], ... [1, 2, 3], ... [3, 2, 1], ... [1e-10, 1e-10, 1e-10], ... ] ... ) ... ) True >>> is_closed( ... np.array( ... [ ... [0, 0, 0], ... [1, 2, 3], ... [3, 2, 1], ... [1e-2, 1e-2, 1e-2], ... ] ... ) ... ) False """ start, end = points[0], points[-1] rtol = 1e-5 atol = 1e-8 tolerance = atol + rtol * start if abs(end[0] - start[0]) > tolerance[0]: return False if abs(end[1] - start[1]) > tolerance[1]: return False return bool(abs(end[2] - start[2]) <= tolerance[2]) def proportions_along_bezier_curve_for_point( point: Point3DLike, control_points: BezierPointsLike, round_to: float = 1e-6, ) -> MatrixMN: """Obtains the proportion along the bezier curve corresponding to a given point given the bezier curve's control points. The bezier polynomial is constructed using the coordinates of the given point as well as the bezier curve's control points. On solving the polynomial for each dimension, if there are roots common to every dimension, those roots give the proportion along the curve the point is at. If there are no real roots, the point does not lie on the curve. Parameters ---------- point The Cartesian Coordinates of the point whose parameter should be obtained. control_points The Cartesian Coordinates of the ordered control points of the bezier curve on which the point may or may not lie. round_to A float whose number of decimal places all values such as coordinates of points will be rounded. Returns ------- np.ndarray[float] List containing possible parameters (the proportions along the bezier curve) for the given point on the given bezier curve. This usually only contains one or zero elements, but if the point is, say, at the beginning/end of a closed loop, may return a list with more than 1 value, corresponding to the beginning and end etc. of the loop. Raises ------ :class:`ValueError` When ``point`` and the control points have different shapes. """ # Method taken from # http://polymathprogrammer.com/2012/04/03/does-point-lie-on-bezier-curve/ if not all(np.shape(point) == np.shape(c_p) for c_p in control_points): raise ValueError( f"Point {point} and Control Points {control_points} have different shapes.", ) control_points = np.array(control_points) n = len(control_points) - 1 roots = [] for dim, coord in enumerate(point): control_coords = control_points[:, dim] terms = [] for term_power in range(n, -1, -1): outercoeff = choose(n, term_power) term = [] sign = 1 for subterm_num in range(term_power, -1, -1): innercoeff = choose(term_power, subterm_num) * sign subterm = innercoeff * control_coords[subterm_num] if term_power == 0: subterm -= coord term.append(subterm) sign *= -1 terms.append(outercoeff * sum(np.array(term))) if all(term == 0 for term in terms): # Then both Bezier curve and Point lie on the same plane. # Roots will be none, but in this specific instance, we don't need to consider that. continue bezier_polynom = np.polynomial.Polynomial(terms[::-1]) polynom_roots = bezier_polynom.roots() if len(polynom_roots) > 0: polynom_roots = np.around(polynom_roots, int(np.log10(1 / round_to))) roots.append(polynom_roots) roots = [[root for root in rootlist if root.imag == 0] for rootlist in roots] # Get common roots # arg-type: ignore roots = reduce(np.intersect1d, roots) result = np.asarray([r.real for r in roots if 0 <= r.real <= 1]) return result def point_lies_on_bezier( point: Point3DLike, control_points: BezierPointsLike, round_to: float = 1e-6, ) -> bool: """Checks if a given point lies on the bezier curves with the given control points. This is done by solving the bezier polynomial with the point as the constant term; if any real roots exist, the point lies on the bezier curve. Parameters ---------- point The Cartesian Coordinates of the point to check. control_points The Cartesian Coordinates of the ordered control points of the bezier curve on which the point may or may not lie. round_to A float whose number of decimal places all values such as coordinates of points will be rounded. Returns ------- bool Whether the point lies on the curve. """ roots = proportions_along_bezier_curve_for_point(point, control_points, round_to) return len(roots) > 0 ManimCommunity-manim-1157b74/manim/utils/caching.py000066400000000000000000000056401515024150700222470ustar00rootroot00000000000000from __future__ import annotations from collections.abc import Callable from typing import TYPE_CHECKING, Any from .. import config, logger from ..utils.hashing import get_hash_from_play_call __all__ = ["handle_caching_play"] if TYPE_CHECKING: from manim.renderer.opengl_renderer import OpenGLRenderer from manim.scene.scene import Scene def handle_caching_play(func: Callable[..., None]) -> Callable[..., None]: """Decorator that returns a wrapped version of func that will compute the hash of the play invocation. The returned function will act according to the computed hash: either skip the animation because it's already cached, or let the invoked function play normally. Parameters ---------- func The play like function that has to be written to the video file stream. Take the same parameters as `scene.play`. """ # NOTE : This is only kept for OpenGL renderer. # The play logic of the cairo renderer as been refactored and does not need this function anymore. # When OpenGL renderer will have a proper testing system, # the play logic of the latter has to be refactored in the same way the cairo renderer has been, and thus this # method has to be deleted. def wrapper(self: OpenGLRenderer, scene: Scene, *args: Any, **kwargs: Any) -> None: self.skip_animations = self._original_skipping_status self.update_skipping_status() animations = scene.compile_animations(*args, **kwargs) scene.add_mobjects_from_animations(animations) if self.skip_animations: logger.debug(f"Skipping animation {self.num_plays}") func(self, scene, *args, **kwargs) # If the animation is skipped, we mark its hash as None. # When sceneFileWriter will start combining partial movie files, it won't take into account None hashes. self.animations_hashes.append(None) self.file_writer.add_partial_movie_file(None) return if not config["disable_caching"]: mobjects_on_scene = scene.mobjects hash_play = get_hash_from_play_call( scene, self.camera, animations, mobjects_on_scene, ) if self.file_writer.is_already_cached(hash_play): logger.info( f"Animation {self.num_plays} : Using cached data (hash : %(hash_play)s)", {"hash_play": hash_play}, ) self.skip_animations = True else: hash_play = f"uncached_{self.num_plays:05}" self.animations_hashes.append(hash_play) self.file_writer.add_partial_movie_file(hash_play) logger.debug( "List of the first few animation hashes of the scene: %(h)s", {"h": str(self.animations_hashes[:5])}, ) func(self, scene, *args, **kwargs) return wrapper ManimCommunity-manim-1157b74/manim/utils/color/000077500000000000000000000000001515024150700214125ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/utils/color/AS2700.py000066400000000000000000000210471515024150700226040ustar00rootroot00000000000000"""Australian Color Standard In 1985 the Australian Independent Color Standard AS 2700 was created. In this standard, all colors can be identified via a category code (one of B -- Blue, G -- Green, N -- Neutrals (grey), P -- Purple, R -- Red, T -- Blue/Green, X -- Yellow/Red, Y -- Yellow) and a number. The colors also have (natural) names. To use the colors from this list, access them directly from the module (which is exposed to Manim's global name space): .. code:: pycon >>> from manim import AS2700 >>> AS2700.B23_BRIGHT_BLUE ManimColor('#174F90') List of Color Constants ----------------------- These hex values (taken from https://www.w3schools.com/colors/colors_australia.asp) are non official approximate values intended to simulate AS 2700 colors: .. automanimcolormodule:: manim.utils.color.AS2700 """ from __future__ import annotations from .core import ManimColor B11_RICH_BLUE = ManimColor("#2B3770") B12_ROYAL_BLUE = ManimColor("#2C3563") B13_NAVY_BLUE = ManimColor("#28304D") B14_SAPHHIRE = ManimColor("#28426B") B15_MID_BLUE = ManimColor("#144B6F") B21_ULTRAMARINE = ManimColor("#2C5098") B22_HOMEBUSH_BLUE = ManimColor("#215097") B23_BRIGHT_BLUE = ManimColor("#174F90") B24_HARBOUR_BLUE = ManimColor("#1C6293") B25_AQUA = ManimColor("#5097AC") B32_POWDER_BLUE = ManimColor("#B7C8DB") B33_MIST_BLUE = ManimColor("#E0E6E2") B34_PARADISE_BLUE = ManimColor("#3499BA") B35_PALE_BLUE = ManimColor("#CDE4E2") B41_BLUEBELL = ManimColor("#5B94D1") B42_PURPLE_BLUE = ManimColor("#5E7899") B43_GREY_BLUE = ManimColor("#627C8D") B44_LIGHT_GREY_BLUE = ManimColor("#C0C0C1") B45_SKY_BLUE = ManimColor("#7DB7C7") B51_PERIWINKLE = ManimColor("#3871AC") B53_DARK_GREY_BLUE = ManimColor("#4F6572") B55_STORM_BLUE = ManimColor("#3F7C94") B61_CORAL_SEA = ManimColor("#2B3873") B62_MIDNIGHT_BLUE = ManimColor("#292A34") B64_CHARCOAL = ManimColor("#363E45") G11_BOTTLE_GREEN = ManimColor("#253A32") G12_HOLLY = ManimColor("#21432D") G13_EMERALD = ManimColor("#195F35") G14_MOSS_GREEN = ManimColor("#33572D") G15_RAINFOREST_GREEN = ManimColor("#3D492D") G16_TRAFFIC_GREEN = ManimColor("#305442") G17_MINT_GREEN = ManimColor("#006B45") G21_JADE = ManimColor("#127453") G22_SERPENTINE = ManimColor("#78A681") G23_SHAMROCK = ManimColor("#336634") G24_FERN_TREE = ManimColor("#477036") G25_OLIVE = ManimColor("#595B2A") G26_APPLE_GREEN = ManimColor("#4E9843") G27_HOMEBUSH_GREEN = ManimColor("#017F4D") G31_VERTIGRIS = ManimColor("#468A65") G32_OPALINE = ManimColor("#AFCBB8") G33_LETTUCE = ManimColor("#7B9954") G34_AVOCADO = ManimColor("#757C4C") G35_LIME_GREEN = ManimColor("#89922E") G36_KIKUYU = ManimColor("#95B43B") G37_BEANSTALK = ManimColor("#45A56A") G41_LAWN_GREEN = ManimColor("#0D875D") G42_GLACIER = ManimColor("#D5E1D2") G43_SURF_GREEN = ManimColor("#C8C8A7") G44_PALM_GREEN = ManimColor("#99B179") G45_CHARTREUSE = ManimColor("#C7C98D") G46_CITRONELLA = ManimColor("#BFC83E") G47_CRYSTAL_GREEN = ManimColor("#ADCCA8") G51_SPRUCE = ManimColor("#05674F") G52_EUCALYPTUS = ManimColor("#66755B") G53_BANKSIA = ManimColor("#929479") G54_MIST_GREEN = ManimColor("#7A836D") G55_LICHEN = ManimColor("#A7A98C") G56_SAGE_GREEN = ManimColor("#677249") G61_DARK_GREEN = ManimColor("#283533") G62_RIVERGUM = ManimColor("#617061") G63_DEEP_BRONZE_GREEN = ManimColor("#333334") G64_SLATE = ManimColor("#5E6153") G65_TI_TREE = ManimColor("#5D5F4E") G66_ENVIRONMENT_GREEN = ManimColor("#484C3F") G67_ZUCCHINI = ManimColor("#2E443A") N11_PEARL_GREY = ManimColor("#D8D3C7") N12_PASTEL_GREY = ManimColor("#CCCCCC") N14_WHITE = ManimColor("#FFFFFF") N15_HOMEBUSH_GREY = ManimColor("#A29B93") N22_CLOUD_GREY = ManimColor("#C4C1B9") N23_NEUTRAL_GREY = ManimColor("#CCCCCC") N24_SILVER_GREY = ManimColor("#BDC7C5") N25_BIRCH_GREY = ManimColor("#ABA498") N32_GREEN_GREY = ManimColor("#8E9282") N33_LIGHTBOX_GREY = ManimColor("#ACADAD") N35_LIGHT_GREY = ManimColor("#A6A7A1") N41_OYSTER = ManimColor("#998F78") N42_STORM_GREY = ManimColor("#858F88") N43_PIPELINE_GREY = ManimColor("#999999") N44_BRIDGE_GREY = ManimColor("#767779") N45_KOALA_GREY = ManimColor("#928F88") N52_MID_GREY = ManimColor("#727A77") N53_BLUE_GREY = ManimColor("#7C8588") N54_BASALT = ManimColor("#585C63") N55_LEAD_GREY = ManimColor("#5E5C58") N61_BLACK = ManimColor("#2A2A2C") N63_PEWTER = ManimColor("#596064") N64_DARK_GREY = ManimColor("#4B5259") N65_GRAPHITE_GREY = ManimColor("#45474A") P11_MAGENTA = ManimColor("#7B2B48") P12_PURPLE = ManimColor("#85467B") P13_VIOLET = ManimColor("#5D3A61") P14_BLUEBERRY = ManimColor("#4C4176") P21_SUNSET_PINK = ManimColor("#E3BBBD") P22_CYCLAMEN = ManimColor("#83597D") P23_LILAC = ManimColor("#A69FB1") P24_JACKARANDA = ManimColor("#795F91") P31_DUSTY_PINK = ManimColor("#DBBEBC") P33_RIBBON_PINK = ManimColor("#D1BCC9") P41_ERICA_PINK = ManimColor("#C55A83") P42_MULBERRY = ManimColor("#A06574") P43_WISTERIA = ManimColor("#756D91") P52_PLUM = ManimColor("#6E3D4B") R11_INTERNATIONAL_ORANGE = ManimColor("#CE482A") R12_SCARLET = ManimColor("#CD392A") R13_SIGNAL_RED = ManimColor("#BA312B") R14_WARATAH = ManimColor("#AA2429") R15_CRIMSON = ManimColor("#9E2429") R21_TANGERINE = ManimColor("#E96957") R22_HOMEBUSH_RED = ManimColor("#D83A2D") R23_LOLLIPOP = ManimColor("#CC5058") R24_STRAWBERRY = ManimColor("#B4292A") R25_ROSE_PINK = ManimColor("#E8919C") R32_APPLE_BLOSSOM = ManimColor("#F2E1D8") R33_GHOST_GUM = ManimColor("#E8DAD4") R34_MUSHROOM = ManimColor("#D7C0B6") R35_DEEP_ROSE = ManimColor("#CD6D71") R41_SHELL_PINK = ManimColor("#F9D9BB") R42_SALMON_PINK = ManimColor("#D99679") R43_RED_DUST = ManimColor("#D0674F") R44_POSSUM = ManimColor("#A18881") R45_RUBY = ManimColor("#8F3E5C") R51_BURNT_PINK = ManimColor("#E19B8E") R52_TERRACOTTA = ManimColor("#A04C36") R53_RED_GUM = ManimColor("#8D4338") R54_RASPBERRY = ManimColor("#852F31") R55_CLARET = ManimColor("#67292D") R62_VENETIAN_RED = ManimColor("#77372B") R63_RED_OXIDE = ManimColor("#663334") R64_DEEP_INDIAN_RED = ManimColor("#542E2B") R65_MAROON = ManimColor("#3F2B3C") T11_TROPICAL_BLUE = ManimColor("#006698") T12_DIAMANTIA = ManimColor("#006C74") T14_MALACHITE = ManimColor("#105154") T15_TURQUOISE = ManimColor("#098587") T22_ORIENTAL_BLUE = ManimColor("#358792") T24_BLUE_JADE = ManimColor("#427F7E") T32_HUON_GREEN = ManimColor("#72B3B1") T33_SMOKE_BLUE = ManimColor("#9EB6B2") T35_GREEN_ICE = ManimColor("#78AEA2") T44_BLUE_GUM = ManimColor("#6A8A88") T45_COOTAMUNDRA = ManimColor("#759E91") T51_MOUNTAIN_BLUE = ManimColor("#295668") T53_PEACOCK_BLUE = ManimColor("#245764") T63_TEAL = ManimColor("#183F4E") X11_BUTTERSCOTCH = ManimColor("#D38F43") X12_PUMPKIN = ManimColor("#DD7E1A") X13_MARIGOLD = ManimColor("#ED7F15") X14_MANDARIN = ManimColor("#E45427") X15_ORANGE = ManimColor("#E36C2B") X21_PALE_OCHRE = ManimColor("#DAA45F") X22_SAFFRON = ManimColor("#F6AA51") X23_APRICOT = ManimColor("#FEB56D") X24_ROCKMELON = ManimColor("#F6894B") X31_RAFFIA = ManimColor("#EBC695") X32_MAGNOLIA = ManimColor("#F1DEBE") X33_WARM_WHITE = ManimColor("#F3E7D4") X34_DRIFTWOOD = ManimColor("#D5C4AE") X41_BUFF = ManimColor("#C28A44") X42_BISCUIT = ManimColor("#DEBA92") X43_BEIGE = ManimColor("#C9AA8C") X45_CINNAMON = ManimColor("#AC826D") X51_TAN = ManimColor("#8F5F32") X52_COFFEE = ManimColor("#AD7948") X53_GOLDEN_TAN = ManimColor("#925629") X54_BROWN = ManimColor("#68452C") X55_NUT_BROWN = ManimColor("#764832") X61_WOMBAT = ManimColor("#6E5D52") X62_DARK_EARTH = ManimColor("#6E5D52") X63_IRONBARK = ManimColor("#443B36") X64_CHOCOLATE = ManimColor("#4A3B31") X65_DARK_BROWN = ManimColor("#4F372D") Y11_CANARY = ManimColor("#E7BD11") Y12_WATTLE = ManimColor("#E8AF01") Y13_VIVID_YELLOW = ManimColor("#FCAE01") Y14_GOLDEN_YELLOW = ManimColor("#F5A601") Y15_SUNFLOWER = ManimColor("#FFA709") Y16_INCA_GOLD = ManimColor("#DF8C19") Y21_PRIMROSE = ManimColor("#F5CF5B") Y22_CUSTARD = ManimColor("#EFD25C") Y23_BUTTERCUP = ManimColor("#E0CD41") Y24_STRAW = ManimColor("#E3C882") Y25_DEEP_CREAM = ManimColor("#F3C968") Y26_HOMEBUSH_GOLD = ManimColor("#FCC51A") Y31_LILY_GREEN = ManimColor("#E3E3CD") Y32_FLUMMERY = ManimColor("#E6DF9E") Y33_PALE_PRIMROSE = ManimColor("#F5F3CE") Y34_CREAM = ManimColor("#EFE3BE") Y35_OFF_WHITE = ManimColor("#F1E9D5") Y41_OLIVE_YELLOW = ManimColor("#8E7426") Y42_MUSTARD = ManimColor("#C4A32E") Y43_PARCHMENT = ManimColor("#D4C9A3") Y44_SAND = ManimColor("#DCC18B") Y45_MANILLA = ManimColor("#E5D0A7") Y51_BRONZE_OLIVE = ManimColor("#695D3E") Y52_CHAMOIS = ManimColor("#BEA873") Y53_SANDSTONE = ManimColor("#D5BF8E") Y54_OATMEAL = ManimColor("#CAAE82") Y55_DEEP_STONE = ManimColor("#BC9969") Y56_MERINO = ManimColor("#C9B79E") Y61_BLACK_OLIVE = ManimColor("#47473B") Y62_SUGAR_CANE = ManimColor("#BCA55C") Y63_KHAKI = ManimColor("#826843") Y65_MUSHROOM = ManimColor("#A39281") Y66_MUDSTONE = ManimColor("#574E45") ManimCommunity-manim-1157b74/manim/utils/color/BS381.py000066400000000000000000000254521515024150700225340ustar00rootroot00000000000000"""British Color Standard This module contains colors defined in one of the British Standards for colors, BS381C. This standard specifies colors used in identification, coding, and other special purposes. See https://www.britishstandardcolour.com/ for more information. To use the colors from this list, access them directly from the module (which is exposed to Manim's global name space): .. code:: pycon >>> from manim import BS381 >>> BS381.OXFORD_BLUE ManimColor('#1F3057') List of Color Constants ----------------------- These hex values (taken from https://www.w3schools.com/colors/colors_british.asp) are non official approximate values intended to simulate the ones defined in the standard: .. automanimcolormodule:: manim.utils.color.BS381 """ from __future__ import annotations from .core import ManimColor BS381_101 = ManimColor("#94BFAC") SKY_BLUE = ManimColor("#94BFAC") BS381_102 = ManimColor("#5B9291") TURQUOISE_BLUE = ManimColor("#5B9291") BS381_103 = ManimColor("#3B6879") PEACOCK_BLUE = ManimColor("#3B6879") BS381_104 = ManimColor("#264D7E") AZURE_BLUE = ManimColor("#264D7E") BS381_105 = ManimColor("#1F3057") OXFORD_BLUE = ManimColor("#1F3057") BS381_106 = ManimColor("#2A283D") ROYAL_BLUE = ManimColor("#2A283D") BS381_107 = ManimColor("#3A73A9") STRONG_BLUE = ManimColor("#3A73A9") BS381_108 = ManimColor("#173679") AIRCRAFT_BLUE = ManimColor("#173679") BS381_109 = ManimColor("#1C5680") MIDDLE_BLUE = ManimColor("#1C5680") BS381_110 = ManimColor("#2C3E75") ROUNDEL_BLUE = ManimColor("#2C3E75") BS381_111 = ManimColor("#8CC5BB") PALE_BLUE = ManimColor("#8CC5BB") BS381_112 = ManimColor("#78ADC2") ARCTIC_BLUE = ManimColor("#78ADC2") FIESTA_BLUE = ManimColor("#78ADC2") BS381_113 = ManimColor("#3F687D") DEEP_SAXE_BLUE = ManimColor("#3F687D") BS381_114 = ManimColor("#1F4B61") RAIL_BLUE = ManimColor("#1F4B61") BS381_115 = ManimColor("#5F88C1") COBALT_BLUE = ManimColor("#5F88C1") BS381_166 = ManimColor("#2458AF") FRENCH_BLUE = ManimColor("#2458AF") BS381_169 = ManimColor("#135B75") TRAFFIC_BLUE = ManimColor("#135B75") BS381_172 = ManimColor("#A7C6EB") PALE_ROUNDEL_BLUE = ManimColor("#A7C6EB") BS381_174 = ManimColor("#64A0AA") ORIENT_BLUE = ManimColor("#64A0AA") BS381_175 = ManimColor("#4F81C5") LIGHT_FRENCH_BLUE = ManimColor("#4F81C5") BS381_210 = ManimColor("#BBC9A5") SKY = ManimColor("#BBC9A5") BS381_216 = ManimColor("#BCD890") EAU_DE_NIL = ManimColor("#BCD890") BS381_217 = ManimColor("#96BF65") SEA_GREEN = ManimColor("#96BF65") BS381_218 = ManimColor("#698B47") GRASS_GREEN = ManimColor("#698B47") BS381_219 = ManimColor("#757639") SAGE_GREEN = ManimColor("#757639") BS381_220 = ManimColor("#4B5729") OLIVE_GREEN = ManimColor("#4B5729") BS381_221 = ManimColor("#507D3A") BRILLIANT_GREEN = ManimColor("#507D3A") BS381_222 = ManimColor("#6A7031") LIGHT_BRONZE_GREEN = ManimColor("#6A7031") BS381_223 = ManimColor("#49523A") MIDDLE_BRONZE_GREEN = ManimColor("#49523A") BS381_224 = ManimColor("#3E4630") DEEP_BRONZE_GREEN = ManimColor("#3E4630") BS381_225 = ManimColor("#406A28") LIGHT_BRUNSWICK_GREEN = ManimColor("#406A28") BS381_226 = ManimColor("#33533B") MID_BRUNSWICK_GREEN = ManimColor("#33533B") BS381_227 = ManimColor("#254432") DEEP_BRUNSWICK_GREEN = ManimColor("#254432") BS381_228 = ManimColor("#428B64") EMERALD_GREEN = ManimColor("#428B64") BS381_241 = ManimColor("#4F5241") DARK_GREEN = ManimColor("#4F5241") BS381_262 = ManimColor("#44945E") BOLD_GREEN = ManimColor("#44945E") BS381_267 = ManimColor("#476A4C") DEEP_CHROME_GREEN = ManimColor("#476A4C") TRAFFIC_GREEN = ManimColor("#476A4C") BS381_275 = ManimColor("#8FC693") OPALINE_GREEN = ManimColor("#8FC693") BS381_276 = ManimColor("#2E4C1E") LINCON_GREEN = ManimColor("#2E4C1E") BS381_277 = ManimColor("#364A20") CYPRESS_GREEN = ManimColor("#364A20") BS381_278 = ManimColor("#87965A") LIGHT_OLIVE_GREEN = ManimColor("#87965A") BS381_279 = ManimColor("#3B3629") STEEL_FURNITURE_GREEN = ManimColor("#3B3629") BS381_280 = ManimColor("#68AB77") VERDIGRIS_GREEN = ManimColor("#68AB77") BS381_282 = ManimColor("#506B52") FOREST_GREEN = ManimColor("#506B52") BS381_283 = ManimColor("#7E8F6E") AIRCRAFT_GREY_GREEN = ManimColor("#7E8F6E") BS381_284 = ManimColor("#6B6F5A") SPRUCE_GREEN = ManimColor("#6B6F5A") BS381_285 = ManimColor("#5F5C4B") NATO_GREEN = ManimColor("#5F5C4B") BS381_298 = ManimColor("#4F5138") OLIVE_DRAB = ManimColor("#4F5138") BS381_309 = ManimColor("#FEEC04") CANARY_YELLOW = ManimColor("#FEEC04") BS381_310 = ManimColor("#FEF963") PRIMROSE = ManimColor("#FEF963") BS381_315 = ManimColor("#FEF96A") GRAPEFRUIT = ManimColor("#FEF96A") BS381_320 = ManimColor("#9E7339") LIGHT_BROWN = ManimColor("#9E7339") BS381_337 = ManimColor("#4C4A3C") VERY_DARK_DRAB = ManimColor("#4C4A3C") BS381_350 = ManimColor("#7B6B4F") DARK_EARTH = ManimColor("#7B6B4F") BS381_352 = ManimColor("#FCED96") PALE_CREAM = ManimColor("#FCED96") BS381_353 = ManimColor("#FDF07A") DEEP_CREAM = ManimColor("#FDF07A") BS381_354 = ManimColor("#E9BB43") PRIMROSE_2 = ManimColor("#E9BB43") BS381_355 = ManimColor("#FDD906") LEMON = ManimColor("#FDD906") BS381_356 = ManimColor("#FCC808") GOLDEN_YELLOW = ManimColor("#FCC808") BS381_358 = ManimColor("#F6C870") LIGHT_BUFF = ManimColor("#F6C870") BS381_359 = ManimColor("#DBAC50") MIDDLE_BUFF = ManimColor("#DBAC50") BS381_361 = ManimColor("#D4B97D") LIGHT_STONE = ManimColor("#D4B97D") BS381_362 = ManimColor("#AC7C42") MIDDLE_STONE = ManimColor("#AC7C42") BS381_363 = ManimColor("#FDE706") BOLD_YELLOW = ManimColor("#FDE706") BS381_364 = ManimColor("#CEC093") PORTLAND_STONE = ManimColor("#CEC093") BS381_365 = ManimColor("#F4F0BD") VELLUM = ManimColor("#F4F0BD") BS381_366 = ManimColor("#F5E7A1") LIGHT_BEIGE = ManimColor("#F5E7A1") BS381_367 = ManimColor("#FEF6BF") MANILLA = ManimColor("#fef6bf") BS381_368 = ManimColor("#DD7B00") TRAFFIC_YELLOW = ManimColor("#DD7B00") BS381_369 = ManimColor("#FEEBA8") BISCUIT = ManimColor("#feeba8") BS381_380 = ManimColor("#BBA38A") CAMOUFLAGE_DESERT_SAND = ManimColor("#BBA38A") BS381_384 = ManimColor("#EEDFA5") LIGHT_STRAW = ManimColor("#EEDFA5") BS381_385 = ManimColor("#E8C88F") LIGHT_BISCUIT = ManimColor("#E8C88F") BS381_386 = ManimColor("#E6C18D") CHAMPAGNE = ManimColor("#e6c18d") BS381_387 = ManimColor("#CFB48A") SUNRISE = ManimColor("#cfb48a") SUNSHINE = ManimColor("#cfb48a") BS381_388 = ManimColor("#E4CF93") BEIGE = ManimColor("#e4cf93") BS381_389 = ManimColor("#B2A788") CAMOUFLAGE_BEIGE = ManimColor("#B2A788") BS381_397 = ManimColor("#F3D163") JASMINE_YELLOW = ManimColor("#F3D163") BS381_411 = ManimColor("#74542F") MIDDLE_BROWN = ManimColor("#74542F") BS381_412 = ManimColor("#5C422E") DARK_BROWN = ManimColor("#5C422E") BS381_413 = ManimColor("#402D21") NUT_BROWN = ManimColor("#402D21") BS381_414 = ManimColor("#A86C29") GOLDEN_BROWN = ManimColor("#A86C29") BS381_415 = ManimColor("#61361E") IMPERIAL_BROWN = ManimColor("#61361E") BS381_420 = ManimColor("#A89177") DARK_CAMOUFLAGE_DESERT_SAND = ManimColor("#A89177") BS381_435 = ManimColor("#845B4D") CAMOUFLAGE_RED = ManimColor("#845B4D") BS381_436 = ManimColor("#564B47") DARK_CAMOUFLAGE_BROWN = ManimColor("#564B47") BS381_439 = ManimColor("#753B1E") ORANGE_BROWN = ManimColor("#753B1E") BS381_443 = ManimColor("#C98A71") SALMON = ManimColor("#c98a71") BS381_444 = ManimColor("#A65341") TERRACOTTA = ManimColor("#a65341") BS381_445 = ManimColor("#83422B") VENETIAN_RED = ManimColor("#83422B") BS381_446 = ManimColor("#774430") RED_OXIDE = ManimColor("#774430") BS381_447 = ManimColor("#F3B28B") SALMON_PINK = ManimColor("#F3B28B") BS381_448 = ManimColor("#67403A") DEEP_INDIAN_RED = ManimColor("#67403A") BS381_449 = ManimColor("#693B3F") LIGHT_PURPLE_BROWN = ManimColor("#693B3F") BS381_452 = ManimColor("#613339") DARK_CRIMSON = ManimColor("#613339") BS381_453 = ManimColor("#FBDED6") SHELL_PINK = ManimColor("#FBDED6") BS381_454 = ManimColor("#E8A1A2") PALE_ROUNDEL_RED = ManimColor("#E8A1A2") BS381_460 = ManimColor("#BD8F56") DEEP_BUFF = ManimColor("#BD8F56") BS381_473 = ManimColor("#793932") GULF_RED = ManimColor("#793932") BS381_489 = ManimColor("#8D5B41") LEAF_BROWN = ManimColor("#8D5B41") BS381_490 = ManimColor("#573320") BEECH_BROWN = ManimColor("#573320") BS381_499 = ManimColor("#59493E") SERVICE_BROWN = ManimColor("#59493E") BS381_536 = ManimColor("#BB3016") POPPY = ManimColor("#bb3016") BS381_537 = ManimColor("#DD3420") SIGNAL_RED = ManimColor("#DD3420") BS381_538 = ManimColor("#C41C22") POST_OFFICE_RED = ManimColor("#C41C22") CHERRY = ManimColor("#c41c22") BS381_539 = ManimColor("#D21E2B") CURRANT_RED = ManimColor("#D21E2B") BS381_540 = ManimColor("#8B1A32") CRIMSON = ManimColor("#8b1a32") BS381_541 = ManimColor("#471B21") MAROON = ManimColor("#471b21") BS381_542 = ManimColor("#982D57") RUBY = ManimColor("#982d57") BS381_557 = ManimColor("#EF841E") LIGHT_ORANGE = ManimColor("#EF841E") BS381_564 = ManimColor("#DD3524") BOLD_RED = ManimColor("#DD3524") BS381_568 = ManimColor("#FB9C06") APRICOT = ManimColor("#fb9c06") BS381_570 = ManimColor("#A83C19") TRAFFIC_RED = ManimColor("#A83C19") BS381_591 = ManimColor("#D04E09") DEEP_ORANGE = ManimColor("#D04E09") BS381_592 = ManimColor("#E45523") INTERNATIONAL_ORANGE = ManimColor("#E45523") BS381_593 = ManimColor("#F24816") RAIL_RED = ManimColor("#F24816") AZO_ORANGE = ManimColor("#F24816") BS381_626 = ManimColor("#A0A9AA") CAMOUFLAGE_GREY = ManimColor("#A0A9AA") BS381_627 = ManimColor("#BEC0B8") LIGHT_AIRCRAFT_GREY = ManimColor("#BEC0B8") BS381_628 = ManimColor("#9D9D7E") SILVER_GREY = ManimColor("#9D9D7E") BS381_629 = ManimColor("#7A838B") DARK_CAMOUFLAGE_GREY = ManimColor("#7A838B") BS381_630 = ManimColor("#A5AD98") FRENCH_GREY = ManimColor("#A5AD98") BS381_631 = ManimColor("#9AAA9F") LIGHT_GREY = ManimColor("#9AAA9F") BS381_632 = ManimColor("#6B7477") DARK_ADMIRALTY_GREY = ManimColor("#6B7477") BS381_633 = ManimColor("#424C53") RAF_BLUE_GREY = ManimColor("#424C53") BS381_634 = ManimColor("#6F7264") SLATE = ManimColor("#6f7264") BS381_635 = ManimColor("#525B55") LEAD = ManimColor("#525b55") BS381_636 = ManimColor("#5F7682") PRU_BLUE = ManimColor("#5F7682") BS381_637 = ManimColor("#8E9B9C") MEDIUM_SEA_GREY = ManimColor("#8E9B9C") BS381_638 = ManimColor("#6C7377") DARK_SEA_GREY = ManimColor("#6C7377") BS381_639 = ManimColor("#667563") LIGHT_SLATE_GREY = ManimColor("#667563") BS381_640 = ManimColor("#566164") EXTRA_DARK_SEA_GREY = ManimColor("#566164") BS381_642 = ManimColor("#282B2F") NIGHT = ManimColor("#282b2f") BS381_671 = ManimColor("#4E5355") MIDDLE_GRAPHITE = ManimColor("#4E5355") BS381_676 = ManimColor("#A9B7B9") LIGHT_WEATHERWORK_GREY = ManimColor("#A9B7B9") BS381_677 = ManimColor("#676F76") DARK_WEATHERWORK_GREY = ManimColor("#676F76") BS381_692 = ManimColor("#7B93A3") SMOKE_GREY = ManimColor("#7B93A3") BS381_693 = ManimColor("#88918D") AIRCRAFT_GREY = ManimColor("#88918D") BS381_694 = ManimColor("#909A92") DOVE_GREY = ManimColor("#909A92") BS381_697 = ManimColor("#B6D3CC") LIGHT_ADMIRALTY_GREY = ManimColor("#B6D3CC") BS381_796 = ManimColor("#6E4A75") DARK_VIOLET = ManimColor("#6E4A75") BS381_797 = ManimColor("#C9A8CE") LIGHT_VIOLET = ManimColor("#C9A8CE") ManimCommunity-manim-1157b74/manim/utils/color/DVIPSNAMES.py000066400000000000000000000056361515024150700234470ustar00rootroot00000000000000r"""dvips Colors This module contains the colors defined in the dvips driver, which are commonly accessed as named colors in LaTeX via the ``\usepackage[dvipsnames]{xcolor}`` package. To use the colors from this list, access them directly from the module (which is exposed to Manim's global name space): .. code:: pycon >>> from manim import DVIPSNAMES >>> DVIPSNAMES.DARKORCHID ManimColor('#A4538A') List of Color Constants ----------------------- These hex values are derived from those specified in the ``xcolor`` package documentation (see https://ctan.org/pkg/xcolor): .. automanimcolormodule:: manim.utils.color.DVIPSNAMES """ from __future__ import annotations from .core import ManimColor AQUAMARINE = ManimColor("#00B5BE") BITTERSWEET = ManimColor("#C04F17") APRICOT = ManimColor("#FBB982") BLACK = ManimColor("#221E1F") BLUE = ManimColor("#2D2F92") BLUEGREEN = ManimColor("#00B3B8") BLUEVIOLET = ManimColor("#473992") BRICKRED = ManimColor("#B6321C") BROWN = ManimColor("#792500") BURNTORANGE = ManimColor("#F7921D") CADETBLUE = ManimColor("#74729A") CARNATIONPINK = ManimColor("#F282B4") CERULEAN = ManimColor("#00A2E3") CORNFLOWERBLUE = ManimColor("#41B0E4") CYAN = ManimColor("#00AEEF") DANDELION = ManimColor("#FDBC42") DARKORCHID = ManimColor("#A4538A") EMERALD = ManimColor("#00A99D") FORESTGREEN = ManimColor("#009B55") FUCHSIA = ManimColor("#8C368C") GOLDENROD = ManimColor("#FFDF42") GRAY = ManimColor("#949698") GREEN = ManimColor("#00A64F") GREENYELLOW = ManimColor("#DFE674") JUNGLEGREEN = ManimColor("#00A99A") LAVENDER = ManimColor("#F49EC4") LIMEGREEN = ManimColor("#8DC73E") MAGENTA = ManimColor("#EC008C") MAHOGANY = ManimColor("#A9341F") MAROON = ManimColor("#AF3235") MELON = ManimColor("#F89E7B") MIDNIGHTBLUE = ManimColor("#006795") MULBERRY = ManimColor("#A93C93") NAVYBLUE = ManimColor("#006EB8") OLIVEGREEN = ManimColor("#3C8031") ORANGE = ManimColor("#F58137") ORANGERED = ManimColor("#ED135A") ORCHID = ManimColor("#AF72B0") PEACH = ManimColor("#F7965A") PERIWINKLE = ManimColor("#7977B8") PINEGREEN = ManimColor("#008B72") PLUM = ManimColor("#92268F") PROCESSBLUE = ManimColor("#00B0F0") PURPLE = ManimColor("#99479B") RAWSIENNA = ManimColor("#974006") RED = ManimColor("#ED1B23") REDORANGE = ManimColor("#F26035") REDVIOLET = ManimColor("#A1246B") RHODAMINE = ManimColor("#EF559F") ROYALBLUE = ManimColor("#0071BC") ROYALPURPLE = ManimColor("#613F99") RUBINERED = ManimColor("#ED017D") SALMON = ManimColor("#F69289") SEAGREEN = ManimColor("#3FBC9D") SEPIA = ManimColor("#671800") SKYBLUE = ManimColor("#46C5DD") SPRINGGREEN = ManimColor("#C6DC67") TAN = ManimColor("#DA9D76") TEALBLUE = ManimColor("#00AEB3") THISTLE = ManimColor("#D883B7") TURQUOISE = ManimColor("#00B4CE") VIOLET = ManimColor("#58429B") VIOLETRED = ManimColor("#EF58A0") WHITE = ManimColor("#FFFFFF") WILDSTRAWBERRY = ManimColor("#EE2967") YELLOW = ManimColor("#FFF200") YELLOWGREEN = ManimColor("#98CC70") YELLOWORANGE = ManimColor("#FAA21A") ManimCommunity-manim-1157b74/manim/utils/color/SVGNAMES.py000066400000000000000000000133341515024150700232130ustar00rootroot00000000000000r"""SVG 1.1 Colors This module contains the colors defined in the SVG 1.1 specification, which are commonly accessed as named colors in LaTeX via the ``\usepackage[svgnames]{xcolor}`` package. To use the colors from this list, access them directly from the module (which is exposed to Manim's global name space): .. code:: pycon >>> from manim import SVGNAMES >>> SVGNAMES.LIGHTCORAL ManimColor('#EF7F7F') List of Color Constants ----------------------- These hex values are derived from those specified in the ``xcolor`` package documentation (see https://ctan.org/pkg/xcolor): .. automanimcolormodule:: manim.utils.color.SVGNAMES """ from __future__ import annotations from .core import ManimColor ALICEBLUE = ManimColor("#EFF7FF") ANTIQUEWHITE = ManimColor("#F9EAD7") AQUA = ManimColor("#00FFFF") AQUAMARINE = ManimColor("#7EFFD3") AZURE = ManimColor("#EFFFFF") BEIGE = ManimColor("#F4F4DC") BISQUE = ManimColor("#FFE3C4") BLACK = ManimColor("#000000") BLANCHEDALMOND = ManimColor("#FFEACD") BLUE = ManimColor("#0000FF") BLUEVIOLET = ManimColor("#892BE2") BROWN = ManimColor("#A52A2A") BURLYWOOD = ManimColor("#DDB787") CADETBLUE = ManimColor("#5E9EA0") CHARTREUSE = ManimColor("#7EFF00") CHOCOLATE = ManimColor("#D2681D") CORAL = ManimColor("#FF7E4F") CORNFLOWERBLUE = ManimColor("#6395ED") CORNSILK = ManimColor("#FFF7DC") CRIMSON = ManimColor("#DC143B") CYAN = ManimColor("#00FFFF") DARKBLUE = ManimColor("#00008A") DARKCYAN = ManimColor("#008A8A") DARKGOLDENROD = ManimColor("#B7850B") DARKGRAY = ManimColor("#A9A9A9") DARKGREEN = ManimColor("#006300") DARKGREY = ManimColor("#A9A9A9") DARKKHAKI = ManimColor("#BCB66B") DARKMAGENTA = ManimColor("#8A008A") DARKOLIVEGREEN = ManimColor("#546B2F") DARKORANGE = ManimColor("#FF8C00") DARKORCHID = ManimColor("#9931CC") DARKRED = ManimColor("#8A0000") DARKSALMON = ManimColor("#E8967A") DARKSEAGREEN = ManimColor("#8EBB8E") DARKSLATEBLUE = ManimColor("#483D8A") DARKSLATEGRAY = ManimColor("#2F4F4F") DARKSLATEGREY = ManimColor("#2F4F4F") DARKTURQUOISE = ManimColor("#00CED1") DARKVIOLET = ManimColor("#9300D3") DEEPPINK = ManimColor("#FF1492") DEEPSKYBLUE = ManimColor("#00BFFF") DIMGRAY = ManimColor("#686868") DIMGREY = ManimColor("#686868") DODGERBLUE = ManimColor("#1D90FF") FIREBRICK = ManimColor("#B12121") FLORALWHITE = ManimColor("#FFF9EF") FORESTGREEN = ManimColor("#218A21") FUCHSIA = ManimColor("#FF00FF") GAINSBORO = ManimColor("#DCDCDC") GHOSTWHITE = ManimColor("#F7F7FF") GOLD = ManimColor("#FFD700") GOLDENROD = ManimColor("#DAA51F") GRAY = ManimColor("#7F7F7F") GREEN = ManimColor("#007F00") GREENYELLOW = ManimColor("#ADFF2F") GREY = ManimColor("#7F7F7F") HONEYDEW = ManimColor("#EFFFEF") HOTPINK = ManimColor("#FF68B3") INDIANRED = ManimColor("#CD5B5B") INDIGO = ManimColor("#4A0082") IVORY = ManimColor("#FFFFEF") KHAKI = ManimColor("#EFE58C") LAVENDER = ManimColor("#E5E5F9") LAVENDERBLUSH = ManimColor("#FFEFF4") LAWNGREEN = ManimColor("#7CFC00") LEMONCHIFFON = ManimColor("#FFF9CD") LIGHTBLUE = ManimColor("#ADD8E5") LIGHTCORAL = ManimColor("#EF7F7F") LIGHTCYAN = ManimColor("#E0FFFF") LIGHTGOLDENROD = ManimColor("#EDDD82") LIGHTGOLDENRODYELLOW = ManimColor("#F9F9D2") LIGHTGRAY = ManimColor("#D3D3D3") LIGHTGREEN = ManimColor("#90ED90") LIGHTGREY = ManimColor("#D3D3D3") LIGHTPINK = ManimColor("#FFB5C0") LIGHTSALMON = ManimColor("#FFA07A") LIGHTSEAGREEN = ManimColor("#1FB1AA") LIGHTSKYBLUE = ManimColor("#87CEF9") LIGHTSLATEBLUE = ManimColor("#8470FF") LIGHTSLATEGRAY = ManimColor("#778799") LIGHTSLATEGREY = ManimColor("#778799") LIGHTSTEELBLUE = ManimColor("#AFC4DD") LIGHTYELLOW = ManimColor("#FFFFE0") LIME = ManimColor("#00FF00") LIMEGREEN = ManimColor("#31CD31") LINEN = ManimColor("#F9EFE5") MAGENTA = ManimColor("#FF00FF") MAROON = ManimColor("#7F0000") MEDIUMAQUAMARINE = ManimColor("#66CDAA") MEDIUMBLUE = ManimColor("#0000CD") MEDIUMORCHID = ManimColor("#BA54D3") MEDIUMPURPLE = ManimColor("#9270DB") MEDIUMSEAGREEN = ManimColor("#3BB271") MEDIUMSLATEBLUE = ManimColor("#7B68ED") MEDIUMSPRINGGREEN = ManimColor("#00F99A") MEDIUMTURQUOISE = ManimColor("#48D1CC") MEDIUMVIOLETRED = ManimColor("#C61584") MIDNIGHTBLUE = ManimColor("#181870") MINTCREAM = ManimColor("#F4FFF9") MISTYROSE = ManimColor("#FFE3E1") MOCCASIN = ManimColor("#FFE3B5") NAVAJOWHITE = ManimColor("#FFDDAD") NAVY = ManimColor("#00007F") NAVYBLUE = ManimColor("#00007F") OLDLACE = ManimColor("#FCF4E5") OLIVE = ManimColor("#7F7F00") OLIVEDRAB = ManimColor("#6B8D22") ORANGE = ManimColor("#FFA500") ORANGERED = ManimColor("#FF4400") ORCHID = ManimColor("#DA70D6") PALEGOLDENROD = ManimColor("#EDE8AA") PALEGREEN = ManimColor("#97FB97") PALETURQUOISE = ManimColor("#AFEDED") PALEVIOLETRED = ManimColor("#DB7092") PAPAYAWHIP = ManimColor("#FFEED4") PEACHPUFF = ManimColor("#FFDAB8") PERU = ManimColor("#CD843F") PINK = ManimColor("#FFBFCA") PLUM = ManimColor("#DDA0DD") POWDERBLUE = ManimColor("#AFE0E5") PURPLE = ManimColor("#7F007F") RED = ManimColor("#FF0000") ROSYBROWN = ManimColor("#BB8E8E") ROYALBLUE = ManimColor("#4168E1") SADDLEBROWN = ManimColor("#8A4413") SALMON = ManimColor("#F97F72") SANDYBROWN = ManimColor("#F3A45F") SEAGREEN = ManimColor("#2D8A56") SEASHELL = ManimColor("#FFF4ED") SIENNA = ManimColor("#A0512C") SILVER = ManimColor("#BFBFBF") SKYBLUE = ManimColor("#87CEEA") SLATEBLUE = ManimColor("#6959CD") SLATEGRAY = ManimColor("#707F90") SLATEGREY = ManimColor("#707F90") SNOW = ManimColor("#FFF9F9") SPRINGGREEN = ManimColor("#00FF7E") STEELBLUE = ManimColor("#4682B3") TAN = ManimColor("#D2B38C") TEAL = ManimColor("#007F7F") THISTLE = ManimColor("#D8BFD8") TOMATO = ManimColor("#FF6347") TURQUOISE = ManimColor("#3FE0CF") VIOLET = ManimColor("#ED82ED") VIOLETRED = ManimColor("#D01F90") WHEAT = ManimColor("#F4DDB2") WHITE = ManimColor("#FFFFFF") WHITESMOKE = ManimColor("#F4F4F4") YELLOW = ManimColor("#FFFF00") YELLOWGREEN = ManimColor("#9ACD30") ManimCommunity-manim-1157b74/manim/utils/color/X11.py000066400000000000000000000424461515024150700223470ustar00rootroot00000000000000# from https://www.w3schools.com/colors/colors_x11.asp """X11 Colors These color and their names (taken from https://www.w3schools.com/colors/colors_x11.asp) were developed at the Massachusetts Intitute of Technology (MIT) during the development of color based computer display system. To use the colors from this list, access them directly from the module (which is exposed to Manim's global name space): .. code:: pycon >>> from manim import X11 >>> X11.BEIGE ManimColor('#F5F5DC') List of Color Constants ----------------------- .. automanimcolormodule:: manim.utils.color.X11 """ from __future__ import annotations from .core import ManimColor ALICEBLUE = ManimColor("#F0F8FF") ANTIQUEWHITE = ManimColor("#FAEBD7") ANTIQUEWHITE1 = ManimColor("#FFEFDB") ANTIQUEWHITE2 = ManimColor("#EEDFCC") ANTIQUEWHITE3 = ManimColor("#CDC0B0") ANTIQUEWHITE4 = ManimColor("#8B8378") AQUAMARINE1 = ManimColor("#7FFFD4") AQUAMARINE2 = ManimColor("#76EEC6") AQUAMARINE4 = ManimColor("#458B74") AZURE1 = ManimColor("#F0FFFF") AZURE2 = ManimColor("#E0EEEE") AZURE3 = ManimColor("#C1CDCD") AZURE4 = ManimColor("#838B8B") BEIGE = ManimColor("#F5F5DC") BISQUE1 = ManimColor("#FFE4C4") BISQUE2 = ManimColor("#EED5B7") BISQUE3 = ManimColor("#CDB79E") BISQUE4 = ManimColor("#8B7D6B") BLACK = ManimColor("#000000") BLANCHEDALMOND = ManimColor("#FFEBCD") BLUE1 = ManimColor("#0000FF") BLUE2 = ManimColor("#0000EE") BLUE4 = ManimColor("#00008B") BLUEVIOLET = ManimColor("#8A2BE2") BROWN = ManimColor("#A52A2A") BROWN1 = ManimColor("#FF4040") BROWN2 = ManimColor("#EE3B3B") BROWN3 = ManimColor("#CD3333") BROWN4 = ManimColor("#8B2323") BURLYWOOD = ManimColor("#DEB887") BURLYWOOD1 = ManimColor("#FFD39B") BURLYWOOD2 = ManimColor("#EEC591") BURLYWOOD3 = ManimColor("#CDAA7D") BURLYWOOD4 = ManimColor("#8B7355") CADETBLUE = ManimColor("#5F9EA0") CADETBLUE1 = ManimColor("#98F5FF") CADETBLUE2 = ManimColor("#8EE5EE") CADETBLUE3 = ManimColor("#7AC5CD") CADETBLUE4 = ManimColor("#53868B") CHARTREUSE1 = ManimColor("#7FFF00") CHARTREUSE2 = ManimColor("#76EE00") CHARTREUSE3 = ManimColor("#66CD00") CHARTREUSE4 = ManimColor("#458B00") CHOCOLATE = ManimColor("#D2691E") CHOCOLATE1 = ManimColor("#FF7F24") CHOCOLATE2 = ManimColor("#EE7621") CHOCOLATE3 = ManimColor("#CD661D") CORAL = ManimColor("#FF7F50") CORAL1 = ManimColor("#FF7256") CORAL2 = ManimColor("#EE6A50") CORAL3 = ManimColor("#CD5B45") CORAL4 = ManimColor("#8B3E2F") CORNFLOWERBLUE = ManimColor("#6495ED") CORNSILK1 = ManimColor("#FFF8DC") CORNSILK2 = ManimColor("#EEE8CD") CORNSILK3 = ManimColor("#CDC8B1") CORNSILK4 = ManimColor("#8B8878") CYAN1 = ManimColor("#00FFFF") CYAN2 = ManimColor("#00EEEE") CYAN3 = ManimColor("#00CDCD") CYAN4 = ManimColor("#008B8B") DARKGOLDENROD = ManimColor("#B8860B") DARKGOLDENROD1 = ManimColor("#FFB90F") DARKGOLDENROD2 = ManimColor("#EEAD0E") DARKGOLDENROD3 = ManimColor("#CD950C") DARKGOLDENROD4 = ManimColor("#8B6508") DARKGREEN = ManimColor("#006400") DARKKHAKI = ManimColor("#BDB76B") DARKOLIVEGREEN = ManimColor("#556B2F") DARKOLIVEGREEN1 = ManimColor("#CAFF70") DARKOLIVEGREEN2 = ManimColor("#BCEE68") DARKOLIVEGREEN3 = ManimColor("#A2CD5A") DARKOLIVEGREEN4 = ManimColor("#6E8B3D") DARKORANGE = ManimColor("#FF8C00") DARKORANGE1 = ManimColor("#FF7F00") DARKORANGE2 = ManimColor("#EE7600") DARKORANGE3 = ManimColor("#CD6600") DARKORANGE4 = ManimColor("#8B4500") DARKORCHID = ManimColor("#9932CC") DARKORCHID1 = ManimColor("#BF3EFF") DARKORCHID2 = ManimColor("#B23AEE") DARKORCHID3 = ManimColor("#9A32CD") DARKORCHID4 = ManimColor("#68228B") DARKSALMON = ManimColor("#E9967A") DARKSEAGREEN = ManimColor("#8FBC8F") DARKSEAGREEN1 = ManimColor("#C1FFC1") DARKSEAGREEN2 = ManimColor("#B4EEB4") DARKSEAGREEN3 = ManimColor("#9BCD9B") DARKSEAGREEN4 = ManimColor("#698B69") DARKSLATEBLUE = ManimColor("#483D8B") DARKSLATEGRAY = ManimColor("#2F4F4F") DARKSLATEGRAY1 = ManimColor("#97FFFF") DARKSLATEGRAY2 = ManimColor("#8DEEEE") DARKSLATEGRAY3 = ManimColor("#79CDCD") DARKSLATEGRAY4 = ManimColor("#528B8B") DARKTURQUOISE = ManimColor("#00CED1") DARKVIOLET = ManimColor("#9400D3") DEEPPINK1 = ManimColor("#FF1493") DEEPPINK2 = ManimColor("#EE1289") DEEPPINK3 = ManimColor("#CD1076") DEEPPINK4 = ManimColor("#8B0A50") DEEPSKYBLUE1 = ManimColor("#00BFFF") DEEPSKYBLUE2 = ManimColor("#00B2EE") DEEPSKYBLUE3 = ManimColor("#009ACD") DEEPSKYBLUE4 = ManimColor("#00688B") DIMGRAY = ManimColor("#696969") DODGERBLUE1 = ManimColor("#1E90FF") DODGERBLUE2 = ManimColor("#1C86EE") DODGERBLUE3 = ManimColor("#1874CD") DODGERBLUE4 = ManimColor("#104E8B") FIREBRICK = ManimColor("#B22222") FIREBRICK1 = ManimColor("#FF3030") FIREBRICK2 = ManimColor("#EE2C2C") FIREBRICK3 = ManimColor("#CD2626") FIREBRICK4 = ManimColor("#8B1A1A") FLORALWHITE = ManimColor("#FFFAF0") FORESTGREEN = ManimColor("#228B22") GAINSBORO = ManimColor("#DCDCDC") GHOSTWHITE = ManimColor("#F8F8FF") GOLD1 = ManimColor("#FFD700") GOLD2 = ManimColor("#EEC900") GOLD3 = ManimColor("#CDAD00") GOLD4 = ManimColor("#8B7500") GOLDENROD = ManimColor("#DAA520") GOLDENROD1 = ManimColor("#FFC125") GOLDENROD2 = ManimColor("#EEB422") GOLDENROD3 = ManimColor("#CD9B1D") GOLDENROD4 = ManimColor("#8B6914") GRAY = ManimColor("#BEBEBE") GRAY1 = ManimColor("#030303") GRAY2 = ManimColor("#050505") GRAY3 = ManimColor("#080808") GRAY4 = ManimColor("#0A0A0A") GRAY5 = ManimColor("#0D0D0D") GRAY6 = ManimColor("#0F0F0F") GRAY7 = ManimColor("#121212") GRAY8 = ManimColor("#141414") GRAY9 = ManimColor("#171717") GRAY10 = ManimColor("#1A1A1A") GRAY11 = ManimColor("#1C1C1C") GRAY12 = ManimColor("#1F1F1F") GRAY13 = ManimColor("#212121") GRAY14 = ManimColor("#242424") GRAY15 = ManimColor("#262626") GRAY16 = ManimColor("#292929") GRAY17 = ManimColor("#2B2B2B") GRAY18 = ManimColor("#2E2E2E") GRAY19 = ManimColor("#303030") GRAY20 = ManimColor("#333333") GRAY21 = ManimColor("#363636") GRAY22 = ManimColor("#383838") GRAY23 = ManimColor("#3B3B3B") GRAY24 = ManimColor("#3D3D3D") GRAY25 = ManimColor("#404040") GRAY26 = ManimColor("#424242") GRAY27 = ManimColor("#454545") GRAY28 = ManimColor("#474747") GRAY29 = ManimColor("#4A4A4A") GRAY30 = ManimColor("#4D4D4D") GRAY31 = ManimColor("#4F4F4F") GRAY32 = ManimColor("#525252") GRAY33 = ManimColor("#545454") GRAY34 = ManimColor("#575757") GRAY35 = ManimColor("#595959") GRAY36 = ManimColor("#5C5C5C") GRAY37 = ManimColor("#5E5E5E") GRAY38 = ManimColor("#616161") GRAY39 = ManimColor("#636363") GRAY40 = ManimColor("#666666") GRAY41 = ManimColor("#696969") GRAY42 = ManimColor("#6B6B6B") GRAY43 = ManimColor("#6E6E6E") GRAY44 = ManimColor("#707070") GRAY45 = ManimColor("#737373") GRAY46 = ManimColor("#757575") GRAY47 = ManimColor("#787878") GRAY48 = ManimColor("#7A7A7A") GRAY49 = ManimColor("#7D7D7D") GRAY50 = ManimColor("#7F7F7F") GRAY51 = ManimColor("#828282") GRAY52 = ManimColor("#858585") GRAY53 = ManimColor("#878787") GRAY54 = ManimColor("#8A8A8A") GRAY55 = ManimColor("#8C8C8C") GRAY56 = ManimColor("#8F8F8F") GRAY57 = ManimColor("#919191") GRAY58 = ManimColor("#949494") GRAY59 = ManimColor("#969696") GRAY60 = ManimColor("#999999") GRAY61 = ManimColor("#9C9C9C") GRAY62 = ManimColor("#9E9E9E") GRAY63 = ManimColor("#A1A1A1") GRAY64 = ManimColor("#A3A3A3") GRAY65 = ManimColor("#A6A6A6") GRAY66 = ManimColor("#A8A8A8") GRAY67 = ManimColor("#ABABAB") GRAY68 = ManimColor("#ADADAD") GRAY69 = ManimColor("#B0B0B0") GRAY70 = ManimColor("#B3B3B3") GRAY71 = ManimColor("#B5B5B5") GRAY72 = ManimColor("#B8B8B8") GRAY73 = ManimColor("#BABABA") GRAY74 = ManimColor("#BDBDBD") GRAY75 = ManimColor("#BFBFBF") GRAY76 = ManimColor("#C2C2C2") GRAY77 = ManimColor("#C4C4C4") GRAY78 = ManimColor("#C7C7C7") GRAY79 = ManimColor("#C9C9C9") GRAY80 = ManimColor("#CCCCCC") GRAY81 = ManimColor("#CFCFCF") GRAY82 = ManimColor("#D1D1D1") GRAY83 = ManimColor("#D4D4D4") GRAY84 = ManimColor("#D6D6D6") GRAY85 = ManimColor("#D9D9D9") GRAY86 = ManimColor("#DBDBDB") GRAY87 = ManimColor("#DEDEDE") GRAY88 = ManimColor("#E0E0E0") GRAY89 = ManimColor("#E3E3E3") GRAY90 = ManimColor("#E5E5E5") GRAY91 = ManimColor("#E8E8E8") GRAY92 = ManimColor("#EBEBEB") GRAY93 = ManimColor("#EDEDED") GRAY94 = ManimColor("#F0F0F0") GRAY95 = ManimColor("#F2F2F2") GRAY97 = ManimColor("#F7F7F7") GRAY98 = ManimColor("#FAFAFA") GRAY99 = ManimColor("#FCFCFC") GREEN1 = ManimColor("#00FF00") GREEN2 = ManimColor("#00EE00") GREEN3 = ManimColor("#00CD00") GREEN4 = ManimColor("#008B00") GREENYELLOW = ManimColor("#ADFF2F") HONEYDEW1 = ManimColor("#F0FFF0") HONEYDEW2 = ManimColor("#E0EEE0") HONEYDEW3 = ManimColor("#C1CDC1") HONEYDEW4 = ManimColor("#838B83") HOTPINK = ManimColor("#FF69B4") HOTPINK1 = ManimColor("#FF6EB4") HOTPINK2 = ManimColor("#EE6AA7") HOTPINK3 = ManimColor("#CD6090") HOTPINK4 = ManimColor("#8B3A62") INDIANRED = ManimColor("#CD5C5C") INDIANRED1 = ManimColor("#FF6A6A") INDIANRED2 = ManimColor("#EE6363") INDIANRED3 = ManimColor("#CD5555") INDIANRED4 = ManimColor("#8B3A3A") IVORY1 = ManimColor("#FFFFF0") IVORY2 = ManimColor("#EEEEE0") IVORY3 = ManimColor("#CDCDC1") IVORY4 = ManimColor("#8B8B83") KHAKI = ManimColor("#F0E68C") KHAKI1 = ManimColor("#FFF68F") KHAKI2 = ManimColor("#EEE685") KHAKI3 = ManimColor("#CDC673") KHAKI4 = ManimColor("#8B864E") LAVENDER = ManimColor("#E6E6FA") LAVENDERBLUSH1 = ManimColor("#FFF0F5") LAVENDERBLUSH2 = ManimColor("#EEE0E5") LAVENDERBLUSH3 = ManimColor("#CDC1C5") LAVENDERBLUSH4 = ManimColor("#8B8386") LAWNGREEN = ManimColor("#7CFC00") LEMONCHIFFON1 = ManimColor("#FFFACD") LEMONCHIFFON2 = ManimColor("#EEE9BF") LEMONCHIFFON3 = ManimColor("#CDC9A5") LEMONCHIFFON4 = ManimColor("#8B8970") LIGHT = ManimColor("#EEDD82") LIGHTBLUE = ManimColor("#ADD8E6") LIGHTBLUE1 = ManimColor("#BFEFFF") LIGHTBLUE2 = ManimColor("#B2DFEE") LIGHTBLUE3 = ManimColor("#9AC0CD") LIGHTBLUE4 = ManimColor("#68838B") LIGHTCORAL = ManimColor("#F08080") LIGHTCYAN1 = ManimColor("#E0FFFF") LIGHTCYAN2 = ManimColor("#D1EEEE") LIGHTCYAN3 = ManimColor("#B4CDCD") LIGHTCYAN4 = ManimColor("#7A8B8B") LIGHTGOLDENROD1 = ManimColor("#FFEC8B") LIGHTGOLDENROD2 = ManimColor("#EEDC82") LIGHTGOLDENROD3 = ManimColor("#CDBE70") LIGHTGOLDENROD4 = ManimColor("#8B814C") LIGHTGOLDENRODYELLOW = ManimColor("#FAFAD2") LIGHTGRAY = ManimColor("#D3D3D3") LIGHTPINK = ManimColor("#FFB6C1") LIGHTPINK1 = ManimColor("#FFAEB9") LIGHTPINK2 = ManimColor("#EEA2AD") LIGHTPINK3 = ManimColor("#CD8C95") LIGHTPINK4 = ManimColor("#8B5F65") LIGHTSALMON1 = ManimColor("#FFA07A") LIGHTSALMON2 = ManimColor("#EE9572") LIGHTSALMON3 = ManimColor("#CD8162") LIGHTSALMON4 = ManimColor("#8B5742") LIGHTSEAGREEN = ManimColor("#20B2AA") LIGHTSKYBLUE = ManimColor("#87CEFA") LIGHTSKYBLUE1 = ManimColor("#B0E2FF") LIGHTSKYBLUE2 = ManimColor("#A4D3EE") LIGHTSKYBLUE3 = ManimColor("#8DB6CD") LIGHTSKYBLUE4 = ManimColor("#607B8B") LIGHTSLATEBLUE = ManimColor("#8470FF") LIGHTSLATEGRAY = ManimColor("#778899") LIGHTSTEELBLUE = ManimColor("#B0C4DE") LIGHTSTEELBLUE1 = ManimColor("#CAE1FF") LIGHTSTEELBLUE2 = ManimColor("#BCD2EE") LIGHTSTEELBLUE3 = ManimColor("#A2B5CD") LIGHTSTEELBLUE4 = ManimColor("#6E7B8B") LIGHTYELLOW1 = ManimColor("#FFFFE0") LIGHTYELLOW2 = ManimColor("#EEEED1") LIGHTYELLOW3 = ManimColor("#CDCDB4") LIGHTYELLOW4 = ManimColor("#8B8B7A") LIMEGREEN = ManimColor("#32CD32") LINEN = ManimColor("#FAF0E6") MAGENTA = ManimColor("#FF00FF") MAGENTA2 = ManimColor("#EE00EE") MAGENTA3 = ManimColor("#CD00CD") MAGENTA4 = ManimColor("#8B008B") MAROON = ManimColor("#B03060") MAROON1 = ManimColor("#FF34B3") MAROON2 = ManimColor("#EE30A7") MAROON3 = ManimColor("#CD2990") MAROON4 = ManimColor("#8B1C62") MEDIUM = ManimColor("#66CDAA") MEDIUMAQUAMARINE = ManimColor("#66CDAA") MEDIUMBLUE = ManimColor("#0000CD") MEDIUMORCHID = ManimColor("#BA55D3") MEDIUMORCHID1 = ManimColor("#E066FF") MEDIUMORCHID2 = ManimColor("#D15FEE") MEDIUMORCHID3 = ManimColor("#B452CD") MEDIUMORCHID4 = ManimColor("#7A378B") MEDIUMPURPLE = ManimColor("#9370DB") MEDIUMPURPLE1 = ManimColor("#AB82FF") MEDIUMPURPLE2 = ManimColor("#9F79EE") MEDIUMPURPLE3 = ManimColor("#8968CD") MEDIUMPURPLE4 = ManimColor("#5D478B") MEDIUMSEAGREEN = ManimColor("#3CB371") MEDIUMSLATEBLUE = ManimColor("#7B68EE") MEDIUMSPRINGGREEN = ManimColor("#00FA9A") MEDIUMTURQUOISE = ManimColor("#48D1CC") MEDIUMVIOLETRED = ManimColor("#C71585") MIDNIGHTBLUE = ManimColor("#191970") MINTCREAM = ManimColor("#F5FFFA") MISTYROSE1 = ManimColor("#FFE4E1") MISTYROSE2 = ManimColor("#EED5D2") MISTYROSE3 = ManimColor("#CDB7B5") MISTYROSE4 = ManimColor("#8B7D7B") MOCCASIN = ManimColor("#FFE4B5") NAVAJOWHITE1 = ManimColor("#FFDEAD") NAVAJOWHITE2 = ManimColor("#EECFA1") NAVAJOWHITE3 = ManimColor("#CDB38B") NAVAJOWHITE4 = ManimColor("#8B795E") NAVYBLUE = ManimColor("#000080") OLDLACE = ManimColor("#FDF5E6") OLIVEDRAB = ManimColor("#6B8E23") OLIVEDRAB1 = ManimColor("#C0FF3E") OLIVEDRAB2 = ManimColor("#B3EE3A") OLIVEDRAB4 = ManimColor("#698B22") ORANGE1 = ManimColor("#FFA500") ORANGE2 = ManimColor("#EE9A00") ORANGE3 = ManimColor("#CD8500") ORANGE4 = ManimColor("#8B5A00") ORANGERED1 = ManimColor("#FF4500") ORANGERED2 = ManimColor("#EE4000") ORANGERED3 = ManimColor("#CD3700") ORANGERED4 = ManimColor("#8B2500") ORCHID = ManimColor("#DA70D6") ORCHID1 = ManimColor("#FF83FA") ORCHID2 = ManimColor("#EE7AE9") ORCHID3 = ManimColor("#CD69C9") ORCHID4 = ManimColor("#8B4789") PALE = ManimColor("#DB7093") PALEGOLDENROD = ManimColor("#EEE8AA") PALEGREEN = ManimColor("#98FB98") PALEGREEN1 = ManimColor("#9AFF9A") PALEGREEN2 = ManimColor("#90EE90") PALEGREEN3 = ManimColor("#7CCD7C") PALEGREEN4 = ManimColor("#548B54") PALETURQUOISE = ManimColor("#AFEEEE") PALETURQUOISE1 = ManimColor("#BBFFFF") PALETURQUOISE2 = ManimColor("#AEEEEE") PALETURQUOISE3 = ManimColor("#96CDCD") PALETURQUOISE4 = ManimColor("#668B8B") PALEVIOLETRED = ManimColor("#DB7093") PALEVIOLETRED1 = ManimColor("#FF82AB") PALEVIOLETRED2 = ManimColor("#EE799F") PALEVIOLETRED3 = ManimColor("#CD6889") PALEVIOLETRED4 = ManimColor("#8B475D") PAPAYAWHIP = ManimColor("#FFEFD5") PEACHPUFF1 = ManimColor("#FFDAB9") PEACHPUFF2 = ManimColor("#EECBAD") PEACHPUFF3 = ManimColor("#CDAF95") PEACHPUFF4 = ManimColor("#8B7765") PINK = ManimColor("#FFC0CB") PINK1 = ManimColor("#FFB5C5") PINK2 = ManimColor("#EEA9B8") PINK3 = ManimColor("#CD919E") PINK4 = ManimColor("#8B636C") PLUM = ManimColor("#DDA0DD") PLUM1 = ManimColor("#FFBBFF") PLUM2 = ManimColor("#EEAEEE") PLUM3 = ManimColor("#CD96CD") PLUM4 = ManimColor("#8B668B") POWDERBLUE = ManimColor("#B0E0E6") PURPLE = ManimColor("#A020F0") PURPLE1 = ManimColor("#9B30FF") PURPLE2 = ManimColor("#912CEE") PURPLE3 = ManimColor("#7D26CD") PURPLE4 = ManimColor("#551A8B") RED1 = ManimColor("#FF0000") RED2 = ManimColor("#EE0000") RED3 = ManimColor("#CD0000") RED4 = ManimColor("#8B0000") ROSYBROWN = ManimColor("#BC8F8F") ROSYBROWN1 = ManimColor("#FFC1C1") ROSYBROWN2 = ManimColor("#EEB4B4") ROSYBROWN3 = ManimColor("#CD9B9B") ROSYBROWN4 = ManimColor("#8B6969") ROYALBLUE = ManimColor("#4169E1") ROYALBLUE1 = ManimColor("#4876FF") ROYALBLUE2 = ManimColor("#436EEE") ROYALBLUE3 = ManimColor("#3A5FCD") ROYALBLUE4 = ManimColor("#27408B") SADDLEBROWN = ManimColor("#8B4513") SALMON = ManimColor("#FA8072") SALMON1 = ManimColor("#FF8C69") SALMON2 = ManimColor("#EE8262") SALMON3 = ManimColor("#CD7054") SALMON4 = ManimColor("#8B4C39") SANDYBROWN = ManimColor("#F4A460") SEAGREEN1 = ManimColor("#54FF9F") SEAGREEN2 = ManimColor("#4EEE94") SEAGREEN3 = ManimColor("#43CD80") SEAGREEN4 = ManimColor("#2E8B57") SEASHELL1 = ManimColor("#FFF5EE") SEASHELL2 = ManimColor("#EEE5DE") SEASHELL3 = ManimColor("#CDC5BF") SEASHELL4 = ManimColor("#8B8682") SIENNA = ManimColor("#A0522D") SIENNA1 = ManimColor("#FF8247") SIENNA2 = ManimColor("#EE7942") SIENNA3 = ManimColor("#CD6839") SIENNA4 = ManimColor("#8B4726") SKYBLUE = ManimColor("#87CEEB") SKYBLUE1 = ManimColor("#87CEFF") SKYBLUE2 = ManimColor("#7EC0EE") SKYBLUE3 = ManimColor("#6CA6CD") SKYBLUE4 = ManimColor("#4A708B") SLATEBLUE = ManimColor("#6A5ACD") SLATEBLUE1 = ManimColor("#836FFF") SLATEBLUE2 = ManimColor("#7A67EE") SLATEBLUE3 = ManimColor("#6959CD") SLATEBLUE4 = ManimColor("#473C8B") SLATEGRAY = ManimColor("#708090") SLATEGRAY1 = ManimColor("#C6E2FF") SLATEGRAY2 = ManimColor("#B9D3EE") SLATEGRAY3 = ManimColor("#9FB6CD") SLATEGRAY4 = ManimColor("#6C7B8B") SNOW1 = ManimColor("#FFFAFA") SNOW2 = ManimColor("#EEE9E9") SNOW3 = ManimColor("#CDC9C9") SNOW4 = ManimColor("#8B8989") SPRINGGREEN1 = ManimColor("#00FF7F") SPRINGGREEN2 = ManimColor("#00EE76") SPRINGGREEN3 = ManimColor("#00CD66") SPRINGGREEN4 = ManimColor("#008B45") STEELBLUE = ManimColor("#4682B4") STEELBLUE1 = ManimColor("#63B8FF") STEELBLUE2 = ManimColor("#5CACEE") STEELBLUE3 = ManimColor("#4F94CD") STEELBLUE4 = ManimColor("#36648B") TAN = ManimColor("#D2B48C") TAN1 = ManimColor("#FFA54F") TAN2 = ManimColor("#EE9A49") TAN3 = ManimColor("#CD853F") TAN4 = ManimColor("#8B5A2B") THISTLE = ManimColor("#D8BFD8") THISTLE1 = ManimColor("#FFE1FF") THISTLE2 = ManimColor("#EED2EE") THISTLE3 = ManimColor("#CDB5CD") THISTLE4 = ManimColor("#8B7B8B") TOMATO1 = ManimColor("#FF6347") TOMATO2 = ManimColor("#EE5C42") TOMATO3 = ManimColor("#CD4F39") TOMATO4 = ManimColor("#8B3626") TURQUOISE = ManimColor("#40E0D0") TURQUOISE1 = ManimColor("#00F5FF") TURQUOISE2 = ManimColor("#00E5EE") TURQUOISE3 = ManimColor("#00C5CD") TURQUOISE4 = ManimColor("#00868B") VIOLET = ManimColor("#EE82EE") VIOLETRED = ManimColor("#D02090") VIOLETRED1 = ManimColor("#FF3E96") VIOLETRED2 = ManimColor("#EE3A8C") VIOLETRED3 = ManimColor("#CD3278") VIOLETRED4 = ManimColor("#8B2252") WHEAT = ManimColor("#F5DEB3") WHEAT1 = ManimColor("#FFE7BA") WHEAT2 = ManimColor("#EED8AE") WHEAT3 = ManimColor("#CDBA96") WHEAT4 = ManimColor("#8B7E66") WHITE = ManimColor("#FFFFFF") WHITESMOKE = ManimColor("#F5F5F5") YELLOW1 = ManimColor("#FFFF00") YELLOW2 = ManimColor("#EEEE00") YELLOW3 = ManimColor("#CDCD00") YELLOW4 = ManimColor("#8B8B00") YELLOWGREEN = ManimColor("#9ACD32") ManimCommunity-manim-1157b74/manim/utils/color/XKCD.py000066400000000000000000000776121515024150700225320ustar00rootroot00000000000000"""Colors from the XKCD Color Name Survey XKCD is a popular `web comic `__ created by Randall Munroe. His "`Color Name Survey `__" (with 200000 participants) resulted in a list of nearly 1000 color names. While the ``XKCD`` module is exposed to Manim's global name space, the colors included in it are not. This means that in order to use the colors, access them via the module name: .. code:: pycon >>> from manim import XKCD >>> XKCD.MANGO ManimColor('#FFA62B') List of Color Constants ----------------------- These hex values are non official approximate values intended to simulate the colors in HTML, taken from https://www.w3schools.com/colors/colors_xkcd.asp. .. automanimcolormodule:: manim.utils.color.XKCD """ from __future__ import annotations from .core import ManimColor ACIDGREEN = ManimColor("#8FFE09") ADOBE = ManimColor("#BD6C48") ALGAE = ManimColor("#54AC68") ALGAEGREEN = ManimColor("#21C36F") ALMOSTBLACK = ManimColor("#070D0D") AMBER = ManimColor("#FEB308") AMETHYST = ManimColor("#9B5FC0") APPLE = ManimColor("#6ECB3C") APPLEGREEN = ManimColor("#76CD26") APRICOT = ManimColor("#FFB16D") AQUA = ManimColor("#13EAC9") AQUABLUE = ManimColor("#02D8E9") AQUAGREEN = ManimColor("#12E193") AQUAMARINE = ManimColor("#2EE8BB") ARMYGREEN = ManimColor("#4B5D16") ASPARAGUS = ManimColor("#77AB56") AUBERGINE = ManimColor("#3D0734") AUBURN = ManimColor("#9A3001") AVOCADO = ManimColor("#90B134") AVOCADOGREEN = ManimColor("#87A922") AZUL = ManimColor("#1D5DEC") AZURE = ManimColor("#069AF3") BABYBLUE = ManimColor("#A2CFFE") BABYGREEN = ManimColor("#8CFF9E") BABYPINK = ManimColor("#FFB7CE") BABYPOO = ManimColor("#AB9004") BABYPOOP = ManimColor("#937C00") BABYPOOPGREEN = ManimColor("#8F9805") BABYPUKEGREEN = ManimColor("#B6C406") BABYPURPLE = ManimColor("#CA9BF7") BABYSHITBROWN = ManimColor("#AD900D") BABYSHITGREEN = ManimColor("#889717") BANANA = ManimColor("#FFFF7E") BANANAYELLOW = ManimColor("#FAFE4B") BARBIEPINK = ManimColor("#FE46A5") BARFGREEN = ManimColor("#94AC02") BARNEY = ManimColor("#AC1DB8") BARNEYPURPLE = ManimColor("#A00498") BATTLESHIPGREY = ManimColor("#6B7C85") BEIGE = ManimColor("#E6DAA6") BERRY = ManimColor("#990F4B") BILE = ManimColor("#B5C306") BLACK = ManimColor("#000000") BLAND = ManimColor("#AFA88B") BLOOD = ManimColor("#770001") BLOODORANGE = ManimColor("#FE4B03") BLOODRED = ManimColor("#980002") BLUE = ManimColor("#0343DF") BLUEBERRY = ManimColor("#464196") BLUEBLUE = ManimColor("#2242C7") BLUEGREEN = ManimColor("#0F9B8E") BLUEGREY = ManimColor("#85A3B2") BLUEPURPLE = ManimColor("#5A06EF") BLUEVIOLET = ManimColor("#5D06E9") BLUEWITHAHINTOFPURPLE = ManimColor("#533CC6") BLUEYGREEN = ManimColor("#2BB179") BLUEYGREY = ManimColor("#89A0B0") BLUEYPURPLE = ManimColor("#6241C7") BLUISH = ManimColor("#2976BB") BLUISHGREEN = ManimColor("#10A674") BLUISHGREY = ManimColor("#748B97") BLUISHPURPLE = ManimColor("#703BE7") BLURPLE = ManimColor("#5539CC") BLUSH = ManimColor("#F29E8E") BLUSHPINK = ManimColor("#FE828C") BOOGER = ManimColor("#9BB53C") BOOGERGREEN = ManimColor("#96B403") BORDEAUX = ManimColor("#7B002C") BORINGGREEN = ManimColor("#63B365") BOTTLEGREEN = ManimColor("#044A05") BRICK = ManimColor("#A03623") BRICKORANGE = ManimColor("#C14A09") BRICKRED = ManimColor("#8F1402") BRIGHTAQUA = ManimColor("#0BF9EA") BRIGHTBLUE = ManimColor("#0165FC") BRIGHTCYAN = ManimColor("#41FDFE") BRIGHTGREEN = ManimColor("#01FF07") BRIGHTLAVENDER = ManimColor("#C760FF") BRIGHTLIGHTBLUE = ManimColor("#26F7FD") BRIGHTLIGHTGREEN = ManimColor("#2DFE54") BRIGHTLILAC = ManimColor("#C95EFB") BRIGHTLIME = ManimColor("#87FD05") BRIGHTLIMEGREEN = ManimColor("#65FE08") BRIGHTMAGENTA = ManimColor("#FF08E8") BRIGHTOLIVE = ManimColor("#9CBB04") BRIGHTORANGE = ManimColor("#FF5B00") BRIGHTPINK = ManimColor("#FE01B1") BRIGHTPURPLE = ManimColor("#BE03FD") BRIGHTRED = ManimColor("#FF000D") BRIGHTSEAGREEN = ManimColor("#05FFA6") BRIGHTSKYBLUE = ManimColor("#02CCFE") BRIGHTTEAL = ManimColor("#01F9C6") BRIGHTTURQUOISE = ManimColor("#0FFEF9") BRIGHTVIOLET = ManimColor("#AD0AFD") BRIGHTYELLOW = ManimColor("#FFFD01") BRIGHTYELLOWGREEN = ManimColor("#9DFF00") BRITISHRACINGGREEN = ManimColor("#05480D") BRONZE = ManimColor("#A87900") BROWN = ManimColor("#653700") BROWNGREEN = ManimColor("#706C11") BROWNGREY = ManimColor("#8D8468") BROWNISH = ManimColor("#9C6D57") BROWNISHGREEN = ManimColor("#6A6E09") BROWNISHGREY = ManimColor("#86775F") BROWNISHORANGE = ManimColor("#CB7723") BROWNISHPINK = ManimColor("#C27E79") BROWNISHPURPLE = ManimColor("#76424E") BROWNISHRED = ManimColor("#9E3623") BROWNISHYELLOW = ManimColor("#C9B003") BROWNORANGE = ManimColor("#B96902") BROWNRED = ManimColor("#922B05") BROWNYELLOW = ManimColor("#B29705") BROWNYGREEN = ManimColor("#6F6C0A") BROWNYORANGE = ManimColor("#CA6B02") BRUISE = ManimColor("#7E4071") BUBBLEGUM = ManimColor("#FF6CB5") BUBBLEGUMPINK = ManimColor("#FF69AF") BUFF = ManimColor("#FEF69E") BURGUNDY = ManimColor("#610023") BURNTORANGE = ManimColor("#C04E01") BURNTRED = ManimColor("#9F2305") BURNTSIENA = ManimColor("#B75203") BURNTSIENNA = ManimColor("#B04E0F") BURNTUMBER = ManimColor("#A0450E") BURNTYELLOW = ManimColor("#D5AB09") BURPLE = ManimColor("#6832E3") BUTTER = ManimColor("#FFFF81") BUTTERSCOTCH = ManimColor("#FDB147") BUTTERYELLOW = ManimColor("#FFFD74") CADETBLUE = ManimColor("#4E7496") CAMEL = ManimColor("#C69F59") CAMO = ManimColor("#7F8F4E") CAMOGREEN = ManimColor("#526525") CAMOUFLAGEGREEN = ManimColor("#4B6113") CANARY = ManimColor("#FDFF63") CANARYYELLOW = ManimColor("#FFFE40") CANDYPINK = ManimColor("#FF63E9") CARAMEL = ManimColor("#AF6F09") CARMINE = ManimColor("#9D0216") CARNATION = ManimColor("#FD798F") CARNATIONPINK = ManimColor("#FF7FA7") CAROLINABLUE = ManimColor("#8AB8FE") CELADON = ManimColor("#BEFDB7") CELERY = ManimColor("#C1FD95") CEMENT = ManimColor("#A5A391") CERISE = ManimColor("#DE0C62") CERULEAN = ManimColor("#0485D1") CERULEANBLUE = ManimColor("#056EEE") CHARCOAL = ManimColor("#343837") CHARCOALGREY = ManimColor("#3C4142") CHARTREUSE = ManimColor("#C1F80A") CHERRY = ManimColor("#CF0234") CHERRYRED = ManimColor("#F7022A") CHESTNUT = ManimColor("#742802") CHOCOLATE = ManimColor("#3D1C02") CHOCOLATEBROWN = ManimColor("#411900") CINNAMON = ManimColor("#AC4F06") CLARET = ManimColor("#680018") CLAY = ManimColor("#B66A50") CLAYBROWN = ManimColor("#B2713D") CLEARBLUE = ManimColor("#247AFD") COBALT = ManimColor("#1E488F") COBALTBLUE = ManimColor("#030AA7") COCOA = ManimColor("#875F42") COFFEE = ManimColor("#A6814C") COOLBLUE = ManimColor("#4984B8") COOLGREEN = ManimColor("#33B864") COOLGREY = ManimColor("#95A3A6") COPPER = ManimColor("#B66325") CORAL = ManimColor("#FC5A50") CORALPINK = ManimColor("#FF6163") CORNFLOWER = ManimColor("#6A79F7") CORNFLOWERBLUE = ManimColor("#5170D7") CRANBERRY = ManimColor("#9E003A") CREAM = ManimColor("#FFFFC2") CREME = ManimColor("#FFFFB6") CRIMSON = ManimColor("#8C000F") CUSTARD = ManimColor("#FFFD78") CYAN = ManimColor("#00FFFF") DANDELION = ManimColor("#FEDF08") DARK = ManimColor("#1B2431") DARKAQUA = ManimColor("#05696B") DARKAQUAMARINE = ManimColor("#017371") DARKBEIGE = ManimColor("#AC9362") DARKBLUE = ManimColor("#030764") DARKBLUEGREEN = ManimColor("#005249") DARKBLUEGREY = ManimColor("#1F3B4D") DARKBROWN = ManimColor("#341C02") DARKCORAL = ManimColor("#CF524E") DARKCREAM = ManimColor("#FFF39A") DARKCYAN = ManimColor("#0A888A") DARKFORESTGREEN = ManimColor("#002D04") DARKFUCHSIA = ManimColor("#9D0759") DARKGOLD = ManimColor("#B59410") DARKGRASSGREEN = ManimColor("#388004") DARKGREEN = ManimColor("#054907") DARKGREENBLUE = ManimColor("#1F6357") DARKGREY = ManimColor("#363737") DARKGREYBLUE = ManimColor("#29465B") DARKHOTPINK = ManimColor("#D90166") DARKINDIGO = ManimColor("#1F0954") DARKISHBLUE = ManimColor("#014182") DARKISHGREEN = ManimColor("#287C37") DARKISHPINK = ManimColor("#DA467D") DARKISHPURPLE = ManimColor("#751973") DARKISHRED = ManimColor("#A90308") DARKKHAKI = ManimColor("#9B8F55") DARKLAVENDER = ManimColor("#856798") DARKLILAC = ManimColor("#9C6DA5") DARKLIME = ManimColor("#84B701") DARKLIMEGREEN = ManimColor("#7EBD01") DARKMAGENTA = ManimColor("#960056") DARKMAROON = ManimColor("#3C0008") DARKMAUVE = ManimColor("#874C62") DARKMINT = ManimColor("#48C072") DARKMINTGREEN = ManimColor("#20C073") DARKMUSTARD = ManimColor("#A88905") DARKNAVY = ManimColor("#000435") DARKNAVYBLUE = ManimColor("#00022E") DARKOLIVE = ManimColor("#373E02") DARKOLIVEGREEN = ManimColor("#3C4D03") DARKORANGE = ManimColor("#C65102") DARKPASTELGREEN = ManimColor("#56AE57") DARKPEACH = ManimColor("#DE7E5D") DARKPERIWINKLE = ManimColor("#665FD1") DARKPINK = ManimColor("#CB416B") DARKPLUM = ManimColor("#3F012C") DARKPURPLE = ManimColor("#35063E") DARKRED = ManimColor("#840000") DARKROSE = ManimColor("#B5485D") DARKROYALBLUE = ManimColor("#02066F") DARKSAGE = ManimColor("#598556") DARKSALMON = ManimColor("#C85A53") DARKSAND = ManimColor("#A88F59") DARKSEAFOAM = ManimColor("#1FB57A") DARKSEAFOAMGREEN = ManimColor("#3EAF76") DARKSEAGREEN = ManimColor("#11875D") DARKSKYBLUE = ManimColor("#448EE4") DARKSLATEBLUE = ManimColor("#214761") DARKTAN = ManimColor("#AF884A") DARKTAUPE = ManimColor("#7F684E") DARKTEAL = ManimColor("#014D4E") DARKTURQUOISE = ManimColor("#045C5A") DARKVIOLET = ManimColor("#34013F") DARKYELLOW = ManimColor("#D5B60A") DARKYELLOWGREEN = ManimColor("#728F02") DEEPAQUA = ManimColor("#08787F") DEEPBLUE = ManimColor("#040273") DEEPBROWN = ManimColor("#410200") DEEPGREEN = ManimColor("#02590F") DEEPLAVENDER = ManimColor("#8D5EB7") DEEPLILAC = ManimColor("#966EBD") DEEPMAGENTA = ManimColor("#A0025C") DEEPORANGE = ManimColor("#DC4D01") DEEPPINK = ManimColor("#CB0162") DEEPPURPLE = ManimColor("#36013F") DEEPRED = ManimColor("#9A0200") DEEPROSE = ManimColor("#C74767") DEEPSEABLUE = ManimColor("#015482") DEEPSKYBLUE = ManimColor("#0D75F8") DEEPTEAL = ManimColor("#00555A") DEEPTURQUOISE = ManimColor("#017374") DEEPVIOLET = ManimColor("#490648") DENIM = ManimColor("#3B638C") DENIMBLUE = ManimColor("#3B5B92") DESERT = ManimColor("#CCAD60") DIARRHEA = ManimColor("#9F8303") DIRT = ManimColor("#8A6E45") DIRTBROWN = ManimColor("#836539") DIRTYBLUE = ManimColor("#3F829D") DIRTYGREEN = ManimColor("#667E2C") DIRTYORANGE = ManimColor("#C87606") DIRTYPINK = ManimColor("#CA7B80") DIRTYPURPLE = ManimColor("#734A65") DIRTYYELLOW = ManimColor("#CDC50A") DODGERBLUE = ManimColor("#3E82FC") DRAB = ManimColor("#828344") DRABGREEN = ManimColor("#749551") DRIEDBLOOD = ManimColor("#4B0101") DUCKEGGBLUE = ManimColor("#C3FBF4") DULLBLUE = ManimColor("#49759C") DULLBROWN = ManimColor("#876E4B") DULLGREEN = ManimColor("#74A662") DULLORANGE = ManimColor("#D8863B") DULLPINK = ManimColor("#D5869D") DULLPURPLE = ManimColor("#84597E") DULLRED = ManimColor("#BB3F3F") DULLTEAL = ManimColor("#5F9E8F") DULLYELLOW = ManimColor("#EEDC5B") DUSK = ManimColor("#4E5481") DUSKBLUE = ManimColor("#26538D") DUSKYBLUE = ManimColor("#475F94") DUSKYPINK = ManimColor("#CC7A8B") DUSKYPURPLE = ManimColor("#895B7B") DUSKYROSE = ManimColor("#BA6873") DUST = ManimColor("#B2996E") DUSTYBLUE = ManimColor("#5A86AD") DUSTYGREEN = ManimColor("#76A973") DUSTYLAVENDER = ManimColor("#AC86A8") DUSTYORANGE = ManimColor("#F0833A") DUSTYPINK = ManimColor("#D58A94") DUSTYPURPLE = ManimColor("#825F87") DUSTYRED = ManimColor("#B9484E") DUSTYROSE = ManimColor("#C0737A") DUSTYTEAL = ManimColor("#4C9085") EARTH = ManimColor("#A2653E") EASTERGREEN = ManimColor("#8CFD7E") EASTERPURPLE = ManimColor("#C071FE") ECRU = ManimColor("#FEFFCA") EGGPLANT = ManimColor("#380835") EGGPLANTPURPLE = ManimColor("#430541") EGGSHELL = ManimColor("#FFFCC4") EGGSHELLBLUE = ManimColor("#C4FFF7") ELECTRICBLUE = ManimColor("#0652FF") ELECTRICGREEN = ManimColor("#21FC0D") ELECTRICLIME = ManimColor("#A8FF04") ELECTRICPINK = ManimColor("#FF0490") ELECTRICPURPLE = ManimColor("#AA23FF") EMERALD = ManimColor("#01A049") EMERALDGREEN = ManimColor("#028F1E") EVERGREEN = ManimColor("#05472A") FADEDBLUE = ManimColor("#658CBB") FADEDGREEN = ManimColor("#7BB274") FADEDORANGE = ManimColor("#F0944D") FADEDPINK = ManimColor("#DE9DAC") FADEDPURPLE = ManimColor("#916E99") FADEDRED = ManimColor("#D3494E") FADEDYELLOW = ManimColor("#FEFF7F") FAWN = ManimColor("#CFAF7B") FERN = ManimColor("#63A950") FERNGREEN = ManimColor("#548D44") FIREENGINERED = ManimColor("#FE0002") FLATBLUE = ManimColor("#3C73A8") FLATGREEN = ManimColor("#699D4C") FLUORESCENTGREEN = ManimColor("#08FF08") FLUROGREEN = ManimColor("#0AFF02") FOAMGREEN = ManimColor("#90FDA9") FOREST = ManimColor("#0B5509") FORESTGREEN = ManimColor("#06470C") FORRESTGREEN = ManimColor("#154406") FRENCHBLUE = ManimColor("#436BAD") FRESHGREEN = ManimColor("#69D84F") FROGGREEN = ManimColor("#58BC08") FUCHSIA = ManimColor("#ED0DD9") GOLD = ManimColor("#DBB40C") GOLDEN = ManimColor("#F5BF03") GOLDENBROWN = ManimColor("#B27A01") GOLDENROD = ManimColor("#F9BC08") GOLDENYELLOW = ManimColor("#FEC615") GRAPE = ManimColor("#6C3461") GRAPEFRUIT = ManimColor("#FD5956") GRAPEPURPLE = ManimColor("#5D1451") GRASS = ManimColor("#5CAC2D") GRASSGREEN = ManimColor("#3F9B0B") GRASSYGREEN = ManimColor("#419C03") GREEN = ManimColor("#15B01A") GREENAPPLE = ManimColor("#5EDC1F") GREENBLUE = ManimColor("#01C08D") GREENBROWN = ManimColor("#544E03") GREENGREY = ManimColor("#77926F") GREENISH = ManimColor("#40A368") GREENISHBEIGE = ManimColor("#C9D179") GREENISHBLUE = ManimColor("#0B8B87") GREENISHBROWN = ManimColor("#696112") GREENISHCYAN = ManimColor("#2AFEB7") GREENISHGREY = ManimColor("#96AE8D") GREENISHTAN = ManimColor("#BCCB7A") GREENISHTEAL = ManimColor("#32BF84") GREENISHTURQUOISE = ManimColor("#00FBB0") GREENISHYELLOW = ManimColor("#CDFD02") GREENTEAL = ManimColor("#0CB577") GREENYBLUE = ManimColor("#42B395") GREENYBROWN = ManimColor("#696006") GREENYELLOW = ManimColor("#B5CE08") GREENYGREY = ManimColor("#7EA07A") GREENYYELLOW = ManimColor("#C6F808") GREY = ManimColor("#929591") GREYBLUE = ManimColor("#647D8E") GREYBROWN = ManimColor("#7F7053") GREYGREEN = ManimColor("#86A17D") GREYISH = ManimColor("#A8A495") GREYISHBLUE = ManimColor("#5E819D") GREYISHBROWN = ManimColor("#7A6A4F") GREYISHGREEN = ManimColor("#82A67D") GREYISHPINK = ManimColor("#C88D94") GREYISHPURPLE = ManimColor("#887191") GREYISHTEAL = ManimColor("#719F91") GREYPINK = ManimColor("#C3909B") GREYPURPLE = ManimColor("#826D8C") GREYTEAL = ManimColor("#5E9B8A") GROSSGREEN = ManimColor("#A0BF16") GUNMETAL = ManimColor("#536267") HAZEL = ManimColor("#8E7618") HEATHER = ManimColor("#A484AC") HELIOTROPE = ManimColor("#D94FF5") HIGHLIGHTERGREEN = ManimColor("#1BFC06") HOSPITALGREEN = ManimColor("#9BE5AA") HOTGREEN = ManimColor("#25FF29") HOTMAGENTA = ManimColor("#F504C9") HOTPINK = ManimColor("#FF028D") HOTPURPLE = ManimColor("#CB00F5") HUNTERGREEN = ManimColor("#0B4008") ICE = ManimColor("#D6FFFA") ICEBLUE = ManimColor("#D7FFFE") ICKYGREEN = ManimColor("#8FAE22") INDIANRED = ManimColor("#850E04") INDIGO = ManimColor("#380282") INDIGOBLUE = ManimColor("#3A18B1") IRIS = ManimColor("#6258C4") IRISHGREEN = ManimColor("#019529") IVORY = ManimColor("#FFFFCB") JADE = ManimColor("#1FA774") JADEGREEN = ManimColor("#2BAF6A") JUNGLEGREEN = ManimColor("#048243") KELLEYGREEN = ManimColor("#009337") KELLYGREEN = ManimColor("#02AB2E") KERMITGREEN = ManimColor("#5CB200") KEYLIME = ManimColor("#AEFF6E") KHAKI = ManimColor("#AAA662") KHAKIGREEN = ManimColor("#728639") KIWI = ManimColor("#9CEF43") KIWIGREEN = ManimColor("#8EE53F") LAVENDER = ManimColor("#C79FEF") LAVENDERBLUE = ManimColor("#8B88F8") LAVENDERPINK = ManimColor("#DD85D7") LAWNGREEN = ManimColor("#4DA409") LEAF = ManimColor("#71AA34") LEAFGREEN = ManimColor("#5CA904") LEAFYGREEN = ManimColor("#51B73B") LEATHER = ManimColor("#AC7434") LEMON = ManimColor("#FDFF52") LEMONGREEN = ManimColor("#ADF802") LEMONLIME = ManimColor("#BFFE28") LEMONYELLOW = ManimColor("#FDFF38") LICHEN = ManimColor("#8FB67B") LIGHTAQUA = ManimColor("#8CFFDB") LIGHTAQUAMARINE = ManimColor("#7BFDC7") LIGHTBEIGE = ManimColor("#FFFEB6") LIGHTBLUE = ManimColor("#7BC8F6") LIGHTBLUEGREEN = ManimColor("#7EFBB3") LIGHTBLUEGREY = ManimColor("#B7C9E2") LIGHTBLUISHGREEN = ManimColor("#76FDA8") LIGHTBRIGHTGREEN = ManimColor("#53FE5C") LIGHTBROWN = ManimColor("#AD8150") LIGHTBURGUNDY = ManimColor("#A8415B") LIGHTCYAN = ManimColor("#ACFFFC") LIGHTEGGPLANT = ManimColor("#894585") LIGHTERGREEN = ManimColor("#75FD63") LIGHTERPURPLE = ManimColor("#A55AF4") LIGHTFORESTGREEN = ManimColor("#4F9153") LIGHTGOLD = ManimColor("#FDDC5C") LIGHTGRASSGREEN = ManimColor("#9AF764") LIGHTGREEN = ManimColor("#76FF7B") LIGHTGREENBLUE = ManimColor("#56FCA2") LIGHTGREENISHBLUE = ManimColor("#63F7B4") LIGHTGREY = ManimColor("#D8DCD6") LIGHTGREYBLUE = ManimColor("#9DBCD4") LIGHTGREYGREEN = ManimColor("#B7E1A1") LIGHTINDIGO = ManimColor("#6D5ACF") LIGHTISHBLUE = ManimColor("#3D7AFD") LIGHTISHGREEN = ManimColor("#61E160") LIGHTISHPURPLE = ManimColor("#A552E6") LIGHTISHRED = ManimColor("#FE2F4A") LIGHTKHAKI = ManimColor("#E6F2A2") LIGHTLAVENDAR = ManimColor("#EFC0FE") LIGHTLAVENDER = ManimColor("#DFC5FE") LIGHTLIGHTBLUE = ManimColor("#CAFFFB") LIGHTLIGHTGREEN = ManimColor("#C8FFB0") LIGHTLILAC = ManimColor("#EDC8FF") LIGHTLIME = ManimColor("#AEFD6C") LIGHTLIMEGREEN = ManimColor("#B9FF66") LIGHTMAGENTA = ManimColor("#FA5FF7") LIGHTMAROON = ManimColor("#A24857") LIGHTMAUVE = ManimColor("#C292A1") LIGHTMINT = ManimColor("#B6FFBB") LIGHTMINTGREEN = ManimColor("#A6FBB2") LIGHTMOSSGREEN = ManimColor("#A6C875") LIGHTMUSTARD = ManimColor("#F7D560") LIGHTNAVY = ManimColor("#155084") LIGHTNAVYBLUE = ManimColor("#2E5A88") LIGHTNEONGREEN = ManimColor("#4EFD54") LIGHTOLIVE = ManimColor("#ACBF69") LIGHTOLIVEGREEN = ManimColor("#A4BE5C") LIGHTORANGE = ManimColor("#FDAA48") LIGHTPASTELGREEN = ManimColor("#B2FBA5") LIGHTPEACH = ManimColor("#FFD8B1") LIGHTPEAGREEN = ManimColor("#C4FE82") LIGHTPERIWINKLE = ManimColor("#C1C6FC") LIGHTPINK = ManimColor("#FFD1DF") LIGHTPLUM = ManimColor("#9D5783") LIGHTPURPLE = ManimColor("#BF77F6") LIGHTRED = ManimColor("#FF474C") LIGHTROSE = ManimColor("#FFC5CB") LIGHTROYALBLUE = ManimColor("#3A2EFE") LIGHTSAGE = ManimColor("#BCECAC") LIGHTSALMON = ManimColor("#FEA993") LIGHTSEAFOAM = ManimColor("#A0FEBF") LIGHTSEAFOAMGREEN = ManimColor("#a7ffb5") LIGHTSEAGREEN = ManimColor("#98F6B0") LIGHTSKYBLUE = ManimColor("#C6FCFF") LIGHTTAN = ManimColor("#FBEEAC") LIGHTTEAL = ManimColor("#90E4C1") LIGHTTURQUOISE = ManimColor("#7EF4CC") LIGHTURPLE = ManimColor("#B36FF6") LIGHTVIOLET = ManimColor("#D6B4FC") LIGHTYELLOW = ManimColor("#FFFE7A") LIGHTYELLOWGREEN = ManimColor("#CCFD7F") LIGHTYELLOWISHGREEN = ManimColor("#C2FF89") LILAC = ManimColor("#CEA2FD") LILIAC = ManimColor("#C48EFD") LIME = ManimColor("#AAFF32") LIMEGREEN = ManimColor("#89FE05") LIMEYELLOW = ManimColor("#D0FE1D") LIPSTICK = ManimColor("#D5174E") LIPSTICKRED = ManimColor("#C0022F") MACARONIANDCHEESE = ManimColor("#EFB435") MAGENTA = ManimColor("#C20078") MAHOGANY = ManimColor("#4A0100") MAIZE = ManimColor("#F4D054") MANGO = ManimColor("#FFA62B") MANILLA = ManimColor("#FFFA86") MARIGOLD = ManimColor("#FCC006") MARINE = ManimColor("#042E60") MARINEBLUE = ManimColor("#01386A") MAROON = ManimColor("#650021") MAUVE = ManimColor("#AE7181") MEDIUMBLUE = ManimColor("#2C6FBB") MEDIUMBROWN = ManimColor("#7F5112") MEDIUMGREEN = ManimColor("#39AD48") MEDIUMGREY = ManimColor("#7D7F7C") MEDIUMPINK = ManimColor("#F36196") MEDIUMPURPLE = ManimColor("#9E43A2") MELON = ManimColor("#FF7855") MERLOT = ManimColor("#730039") METALLICBLUE = ManimColor("#4F738E") MIDBLUE = ManimColor("#276AB3") MIDGREEN = ManimColor("#50A747") MIDNIGHT = ManimColor("#03012D") MIDNIGHTBLUE = ManimColor("#020035") MIDNIGHTPURPLE = ManimColor("#280137") MILITARYGREEN = ManimColor("#667C3E") MILKCHOCOLATE = ManimColor("#7F4E1E") MINT = ManimColor("#9FFEB0") MINTGREEN = ManimColor("#8FFF9F") MINTYGREEN = ManimColor("#0BF77D") MOCHA = ManimColor("#9D7651") MOSS = ManimColor("#769958") MOSSGREEN = ManimColor("#658B38") MOSSYGREEN = ManimColor("#638B27") MUD = ManimColor("#735C12") MUDBROWN = ManimColor("#60460F") MUDDYBROWN = ManimColor("#886806") MUDDYGREEN = ManimColor("#657432") MUDDYYELLOW = ManimColor("#BFAC05") MUDGREEN = ManimColor("#606602") MULBERRY = ManimColor("#920A4E") MURKYGREEN = ManimColor("#6C7A0E") MUSHROOM = ManimColor("#BA9E88") MUSTARD = ManimColor("#CEB301") MUSTARDBROWN = ManimColor("#AC7E04") MUSTARDGREEN = ManimColor("#A8B504") MUSTARDYELLOW = ManimColor("#D2BD0A") MUTEDBLUE = ManimColor("#3B719F") MUTEDGREEN = ManimColor("#5FA052") MUTEDPINK = ManimColor("#D1768F") MUTEDPURPLE = ManimColor("#805B87") NASTYGREEN = ManimColor("#70B23F") NAVY = ManimColor("#01153E") NAVYBLUE = ManimColor("#001146") NAVYGREEN = ManimColor("#35530A") NEONBLUE = ManimColor("#04D9FF") NEONGREEN = ManimColor("#0CFF0C") NEONPINK = ManimColor("#FE019A") NEONPURPLE = ManimColor("#BC13FE") NEONRED = ManimColor("#FF073A") NEONYELLOW = ManimColor("#CFFF04") NICEBLUE = ManimColor("#107AB0") NIGHTBLUE = ManimColor("#040348") OCEAN = ManimColor("#017B92") OCEANBLUE = ManimColor("#03719C") OCEANGREEN = ManimColor("#3D9973") OCHER = ManimColor("#BF9B0C") OCHRE = ManimColor("#BF9005") OCRE = ManimColor("#C69C04") OFFBLUE = ManimColor("#5684AE") OFFGREEN = ManimColor("#6BA353") OFFWHITE = ManimColor("#FFFFE4") OFFYELLOW = ManimColor("#F1F33F") OLDPINK = ManimColor("#C77986") OLDROSE = ManimColor("#C87F89") OLIVE = ManimColor("#6E750E") OLIVEBROWN = ManimColor("#645403") OLIVEDRAB = ManimColor("#6F7632") OLIVEGREEN = ManimColor("#677A04") OLIVEYELLOW = ManimColor("#C2B709") ORANGE = ManimColor("#F97306") ORANGEBROWN = ManimColor("#BE6400") ORANGEISH = ManimColor("#FD8D49") ORANGEPINK = ManimColor("#FF6F52") ORANGERED = ManimColor("#FE420F") ORANGEYBROWN = ManimColor("#B16002") ORANGEYELLOW = ManimColor("#FFAD01") ORANGEYRED = ManimColor("#FA4224") ORANGEYYELLOW = ManimColor("#FDB915") ORANGISH = ManimColor("#FC824A") ORANGISHBROWN = ManimColor("#B25F03") ORANGISHRED = ManimColor("#F43605") ORCHID = ManimColor("#C875C4") PALE = ManimColor("#FFF9D0") PALEAQUA = ManimColor("#B8FFEB") PALEBLUE = ManimColor("#D0FEFE") PALEBROWN = ManimColor("#B1916E") PALECYAN = ManimColor("#B7FFFA") PALEGOLD = ManimColor("#FDDE6C") PALEGREEN = ManimColor("#C7FDB5") PALEGREY = ManimColor("#FDFDFE") PALELAVENDER = ManimColor("#EECFFE") PALELIGHTGREEN = ManimColor("#B1FC99") PALELILAC = ManimColor("#E4CBFF") PALELIME = ManimColor("#BEFD73") PALELIMEGREEN = ManimColor("#B1FF65") PALEMAGENTA = ManimColor("#D767AD") PALEMAUVE = ManimColor("#FED0FC") PALEOLIVE = ManimColor("#B9CC81") PALEOLIVEGREEN = ManimColor("#B1D27B") PALEORANGE = ManimColor("#FFA756") PALEPEACH = ManimColor("#FFE5AD") PALEPINK = ManimColor("#FFCFDC") PALEPURPLE = ManimColor("#B790D4") PALERED = ManimColor("#D9544D") PALEROSE = ManimColor("#FDC1C5") PALESALMON = ManimColor("#FFB19A") PALESKYBLUE = ManimColor("#BDF6FE") PALETEAL = ManimColor("#82CBB2") PALETURQUOISE = ManimColor("#A5FBD5") PALEVIOLET = ManimColor("#CEAEFA") PALEYELLOW = ManimColor("#FFFF84") PARCHMENT = ManimColor("#FEFCAF") PASTELBLUE = ManimColor("#A2BFFE") PASTELGREEN = ManimColor("#B0FF9D") PASTELORANGE = ManimColor("#FF964F") PASTELPINK = ManimColor("#FFBACD") PASTELPURPLE = ManimColor("#CAA0FF") PASTELRED = ManimColor("#DB5856") PASTELYELLOW = ManimColor("#FFFE71") PEA = ManimColor("#A4BF20") PEACH = ManimColor("#FFB07C") PEACHYPINK = ManimColor("#FF9A8A") PEACOCKBLUE = ManimColor("#016795") PEAGREEN = ManimColor("#8EAB12") PEAR = ManimColor("#CBF85F") PEASOUP = ManimColor("#929901") PEASOUPGREEN = ManimColor("#94A617") PERIWINKLE = ManimColor("#8E82FE") PERIWINKLEBLUE = ManimColor("#8F99FB") PERRYWINKLE = ManimColor("#8F8CE7") PETROL = ManimColor("#005F6A") PIGPINK = ManimColor("#E78EA5") PINE = ManimColor("#2B5D34") PINEGREEN = ManimColor("#0A481E") PINK = ManimColor("#FF81C0") PINKISH = ManimColor("#D46A7E") PINKISHBROWN = ManimColor("#B17261") PINKISHGREY = ManimColor("#C8ACA9") PINKISHORANGE = ManimColor("#FF724C") PINKISHPURPLE = ManimColor("#D648D7") PINKISHRED = ManimColor("#F10C45") PINKISHTAN = ManimColor("#D99B82") PINKPURPLE = ManimColor("#EF1DE7") PINKRED = ManimColor("#F5054F") PINKY = ManimColor("#FC86AA") PINKYPURPLE = ManimColor("#C94CBE") PINKYRED = ManimColor("#FC2647") PISSYELLOW = ManimColor("#DDD618") PISTACHIO = ManimColor("#C0FA8B") PLUM = ManimColor("#580F41") PLUMPURPLE = ManimColor("#4E0550") POISONGREEN = ManimColor("#40FD14") POO = ManimColor("#8F7303") POOBROWN = ManimColor("#885F01") POOP = ManimColor("#7F5E00") POOPBROWN = ManimColor("#7A5901") POOPGREEN = ManimColor("#6F7C00") POWDERBLUE = ManimColor("#B1D1FC") POWDERPINK = ManimColor("#FFB2D0") PRIMARYBLUE = ManimColor("#0804F9") PRUSSIANBLUE = ManimColor("#004577") PUCE = ManimColor("#A57E52") PUKE = ManimColor("#A5A502") PUKEBROWN = ManimColor("#947706") PUKEGREEN = ManimColor("#9AAE07") PUKEYELLOW = ManimColor("#C2BE0E") PUMPKIN = ManimColor("#E17701") PUMPKINORANGE = ManimColor("#FB7D07") PUREBLUE = ManimColor("#0203E2") PURPLE = ManimColor("#7E1E9C") PURPLEBLUE = ManimColor("#5D21D0") PURPLEBROWN = ManimColor("#673A3F") PURPLEGREY = ManimColor("#866F85") PURPLEISH = ManimColor("#98568D") PURPLEISHBLUE = ManimColor("#6140EF") PURPLEISHPINK = ManimColor("#DF4EC8") PURPLEPINK = ManimColor("#D725DE") PURPLERED = ManimColor("#990147") PURPLEY = ManimColor("#8756E4") PURPLEYBLUE = ManimColor("#5F34E7") PURPLEYGREY = ManimColor("#947E94") PURPLEYPINK = ManimColor("#C83CB9") PURPLISH = ManimColor("#94568C") PURPLISHBLUE = ManimColor("#601EF9") PURPLISHBROWN = ManimColor("#6B4247") PURPLISHGREY = ManimColor("#7A687F") PURPLISHPINK = ManimColor("#CE5DAE") PURPLISHRED = ManimColor("#B0054B") PURPLY = ManimColor("#983FB2") PURPLYBLUE = ManimColor("#661AEE") PURPLYPINK = ManimColor("#F075E6") PUTTY = ManimColor("#BEAE8A") RACINGGREEN = ManimColor("#014600") RADIOACTIVEGREEN = ManimColor("#2CFA1F") RASPBERRY = ManimColor("#B00149") RAWSIENNA = ManimColor("#9A6200") RAWUMBER = ManimColor("#A75E09") REALLYLIGHTBLUE = ManimColor("#D4FFFF") RED = ManimColor("#E50000") REDBROWN = ManimColor("#8B2E16") REDDISH = ManimColor("#C44240") REDDISHBROWN = ManimColor("#7F2B0A") REDDISHGREY = ManimColor("#997570") REDDISHORANGE = ManimColor("#F8481C") REDDISHPINK = ManimColor("#FE2C54") REDDISHPURPLE = ManimColor("#910951") REDDYBROWN = ManimColor("#6E1005") REDORANGE = ManimColor("#FD3C06") REDPINK = ManimColor("#FA2A55") REDPURPLE = ManimColor("#820747") REDVIOLET = ManimColor("#9E0168") REDWINE = ManimColor("#8C0034") RICHBLUE = ManimColor("#021BF9") RICHPURPLE = ManimColor("#720058") ROBINEGGBLUE = ManimColor("#8AF1FE") ROBINSEGG = ManimColor("#6DEDFD") ROBINSEGGBLUE = ManimColor("#98EFF9") ROSA = ManimColor("#FE86A4") ROSE = ManimColor("#CF6275") ROSEPINK = ManimColor("#F7879A") ROSERED = ManimColor("#BE013C") ROSYPINK = ManimColor("#F6688E") ROGUE = ManimColor("#AB1239") ROYAL = ManimColor("#0C1793") ROYALBLUE = ManimColor("#0504AA") ROYALPURPLE = ManimColor("#4B006E") RUBY = ManimColor("#CA0147") RUSSET = ManimColor("#A13905") RUST = ManimColor("#A83C09") RUSTBROWN = ManimColor("#8B3103") RUSTORANGE = ManimColor("#C45508") RUSTRED = ManimColor("#AA2704") RUSTYORANGE = ManimColor("#CD5909") RUSTYRED = ManimColor("#AF2F0D") SAFFRON = ManimColor("#FEB209") SAGE = ManimColor("#87AE73") SAGEGREEN = ManimColor("#88B378") SALMON = ManimColor("#FF796C") SALMONPINK = ManimColor("#FE7B7C") SAND = ManimColor("#E2CA76") SANDBROWN = ManimColor("#CBA560") SANDSTONE = ManimColor("#C9AE74") SANDY = ManimColor("#F1DA7A") SANDYBROWN = ManimColor("#C4A661") SANDYELLOW = ManimColor("#FCE166") SANDYYELLOW = ManimColor("#FDEE73") SAPGREEN = ManimColor("#5C8B15") SAPPHIRE = ManimColor("#2138AB") SCARLET = ManimColor("#BE0119") SEA = ManimColor("#3C9992") SEABLUE = ManimColor("#047495") SEAFOAM = ManimColor("#80F9AD") SEAFOAMBLUE = ManimColor("#78D1B6") SEAFOAMGREEN = ManimColor("#7AF9AB") SEAGREEN = ManimColor("#53FCA1") SEAWEED = ManimColor("#18D17B") SEAWEEDGREEN = ManimColor("#35AD6B") SEPIA = ManimColor("#985E2B") SHAMROCK = ManimColor("#01B44C") SHAMROCKGREEN = ManimColor("#02C14D") SHIT = ManimColor("#7F5F00") SHITBROWN = ManimColor("#7B5804") SHITGREEN = ManimColor("#758000") SHOCKINGPINK = ManimColor("#FE02A2") SICKGREEN = ManimColor("#9DB92C") SICKLYGREEN = ManimColor("#94B21C") SICKLYYELLOW = ManimColor("#D0E429") SIENNA = ManimColor("#A9561E") SILVER = ManimColor("#C5C9C7") SKY = ManimColor("#82CAFC") SKYBLUE = ManimColor("#75BBFD") SLATE = ManimColor("#516572") SLATEBLUE = ManimColor("#5B7C99") SLATEGREEN = ManimColor("#658D6D") SLATEGREY = ManimColor("#59656D") SLIMEGREEN = ManimColor("#99CC04") SNOT = ManimColor("#ACBB0D") SNOTGREEN = ManimColor("#9DC100") SOFTBLUE = ManimColor("#6488EA") SOFTGREEN = ManimColor("#6FC276") SOFTPINK = ManimColor("#FDB0C0") SOFTPURPLE = ManimColor("#A66FB5") SPEARMINT = ManimColor("#1EF876") SPRINGGREEN = ManimColor("#A9F971") SPRUCE = ManimColor("#0A5F38") SQUASH = ManimColor("#F2AB15") STEEL = ManimColor("#738595") STEELBLUE = ManimColor("#5A7D9A") STEELGREY = ManimColor("#6F828A") STONE = ManimColor("#ADA587") STORMYBLUE = ManimColor("#507B9C") STRAW = ManimColor("#FCF679") STRAWBERRY = ManimColor("#FB2943") STRONGBLUE = ManimColor("#0C06F7") STRONGPINK = ManimColor("#FF0789") SUNFLOWER = ManimColor("#FFC512") SUNFLOWERYELLOW = ManimColor("#FFDA03") SUNNYYELLOW = ManimColor("#FFF917") SUNSHINEYELLOW = ManimColor("#FFFD37") SUNYELLOW = ManimColor("#FFDF22") SWAMP = ManimColor("#698339") SWAMPGREEN = ManimColor("#748500") TAN = ManimColor("#D1B26F") TANBROWN = ManimColor("#AB7E4C") TANGERINE = ManimColor("#FF9408") TANGREEN = ManimColor("#A9BE70") TAUPE = ManimColor("#B9A281") TEA = ManimColor("#65AB7C") TEAGREEN = ManimColor("#BDF8A3") TEAL = ManimColor("#029386") TEALBLUE = ManimColor("#01889F") TEALGREEN = ManimColor("#25A36F") TEALISH = ManimColor("#24BCA8") TEALISHGREEN = ManimColor("#0CDC73") TERRACOTA = ManimColor("#CB6843") TERRACOTTA = ManimColor("#C9643B") TIFFANYBLUE = ManimColor("#7BF2DA") TOMATO = ManimColor("#EF4026") TOMATORED = ManimColor("#EC2D01") TOPAZ = ManimColor("#13BBAF") TOUPE = ManimColor("#C7AC7D") TOXICGREEN = ManimColor("#61DE2A") TREEGREEN = ManimColor("#2A7E19") TRUEBLUE = ManimColor("#010FCC") TRUEGREEN = ManimColor("#089404") TURQUOISE = ManimColor("#06C2AC") TURQUOISEBLUE = ManimColor("#06B1C4") TURQUOISEGREEN = ManimColor("#04F489") TURTLEGREEN = ManimColor("#75B84F") TWILIGHT = ManimColor("#4E518B") TWILIGHTBLUE = ManimColor("#0A437A") UGLYBLUE = ManimColor("#31668A") UGLYBROWN = ManimColor("#7D7103") UGLYGREEN = ManimColor("#7A9703") UGLYPINK = ManimColor("#CD7584") UGLYPURPLE = ManimColor("#A442A0") UGLYYELLOW = ManimColor("#D0C101") ULTRAMARINE = ManimColor("#2000B1") ULTRAMARINEBLUE = ManimColor("#1805DB") UMBER = ManimColor("#B26400") VELVET = ManimColor("#750851") VERMILION = ManimColor("#F4320C") VERYDARKBLUE = ManimColor("#000133") VERYDARKBROWN = ManimColor("#1D0200") VERYDARKGREEN = ManimColor("#062E03") VERYDARKPURPLE = ManimColor("#2A0134") VERYLIGHTBLUE = ManimColor("#D5FFFF") VERYLIGHTBROWN = ManimColor("#D3B683") VERYLIGHTGREEN = ManimColor("#D1FFBD") VERYLIGHTPINK = ManimColor("#FFF4F2") VERYLIGHTPURPLE = ManimColor("#F6CEFC") VERYPALEBLUE = ManimColor("#D6FFFE") VERYPALEGREEN = ManimColor("#CFFDBC") VIBRANTBLUE = ManimColor("#0339F8") VIBRANTGREEN = ManimColor("#0ADD08") VIBRANTPURPLE = ManimColor("#AD03DE") VIOLET = ManimColor("#9A0EEA") VIOLETBLUE = ManimColor("#510AC9") VIOLETPINK = ManimColor("#FB5FFC") VIOLETRED = ManimColor("#A50055") VIRIDIAN = ManimColor("#1E9167") VIVIDBLUE = ManimColor("#152EFF") VIVIDGREEN = ManimColor("#2FEF10") VIVIDPURPLE = ManimColor("#9900FA") VOMIT = ManimColor("#A2A415") VOMITGREEN = ManimColor("#89A203") VOMITYELLOW = ManimColor("#C7C10C") WARMBLUE = ManimColor("#4B57DB") WARMBROWN = ManimColor("#964E02") WARMGREY = ManimColor("#978A84") WARMPINK = ManimColor("#FB5581") WARMPURPLE = ManimColor("#952E8F") WASHEDOUTGREEN = ManimColor("#BCF5A6") WATERBLUE = ManimColor("#0E87CC") WATERMELON = ManimColor("#FD4659") WEIRDGREEN = ManimColor("#3AE57F") WHEAT = ManimColor("#FBDD7E") WHITE = ManimColor("#FFFFFF") WINDOWSBLUE = ManimColor("#3778BF") WINE = ManimColor("#80013F") WINERED = ManimColor("#7B0323") WINTERGREEN = ManimColor("#20F986") WISTERIA = ManimColor("#A87DC2") YELLOW = ManimColor("#FFFF14") YELLOWBROWN = ManimColor("#B79400") YELLOWGREEN = ManimColor("#BBF90F") YELLOWISH = ManimColor("#FAEE66") YELLOWISHBROWN = ManimColor("#9B7A01") YELLOWISHGREEN = ManimColor("#B0DD16") YELLOWISHORANGE = ManimColor("#FFAB0F") YELLOWISHTAN = ManimColor("#FCFC81") YELLOWOCHRE = ManimColor("#CB9D06") YELLOWORANGE = ManimColor("#FCB001") YELLOWTAN = ManimColor("#FFE36E") YELLOWYBROWN = ManimColor("#AE8B0C") YELLOWYGREEN = ManimColor("#BFF128") ManimCommunity-manim-1157b74/manim/utils/color/__init__.py000066400000000000000000000024561515024150700235320ustar00rootroot00000000000000"""Utilities for working with colors and predefined color constants. Color data structure -------------------- .. autosummary:: :toctree: ../reference core Predefined colors ----------------- There are several predefined colors available in Manim: - The colors listed in :mod:`.color.manim_colors` are loaded into Manim's global name space. - The colors in :mod:`.color.AS2700`, :mod:`.color.BS381`, :mod:`.color.DVIPSNAMES`, :mod:`.color.SVGNAMES`, :mod:`.color.X11` and :mod:`.color.XKCD` need to be accessed via their module (which are available in Manim's global name space), or imported separately. For example: .. code:: pycon >>> from manim import XKCD >>> XKCD.AVOCADO ManimColor('#90B134') Or, alternatively: .. code:: pycon >>> from manim.utils.color.XKCD import AVOCADO >>> AVOCADO ManimColor('#90B134') The following modules contain the predefined color constants: .. autosummary:: :toctree: ../reference manim_colors AS2700 BS381 DVIPSNAMES SVGNAMES XKCD X11 """ from __future__ import annotations from . import AS2700, BS381, DVIPSNAMES, SVGNAMES, X11, XKCD from .core import * from .manim_colors import * _all_color_dict: dict[str, ManimColor] = { k: v for k, v in globals().items() if isinstance(v, ManimColor) } ManimCommunity-manim-1157b74/manim/utils/color/core.py000066400000000000000000001462131515024150700227230ustar00rootroot00000000000000"""Manim's (internal) color data structure and some utilities for color conversion. This module contains the implementation of :class:`.ManimColor`, the data structure internally used to represent colors. The preferred way of using these colors is by importing their constants from Manim: .. code-block:: pycon >>> from manim import RED, GREEN, BLUE >>> print(RED) #FC6255 Note that this way uses the name of the colors in UPPERCASE. .. note:: The colors with a ``_C`` suffix have an alias equal to the colorname without a letter. For example, ``GREEN = GREEN_C``. =================== Custom Color Spaces =================== Hello, dear visitor. You seem to be interested in implementing a custom color class for a color space we don't currently support. The current system is using a few indirections for ensuring a consistent behavior with all other color types in Manim. To implement a custom color space, you must subclass :class:`ManimColor` and implement three important methods: - :attr:`~.ManimColor._internal_value`: a ``@property`` implemented on :class:`ManimColor` with the goal of keeping a consistent internal representation which can be referenced by other functions in :class:`ManimColor`. This property acts as a proxy to whatever representation you need in your class. - The getter should always return a NumPy array in the format ``[r,g,b,a]``, in accordance with the type :class:`ManimColorInternal`. - The setter should always accept a value in the format ``[r,g,b,a]`` which can be converted to whatever attributes you need. - :attr:`~ManimColor._internal_space`: a read-only ``@property`` implemented on :class:`ManimColor` with the goal of providing a useful representation which can be used by operators, interpolation and color transform functions. The only constraints on this value are: - It must be a NumPy array. - The last value must be the opacity in a range ``0.0`` to ``1.0``. Additionally, your ``__init__`` must support this format as an initialization value without additional parameters to ensure correct functionality of all other methods in :class:`ManimColor`. - :meth:`~ManimColor._from_internal`: a ``@classmethod`` which converts an ``[r,g,b,a]`` value into suitable parameters for your ``__init__`` method and calls the ``cls`` parameter. """ from __future__ import annotations import colorsys # logger = _config.logger import random import re from collections.abc import Iterable, Sequence from typing import Self, TypeAlias, TypeVar, overload import numpy as np import numpy.typing as npt from typing_extensions import TypeIs, override from manim.typing import ( FloatHSL, FloatHSLLike, FloatHSV, FloatHSVA, FloatHSVALike, FloatHSVLike, FloatRGB, FloatRGBA, FloatRGBALike, FloatRGBLike, IntRGB, IntRGBA, IntRGBALike, IntRGBLike, ManimColorDType, ManimColorInternal, ManimFloat, Point3D, Vector3D, ) from ...utils.space_ops import normalize # import manim._config as _config re_hex = re.compile("((?<=#)|(?<=0x))[A-F0-9]{3,8}", re.IGNORECASE) class ManimColor: """Internal representation of a color. The :class:`ManimColor` class is the main class for the representation of a color. Its internal representation is an array of 4 floats corresponding to a ``[r,g,b,a]`` value where ``r,g,b,a`` can be between 0.0 and 1.0. This is done in order to reduce the amount of color inconsistencies by constantly casting between integers and floats which introduces errors. The class can accept any value of type :class:`ParsableManimColor` i.e. ``ManimColor, int, str, RGB_Tuple_Int, RGB_Tuple_Float, RGBA_Tuple_Int, RGBA_Tuple_Float, RGB_Array_Int, RGB_Array_Float, RGBA_Array_Int, RGBA_Array_Float`` :class:`ManimColor` itself only accepts singular values and will directly interpret them into a single color if possible. Be careful when passing strings to :class:`ManimColor`: it can create a big overhead for the color processing. If you want to parse a list of colors, use the :meth:`parse` method, which assumes that you're going to pass a list of colors so that arrays will not be interpreted as a single color. .. warning:: If you pass an array of numbers to :meth:`parse`, it will interpret the ``r,g,b,a`` numbers in that array as colors: Instead of the expected singular color, you will get an array with 4 colors. For conversion behaviors, see the ``_internal`` functions for further documentation. You can create a :class:`ManimColor` instance via its classmethods. See the respective methods for more info. .. code-block:: python mycolor = ManimColor.from_rgb((0, 1, 0.4, 0.5)) myothercolor = ManimColor.from_rgb((153, 255, 255)) You can also convert between different color spaces: .. code-block:: python mycolor_hex = mycolor.to_hex() myoriginalcolor = ManimColor.from_hex(mycolor_hex).to_hsv() Parameters ---------- value Some representation of a color (e.g., a string or a suitable tuple). The default ``None`` is ``BLACK``. alpha The opacity of the color. By default, colors are fully opaque (value 1.0). """ def __init__( self, value: ParsableManimColor | None, alpha: float = 1.0, ) -> None: if value is None: self._internal_value = np.array((0, 0, 0, alpha), dtype=ManimColorDType) elif isinstance(value, ManimColor): # logger.info( # "ManimColor was passed another ManimColor. This is probably not what " # "you want. Created a copy of the passed ManimColor instead." # ) self._internal_value = value._internal_value elif isinstance(value, int): self._internal_value = ManimColor._internal_from_integer(value, alpha) elif isinstance(value, str): result = re_hex.search(value) if result is not None: self._internal_value = ManimColor._internal_from_hex_string( result.group(), alpha ) else: # This is not expected to be called on module initialization time # It can be horribly slow to convert a string to a color because # it has to access the dictionary of colors and find the right color self._internal_value = ManimColor._internal_from_string(value, alpha) elif isinstance(value, (list, tuple, np.ndarray)): length = len(value) if all(isinstance(x, float) for x in value): if length == 3: self._internal_value = ManimColor._internal_from_rgb(value, alpha) elif length == 4: self._internal_value = ManimColor._internal_from_rgba(value) else: raise ValueError( f"ManimColor only accepts lists/tuples/arrays of length 3 or 4, not {length}" ) else: if length == 3: self._internal_value = ManimColor._internal_from_int_rgb( value, alpha ) elif length == 4: self._internal_value = ManimColor._internal_from_int_rgba(value) else: raise ValueError( f"ManimColor only accepts lists/tuples/arrays of length 3 or 4, not {length}" ) elif hasattr(value, "get_hex") and callable(value.get_hex): result = re_hex.search(value.get_hex()) if result is None: raise ValueError(f"Failed to parse a color from {value}") self._internal_value = ManimColor._internal_from_hex_string( result.group(), alpha ) else: # logger.error(f"Invalid color value: {value}") raise TypeError( "ManimColor only accepts int, str, list[int, int, int], " "list[int, int, int, int], list[float, float, float], " f"list[float, float, float, float], not {type(value)}" ) @property def _internal_space(self) -> npt.NDArray[ManimFloat]: """This is a readonly property which is a custom representation for color space operations. It is used for operators and can be used when implementing a custom color space. """ return self._internal_value @property def _internal_value(self) -> ManimColorInternal: """Return the internal value of the current Manim color ``[r,g,b,a]`` float array. Returns ------- ManimColorInternal Internal color representation. """ return self.__value @_internal_value.setter def _internal_value(self, value: ManimColorInternal) -> None: """Overwrite the internal color value of this :class:`ManimColor`. Parameters ---------- value The value which will overwrite the current color. Raises ------ TypeError If an invalid array is passed. """ if not isinstance(value, np.ndarray): raise TypeError("Value must be a NumPy array.") if value.shape[0] != 4: raise TypeError("Array must have exactly 4 values.") self.__value: ManimColorInternal = value @classmethod def _construct_from_space( cls, _space: npt.NDArray[ManimFloat] | tuple[float, float, float] | tuple[float, float, float, float], ) -> Self: """This function is used as a proxy for constructing a color with an internal value. This can be used by subclasses to hook into the construction of new objects using the internal value format. """ return cls(_space) @staticmethod def _internal_from_integer(value: int, alpha: float) -> ManimColorInternal: return np.asarray( ( ((value >> 16) & 0xFF) / 255, ((value >> 8) & 0xFF) / 255, ((value >> 0) & 0xFF) / 255, alpha, ), dtype=ManimColorDType, ) @staticmethod def _internal_from_hex_string(hex_: str, alpha: float) -> ManimColorInternal: """Internal function for converting a hex string into the internal representation of a :class:`ManimColor`. .. warning:: This does not accept any prefixes like # or similar in front of the hex string. This is just intended for the raw hex part. *For internal use only* Parameters ---------- hex Hex string to be parsed. alpha Alpha value used for the color, if the color is only 3 bytes long. Otherwise, if the color is 4 bytes long, this parameter will not be used. Returns ------- ManimColorInternal Internal color representation """ if len(hex_) in (3, 4): hex_ = "".join([x * 2 for x in hex_]) if len(hex_) == 6: hex_ += "FF" elif len(hex_) == 8: alpha = (int(hex_, 16) & 0xFF) / 255 else: raise ValueError( "Hex colors must be specified with either 0x or # as prefix and contain 6 or 8 hexadecimal numbers" ) tmp = int(hex_, 16) return np.asarray( ( ((tmp >> 24) & 0xFF) / 255, ((tmp >> 16) & 0xFF) / 255, ((tmp >> 8) & 0xFF) / 255, alpha, ), dtype=ManimColorDType, ) @staticmethod def _internal_from_int_rgb( rgb: IntRGBLike, alpha: float = 1.0 ) -> ManimColorInternal: """Internal function for converting an RGB tuple of integers into the internal representation of a :class:`ManimColor`. *For internal use only* Parameters ---------- rgb Integer RGB tuple to be parsed alpha Optional alpha value. Default is 1.0. Returns ------- ManimColorInternal Internal color representation. """ value: np.ndarray = np.asarray(rgb, dtype=ManimColorDType).copy() / 255 value.resize(4, refcheck=False) value[3] = alpha return value @staticmethod def _internal_from_rgb(rgb: FloatRGBLike, alpha: float = 1.0) -> ManimColorInternal: """Internal function for converting a rgb tuple of floats into the internal representation of a :class:`ManimColor`. *For internal use only* Parameters ---------- rgb Float RGB tuple to be parsed. alpha Optional alpha value. Default is 1.0. Returns ------- ManimColorInternal Internal color representation. """ value: np.ndarray = np.asarray(rgb, dtype=ManimColorDType).copy() value.resize(4, refcheck=False) value[3] = alpha return value @staticmethod def _internal_from_int_rgba(rgba: IntRGBALike) -> ManimColorInternal: """Internal function for converting an RGBA tuple of integers into the internal representation of a :class:`ManimColor`. *For internal use only* Parameters ---------- rgba Int RGBA tuple to be parsed. Returns ------- ManimColorInternal Internal color representation. """ return np.asarray(rgba, dtype=ManimColorDType) / 255 @staticmethod def _internal_from_rgba(rgba: FloatRGBALike) -> ManimColorInternal: """Internal function for converting an RGBA tuple of floats into the internal representation of a :class:`ManimColor`. *For internal use only* Parameters ---------- rgba Int RGBA tuple to be parsed. Returns ------- ManimColorInternal Internal color representation. """ return np.asarray(rgba, dtype=ManimColorDType) @staticmethod def _internal_from_string(name: str, alpha: float) -> ManimColorInternal: """Internal function for converting a string into the internal representation of a :class:`ManimColor`. This is not used for hex strings: please refer to :meth:`_internal_from_hex` for this functionality. *For internal use only* Parameters ---------- name The color name to be parsed into a color. Refer to the different color modules in the documentation page to find the corresponding color names. Returns ------- ManimColorInternal Internal color representation. Raises ------ ValueError If the color name is not present in Manim. """ from . import _all_color_dict if tmp := _all_color_dict.get(name.upper()): tmp._internal_value[3] = alpha return tmp._internal_value.copy() else: raise ValueError(f"Color {name} not found") def to_integer(self) -> int: """Convert the current :class:`ManimColor` into an integer. .. warning:: This will return only the RGB part of the color. Returns ------- int Integer representation of the color. """ tmp = (self._internal_value[:3] * 255).astype(dtype=np.byte).tobytes() return int.from_bytes(tmp, "big") def to_rgb(self) -> FloatRGB: """Convert the current :class:`ManimColor` into an RGB array of floats. Returns ------- RGB_Array_Float RGB array of 3 floats from 0.0 to 1.0. """ return self._internal_value[:3] def to_int_rgb(self) -> IntRGB: """Convert the current :class:`ManimColor` into an RGB array of integers. Returns ------- RGB_Array_Int RGB array of 3 integers from 0 to 255. """ return (self._internal_value[:3] * 255).astype(int) def to_rgba(self) -> FloatRGBA: """Convert the current :class:`ManimColor` into an RGBA array of floats. Returns ------- RGBA_Array_Float RGBA array of 4 floats from 0.0 to 1.0. """ return self._internal_value def to_int_rgba(self) -> IntRGBA: """Convert the current ManimColor into an RGBA array of integers. Returns ------- RGBA_Array_Int RGBA array of 4 integers from 0 to 255. """ return (self._internal_value * 255).astype(int) def to_rgba_with_alpha(self, alpha: float) -> FloatRGBA: """Convert the current :class:`ManimColor` into an RGBA array of floats. This is similar to :meth:`to_rgba`, but you can change the alpha value. Parameters ---------- alpha Alpha value to be used in the return value. Returns ------- RGBA_Array_Float RGBA array of 4 floats from 0.0 to 1.0. """ return np.fromiter((*self._internal_value[:3], alpha), dtype=ManimColorDType) def to_int_rgba_with_alpha(self, alpha: float) -> IntRGBA: """Convert the current :class:`ManimColor` into an RGBA array of integers. This is similar to :meth:`to_int_rgba`, but you can change the alpha value. Parameters ---------- alpha Alpha value to be used for the return value. Pass a float between 0.0 and 1.0: it will automatically be scaled to an integer between 0 and 255. Returns ------- RGBA_Array_Int RGBA array of 4 integers from 0 to 255. """ tmp = self._internal_value * 255 tmp[3] = alpha * 255 return tmp.astype(int) def to_hex(self, with_alpha: bool = False) -> str: """Convert the :class:`ManimColor` to a hexadecimal representation of the color. Parameters ---------- with_alpha If ``True``, append 2 extra characters to the hex string which represent the alpha value of the color between 0 and 255. Default is ``False``. Returns ------- str A hex string starting with a ``#``, with either 6 or 8 nibbles depending on the ``with_alpha`` parameter. By default, it has 6 nibbles, i.e. ``#XXXXXX``. """ tmp = ( f"#{int(self._internal_value[0] * 255):02X}" f"{int(self._internal_value[1] * 255):02X}" f"{int(self._internal_value[2] * 255):02X}" ) if with_alpha: tmp += f"{int(self._internal_value[3] * 255):02X}" return tmp def to_hsv(self) -> FloatHSV: """Convert the :class:`ManimColor` to an HSV array. .. note:: Be careful: this returns an array in the form ``[h, s, v]``, where the elements are floats. This might be confusing, because RGB can also be an array of floats. You might want to annotate the usage of this function in your code by typing your HSV array variables as :class:`HSV_Array_Float` in order to differentiate them from RGB arrays. Returns ------- HSV_Array_Float An HSV array of 3 floats from 0.0 to 1.0. """ return np.array(colorsys.rgb_to_hsv(*self.to_rgb())) def to_hsl(self) -> FloatHSL: """Convert the :class:`ManimColor` to an HSL array. .. note:: Be careful: this returns an array in the form ``[h, s, l]``, where the elements are floats. This might be confusing, because RGB can also be an array of floats. You might want to annotate the usage of this function in your code by typing your HSL array variables as :class:`HSL_Array_Float` in order to differentiate them from RGB arrays. Returns ------- HSL_Array_Float An HSL array of 3 floats from 0.0 to 1.0. """ hls = colorsys.rgb_to_hls(*self.to_rgb()) return np.array([hls[0], hls[2], hls[1]]) def invert(self, with_alpha: bool = False) -> Self: """Return a new, linearly inverted version of this :class:`ManimColor` (no inplace changes). Parameters ---------- with_alpha If ``True``, the alpha value will be inverted too. Default is ``False``. .. note:: Setting ``with_alpha=True`` can result in unintended behavior where objects are not displayed because their new alpha value is suddenly 0 or very low. Returns ------- ManimColor The linearly inverted :class:`ManimColor`. """ if with_alpha: return self._construct_from_space(1.0 - self._internal_space) else: alpha = self._internal_space[3] new = 1.0 - self._internal_space new[-1] = alpha return self._construct_from_space(new) def interpolate(self, other: Self, alpha: float) -> Self: """Interpolate between the current and the given :class:`ManimColor`, and return the result. Parameters ---------- other The other :class:`ManimColor` to be used for interpolation. alpha A point on the line in RGBA colorspace connecting the two colors, i.e. the interpolation point. 0.0 corresponds to the current :class:`ManimColor` and 1.0 corresponds to the other :class:`ManimColor`. Returns ------- ManimColor The interpolated :class:`ManimColor`. """ return self._construct_from_space( self._internal_space * (1 - alpha) + other._internal_space * alpha ) def darker(self, blend: float = 0.2) -> Self: """Return a new color that is darker than the current color, i.e. interpolated with ``BLACK``. The opacity is unchanged. Parameters ---------- blend The blend ratio for the interpolation, from 0.0 (the current color unchanged) to 1.0 (pure black). Default is 0.2, which results in a slightly darker color. Returns ------- ManimColor The darker :class:`ManimColor`. See Also -------- :meth:`lighter` """ from manim.utils.color.manim_colors import BLACK alpha = self._internal_space[3] black = self._from_internal(BLACK._internal_value) return self.interpolate(black, blend).opacity(alpha) def lighter(self, blend: float = 0.2) -> Self: """Return a new color that is lighter than the current color, i.e. interpolated with ``WHITE``. The opacity is unchanged. Parameters ---------- blend The blend ratio for the interpolation, from 0.0 (the current color unchanged) to 1.0 (pure white). Default is 0.2, which results in a slightly lighter color. Returns ------- ManimColor The lighter :class:`ManimColor`. See Also -------- :meth:`darker` """ from manim.utils.color.manim_colors import WHITE alpha = self._internal_space[3] white = self._from_internal(WHITE._internal_value) return self.interpolate(white, blend).opacity(alpha) def contrasting( self, threshold: float = 0.5, light: Self | None = None, dark: Self | None = None, ) -> Self: """Return one of two colors, light or dark (by default white or black), that contrasts with the current color (depending on its luminance). This is typically used to set text in a contrasting color that ensures it is readable against a background of the current color. Parameters ---------- threshold The luminance threshold which dictates whether the current color is considered light or dark (and thus whether to return the dark or light color, respectively). Default is 0.5. light The light color to return if the current color is considered dark. Default is ``None``: in this case, pure ``WHITE`` will be returned. dark The dark color to return if the current color is considered light, Default is ``None``: in this case, pure ``BLACK`` will be returned. Returns ------- ManimColor The contrasting :class:`ManimColor`. """ from manim.utils.color.manim_colors import BLACK, WHITE luminance, _, _ = colorsys.rgb_to_yiq(*self.to_rgb()) if luminance < threshold: if light is not None: return light return self._from_internal(WHITE._internal_value) else: if dark is not None: return dark return self._from_internal(BLACK._internal_value) def opacity(self, opacity: float) -> Self: """Create a new :class:`ManimColor` with the given opacity and the same color values as before. Parameters ---------- opacity The new opacity value to be used. Returns ------- ManimColor The new :class:`ManimColor` with the same color values and the new opacity. """ tmp = self._internal_space.copy() tmp[-1] = opacity return self._construct_from_space(tmp) def into(self, class_type: type[ManimColorT]) -> ManimColorT: """Convert the current color into a different colorspace given by ``class_type``, without changing the :attr:`_internal_value`. Parameters ---------- class_type The class that is used for conversion. It must be a subclass of :class:`ManimColor` which respects the specification HSV, RGBA, ... Returns ------- ManimColorT A new color object of type ``class_type`` and the same :attr:`_internal_value` as the original color. """ return class_type._from_internal(self._internal_value) @classmethod def _from_internal(cls, value: ManimColorInternal) -> Self: """This method is intended to be overwritten by custom color space classes which are subtypes of :class:`ManimColor`. The method constructs a new object of the given class by transforming the value in the internal format ``[r,g,b,a]`` into a format which the constructor of the custom class can understand. Look at :class:`.HSV` for an example. """ return cls(value) @classmethod def from_rgb( cls, rgb: FloatRGBLike | IntRGBLike, alpha: float = 1.0, ) -> Self: """Create a ManimColor from an RGB array. Automagically decides which type it is: ``int`` or ``float``. .. warning:: Please make sure that your elements are not floats if you want integers. A ``5.0`` will result in the input being interpreted as if it was an RGB float array with the value ``5.0`` and not the integer ``5``. Parameters ---------- rgb Any iterable of 3 floats or 3 integers. alpha Alpha value to be used in the color. Default is 1.0. Returns ------- ManimColor The :class:`ManimColor` which corresponds to the given ``rgb``. """ return cls._from_internal(ManimColor(rgb, alpha)._internal_value) @classmethod def from_rgba(cls, rgba: FloatRGBALike | IntRGBALike) -> Self: """Create a ManimColor from an RGBA Array. Automagically decides which type it is: ``int`` or ``float``. .. warning:: Please make sure that your elements are not floats if you want integers. A ``5.0`` will result in the input being interpreted as if it was a float RGB array with the float ``5.0`` and not the integer ``5``. Parameters ---------- rgba Any iterable of 4 floats or 4 integers. Returns ------- ManimColor The :class:`ManimColor` corresponding to the given ``rgba``. """ return cls(rgba) @classmethod def from_hex(cls, hex_str: str, alpha: float = 1.0) -> Self: """Create a :class:`ManimColor` from a hex string. Parameters ---------- hex_str The hex string to be converted. The allowed prefixes for this string are ``#`` and ``0x``. Currently, this method only supports 6 nibbles, i.e. only strings in the format ``#XXXXXX`` or ``0xXXXXXX``. alpha Alpha value to be used for the hex string. Default is 1.0. Returns ------- ManimColor The :class:`ManimColor` represented by the hex string. """ return cls._from_internal(ManimColor(hex_str, alpha)._internal_value) @classmethod def from_hsv(cls, hsv: FloatHSVLike, alpha: float = 1.0) -> Self: """Create a :class:`ManimColor` from an HSV array. Parameters ---------- hsv Any iterable containing 3 floats from 0.0 to 1.0. alpha The alpha value to be used. Default is 1.0. Returns ------- ManimColor The :class:`ManimColor` with the corresponding RGB values to the given HSV array. """ rgb = colorsys.hsv_to_rgb(*hsv) return cls._from_internal(ManimColor(rgb, alpha)._internal_value) @classmethod def from_hsl(cls, hsl: FloatHSLLike, alpha: float = 1.0) -> Self: """Create a :class:`ManimColor` from an HSL array. Parameters ---------- hsl Any iterable containing 3 floats from 0.0 to 1.0. alpha The alpha value to be used. Default is 1.0. Returns ------- ManimColor The :class:`ManimColor` with the corresponding RGB values to the given HSL array. """ rgb = colorsys.hls_to_rgb(hsl[0], hsl[2], hsl[1]) return cls._from_internal(ManimColor(rgb, alpha)._internal_value) @overload @classmethod def parse( cls, color: ParsableManimColor | None, alpha: float = ..., ) -> Self: ... @overload @classmethod def parse( cls, color: Sequence[ParsableManimColor], alpha: float = ..., ) -> list[Self]: ... @classmethod def parse( cls, color: ParsableManimColor | Sequence[ParsableManimColor] | None, alpha: float = 1.0, ) -> Self | list[Self]: """Parse one color as a :class:`ManimColor` or a sequence of colors as a list of :class:`ManimColor`'s. Parameters ---------- color The color or list of colors to parse. Note that this function can not accept tuples: it will assume that you mean ``Sequence[ParsableManimColor]`` and will return a ``list[ManimColor]``. alpha The alpha (opacity) value to use for the passed color(s). Returns ------- ManimColor | list[ManimColor] Either a list of colors or a singular color, depending on the input. """ def is_sequence( color: ParsableManimColor | Sequence[ParsableManimColor] | None, ) -> TypeIs[Sequence[ParsableManimColor]]: return isinstance(color, (list, tuple)) if is_sequence(color): return [ cls._from_internal(ManimColor(c, alpha)._internal_value) for c in color ] else: return cls._from_internal(ManimColor(color, alpha)._internal_value) @staticmethod def gradient( colors: list[ManimColor], length: int ) -> ManimColor | list[ManimColor]: """This method is currently not implemented. Refer to :func:`color_gradient` for a working implementation for now. """ # TODO: implement proper gradient, research good implementation for this or look at 3b1b implementation raise NotImplementedError def __repr__(self) -> str: return f"{self.__class__.__name__}('{self.to_hex()}')" def __str__(self) -> str: return f"{self.to_hex()}" def __eq__(self, other: object) -> bool: if not isinstance(other, ManimColor): raise TypeError( f"Cannot compare {self.__class__.__name__} with {other.__class__.__name__}" ) are_equal: bool = np.allclose(self._internal_value, other._internal_value) return are_equal def __add__(self, other: int | float | Self) -> Self: if isinstance(other, (int, float)): return self._construct_from_space(self._internal_space + other) else: return self._construct_from_space( self._internal_space + other._internal_space ) def __radd__(self, other: int | float | Self) -> Self: return self + other def __sub__(self, other: int | float | Self) -> Self: if isinstance(other, (int, float)): return self._construct_from_space(self._internal_space - other) else: return self._construct_from_space( self._internal_space - other._internal_space ) def __rsub__(self, other: int | float | Self) -> Self: return self - other def __mul__(self, other: int | float | Self) -> Self: if isinstance(other, (int, float)): return self._construct_from_space(self._internal_space * other) else: return self._construct_from_space( self._internal_space * other._internal_space ) def __rmul__(self, other: int | float | Self) -> Self: return self * other def __truediv__(self, other: int | float | Self) -> Self: if isinstance(other, (int, float)): return self._construct_from_space(self._internal_space / other) else: return self._construct_from_space( self._internal_space / other._internal_space ) def __rtruediv__(self, other: int | float | Self) -> Self: return self / other def __floordiv__(self, other: int | float | Self) -> Self: if isinstance(other, (int, float)): return self._construct_from_space(self._internal_space // other) else: return self._construct_from_space( self._internal_space // other._internal_space ) def __rfloordiv__(self, other: int | float | Self) -> Self: return self // other def __mod__(self, other: int | float | Self) -> Self: if isinstance(other, (int, float)): return self._construct_from_space(self._internal_space % other) else: return self._construct_from_space( self._internal_space % other._internal_space ) def __rmod__(self, other: int | float | Self) -> Self: return self % other def __pow__(self, other: int | float | Self) -> Self: if isinstance(other, (int, float)): return self._construct_from_space(self._internal_space**other) else: return self._construct_from_space( self._internal_space**other._internal_space ) def __rpow__(self, other: int | float | Self) -> Self: return self**other def __invert__(self) -> Self: return self.invert() def __int__(self) -> int: return self.to_integer() def __getitem__(self, index: int) -> float: item: float = self._internal_space[index] return item def __and__(self, other: Self) -> Self: return self._construct_from_space( self._internal_from_integer(self.to_integer() & int(other), 1.0) ) def __or__(self, other: Self) -> Self: return self._construct_from_space( self._internal_from_integer(self.to_integer() | int(other), 1.0) ) def __xor__(self, other: Self) -> Self: return self._construct_from_space( self._internal_from_integer(self.to_integer() ^ int(other), 1.0) ) def __hash__(self) -> int: return hash(self.to_hex(with_alpha=True)) RGBA = ManimColor """RGBA Color Space""" class HSV(ManimColor): """HSV Color Space""" def __init__( self, hsv: FloatHSVLike | FloatHSVALike, alpha: float = 1.0, ) -> None: super().__init__(None) self.__hsv: FloatHSVA if len(hsv) == 3: self.__hsv = np.asarray((*hsv, alpha)) elif len(hsv) == 4: self.__hsv = np.asarray(hsv) else: raise ValueError("HSV Color must be an array of 3 values") @classmethod @override def _from_internal(cls, value: ManimColorInternal) -> Self: hsv = colorsys.rgb_to_hsv(*value[:3]) hsva = [*hsv, value[-1]] return cls(np.array(hsva)) @property def hue(self) -> float: hue: float = self.__hsv[0] return hue @hue.setter def hue(self, hue: float) -> None: self.__hsv[0] = hue @property def saturation(self) -> float: saturation: float = self.__hsv[1] return saturation @saturation.setter def saturation(self, saturation: float) -> None: self.__hsv[1] = saturation @property def value(self) -> float: value: float = self.__hsv[2] return value @value.setter def value(self, value: float) -> None: self.__hsv[2] = value @property def h(self) -> float: hue: float = self.__hsv[0] return hue @h.setter def h(self, hue: float) -> None: self.__hsv[0] = hue @property def s(self) -> float: saturation: float = self.__hsv[1] return saturation @s.setter def s(self, saturation: float) -> None: self.__hsv[1] = saturation @property def v(self) -> float: value: float = self.__hsv[2] return value @v.setter def v(self, value: float) -> None: self.__hsv[2] = value @property def _internal_space(self) -> npt.NDArray: return self.__hsv @property def _internal_value(self) -> ManimColorInternal: """Return the internal value of the current :class:`ManimColor` as an ``[r,g,b,a]`` float array. Returns ------- ManimColorInternal Internal color representation. """ return np.array( [ *colorsys.hsv_to_rgb(self.__hsv[0], self.__hsv[1], self.__hsv[2]), self.__alpha, ], dtype=ManimColorDType, ) @_internal_value.setter def _internal_value(self, value: ManimColorInternal) -> None: """Overwrite the internal color value of this :class:`ManimColor`. Parameters ---------- value The value which will overwrite the current color. Raises ------ TypeError If an invalid array is passed. """ if not isinstance(value, np.ndarray): raise TypeError("Value must be a NumPy array.") if value.shape[0] != 4: raise TypeError("Array must have exactly 4 values.") tmp = colorsys.rgb_to_hsv(value[0], value[1], value[2]) self.__hsv = np.array(tmp) self.__alpha = value[3] ParsableManimColor: TypeAlias = ( ManimColor | int | str | IntRGBLike | FloatRGBLike | IntRGBALike | FloatRGBALike ) """`ParsableManimColor` represents all the types which can be parsed to a :class:`ManimColor` in Manim. """ ManimColorT = TypeVar("ManimColorT", bound=ManimColor) def color_to_rgb(color: ParsableManimColor) -> FloatRGB: """Helper function for use in functional style programming. Refer to :meth:`ManimColor.to_rgb`. Parameters ---------- color A color to convert to an RGB float array. Returns ------- RGB_Array_Float The corresponding RGB float array. """ return ManimColor(color).to_rgb() def color_to_rgba(color: ParsableManimColor, alpha: float = 1.0) -> FloatRGBA: """Helper function for use in functional style programming. Refer to :meth:`ManimColor.to_rgba_with_alpha`. Parameters ---------- color A color to convert to an RGBA float array. alpha An alpha value between 0.0 and 1.0 to be used as opacity in the color. Default is 1.0. Returns ------- RGBA_Array_Float The corresponding RGBA float array. """ return ManimColor(color).to_rgba_with_alpha(alpha) def color_to_int_rgb(color: ParsableManimColor) -> IntRGB: """Helper function for use in functional style programming. Refer to :meth:`ManimColor.to_int_rgb`. Parameters ---------- color A color to convert to an RGB integer array. Returns ------- RGB_Array_Int The corresponding RGB integer array. """ return ManimColor(color).to_int_rgb() def color_to_int_rgba(color: ParsableManimColor, alpha: float = 1.0) -> IntRGBA: """Helper function for use in functional style programming. Refer to :meth:`ManimColor.to_int_rgba_with_alpha`. Parameters ---------- color A color to convert to an RGBA integer array. alpha An alpha value between 0.0 and 1.0 to be used as opacity in the color. Default is 1.0. Returns ------- RGBA_Array_Int The corresponding RGBA integer array. """ return ManimColor(color).to_int_rgba_with_alpha(alpha) def rgb_to_color(rgb: FloatRGBLike | IntRGBLike) -> ManimColor: """Helper function for use in functional style programming. Refer to :meth:`ManimColor.from_rgb`. Parameters ---------- rgb A 3 element iterable. Returns ------- ManimColor A ManimColor with the corresponding value. """ return ManimColor.from_rgb(rgb) def rgba_to_color(rgba: FloatRGBALike | IntRGBALike) -> ManimColor: """Helper function for use in functional style programming. Refer to :meth:`ManimColor.from_rgba`. Parameters ---------- rgba A 4 element iterable. Returns ------- ManimColor A ManimColor with the corresponding value """ return ManimColor.from_rgba(rgba) def rgb_to_hex(rgb: FloatRGBLike | IntRGBLike) -> str: """Helper function for use in functional style programming. Refer to :meth:`ManimColor.from_rgb` and :meth:`ManimColor.to_hex`. Parameters ---------- rgb A 3 element iterable. Returns ------- str A hex representation of the color. """ return ManimColor.from_rgb(rgb).to_hex() def hex_to_rgb(hex_code: str) -> FloatRGB: """Helper function for use in functional style programming. Refer to :meth:`ManimColor.to_rgb`. Parameters ---------- hex_code A hex string representing a color. Returns ------- RGB_Array_Float An RGB array representing the color. """ return ManimColor(hex_code).to_rgb() def invert_color(color: ManimColorT) -> ManimColorT: """Helper function for use in functional style programming. Refer to :meth:`ManimColor.invert` Parameters ---------- color The :class:`ManimColor` to invert. Returns ------- ManimColor The linearly inverted :class:`ManimColor`. """ return color.invert() def color_gradient( reference_colors: Iterable[ParsableManimColor], length_of_output: int, ) -> list[ManimColor]: """Create a list of colors interpolated between the input array of colors with a specific number of colors. Parameters ---------- reference_colors The colors to be interpolated between or spread apart. length_of_output The number of colors that the output should have, ideally more than the input. Returns ------- list[ManimColor] A list of interpolated :class:`ManimColor`'s. """ if length_of_output == 0: return [] parsed_colors = [ManimColor(color) for color in reference_colors] num_colors = len(parsed_colors) if num_colors == 0: raise ValueError("Expected 1 or more reference colors. Got 0 colors.") if num_colors == 1: return parsed_colors * length_of_output rgbs = [color.to_rgb() for color in parsed_colors] alphas = np.linspace(0, (num_colors - 1), length_of_output) floors = alphas.astype("int") alphas_mod1 = alphas % 1 # End edge case alphas_mod1[-1] = 1 floors[-1] = num_colors - 2 return [ rgb_to_color((rgbs[i] * (1 - alpha)) + (rgbs[i + 1] * alpha)) for i, alpha in zip(floors, alphas_mod1, strict=True) ] def interpolate_color( color1: ManimColorT, color2: ManimColorT, alpha: float ) -> ManimColorT: """Standalone function to interpolate two ManimColors and get the result. Refer to :meth:`ManimColor.interpolate`. Parameters ---------- color1 The first :class:`ManimColor`. color2 The second :class:`ManimColor`. alpha The alpha value determining the point of interpolation between the colors. Returns ------- ManimColor The interpolated ManimColor. """ return color1.interpolate(color2, alpha) def average_color(*colors: ParsableManimColor) -> ManimColor: """Determine the average color between the given parameters. .. note:: This operation does not consider the alphas (opacities) of the colors. The generated color has an alpha or opacity of 1.0. Returns ------- ManimColor The average color of the input. """ rgbs = np.array([color_to_rgb(color) for color in colors]) mean_rgb = np.apply_along_axis(np.mean, 0, rgbs) return rgb_to_color(mean_rgb) def random_bright_color() -> ManimColor: """Return a random bright color: a random color averaged with ``WHITE``. .. warning:: This operation is very expensive. Please keep in mind the performance loss. Returns ------- ManimColor A random bright :class:`ManimColor`. """ curr_rgb = color_to_rgb(random_color()) new_rgb = 0.5 * (curr_rgb + np.ones(3)) return ManimColor(new_rgb) def random_color() -> ManimColor: """Return a random :class:`ManimColor`. Returns ------- ManimColor A random :class:`ManimColor`. """ return RandomColorGenerator._random_color() class RandomColorGenerator: """A generator for producing random colors from a given list of Manim colors, optionally in a reproducible sequence using a seed value. When initialized with a specific seed, this class produces a deterministic sequence of :class:`.ManimColor` instances. If no seed is provided, the selection is non-deterministic using Pythonโ€™s global random state. Parameters ---------- seed A seed value to initialize the internal random number generator. If ``None`` (the default), colors are chosen using the global random state. sample_colors A custom list of Manim colors to sample from. Defaults to the full Manim color palette. Examples -------- Without a seed (non-deterministic):: >>> from manim import RandomColorGenerator, ManimColor, RED, GREEN, BLUE >>> rnd = RandomColorGenerator() >>> isinstance(rnd.next(), ManimColor) True With a seed (deterministic sequence):: >>> rnd = RandomColorGenerator(42) >>> rnd.next() ManimColor('#8B4513') >>> rnd.next() ManimColor('#BBBBBB') >>> rnd.next() ManimColor('#BBBBBB') Re-initializing with the same seed gives the same sequence:: >>> rnd2 = RandomColorGenerator(42) >>> rnd2.next() ManimColor('#8B4513') >>> rnd2.next() ManimColor('#BBBBBB') >>> rnd2.next() ManimColor('#BBBBBB') Using a custom color list:: >>> custom_palette = [RED, GREEN, BLUE] >>> rnd_custom = RandomColorGenerator(1, sample_colors=custom_palette) >>> rnd_custom.next() in custom_palette True >>> rnd_custom.next() in custom_palette True Without a seed and custom palette (non-deterministic):: >>> rnd_nodet = RandomColorGenerator(sample_colors=[RED]) >>> rnd_nodet.next() ManimColor('#FC6255') """ _singleton: RandomColorGenerator | None = None def __init__( self, seed: int | None = None, sample_colors: list[ManimColor] | None = None, ) -> None: from manim.utils.color.manim_colors import _all_manim_colors self.choice = random.choice if seed is None else random.Random(seed).choice self.colors = _all_manim_colors if sample_colors is None else sample_colors def next(self) -> ManimColor: """Returns the next color from the configured color list. Returns ------- ManimColor A randomly selected color from the specified color list. Examples -------- Usage:: >>> from manim import RandomColorGenerator, RED >>> rnd = RandomColorGenerator(sample_colors=[RED]) >>> rnd.next() ManimColor('#FC6255') """ return self.choice(self.colors) @classmethod def _random_color(cls) -> ManimColor: """Internal method to generate a random color using the singleton instance of `RandomColorGenerator`. It will be used by proxy method `random_color` publicly available and makes it backwards compatible. Returns ------- ManimColor: A randomly selected color from the configured color list of the singleton instance. """ if cls._singleton is None: cls._singleton = cls() return cls._singleton.next() def get_shaded_rgb( rgb: FloatRGB, point: Point3D, unit_normal_vect: Vector3D, light_source: Point3D, ) -> FloatRGB: """Add light or shadow to the ``rgb`` color of some surface which is located at a given ``point`` in space and facing in the direction of ``unit_normal_vect``, depending on whether the surface is facing a ``light_source`` or away from it. Parameters ---------- rgb An RGB array of floats. point The location of the colored surface. unit_normal_vect The direction in which the colored surface is facing. light_source The location of a light source which might illuminate the surface. Returns ------- RGB_Array_Float The color with added light or shadow, depending on the direction of the colored surface. """ to_sun = normalize(light_source - point) light = 0.5 * np.dot(unit_normal_vect, to_sun) ** 3 if light < 0: light *= 0.5 shaded_rgb: FloatRGB = rgb + light return shaded_rgb __all__ = [ "ManimColor", "ManimColorDType", "ParsableManimColor", "color_to_rgb", "color_to_rgba", "color_to_int_rgb", "color_to_int_rgba", "rgb_to_color", "rgba_to_color", "rgb_to_hex", "hex_to_rgb", "invert_color", "color_gradient", "interpolate_color", "average_color", "random_bright_color", "random_color", "RandomColorGenerator", "get_shaded_rgb", "HSV", "RGBA", ] ManimCommunity-manim-1157b74/manim/utils/color/manim_colors.py000066400000000000000000000155341515024150700244560ustar00rootroot00000000000000"""Colors included in the global name space. These colors form Manim's default color space. .. manim:: ColorsOverview :save_last_frame: :hide_source: import manim.utils.color.manim_colors as Colors class ColorsOverview(Scene): def construct(self): def color_group(color): group = VGroup( *[ Line(ORIGIN, RIGHT * 1.5, stroke_width=35, color=getattr(Colors, name.upper())) for name in subnames(color) ] ).arrange_submobjects(buff=0.4, direction=DOWN) name = Text(color).scale(0.6).next_to(group, UP, buff=0.3) if any(decender in color for decender in "gjpqy"): name.shift(DOWN * 0.08) group.add(name) return group def subnames(name): return [name + "_" + char for char in "abcde"] color_groups = VGroup( *[ color_group(color) for color in [ "blue", "teal", "green", "yellow", "gold", "red", "maroon", "purple", ] ] ).arrange_submobjects(buff=0.2, aligned_edge=DOWN) for line, char in zip(color_groups[0], "abcde"): color_groups.add(Text(char).scale(0.6).next_to(line, LEFT, buff=0.2)) def named_lines_group(length, color_names, labels, align_to_block): colors = [getattr(Colors, color.upper()) for color in color_names] lines = VGroup( *[ Line( ORIGIN, RIGHT * length, stroke_width=55, color=color, ) for color in colors ] ).arrange_submobjects(buff=0.6, direction=DOWN) for line, name, color in zip(lines, labels, colors): line.add(Text(name, color=color.contrasting()).scale(0.6).move_to(line)) lines.next_to(color_groups, DOWN, buff=0.5).align_to( color_groups[align_to_block], LEFT ) return lines other_colors = ( "pink", "light_pink", "orange", "light_brown", "dark_brown", "gray_brown", ) other_lines = named_lines_group( 3.2, other_colors, other_colors, 0, ) gray_lines = named_lines_group( 6.6, ["white"] + subnames("gray") + ["black"], [ "white", "lighter_gray / gray_a", "light_gray / gray_b", "gray / gray_c", "dark_gray / gray_d", "darker_gray / gray_e", "black", ], 2, ) pure_colors = ( "pure_red", "pure_green", "pure_blue", "pure_cyan", "pure_magenta", "pure_yellow", ) pure_lines = named_lines_group( 3.2, pure_colors, pure_colors, 6, ) self.add(color_groups, other_lines, gray_lines, pure_lines) VGroup(*self.mobjects).move_to(ORIGIN) .. automanimcolormodule:: manim.utils.color.manim_colors """ from __future__ import annotations from .core import ManimColor WHITE = ManimColor("#FFFFFF") GRAY_A = ManimColor("#DDDDDD") GREY_A = ManimColor("#DDDDDD") GRAY_B = ManimColor("#BBBBBB") GREY_B = ManimColor("#BBBBBB") GRAY_C = ManimColor("#888888") GREY_C = ManimColor("#888888") GRAY_D = ManimColor("#444444") GREY_D = ManimColor("#444444") GRAY_E = ManimColor("#222222") GREY_E = ManimColor("#222222") BLACK = ManimColor("#000000") LIGHTER_GRAY = ManimColor("#DDDDDD") LIGHTER_GREY = ManimColor("#DDDDDD") LIGHT_GRAY = ManimColor("#BBBBBB") LIGHT_GREY = ManimColor("#BBBBBB") GRAY = ManimColor("#888888") GREY = ManimColor("#888888") DARK_GRAY = ManimColor("#444444") DARK_GREY = ManimColor("#444444") DARKER_GRAY = ManimColor("#222222") DARKER_GREY = ManimColor("#222222") PURE_RED = ManimColor("#FF0000") PURE_GREEN = ManimColor("#00FF00") PURE_BLUE = ManimColor("#0000FF") PURE_CYAN = ManimColor("#00FFFF") PURE_MAGENTA = ManimColor("#FF00FF") PURE_YELLOW = ManimColor("#FFFF00") BLUE_A = ManimColor("#C7E9F1") BLUE_B = ManimColor("#9CDCEB") BLUE_C = ManimColor("#58C4DD") BLUE_D = ManimColor("#29ABCA") BLUE_E = ManimColor("#236B8E") BLUE = ManimColor("#58C4DD") DARK_BLUE = ManimColor("#236B8E") TEAL_A = ManimColor("#ACEAD7") TEAL_B = ManimColor("#76DDC0") TEAL_C = ManimColor("#5CD0B3") TEAL_D = ManimColor("#55C1A7") TEAL_E = ManimColor("#49A88F") TEAL = ManimColor("#5CD0B3") GREEN_A = ManimColor("#C9E2AE") GREEN_B = ManimColor("#A6CF8C") GREEN_C = ManimColor("#83C167") GREEN_D = ManimColor("#77B05D") GREEN_E = ManimColor("#699C52") GREEN = ManimColor("#83C167") YELLOW_A = ManimColor("#FFF1B6") YELLOW_B = ManimColor("#FFEA94") YELLOW_C = ManimColor("#F7D96F") YELLOW_D = ManimColor("#F4D345") YELLOW_E = ManimColor("#E8C11C") YELLOW = ManimColor("#F7D96F") GOLD_A = ManimColor("#F7C797") GOLD_B = ManimColor("#F9B775") GOLD_C = ManimColor("#F0AC5F") GOLD_D = ManimColor("#E1A158") GOLD_E = ManimColor("#C78D46") GOLD = ManimColor("#F0AC5F") RED_A = ManimColor("#F7A1A3") RED_B = ManimColor("#FF8080") RED_C = ManimColor("#FC6255") RED_D = ManimColor("#E65A4C") RED_E = ManimColor("#CF5044") RED = ManimColor("#FC6255") MAROON_A = ManimColor("#ECABC1") MAROON_B = ManimColor("#EC92AB") MAROON_C = ManimColor("#C55F73") MAROON_D = ManimColor("#A24D61") MAROON_E = ManimColor("#94424F") MAROON = ManimColor("#C55F73") PURPLE_A = ManimColor("#CAA3E8") PURPLE_B = ManimColor("#B189C6") PURPLE_C = ManimColor("#9A72AC") PURPLE_D = ManimColor("#715582") PURPLE_E = ManimColor("#644172") PURPLE = ManimColor("#9A72AC") PINK = ManimColor("#D147BD") LIGHT_PINK = ManimColor("#DC75CD") ORANGE = ManimColor("#FF862F") LIGHT_BROWN = ManimColor("#CD853F") DARK_BROWN = ManimColor("#8B4513") GRAY_BROWN = ManimColor("#736357") GREY_BROWN = ManimColor("#736357") # Colors used for Manim Community's logo and banner LOGO_WHITE = ManimColor("#ECE7E2") LOGO_GREEN = ManimColor("#87C2A5") LOGO_BLUE = ManimColor("#525893") LOGO_RED = ManimColor("#E07A5F") LOGO_BLACK = ManimColor("#343434") _all_manim_colors: list[ManimColor] = [ x for x in globals().values() if isinstance(x, ManimColor) ] ManimCommunity-manim-1157b74/manim/utils/commands.py000066400000000000000000000040101515024150700224420ustar00rootroot00000000000000from __future__ import annotations import os from collections.abc import Generator from pathlib import Path from subprocess import run from typing import TypedDict import av from manim.typing import StrOrBytesPath __all__ = [ "capture", "get_video_metadata", "get_dir_layout", ] def capture( command: str | list[str], cwd: StrOrBytesPath | None = None, command_input: str | None = None, ) -> tuple[str, str, int]: p = run( command, cwd=cwd, input=command_input, capture_output=True, text=True, encoding="utf-8", ) out, err = p.stdout, p.stderr return out, err, p.returncode class VideoMetadata(TypedDict): width: int height: int nb_frames: str duration: str avg_frame_rate: str codec_name: str pix_fmt: str def get_video_metadata(path_to_video: str | os.PathLike) -> VideoMetadata: with av.open(str(path_to_video)) as container: stream = container.streams.video[0] ctxt = stream.codec_context rate = stream.average_rate if stream.duration is not None: duration = float(stream.duration * stream.time_base) num_frames = stream.frames else: num_frames = sum(1 for _ in container.decode(video=0)) duration = float(num_frames / stream.base_rate) return { "width": ctxt.width, "height": ctxt.height, "nb_frames": str(num_frames), "duration": f"{duration:.6f}", "avg_frame_rate": f"{rate.numerator}/{rate.denominator}", # Can be a Fraction "codec_name": stream.codec_context.name, "pix_fmt": stream.codec_context.pix_fmt, } def get_dir_layout(dirpath: Path) -> Generator[str, None, None]: """Get list of paths relative to dirpath of all files in dir and subdirs recursively.""" for p in dirpath.iterdir(): if p.is_dir(): yield from get_dir_layout(p) continue yield str(p.relative_to(dirpath)) ManimCommunity-manim-1157b74/manim/utils/config_ops.py000066400000000000000000000055151515024150700230020ustar00rootroot00000000000000"""Utilities that might be useful for configuration dictionaries.""" from __future__ import annotations __all__ = [ "merge_dicts_recursively", "update_dict_recursively", "DictAsObject", ] import itertools as it from typing import Any, Generic, Protocol, cast import numpy.typing as npt from typing_extensions import TypeVar def merge_dicts_recursively(*dicts: dict[Any, Any]) -> dict[Any, Any]: """ Creates a dict whose keyset is the union of all the input dictionaries. The value for each key is based on the first dict in the list with that key. dicts later in the list have higher priority When values are dictionaries, it is applied recursively """ result: dict = {} all_items = it.chain(*(d.items() for d in dicts)) for key, value in all_items: if key in result and isinstance(result[key], dict) and isinstance(value, dict): result[key] = merge_dicts_recursively(result[key], value) else: result[key] = value return result def update_dict_recursively( current_dict: dict[Any, Any], *others: dict[Any, Any] ) -> None: updated_dict = merge_dicts_recursively(current_dict, *others) current_dict.update(updated_dict) # Occasionally convenient in order to write dict.x instead of more laborious # (and less in keeping with all other attr accesses) dict["x"] class DictAsObject: def __init__(self, dictin: dict[str, Any]): self.__dict__ = dictin _Data_T = TypeVar("_Data_T", bound="npt.NDArray[Any]", default="npt.NDArray[Any]") class _HasData(Protocol): data: dict[str, npt.NDArray[Any]] class _Data(Generic[_Data_T]): """Descriptor that allows _Data variables to be grouped and accessed from self.data["attr"] via self.attr. self.data attributes must be arrays. """ def __set_name__(self, obj: _HasData, name: str) -> None: self.name: str = name def __get__(self, obj: _HasData, owner: Any) -> _Data_T: value = cast(_Data_T, obj.data[self.name]) return value def __set__(self, obj: _HasData, array: _Data_T) -> None: obj.data[self.name] = array _Uniforms_T = TypeVar("_Uniforms_T", bound="float | tuple[float, ...]", default=float) class _HasUniforms(Protocol): uniforms: dict[str, float | tuple[float, ...]] class _Uniforms(Generic[_Uniforms_T]): """Descriptor that allows _Uniforms variables to be grouped from self.uniforms["attr"] via self.attr. self.uniforms attributes must be floats or tuples of floats. """ def __set_name__(self, obj: _HasUniforms, name: str) -> None: self.name: str = name def __get__(self, obj: _HasUniforms, owner: Any) -> _Uniforms_T: val = cast(_Uniforms_T, obj.uniforms[self.name]) return val def __set__(self, obj: _HasUniforms, num: _Uniforms_T) -> None: obj.uniforms[self.name] = num ManimCommunity-manim-1157b74/manim/utils/debug.py000066400000000000000000000044671515024150700217470ustar00rootroot00000000000000"""Debugging utilities.""" from __future__ import annotations __all__ = ["print_family", "index_labels"] from typing import Any from manim.mobject.mobject import Mobject from manim.mobject.text.numbers import Integer from manim.utils.color import ManimColor from ..mobject.types.vectorized_mobject import VGroup from .color import BLACK def print_family(mobject: Mobject, n_tabs: int = 0) -> None: """For debugging purposes""" print("\t" * n_tabs, mobject, id(mobject)) for submob in mobject.submobjects: print_family(submob, n_tabs + 1) def index_labels( mobject: Mobject, label_height: float = 0.15, background_stroke_width: float = 5, background_stroke_color: ManimColor = BLACK, **kwargs: Any, ) -> VGroup: r"""Returns a :class:`~.VGroup` of :class:`~.Integer` mobjects that shows the index of each submobject. Useful for working with parts of complicated mobjects. Parameters ---------- mobject The mobject that will have its submobjects labelled. label_height The height of the labels, by default 0.15. background_stroke_width The stroke width of the outline of the labels, by default 5. background_stroke_color The stroke color of the outline of labels. kwargs Additional parameters to be passed into the :class`~.Integer` mobjects used to construct the labels. Examples -------- .. manim:: IndexLabelsExample :save_last_frame: class IndexLabelsExample(Scene): def construct(self): text = MathTex( "\\frac{d}{dx}f(x)g(x)=", "f(x)\\frac{d}{dx}g(x)", "+", "g(x)\\frac{d}{dx}f(x)", ) #index the fist term in the MathTex mob indices = index_labels(text[0]) text[0][1].set_color(PURPLE_B) text[0][8:12].set_color(DARK_BLUE) self.add(text, indices) """ labels = VGroup() for n, submob in enumerate(mobject): label = Integer(n, **kwargs) label.set_stroke( background_stroke_color, background_stroke_width, background=True ) label.height = label_height label.move_to(submob) labels.add(label) return labels ManimCommunity-manim-1157b74/manim/utils/deprecation.py000066400000000000000000000370771515024150700231610ustar00rootroot00000000000000"""Decorators for deprecating classes, functions and function parameters.""" from __future__ import annotations __all__ = ["deprecated", "deprecated_params"] import inspect import logging import re from collections.abc import Callable, Iterable from typing import Any, TypeVar, overload from decorator import decorate, decorator logger = logging.getLogger("manim") def _get_callable_info(callable_: Callable[..., Any], /) -> tuple[str, str]: """Returns type and name of a callable. Parameters ---------- callable The callable Returns ------- Tuple[str, str] The type and name of the callable. Type can can be one of "class", "method" (for functions defined in classes) or "function"). For methods, name is Class.method. """ what = type(callable_).__name__ name = callable_.__qualname__ if what == "function" and "." in name: what = "method" elif what != "function": what = "class" return (what, name) def _deprecation_text_component( since: str | None = None, until: str | None = None, message: str | None = None, ) -> str: """Generates a text component used in deprecation messages. Parameters ---------- since The version or date since deprecation until The version or date until removal of the deprecated callable message The reason for why the callable has been deprecated Returns ------- str The deprecation message text component. """ since = f"since {since} " if since else "" until = ( f"is expected to be removed after {until}" if until else "may be removed in a later version" ) msg = " " + message if message else "" return f"deprecated {since}and {until}.{msg}" # TODO: Use ParamSpec to type decorated functions when Python 3.9 is out of life T = TypeVar("T") @overload def deprecated( func: Callable[..., T], since: str | None = None, until: str | None = None, replacement: str | None = None, message: str | None = "", ) -> Callable[..., T]: ... @overload def deprecated( func: None = None, since: str | None = None, until: str | None = None, replacement: str | None = None, message: str | None = "", ) -> Callable[[Callable[..., T]], Callable[..., T]]: ... def deprecated( func: Callable[..., T] | None = None, since: str | None = None, until: str | None = None, replacement: str | None = None, message: str | None = "", ) -> Callable[..., T] | Callable[[Callable[..., T]], Callable[..., T]]: """Decorator to mark a callable as deprecated. The decorated callable will cause a warning when used. The docstring of the deprecated callable is adjusted to indicate that this callable is deprecated. Parameters ---------- func The function to be decorated. Should not be set by the user. since The version or date since deprecation. until The version or date until removal of the deprecated callable. replacement The identifier of the callable replacing the deprecated one. message The reason for why the callable has been deprecated. Returns ------- Callable The decorated callable. Examples -------- Basic usage:: from manim.utils.deprecation import deprecated @deprecated def foo(**kwargs): pass @deprecated class Bar: def __init__(self): pass @deprecated def baz(self): pass foo() # WARNING The function foo has been deprecated and may be removed in a later version. a = Bar() # WARNING The class Bar has been deprecated and may be removed in a later version. a.baz() # WARNING The method Bar.baz has been deprecated and may be removed in a later version. You can specify additional information for a more precise warning:: from manim.utils.deprecation import deprecated @deprecated( since="v0.2", until="v0.4", replacement="bar", message="It is cooler." ) def foo(): pass foo() # WARNING The function foo has been deprecated since v0.2 and is expected to be removed after v0.4. Use bar instead. It is cooler. You may also use dates instead of versions:: from manim.utils.deprecation import deprecated @deprecated(since="05/01/2021", until="06/01/2021") def foo(): pass foo() # WARNING The function foo has been deprecated since 05/01/2021 and is expected to be removed after 06/01/2021. """ # If used as factory: if func is None: return lambda func: deprecated(func, since, until, replacement, message) what, name = _get_callable_info(func) def warning_msg(for_docs: bool = False) -> str: """Generate the deprecation warning message. Parameters ---------- for_docs Whether or not to format the message for use in documentation. Returns ------- str The deprecation message. """ msg = message if replacement is not None: repl = replacement if for_docs: mapper = {"class": "class", "method": "meth", "function": "func"} repl = f":{mapper[what]}:`~.{replacement}`" msg = f"Use {repl} instead.{' ' + message if message else ''}" deprecated = _deprecation_text_component(since, until, msg) return f"The {what} {name} has been {deprecated}" def deprecate_docs(func: Callable) -> None: """Adjust docstring to indicate the deprecation. Parameters ---------- func The callable whose docstring to adjust. """ warning = warning_msg(True) doc_string = func.__doc__ or "" func.__doc__ = f"{doc_string}\n\n.. attention:: Deprecated\n {warning}" def deprecate(func: Callable[..., T], *args: Any, **kwargs: Any) -> T: """The actual decorator used to extend the callables behavior. Logs a warning message. Parameters ---------- func The callable to decorate. args The arguments passed to the given callable. kwargs The keyword arguments passed to the given callable. Returns ------- Any The return value of the given callable when being passed the given arguments. """ logger.warning(warning_msg()) return func(*args, **kwargs) if type(func).__name__ != "function": deprecate_docs(func) func.__init__ = decorate(func.__init__, deprecate) return func func = decorate(func, deprecate) deprecate_docs(func) return func def deprecated_params( params: str | Iterable[str] | None = None, since: str | None = None, until: str | None = None, message: str = "", redirections: None | (Iterable[tuple[str, str] | Callable[..., dict[str, Any]]]) = None, ) -> Callable[..., T]: """Decorator to mark parameters of a callable as deprecated. It can also be used to automatically redirect deprecated parameter values to their replacements. Parameters ---------- params The parameters to be deprecated. Can consist of: * An iterable of strings, with each element representing a parameter to deprecate * A single string, with parameter names separated by commas or spaces. since The version or date since deprecation. until The version or date until removal of the deprecated callable. message The reason for why the callable has been deprecated. redirections A list of parameter redirections. Each redirection can be one of the following: * A tuple of two strings. The first string defines the name of the deprecated parameter; the second string defines the name of the parameter to redirect to, when attempting to use the first string. * A function performing the mapping operation. The parameter names of the function determine which parameters are used as input. The function must return a dictionary which contains the redirected arguments. Redirected parameters are also implicitly deprecated. Returns ------- Callable The decorated callable. Raises ------ ValueError If no parameters are defined (neither explicitly nor implicitly). ValueError If defined parameters are invalid python identifiers. Examples -------- Basic usage:: from manim.utils.deprecation import deprecated_params @deprecated_params(params="a, b, c") def foo(**kwargs): pass foo(x=2, y=3, z=4) # No warning foo(a=2, b=3, z=4) # WARNING The parameters a and b of method foo have been deprecated and may be removed in a later version. You can also specify additional information for a more precise warning:: from manim.utils.deprecation import deprecated_params @deprecated_params( params="a, b, c", since="v0.2", until="v0.4", message="The letters x, y, z are cooler.", ) def foo(**kwargs): pass foo(a=2) # WARNING The parameter a of method foo has been deprecated since v0.2 and is expected to be removed after v0.4. The letters x, y, z are cooler. Basic parameter redirection:: from manim.utils.deprecation import deprecated_params @deprecated_params( redirections=[ # Two ways to redirect one parameter to another: ("old_param", "new_param"), lambda old_param2: {"new_param22": old_param2}, ] ) def foo(**kwargs): return kwargs foo(x=1, old_param=2) # WARNING The parameter old_param of method foo has been deprecated and may be removed in a later version. # returns {"x": 1, "new_param": 2} Redirecting using a calculated value:: from manim.utils.deprecation import deprecated_params @deprecated_params( redirections=[lambda runtime_in_ms: {"run_time": runtime_in_ms / 1000}] ) def foo(**kwargs): return kwargs foo(runtime_in_ms=500) # WARNING The parameter runtime_in_ms of method foo has been deprecated and may be removed in a later version. # returns {"run_time": 0.5} Redirecting multiple parameter values to one:: from manim.utils.deprecation import deprecated_params @deprecated_params( redirections=[lambda buff_x=1, buff_y=1: {"buff": (buff_x, buff_y)}] ) def foo(**kwargs): return kwargs foo(buff_x=2) # WARNING The parameter buff_x of method foo has been deprecated and may be removed in a later version. # returns {"buff": (2, 1)} Redirect one parameter to multiple:: from manim.utils.deprecation import deprecated_params @deprecated_params( redirections=[ lambda buff=1: {"buff_x": buff[0], "buff_y": buff[1]} if isinstance(buff, tuple) else {"buff_x": buff, "buff_y": buff} ] ) def foo(**kwargs): return kwargs foo(buff=0) # WARNING The parameter buff of method foo has been deprecated and may be removed in a later version. # returns {"buff_x": 0, buff_y: 0} foo(buff=(1, 2)) # WARNING The parameter buff of method foo has been deprecated and may be removed in a later version. # returns {"buff_x": 1, buff_y: 2} """ # Check if decorator is used without parenthesis if callable(params): raise ValueError("deprecate_parameters requires arguments to be specified.") if params is None: params = [] # Construct params list params = re.split(r"[,\s]+", params) if isinstance(params, str) else list(params) # Add params which are only implicitly given via redirections if redirections is None: redirections = [] for redirector in redirections: if isinstance(redirector, tuple): params.append(redirector[0]) else: params.extend(list(inspect.signature(redirector).parameters)) # Keep ordering of params so that warning message is consistently the same # This will also help pass unit testing params = list(dict.fromkeys(params)) # Make sure params only contains valid identifiers identifier = re.compile(r"^[^\d\W]\w*\Z", re.UNICODE) if not all(re.match(identifier, param) for param in params): raise ValueError("Given parameter values are invalid.") redirections = list(redirections) def warning_msg(func: Callable[..., T], used: list[str]) -> str: """Generate the deprecation warning message. Parameters ---------- func The callable with deprecated parameters. used The list of deprecated parameters used in a call. Returns ------- str The deprecation message. """ what, name = _get_callable_info(func) plural = len(used) > 1 parameter_s = "s" if plural else "" used_ = ", ".join(used[:-1]) + " and " + used[-1] if plural else used[0] has_have_been = "have been" if plural else "has been" deprecated = _deprecation_text_component(since, until, message) return f"The parameter{parameter_s} {used_} of {what} {name} {has_have_been} {deprecated}" def redirect_params(kwargs: dict[str, Any], used: list[str]) -> None: """Adjust the keyword arguments as defined by the redirections. Parameters ---------- kwargs The keyword argument dictionary to be updated. used The list of deprecated parameters used in a call. """ for redirector in redirections: if isinstance(redirector, tuple): old_param, new_param = redirector if old_param in used: kwargs[new_param] = kwargs.pop(old_param) else: redirector_params = list(inspect.signature(redirector).parameters) redirector_args = {} for redirector_param in redirector_params: if redirector_param in used: redirector_args[redirector_param] = kwargs.pop(redirector_param) if len(redirector_args) > 0: kwargs.update(redirector(**redirector_args)) def deprecate_params(func: Callable[..., T], *args: Any, **kwargs: Any) -> T: """The actual decorator function used to extend the callables behavior. Logs a warning message when a deprecated parameter is used and redirects it if specified. Parameters ---------- func The callable to decorate. args The arguments passed to the given callable. kwargs The keyword arguments passed to the given callable. Returns ------- Any The return value of the given callable when being passed the given arguments. """ used = [param for param in params if param in kwargs] if len(used) > 0: logger.warning(warning_msg(func, used)) redirect_params(kwargs, used) return func(*args, **kwargs) return decorator(deprecate_params) # type: ignore[return-value] ManimCommunity-manim-1157b74/manim/utils/docbuild/000077500000000000000000000000001515024150700220615ustar00rootroot00000000000000ManimCommunity-manim-1157b74/manim/utils/docbuild/__init__.py000066400000000000000000000006651515024150700242010ustar00rootroot00000000000000"""Utilities for building the Manim documentation. For more information about the Manim documentation building, see: - :doc:`/contributing/development`, specifically the ``Documentation`` bullet point under :ref:`polishing-changes-and-submitting-a-pull-request` - :doc:`/contributing/docs` .. autosummary:: :toctree: ../reference autoaliasattr_directive autocolor_directive manim_directive module_parsing """ ManimCommunity-manim-1157b74/manim/utils/docbuild/autoaliasattr_directive.py000066400000000000000000000222071515024150700273510ustar00rootroot00000000000000"""A directive for documenting type aliases and other module-level attributes.""" from __future__ import annotations from typing import TYPE_CHECKING from docutils import nodes from docutils.parsers.rst import Directive from docutils.statemachine import StringList from manim.utils.docbuild.module_parsing import parse_module_attributes if TYPE_CHECKING: from sphinx.application import Sphinx __all__ = ["AliasAttrDocumenter"] ALIAS_DOCS_DICT, DATA_DICT, TYPEVAR_DICT = parse_module_attributes() ALIAS_LIST = [ alias_name for module_dict in ALIAS_DOCS_DICT.values() for category_dict in module_dict.values() for alias_name in category_dict ] def smart_replace(base: str, alias: str, substitution: str) -> str: """Auxiliary function for substituting type aliases into a base string, when there are overlaps between the aliases themselves. Parameters ---------- base The string in which the type aliases will be located and replaced. alias The substring to be substituted. substitution The string which will replace every occurrence of ``alias``. Returns ------- str The new string after the alias substitution. """ occurrences = [] len_alias = len(alias) len_base = len(base) def condition(char: str) -> bool: return not char.isalnum() and char != "_" start = 0 i = 0 while True: i = base.find(alias, start) if i == -1: break if (i == 0 or condition(base[i - 1])) and ( i + len_alias == len_base or condition(base[i + len_alias]) ): occurrences.append(i) start = i + len_alias for o in occurrences[::-1]: base = base[:o] + substitution + base[o + len_alias :] return base def setup(app: Sphinx) -> None: app.add_directive("autoaliasattr", AliasAttrDocumenter) class AliasAttrDocumenter(Directive): """Directive which replaces Sphinx's Autosummary for module-level attributes: instead, it manually crafts a new "Type Aliases" section, where all the module-level attributes which are explicitly annotated as :class:`TypeAlias` are considered as such, for their use all around the Manim docs. These type aliases are separated from the "regular" module-level attributes, which get their traditional "Module Attributes" section autogenerated with Sphinx's Autosummary under "Type Aliases". See ``docs/source/_templates/autosummary/module.rst`` to watch this directive in action. See :func:`~.parse_module_attributes` for more information on how the modules are parsed to obtain the :class:`TypeAlias` information and separate it from the other attributes. """ objtype = "autoaliasattr" required_arguments = 1 has_content = True def run(self) -> list[nodes.Element]: module_name = self.arguments[0] # not present in the keys of the DICTs module_name = module_name.removeprefix("manim.") module_alias_dict = ALIAS_DOCS_DICT.get(module_name, None) module_attrs_list = DATA_DICT.get(module_name, None) module_typevars = TYPEVAR_DICT.get(module_name, None) content = nodes.container() # Add "Type Aliases" section if module_alias_dict is not None: module_alias_section = nodes.section(ids=[f"{module_name}.alias"]) content += module_alias_section # Use a rubric (title-like), just like in `module.rst` module_alias_section += nodes.rubric(text="Type Aliases") # category_name: str # category_dict: AliasCategoryDict = dict[str, AliasInfo] for category_name, category_dict in module_alias_dict.items(): category_section = nodes.section( ids=[category_name.lower().replace(" ", "_")] ) module_alias_section += category_section # category_name can be possibly "" for uncategorized aliases if category_name: category_section += nodes.title(text=category_name) category_alias_container = nodes.container() category_section += category_alias_container # alias_name: str # alias_info: AliasInfo = dict[str, str] # Contains "definition": str # Can possibly contain "doc": str for alias_name, alias_info in category_dict.items(): # Replace all occurrences of type aliases in the # definition for automatic cross-referencing! alias_def = alias_info["definition"] for A in ALIAS_LIST: alias_def = smart_replace(alias_def, A, f":class:`~.{A}`") # Using the `.. class::` directive is CRUCIAL, since # function/method parameters are always annotated via # classes - therefore Sphinx expects a class unparsed = StringList( [ f".. class:: {alias_name}", "", " .. parsed-literal::", "", f" {alias_def}", "", ] ) if "doc" in alias_info: # Replace all occurrences of type aliases in # the docs for automatic cross-referencing! alias_doc = alias_info["doc"] for A in ALIAS_LIST: alias_doc = alias_doc.replace(f"`{A}`", f":class:`~.{A}`") # also hyperlink the TypeVars from that module if module_typevars is not None: for T in module_typevars: alias_doc = alias_doc.replace(f"`{T}`", f":class:`{T}`") # Add all the lines with 4 spaces behind, to consider all the # documentation as a paragraph INSIDE the `.. class::` block doc_lines = alias_doc.split("\n") unparsed.extend( StringList([f" {line}" for line in doc_lines]) ) # Parse the reST text into a fresh container # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest alias_container = nodes.container() self.state.nested_parse(unparsed, 0, alias_container) category_alias_container += alias_container # then add the module TypeVars section if module_typevars is not None: module_typevars_section = nodes.section(ids=[f"{module_name}.typevars"]) content += module_typevars_section # Use a rubric (title-like), just like in `module.rst` module_typevars_section += nodes.rubric(text="TypeVar's") # name: str # definition: TypeVarDict = dict[str, str] for name, definition in module_typevars.items(): # Using the `.. class::` directive is CRUCIAL, since # function/method parameters are always annotated via # classes - therefore Sphinx expects a class unparsed = StringList( [ f".. class:: {name}", "", " .. parsed-literal::", "", f" {definition}", "", ] ) # Parse the reST text into a fresh container # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest typevar_container = nodes.container() self.state.nested_parse(unparsed, 0, typevar_container) module_typevars_section += typevar_container # Then, add the traditional "Module Attributes" section if module_attrs_list is not None: module_attrs_section = nodes.section(ids=[f"{module_name}.data"]) content += module_attrs_section # Use the same rubric (title-like) as in `module.rst` module_attrs_section += nodes.rubric(text="Module Attributes") # Let Sphinx Autosummary do its thing as always # Add all the attribute names with 4 spaces behind, so that # they're considered as INSIDE the `.. autosummary::` block unparsed = StringList( [ ".. autosummary::", *(f" {attr}" for attr in module_attrs_list), ] ) # Parse the reST text into a fresh container # https://www.sphinx-doc.org/en/master/extdev/markupapi.html#parsing-directive-content-as-rest data_container = nodes.container() self.state.nested_parse(unparsed, 0, data_container) module_attrs_section += data_container return [content] ManimCommunity-manim-1157b74/manim/utils/docbuild/autocolor_directive.py000066400000000000000000000065321515024150700265060ustar00rootroot00000000000000"""A directive for documenting colors in Manim.""" from __future__ import annotations import inspect from typing import TYPE_CHECKING from docutils import nodes from docutils.parsers.rst import Directive from manim import ManimColor if TYPE_CHECKING: from sphinx.application import Sphinx __all__ = ["ManimColorModuleDocumenter"] def setup(app: Sphinx) -> None: app.add_directive("automanimcolormodule", ManimColorModuleDocumenter) class ManimColorModuleDocumenter(Directive): objtype = "automanimcolormodule" required_arguments = 1 has_content = True def add_directive_header(self, sig: str) -> None: # TODO: The Directive class has no method named # add_directive_header. super().add_directive_header(sig) # type: ignore[misc] def run(self) -> list[nodes.Element]: module_name = self.arguments[0] try: import importlib module = importlib.import_module(module_name) except ImportError: return [ nodes.error( None, # type: ignore[arg-type] nodes.paragraph(text=f"Failed to import module '{module_name}'"), ) ] # Number of Colors displayed in one row num_color_cols = 2 table = nodes.table(align="center") tgroup = nodes.tgroup(cols=num_color_cols * 2) table += tgroup for _ in range(num_color_cols * 2): tgroup += nodes.colspec(colwidth=1) # Create header rows for the table thead = nodes.thead() header_row = nodes.row() for _ in range(num_color_cols): header_col1 = nodes.paragraph(text="Color Name") header_col2 = nodes.paragraph(text="RGB Hex Code") header_row += nodes.entry("", header_col1) header_row += nodes.entry("", header_col2) thead += header_row tgroup += thead color_elements = [] for member_name, member_obj in inspect.getmembers(module): if isinstance(member_obj, ManimColor): r, g, b = member_obj.to_rgb() luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b # Choose the font color based on the background luminance font_color = "black" if luminance > 0.5 else "white" color_elements.append((member_name, member_obj.to_hex(), font_color)) tbody = nodes.tbody() for base_i in range(0, len(color_elements), num_color_cols): row = nodes.row() for idx in range(base_i, base_i + num_color_cols): if idx < len(color_elements): member_name, hex_code, font_color = color_elements[idx] col1 = nodes.literal(text=member_name) col2 = nodes.raw( "", f'
{hex_code}
', format="html", ) else: col1 = nodes.literal(text="") col2 = nodes.raw("", "", format="html") row += nodes.entry("", col1) row += nodes.entry("", col2) tbody += row tgroup += tbody return [table] ManimCommunity-manim-1157b74/manim/utils/docbuild/manim_directive.py000066400000000000000000000347221515024150700256020ustar00rootroot00000000000000r""" A directive for including Manim videos in a Sphinx document =========================================================== When rendering the HTML documentation, the ``.. manim::`` directive implemented here allows to include rendered videos. Its basic usage that allows processing **inline content** looks as follows:: .. manim:: MyScene class MyScene(Scene): def construct(self): ... It is required to pass the name of the class representing the scene to be rendered to the directive. As a second application, the directive can also be used to render scenes that are defined within doctests, for example:: .. manim:: DirectiveDoctestExample :ref_classes: Dot >>> from manim import Create, Dot, RED, Scene >>> dot = Dot(color=RED) >>> dot.color ManimColor('#FC6255') >>> class DirectiveDoctestExample(Scene): ... def construct(self): ... self.play(Create(dot)) Options ------- Options can be passed as follows:: .. manim:: :