From 518f7d1bf5c7fef6f0e0b4395080194522610ca9 Mon Sep 17 00:00:00 2001 From: rubberhead Date: Sat, 17 Feb 2024 22:39:46 +0000 Subject: [PATCH] Added ftrace visualization code --- .../visualizer/.gitignore | 160 +++++ .../visualizer/README.md | 0 .../visualizer/ftrace2pyplot/arguments.py | 28 + .../visualizer/ftrace2pyplot/main.py | 119 ++++ .../visualizer/out-95p.pdf | Bin 0 -> 29988 bytes .../visualizer/out-log.pdf | Bin 0 -> 28952 bytes .../visualizer/out.pdf | Bin 0 -> 29988 bytes .../visualizer/poetry.lock | 634 ++++++++++++++++++ .../visualizer/pyproject.toml | 17 + .../visualizer/tests/__init__.py | 0 tex/misc/background_draft.bib | 33 + tex/misc/background_draft.pdf | Bin 167712 -> 169244 bytes tex/misc/background_draft.tex | 120 ++-- tex/misc/discussion_draft.tex | 0 14 files changed, 1070 insertions(+), 41 deletions(-) create mode 100644 src/aarch64-linux-flush-dcache/visualizer/.gitignore create mode 100644 src/aarch64-linux-flush-dcache/visualizer/README.md create mode 100644 src/aarch64-linux-flush-dcache/visualizer/ftrace2pyplot/arguments.py create mode 100644 src/aarch64-linux-flush-dcache/visualizer/ftrace2pyplot/main.py create mode 100644 src/aarch64-linux-flush-dcache/visualizer/out-95p.pdf create mode 100644 src/aarch64-linux-flush-dcache/visualizer/out-log.pdf create mode 100644 src/aarch64-linux-flush-dcache/visualizer/out.pdf create mode 100644 src/aarch64-linux-flush-dcache/visualizer/poetry.lock create mode 100644 src/aarch64-linux-flush-dcache/visualizer/pyproject.toml create mode 100644 src/aarch64-linux-flush-dcache/visualizer/tests/__init__.py create mode 100644 tex/misc/discussion_draft.tex diff --git a/src/aarch64-linux-flush-dcache/visualizer/.gitignore b/src/aarch64-linux-flush-dcache/visualizer/.gitignore new file mode 100644 index 0000000..68bc17f --- /dev/null +++ b/src/aarch64-linux-flush-dcache/visualizer/.gitignore @@ -0,0 +1,160 @@ +# 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/ +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/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .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 + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/src/aarch64-linux-flush-dcache/visualizer/README.md b/src/aarch64-linux-flush-dcache/visualizer/README.md new file mode 100644 index 0000000..e69de29 diff --git a/src/aarch64-linux-flush-dcache/visualizer/ftrace2pyplot/arguments.py b/src/aarch64-linux-flush-dcache/visualizer/ftrace2pyplot/arguments.py new file mode 100644 index 0000000..bc318b5 --- /dev/null +++ b/src/aarch64-linux-flush-dcache/visualizer/ftrace2pyplot/arguments.py @@ -0,0 +1,28 @@ +import argparse + +parser = argparse.ArgumentParser( + prog="ftrace2pyplot", + description="Personal use. Visualize ftrace function_graph statistics." +) + +parser.add_argument( + "directory", type=str, help="ftrace-cmd output .dat directory" +) + +parser.add_argument( + "-g", "--glob", type=bool, help="infer given directory as glob pattern" +) + +parser.add_argument( + "-p", "--percentile", type=float, help="clip to in both ends", + default=1. +) + +parser.add_argument( + "-l", "--use-log-scale", type=bool, help="use logarithmic scale (log10)", + default=False +) + +parser.add_argument( + "--output", "-o", type=str, help="output file", default="out.pdf" +) \ No newline at end of file diff --git a/src/aarch64-linux-flush-dcache/visualizer/ftrace2pyplot/main.py b/src/aarch64-linux-flush-dcache/visualizer/ftrace2pyplot/main.py new file mode 100644 index 0000000..a143b86 --- /dev/null +++ b/src/aarch64-linux-flush-dcache/visualizer/ftrace2pyplot/main.py @@ -0,0 +1,119 @@ +from os import path +from argparse import Namespace +import glob +from typing import List, Tuple, Union +import re + +import trappy +import pandas as pd +import numpy as np +import seaborn as sns +import matplotlib.pyplot as plt + +from arguments import parser + +def parse_basename_into_byte_count(basename: str) -> int: + ret: int = -1 + + regex = re.compile(r"(?P[0-9]+)(?P[kmgKMG])") + pat = regex.search(basename) + if pat is not None: + size = int(pat.group("size")) + match pat.group("unit"): + case "K": ret = size + case "M": ret = size * 1024 + case "G": ret = size * 1024 * 1024 + case _: + raise Exception("Unexpected unit \"{}\".".format(pat.group("unit"))) + + return ret + +def clip_to( + dataset: Union[pd.Series, pd.DataFrame], + percentile: float, + axis: int = None +) -> Union[pd.Series, pd.DataFrame]: + assert(0 <= percentile <= 1) + if percentile == .0: + return dataset + + lower_bound = dataset.quantile(1 - percentile) + upper_bound = dataset.quantile(percentile) + + if isinstance(dataset, pd.DataFrame): + clipped = dataset.clip(lower=lower_bound, upper=upper_bound, axis=axis) + else: + clipped = dataset.clip(lower=lower_bound, upper=upper_bound) + + return clipped + +def parse_function_graph_ftrace(trace_fpath: str): + trace = trappy.FTrace(trace_fpath) + fngraph_df: pd.DataFrame = trace.funcgraph_exit.data_frame + assert fngraph_df is not None + + # Sieve `__dcache_clean_poc` entries + # Notably, the long ones are mostly preempted by e.g., softirq (rcu, etc.) + # I should prob. identify them but whatever + # Other long ones that are NOT preempted may be due to QEMU process + # scheduling on host, not sure + fngraph_df = fngraph_df.loc[fngraph_df["func"] == "__dcache_clean_poc"] + + # Compute runtime of function + fngraph_df.loc[:, "rettime"] = (fngraph_df["rettime"] + .astype(str) + .apply(lambda x: int(x, base=16))) + fngraph_df.loc[:, "calltime"] = (fngraph_df["calltime"] + .astype(str) + .apply(lambda x: int(x, base=16))) + fngraph_df = fngraph_df.assign( + runtime = fngraph_df["rettime"] - fngraph_df["calltime"]) + + print("Shape: {}; head: \n{}".format(fngraph_df.shape, fngraph_df.head())) + return fngraph_df + +def main(args: Namespace): + # Load dataset -- each should have good 1000 entries + ftrace_dat_paths: List[str] = [] + ftrace_dfs: List[Tuple(int, pd.DataFrame)] = [] + if args.glob: + ftrace_dat_paths = glob.glob(args.directory) + else: + ftrace_dat_paths = glob.glob(args.directory + "/*.dat") + + for ftrace_dat_path in ftrace_dat_paths: + print("Loading \"{}\"...".format(ftrace_dat_path)) + fngraph_df = parse_function_graph_ftrace(ftrace_dat_path) + size_in_kb = parse_basename_into_byte_count( + str(path.basename(ftrace_dat_path).split(".")[:-1])) + ftrace_dfs.append((size_in_kb, fngraph_df)) + + ftrace_dfs.sort(key=lambda tp: tp[0]) + + # Now we have filename-df pairs, combine into single df + series = [ + clip_to( + pd.to_numeric(df.reset_index()["runtime"]).apply(lambda x: x / 1e3), + args.percentile + ) for _, df in ftrace_dfs + ] + indices = [size for size, _ in ftrace_dfs] + plot_df = pd.concat(series, axis=1, keys=indices) # In long-form + print("Plot shape: {}; head: \n{}" + .format(plot_df.shape, plot_df.head())) + + # plot violin plot + fig, ax = plt.subplots(figsize=(12, 8)) + sns.violinplot( + data=plot_df, orient="h", fill=False, log_scale=args.use_log_scale) + ax.set_xlabel("Runtime (μs)") + ax.set_ylabel("Write amount (KiB)") + ax.set_title("Percentile: {}{}" + .format(args.percentile, ", log scale" if args.use_log_scale else "")) + fig.savefig(args.output) + plt.show() + +if __name__ == "__main__": + args = parser.parse_args() + sns.set_theme(context="talk", style="ticks", rc={"axes.grid": True}) + main(args) diff --git a/src/aarch64-linux-flush-dcache/visualizer/out-95p.pdf b/src/aarch64-linux-flush-dcache/visualizer/out-95p.pdf new file mode 100644 index 0000000000000000000000000000000000000000..733f4f30ea389ee30c736cb62836410ac647c8f8 GIT binary patch literal 29988 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 O4Sp~I0ky;Gu>S!;_8qnW literal 0 HcmV?d00001 diff --git a/src/aarch64-linux-flush-dcache/visualizer/out-log.pdf b/src/aarch64-linux-flush-dcache/visualizer/out-log.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b6845691cc946c2204aba36a2fc1ddbc401bc024 GIT binary patch literal 28952 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 literal 0 HcmV?d00001 diff --git a/src/aarch64-linux-flush-dcache/visualizer/out.pdf b/src/aarch64-linux-flush-dcache/visualizer/out.pdf new file mode 100644 index 0000000000000000000000000000000000000000..55c947c36dbff99b38a32ef2e00c9095b5e72e7a GIT binary patch literal 29988 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 OY4C#y2&f%ahy4$2w;jL$ literal 0 HcmV?d00001 diff --git a/src/aarch64-linux-flush-dcache/visualizer/poetry.lock b/src/aarch64-linux-flush-dcache/visualizer/poetry.lock new file mode 100644 index 0000000..ce940cf --- /dev/null +++ b/src/aarch64-linux-flush-dcache/visualizer/poetry.lock @@ -0,0 +1,634 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "contourpy" +version = "1.2.0" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.9" +files = [ + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, +] + +[package.dependencies] +numpy = ">=1.20,<2.0" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] + +[[package]] +name = "cycler" +version = "0.12.1" +description = "Composable style cycles" +optional = false +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "fonttools" +version = "4.48.1" +description = "Tools to manipulate font files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fonttools-4.48.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:702ae93058c81f46461dc4b2c79f11d3c3d8fd7296eaf8f75b4ba5bbf813cd5f"}, + {file = "fonttools-4.48.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97f0a49fa6aa2d6205c6f72f4f98b74ef4b9bfdcb06fd78e6fe6c7af4989b63e"}, + {file = "fonttools-4.48.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3260db55f1843e57115256e91247ad9f68cb02a434b51262fe0019e95a98738"}, + {file = "fonttools-4.48.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e740a7602c2bb71e1091269b5dbe89549749a8817dc294b34628ffd8b2bf7124"}, + {file = "fonttools-4.48.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4108b1d247953dd7c90ec8f457a2dec5fceb373485973cc852b14200118a51ee"}, + {file = "fonttools-4.48.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56339ec557f0c342bddd7c175f5e41c45fc21282bee58a86bd9aa322bec715f2"}, + {file = "fonttools-4.48.1-cp310-cp310-win32.whl", hash = "sha256:bff5b38d0e76eb18e0b8abbf35d384e60b3371be92f7be36128ee3e67483b3ec"}, + {file = "fonttools-4.48.1-cp310-cp310-win_amd64.whl", hash = "sha256:f7449493886da6a17472004d3818cc050ba3f4a0aa03fb47972e4fa5578e6703"}, + {file = "fonttools-4.48.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:18b35fd1a850ed7233a99bbd6774485271756f717dac8b594958224b54118b61"}, + {file = "fonttools-4.48.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cad5cfd044ea2e306fda44482b3dd32ee47830fa82dfa4679374b41baa294f5f"}, + {file = "fonttools-4.48.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f30e605c7565d0da6f0aec75a30ec372072d016957cd8fc4469721a36ea59b7"}, + {file = "fonttools-4.48.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aee76fd81a8571c68841d6ef0da750d5ff08ff2c5f025576473016f16ac3bcf7"}, + {file = "fonttools-4.48.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5057ade278e67923000041e2b195c9ea53e87f227690d499b6a4edd3702f7f01"}, + {file = "fonttools-4.48.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b10633aafc5932995a391ec07eba5e79f52af0003a1735b2306b3dab8a056d48"}, + {file = "fonttools-4.48.1-cp311-cp311-win32.whl", hash = "sha256:0d533f89819f9b3ee2dbedf0fed3825c425850e32bdda24c558563c71be0064e"}, + {file = "fonttools-4.48.1-cp311-cp311-win_amd64.whl", hash = "sha256:d20588466367f05025bb1efdf4e5d498ca6d14bde07b6928b79199c588800f0a"}, + {file = "fonttools-4.48.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0a2417547462e468edf35b32e3dd06a6215ac26aa6316b41e03b8eeaf9f079ea"}, + {file = "fonttools-4.48.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cf5a0cd974f85a80b74785db2d5c3c1fd6cc09a2ba3c837359b2b5da629ee1b0"}, + {file = "fonttools-4.48.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0452fcbfbce752ba596737a7c5ec5cf76bc5f83847ce1781f4f90eab14ece252"}, + {file = "fonttools-4.48.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578c00f93868f64a4102ecc5aa600a03b49162c654676c3fadc33de2ddb88a81"}, + {file = "fonttools-4.48.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:63dc592a16cd08388d8c4c7502b59ac74190b23e16dfc863c69fe1ea74605b68"}, + {file = "fonttools-4.48.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9b58638d8a85e3a1b32ec0a91d9f8171a877b4b81c408d4cb3257d0dee63e092"}, + {file = "fonttools-4.48.1-cp312-cp312-win32.whl", hash = "sha256:d10979ef14a8beaaa32f613bb698743f7241d92f437a3b5e32356dfb9769c65d"}, + {file = "fonttools-4.48.1-cp312-cp312-win_amd64.whl", hash = "sha256:cdfd7557d1bd294a200bd211aa665ca3b02998dcc18f8211a5532da5b8fad5c5"}, + {file = "fonttools-4.48.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3cdb9a92521b81bf717ebccf592bd0292e853244d84115bfb4db0c426de58348"}, + {file = "fonttools-4.48.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b4ec6d42a7555f5ae35f3b805482f0aad0f1baeeef54859492ea3b782959d4a"}, + {file = "fonttools-4.48.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:902e9c4e9928301912f34a6638741b8ae0b64824112b42aaf240e06b735774b1"}, + {file = "fonttools-4.48.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8c8b54bd1420c184a995f980f1a8076f87363e2bb24239ef8c171a369d85a31"}, + {file = "fonttools-4.48.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:12ee86abca46193359ea69216b3a724e90c66ab05ab220d39e3fc068c1eb72ac"}, + {file = "fonttools-4.48.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6978bade7b6c0335095bdd0bd97f8f3d590d2877b370f17e03e0865241694eb5"}, + {file = "fonttools-4.48.1-cp38-cp38-win32.whl", hash = "sha256:bcd77f89fc1a6b18428e7a55dde8ef56dae95640293bfb8f4e929929eba5e2a2"}, + {file = "fonttools-4.48.1-cp38-cp38-win_amd64.whl", hash = "sha256:f40441437b039930428e04fb05ac3a132e77458fb57666c808d74a556779e784"}, + {file = "fonttools-4.48.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0d2b01428f7da26f229a5656defc824427b741e454b4e210ad2b25ed6ea2aed4"}, + {file = "fonttools-4.48.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:df48798f9a4fc4c315ab46e17873436c8746f5df6eddd02fad91299b2af7af95"}, + {file = "fonttools-4.48.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2eb4167bde04e172a93cf22c875d8b0cff76a2491f67f5eb069566215302d45d"}, + {file = "fonttools-4.48.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c900508c46274d32d308ae8e82335117f11aaee1f7d369ac16502c9a78930b0a"}, + {file = "fonttools-4.48.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:594206b31c95fcfa65f484385171fabb4ec69f7d2d7f56d27f17db26b7a31814"}, + {file = "fonttools-4.48.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:292922dc356d7f11f5063b4111a8b719efb8faea92a2a88ed296408d449d8c2e"}, + {file = "fonttools-4.48.1-cp39-cp39-win32.whl", hash = "sha256:4709c5bf123ba10eac210d2d5c9027d3f472591d9f1a04262122710fa3d23199"}, + {file = "fonttools-4.48.1-cp39-cp39-win_amd64.whl", hash = "sha256:63c73b9dd56a94a3cbd2f90544b5fca83666948a9e03370888994143b8d7c070"}, + {file = "fonttools-4.48.1-py3-none-any.whl", hash = "sha256:e3e33862fc5261d46d9aae3544acb36203b1a337d00bdb5d3753aae50dac860e"}, + {file = "fonttools-4.48.1.tar.gz", hash = "sha256:8b8a45254218679c7f1127812761e7854ed5c8e34349aebf581e8c9204e7495a"}, +] + +[package.extras] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +repacker = ["uharfbuzz (>=0.23.0)"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] + +[[package]] +name = "future" +version = "0.18.3" +description = "Clean single-source support for Python 3 and 2" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, +] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +description = "A fast implementation of the Cassowary constraint solver" +optional = false +python-versions = ">=3.7" +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "matplotlib" +version = "3.8.3" +description = "Python plotting package" +optional = false +python-versions = ">=3.9" +files = [ + {file = "matplotlib-3.8.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cf60138ccc8004f117ab2a2bad513cc4d122e55864b4fe7adf4db20ca68a078f"}, + {file = "matplotlib-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f557156f7116be3340cdeef7f128fa99b0d5d287d5f41a16e169819dcf22357"}, + {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f386cf162b059809ecfac3bcc491a9ea17da69fa35c8ded8ad154cd4b933d5ec"}, + {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c5f96f57b0369c288bf6f9b5274ba45787f7e0589a34d24bdbaf6d3344632f"}, + {file = "matplotlib-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:83e0f72e2c116ca7e571c57aa29b0fe697d4c6425c4e87c6e994159e0c008635"}, + {file = "matplotlib-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:1c5c8290074ba31a41db1dc332dc2b62def469ff33766cbe325d32a3ee291aea"}, + {file = "matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900"}, + {file = "matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7e7e0993d0758933b1a241a432b42c2db22dfa37d4108342ab4afb9557cbe3e"}, + {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04b36ad07eac9740fc76c2aa16edf94e50b297d6eb4c081e3add863de4bb19a7"}, + {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c42dae72a62f14982f1474f7e5c9959fc4bc70c9de11cc5244c6e766200ba65"}, + {file = "matplotlib-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf5932eee0d428192c40b7eac1399d608f5d995f975cdb9d1e6b48539a5ad8d0"}, + {file = "matplotlib-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407"}, + {file = "matplotlib-3.8.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09074f8057917d17ab52c242fdf4916f30e99959c1908958b1fc6032e2d0f6d4"}, + {file = "matplotlib-3.8.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5745f6d0fb5acfabbb2790318db03809a253096e98c91b9a31969df28ee604aa"}, + {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97653d869a71721b639714b42d87cda4cfee0ee74b47c569e4874c7590c55c5"}, + {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:242489efdb75b690c9c2e70bb5c6550727058c8a614e4c7716f363c27e10bba1"}, + {file = "matplotlib-3.8.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:83c0653c64b73926730bd9ea14aa0f50f202ba187c307a881673bad4985967b7"}, + {file = "matplotlib-3.8.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef6c1025a570354297d6c15f7d0f296d95f88bd3850066b7f1e7b4f2f4c13a39"}, + {file = "matplotlib-3.8.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c4af3f7317f8a1009bbb2d0bf23dfaba859eb7dd4ccbd604eba146dccaaaf0a4"}, + {file = "matplotlib-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c6e00a65d017d26009bac6808f637b75ceade3e1ff91a138576f6b3065eeeba"}, + {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7b49ab49a3bea17802df6872f8d44f664ba8f9be0632a60c99b20b6db2165b7"}, + {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6728dde0a3997396b053602dbd907a9bd64ec7d5cf99e728b404083698d3ca01"}, + {file = "matplotlib-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:813925d08fb86aba139f2d31864928d67511f64e5945ca909ad5bc09a96189bb"}, + {file = "matplotlib-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:cd3a0c2be76f4e7be03d34a14d49ded6acf22ef61f88da600a18a5cd8b3c5f3c"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fa93695d5c08544f4a0dfd0965f378e7afc410d8672816aff1e81be1f45dbf2e"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9764df0e8778f06414b9d281a75235c1e85071f64bb5d71564b97c1306a2afc"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5e431a09e6fab4012b01fc155db0ce6dccacdbabe8198197f523a4ef4805eb26"}, + {file = "matplotlib-3.8.3.tar.gz", hash = "sha256:7b416239e9ae38be54b028abbf9048aff5054a9aba5416bef0bd17f9162ce161"}, +] + +[package.dependencies] +contourpy = ">=1.0.1" +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.3.1" +numpy = ">=1.21,<2" +packaging = ">=20.0" +pillow = ">=8" +pyparsing = ">=2.3.1" +python-dateutil = ">=2.7" + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pandas" +version = "2.2.0" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.9" +files = [ + {file = "pandas-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670"}, + {file = "pandas-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1"}, + {file = "pandas-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71"}, + {file = "pandas-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042"}, + {file = "pandas-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7"}, + {file = "pandas-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae"}, + {file = "pandas-2.2.0.tar.gz", hash = "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.23.2,<2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0,<2", markers = "python_version >= \"3.12\""}, +] +python-dateutil = ">=2.8.2" +pytz = ">=2020.1" +tzdata = ">=2022.7" + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)", "beautifulsoup4 (>=4.11.2)", "bottleneck (>=1.3.6)", "dataframe-api-compat (>=0.1.7)", "fastparquet (>=2022.12.0)", "fsspec (>=2022.11.0)", "gcsfs (>=2022.11.0)", "html5lib (>=1.1)", "hypothesis (>=6.46.1)", "jinja2 (>=3.1.2)", "lxml (>=4.9.2)", "matplotlib (>=3.6.3)", "numba (>=0.56.4)", "numexpr (>=2.8.4)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "pandas-gbq (>=0.19.0)", "psycopg2 (>=2.9.6)", "pyarrow (>=10.0.1)", "pymysql (>=1.0.2)", "pyreadstat (>=1.2.0)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "qtpy (>=2.3.0)", "s3fs (>=2022.11.0)", "scipy (>=1.10.0)", "tables (>=3.8.0)", "tabulate (>=0.9.0)", "xarray (>=2022.12.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)", "zstandard (>=0.19.0)"] +aws = ["s3fs (>=2022.11.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.3.0)"] +compression = ["zstandard (>=0.19.0)"] +computation = ["scipy (>=1.10.0)", "xarray (>=2022.12.0)"] +consortium-standard = ["dataframe-api-compat (>=0.1.7)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.0)", "python-calamine (>=0.1.7)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.0.5)"] +feather = ["pyarrow (>=10.0.1)"] +fss = ["fsspec (>=2022.11.0)"] +gcp = ["gcsfs (>=2022.11.0)", "pandas-gbq (>=0.19.0)"] +hdf5 = ["tables (>=3.8.0)"] +html = ["beautifulsoup4 (>=4.11.2)", "html5lib (>=1.1)", "lxml (>=4.9.2)"] +mysql = ["SQLAlchemy (>=2.0.0)", "pymysql (>=1.0.2)"] +output-formatting = ["jinja2 (>=3.1.2)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=10.0.1)"] +performance = ["bottleneck (>=1.3.6)", "numba (>=0.56.4)", "numexpr (>=2.8.4)"] +plot = ["matplotlib (>=3.6.3)"] +postgresql = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "psycopg2 (>=2.9.6)"] +spss = ["pyreadstat (>=1.2.0)"] +sql-other = ["SQLAlchemy (>=2.0.0)", "adbc-driver-postgresql (>=0.8.0)", "adbc-driver-sqlite (>=0.8.0)"] +test = ["hypothesis (>=6.46.1)", "pytest (>=7.3.2)", "pytest-xdist (>=2.2.0)"] +xml = ["lxml (>=4.9.2)"] + +[[package]] +name = "pillow" +version = "10.2.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"}, + {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"}, + {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"}, + {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"}, + {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"}, + {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "pyparsing" +version = "3.1.1" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +optional = false +python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2024.1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "seaborn" +version = "0.13.2" +description = "Statistical data visualization" +optional = false +python-versions = ">=3.8" +files = [ + {file = "seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987"}, + {file = "seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7"}, +] + +[package.dependencies] +matplotlib = ">=3.4,<3.6.1 || >3.6.1" +numpy = ">=1.20,<1.24.0 || >1.24.0" +pandas = ">=1.2" + +[package.extras] +dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest-cov", "pytest-xdist"] +docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] +stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "trappy" +version = "6.0.1" +description = "Trace Analysis and Plotting" +optional = false +python-versions = ">=3.6" +files = [ + {file = "TRAPpy-6.0.1-py3-none-any.whl", hash = "sha256:37430cc41dc42fb77ed4872ab4a83f3bb0b3c27e644394c15b754ac4965e87d4"}, + {file = "TRAPpy-6.0.1.tar.gz", hash = "sha256:ec4afc07accf2977c77ddeea493bd857c879ea3961144f9b4cb8803b7c00f4ce"}, +] + +[package.dependencies] +future = "*" +numpy = "*" +pandas = ">=0.15.0" +pyparsing = "*" + +[package.extras] +notebook = ["ipython (>=3.0.0)", "jupyter (>=1.0.0)", "matplotlib (>=1.3.1)"] + +[[package]] +name = "tzdata" +version = "2024.1" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "72069e5f650f8e14410d9835fa5695eec38d4951657955bad9be73e0a1a998cf" diff --git a/src/aarch64-linux-flush-dcache/visualizer/pyproject.toml b/src/aarch64-linux-flush-dcache/visualizer/pyproject.toml new file mode 100644 index 0000000..2060067 --- /dev/null +++ b/src/aarch64-linux-flush-dcache/visualizer/pyproject.toml @@ -0,0 +1,17 @@ +[tool.poetry] +name = "ftrace2pyplot" +version = "0.1.0" +description = "" +authors = ["Z.Chen "] +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.11" +matplotlib = "^3.8.3" +seaborn = "^0.13.2" +trappy = "^6.0.1" + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/src/aarch64-linux-flush-dcache/visualizer/tests/__init__.py b/src/aarch64-linux-flush-dcache/visualizer/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tex/misc/background_draft.bib b/tex/misc/background_draft.bib index 1a3e0aa..0bfc2c2 100644 --- a/tex/misc/background_draft.bib +++ b/tex/misc/background_draft.bib @@ -323,3 +323,36 @@ year={2014} } +@inproceedings{Ma_etal.SHM_FPGA.2020, + title={A hypervisor for shared-memory FPGA platforms}, + author={Ma, Jiacheng and Zuo, Gefei and Loughlin, Kevin and Cheng, Xiaohe and Liu, Yanqiang and Eneyew, Abel Mulugeta and Qi, Zhengwei and Kasikci, Baris}, + booktitle={Proceedings of the Twenty-Fifth International Conference on Architectural Support for Programming Languages and Operating Systems}, + pages={827--844}, + year={2020} +} + +@inproceedings{Khawaja_etal.AmorphOS.2018, + title={Sharing, Protection, and Compatibility for Reconfigurable Fabric with $\{$AmorphOS$\}$}, + author={Khawaja, Ahmed and Landgraf, Joshua and Prakash, Rohith and Wei, Michael and Schkufza, Eric and Rossbach, Christopher J}, + booktitle={13th USENIX Symposium on Operating Systems Design and Implementation (OSDI 18)}, + pages={107--127}, + year={2018} +} + +@misc{Ven.LKML_x86_DMA.2008, + title={Background on ioremap, cacheing, cache coherency on x86}, + url={https://lkml.org/lkml/2008/4/29/480}, + journal={lkml.org}, + author={Ven, Arjan van de}, + year={2008}, + month={Apr} +} + +@inproceedings{Li_etal.RelDB_RDMA.2016, + title={Accelerating relational databases by leveraging remote memory and RDMA}, + author={Li, Feng and Das, Sudipto and Syamala, Manoj and Narasayya, Vivek R}, + booktitle={Proceedings of the 2016 International Conference on Management of Data}, + pages={355--370}, + year={2016} +} + diff --git a/tex/misc/background_draft.pdf b/tex/misc/background_draft.pdf index c8cedff94dca9cf7b3ad1c05ecd5ece7043b5c2a..27bad23fdf7c2c48fe9152c8aed28573f23ae58e 100644 GIT binary patch delta 55743 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 BAt(R< delta 54214 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 Q&%{I}$R0md)rOM&2Ypgk8~^|S diff --git a/tex/misc/background_draft.tex b/tex/misc/background_draft.tex index bacd70e..bfabe39 100644 --- a/tex/misc/background_draft.tex +++ b/tex/misc/background_draft.tex @@ -9,10 +9,11 @@ Though large-scale cluster systems remain the dominant solution for request and data-level parallelism \cite{BOOK.Hennessy_Patterson.CArch.2011}, there have been a resurgence towards applying HPC techniques (e.g., DSM) for more -efficient heterogeneous computation with more tightly-coupled heterogeneous nodes -providing (hardware) acceleration for one another \cite{Cabezas_etal.GPU-SM.2015} -\textcolor{red}{[ADD MORE CITATIONS]} Orthogonally, within the scope of one -motherboard, \emph{heterogeneous memory management (HMM)} enables the use of +efficient heterogeneous computation with tighter-coupled heterogeneous nodes +providing (hardware) acceleration for one another +\cites{Cabezas_etal.GPU-SM.2015}{Ma_etal.SHM_FPGA.2020}{Khawaja_etal.AmorphOS.2018} +Orthogonally, within the scope of one motherboard, +\emph{heterogeneous memory management (HMM)} enables the use of OS-controlled, unified memory view across both main memory and device memory \cite{WEB.NVIDIA.Harris.Unified_Memory_CUDA.2017}, all while using the same libc function calls as one would with SMP programming, the underlying complexities of @@ -50,11 +51,46 @@ This thesis paper builds upon an ongoing research effort in implementing a tightly coupled cluster where HMM abstractions allow for transparent RDMA access from accelerator nodes to local data and migration of data near computation, leveraging different consistency model and coherency protocols to amortize the -communication cost for shared data. \textcolor{red}{ -Specifically, this thesis explores the effect of memory consistency model and -coherency protocol on memory-sharing between cluster nodes } +communication cost for shared data. More specifically, this thesis explores the +following: -\textcolor{red}{The rest of the chapter is structured as follows\dots} +\begin{itemize} + \item { + The effect of cache coherency maintenance, specifically OS-initiated, + on RDMA programs. + } + \item { + Implementation of cache coherency in cache-incoherent kernel-side RDMA + clients. + } + \item { + Discussion of memory models and coherence protocol designs for a + single-writer, multi-reader RDMA-based DSM system. + } +\end{itemize} + +The rest of the chapter is structured as follows: +\begin{itemize} + \item { + We identify and discuss notable developments in software-implemented + DSM systems, and thus identify key features of contemporary advancements + in DSM techniques that differentiate them from their predecessors. + } + \item { + We identify alternative (shared memory) programming paradigms and + compare them with DSM, which sought to provide transparent shared + address space among participating nodes. + } + \item { + We give an overview of coherency protocol and consistency models for + multi-sharer DSM systems. + } + \item { + We provide a primer to cache coherency in ARM64 systems, which + \emph{do not} guarantee cache-coherent DMA, + as opposed to x86 systems \cite{Ven.LKML_x86_DMA.2008}. + } +\end{itemize} \section{Experiences from Software DSM} A majority of contributions to software DSM systems come from the 1990s @@ -81,9 +117,9 @@ New developments in network interfaces provides much improved bandwidth and late compared to ethernet in the 1990s. RDMA-capable NICs have been shown to improve the training efficiency sixfold compared to distributed \textit{TensorFlow} via RPC, scaling positively over non-distributed training \cite{Jia_etal.Tensorflow_over_RDMA.2018}. -Similar results have been observed for \textit{APACHE Spark}\cite{Lu_etal.Spark_over_RDMA.2014} -\textcolor{red}{and what?}. Consequently, there have been a resurgence of interest -in software DSM systems and programming models +Similar results have been observed for APACHE Spark \cite{Lu_etal.Spark_over_RDMA.2014} +and SMBDirect \cite{Li_etal.RelDB_RDMA.2016}. Consequently, there have been a +resurgence of interest in software DSM systems and programming models \cites{Nelson_etal.Grappa_DSM.2015}{Cai_etal.Distributed_Memory_RDMA_Cached.2018}. % Different to DSM-over-RDMA, we try to expose RDMA as device with HMM capability @@ -108,11 +144,11 @@ of the DSM system. Perhaps most importantly, experiences from Munin show that \emph{restricting the flexibility of programming model can lead to more performant coherence models}, as -\textcolor{teal}{corroborated} by the now-foundational -\textit{Resilient Distributed Database} paper \cite{Zaharia_etal.RDD.2012} -- -which powered many now-popular scalable data processing frameworks such as -\textit{Hadoop MapReduce}\cite{WEB.APACHE..Apache_Hadoop.2023} and -\textit{APACHE Spark}\cite{WEB.APACHE..Apache_Spark.2023}. ``To achieve fault +exhibited by the now-foundational \textit{Resilient Distributed Database} paper +\cite{Zaharia_etal.RDD.2012} which powered many now-popular scalable data +processing frameworks such as \textit{Hadoop MapReduce} +\cite{WEB.APACHE..Apache_Hadoop.2023} and +\textit{APACHE Spark} \cite{WEB.APACHE..Apache_Spark.2023}. ``To achieve fault tolerance efficiently, RDDs provide a restricted form of shared memory [based on]\dots transformations rather than\dots updates to shared state'' \cite{Zaharia_etal.RDD.2012}. This allows for the use of transformation logs to @@ -227,7 +263,7 @@ network has been made apparent since the 1980s, predominant approaches to \cite{AST_Steen.Distributed_Systems-3ed.2017}. This implies manual/controlled data sharding over nodes, separation of compute and communication ``stages'' of computation, etc., which benefit performance - analysis. + analysis and engineering. } \item { Enterprise applications value throughput and uptime of relatively @@ -250,7 +286,6 @@ as backends to provide the PGAS model over various network interfaces/platforms (e.g., Ethernet and Infiniband)\cites{WEB.LBNL.UPC_man_1_upcc.2022} {WEB.HPE.Chapel_Platforms-v1.33.2023}. -Examples of PGAS programming languages and models include \textcolor{red}{\dots}. Notably, implementation of a \emph{global} address space across machines on top of machines already equipped with their own \emph{local} address space (e.g., cluster nodes running commercial Linux) necessitates a global addressing @@ -263,7 +298,7 @@ allocating node's memory, but registered globally. Consequently, a single global pointer is recorded in the runtime with corresponding permission flags for the context of some user-defined group of associated nodes. Comparatively, a \textit{collective} PGAS object is allocated such that a partition of the object -(i.e., a subarray of the repr) is stored in each of the associated node -- for +(i.e., a sub-array of the repr) is stored in each of the associated node -- for a $k$-partitioned object, $k$ global pointers are recorded in the runtime each pointing to the same object, with different offsets and (naturally) independently-chosen virtual addresses. Note that this design naturally requires @@ -272,33 +307,36 @@ cannot be re-addressed to a different virtual address i.e., the global pointer that records the local virtual address cannot be auto-invalidated. Similar schemes can be observed in other PGAS backends/runtimes, albeit they may -opt to use a map-like data structure for addressing instead. In general, PGAS -backends differ from DSM systems in that, despite providing memory management -over remote nodes, they provide no transparent caching and transfer of remote -memory objects accessed by local nodes. The programmer is still expected to -handle data/thread movement manually when working with shared memory over network -to maximize performance metrics of interest. +opt to use a map-like data structure for addressing instead. In general, despite +both PGAS and DSM systems provide memory management over remote nodes, PGAS +frameworks provide no transparent caching and transfer of remote memory objects +accessed by local nodes. The programmer is still expected to handle data/thread +movement manually when working with shared memory over network to maximize +their performance metrics of interest. -\dots - -Improvement in NIC bandwidth and transfer rate benefits DSM applications that expose -global address space, and those that leverage single-writer capabilities over hierarchical memory nodes. \textbf{[GAS and PGAS (Partitioned GAS) -technologies for example Openshmem, OpenMPI, Cray Chapel, etc. that leverage -specially-linked memory sections and \texttt{/dev/shm} to abstract away RDMA access]}. +\subsection{Message Passing} -Contemporary works on DSM systems focus more on leveraging hardware advancements -to provide fast and/or seamless software support. Adrias \cite{Masouros_etal.Adrias.2023}, -for example, implements a complex system for memory disaggregation over multiple -compute nodes connected via the \textit{ThymesisFlow}-based RDMA fabric, where -they observed significant performance improvements over existing data-intensive -processing frameworks, for example APACHE Spark, Memcached, and Redis, over -no-disaggregation (i.e., using node-local memory only, similar to cluster computing) -systems. +% \dots -\subsection{Programming Model} +% Improvement in NIC bandwidth and transfer rate benefits DSM applications that expose +% global address space, and those that leverage single-writer capabilities over hierarchical memory nodes. \textbf{[GAS and PGAS (Partitioned GAS) +% technologies for example Openshmem, OpenMPI, Cray Chapel, etc. that leverage +% specially-linked memory sections and \texttt{/dev/shm} to abstract away RDMA access]}. -\subsection{Move Data to Process, or Move Process to Data?} + +% Contemporary works on DSM systems focus more on leveraging hardware advancements +% to provide fast and/or seamless software support. Adrias \cite{Masouros_etal.Adrias.2023}, +% for example, implements a complex system for memory disaggregation over multiple +% compute nodes connected via the \textit{ThymesisFlow}-based RDMA fabric, where +% they observed significant performance improvements over existing data-intensive +% processing frameworks, for example APACHE Spark, Memcached, and Redis, over +% no-disaggregation (i.e., using node-local memory only, similar to cluster computing) +% systems. + +% \subsection{Programming Model} + +\subsection{Data to Process, or Process to Data?} (TBD -- The former is costly for data-intensive computation, but the latter may be impossible for certain tasks, and greatly hardens the replacement problem.) diff --git a/tex/misc/discussion_draft.tex b/tex/misc/discussion_draft.tex new file mode 100644 index 0000000..e69de29