From 21ac50a4e40287aa8f421aefff627e64a00c362e Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Tue, 1 Oct 2024 09:45:04 +0300 Subject: [PATCH 01/14] update dependencies --- poetry.lock | 3665 +++++++++++++++++++++++++++--------------------- pyproject.toml | 9 +- 2 files changed, 2068 insertions(+), 1606 deletions(-) mode change 100644 => 100755 pyproject.toml diff --git a/poetry.lock b/poetry.lock index 4eb0705..0badf06 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "alabaster" @@ -13,13 +13,13 @@ files = [ [[package]] name = "alembic" -version = "1.11.1" +version = "1.13.3" description = "A database migration tool for SQLAlchemy." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "alembic-1.11.1-py3-none-any.whl", hash = "sha256:dc871798a601fab38332e38d6ddb38d5e734f60034baeb8e2db5b642fccd8ab8"}, - {file = "alembic-1.11.1.tar.gz", hash = "sha256:6a810a6b012c88b33458fceb869aef09ac75d6ace5291915ba7fae44de372c01"}, + {file = "alembic-1.13.3-py3-none-any.whl", hash = "sha256:908e905976d15235fae59c9ac42c4c5b75cfcefe3d27c0fbf7ae15a37715d80e"}, + {file = "alembic-1.13.3.tar.gz", hash = "sha256:203503117415561e203aa14541740643a611f641517f0209fcae63e9fa09f1a2"}, ] [package.dependencies] @@ -30,58 +30,60 @@ SQLAlchemy = ">=1.3.0" typing-extensions = ">=4" [package.extras] -tz = ["python-dateutil"] +tz = ["backports.zoneinfo"] [[package]] name = "anyio" -version = "3.7.1" +version = "4.5.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, - {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, + {file = "anyio-4.5.0-py3-none-any.whl", hash = "sha256:fdeb095b7cc5a5563175eedd926ec4ae55413bb4be5770c424af0ba46ccb4a78"}, + {file = "anyio-4.5.0.tar.gz", hash = "sha256:c5a275fe5ca0afd788001f58fca1e69e29ce706d746e317d660e21f70c530ef9"}, ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] -test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (<0.22)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] [[package]] name = "argon2-cffi" -version = "21.3.0" -description = "The secure Argon2 password hashing algorithm." +version = "23.1.0" +description = "Argon2 for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, - {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, ] [package.dependencies] argon2-cffi-bindings = "*" [package.extras] -dev = ["cogapp", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pytest", "sphinx", "sphinx-notfound-page", "tomli"] -docs = ["furo", "sphinx", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] [[package]] name = "argon2-cffi-bindings" @@ -122,34 +124,54 @@ tests = ["pytest"] [[package]] name = "arrow" -version = "1.2.3" +version = "1.3.0" description = "Better dates & times for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, - {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, ] [package.dependencies] python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "astroid" +version = "3.2.4" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.2.4-py3-none-any.whl", hash = "sha256:413658a61eeca6202a59231abb473f932038fbcbf1666587f66d482083413a25"}, + {file = "astroid-3.2.4.tar.gz", hash = "sha256:0e14202810b30da1b735827f78f5157be2bbd4a7a59b7707ca0bfc2fb4c0063a"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "asttokens" -version = "2.2.1" +version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] -six = "*" +six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "async-lru" @@ -167,21 +189,22 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "attrs" -version = "23.1.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "autowoe" @@ -213,18 +236,21 @@ tqdm = ">=4.62.3,<5.0.0" [[package]] name = "babel" -version = "2.12.1" +version = "2.16.0" description = "Internationalization utilities" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, ] [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + [[package]] name = "backcall" version = "0.2.0" @@ -238,31 +264,34 @@ files = [ [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] [[package]] name = "bleach" -version = "6.0.0" +version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, - {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, ] [package.dependencies] @@ -270,42 +299,46 @@ six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0,<1.2)"] +css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "catboost" -version = "1.2" +version = "1.2.7" description = "CatBoost Python Package" optional = false python-versions = "*" files = [ - {file = "catboost-1.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:b7ff06dd4e72ba5ba2d827d0870080485dcd91dfb30b820e377f6a634258c47a"}, - {file = "catboost-1.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:93a9ef21b3b1817e6480854f40f0a2daad8393ee92b0b46b952db4097be46855"}, - {file = "catboost-1.2-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:bfcb35e91b6fe42dcc92614d02f13dc47a4484ca5162de84a04c09244085d8d3"}, - {file = "catboost-1.2-cp310-cp310-win_amd64.whl", hash = "sha256:788e617712c8730e7edebac5c8efafd693097ba81b38c1992894e74702b8904e"}, - {file = "catboost-1.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:983c7ec6654baddf19c574a72cfa53e926e89e5ab48941b3bc94c06edca38a49"}, - {file = "catboost-1.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:96873ffbf8913457845926221e607aabfabcad2f40615a9d21a7ec1d65bcb8da"}, - {file = "catboost-1.2-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:a0236f6328e33f1e2e5fd6ca619ea5f8759ade06d709bd9c706443b20525fada"}, - {file = "catboost-1.2-cp311-cp311-win_amd64.whl", hash = "sha256:51d0a826b8d77ce4de43a861786a11aa3e6ea7a40b7e3ef5ae085893324d86db"}, - {file = "catboost-1.2-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:aaa3b90b76e7d6feff9955732b06fe3d2646e6bd5a0072d97ccc92fa8f6ef107"}, - {file = "catboost-1.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cf432f9d72b6c2f5cfa91b178e1e85cc627365dd90326ef2970e3ac12254e27f"}, - {file = "catboost-1.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:24346ceafcc3225b70ead73fbe19248c2869a4ef0d1d671bf9a8140ed4ab3c91"}, - {file = "catboost-1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:33283992ccd673e3e39d0f71d34c7249cc6deeb1a1e0abfef3d545405c29d417"}, - {file = "catboost-1.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:32b5577dbf509e0d736da9c6b63324a235a1d895b0873307e4a290c194fa5eac"}, - {file = "catboost-1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:475932765e16e812692b84bae5bfccb9612b12d52c8e936163fd9c70cb279c59"}, - {file = "catboost-1.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:30dd2241cf487eb3f06d7c33a807e2eb35b20367268161c08b4c047d7185a8a0"}, - {file = "catboost-1.2-cp38-cp38-win_amd64.whl", hash = "sha256:e616148b739527dcf02945744ea98ecb3c9619098f1b9bf4f83b77158a6fb764"}, - {file = "catboost-1.2-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:de0c55196ab95c6d0245d8c15cd8ec2b82eca6043c4554282809d0301e799654"}, - {file = "catboost-1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:601a9cdfd5fd8663da39c080213ac69241734b8d4120de3b0d60f3af35c1c4b0"}, - {file = "catboost-1.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:234ce778e278757ff7de2b5b2513953bf7877ceb1c477fe8176a279d24931520"}, - {file = "catboost-1.2-cp39-cp39-win_amd64.whl", hash = "sha256:bc67c9ccf1cd61a23eb0f52e255eb787c2752d7fd982c6e257c82a451260084b"}, - {file = "catboost-1.2.tar.gz", hash = "sha256:39e53403727ecfbb48156773ef3006b4e71cc35ab49cc9a0cf044b474c34be0c"}, + {file = "catboost-1.2.7-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:12cd01533912f3b2b6cf4d1be7e7305f0870c109f5eb9f9a5dd48a5c07649e77"}, + {file = "catboost-1.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:bc5611329fe843cff65196032517647b2d009d46da9f02bd30d92dca26e4c013"}, + {file = "catboost-1.2.7-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:e135dd4e0b83daf745bf01ad6ece3c5decd32576bf590602d9a8d330b8b05df1"}, + {file = "catboost-1.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:ea803b136a1e3ff387b42d76abeb45073191fe102d0f57cd518e421ce4e21c33"}, + {file = "catboost-1.2.7-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:815d31854cdd10feb7243b8f7d49bd8c40d8d402b3ebf4f8f35b113f0accf47e"}, + {file = "catboost-1.2.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:3fa272379b7a834c0677d22e3ccbb27f792db17f69a4ca052aaa9ba806a8098c"}, + {file = "catboost-1.2.7-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:45b2e6f8d52fd6bbe02d1dee57c9950ab974a5e30af841020359cf7fb198bcbc"}, + {file = "catboost-1.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:99819152f9ae149adadfe95c17c8912eb450adf66cff7dcc34865e7b7bc5b31d"}, + {file = "catboost-1.2.7-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:c7d3bb7f48f2655c365345b264734b556b5c13c48b69fc521627850911494667"}, + {file = "catboost-1.2.7-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:081ff4e5510d6c2f837f0115ee629b23e3214c86f49e313bedbb0fbe696099bf"}, + {file = "catboost-1.2.7-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:9ea147a00720388fe7d7033c8cd92b08cef3b7535b22e4330b5ae8a0b86aeac1"}, + {file = "catboost-1.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:645082f23762c281a7e14fdc23b88e47a3e3bbf8655f5246d80194b104a8ada9"}, + {file = "catboost-1.2.7-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:f5f16490bf42c3bbafccd1e3a5467d5fbdb73e82ebd7faa0bf92f64f208b7599"}, + {file = "catboost-1.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:bac250c184a5b3dd4d18cc2289a37fa48779a43f544327c15b68a51d4d8f2ae9"}, + {file = "catboost-1.2.7-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:e306344f7a6f3f59c56f39232cf2ebe7f9ac22ad52552b26d3b0053495d296b5"}, + {file = "catboost-1.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b283317cf3e56860b3d6728e8ef0a54a9fc2b185e1733b49c3fde313da84ddfe"}, + {file = "catboost-1.2.7-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:744779f46e0874b35543230dfac76589b3be34b52125036d1c15214cdc3d3eee"}, + {file = "catboost-1.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:63a3f86461ee26dff071cd1addda3bc2d1a3849983d0c5c90487f78cb290d85d"}, + {file = "catboost-1.2.7-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:78d2211fb38c31d0ba749eeebc846490c5a298b5f065035fce158c2c8ed0588e"}, + {file = "catboost-1.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:a1683ac7cdef337bd3490e4aaec11d6fdfee478174bdf7de76a513efa16a1584"}, + {file = "catboost-1.2.7-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:04a0c51ef72741360c90ee037e14466393e487eb1b4f96a95b847524f26be02f"}, + {file = "catboost-1.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d2b6aa5f8a41be6f40ae127eedea83450b670788340cac30e74cffb25607c3ba"}, + {file = "catboost-1.2.7-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:e58cf8966e33931acebffbc744cf640e8abd08d0fdfb0e503c107552cea6c643"}, + {file = "catboost-1.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:90405d3962dd6d0b0960db35dcba10bdea9add112812f011d03043b927f4760e"}, + {file = "catboost-1.2.7.tar.gz", hash = "sha256:3ed1658bd22c250a12f9c55cf238d654d7a87d9b45f063ec39965a8884a7e9d3"}, ] [package.dependencies] graphviz = "*" matplotlib = "*" -numpy = ">=1.16.0" +numpy = ">=1.16.0,<2.0" pandas = ">=0.24" plotly = "*" scipy = "*" @@ -316,86 +349,89 @@ widget = ["ipython", "ipywidgets (>=7.0,<9.0)", "traitlets"] [[package]] name = "certifi" -version = "2023.7.22" +version = "2024.8.30" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, - {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, + {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, + {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.17.1" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, ] [package.dependencies] @@ -403,97 +439,112 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -512,13 +563,13 @@ files = [ [[package]] name = "cmaes" -version = "0.10.0" +version = "0.11.1" description = "Lightweight Covariance Matrix Adaptation Evolution Strategy (CMA-ES) implementation for Python 3." optional = false python-versions = ">=3.7" files = [ - {file = "cmaes-0.10.0-py3-none-any.whl", hash = "sha256:72cea747ad37b1780b0eb6f3c098cee33907fafbf6690c0c02db1e010cab72f6"}, - {file = "cmaes-0.10.0.tar.gz", hash = "sha256:48afc70df027114739872b50489ae6b32461c307b92d084a63c7090a9742faf9"}, + {file = "cmaes-0.11.1-py3-none-any.whl", hash = "sha256:1de77d2175045389680619c1e9b6d59d90e7888524d9e440e1704ba001de9fcc"}, + {file = "cmaes-0.11.1.tar.gz", hash = "sha256:cf71fa3679814723be771f2c9edd85f465b1bc1e409e1ad6d8a9e481efcd5160"}, ] [package.dependencies] @@ -540,13 +591,13 @@ files = [ [[package]] name = "colorlog" -version = "6.7.0" +version = "6.8.2" description = "Add colours to the output of Python's logging module." optional = false python-versions = ">=3.6" files = [ - {file = "colorlog-6.7.0-py2.py3-none-any.whl", hash = "sha256:0d33ca236784a1ba3ff9c532d4964126d8a2c44f1f0cb1d2b0728196f512f662"}, - {file = "colorlog-6.7.0.tar.gz", hash = "sha256:bd94bd21c1e13fac7bd3153f4bc3a7dc0eb0974b8bc2fdf1a989e474f6e582e5"}, + {file = "colorlog-6.8.2-py3-none-any.whl", hash = "sha256:4dcbb62368e2800cb3c5abd348da7e53f6c362dda502ec27c560b2e58a66bd33"}, + {file = "colorlog-6.8.2.tar.gz", hash = "sha256:3e3e079a41feb5a1b64f978b5ea4f46040a94f11f0e8bbb8261e3dbbeca64d44"}, ] [package.dependencies] @@ -557,78 +608,89 @@ development = ["black", "flake8", "mypy", "pytest", "types-colorama"] [[package]] name = "comm" -version = "0.1.3" +version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, - {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, ] [package.dependencies] -traitlets = ">=5.3" +traitlets = ">=4" [package.extras] -lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] test = ["pytest"] -typing = ["mypy (>=0.990)"] [[package]] name = "contourpy" -version = "1.1.0" +version = "1.1.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.8" files = [ - {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, - {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, - {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, - {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, - {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, - {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, - {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, - {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, - {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, - {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, - {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, ] [package.dependencies] -numpy = ">=1.16" +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} [package.extras] bokeh = ["bokeh", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "wurlitzer"] @@ -656,71 +718,83 @@ tutorials = ["jupyter (>=1.0.0,<2)", "scikit-learn (>=0.24,<2)"] [[package]] name = "coverage" -version = "7.2.7" +version = "7.6.1" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, - {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, - {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, - {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, - {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, - {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, - {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, - {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, - {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, - {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, - {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, - {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, - {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, - {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, - {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, - {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, - {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, - {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.dependencies] @@ -755,15 +829,19 @@ test = ["pytest (>=3.4.2)", "pytest-cov (>=2.6.0)", "pytest-rerunfailures (>=9.1 [[package]] name = "cycler" -version = "0.11.0" +version = "0.12.1" description = "Composable style cycles" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, + {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 = "d3rlpy" version = "1.1.1" @@ -809,29 +887,33 @@ files = [ [[package]] name = "debugpy" -version = "1.6.7" +version = "1.8.6" description = "An implementation of the Debug Adapter Protocol for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, - {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, - {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, - {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, - {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, - {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, - {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, - {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, - {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, - {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, - {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, - {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, - {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, - {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, - {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, - {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, - {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, - {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, + {file = "debugpy-1.8.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:30f467c5345d9dfdcc0afdb10e018e47f092e383447500f125b4e013236bf14b"}, + {file = "debugpy-1.8.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d73d8c52614432f4215d0fe79a7e595d0dd162b5c15233762565be2f014803b"}, + {file = "debugpy-1.8.6-cp310-cp310-win32.whl", hash = "sha256:e3e182cd98eac20ee23a00653503315085b29ab44ed66269482349d307b08df9"}, + {file = "debugpy-1.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:e3a82da039cfe717b6fb1886cbbe5c4a3f15d7df4765af857f4307585121c2dd"}, + {file = "debugpy-1.8.6-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:67479a94cf5fd2c2d88f9615e087fcb4fec169ec780464a3f2ba4a9a2bb79955"}, + {file = "debugpy-1.8.6-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fb8653f6cbf1dd0a305ac1aa66ec246002145074ea57933978346ea5afdf70b"}, + {file = "debugpy-1.8.6-cp311-cp311-win32.whl", hash = "sha256:cdaf0b9691879da2d13fa39b61c01887c34558d1ff6e5c30e2eb698f5384cd43"}, + {file = "debugpy-1.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:43996632bee7435583952155c06881074b9a742a86cee74e701d87ca532fe833"}, + {file = "debugpy-1.8.6-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:db891b141fc6ee4b5fc6d1cc8035ec329cabc64bdd2ae672b4550c87d4ecb128"}, + {file = "debugpy-1.8.6-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:567419081ff67da766c898ccf21e79f1adad0e321381b0dfc7a9c8f7a9347972"}, + {file = "debugpy-1.8.6-cp312-cp312-win32.whl", hash = "sha256:c9834dfd701a1f6bf0f7f0b8b1573970ae99ebbeee68314116e0ccc5c78eea3c"}, + {file = "debugpy-1.8.6-cp312-cp312-win_amd64.whl", hash = "sha256:e4ce0570aa4aca87137890d23b86faeadf184924ad892d20c54237bcaab75d8f"}, + {file = "debugpy-1.8.6-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:df5dc9eb4ca050273b8e374a4cd967c43be1327eeb42bfe2f58b3cdfe7c68dcb"}, + {file = "debugpy-1.8.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a85707c6a84b0c5b3db92a2df685b5230dd8fb8c108298ba4f11dba157a615a"}, + {file = "debugpy-1.8.6-cp38-cp38-win32.whl", hash = "sha256:538c6cdcdcdad310bbefd96d7850be1cd46e703079cc9e67d42a9ca776cdc8a8"}, + {file = "debugpy-1.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:22140bc02c66cda6053b6eb56dfe01bbe22a4447846581ba1dd6df2c9f97982d"}, + {file = "debugpy-1.8.6-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:c1cef65cffbc96e7b392d9178dbfd524ab0750da6c0023c027ddcac968fd1caa"}, + {file = "debugpy-1.8.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1e60bd06bb3cc5c0e957df748d1fab501e01416c43a7bdc756d2a992ea1b881"}, + {file = "debugpy-1.8.6-cp39-cp39-win32.whl", hash = "sha256:f7158252803d0752ed5398d291dee4c553bb12d14547c0e1843ab74ee9c31123"}, + {file = "debugpy-1.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3358aa619a073b620cd0d51d8a6176590af24abcc3fe2e479929a154bf591b51"}, + {file = "debugpy-1.8.6-py2.py3-none-any.whl", hash = "sha256:b48892df4d810eff21d3ef37274f4c60d32cdcafc462ad5647239036b0f0649f"}, + {file = "debugpy-1.8.6.zip", hash = "sha256:c931a9371a86784cee25dec8d65bc2dc7a21f3f1552e3833d9ef8f919d22280a"}, ] [[package]] @@ -877,26 +959,41 @@ files = [ {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] +[[package]] +name = "dill" +version = "0.3.9" +description = "serialize all of Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] + [[package]] name = "docutils" -version = "0.18.1" +version = "0.20.1" description = "Docutils -- Python Documentation Utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "docutils-0.18.1-py2.py3-none-any.whl", hash = "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c"}, - {file = "docutils-0.18.1.tar.gz", hash = "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06"}, + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, ] [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -904,17 +1001,17 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "1.2.0" +version = "2.1.0" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "executing-2.1.0-py2.py3-none-any.whl", hash = "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf"}, + {file = "executing-2.1.0.tar.gz", hash = "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab"}, ] [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "faker" @@ -933,13 +1030,13 @@ text-unidecode = "1.3" [[package]] name = "fastjsonschema" -version = "2.18.0" +version = "2.20.0" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.18.0-py3-none-any.whl", hash = "sha256:128039912a11a807068a7c87d0da36660afbfd7202780db26c4aa7153cfdc799"}, - {file = "fastjsonschema-2.18.0.tar.gz", hash = "sha256:e820349dd16f806e4bd1467a138dced9def4bc7d6213a34295272a6cac95b5bd"}, + {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, + {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, ] [package.extras] @@ -947,59 +1044,73 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "fonttools" -version = "4.41.1" +version = "4.54.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.41.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a7bbb290d13c6dd718ec2c3db46fe6c5f6811e7ea1e07f145fd8468176398224"}, - {file = "fonttools-4.41.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ec453a45778524f925a8f20fd26a3326f398bfc55d534e37bab470c5e415caa1"}, - {file = "fonttools-4.41.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2071267deaa6d93cb16288613419679c77220543551cbe61da02c93d92df72f"}, - {file = "fonttools-4.41.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e3334d51f0e37e2c6056e67141b2adabc92613a968797e2571ca8a03bd64773"}, - {file = "fonttools-4.41.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cac73bbef7734e78c60949da11c4903ee5837168e58772371bd42a75872f4f82"}, - {file = "fonttools-4.41.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:edee0900cf0eedb29d17c7876102d6e5a91ee333882b1f5abc83e85b934cadb5"}, - {file = "fonttools-4.41.1-cp310-cp310-win32.whl", hash = "sha256:2a22b2c425c698dcd5d6b0ff0b566e8e9663172118db6fd5f1941f9b8063da9b"}, - {file = "fonttools-4.41.1-cp310-cp310-win_amd64.whl", hash = "sha256:547ab36a799dded58a46fa647266c24d0ed43a66028cd1cd4370b246ad426cac"}, - {file = "fonttools-4.41.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:849ec722bbf7d3501a0e879e57dec1fc54919d31bff3f690af30bb87970f9784"}, - {file = "fonttools-4.41.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38cdecd8f1fd4bf4daae7fed1b3170dfc1b523388d6664b2204b351820aa78a7"}, - {file = "fonttools-4.41.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ae64303ba670f8959fdaaa30ba0c2dabe75364fdec1caeee596c45d51ca3425"}, - {file = "fonttools-4.41.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f14f3ccea4cc7dd1b277385adf3c3bf18f9860f87eab9c2fb650b0af16800f55"}, - {file = "fonttools-4.41.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:33191f062549e6bb1a4782c22a04ebd37009c09360e2d6686ac5083774d06d95"}, - {file = "fonttools-4.41.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:704bccd69b0abb6fab9f5e4d2b75896afa48b427caa2c7988792a2ffce35b441"}, - {file = "fonttools-4.41.1-cp311-cp311-win32.whl", hash = "sha256:4edc795533421e98f60acee7d28fc8d941ff5ac10f44668c9c3635ad72ae9045"}, - {file = "fonttools-4.41.1-cp311-cp311-win_amd64.whl", hash = "sha256:aaaef294d8e411f0ecb778a0aefd11bb5884c9b8333cc1011bdaf3b58ca4bd75"}, - {file = "fonttools-4.41.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3d1f9471134affc1e3b1b806db6e3e2ad3fa99439e332f1881a474c825101096"}, - {file = "fonttools-4.41.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:59eba8b2e749a1de85760da22333f3d17c42b66e03758855a12a2a542723c6e7"}, - {file = "fonttools-4.41.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9b3cc10dc9e0834b6665fd63ae0c6964c6bc3d7166e9bc84772e0edd09f9fa2"}, - {file = "fonttools-4.41.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2c2964bdc827ba6b8a91dc6de792620be4da3922c4cf0599f36a488c07e2b2"}, - {file = "fonttools-4.41.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7763316111df7b5165529f4183a334aa24c13cdb5375ffa1dc8ce309c8bf4e5c"}, - {file = "fonttools-4.41.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b2d1ee95be42b80d1f002d1ee0a51d7a435ea90d36f1a5ae331be9962ee5a3f1"}, - {file = "fonttools-4.41.1-cp38-cp38-win32.whl", hash = "sha256:f48602c0b3fd79cd83a34c40af565fe6db7ac9085c8823b552e6e751e3a5b8be"}, - {file = "fonttools-4.41.1-cp38-cp38-win_amd64.whl", hash = "sha256:b0938ebbeccf7c80bb9a15e31645cf831572c3a33d5cc69abe436e7000c61b14"}, - {file = "fonttools-4.41.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e5c2b0a95a221838991e2f0e455dec1ca3a8cc9cd54febd68cc64d40fdb83669"}, - {file = "fonttools-4.41.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:891cfc5a83b0307688f78b9bb446f03a7a1ad981690ac8362f50518bc6153975"}, - {file = "fonttools-4.41.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73ef0bb5d60eb02ba4d3a7d23ada32184bd86007cb2de3657cfcb1175325fc83"}, - {file = "fonttools-4.41.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f240d9adf0583ac8fc1646afe7f4ac039022b6f8fa4f1575a2cfa53675360b69"}, - {file = "fonttools-4.41.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bdd729744ae7ecd7f7311ad25d99da4999003dcfe43b436cf3c333d4e68de73d"}, - {file = "fonttools-4.41.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b927e5f466d99c03e6e20961946314b81d6e3490d95865ef88061144d9f62e38"}, - {file = "fonttools-4.41.1-cp39-cp39-win32.whl", hash = "sha256:afce2aeb80be72b4da7dd114f10f04873ff512793d13ce0b19d12b2a4c44c0f0"}, - {file = "fonttools-4.41.1-cp39-cp39-win_amd64.whl", hash = "sha256:1df1b6f4c7c4bc8201eb47f3b268adbf2539943aa43c400f84556557e3e109c0"}, - {file = "fonttools-4.41.1-py3-none-any.whl", hash = "sha256:952cb405f78734cf6466252fec42e206450d1a6715746013f64df9cbd4f896fa"}, - {file = "fonttools-4.41.1.tar.gz", hash = "sha256:e16a9449f21a93909c5be2f5ed5246420f2316e94195dbfccb5238aaa38f9751"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7ed7ee041ff7b34cc62f07545e55e1468808691dddfd315d51dd82a6b37ddef2"}, + {file = "fonttools-4.54.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:41bb0b250c8132b2fcac148e2e9198e62ff06f3cc472065dff839327945c5882"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7965af9b67dd546e52afcf2e38641b5be956d68c425bef2158e95af11d229f10"}, + {file = "fonttools-4.54.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:278913a168f90d53378c20c23b80f4e599dca62fbffae4cc620c8eed476b723e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0e88e3018ac809b9662615072dcd6b84dca4c2d991c6d66e1970a112503bba7e"}, + {file = "fonttools-4.54.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4aa4817f0031206e637d1e685251ac61be64d1adef111060df84fdcbc6ab6c44"}, + {file = "fonttools-4.54.1-cp310-cp310-win32.whl", hash = "sha256:7e3b7d44e18c085fd8c16dcc6f1ad6c61b71ff463636fcb13df7b1b818bd0c02"}, + {file = "fonttools-4.54.1-cp310-cp310-win_amd64.whl", hash = "sha256:dd9cc95b8d6e27d01e1e1f1fae8559ef3c02c76317da650a19047f249acd519d"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5419771b64248484299fa77689d4f3aeed643ea6630b2ea750eeab219588ba20"}, + {file = "fonttools-4.54.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:301540e89cf4ce89d462eb23a89464fef50915255ece765d10eee8b2bf9d75b2"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76ae5091547e74e7efecc3cbf8e75200bc92daaeb88e5433c5e3e95ea8ce5aa7"}, + {file = "fonttools-4.54.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82834962b3d7c5ca98cb56001c33cf20eb110ecf442725dc5fdf36d16ed1ab07"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d26732ae002cc3d2ecab04897bb02ae3f11f06dd7575d1df46acd2f7c012a8d8"}, + {file = "fonttools-4.54.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58974b4987b2a71ee08ade1e7f47f410c367cdfc5a94fabd599c88165f56213a"}, + {file = "fonttools-4.54.1-cp311-cp311-win32.whl", hash = "sha256:ab774fa225238986218a463f3fe151e04d8c25d7de09df7f0f5fce27b1243dbc"}, + {file = "fonttools-4.54.1-cp311-cp311-win_amd64.whl", hash = "sha256:07e005dc454eee1cc60105d6a29593459a06321c21897f769a281ff2d08939f6"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:54471032f7cb5fca694b5f1a0aaeba4af6e10ae989df408e0216f7fd6cdc405d"}, + {file = "fonttools-4.54.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fa92cb248e573daab8d032919623cc309c005086d743afb014c836636166f08"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a911591200114969befa7f2cb74ac148bce5a91df5645443371aba6d222e263"}, + {file = "fonttools-4.54.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93d458c8a6a354dc8b48fc78d66d2a8a90b941f7fec30e94c7ad9982b1fa6bab"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5eb2474a7c5be8a5331146758debb2669bf5635c021aee00fd7c353558fc659d"}, + {file = "fonttools-4.54.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c9c563351ddc230725c4bdf7d9e1e92cbe6ae8553942bd1fb2b2ff0884e8b714"}, + {file = "fonttools-4.54.1-cp312-cp312-win32.whl", hash = "sha256:fdb062893fd6d47b527d39346e0c5578b7957dcea6d6a3b6794569370013d9ac"}, + {file = "fonttools-4.54.1-cp312-cp312-win_amd64.whl", hash = "sha256:e4564cf40cebcb53f3dc825e85910bf54835e8a8b6880d59e5159f0f325e637e"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6e37561751b017cf5c40fce0d90fd9e8274716de327ec4ffb0df957160be3bff"}, + {file = "fonttools-4.54.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:357cacb988a18aace66e5e55fe1247f2ee706e01debc4b1a20d77400354cddeb"}, + {file = "fonttools-4.54.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e953cc0bddc2beaf3a3c3b5dd9ab7554677da72dfaf46951e193c9653e515a"}, + {file = "fonttools-4.54.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58d29b9a294573d8319f16f2f79e42428ba9b6480442fa1836e4eb89c4d9d61c"}, + {file = "fonttools-4.54.1-cp313-cp313-win32.whl", hash = "sha256:9ef1b167e22709b46bf8168368b7b5d3efeaaa746c6d39661c1b4405b6352e58"}, + {file = "fonttools-4.54.1-cp313-cp313-win_amd64.whl", hash = "sha256:262705b1663f18c04250bd1242b0515d3bbae177bee7752be67c979b7d47f43d"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ed2f80ca07025551636c555dec2b755dd005e2ea8fbeb99fc5cdff319b70b23b"}, + {file = "fonttools-4.54.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9dc080e5a1c3b2656caff2ac2633d009b3a9ff7b5e93d0452f40cd76d3da3b3c"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d152d1be65652fc65e695e5619e0aa0982295a95a9b29b52b85775243c06556"}, + {file = "fonttools-4.54.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8583e563df41fdecef31b793b4dd3af8a9caa03397be648945ad32717a92885b"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:0d1d353ef198c422515a3e974a1e8d5b304cd54a4c2eebcae708e37cd9eeffb1"}, + {file = "fonttools-4.54.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fda582236fee135d4daeca056c8c88ec5f6f6d88a004a79b84a02547c8f57386"}, + {file = "fonttools-4.54.1-cp38-cp38-win32.whl", hash = "sha256:e7d82b9e56716ed32574ee106cabca80992e6bbdcf25a88d97d21f73a0aae664"}, + {file = "fonttools-4.54.1-cp38-cp38-win_amd64.whl", hash = "sha256:ada215fd079e23e060157aab12eba0d66704316547f334eee9ff26f8c0d7b8ab"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5b8a096e649768c2f4233f947cf9737f8dbf8728b90e2771e2497c6e3d21d13"}, + {file = "fonttools-4.54.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4e10d2e0a12e18f4e2dd031e1bf7c3d7017be5c8dbe524d07706179f355c5dac"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31c32d7d4b0958600eac75eaf524b7b7cb68d3a8c196635252b7a2c30d80e986"}, + {file = "fonttools-4.54.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c39287f5c8f4a0c5a55daf9eaf9ccd223ea59eed3f6d467133cc727d7b943a55"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a7a310c6e0471602fe3bf8efaf193d396ea561486aeaa7adc1f132e02d30c4b9"}, + {file = "fonttools-4.54.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:d3b659d1029946f4ff9b6183984578041b520ce0f8fb7078bb37ec7445806b33"}, + {file = "fonttools-4.54.1-cp39-cp39-win32.whl", hash = "sha256:e96bc94c8cda58f577277d4a71f51c8e2129b8b36fd05adece6320dd3d57de8a"}, + {file = "fonttools-4.54.1-cp39-cp39-win_amd64.whl", hash = "sha256:e8a4b261c1ef91e7188a30571be6ad98d1c6d9fa2427244c545e2fa0a2494dd7"}, + {file = "fonttools-4.54.1-py3-none-any.whl", hash = "sha256:37cddd62d83dc4f72f7c3f3c2bcf2697e89a30efb152079896544a93907733bd"}, + {file = "fonttools-4.54.1.tar.gz", hash = "sha256:957f669d4922f92c171ba01bef7f29410668db09f6c02111e22b2bce446f3285"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +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.0.0)"] +unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] @@ -1015,12 +1126,13 @@ files = [ [[package]] name = "future" -version = "0.18.3" +version = "1.0.0" 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"}, + {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, + {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, ] [[package]] @@ -1042,91 +1154,104 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "graphviz" -version = "0.20.1" +version = "0.20.3" description = "Simple Python interface for Graphviz" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "graphviz-0.20.1-py3-none-any.whl", hash = "sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"}, - {file = "graphviz-0.20.1.zip", hash = "sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8"}, + {file = "graphviz-0.20.3-py3-none-any.whl", hash = "sha256:81f848f2904515d8cd359cc611faba817598d2feaac4027b266aa3eda7b3dde5"}, + {file = "graphviz-0.20.3.zip", hash = "sha256:09d6bc81e6a9fa392e7ba52135a9d49f1ed62526f96499325930e87ca1b5925d"}, ] [package.extras] dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] -docs = ["sphinx (>=5)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] -test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>=3)"] +docs = ["sphinx (>=5,<7)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] +test = ["coverage", "pytest (>=7,<8.1)", "pytest-cov", "pytest-mock (>=3)"] [[package]] name = "greenlet" -version = "2.0.2" +version = "3.1.1" description = "Lightweight in-process concurrent programming" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, - {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, - {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, - {file = "greenlet-2.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:283737e0da3f08bd637b5ad058507e578dd462db259f7f6e4c5c365ba4ee9343"}, - {file = "greenlet-2.0.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d27ec7509b9c18b6d73f2f5ede2622441de812e7b1a80bbd446cb0633bd3d5ae"}, - {file = "greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb"}, - {file = "greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a"}, - {file = "greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91"}, - {file = "greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645"}, - {file = "greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0"}, - {file = "greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19"}, - {file = "greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3"}, - {file = "greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5"}, - {file = "greenlet-2.0.2-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:910841381caba4f744a44bf81bfd573c94e10b3045ee00de0cbf436fe50673a6"}, - {file = "greenlet-2.0.2-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:18a7f18b82b52ee85322d7a7874e676f34ab319b9f8cce5de06067384aa8ff43"}, - {file = "greenlet-2.0.2-cp35-cp35m-win32.whl", hash = "sha256:03a8f4f3430c3b3ff8d10a2a86028c660355ab637cee9333d63d66b56f09d52a"}, - {file = "greenlet-2.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4b58adb399c4d61d912c4c331984d60eb66565175cdf4a34792cd9600f21b394"}, - {file = "greenlet-2.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:703f18f3fda276b9a916f0934d2fb6d989bf0b4fb5a64825260eb9bfd52d78f0"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:32e5b64b148966d9cccc2c8d35a671409e45f195864560829f395a54226408d3"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dd11f291565a81d71dab10b7033395b7a3a5456e637cf997a6f33ebdf06f8db"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e0f72c9ddb8cd28532185f54cc1453f2c16fb417a08b53a855c4e6a418edd099"}, - {file = "greenlet-2.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd021c754b162c0fb55ad5d6b9d960db667faad0fa2ff25bb6e1301b0b6e6a75"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:3c9b12575734155d0c09d6c3e10dbd81665d5c18e1a7c6597df72fd05990c8cf"}, - {file = "greenlet-2.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b9ec052b06a0524f0e35bd8790686a1da006bd911dd1ef7d50b77bfbad74e292"}, - {file = "greenlet-2.0.2-cp36-cp36m-win32.whl", hash = "sha256:dbfcfc0218093a19c252ca8eb9aee3d29cfdcb586df21049b9d777fd32c14fd9"}, - {file = "greenlet-2.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9f35ec95538f50292f6d8f2c9c9f8a3c6540bbfec21c9e5b4b751e0a7c20864f"}, - {file = "greenlet-2.0.2-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:d5508f0b173e6aa47273bdc0a0b5ba055b59662ba7c7ee5119528f466585526b"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:f82d4d717d8ef19188687aa32b8363e96062911e63ba22a0cff7802a8e58e5f1"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9c59a2120b55788e800d82dfa99b9e156ff8f2227f07c5e3012a45a399620b7"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2780572ec463d44c1d3ae850239508dbeb9fed38e294c68d19a24d925d9223ca"}, - {file = "greenlet-2.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:937e9020b514ceedb9c830c55d5c9872abc90f4b5862f89c0887033ae33c6f73"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:36abbf031e1c0f79dd5d596bfaf8e921c41df2bdf54ee1eed921ce1f52999a86"}, - {file = "greenlet-2.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:18e98fb3de7dba1c0a852731c3070cf022d14f0d68b4c87a19cc1016f3bb8b33"}, - {file = "greenlet-2.0.2-cp37-cp37m-win32.whl", hash = "sha256:3f6ea9bd35eb450837a3d80e77b517ea5bc56b4647f5502cd28de13675ee12f7"}, - {file = "greenlet-2.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:7492e2b7bd7c9b9916388d9df23fa49d9b88ac0640db0a5b4ecc2b653bf451e3"}, - {file = "greenlet-2.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:b864ba53912b6c3ab6bcb2beb19f19edd01a6bfcbdfe1f37ddd1778abfe75a30"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:ba2956617f1c42598a308a84c6cf021a90ff3862eddafd20c3333d50f0edb45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3a569657468b6f3fb60587e48356fe512c1754ca05a564f11366ac9e306526"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8eab883b3b2a38cc1e050819ef06a7e6344d4a990d24d45bc6f2cf959045a45b"}, - {file = "greenlet-2.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acd2162a36d3de67ee896c43effcd5ee3de247eb00354db411feb025aa319857"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0bf60faf0bc2468089bdc5edd10555bab6e85152191df713e2ab1fcc86382b5a"}, - {file = "greenlet-2.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b0ef99cdbe2b682b9ccbb964743a6aca37905fda5e0452e5ee239b1654d37f2a"}, - {file = "greenlet-2.0.2-cp38-cp38-win32.whl", hash = "sha256:b80f600eddddce72320dbbc8e3784d16bd3fb7b517e82476d8da921f27d4b249"}, - {file = "greenlet-2.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:4d2e11331fc0c02b6e84b0d28ece3a36e0548ee1a1ce9ddde03752d9b79bba40"}, - {file = "greenlet-2.0.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:88d9ab96491d38a5ab7c56dd7a3cc37d83336ecc564e4e8816dbed12e5aaefc8"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:561091a7be172ab497a3527602d467e2b3fbe75f9e783d8b8ce403fa414f71a6"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:971ce5e14dc5e73715755d0ca2975ac88cfdaefcaab078a284fea6cfabf866df"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be4ed120b52ae4d974aa40215fcdfde9194d63541c7ded40ee12eb4dda57b76b"}, - {file = "greenlet-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94c817e84245513926588caf1152e3b559ff794d505555211ca041f032abbb6b"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1a819eef4b0e0b96bb0d98d797bef17dc1b4a10e8d7446be32d1da33e095dbb8"}, - {file = "greenlet-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7efde645ca1cc441d6dc4b48c0f7101e8d86b54c8530141b09fd31cef5149ec9"}, - {file = "greenlet-2.0.2-cp39-cp39-win32.whl", hash = "sha256:ea9872c80c132f4663822dd2a08d404073a5a9b5ba6155bea72fb2a79d1093b5"}, - {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, - {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, +python-versions = ">=3.7" +files = [ + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, ] [package.extras] -docs = ["Sphinx", "docutils (<0.18)"] +docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] [[package]] @@ -1152,34 +1277,45 @@ box2d = ["box2d-py (>=2.3.5,<2.4.0)"] mujoco = ["imageio", "mujoco_py (>=1.50,<2.0)"] robotics = ["imageio", "mujoco_py (>=1.50,<2.0)"] +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + [[package]] name = "h5py" -version = "3.9.0" +version = "3.11.0" description = "Read and write HDF5 files from Python" optional = false python-versions = ">=3.8" files = [ - {file = "h5py-3.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eb7bdd5e601dd1739698af383be03f3dad0465fe67184ebd5afca770f50df9d6"}, - {file = "h5py-3.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:78e44686334cbbf2dd21d9df15823bc38663f27a3061f6a032c68a3e30c47bf7"}, - {file = "h5py-3.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f68b41efd110ce9af1cbe6fa8af9f4dcbadace6db972d30828b911949e28fadd"}, - {file = "h5py-3.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12aa556d540f11a2cae53ea7cfb94017353bd271fb3962e1296b342f6550d1b8"}, - {file = "h5py-3.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:d97409e17915798029e297a84124705c8080da901307ea58f29234e09b073ddc"}, - {file = "h5py-3.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:551e358db05a874a0f827b22e95b30092f2303edc4b91bb62ad2f10e0236e1a0"}, - {file = "h5py-3.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6822a814b9d8b8363ff102f76ea8d026f0ca25850bb579d85376029ee3e73b93"}, - {file = "h5py-3.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54f01202cdea754ab4227dd27014bdbd561a4bbe4b631424fd812f7c2ce9c6ac"}, - {file = "h5py-3.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64acceaf6aff92af091a4b83f6dee3cf8d3061f924a6bb3a33eb6c4658a8348b"}, - {file = "h5py-3.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:804c7fb42a34c8ab3a3001901c977a5c24d2e9c586a0f3e7c0a389130b4276fc"}, - {file = "h5py-3.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d9492391ff5c3c80ec30ae2fe82a3f0efd1e750833739c25b0d090e3be1b095"}, - {file = "h5py-3.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9da9e7e63376c32704e37ad4cea2dceae6964cee0d8515185b3ab9cbd6b947bc"}, - {file = "h5py-3.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4e20897c88759cbcbd38fb45b507adc91af3e0f67722aa302d71f02dd44d286"}, - {file = "h5py-3.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbf5225543ca35ce9f61c950b73899a82be7ba60d58340e76d0bd42bf659235a"}, - {file = "h5py-3.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:36408f8c62f50007d14e000f9f3acf77e103b9e932c114cbe52a3089e50ebf94"}, - {file = "h5py-3.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:23e74b878bbe1653ab34ca49b83cac85529cd0b36b9d625516c5830cc5ca2eac"}, - {file = "h5py-3.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f457089c5d524b7998e3649bc63240679b8fb0a3859ea53bbb06841f3d755f1"}, - {file = "h5py-3.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6284061f3214335e1eec883a6ee497dbe7a79f19e6a57fed2dd1f03acd5a8cb"}, - {file = "h5py-3.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7a745efd0d56076999b52e8da5fad5d30823bac98b59c68ae75588d09991a"}, - {file = "h5py-3.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:79bbca34696c6f9eeeb36a91776070c49a060b2879828e2c8fa6c58b8ed10dd1"}, - {file = "h5py-3.9.0.tar.gz", hash = "sha256:e604db6521c1e367c6bd7fad239c847f53cc46646f2d2651372d05ae5e95f817"}, + {file = "h5py-3.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1625fd24ad6cfc9c1ccd44a66dac2396e7ee74940776792772819fc69f3a3731"}, + {file = "h5py-3.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c072655ad1d5fe9ef462445d3e77a8166cbfa5e599045f8aa3c19b75315f10e5"}, + {file = "h5py-3.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77b19a40788e3e362b54af4dcf9e6fde59ca016db2c61360aa30b47c7b7cef00"}, + {file = "h5py-3.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef4e2f338fc763f50a8113890f455e1a70acd42a4d083370ceb80c463d803972"}, + {file = "h5py-3.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bbd732a08187a9e2a6ecf9e8af713f1d68256ee0f7c8b652a32795670fb481ba"}, + {file = "h5py-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75bd7b3d93fbeee40860fd70cdc88df4464e06b70a5ad9ce1446f5f32eb84007"}, + {file = "h5py-3.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52c416f8eb0daae39dabe71415cb531f95dce2d81e1f61a74537a50c63b28ab3"}, + {file = "h5py-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:083e0329ae534a264940d6513f47f5ada617da536d8dccbafc3026aefc33c90e"}, + {file = "h5py-3.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a76cae64080210389a571c7d13c94a1a6cf8cb75153044fd1f822a962c97aeab"}, + {file = "h5py-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3736fe21da2b7d8a13fe8fe415f1272d2a1ccdeff4849c1421d2fb30fd533bc"}, + {file = "h5py-3.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6ae84a14103e8dc19266ef4c3e5d7c00b68f21d07f2966f0ca7bdb6c2761fb"}, + {file = "h5py-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:21dbdc5343f53b2e25404673c4f00a3335aef25521bd5fa8c707ec3833934892"}, + {file = "h5py-3.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:754c0c2e373d13d6309f408325343b642eb0f40f1a6ad21779cfa9502209e150"}, + {file = "h5py-3.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:731839240c59ba219d4cb3bc5880d438248533366f102402cfa0621b71796b62"}, + {file = "h5py-3.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ec9df3dd2018904c4cc06331951e274f3f3fd091e6d6cc350aaa90fa9b42a76"}, + {file = "h5py-3.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:55106b04e2c83dfb73dc8732e9abad69d83a436b5b82b773481d95d17b9685e1"}, + {file = "h5py-3.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f4e025e852754ca833401777c25888acb96889ee2c27e7e629a19aee288833f0"}, + {file = "h5py-3.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c4b760082626120031d7902cd983d8c1f424cdba2809f1067511ef283629d4b"}, + {file = "h5py-3.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67462d0669f8f5459529de179f7771bd697389fcb3faab54d63bf788599a48ea"}, + {file = "h5py-3.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:d9c944d364688f827dc889cf83f1fca311caf4fa50b19f009d1f2b525edd33a3"}, + {file = "h5py-3.11.0.tar.gz", hash = "sha256:7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9"}, ] [package.dependencies] @@ -1187,29 +1323,78 @@ numpy = ">=1.17.3" [[package]] name = "holidays" -version = "0.29" +version = "0.57" description = "Generate and work with holidays in Python" optional = false python-versions = ">=3.8" files = [ - {file = "holidays-0.29-py3-none-any.whl", hash = "sha256:0965f763172b7bf4931e6378b93bae77a2c8bd112ce4c6b483b832a80498ab39"}, - {file = "holidays-0.29.tar.gz", hash = "sha256:e8219df1570dd92f17244ff7da93f57630b0dd2fedf86e86b4110f07825b0a67"}, + {file = "holidays-0.57-py3-none-any.whl", hash = "sha256:bdfb2a6d58e4b7d819e049b469228e890a5ad42b8ea2bd2c150d8c10726ea82d"}, + {file = "holidays-0.57.tar.gz", hash = "sha256:3f655f7ec290631a984beb0205120848b3e67c4ed0f3854321e3e437eca69d70"}, ] [package.dependencies] python-dateutil = "*" +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + +[[package]] +name = "httpx" +version = "0.27.2" +description = "The next generation HTTP client." +optional = false +python-versions = ">=3.8" +files = [ + {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, + {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, +] + +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +zstd = ["zstandard (>=0.18.0)"] + [[package]] name = "idna" -version = "3.4" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "imagesize" version = "1.4.1" @@ -1223,87 +1408,96 @@ files = [ [[package]] name = "implicit" -version = "0.7.0" +version = "0.7.2" description = "Collaborative Filtering for Implicit Feedback Datasets" optional = false python-versions = "*" files = [ - {file = "implicit-0.7.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6d3c28c99d6592ab483a194a4065c8b4b18e8db9e645ee06e4239b5d2dc3d6d1"}, - {file = "implicit-0.7.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:69a68282f3ba1e6becd68bfd9ba5a4478985c107379f240da2f30d57c3168c7a"}, - {file = "implicit-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4208b08455c7d6985602d604ac4dbcbbb117e3814ad17de00442138d029eb652"}, - {file = "implicit-0.7.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9a50c2843475fff0b4360552b6e2655fcbf3e7c3f2d57ccd65bca6dae5c23072"}, - {file = "implicit-0.7.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:7600d7037e74e5c5d2931dbac0d026d7ca415c4ac6bef3f53d7dcd2ee2bd22e7"}, - {file = "implicit-0.7.0-cp310-cp310-win_amd64.whl", hash = "sha256:6d9a373958678a89eaf1a0127272c60b103be295aa49747cf7246c37de3dab8d"}, - {file = "implicit-0.7.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:751fe9fd4ea8889def7de16e6d7db81236d11206d9b009013bb9b054e6464bf9"}, - {file = "implicit-0.7.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9cdb73257857fb19589be238e785d7ee40f20f191b6721fa219b0229318a7ae2"}, - {file = "implicit-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aac330a3e8c84a794542f2c6229875808f07e52dddfffd4970c98856399c577d"}, - {file = "implicit-0.7.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:04a72ab07383e4c863bd22e0704670b9dfe678c644fd50d81f9efa38d0ea7ed0"}, - {file = "implicit-0.7.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:546b6b7db669be01f1f81531396ad05faffe0677259a734ca17cfae05c49f876"}, - {file = "implicit-0.7.0-cp311-cp311-win_amd64.whl", hash = "sha256:a3080525700479ac8248ace9e4c1c07ffc39c4949afa699288c88f1a57cb60c0"}, - {file = "implicit-0.7.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ff305fadcc027b4be3870f37abfda71a183825e7cfff2d1cfd1e7c3b86d7c115"}, - {file = "implicit-0.7.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:096f4f21602a599675700b227203dc9ddc0d0e23450a0951149a0a01ad97e004"}, - {file = "implicit-0.7.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0f6ca2a96c3c720b158084d1b1052b3ecdf83ddc1abaa574949bc611408fc117"}, - {file = "implicit-0.7.0-cp36-cp36m-win_amd64.whl", hash = "sha256:8c01d03812d93618dd57964275ecc717dc77e3f99312036db3f2fc36a72af2ba"}, - {file = "implicit-0.7.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d97619663bfc25ae8e3114ada7b1d924ea54f624eb6dbef81ecc287a08571738"}, - {file = "implicit-0.7.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cc73b1a122d12f6aa7bf2e1b8bf703eddf0f2d2bbaaec9c47b90ec74b16cedbd"}, - {file = "implicit-0.7.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:1cdfff8dfb33b879a5076a18da9e1acae9ca7e5c48717de170c8714e45b13eac"}, - {file = "implicit-0.7.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1589a3afc4750e6582b8ede548c3dfc4f9001f62fdbdca11717b310b412f9727"}, - {file = "implicit-0.7.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4868cc899711011533a8a719e61a3e8a8c009b729a893ed0cd4efc8e4d364cd1"}, - {file = "implicit-0.7.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6f23ca4418cd963290f1d2177dd9e44f0ca7bd0fa108b11a225fd041ee82c662"}, - {file = "implicit-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7eab9459cf892c65215658314586dd0cbaf492bb81b144ee1b702de1cf751ca9"}, - {file = "implicit-0.7.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:c74b174f7b4974ff36775598a9e5a5a414a4778324fbb2771c433f7a59df2193"}, - {file = "implicit-0.7.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:b5101ab83e3de2e943e778d7877161bacc74c0db97fd2adb17e54aa205c0468b"}, - {file = "implicit-0.7.0-cp38-cp38-win_amd64.whl", hash = "sha256:641edfe41fea43218d0910694d7bc80fc9dc3204962d566dccd64d3447bf3b53"}, - {file = "implicit-0.7.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:217e01471afd778a9fa9d00c9b80f902b677009f61aab74fc561fe4f2c43adf9"}, - {file = "implicit-0.7.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2f2dd8f65074108078e82c40a211312d85208ab33be835063582effcb4ac0d47"}, - {file = "implicit-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb22859746f7617fb7ef625f0cf8da7829e63c4cc93c2aff6b21149f7bc6748b"}, - {file = "implicit-0.7.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d2802064ab99e04007f8f3e818b04ec2ef2e3120e06e9c4eff021e907fad221f"}, - {file = "implicit-0.7.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ad99e3a2aa4aa02274a3af19cd0baa10559a6e6fa69f90a602e5cc8737ec8cf1"}, - {file = "implicit-0.7.0-cp39-cp39-win_amd64.whl", hash = "sha256:dee707097619cd8371675af5584c1baf4ea77fd749ed4619e68e5c719cbac64d"}, - {file = "implicit-0.7.0.tar.gz", hash = "sha256:e7bcf0c267404f0e579f268515174e981996bb268106c5be869d312bf48ab72e"}, + {file = "implicit-0.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a6cce64d839272b3ae0c7e9799ee326ee0cb7da9d69b1de7205ef1139379ff22"}, + {file = "implicit-0.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3209629ba593e5e1365cde1e5ffa57a62bca6ca99eda9b1e464a70eea91632b"}, + {file = "implicit-0.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f08f9c15dd7724368aad47458c77f888385dec5a69221432e50b689996a6455f"}, + {file = "implicit-0.7.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9a243c0a9d22bd902dcc0cd0622fbed05c020613bf272934498cf88cf187a1be"}, + {file = "implicit-0.7.2-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:32d3ad57a4217ed50e3d126ce3782b2f27d0a1ed9fcbb71a7ccf5cfebc96430d"}, + {file = "implicit-0.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4ee10107ba7a2745d5166e17f9202f5b73e7b362ac248229e16be8819cde49c"}, + {file = "implicit-0.7.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3cc71e673fad6a76a3f6f2b1361e4b01f80ded61e1ca41ceb3c4e8d265ceb5f0"}, + {file = "implicit-0.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db359d570729e72cda15f5eae98f93427f567cd20a28cb47732196e66c74a32c"}, + {file = "implicit-0.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0bfff5e332d73cfc5896beb1ab09e0aef1c0c28713a2799b978290757b536af9"}, + {file = "implicit-0.7.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:3d8f61d1783630e7a894cf53a1e4f0a56b73e7218776dc8fe03e3e6c1d85da72"}, + {file = "implicit-0.7.2-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:1f161c97d455b710e6d68937e87ecd22ff212bc6e22dc57748b76c6ade42abc2"}, + {file = "implicit-0.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:ff779f25d71c5cab26403b732e358ed813adaa04ecc08ac5b3e3ed781e565f51"}, + {file = "implicit-0.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:335925bf728579ba729d60570b223713312a725ad647d000e0773f25bcf2f5a5"}, + {file = "implicit-0.7.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:cb4b78ff885ca21d8d443f31f6e28bba0a67a640f7682cc9996c0c1cc2e585cc"}, + {file = "implicit-0.7.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:60bfb1bc1c6d3f219db11e20537e5b7108dbb1f7daaf8677e1ba3ccff643f497"}, + {file = "implicit-0.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:7f6785ad869f1db2ac3e37e2195e3e733900e21aa2a55a9d580e2b4b00016382"}, + {file = "implicit-0.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3f6b93dbf377875c2aeccac52239b0ff2db987821b0fb29e0f1efd95474aeab4"}, + {file = "implicit-0.7.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:0ecb6fcf2581a47f0fbaf50cf412c377684670e09c0a6764dc2fc112b7bfa4af"}, + {file = "implicit-0.7.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:1c755cb0e6ac69b44c8215a80ba7c5c132f2767453078b573e3d18900220aa57"}, + {file = "implicit-0.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b615b1d037a4175ba3640fb9fa446811861d80b3b9a01f54957816464c31066c"}, + {file = "implicit-0.7.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c9519fdb8a1a06b201b7c55dfa51d6a0f00ff55223600b1484fcacd8d248a47a"}, + {file = "implicit-0.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f533cb8e42f80ed5457a287d0c3ae5b7789c2ea098519eecee58c45adcb4c3d7"}, + {file = "implicit-0.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c2805ceea609dddb0ecd6f948f1dabd48bd9c47edffd3ff50584a4248a66c719"}, + {file = "implicit-0.7.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:6dab0506685dd23c27e648337f86875272dd8341400c3ff306fa99fe3f049bdf"}, + {file = "implicit-0.7.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:2e7ac1e9df353729a1a45daa5417d417b748242e6271b423e384bc6b6216747b"}, + {file = "implicit-0.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:3d5e87f4051655bd5eb489dad28df737a21141b62a330266ea406bbe11693404"}, + {file = "implicit-0.7.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:61f7048d0f1b2579796ccc25bb79ad3517a52c60252fd6e18572f75f0a506b70"}, + {file = "implicit-0.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ab28f9fe3d90d1461694c33eb2741e8f5446737561786cc118ca92fe51d7ffe7"}, + {file = "implicit-0.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:67e08aaf57e5072b9fe17218e2dad6b11369f1ad4ac732dc13ded76228a50970"}, + {file = "implicit-0.7.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:6a9058d5b2c1e19de344d4fc0b031504bc6be0fe7f7f5c91f11db66c28727894"}, + {file = "implicit-0.7.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd10b250c53c7917b77b883b1cd0a1f94368115521816338995a32112eab8321"}, + {file = "implicit-0.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:0c909fa69ef743ac82be788e3b9708636540dae3677f692c9275f5bf8307adf0"}, + {file = "implicit-0.7.2.tar.gz", hash = "sha256:bacf79120c87ad0744a4365a089409fddd33231880aef4a495bab2d4f888291d"}, ] [package.dependencies] -numpy = "*" +numpy = ">=1.17.0" scipy = ">=0.16" +threadpoolctl = "*" tqdm = ">=4.27" [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "8.5.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-8.5.0-py3-none-any.whl", hash = "sha256:45e54197d28b7a7f1559e60b95e7c567032b602131fbd588f1497f47880aa68b"}, + {file = "importlib_metadata-8.5.0.tar.gz", hash = "sha256:71522656f0abace1d072b9e5481a48f07c138e00f079c38c8f883823f9c26bd7"}, ] [package.dependencies] -zipp = ">=0.5" +zipp = ">=3.20" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-perf (>=0.9.2)"] +type = ["pytest-mypy"] [[package]] name = "importlib-resources" -version = "6.0.0" +version = "6.4.5" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.0.0-py3-none-any.whl", hash = "sha256:d952faee11004c045f785bb5636e8f885bed30dc3c940d5d42798a2a4541c185"}, - {file = "importlib_resources-6.0.0.tar.gz", hash = "sha256:4cf94875a8368bd89531a756df9a9ebe1f150e0f885030b461237bc7f2d905f2"}, + {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, + {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] +type = ["pytest-mypy"] [[package]] name = "iniconfig" @@ -1318,13 +1512,13 @@ files = [ [[package]] name = "ipykernel" -version = "6.25.0" +version = "6.29.5" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.25.0-py3-none-any.whl", hash = "sha256:f0042e867ac3f6bca1679e6a88cbd6a58ed93a44f9d0866aecde6efe8de76659"}, - {file = "ipykernel-6.25.0.tar.gz", hash = "sha256:e342ce84712861be4b248c4a73472be4702c1b0dd77448bfd6bcfb3af9d5ddf9"}, + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, ] [package.dependencies] @@ -1338,7 +1532,7 @@ matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" psutil = "*" -pyzmq = ">=20" +pyzmq = ">=24" tornado = ">=6.1" traitlets = ">=5.4.0" @@ -1347,17 +1541,17 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipython" -version = "8.12.2" +version = "8.12.3" description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.8" files = [ - {file = "ipython-8.12.2-py3-none-any.whl", hash = "sha256:ea8801f15dfe4ffb76dea1b09b847430ffd70d827b41735c64a0638a04103bfc"}, - {file = "ipython-8.12.2.tar.gz", hash = "sha256:c7b80eb7f5a855a88efc971fda506ff7a91c280b42cdae26643e0f601ea281ea"}, + {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, + {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, ] [package.dependencies] @@ -1388,34 +1582,23 @@ qtconsole = ["qtconsole"] test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] -[[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" -optional = false -python-versions = "*" -files = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -] - [[package]] name = "ipywidgets" -version = "8.1.0" +version = "8.1.5" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.1.0-py3-none-any.whl", hash = "sha256:6c8396cc7b8c95dfb4e9ab0054f48c002f045e7e5d7ae523f559d64e525a98ab"}, - {file = "ipywidgets-8.1.0.tar.gz", hash = "sha256:ce97dd90525b3066fd00094690964e7eac14cf9b7745d35565b5eeac20cce687"}, + {file = "ipywidgets-8.1.5-py3-none-any.whl", hash = "sha256:3290f526f87ae6e77655555baba4f36681c555b8bdbbff430b70e52c34c86245"}, + {file = "ipywidgets-8.1.5.tar.gz", hash = "sha256:870e43b1a35656a80c18c9503bbf2d16802db1cb487eec6fab27d683381dde17"}, ] [package.dependencies] comm = ">=0.1.3" ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.7,<3.1.0" +jupyterlab-widgets = ">=3.0.12,<3.1.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.7,<4.1.0" +widgetsnbextension = ">=4.0.12,<4.1.0" [package.extras] test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] @@ -1434,15 +1617,29 @@ files = [ [package.dependencies] arrow = ">=0.15.0" +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[package.extras] +colors = ["colorama (>=0.4.6)"] + [[package]] name = "jedi" -version = "0.19.0" +version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.0-py2.py3-none-any.whl", hash = "sha256:cb8ce23fbccff0025e9386b5cf85e892f94c9b822378f8da49970471335ac64e"}, - {file = "jedi-0.19.0.tar.gz", hash = "sha256:bcf9894f1753969cbac8022a8c2eaee06bfa3724e4192470aaffe7eb6272b0c4"}, + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, ] [package.dependencies] @@ -1451,17 +1648,17 @@ parso = ">=0.8.3,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.4" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, ] [package.dependencies] @@ -1472,13 +1669,13 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.3.1" +version = "1.4.2" description = "Lightweight pipelining with Python functions" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, - {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, + {file = "joblib-1.4.2-py3-none-any.whl", hash = "sha256:06d478d5674cbc267e7496a410ee875abd68e4340feff4490bcb7afb88060ae6"}, + {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] [[package]] @@ -1493,38 +1690,35 @@ files = [ [[package]] name = "json5" -version = "0.9.14" +version = "0.9.25" description = "A Python implementation of the JSON5 data format." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, - {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, + {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, + {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, ] -[package.extras] -dev = ["hypothesis"] - [[package]] name = "jsonpointer" -version = "2.4" +version = "3.0.0" description = "Identify specific nodes in a JSON document (RFC 6901)" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +python-versions = ">=3.7" files = [ - {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, - {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, ] [[package]] name = "jsonschema" -version = "4.18.4" +version = "4.23.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema-4.18.4-py3-none-any.whl", hash = "sha256:971be834317c22daaa9132340a51c01b50910724082c2c1a2ac87eeec153a3fe"}, - {file = "jsonschema-4.18.4.tar.gz", hash = "sha256:fb3642735399fa958c0d2aad7057901554596c63349f4f6b283c493cf692a25d"}, + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, ] [package.dependencies] @@ -1541,56 +1735,55 @@ rfc3339-validator = {version = "*", optional = true, markers = "extra == \"forma rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} rpds-py = ">=0.7.1" uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} -webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} [package.extras] format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] [[package]] name = "jsonschema-specifications" -version = "2023.7.1" +version = "2023.12.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.8" files = [ - {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, - {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, ] [package.dependencies] importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} -referencing = ">=0.28.0" +referencing = ">=0.31.0" [[package]] name = "jupyter" -version = "1.0.0" +version = "1.1.1" description = "Jupyter metapackage. Install all the Jupyter components in one go." optional = false python-versions = "*" files = [ - {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, - {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, - {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, + {file = "jupyter-1.1.1-py2.py3-none-any.whl", hash = "sha256:7a59533c22af65439b24bbe60373a4e95af8f16ac65a6c00820ad378e3f7cc83"}, + {file = "jupyter-1.1.1.tar.gz", hash = "sha256:d55467bceabdea49d7e3624af7e33d59c37fff53ed3a350e1ac957bed731de7a"}, ] [package.dependencies] ipykernel = "*" ipywidgets = "*" jupyter-console = "*" +jupyterlab = "*" nbconvert = "*" notebook = "*" -qtconsole = "*" [[package]] name = "jupyter-client" -version = "8.3.0" +version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.3.0-py3-none-any.whl", hash = "sha256:7441af0c0672edc5d28035e92ba5e32fadcfa8a4e608a434c228836a89df6158"}, - {file = "jupyter_client-8.3.0.tar.gz", hash = "sha256:3af69921fe99617be1670399a0b857ad67275eefcfa291e2c81a160b7b650f5f"}, + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, ] [package.dependencies] @@ -1603,7 +1796,7 @@ traitlets = ">=5.3" [package.extras] docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] [[package]] name = "jupyter-console" @@ -1631,13 +1824,13 @@ test = ["flaky", "pexpect", "pytest"] [[package]] name = "jupyter-core" -version = "5.3.1" +version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, - {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, ] [package.dependencies] @@ -1646,18 +1839,18 @@ pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_ traitlets = ">=5.3" [package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-events" -version = "0.7.0" +version = "0.10.0" description = "Jupyter Event System library" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_events-0.7.0-py3-none-any.whl", hash = "sha256:4753da434c13a37c3f3c89b500afa0c0a6241633441421f6adafe2fb2e2b924e"}, - {file = "jupyter_events-0.7.0.tar.gz", hash = "sha256:7be27f54b8388c03eefea123a4f79247c5b9381c49fb1cd48615ee191eb12615"}, + {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, + {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, ] [package.dependencies] @@ -1676,13 +1869,13 @@ test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "p [[package]] name = "jupyter-lsp" -version = "2.2.0" +version = "2.2.5" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter-lsp-2.2.0.tar.gz", hash = "sha256:8ebbcb533adb41e5d635eb8fe82956b0aafbf0fd443b6c4bfa906edeeb8635a1"}, - {file = "jupyter_lsp-2.2.0-py3-none-any.whl", hash = "sha256:9e06b8b4f7dd50300b70dd1a78c0c3b0c3d8fa68e0f2d8a5d1fbab62072aca3f"}, + {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, + {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, ] [package.dependencies] @@ -1691,13 +1884,13 @@ jupyter-server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.7.0" +version = "2.13.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server-2.7.0-py3-none-any.whl", hash = "sha256:6a77912aff643e53fa14bdb2634884b52b784a4be77ce8e93f7283faed0f0849"}, - {file = "jupyter_server-2.7.0.tar.gz", hash = "sha256:36da0a266d31a41ac335a366c88933c17dfa5bb817a48f5c02c16d303bc9477f"}, + {file = "jupyter_server-2.13.0-py3-none-any.whl", hash = "sha256:77b2b49c3831fbbfbdb5048cef4350d12946191f833a24e5f83e5f8f4803e97b"}, + {file = "jupyter_server-2.13.0.tar.gz", hash = "sha256:c80bfb049ea20053c3d9641c2add4848b38073bf79f1729cea1faed32fc1c78e"}, ] [package.dependencies] @@ -1706,7 +1899,7 @@ argon2-cffi = "*" jinja2 = "*" jupyter-client = ">=7.4.4" jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -jupyter-events = ">=0.6.0" +jupyter-events = ">=0.9.0" jupyter-server-terminals = "*" nbconvert = ">=6.4.4" nbformat = ">=5.3.0" @@ -1715,7 +1908,7 @@ packaging = "*" prometheus-client = "*" pywinpty = {version = "*", markers = "os_name == \"nt\""} pyzmq = ">=24" -send2trash = "*" +send2trash = ">=1.8.2" terminado = ">=0.8.3" tornado = ">=6.2.0" traitlets = ">=5.6.0" @@ -1723,17 +1916,17 @@ websocket-client = "*" [package.extras] docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] -test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] [[package]] name = "jupyter-server-terminals" -version = "0.4.4" +version = "0.5.3" description = "A Jupyter Server Extension Providing Terminals." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_server_terminals-0.4.4-py3-none-any.whl", hash = "sha256:75779164661cec02a8758a5311e18bb8eb70c4e86c6b699403100f1585a12a36"}, - {file = "jupyter_server_terminals-0.4.4.tar.gz", hash = "sha256:57ab779797c25a7ba68e97bcfb5d7740f2b5e8a83b5e8102b10438041a7eac5d"}, + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, ] [package.dependencies] @@ -1741,62 +1934,65 @@ pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} terminado = ">=0.8.3" [package.extras] -docs = ["jinja2", "jupyter-server", "mistune (<3.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] -test = ["coverage", "jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-cov", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] [[package]] name = "jupyterlab" -version = "4.0.3" +version = "4.2.5" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.0.3-py3-none-any.whl", hash = "sha256:d369944391b1d15f2d1f3cb965fb67352956279b2ae6f03ce7947a43940a8301"}, - {file = "jupyterlab-4.0.3.tar.gz", hash = "sha256:e14d1ce46a613028111d0d476a1d7d6b094003b7462bac669f5b478317abcb39"}, + {file = "jupyterlab-4.2.5-py3-none-any.whl", hash = "sha256:73b6e0775d41a9fee7ee756c80f58a6bed4040869ccc21411dc559818874d321"}, + {file = "jupyterlab-4.2.5.tar.gz", hash = "sha256:ae7f3a1b8cb88b4f55009ce79fa7c06f99d70cd63601ee4aa91815d054f46f75"}, ] [package.dependencies] async-lru = ">=1.0.0" +httpx = ">=0.25.0" importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} importlib-resources = {version = ">=1.4", markers = "python_version < \"3.9\""} -ipykernel = "*" +ipykernel = ">=6.5.0" jinja2 = ">=3.0.3" jupyter-core = "*" jupyter-lsp = ">=2.0.0" jupyter-server = ">=2.4.0,<3" -jupyterlab-server = ">=2.19.0,<3" +jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2" packaging = "*" -tomli = {version = "*", markers = "python_version < \"3.11\""} +setuptools = ">=40.1.0" +tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["black[jupyter] (==23.3.0)", "build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.0.271)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.3.5)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.3.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.2)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.1.post2)", "matplotlib (==3.8.3)", "nbconvert (>=7.0.0)", "pandas (==2.2.1)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] [[package]] name = "jupyterlab-pygments" -version = "0.2.2" +version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, - {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, ] [[package]] name = "jupyterlab-server" -version = "2.24.0" +version = "2.27.3" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyterlab_server-2.24.0-py3-none-any.whl", hash = "sha256:5f077e142bb8dc9b843d960f940c513581bceca3793a0d80f9c67d9522c4e876"}, - {file = "jupyterlab_server-2.24.0.tar.gz", hash = "sha256:4e6f99e0a5579bbbc32e449c4dbb039561d4f1a7827d5733273ed56738f21f07"}, + {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, + {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, ] [package.dependencies] @@ -1804,118 +2000,164 @@ babel = ">=2.10" importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} jinja2 = ">=3.0.3" json5 = ">=0.9.0" -jsonschema = ">=4.17.3" +jsonschema = ">=4.18.0" jupyter-server = ">=1.21,<3" packaging = ">=21.3" -requests = ">=2.28" +requests = ">=2.31" [package.extras] docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] -openapi = ["openapi-core (>=0.16.1,<0.17.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-validator (>=0.5.1,<0.7.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] [[package]] name = "jupyterlab-widgets" -version = "3.0.8" +version = "3.0.13" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_widgets-3.0.8-py3-none-any.whl", hash = "sha256:4715912d6ceab839c9db35953c764b3214ebbc9161c809f6e0510168845dfdf5"}, - {file = "jupyterlab_widgets-3.0.8.tar.gz", hash = "sha256:d428ab97b8d87cc7c54cbf37644d6e0f0e662f23876e05fa460a73ec3257252a"}, + {file = "jupyterlab_widgets-3.0.13-py3-none-any.whl", hash = "sha256:e3cda2c233ce144192f1e29914ad522b2f4c40e77214b0cc97377ca3d323db54"}, + {file = "jupyterlab_widgets-3.0.13.tar.gz", hash = "sha256:a2966d385328c1942b683a8cd96b89b8dd82c8b8f81dda902bb2bc06d46f5bed"}, ] [[package]] name = "kiwisolver" -version = "1.4.4" +version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, ] [[package]] name = "lightautoml" -version = "0.3.6" +version = "0.3.3" description = "Fast and customizable framework for automatic ML model creation (AutoML)" optional = false python-versions = ">=3.6.1,<3.10" files = [ - {file = "LightAutoML-0.3.6-py3-none-any.whl", hash = "sha256:ea40e33b89a8ea9b723259a96c257a1437e31dfccea17021ad6290e6495cee3f"}, - {file = "LightAutoML-0.3.6.tar.gz", hash = "sha256:5a49fc71120a79c2d1216ebf133977cf95b4c93a3c16a6defee905e8eb7be124"}, + {file = "LightAutoML-0.3.3-py3-none-any.whl", hash = "sha256:76cee3befb1bda7853bd7f2531d2c6c30a75dc4275b632f4986481c535868bae"}, + {file = "LightAutoML-0.3.3.tar.gz", hash = "sha256:5b7500a2075b812f819555ac8e95244d5a01709dc502e2236a8cf6722ee2f05e"}, ] [package.dependencies] autowoe = ">=1.2" -catboost = ">=0.26.1" +catboost = "*" cmaes = "*" dataclasses = "0.6" holidays = "*" @@ -1924,22 +2166,21 @@ joblib = "*" json2html = "*" lightgbm = ">=2.3,<3.0" networkx = "*" -numpy = {version = ">=1.2", markers = "python_version >= \"3.7\""} +numpy = {version = ">=1.20.0", markers = "python_version >= \"3.7\""} optuna = "*" -pandas = "1.1.5" +pandas = ">=1" poetry-core = ">=1.0.0,<2.0.0" pyyaml = "*" scikit-learn = ">=0.22" -scipy = "<=1.5.4" +scipy = "*" seaborn = "*" torch = "<1.9" torchvision = "*" tqdm = "*" [package.extras] -afg = ["featuretools"] -all = ["PyWavelets", "albumentations (==1.0.3)", "cffi (>=1.14.5,<2.0.0)", "efficientnet-pytorch", "featuretools", "gensim (>=4)", "nltk", "opencv-python (==4.5.2.52)", "scikit-image (>=0.17,<0.18)", "torchvision (==0.8.0)", "transformers (>=4)", "weasyprint (>=52.5,<53.0)"] -cv = ["PyWavelets", "albumentations (==1.0.3)", "efficientnet-pytorch", "opencv-python (==4.5.2.52)", "scikit-image (>=0.17,<0.18)", "torchvision (==0.8.0)"] +all = ["PyWavelets", "albumentations (>=0.4.6)", "cffi (>=1.14.5,<2.0.0)", "efficientnet-pytorch", "gensim (>=4)", "nltk", "opencv-python (==4.5.2.52)", "scikit-image", "torchvision (==0.8.0)", "transformers (>=4)", "weasyprint (>=52.5,<53.0)"] +cv = ["PyWavelets", "albumentations (>=0.4.6)", "efficientnet-pytorch", "opencv-python (==4.5.2.52)", "scikit-image", "torchvision (==0.8.0)"] nlp = ["gensim (>=4)", "nltk", "transformers (>=4)"] report = ["cffi (>=1.14.5,<2.0.0)", "weasyprint (>=52.5,<53.0)"] @@ -1949,9 +2190,8 @@ version = "1.17" description = "LightFM recommendation model" optional = false python-versions = "*" -files = [ - {file = "lightfm-1.17.tar.gz", hash = "sha256:2b77ada182ccd768a8d7643ab3cfcd8b6e855db09087f7cc7329bd63316697a8"}, -] +files = [] +develop = false [package.dependencies] numpy = "*" @@ -1959,6 +2199,12 @@ requests = "*" scikit-learn = "*" scipy = ">=0.17.0" +[package.source] +type = "git" +url = "https://github.com/lyst/lightfm" +reference = "0c9c31e" +resolved_reference = "0c9c31e027b976beab2385e268b58010fff46096" + [[package]] name = "lightgbm" version = "2.3.1" @@ -1977,48 +2223,69 @@ numpy = "*" scikit-learn = "*" scipy = "*" +[[package]] +name = "lightning-utilities" +version = "0.11.7" +description = "Lightning toolbox for across the our ecosystem." +optional = false +python-versions = ">=3.8" +files = [ + {file = "lightning_utilities-0.11.7-py3-none-any.whl", hash = "sha256:84eebbc700edbfaa6c005458fc911a7fe7f99f02970b00cb322b4d2767deba98"}, + {file = "lightning_utilities-0.11.7.tar.gz", hash = "sha256:7e8458a9f0bfb51ffe6c5ab3957aa37b2792fe8281dd9f1b66aa513a558ec4ce"}, +] + +[package.dependencies] +packaging = ">=17.1" +setuptools = "*" +typing-extensions = "*" + +[package.extras] +cli = ["fire"] +docs = ["requests (>=2.0.0)"] +typing = ["mypy (>=1.0.0)", "types-setuptools"] + [[package]] name = "llvmlite" -version = "0.40.1" +version = "0.41.1" description = "lightweight wrapper around basic LLVM functionality" optional = false python-versions = ">=3.8" files = [ - {file = "llvmlite-0.40.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ce9b1c7a59936382ffde7871978cddcda14098e5a76d961e204523e5c372fb"}, - {file = "llvmlite-0.40.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3673c53cb21c65d2ff3704962b5958e967c6fc0bd0cff772998face199e8d87b"}, - {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba2747cf5b4954e945c287fe310b3fcc484e2a9d1b0c273e99eb17d103bb0e6"}, - {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd5e82cc990e5a3e343a3bf855c26fdfe3bfae55225f00efd01c05bbda79918"}, - {file = "llvmlite-0.40.1-cp310-cp310-win32.whl", hash = "sha256:09f83ea7a54509c285f905d968184bba00fc31ebf12f2b6b1494d677bb7dde9b"}, - {file = "llvmlite-0.40.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b37297f3cbd68d14a97223a30620589d98ad1890e5040c9e5fc181063f4ed49"}, - {file = "llvmlite-0.40.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a66a5bd580951751b4268f4c3bddcef92682814d6bc72f3cd3bb67f335dd7097"}, - {file = "llvmlite-0.40.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:467b43836b388eaedc5a106d76761e388dbc4674b2f2237bc477c6895b15a634"}, - {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c23edd196bd797dc3a7860799054ea3488d2824ecabc03f9135110c2e39fcbc"}, - {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a36d9f244b6680cb90bbca66b146dabb2972f4180c64415c96f7c8a2d8b60a36"}, - {file = "llvmlite-0.40.1-cp311-cp311-win_amd64.whl", hash = "sha256:5b3076dc4e9c107d16dc15ecb7f2faf94f7736cd2d5e9f4dc06287fd672452c1"}, - {file = "llvmlite-0.40.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a7525db121f2e699809b539b5308228854ccab6693ecb01b52c44a2f5647e20"}, - {file = "llvmlite-0.40.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:84747289775d0874e506f907a4513db889471607db19b04de97d144047fec885"}, - {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e35766e42acef0fe7d1c43169a8ffc327a47808fae6a067b049fe0e9bbf84dd5"}, - {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda71de10a1f48416309e408ea83dab5bf36058f83e13b86a2961defed265568"}, - {file = "llvmlite-0.40.1-cp38-cp38-win32.whl", hash = "sha256:96707ebad8b051bbb4fc40c65ef93b7eeee16643bd4d579a14d11578e4b7a647"}, - {file = "llvmlite-0.40.1-cp38-cp38-win_amd64.whl", hash = "sha256:e44f854dc11559795bcdeaf12303759e56213d42dabbf91a5897aa2d8b033810"}, - {file = "llvmlite-0.40.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f643d15aacd0b0b0dc8b74b693822ba3f9a53fa63bc6a178c2dba7cc88f42144"}, - {file = "llvmlite-0.40.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39a0b4d0088c01a469a5860d2e2d7a9b4e6a93c0f07eb26e71a9a872a8cadf8d"}, - {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9329b930d699699846623054121ed105fd0823ed2180906d3b3235d361645490"}, - {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2dbbb8424037ca287983b115a29adf37d806baf7e1bf4a67bd2cffb74e085ed"}, - {file = "llvmlite-0.40.1-cp39-cp39-win32.whl", hash = "sha256:e74e7bec3235a1e1c9ad97d897a620c5007d0ed80c32c84c1d787e7daa17e4ec"}, - {file = "llvmlite-0.40.1-cp39-cp39-win_amd64.whl", hash = "sha256:ff8f31111bb99d135ff296757dc81ab36c2dee54ed4bd429158a96da9807c316"}, - {file = "llvmlite-0.40.1.tar.gz", hash = "sha256:5cdb0d45df602099d833d50bd9e81353a5e036242d3c003c5b294fc61d1986b4"}, + {file = "llvmlite-0.41.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1e1029d47ee66d3a0c4d6088641882f75b93db82bd0e6178f7bd744ebce42b9"}, + {file = "llvmlite-0.41.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:150d0bc275a8ac664a705135e639178883293cf08c1a38de3bbaa2f693a0a867"}, + {file = "llvmlite-0.41.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eee5cf17ec2b4198b509272cf300ee6577229d237c98cc6e63861b08463ddc6"}, + {file = "llvmlite-0.41.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd0338da625346538f1173a17cabf21d1e315cf387ca21b294ff209d176e244"}, + {file = "llvmlite-0.41.1-cp310-cp310-win32.whl", hash = "sha256:fa1469901a2e100c17eb8fe2678e34bd4255a3576d1a543421356e9c14d6e2ae"}, + {file = "llvmlite-0.41.1-cp310-cp310-win_amd64.whl", hash = "sha256:2b76acee82ea0e9304be6be9d4b3840208d050ea0dcad75b1635fa06e949a0ae"}, + {file = "llvmlite-0.41.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:210e458723436b2469d61b54b453474e09e12a94453c97ea3fbb0742ba5a83d8"}, + {file = "llvmlite-0.41.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:855f280e781d49e0640aef4c4af586831ade8f1a6c4df483fb901cbe1a48d127"}, + {file = "llvmlite-0.41.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b67340c62c93a11fae482910dc29163a50dff3dfa88bc874872d28ee604a83be"}, + {file = "llvmlite-0.41.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2181bb63ef3c607e6403813421b46982c3ac6bfc1f11fa16a13eaafb46f578e6"}, + {file = "llvmlite-0.41.1-cp311-cp311-win_amd64.whl", hash = "sha256:9564c19b31a0434f01d2025b06b44c7ed422f51e719ab5d24ff03b7560066c9a"}, + {file = "llvmlite-0.41.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5940bc901fb0325970415dbede82c0b7f3e35c2d5fd1d5e0047134c2c46b3281"}, + {file = "llvmlite-0.41.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8b0a9a47c28f67a269bb62f6256e63cef28d3c5f13cbae4fab587c3ad506778b"}, + {file = "llvmlite-0.41.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8afdfa6da33f0b4226af8e64cfc2b28986e005528fbf944d0a24a72acfc9432"}, + {file = "llvmlite-0.41.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8454c1133ef701e8c050a59edd85d238ee18bb9a0eb95faf2fca8b909ee3c89a"}, + {file = "llvmlite-0.41.1-cp38-cp38-win32.whl", hash = "sha256:2d92c51e6e9394d503033ffe3292f5bef1566ab73029ec853861f60ad5c925d0"}, + {file = "llvmlite-0.41.1-cp38-cp38-win_amd64.whl", hash = "sha256:df75594e5a4702b032684d5481db3af990b69c249ccb1d32687b8501f0689432"}, + {file = "llvmlite-0.41.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04725975e5b2af416d685ea0769f4ecc33f97be541e301054c9f741003085802"}, + {file = "llvmlite-0.41.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bf14aa0eb22b58c231243dccf7e7f42f7beec48970f2549b3a6acc737d1a4ba4"}, + {file = "llvmlite-0.41.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c32356f669e036eb01016e883b22add883c60739bc1ebee3a1cc0249a50828"}, + {file = "llvmlite-0.41.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24091a6b31242bcdd56ae2dbea40007f462260bc9bdf947953acc39dffd54f8f"}, + {file = "llvmlite-0.41.1-cp39-cp39-win32.whl", hash = "sha256:880cb57ca49e862e1cd077104375b9d1dfdc0622596dfa22105f470d7bacb309"}, + {file = "llvmlite-0.41.1-cp39-cp39-win_amd64.whl", hash = "sha256:92f093986ab92e71c9ffe334c002f96defc7986efda18397d0f08534f3ebdc4d"}, + {file = "llvmlite-0.41.1.tar.gz", hash = "sha256:f19f767a018e6ec89608e1f6b13348fa2fcde657151137cb64e56d48598a92db"}, ] [[package]] name = "mako" -version = "1.2.4" +version = "1.3.5" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, - {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, + {file = "Mako-1.3.5-py3-none-any.whl", hash = "sha256:260f1dbc3a519453a9c856dedfe4beb4e50bd5a26d96386cb6c80856556bb91a"}, + {file = "Mako-1.3.5.tar.gz", hash = "sha256:48dbc20568c1d276a2698b36d968fa76161bf127194907ea6fc594fa81f943bc"}, ] [package.dependencies] @@ -2031,111 +2298,127 @@ testing = ["pytest"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "matplotlib" -version = "3.7.2" +version = "3.7.5" description = "Python plotting package" optional = false python-versions = ">=3.8" files = [ - {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:2699f7e73a76d4c110f4f25be9d2496d6ab4f17345307738557d345f099e07de"}, - {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a8035ba590658bae7562786c9cc6ea1a84aa49d3afab157e414c9e2ea74f496d"}, - {file = "matplotlib-3.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f8e4a49493add46ad4a8c92f63e19d548b2b6ebbed75c6b4c7f46f57d36cdd1"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71667eb2ccca4c3537d9414b1bc00554cb7f91527c17ee4ec38027201f8f1603"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:152ee0b569a37630d8628534c628456b28686e085d51394da6b71ef84c4da201"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070f8dddd1f5939e60aacb8fa08f19551f4b0140fab16a3669d5cd6e9cb28fc8"}, - {file = "matplotlib-3.7.2-cp310-cp310-win32.whl", hash = "sha256:fdbb46fad4fb47443b5b8ac76904b2e7a66556844f33370861b4788db0f8816a"}, - {file = "matplotlib-3.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:23fb1750934e5f0128f9423db27c474aa32534cec21f7b2153262b066a581fd1"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:30e1409b857aa8a747c5d4f85f63a79e479835f8dffc52992ac1f3f25837b544"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:50e0a55ec74bf2d7a0ebf50ac580a209582c2dd0f7ab51bc270f1b4a0027454e"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac60daa1dc83e8821eed155796b0f7888b6b916cf61d620a4ddd8200ac70cd64"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305e3da477dc8607336ba10bac96986d6308d614706cae2efe7d3ffa60465b24"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c308b255efb9b06b23874236ec0f10f026673ad6515f602027cc8ac7805352d"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60c521e21031632aa0d87ca5ba0c1c05f3daacadb34c093585a0be6780f698e4"}, - {file = "matplotlib-3.7.2-cp311-cp311-win32.whl", hash = "sha256:26bede320d77e469fdf1bde212de0ec889169b04f7f1179b8930d66f82b30cbc"}, - {file = "matplotlib-3.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4860132c8c05261a5f5f8467f1b269bf1c7c23902d75f2be57c4a7f2394b3e"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:a1733b8e84e7e40a9853e505fe68cc54339f97273bdfe6f3ed980095f769ddc7"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d9881356dc48e58910c53af82b57183879129fa30492be69058c5b0d9fddf391"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f081c03f413f59390a80b3e351cc2b2ea0205839714dbc364519bcf51f4b56ca"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cd120fca3407a225168238b790bd5c528f0fafde6172b140a2f3ab7a4ea63e9"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2c1590b90aa7bd741b54c62b78de05d4186271e34e2377e0289d943b3522273"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d2ff3c984b8a569bc1383cd468fc06b70d7b59d5c2854ca39f1436ae8394117"}, - {file = "matplotlib-3.7.2-cp38-cp38-win32.whl", hash = "sha256:5dea00b62d28654b71ca92463656d80646675628d0828e08a5f3b57e12869e13"}, - {file = "matplotlib-3.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f506a1776ee94f9e131af1ac6efa6e5bc7cb606a3e389b0ccb6e657f60bb676"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6515e878f91894c2e4340d81f0911857998ccaf04dbc1bba781e3d89cbf70608"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:71f7a8c6b124e904db550f5b9fe483d28b896d4135e45c4ea381ad3b8a0e3256"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12f01b92ecd518e0697da4d97d163b2b3aa55eb3eb4e2c98235b3396d7dad55f"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7e28d6396563955f7af437894a36bf2b279462239a41028323e04b85179058b"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbcf59334ff645e6a67cd5f78b4b2cdb76384cdf587fa0d2dc85f634a72e1a3e"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:318c89edde72ff95d8df67d82aca03861240512994a597a435a1011ba18dbc7f"}, - {file = "matplotlib-3.7.2-cp39-cp39-win32.whl", hash = "sha256:ce55289d5659b5b12b3db4dc9b7075b70cef5631e56530f14b2945e8836f2d20"}, - {file = "matplotlib-3.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:2ecb5be2b2815431c81dc115667e33da0f5a1bcf6143980d180d09a717c4a12e"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdcd28360dbb6203fb5219b1a5658df226ac9bebc2542a9e8f457de959d713d0"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c3cca3e842b11b55b52c6fb8bd6a4088693829acbfcdb3e815fa9b7d5c92c1b"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf577c7a6744e9e1bd3fee45fc74a02710b214f94e2bde344912d85e0c9af7c"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:936bba394682049919dda062d33435b3be211dc3dcaa011e09634f060ec878b2"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bc221ffbc2150458b1cd71cdd9ddd5bb37962b036e41b8be258280b5b01da1dd"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35d74ebdb3f71f112b36c2629cf32323adfbf42679e2751252acd468f5001c07"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717157e61b3a71d3d26ad4e1770dc85156c9af435659a25ee6407dc866cb258d"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:20f844d6be031948148ba49605c8b96dfe7d3711d1b63592830d650622458c11"}, - {file = "matplotlib-3.7.2.tar.gz", hash = "sha256:a8cdb91dddb04436bd2f098b8fdf4b81352e68cf4d2c6756fcc414791076569b"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:4a87b69cb1cb20943010f63feb0b2901c17a3b435f75349fd9865713bfa63925"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d3ce45010fefb028359accebb852ca0c21bd77ec0f281952831d235228f15810"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fbea1e762b28400393d71be1a02144aa16692a3c4c676ba0178ce83fc2928fdd"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec0e1adc0ad70ba8227e957551e25a9d2995e319c29f94a97575bb90fa1d4469"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6738c89a635ced486c8a20e20111d33f6398a9cbebce1ced59c211e12cd61455"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1210b7919b4ed94b5573870f316bca26de3e3b07ffdb563e79327dc0e6bba515"}, + {file = "matplotlib-3.7.5-cp310-cp310-win32.whl", hash = "sha256:068ebcc59c072781d9dcdb82f0d3f1458271c2de7ca9c78f5bd672141091e9e1"}, + {file = "matplotlib-3.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:f098ffbaab9df1e3ef04e5a5586a1e6b1791380698e84938d8640961c79b1fc0"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f65342c147572673f02a4abec2d5a23ad9c3898167df9b47c149f32ce61ca078"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4ddf7fc0e0dc553891a117aa083039088d8a07686d4c93fb8a810adca68810af"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ccb830fc29442360d91be48527809f23a5dcaee8da5f4d9b2d5b867c1b087b8"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efc6bb28178e844d1f408dd4d6341ee8a2e906fc9e0fa3dae497da4e0cab775d"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b15c4c2d374f249f324f46e883340d494c01768dd5287f8bc00b65b625ab56c"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d028555421912307845e59e3de328260b26d055c5dac9b182cc9783854e98fb"}, + {file = "matplotlib-3.7.5-cp311-cp311-win32.whl", hash = "sha256:fe184b4625b4052fa88ef350b815559dd90cc6cc8e97b62f966e1ca84074aafa"}, + {file = "matplotlib-3.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:084f1f0f2f1010868c6f1f50b4e1c6f2fb201c58475494f1e5b66fed66093647"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:34bceb9d8ddb142055ff27cd7135f539f2f01be2ce0bafbace4117abe58f8fe4"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c5a2134162273eb8cdfd320ae907bf84d171de948e62180fa372a3ca7cf0f433"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:039ad54683a814002ff37bf7981aa1faa40b91f4ff84149beb53d1eb64617980"}, + {file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d742ccd1b09e863b4ca58291728db645b51dab343eebb08d5d4b31b308296ce"}, + {file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:743b1c488ca6a2bc7f56079d282e44d236bf375968bfd1b7ba701fd4d0fa32d6"}, + {file = "matplotlib-3.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:fbf730fca3e1f23713bc1fae0a57db386e39dc81ea57dc305c67f628c1d7a342"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cfff9b838531698ee40e40ea1a8a9dc2c01edb400b27d38de6ba44c1f9a8e3d2"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:1dbcca4508bca7847fe2d64a05b237a3dcaec1f959aedb756d5b1c67b770c5ee"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4cdf4ef46c2a1609a50411b66940b31778db1e4b73d4ecc2eaa40bd588979b13"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:167200ccfefd1674b60e957186dfd9baf58b324562ad1a28e5d0a6b3bea77905"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:53e64522934df6e1818b25fd48cf3b645b11740d78e6ef765fbb5fa5ce080d02"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3e3bc79b2d7d615067bd010caff9243ead1fc95cf735c16e4b2583173f717eb"}, + {file = "matplotlib-3.7.5-cp38-cp38-win32.whl", hash = "sha256:6b641b48c6819726ed47c55835cdd330e53747d4efff574109fd79b2d8a13748"}, + {file = "matplotlib-3.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:f0b60993ed3488b4532ec6b697059897891927cbfc2b8d458a891b60ec03d9d7"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:090964d0afaff9c90e4d8de7836757e72ecfb252fb02884016d809239f715651"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9fc6fcfbc55cd719bc0bfa60bde248eb68cf43876d4c22864603bdd23962ba25"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7cc3078b019bb863752b8b60e8b269423000f1603cb2299608231996bd9d54"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e4e9a868e8163abaaa8259842d85f949a919e1ead17644fb77a60427c90473c"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa7ebc995a7d747dacf0a717d0eb3aa0f0c6a0e9ea88b0194d3a3cd241a1500f"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3785bfd83b05fc0e0c2ae4c4a90034fe693ef96c679634756c50fe6efcc09856"}, + {file = "matplotlib-3.7.5-cp39-cp39-win32.whl", hash = "sha256:29b058738c104d0ca8806395f1c9089dfe4d4f0f78ea765c6c704469f3fffc81"}, + {file = "matplotlib-3.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:fd4028d570fa4b31b7b165d4a685942ae9cdc669f33741e388c01857d9723eab"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2a9a3f4d6a7f88a62a6a18c7e6a84aedcaf4faf0708b4ca46d87b19f1b526f88"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b3fd853d4a7f008a938df909b96db0b454225f935d3917520305b90680579c"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0ad550da9f160737d7890217c5eeed4337d07e83ca1b2ca6535078f354e7675"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:20da7924a08306a861b3f2d1da0d1aa9a6678e480cf8eacffe18b565af2813e7"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b45c9798ea6bb920cb77eb7306409756a7fab9db9b463e462618e0559aecb30e"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a99866267da1e561c7776fe12bf4442174b79aac1a47bd7e627c7e4d077ebd83"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6aa62adb6c268fc87d80f963aca39c64615c31830b02697743c95590ce3fbb"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e530ab6a0afd082d2e9c17eb1eb064a63c5b09bb607b2b74fa41adbe3e162286"}, + {file = "matplotlib-3.7.5.tar.gz", hash = "sha256:1e5c971558ebc811aa07f54c7b7c677d78aa518ef4c390e14673a09e0860184a"}, ] [package.dependencies] @@ -2144,46 +2427,57 @@ cycler = ">=0.10" fonttools = ">=4.22.0" importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.0.1" -numpy = ">=1.20" +numpy = ">=1.20,<2" packaging = ">=20.0" pillow = ">=6.2.0" -pyparsing = ">=2.3.1,<3.1" +pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [[package]] name = "matplotlib-inline" -version = "0.1.6" +version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, ] [package.dependencies] traitlets = "*" +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + [[package]] name = "mistune" -version = "3.0.1" +version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false python-versions = ">=3.7" files = [ - {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, - {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] [[package]] name = "nbclient" -version = "0.8.0" +version = "0.10.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.8.0-py3-none-any.whl", hash = "sha256:25e861299e5303a0477568557c4045eccc7a34c17fc08e7959558707b9ebe548"}, - {file = "nbclient-0.8.0.tar.gz", hash = "sha256:f9b179cd4b2d7bca965f900a2ebf0db4a12ebff2f36a711cb66861e4ae158e55"}, + {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, + {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, ] [package.dependencies] @@ -2195,17 +2489,17 @@ traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" -version = "7.7.3" -description = "Converting Jupyter Notebooks" +version = "7.16.4" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.7.3-py3-none-any.whl", hash = "sha256:3022adadff3f86578a47fab7c2228bb3ca9c56a24345642a22f917f6168b48fc"}, - {file = "nbconvert-7.7.3.tar.gz", hash = "sha256:4a5996bf5f3cd16aa0431897ba1aa4c64842c2079f434b3dc6b8c4b252ef3355"}, + {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, + {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, ] [package.dependencies] @@ -2227,29 +2521,29 @@ tinycss2 = "*" traitlets = ">=5.1" [package.extras] -all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] +all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] -qtpdf = ["nbconvert[qtpng]"] +qtpdf = ["pyqtwebengine (>=5.15)"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.9.2" +version = "5.10.4" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, - {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, ] [package.dependencies] -fastjsonschema = "*" +fastjsonschema = ">=2.15" jsonschema = ">=2.6" -jupyter-core = "*" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" traitlets = ">=5.1" [package.extras] @@ -2258,13 +2552,13 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nest-asyncio" -version = "1.5.7" +version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.7-py3-none-any.whl", hash = "sha256:5301c82941b550b3123a1ea772ba9a1c80bad3a182be8c1a5ae6ad3be57a9657"}, - {file = "nest_asyncio-1.5.7.tar.gz", hash = "sha256:6a80f7b98f24d9083ed24608977c09dd608d83f91cccc24c9d2cba6d10e01c10"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] [[package]] @@ -2287,37 +2581,36 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "notebook" -version = "7.0.1" +version = "7.2.2" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.0.1-py3-none-any.whl", hash = "sha256:35327476042140e8739ff8fcfecdc915658ae72b4db72d6e3b537badcdbf9e35"}, - {file = "notebook-7.0.1.tar.gz", hash = "sha256:2e16ad4e63ea89f7efbe212ee7c1693fcfa5ab55ffef75047530f74af4bd926c"}, + {file = "notebook-7.2.2-py3-none-any.whl", hash = "sha256:c89264081f671bc02eec0ed470a627ed791b9156cad9285226b31611d3e9fe1c"}, + {file = "notebook-7.2.2.tar.gz", hash = "sha256:2ef07d4220421623ad3fe88118d687bc0450055570cdd160814a59cf3a1c516e"}, ] [package.dependencies] -importlib-resources = {version = ">=5.0", markers = "python_version < \"3.9\""} jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.0.2,<5" -jupyterlab-server = ">=2.22.1,<3" +jupyterlab = ">=4.2.0,<4.3" +jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" -version = "0.2.3" +version = "0.2.4" description = "A shim layer for notebook traits and config" optional = false python-versions = ">=3.7" files = [ - {file = "notebook_shim-0.2.3-py3-none-any.whl", hash = "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7"}, - {file = "notebook_shim-0.2.3.tar.gz", hash = "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9"}, + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, ] [package.dependencies] @@ -2328,41 +2621,38 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numba" -version = "0.57.1" +version = "0.58.1" description = "compiling Python code using LLVM" optional = false python-versions = ">=3.8" files = [ - {file = "numba-0.57.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db8268eb5093cae2288942a8cbd69c9352f6fe6e0bfa0a9a27679436f92e4248"}, - {file = "numba-0.57.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:643cb09a9ba9e1bd8b060e910aeca455e9442361e80fce97690795ff9840e681"}, - {file = "numba-0.57.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e9fab973d9e82c9f8449f75994a898daaaf821d84f06fbb0b9de2293dd9306"}, - {file = "numba-0.57.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0602e4f896e6a6d844517c3ab434bc978e7698a22a733cc8124465898c28fa8"}, - {file = "numba-0.57.1-cp310-cp310-win32.whl", hash = "sha256:3d6483c27520d16cf5d122868b79cad79e48056ecb721b52d70c126bed65431e"}, - {file = "numba-0.57.1-cp310-cp310-win_amd64.whl", hash = "sha256:a32ee263649aa3c3587b833d6311305379529570e6c20deb0c6f4fb5bc7020db"}, - {file = "numba-0.57.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c078f84b5529a7fdb8413bb33d5100f11ec7b44aa705857d9eb4e54a54ff505"}, - {file = "numba-0.57.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e447c4634d1cc99ab50d4faa68f680f1d88b06a2a05acf134aa6fcc0342adeca"}, - {file = "numba-0.57.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4838edef2df5f056cb8974670f3d66562e751040c448eb0b67c7e2fec1726649"}, - {file = "numba-0.57.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b17fbe4a69dcd9a7cd49916b6463cd9a82af5f84911feeb40793b8bce00dfa7"}, - {file = "numba-0.57.1-cp311-cp311-win_amd64.whl", hash = "sha256:93df62304ada9b351818ba19b1cfbddaf72cd89348e81474326ca0b23bf0bae1"}, - {file = "numba-0.57.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8e00ca63c5d0ad2beeb78d77f087b3a88c45ea9b97e7622ab2ec411a868420ee"}, - {file = "numba-0.57.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff66d5b022af6c7d81ddbefa87768e78ed4f834ab2da6ca2fd0d60a9e69b94f5"}, - {file = "numba-0.57.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:60ec56386076e9eed106a87c96626d5686fbb16293b9834f0849cf78c9491779"}, - {file = "numba-0.57.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c057ccedca95df23802b6ccad86bb318be624af45b5a38bb8412882be57a681"}, - {file = "numba-0.57.1-cp38-cp38-win32.whl", hash = "sha256:5a82bf37444039c732485c072fda21a361790ed990f88db57fd6941cd5e5d307"}, - {file = "numba-0.57.1-cp38-cp38-win_amd64.whl", hash = "sha256:9bcc36478773ce838f38afd9a4dfafc328d4ffb1915381353d657da7f6473282"}, - {file = "numba-0.57.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae50c8c90c2ce8057f9618b589223e13faa8cbc037d8f15b4aad95a2c33a0582"}, - {file = "numba-0.57.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9a1b2b69448e510d672ff9a6b18d2db9355241d93c6a77677baa14bec67dc2a0"}, - {file = "numba-0.57.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3cf78d74ad9d289fbc1e5b1c9f2680fca7a788311eb620581893ab347ec37a7e"}, - {file = "numba-0.57.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f47dd214adc5dcd040fe9ad2adbd2192133c9075d2189ce1b3d5f9d72863ef05"}, - {file = "numba-0.57.1-cp39-cp39-win32.whl", hash = "sha256:a3eac19529956185677acb7f01864919761bfffbb9ae04bbbe5e84bbc06cfc2b"}, - {file = "numba-0.57.1-cp39-cp39-win_amd64.whl", hash = "sha256:9587ba1bf5f3035575e45562ada17737535c6d612df751e811d702693a72d95e"}, - {file = "numba-0.57.1.tar.gz", hash = "sha256:33c0500170d213e66d90558ad6aca57d3e03e97bb11da82e6d87ab793648cb17"}, + {file = "numba-0.58.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07f2fa7e7144aa6f275f27260e73ce0d808d3c62b30cff8906ad1dec12d87bbe"}, + {file = "numba-0.58.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7bf1ddd4f7b9c2306de0384bf3854cac3edd7b4d8dffae2ec1b925e4c436233f"}, + {file = "numba-0.58.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bc2d904d0319d7a5857bd65062340bed627f5bfe9ae4a495aef342f072880d50"}, + {file = "numba-0.58.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e79b6cc0d2bf064a955934a2e02bf676bc7995ab2db929dbbc62e4c16551be6"}, + {file = "numba-0.58.1-cp310-cp310-win_amd64.whl", hash = "sha256:81fe5b51532478149b5081311b0fd4206959174e660c372b94ed5364cfb37c82"}, + {file = "numba-0.58.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bcecd3fb9df36554b342140a4d77d938a549be635d64caf8bd9ef6c47a47f8aa"}, + {file = "numba-0.58.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1eaa744f518bbd60e1f7ccddfb8002b3d06bd865b94a5d7eac25028efe0e0ff"}, + {file = "numba-0.58.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bf68df9c307fb0aa81cacd33faccd6e419496fdc621e83f1efce35cdc5e79cac"}, + {file = "numba-0.58.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:55a01e1881120e86d54efdff1be08381886fe9f04fc3006af309c602a72bc44d"}, + {file = "numba-0.58.1-cp311-cp311-win_amd64.whl", hash = "sha256:811305d5dc40ae43c3ace5b192c670c358a89a4d2ae4f86d1665003798ea7a1a"}, + {file = "numba-0.58.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ea5bfcf7d641d351c6a80e8e1826eb4a145d619870016eeaf20bbd71ef5caa22"}, + {file = "numba-0.58.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e63d6aacaae1ba4ef3695f1c2122b30fa3d8ba039c8f517784668075856d79e2"}, + {file = "numba-0.58.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6fe7a9d8e3bd996fbe5eac0683227ccef26cba98dae6e5cee2c1894d4b9f16c1"}, + {file = "numba-0.58.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:898af055b03f09d33a587e9425500e5be84fc90cd2f80b3fb71c6a4a17a7e354"}, + {file = "numba-0.58.1-cp38-cp38-win_amd64.whl", hash = "sha256:d3e2fe81fe9a59fcd99cc572002101119059d64d31eb6324995ee8b0f144a306"}, + {file = "numba-0.58.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c765aef472a9406a97ea9782116335ad4f9ef5c9f93fc05fd44aab0db486954"}, + {file = "numba-0.58.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e9356e943617f5e35a74bf56ff6e7cc83e6b1865d5e13cee535d79bf2cae954"}, + {file = "numba-0.58.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:240e7a1ae80eb6b14061dc91263b99dc8d6af9ea45d310751b780888097c1aaa"}, + {file = "numba-0.58.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:45698b995914003f890ad839cfc909eeb9c74921849c712a05405d1a79c50f68"}, + {file = "numba-0.58.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd3dda77955be03ff366eebbfdb39919ce7c2620d86c906203bed92124989032"}, + {file = "numba-0.58.1.tar.gz", hash = "sha256:487ded0633efccd9ca3a46364b40006dbdaca0f95e99b8b83e778d1195ebcbaa"}, ] [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} -llvmlite = "==0.40.*" -numpy = ">=1.21,<1.25" +llvmlite = "==0.41.*" +numpy = ">=1.22,<1.27" [[package]] name = "numpy" @@ -2403,18 +2693,17 @@ files = [ [[package]] name = "optuna" -version = "3.2.0" +version = "4.0.0" description = "A hyperparameter optimization framework" optional = false python-versions = ">=3.7" files = [ - {file = "optuna-3.2.0-py3-none-any.whl", hash = "sha256:6140ca7cc1cc6751b5184c9f88cd7bbaaf6172b4bed1792552db9d8931979d77"}, - {file = "optuna-3.2.0.tar.gz", hash = "sha256:683d8693643a761a41d251a6b8e13263b24acacf9fc46a9233d5f6aa3ce5c683"}, + {file = "optuna-4.0.0-py3-none-any.whl", hash = "sha256:a825c32d13f6085bcb2229b2724a5078f2e0f61a7533e800e580ce41a8c6c10d"}, + {file = "optuna-4.0.0.tar.gz", hash = "sha256:844949f09e2a7353ab414e9cfd783cf0a647a65fc32a7236212ed6a37fe08973"}, ] [package.dependencies] alembic = ">=1.5.0" -cmaes = ">=0.9.1" colorlog = "*" numpy = "*" packaging = ">=20.0" @@ -2423,22 +2712,21 @@ sqlalchemy = ">=1.3.0" tqdm = "*" [package.extras] -benchmark = ["asv (>=0.5.0)", "botorch", "cma", "scikit-optimize", "virtualenv"] -checking = ["black", "blackdoc", "flake8", "isort", "mypy", "types-PyYAML", "types-redis", "types-setuptools", "types-tqdm", "typing-extensions (>=3.10.0.0)"] -document = ["botorch", "cma", "distributed", "fvcore", "lightgbm", "matplotlib (!=3.6.0)", "mlflow", "pandas", "pillow", "plotly (>=4.9.0)", "scikit-learn", "scikit-optimize", "sphinx", "sphinx-copybutton", "sphinx-gallery", "sphinx-plotly-directive", "sphinx-rtd-theme", "torch", "torchaudio", "torchvision"] -integration = ["botorch (>=0.4.0)", "catboost (>=0.26)", "catboost (>=0.26,<1.2)", "cma", "distributed", "fastai", "lightgbm", "mlflow", "mxnet", "pandas", "pytorch-ignite", "pytorch-lightning (>=1.6.0)", "scikit-learn (>=0.24.2)", "scikit-optimize", "shap", "tensorflow", "torch", "torchaudio", "torchvision", "wandb", "xgboost"] -optional = ["botorch", "matplotlib (!=3.6.0)", "pandas", "plotly (>=4.9.0)", "redis", "scikit-learn (>=0.24.2)"] -test = ["coverage", "fakeredis[lua]", "kaleido", "pytest", "scipy (>=1.9.2)"] +benchmark = ["asv (>=0.5.0)", "botorch", "cma", "virtualenv"] +checking = ["black", "blackdoc", "flake8", "isort", "mypy", "mypy-boto3-s3", "types-PyYAML", "types-redis", "types-setuptools", "types-tqdm", "typing-extensions (>=3.10.0.0)"] +document = ["ase", "cmaes (>=0.10.0)", "fvcore", "kaleido", "lightgbm", "matplotlib (!=3.6.0)", "pandas", "pillow", "plotly (>=4.9.0)", "scikit-learn", "sphinx", "sphinx-copybutton", "sphinx-gallery", "sphinx-rtd-theme (>=1.2.0)", "torch", "torchvision"] +optional = ["boto3", "cmaes (>=0.10.0)", "google-cloud-storage", "matplotlib (!=3.6.0)", "pandas", "plotly (>=4.9.0)", "redis", "scikit-learn (>=0.24.2)", "scipy", "torch"] +test = ["coverage", "fakeredis[lua]", "kaleido", "moto", "pytest", "scipy (>=1.9.2)", "torch"] [[package]] name = "overrides" -version = "7.3.1" +version = "7.7.0" description = "A decorator to automatically detect mismatch when overriding a method." optional = false python-versions = ">=3.6" files = [ - {file = "overrides-7.3.1-py3-none-any.whl", hash = "sha256:6187d8710a935d09b0bcef8238301d6ee2569d2ac1ae0ec39a8c7924e27f58ca"}, - {file = "overrides-7.3.1.tar.gz", hash = "sha256:8b97c6c1e1681b78cbc9424b138d880f0803c2254c5ebaabdde57bb6c62093f2"}, + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, ] [[package]] @@ -2457,80 +2745,83 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" [[package]] name = "pandas" -version = "1.1.5" +version = "1.5.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false -python-versions = ">=3.6.1" -files = [ - {file = "pandas-1.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bf23a3b54d128b50f4f9d4675b3c1857a688cc6731a32f931837d72effb2698d"}, - {file = "pandas-1.1.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5a780260afc88268a9d3ac3511d8f494fdcf637eece62fb9eb656a63d53eb7ca"}, - {file = "pandas-1.1.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b61080750d19a0122469ab59b087380721d6b72a4e7d962e4d7e63e0c4504814"}, - {file = "pandas-1.1.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:0de3ddb414d30798cbf56e642d82cac30a80223ad6fe484d66c0ce01a84d6f2f"}, - {file = "pandas-1.1.5-cp36-cp36m-win32.whl", hash = "sha256:70865f96bb38fec46f7ebd66d4b5cfd0aa6b842073f298d621385ae3898d28b5"}, - {file = "pandas-1.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:19a2148a1d02791352e9fa637899a78e371a3516ac6da5c4edc718f60cbae648"}, - {file = "pandas-1.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:26fa92d3ac743a149a31b21d6f4337b0594b6302ea5575b37af9ca9611e8981a"}, - {file = "pandas-1.1.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c16d59c15d946111d2716856dd5479221c9e4f2f5c7bc2d617f39d870031e086"}, - {file = "pandas-1.1.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3be7a7a0ca71a2640e81d9276f526bca63505850add10206d0da2e8a0a325dae"}, - {file = "pandas-1.1.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:573fba5b05bf2c69271a32e52399c8de599e4a15ab7cec47d3b9c904125ab788"}, - {file = "pandas-1.1.5-cp37-cp37m-win32.whl", hash = "sha256:21b5a2b033380adbdd36b3116faaf9a4663e375325831dac1b519a44f9e439bb"}, - {file = "pandas-1.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:24c7f8d4aee71bfa6401faeba367dd654f696a77151a8a28bc2013f7ced4af98"}, - {file = "pandas-1.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2860a97cbb25444ffc0088b457da0a79dc79f9c601238a3e0644312fcc14bf11"}, - {file = "pandas-1.1.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5008374ebb990dad9ed48b0f5d0038124c73748f5384cc8c46904dace27082d9"}, - {file = "pandas-1.1.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2c2f7c670ea4e60318e4b7e474d56447cf0c7d83b3c2a5405a0dbb2600b9c48e"}, - {file = "pandas-1.1.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0a643bae4283a37732ddfcecab3f62dd082996021b980f580903f4e8e01b3c5b"}, - {file = "pandas-1.1.5-cp38-cp38-win32.whl", hash = "sha256:5447ea7af4005b0daf695a316a423b96374c9c73ffbd4533209c5ddc369e644b"}, - {file = "pandas-1.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:4c62e94d5d49db116bef1bd5c2486723a292d79409fc9abd51adf9e05329101d"}, - {file = "pandas-1.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:731568be71fba1e13cae212c362f3d2ca8932e83cb1b85e3f1b4dd77d019254a"}, - {file = "pandas-1.1.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c61c043aafb69329d0f961b19faa30b1dab709dd34c9388143fc55680059e55a"}, - {file = "pandas-1.1.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2b1c6cd28a0dfda75c7b5957363333f01d370936e4c6276b7b8e696dd500582a"}, - {file = "pandas-1.1.5-cp39-cp39-win32.whl", hash = "sha256:c94ff2780a1fd89f190390130d6d36173ca59fcfb3fe0ff596f9a56518191ccb"}, - {file = "pandas-1.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:edda9bacc3843dfbeebaf7a701763e68e741b08fccb889c003b0a52f0ee95782"}, - {file = "pandas-1.1.5.tar.gz", hash = "sha256:f10fc41ee3c75a474d3bdf68d396f10782d013d7f67db99c0efbfd0acb99701b"}, +python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, ] [package.dependencies] -numpy = ">=1.15.4" -python-dateutil = ">=2.7.3" -pytz = ">=2017.2" +numpy = {version = ">=1.20.3", markers = "python_version < \"3.10\""} +python-dateutil = ">=2.8.1" +pytz = ">=2020.1" [package.extras] -test = ["hypothesis (>=3.58)", "pytest (>=4.0.2)", "pytest-xdist"] +test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] [[package]] name = "pandocfilters" -version = "1.5.0" +version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, ] [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -2549,72 +2840,100 @@ files = [ [[package]] name = "pillow" -version = "10.0.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" files = [ - {file = "Pillow-10.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f62406a884ae75fb2f818694469519fb685cc7eaff05d3451a9ebe55c646891"}, - {file = "Pillow-10.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d5db32e2a6ccbb3d34d87c87b432959e0db29755727afb37290e10f6e8e62614"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf4392b77bdc81f36e92d3a07a5cd072f90253197f4a52a55a8cec48a12483b"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:520f2a520dc040512699f20fa1c363eed506e94248d71f85412b625026f6142c"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:8c11160913e3dd06c8ffdb5f233a4f254cb449f4dfc0f8f4549eda9e542c93d1"}, - {file = "Pillow-10.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a74ba0c356aaa3bb8e3eb79606a87669e7ec6444be352870623025d75a14a2bf"}, - {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d0dae4cfd56969d23d94dc8e89fb6a217be461c69090768227beb8ed28c0a3"}, - {file = "Pillow-10.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22c10cc517668d44b211717fd9775799ccec4124b9a7f7b3635fc5386e584992"}, - {file = "Pillow-10.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:dffe31a7f47b603318c609f378ebcd57f1554a3a6a8effbc59c3c69f804296de"}, - {file = "Pillow-10.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:9fb218c8a12e51d7ead2a7c9e101a04982237d4855716af2e9499306728fb485"}, - {file = "Pillow-10.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d35e3c8d9b1268cbf5d3670285feb3528f6680420eafe35cccc686b73c1e330f"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ed64f9ca2f0a95411e88a4efbd7a29e5ce2cea36072c53dd9d26d9c76f753b3"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b6eb5502f45a60a3f411c63187db83a3d3107887ad0d036c13ce836f8a36f1d"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:c1fbe7621c167ecaa38ad29643d77a9ce7311583761abf7836e1510c580bf3dd"}, - {file = "Pillow-10.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cd25d2a9d2b36fcb318882481367956d2cf91329f6892fe5d385c346c0649629"}, - {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3b08d4cc24f471b2c8ca24ec060abf4bebc6b144cb89cba638c720546b1cf538"}, - {file = "Pillow-10.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737a602fbd82afd892ca746392401b634e278cb65d55c4b7a8f48e9ef8d008d"}, - {file = "Pillow-10.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:3a82c40d706d9aa9734289740ce26460a11aeec2d9c79b7af87bb35f0073c12f"}, - {file = "Pillow-10.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:bc2ec7c7b5d66b8ec9ce9f720dbb5fa4bace0f545acd34870eff4a369b44bf37"}, - {file = "Pillow-10.0.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:d80cf684b541685fccdd84c485b31ce73fc5c9b5d7523bf1394ce134a60c6883"}, - {file = "Pillow-10.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76de421f9c326da8f43d690110f0e79fe3ad1e54be811545d7d91898b4c8493e"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81ff539a12457809666fef6624684c008e00ff6bf455b4b89fd00a140eecd640"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce543ed15570eedbb85df19b0a1a7314a9c8141a36ce089c0a894adbfccb4568"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:685ac03cc4ed5ebc15ad5c23bc555d68a87777586d970c2c3e216619a5476223"}, - {file = "Pillow-10.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d72e2ecc68a942e8cf9739619b7f408cc7b272b279b56b2c83c6123fcfa5cdff"}, - {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d50b6aec14bc737742ca96e85d6d0a5f9bfbded018264b3b70ff9d8c33485551"}, - {file = "Pillow-10.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:00e65f5e822decd501e374b0650146063fbb30a7264b4d2744bdd7b913e0cab5"}, - {file = "Pillow-10.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:f31f9fdbfecb042d046f9d91270a0ba28368a723302786c0009ee9b9f1f60199"}, - {file = "Pillow-10.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:1ce91b6ec08d866b14413d3f0bbdea7e24dfdc8e59f562bb77bc3fe60b6144ca"}, - {file = "Pillow-10.0.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:349930d6e9c685c089284b013478d6f76e3a534e36ddfa912cde493f235372f3"}, - {file = "Pillow-10.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3a684105f7c32488f7153905a4e3015a3b6c7182e106fe3c37fbb5ef3e6994c3"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4f69b3700201b80bb82c3a97d5e9254084f6dd5fb5b16fc1a7b974260f89f43"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f07ea8d2f827d7d2a49ecf1639ec02d75ffd1b88dcc5b3a61bbb37a8759ad8d"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:040586f7d37b34547153fa383f7f9aed68b738992380ac911447bb78f2abe530"}, - {file = "Pillow-10.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:f88a0b92277de8e3ca715a0d79d68dc82807457dae3ab8699c758f07c20b3c51"}, - {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c7cf14a27b0d6adfaebb3ae4153f1e516df54e47e42dcc073d7b3d76111a8d86"}, - {file = "Pillow-10.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3400aae60685b06bb96f99a21e1ada7bc7a413d5f49bce739828ecd9391bb8f7"}, - {file = "Pillow-10.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbc02381779d412145331789b40cc7b11fdf449e5d94f6bc0b080db0a56ea3f0"}, - {file = "Pillow-10.0.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9211e7ad69d7c9401cfc0e23d49b69ca65ddd898976d660a2fa5904e3d7a9baa"}, - {file = "Pillow-10.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:faaf07ea35355b01a35cb442dd950d8f1bb5b040a7787791a535de13db15ed90"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9f72a021fbb792ce98306ffb0c348b3c9cb967dce0f12a49aa4c3d3fdefa967"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f7c16705f44e0504a3a2a14197c1f0b32a95731d251777dcb060aa83022cb2d"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:76edb0a1fa2b4745fb0c99fb9fb98f8b180a1bbceb8be49b087e0b21867e77d3"}, - {file = "Pillow-10.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:368ab3dfb5f49e312231b6f27b8820c823652b7cd29cfbd34090565a015e99ba"}, - {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:608bfdee0d57cf297d32bcbb3c728dc1da0907519d1784962c5f0c68bb93e5a3"}, - {file = "Pillow-10.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5c6e3df6bdd396749bafd45314871b3d0af81ff935b2d188385e970052091017"}, - {file = "Pillow-10.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:7be600823e4c8631b74e4a0d38384c73f680e6105a7d3c6824fcf226c178c7e6"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:92be919bbc9f7d09f7ae343c38f5bb21c973d2576c1d45600fce4b74bafa7ac0"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8182b523b2289f7c415f589118228d30ac8c355baa2f3194ced084dac2dbba"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:38250a349b6b390ee6047a62c086d3817ac69022c127f8a5dc058c31ccef17f3"}, - {file = "Pillow-10.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88af2003543cc40c80f6fca01411892ec52b11021b3dc22ec3bc9d5afd1c5334"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c189af0545965fa8d3b9613cfdb0cd37f9d71349e0f7750e1fd704648d475ed2"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce7b031a6fc11365970e6a5686d7ba8c63e4c1cf1ea143811acbb524295eabed"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:db24668940f82321e746773a4bc617bfac06ec831e5c88b643f91f122a785684"}, - {file = "Pillow-10.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:efe8c0681042536e0d06c11f48cebe759707c9e9abf880ee213541c5b46c5bf3"}, - {file = "Pillow-10.0.0.tar.gz", hash = "sha256:9c82b5b3e043c7af0d95792d0d20ccf68f61a1fec6b3530e718b688422727396"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "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 = "pkgutil-resolve-name" @@ -2629,28 +2948,29 @@ files = [ [[package]] name = "platformdirs" -version = "3.10.0" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "4.3.6" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, - {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.0.2)", "sphinx-autodoc-typehints (>=2.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)"] +type = ["mypy (>=1.11.2)"] [[package]] name = "plotly" -version = "5.15.0" +version = "5.24.1" description = "An open-source, interactive data visualization library for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "plotly-5.15.0-py2.py3-none-any.whl", hash = "sha256:3508876bbd6aefb8a692c21a7128ca87ce42498dd041efa5c933ee44b55aab24"}, - {file = "plotly-5.15.0.tar.gz", hash = "sha256:822eabe53997d5ebf23c77e1d1fcbf3bb6aa745eb05d532afd4b6f9a2e2ab02f"}, + {file = "plotly-5.24.1-py3-none-any.whl", hash = "sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089"}, + {file = "plotly-5.24.1.tar.gz", hash = "sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae"}, ] [package.dependencies] @@ -2659,13 +2979,13 @@ tenacity = ">=6.2.0" [[package]] name = "pluggy" -version = "1.2.0" +version = "1.5.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, ] [package.extras] @@ -2685,13 +3005,13 @@ files = [ [[package]] name = "prometheus-client" -version = "0.17.1" +version = "0.21.0" description = "Python client for the Prometheus monitoring system." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.17.1-py3-none-any.whl", hash = "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"}, - {file = "prometheus_client-0.17.1.tar.gz", hash = "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091"}, + {file = "prometheus_client-0.21.0-py3-none-any.whl", hash = "sha256:4fa6b4dd0ac16d58bb587c04b1caae65b8c5043e85f778f42f5f632f6af2e166"}, + {file = "prometheus_client-0.21.0.tar.gz", hash = "sha256:96c83c606b71ff2b0a433c98889d275f51ffec6c5e267de37c7a2b5c9aa9233e"}, ] [package.extras] @@ -2699,13 +3019,13 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] @@ -2713,47 +3033,47 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "4.23.4" +version = "5.28.2" description = "" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "protobuf-4.23.4-cp310-abi3-win32.whl", hash = "sha256:5fea3c64d41ea5ecf5697b83e41d09b9589e6f20b677ab3c48e5f242d9b7897b"}, - {file = "protobuf-4.23.4-cp310-abi3-win_amd64.whl", hash = "sha256:7b19b6266d92ca6a2a87effa88ecc4af73ebc5cfde194dc737cf8ef23a9a3b12"}, - {file = "protobuf-4.23.4-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:8547bf44fe8cec3c69e3042f5c4fb3e36eb2a7a013bb0a44c018fc1e427aafbd"}, - {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:fee88269a090ada09ca63551bf2f573eb2424035bcf2cb1b121895b01a46594a"}, - {file = "protobuf-4.23.4-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:effeac51ab79332d44fba74660d40ae79985901ac21bca408f8dc335a81aa597"}, - {file = "protobuf-4.23.4-cp37-cp37m-win32.whl", hash = "sha256:c3e0939433c40796ca4cfc0fac08af50b00eb66a40bbbc5dee711998fb0bbc1e"}, - {file = "protobuf-4.23.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9053df6df8e5a76c84339ee4a9f5a2661ceee4a0dab019e8663c50ba324208b0"}, - {file = "protobuf-4.23.4-cp38-cp38-win32.whl", hash = "sha256:e1c915778d8ced71e26fcf43c0866d7499891bca14c4368448a82edc61fdbc70"}, - {file = "protobuf-4.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:351cc90f7d10839c480aeb9b870a211e322bf05f6ab3f55fcb2f51331f80a7d2"}, - {file = "protobuf-4.23.4-cp39-cp39-win32.whl", hash = "sha256:6dd9b9940e3f17077e820b75851126615ee38643c2c5332aa7a359988820c720"}, - {file = "protobuf-4.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:0a5759f5696895de8cc913f084e27fd4125e8fb0914bb729a17816a33819f474"}, - {file = "protobuf-4.23.4-py3-none-any.whl", hash = "sha256:e9d0be5bf34b275b9f87ba7407796556abeeba635455d036c7351f7c183ef8ff"}, - {file = "protobuf-4.23.4.tar.gz", hash = "sha256:ccd9430c0719dce806b93f89c91de7977304729e55377f872a92465d548329a9"}, + {file = "protobuf-5.28.2-cp310-abi3-win32.whl", hash = "sha256:eeea10f3dc0ac7e6b4933d32db20662902b4ab81bf28df12218aa389e9c2102d"}, + {file = "protobuf-5.28.2-cp310-abi3-win_amd64.whl", hash = "sha256:2c69461a7fcc8e24be697624c09a839976d82ae75062b11a0972e41fd2cd9132"}, + {file = "protobuf-5.28.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a8b9403fc70764b08d2f593ce44f1d2920c5077bf7d311fefec999f8c40f78b7"}, + {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:35cfcb15f213449af7ff6198d6eb5f739c37d7e4f1c09b5d0641babf2cc0c68f"}, + {file = "protobuf-5.28.2-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:5e8a95246d581eef20471b5d5ba010d55f66740942b95ba9b872d918c459452f"}, + {file = "protobuf-5.28.2-cp38-cp38-win32.whl", hash = "sha256:87317e9bcda04a32f2ee82089a204d3a2f0d3c8aeed16568c7daf4756e4f1fe0"}, + {file = "protobuf-5.28.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0ea0123dac3399a2eeb1a1443d82b7afc9ff40241433296769f7da42d142ec3"}, + {file = "protobuf-5.28.2-cp39-cp39-win32.whl", hash = "sha256:ca53faf29896c526863366a52a8f4d88e69cd04ec9571ed6082fa117fac3ab36"}, + {file = "protobuf-5.28.2-cp39-cp39-win_amd64.whl", hash = "sha256:8ddc60bf374785fb7cb12510b267f59067fa10087325b8e1855b898a0d81d276"}, + {file = "protobuf-5.28.2-py3-none-any.whl", hash = "sha256:52235802093bd8a2811abbe8bf0ab9c5f54cca0a751fdd3f6ac2a21438bffece"}, + {file = "protobuf-5.28.2.tar.gz", hash = "sha256:59379674ff119717404f7454647913787034f03fe7049cbef1d74a97bb4593f0"}, ] [[package]] name = "psutil" -version = "5.9.5" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, - {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, - {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, - {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, - {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, - {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, - {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, - {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -2772,13 +3092,13 @@ files = [ [[package]] name = "pure-eval" -version = "0.2.2" +version = "0.2.3" description = "Safely evaluate AST nodes without side effects" optional = false python-versions = "*" files = [ - {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, - {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, ] [package.extras] @@ -2797,50 +3117,75 @@ files = [ [[package]] name = "pyarrow" -version = "12.0.1" +version = "17.0.0" description = "Python library for Apache Arrow" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pyarrow-12.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d288029a94a9bb5407ceebdd7110ba398a00412c5b0155ee9813a40d246c5df"}, - {file = "pyarrow-12.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345e1828efdbd9aa4d4de7d5676778aba384a2c3add896d995b23d368e60e5af"}, - {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d6009fdf8986332b2169314da482baed47ac053311c8934ac6651e614deacd6"}, - {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d3c4cbbf81e6dd23fe921bc91dc4619ea3b79bc58ef10bce0f49bdafb103daf"}, - {file = "pyarrow-12.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdacf515ec276709ac8042c7d9bd5be83b4f5f39c6c037a17a60d7ebfd92c890"}, - {file = "pyarrow-12.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:749be7fd2ff260683f9cc739cb862fb11be376de965a2a8ccbf2693b098db6c7"}, - {file = "pyarrow-12.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6895b5fb74289d055c43db3af0de6e16b07586c45763cb5e558d38b86a91e3a7"}, - {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1887bdae17ec3b4c046fcf19951e71b6a619f39fa674f9881216173566c8f718"}, - {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c9cb8eeabbadf5fcfc3d1ddea616c7ce893db2ce4dcef0ac13b099ad7ca082"}, - {file = "pyarrow-12.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4aebdf412bd0eeb800d8e47db854f9f9f7e2f5a0220440acf219ddfddd4f63"}, - {file = "pyarrow-12.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:e0d8730c7f6e893f6db5d5b86eda42c0a130842d101992b581e2138e4d5663d3"}, - {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43364daec02f69fec89d2315f7fbfbeec956e0d991cbbef471681bd77875c40f"}, - {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051f9f5ccf585f12d7de836e50965b3c235542cc896959320d9776ab93f3b33d"}, - {file = "pyarrow-12.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:be2757e9275875d2a9c6e6052ac7957fbbfc7bc7370e4a036a9b893e96fedaba"}, - {file = "pyarrow-12.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:cf812306d66f40f69e684300f7af5111c11f6e0d89d6b733e05a3de44961529d"}, - {file = "pyarrow-12.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:459a1c0ed2d68671188b2118c63bac91eaef6fc150c77ddd8a583e3c795737bf"}, - {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85e705e33eaf666bbe508a16fd5ba27ca061e177916b7a317ba5a51bee43384c"}, - {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9120c3eb2b1f6f516a3b7a9714ed860882d9ef98c4b17edcdc91d95b7528db60"}, - {file = "pyarrow-12.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c780f4dc40460015d80fcd6a6140de80b615349ed68ef9adb653fe351778c9b3"}, - {file = "pyarrow-12.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a3c63124fc26bf5f95f508f5d04e1ece8cc23a8b0af2a1e6ab2b1ec3fdc91b24"}, - {file = "pyarrow-12.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b13329f79fa4472324f8d32dc1b1216616d09bd1e77cfb13104dec5463632c36"}, - {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb656150d3d12ec1396f6dde542db1675a95c0cc8366d507347b0beed96e87ca"}, - {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251e38470da97a5b2e00de5c6a049149f7b2bd62f12fa5dbb9ac674119ba71a"}, - {file = "pyarrow-12.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3de26da901216149ce086920547dfff5cd22818c9eab67ebc41e863a5883bac7"}, - {file = "pyarrow-12.0.1.tar.gz", hash = "sha256:cce317fc96e5b71107bf1f9f184d5e54e2bd14bbf3f9a3d62819961f0af86fec"}, + {file = "pyarrow-17.0.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a5c8b238d47e48812ee577ee20c9a2779e6a5904f1708ae240f53ecbee7c9f07"}, + {file = "pyarrow-17.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db023dc4c6cae1015de9e198d41250688383c3f9af8f565370ab2b4cb5f62655"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da1e060b3876faa11cee287839f9cc7cdc00649f475714b8680a05fd9071d545"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c06d4624c0ad6674364bb46ef38c3132768139ddec1c56582dbac54f2663e2"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:fa3c246cc58cb5a4a5cb407a18f193354ea47dd0648194e6265bd24177982fe8"}, + {file = "pyarrow-17.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:f7ae2de664e0b158d1607699a16a488de3d008ba99b3a7aa5de1cbc13574d047"}, + {file = "pyarrow-17.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:5984f416552eea15fd9cee03da53542bf4cddaef5afecefb9aa8d1010c335087"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:1c8856e2ef09eb87ecf937104aacfa0708f22dfeb039c363ec99735190ffb977"}, + {file = "pyarrow-17.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e19f569567efcbbd42084e87f948778eb371d308e137a0f97afe19bb860ccb3"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b244dc8e08a23b3e352899a006a26ae7b4d0da7bb636872fa8f5884e70acf15"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b72e87fe3e1db343995562f7fff8aee354b55ee83d13afba65400c178ab2597"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:dc5c31c37409dfbc5d014047817cb4ccd8c1ea25d19576acf1a001fe07f5b420"}, + {file = "pyarrow-17.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e3343cb1e88bc2ea605986d4b94948716edc7a8d14afd4e2c097232f729758b4"}, + {file = "pyarrow-17.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a27532c38f3de9eb3e90ecab63dfda948a8ca859a66e3a47f5f42d1e403c4d03"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:9b8a823cea605221e61f34859dcc03207e52e409ccf6354634143e23af7c8d22"}, + {file = "pyarrow-17.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1e70de6cb5790a50b01d2b686d54aaf73da01266850b05e3af2a1bc89e16053"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0071ce35788c6f9077ff9ecba4858108eebe2ea5a3f7cf2cf55ebc1dbc6ee24a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:757074882f844411fcca735e39aae74248a1531367a7c80799b4266390ae51cc"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9ba11c4f16976e89146781a83833df7f82077cdab7dc6232c897789343f7891a"}, + {file = "pyarrow-17.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b0c6ac301093b42d34410b187bba560b17c0330f64907bfa4f7f7f2444b0cf9b"}, + {file = "pyarrow-17.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:392bc9feabc647338e6c89267635e111d71edad5fcffba204425a7c8d13610d7"}, + {file = "pyarrow-17.0.0-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:af5ff82a04b2171415f1410cff7ebb79861afc5dae50be73ce06d6e870615204"}, + {file = "pyarrow-17.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:edca18eaca89cd6382dfbcff3dd2d87633433043650c07375d095cd3517561d8"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c7916bff914ac5d4a8fe25b7a25e432ff921e72f6f2b7547d1e325c1ad9d155"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f553ca691b9e94b202ff741bdd40f6ccb70cdd5fbf65c187af132f1317de6145"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:0cdb0e627c86c373205a2f94a510ac4376fdc523f8bb36beab2e7f204416163c"}, + {file = "pyarrow-17.0.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:d7d192305d9d8bc9082d10f361fc70a73590a4c65cf31c3e6926cd72b76bc35c"}, + {file = "pyarrow-17.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:02dae06ce212d8b3244dd3e7d12d9c4d3046945a5933d28026598e9dbbda1fca"}, + {file = "pyarrow-17.0.0-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:13d7a460b412f31e4c0efa1148e1d29bdf18ad1411eb6757d38f8fbdcc8645fb"}, + {file = "pyarrow-17.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b564a51fbccfab5a04a80453e5ac6c9954a9c5ef2890d1bcf63741909c3f8df"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32503827abbc5aadedfa235f5ece8c4f8f8b0a3cf01066bc8d29de7539532687"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a155acc7f154b9ffcc85497509bcd0d43efb80d6f733b0dc3bb14e281f131c8b"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:dec8d129254d0188a49f8a1fc99e0560dc1b85f60af729f47de4046015f9b0a5"}, + {file = "pyarrow-17.0.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:a48ddf5c3c6a6c505904545c25a4ae13646ae1f8ba703c4df4a1bfe4f4006bda"}, + {file = "pyarrow-17.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:42bf93249a083aca230ba7e2786c5f673507fa97bbd9725a1e2754715151a204"}, + {file = "pyarrow-17.0.0.tar.gz", hash = "sha256:4beca9521ed2c0921c1023e68d097d0299b62c362639ea315572a58f3f50fd28"}, ] [package.dependencies] numpy = ">=1.16.6" +[package.extras] +test = ["cffi", "hypothesis", "pandas", "pytest", "pytz"] + +[[package]] +name = "pycodestyle" +version = "2.12.1" +description = "Python style guide checker" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, +] + [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] @@ -2859,27 +3204,53 @@ future = "*" [[package]] name = "pygments" -version = "2.15.1" +version = "2.18.0" description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pylint" +version = "3.2.7" +description = "python code static checker" +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "pylint-3.2.7-py3-none-any.whl", hash = "sha256:02f4aedeac91be69fb3b4bea997ce580a4ac68ce58b89eaefeaf06749df73f4b"}, + {file = "pylint-3.2.7.tar.gz", hash = "sha256:1b7a721b575eaeaa7d39db076b6e7743c993ea44f57979127c517c6c572c803e"}, +] + +[package.dependencies] +astroid = ">=3.2.4,<=3.3.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = {version = ">=0.2", markers = "python_version < \"3.11\""} +isort = ">=4.2.5,<5.13.0 || >5.13.0,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, ] [package.extras] @@ -2905,13 +3276,13 @@ sql = ["pandas (>=0.23.2)", "pyarrow (>=1.0.0)"] [[package]] name = "pytest" -version = "7.4.0" +version = "8.3.3" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, - {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, + {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, + {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, ] [package.dependencies] @@ -2919,21 +3290,21 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.5,<2" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" -version = "4.1.0" +version = "5.0.0" description = "Pytest plugin for measuring coverage." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, - {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, + {file = "pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857"}, + {file = "pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652"}, ] [package.dependencies] @@ -2941,17 +3312,17 @@ coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "virtualenv"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -3006,13 +3377,13 @@ tests = ["pytest", "pytest-cov"] [[package]] name = "pytz" -version = "2023.3" +version = "2024.2" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, ] [[package]] @@ -3040,16 +3411,17 @@ files = [ [[package]] name = "pywinpty" -version = "2.0.11" +version = "2.0.13" description = "Pseudo terminal support for Windows from Python." optional = false python-versions = ">=3.8" files = [ - {file = "pywinpty-2.0.11-cp310-none-win_amd64.whl", hash = "sha256:452f10ac9ff8ab9151aa8cea9e491a9612a12250b1899278c6a56bc184afb47f"}, - {file = "pywinpty-2.0.11-cp311-none-win_amd64.whl", hash = "sha256:6701867d42aec1239bc0fedf49a336570eb60eb886e81763db77ea2b6c533cc3"}, - {file = "pywinpty-2.0.11-cp38-none-win_amd64.whl", hash = "sha256:0ffd287751ad871141dc9724de70ea21f7fc2ff1af50861e0d232cf70739d8c4"}, - {file = "pywinpty-2.0.11-cp39-none-win_amd64.whl", hash = "sha256:e4e7f023c28ca7aa8e1313e53ba80a4d10171fe27857b7e02f99882dfe3e8638"}, - {file = "pywinpty-2.0.11.tar.gz", hash = "sha256:e244cffe29a894876e2cd251306efd0d8d64abd5ada0a46150a4a71c0b9ad5c5"}, + {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, + {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, + {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, + {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, + {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, + {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, ] [[package]] @@ -3092,135 +3464,124 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.0" +version = "26.2.0" description = "Python bindings for 0MQ" optional = false -python-versions = ">=3.6" -files = [ - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a6169e69034eaa06823da6a93a7739ff38716142b3596c180363dee729d713d"}, - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19d0383b1f18411d137d891cab567de9afa609b214de68b86e20173dc624c101"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e931d9a92f628858a50f5bdffdfcf839aebe388b82f9d2ccd5d22a38a789dc"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d984b1b2f574bc1bb58296d3c0b64b10e95e7026f8716ed6c0b86d4679843f"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:154bddda2a351161474b36dba03bf1463377ec226a13458725183e508840df89"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cb6d161ae94fb35bb518b74bb06b7293299c15ba3bc099dccd6a5b7ae589aee3"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:90146ab578931e0e2826ee39d0c948d0ea72734378f1898939d18bc9c823fcf9"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:831ba20b660b39e39e5ac8603e8193f8fce1ee03a42c84ade89c36a251449d80"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a522510e3434e12aff80187144c6df556bb06fe6b9d01b2ecfbd2b5bfa5c60c"}, - {file = "pyzmq-25.1.0-cp310-cp310-win32.whl", hash = "sha256:be24a5867b8e3b9dd5c241de359a9a5217698ff616ac2daa47713ba2ebe30ad1"}, - {file = "pyzmq-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:5693dcc4f163481cf79e98cf2d7995c60e43809e325b77a7748d8024b1b7bcba"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:13bbe36da3f8aaf2b7ec12696253c0bf6ffe05f4507985a8844a1081db6ec22d"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:69511d604368f3dc58d4be1b0bad99b61ee92b44afe1cd9b7bd8c5e34ea8248a"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a983c8694667fd76d793ada77fd36c8317e76aa66eec75be2653cef2ea72883"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:332616f95eb400492103ab9d542b69d5f0ff628b23129a4bc0a2fd48da6e4e0b"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58416db767787aedbfd57116714aad6c9ce57215ffa1c3758a52403f7c68cff5"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cad9545f5801a125f162d09ec9b724b7ad9b6440151b89645241d0120e119dcc"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d6128d431b8dfa888bf51c22a04d48bcb3d64431caf02b3cb943269f17fd2994"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b15247c49d8cbea695b321ae5478d47cffd496a2ec5ef47131a9e79ddd7e46c"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:442d3efc77ca4d35bee3547a8e08e8d4bb88dadb54a8377014938ba98d2e074a"}, - {file = "pyzmq-25.1.0-cp311-cp311-win32.whl", hash = "sha256:65346f507a815a731092421d0d7d60ed551a80d9b75e8b684307d435a5597425"}, - {file = "pyzmq-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b45d722046fea5a5694cba5d86f21f78f0052b40a4bbbbf60128ac55bfcc7b6"}, - {file = "pyzmq-25.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f45808eda8b1d71308c5416ef3abe958f033fdbb356984fabbfc7887bed76b3f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b697774ea8273e3c0460cf0bba16cd85ca6c46dfe8b303211816d68c492e132"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b324fa769577fc2c8f5efcd429cef5acbc17d63fe15ed16d6dcbac2c5eb00849"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5873d6a60b778848ce23b6c0ac26c39e48969823882f607516b91fb323ce80e5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f0d9e7ba6a815a12c8575ba7887da4b72483e4cfc57179af10c9b937f3f9308f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:414b8beec76521358b49170db7b9967d6974bdfc3297f47f7d23edec37329b00"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:01f06f33e12497dca86353c354461f75275a5ad9eaea181ac0dc1662da8074fa"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win32.whl", hash = "sha256:b5a07c4f29bf7cb0164664ef87e4aa25435dcc1f818d29842118b0ac1eb8e2b5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:968b0c737797c1809ec602e082cb63e9824ff2329275336bb88bd71591e94a90"}, - {file = "pyzmq-25.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47b915ba666c51391836d7ed9a745926b22c434efa76c119f77bcffa64d2c50c"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5af31493663cf76dd36b00dafbc839e83bbca8a0662931e11816d75f36155897"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5489738a692bc7ee9a0a7765979c8a572520d616d12d949eaffc6e061b82b4d1"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1fc56a0221bdf67cfa94ef2d6ce5513a3d209c3dfd21fed4d4e87eca1822e3a3"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:75217e83faea9edbc29516fc90c817bc40c6b21a5771ecb53e868e45594826b0"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3830be8826639d801de9053cf86350ed6742c4321ba4236e4b5568528d7bfed7"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3575699d7fd7c9b2108bc1c6128641a9a825a58577775ada26c02eb29e09c517"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win32.whl", hash = "sha256:95bd3a998d8c68b76679f6b18f520904af5204f089beebb7b0301d97704634dd"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dbc466744a2db4b7ca05589f21ae1a35066afada2f803f92369f5877c100ef62"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:3bed53f7218490c68f0e82a29c92335daa9606216e51c64f37b48eb78f1281f4"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb52e826d16c09ef87132c6e360e1879c984f19a4f62d8a935345deac43f3c12"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ddbef8b53cd16467fdbfa92a712eae46dd066aa19780681a2ce266e88fbc7165"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9301cf1d7fc1ddf668d0abbe3e227fc9ab15bc036a31c247276012abb921b5ff"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e23a8c3b6c06de40bdb9e06288180d630b562db8ac199e8cc535af81f90e64b"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a82faae00d1eed4809c2f18b37f15ce39a10a1c58fe48b60ad02875d6e13d80"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8398a1b1951aaa330269c35335ae69744be166e67e0ebd9869bdc09426f3871"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d40682ac60b2a613d36d8d3a0cd14fbdf8e7e0618fbb40aa9fa7b796c9081584"}, - {file = "pyzmq-25.1.0-cp38-cp38-win32.whl", hash = "sha256:33d5c8391a34d56224bccf74f458d82fc6e24b3213fc68165c98b708c7a69325"}, - {file = "pyzmq-25.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c66b7ff2527e18554030319b1376d81560ca0742c6e0b17ff1ee96624a5f1afd"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:af56229ea6527a849ac9fb154a059d7e32e77a8cba27e3e62a1e38d8808cb1a5"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdca18b94c404af6ae5533cd1bc310c4931f7ac97c148bbfd2cd4bdd62b96253"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b6b42f7055bbc562f63f3df3b63e3dd1ebe9727ff0f124c3aa7bcea7b3a00f9"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c2fc7aad520a97d64ffc98190fce6b64152bde57a10c704b337082679e74f67"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86a26415a8b6af02cd8d782e3a9ae3872140a057f1cadf0133de685185c02b"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851fb2fe14036cfc1960d806628b80276af5424db09fe5c91c726890c8e6d943"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a21fec5c3cea45421a19ccbe6250c82f97af4175bc09de4d6dd78fb0cb4c200"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bad172aba822444b32eae54c2d5ab18cd7dee9814fd5c7ed026603b8cae2d05f"}, - {file = "pyzmq-25.1.0-cp39-cp39-win32.whl", hash = "sha256:4d67609b37204acad3d566bb7391e0ecc25ef8bae22ff72ebe2ad7ffb7847158"}, - {file = "pyzmq-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:71c7b5896e40720d30cd77a81e62b433b981005bbff0cb2f739e0f8d059b5d99"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb27ef9d3bdc0c195b2dc54fcb8720e18b741624686a81942e14c8b67cc61a6"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c4fc2741e0513b5d5a12fe200d6785bbcc621f6f2278893a9ca7bed7f2efb7d"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc34fdd458ff77a2a00e3c86f899911f6f269d393ca5675842a6e92eea565bae"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8751f9c1442624da391bbd92bd4b072def6d7702a9390e4479f45c182392ff78"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6581e886aec3135964a302a0f5eb68f964869b9efd1dbafdebceaaf2934f8a68"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5482f08d2c3c42b920e8771ae8932fbaa0a67dff925fc476996ddd8155a170f3"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7fbcafa3ea16d1de1f213c226005fea21ee16ed56134b75b2dede5a2129e62"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adecf6d02b1beab8d7c04bc36f22bb0e4c65a35eb0b4750b91693631d4081c70"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6d39e42a0aa888122d1beb8ec0d4ddfb6c6b45aecb5ba4013c27e2f28657765"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7018289b402ebf2b2c06992813523de61d4ce17bd514c4339d8f27a6f6809492"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9e68ae9864d260b18f311b68d29134d8776d82e7f5d75ce898b40a88df9db30f"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e21cc00e4debe8f54c3ed7b9fcca540f46eee12762a9fa56feb8512fd9057161"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f666ae327a6899ff560d741681fdcdf4506f990595201ed39b44278c471ad98"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5efcc29056dfe95e9c9db0dfbb12b62db9c4ad302f812931b6d21dd04a9119"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:48e5e59e77c1a83162ab3c163fc01cd2eebc5b34560341a67421b09be0891287"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:108c96ebbd573d929740d66e4c3d1bdf31d5cde003b8dc7811a3c8c5b0fc173b"}, - {file = "pyzmq-25.1.0.tar.gz", hash = "sha256:80c41023465d36280e801564a69cbfce8ae85ff79b080e1913f6e90481fb8957"}, -] - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} - -[[package]] -name = "qtconsole" -version = "5.4.3" -description = "Jupyter Qt console" -optional = false -python-versions = ">= 3.7" -files = [ - {file = "qtconsole-5.4.3-py3-none-any.whl", hash = "sha256:35fd6e87b1f6d1fd41801b07e69339f8982e76afd4fa8ef35595bc6036717189"}, - {file = "qtconsole-5.4.3.tar.gz", hash = "sha256:5e4082a86a201796b2a5cfd4298352d22b158b51b57736531824715fc2a979dd"}, -] - -[package.dependencies] -ipykernel = ">=4.1" -ipython-genutils = "*" -jupyter-client = ">=4.1" -jupyter-core = "*" -packaging = "*" -pygments = "*" -pyzmq = ">=17.1" -qtpy = ">=2.0.1" -traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" - -[package.extras] -doc = ["Sphinx (>=1.3)"] -test = ["flaky", "pytest", "pytest-qt"] - -[[package]] -name = "qtpy" -version = "2.3.1" -description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." -optional = false python-versions = ">=3.7" files = [ - {file = "QtPy-2.3.1-py3-none-any.whl", hash = "sha256:5193d20e0b16e4d9d3bc2c642d04d9f4e2c892590bd1b9c92bfe38a95d5a2e12"}, - {file = "QtPy-2.3.1.tar.gz", hash = "sha256:a8c74982d6d172ce124d80cafd39653df78989683f760f2281ba91a6e7b9de8b"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629"}, + {file = "pyzmq-26.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a"}, + {file = "pyzmq-26.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282"}, + {file = "pyzmq-26.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea"}, + {file = "pyzmq-26.2.0-cp310-cp310-win32.whl", hash = "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971"}, + {file = "pyzmq-26.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218"}, + {file = "pyzmq-26.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf"}, + {file = "pyzmq-26.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3"}, + {file = "pyzmq-26.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6"}, + {file = "pyzmq-26.2.0-cp311-cp311-win32.whl", hash = "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5"}, + {file = "pyzmq-26.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9"}, + {file = "pyzmq-26.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae"}, + {file = "pyzmq-26.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3"}, + {file = "pyzmq-26.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b"}, + {file = "pyzmq-26.2.0-cp312-cp312-win32.whl", hash = "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a"}, + {file = "pyzmq-26.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726"}, + {file = "pyzmq-26.2.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187"}, + {file = "pyzmq-26.2.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115"}, + {file = "pyzmq-26.2.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e"}, + {file = "pyzmq-26.2.0-cp313-cp313-win32.whl", hash = "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad"}, + {file = "pyzmq-26.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a"}, + {file = "pyzmq-26.2.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797"}, + {file = "pyzmq-26.2.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6"}, + {file = "pyzmq-26.2.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0"}, + {file = "pyzmq-26.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1"}, + {file = "pyzmq-26.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097"}, + {file = "pyzmq-26.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win32.whl", hash = "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951"}, + {file = "pyzmq-26.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f"}, + {file = "pyzmq-26.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289"}, + {file = "pyzmq-26.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640"}, + {file = "pyzmq-26.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd"}, + {file = "pyzmq-26.2.0-cp38-cp38-win32.whl", hash = "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988"}, + {file = "pyzmq-26.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2"}, + {file = "pyzmq-26.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9"}, + {file = "pyzmq-26.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc"}, + {file = "pyzmq-26.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940"}, + {file = "pyzmq-26.2.0-cp39-cp39-win32.whl", hash = "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec"}, + {file = "pyzmq-26.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca"}, + {file = "pyzmq-26.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6"}, + {file = "pyzmq-26.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc"}, + {file = "pyzmq-26.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4"}, + {file = "pyzmq-26.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f"}, + {file = "pyzmq-26.2.0.tar.gz", hash = "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f"}, ] [package.dependencies] -packaging = "*" - -[package.extras] -test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "rdt" @@ -3248,13 +3609,13 @@ test = ["copulas (>=0.6.0,<0.7)", "jupyter (>=1.0.0,<2)", "pytest (>=3.4.2)", "p [[package]] name = "referencing" -version = "0.30.0" +version = "0.35.1" description = "JSON Referencing + Python" optional = false python-versions = ">=3.8" files = [ - {file = "referencing-0.30.0-py3-none-any.whl", hash = "sha256:c257b08a399b6c2f5a3510a50d28ab5dbc7bbde049bcaf954d43c446f83ab548"}, - {file = "referencing-0.30.0.tar.gz", hash = "sha256:47237742e990457f7512c7d27486394a9aadaf876cbfaa4be65b27b4f4d47c6b"}, + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, ] [package.dependencies] @@ -3295,13 +3656,13 @@ torch = "*" [[package]] name = "requests" -version = "2.31.0" +version = "2.32.3" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, ] [package.dependencies] @@ -3341,143 +3702,154 @@ files = [ [[package]] name = "rpds-py" -version = "0.9.2" +version = "0.20.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.9.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:ab6919a09c055c9b092798ce18c6c4adf49d24d4d9e43a92b257e3f2548231e7"}, - {file = "rpds_py-0.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d55777a80f78dd09410bd84ff8c95ee05519f41113b2df90a69622f5540c4f8b"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a216b26e5af0a8e265d4efd65d3bcec5fba6b26909014effe20cd302fd1138fa"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:29cd8bfb2d716366a035913ced99188a79b623a3512292963d84d3e06e63b496"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44659b1f326214950a8204a248ca6199535e73a694be8d3e0e869f820767f12f"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:745f5a43fdd7d6d25a53ab1a99979e7f8ea419dfefebcab0a5a1e9095490ee5e"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a987578ac5214f18b99d1f2a3851cba5b09f4a689818a106c23dbad0dfeb760f"}, - {file = "rpds_py-0.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bf4151acb541b6e895354f6ff9ac06995ad9e4175cbc6d30aaed08856558201f"}, - {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:03421628f0dc10a4119d714a17f646e2837126a25ac7a256bdf7c3943400f67f"}, - {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:13b602dc3e8dff3063734f02dcf05111e887f301fdda74151a93dbbc249930fe"}, - {file = "rpds_py-0.9.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:fae5cb554b604b3f9e2c608241b5d8d303e410d7dfb6d397c335f983495ce7f6"}, - {file = "rpds_py-0.9.2-cp310-none-win32.whl", hash = "sha256:47c5f58a8e0c2c920cc7783113df2fc4ff12bf3a411d985012f145e9242a2764"}, - {file = "rpds_py-0.9.2-cp310-none-win_amd64.whl", hash = "sha256:4ea6b73c22d8182dff91155af018b11aac9ff7eca085750455c5990cb1cfae6e"}, - {file = "rpds_py-0.9.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e564d2238512c5ef5e9d79338ab77f1cbbda6c2d541ad41b2af445fb200385e3"}, - {file = "rpds_py-0.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f411330a6376fb50e5b7a3e66894e4a39e60ca2e17dce258d53768fea06a37bd"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e7521f5af0233e89939ad626b15278c71b69dc1dfccaa7b97bd4cdf96536bb7"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8d3335c03100a073883857e91db9f2e0ef8a1cf42dc0369cbb9151c149dbbc1b"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d25b1c1096ef0447355f7293fbe9ad740f7c47ae032c2884113f8e87660d8f6e"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a5d3fbd02efd9cf6a8ffc2f17b53a33542f6b154e88dd7b42ef4a4c0700fdad"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5934e2833afeaf36bd1eadb57256239785f5af0220ed8d21c2896ec4d3a765f"}, - {file = "rpds_py-0.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:095b460e117685867d45548fbd8598a8d9999227e9061ee7f012d9d264e6048d"}, - {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:91378d9f4151adc223d584489591dbb79f78814c0734a7c3bfa9c9e09978121c"}, - {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:24a81c177379300220e907e9b864107614b144f6c2a15ed5c3450e19cf536fae"}, - {file = "rpds_py-0.9.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:de0b6eceb46141984671802d412568d22c6bacc9b230174f9e55fc72ef4f57de"}, - {file = "rpds_py-0.9.2-cp311-none-win32.whl", hash = "sha256:700375326ed641f3d9d32060a91513ad668bcb7e2cffb18415c399acb25de2ab"}, - {file = "rpds_py-0.9.2-cp311-none-win_amd64.whl", hash = "sha256:0766babfcf941db8607bdaf82569ec38107dbb03c7f0b72604a0b346b6eb3298"}, - {file = "rpds_py-0.9.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:b1440c291db3f98a914e1afd9d6541e8fc60b4c3aab1a9008d03da4651e67386"}, - {file = "rpds_py-0.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0f2996fbac8e0b77fd67102becb9229986396e051f33dbceada3debaacc7033f"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f30d205755566a25f2ae0382944fcae2f350500ae4df4e795efa9e850821d82"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:159fba751a1e6b1c69244e23ba6c28f879a8758a3e992ed056d86d74a194a0f3"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1f044792e1adcea82468a72310c66a7f08728d72a244730d14880cd1dabe36b"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9251eb8aa82e6cf88510530b29eef4fac825a2b709baf5b94a6094894f252387"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:01899794b654e616c8625b194ddd1e5b51ef5b60ed61baa7a2d9c2ad7b2a4238"}, - {file = "rpds_py-0.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b0c43f8ae8f6be1d605b0465671124aa8d6a0e40f1fb81dcea28b7e3d87ca1e1"}, - {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:207f57c402d1f8712618f737356e4b6f35253b6d20a324d9a47cb9f38ee43a6b"}, - {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b52e7c5ae35b00566d244ffefba0f46bb6bec749a50412acf42b1c3f402e2c90"}, - {file = "rpds_py-0.9.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:978fa96dbb005d599ec4fd9ed301b1cc45f1a8f7982d4793faf20b404b56677d"}, - {file = "rpds_py-0.9.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:6aa8326a4a608e1c28da191edd7c924dff445251b94653988efb059b16577a4d"}, - {file = "rpds_py-0.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:aad51239bee6bff6823bbbdc8ad85136c6125542bbc609e035ab98ca1e32a192"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bd4dc3602370679c2dfb818d9c97b1137d4dd412230cfecd3c66a1bf388a196"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd9da77c6ec1f258387957b754f0df60766ac23ed698b61941ba9acccd3284d1"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:190ca6f55042ea4649ed19c9093a9be9d63cd8a97880106747d7147f88a49d18"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:876bf9ed62323bc7dcfc261dbc5572c996ef26fe6406b0ff985cbcf460fc8a4c"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa2818759aba55df50592ecbc95ebcdc99917fa7b55cc6796235b04193eb3c55"}, - {file = "rpds_py-0.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9ea4d00850ef1e917815e59b078ecb338f6a8efda23369677c54a5825dbebb55"}, - {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5855c85eb8b8a968a74dc7fb014c9166a05e7e7a8377fb91d78512900aadd13d"}, - {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:14c408e9d1a80dcb45c05a5149e5961aadb912fff42ca1dd9b68c0044904eb32"}, - {file = "rpds_py-0.9.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:65a0583c43d9f22cb2130c7b110e695fff834fd5e832a776a107197e59a1898e"}, - {file = "rpds_py-0.9.2-cp38-none-win32.whl", hash = "sha256:71f2f7715935a61fa3e4ae91d91b67e571aeb5cb5d10331ab681256bda2ad920"}, - {file = "rpds_py-0.9.2-cp38-none-win_amd64.whl", hash = "sha256:674c704605092e3ebbbd13687b09c9f78c362a4bc710343efe37a91457123044"}, - {file = "rpds_py-0.9.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:07e2c54bef6838fa44c48dfbc8234e8e2466d851124b551fc4e07a1cfeb37260"}, - {file = "rpds_py-0.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7fdf55283ad38c33e35e2855565361f4bf0abd02470b8ab28d499c663bc5d7c"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:890ba852c16ace6ed9f90e8670f2c1c178d96510a21b06d2fa12d8783a905193"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:50025635ba8b629a86d9d5474e650da304cb46bbb4d18690532dd79341467846"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:517cbf6e67ae3623c5127206489d69eb2bdb27239a3c3cc559350ef52a3bbf0b"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0836d71ca19071090d524739420a61580f3f894618d10b666cf3d9a1688355b1"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c439fd54b2b9053717cca3de9583be6584b384d88d045f97d409f0ca867d80f"}, - {file = "rpds_py-0.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f68996a3b3dc9335037f82754f9cdbe3a95db42bde571d8c3be26cc6245f2324"}, - {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7d68dc8acded354c972116f59b5eb2e5864432948e098c19fe6994926d8e15c3"}, - {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:f963c6b1218b96db85fc37a9f0851eaf8b9040aa46dec112611697a7023da535"}, - {file = "rpds_py-0.9.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a46859d7f947061b4010e554ccd1791467d1b1759f2dc2ec9055fa239f1bc26"}, - {file = "rpds_py-0.9.2-cp39-none-win32.whl", hash = "sha256:e07e5dbf8a83c66783a9fe2d4566968ea8c161199680e8ad38d53e075df5f0d0"}, - {file = "rpds_py-0.9.2-cp39-none-win_amd64.whl", hash = "sha256:682726178138ea45a0766907957b60f3a1bf3acdf212436be9733f28b6c5af3c"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:196cb208825a8b9c8fc360dc0f87993b8b260038615230242bf18ec84447c08d"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c7671d45530fcb6d5e22fd40c97e1e1e01965fc298cbda523bb640f3d923b387"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83b32f0940adec65099f3b1c215ef7f1d025d13ff947975a055989cb7fd019a4"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f67da97f5b9eac838b6980fc6da268622e91f8960e083a34533ca710bec8611"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:03975db5f103997904c37e804e5f340c8fdabbb5883f26ee50a255d664eed58c"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:987b06d1cdb28f88a42e4fb8a87f094e43f3c435ed8e486533aea0bf2e53d931"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c861a7e4aef15ff91233751619ce3a3d2b9e5877e0fcd76f9ea4f6847183aa16"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:02938432352359805b6da099c9c95c8a0547fe4b274ce8f1a91677401bb9a45f"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:ef1f08f2a924837e112cba2953e15aacfccbbfcd773b4b9b4723f8f2ddded08e"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:35da5cc5cb37c04c4ee03128ad59b8c3941a1e5cd398d78c37f716f32a9b7f67"}, - {file = "rpds_py-0.9.2-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:141acb9d4ccc04e704e5992d35472f78c35af047fa0cfae2923835d153f091be"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:79f594919d2c1a0cc17d1988a6adaf9a2f000d2e1048f71f298b056b1018e872"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:a06418fe1155e72e16dddc68bb3780ae44cebb2912fbd8bb6ff9161de56e1798"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b2eb034c94b0b96d5eddb290b7b5198460e2d5d0c421751713953a9c4e47d10"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8b08605d248b974eb02f40bdcd1a35d3924c83a2a5e8f5d0fa5af852c4d960af"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a0805911caedfe2736935250be5008b261f10a729a303f676d3d5fea6900c96a"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ab2299e3f92aa5417d5e16bb45bb4586171c1327568f638e8453c9f8d9e0f020"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c8d7594e38cf98d8a7df25b440f684b510cf4627fe038c297a87496d10a174f"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8b9ec12ad5f0a4625db34db7e0005be2632c1013b253a4a60e8302ad4d462afd"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1fcdee18fea97238ed17ab6478c66b2095e4ae7177e35fb71fbe561a27adf620"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:933a7d5cd4b84f959aedeb84f2030f0a01d63ae6cf256629af3081cf3e3426e8"}, - {file = "rpds_py-0.9.2-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:686ba516e02db6d6f8c279d1641f7067ebb5dc58b1d0536c4aaebb7bf01cdc5d"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0173c0444bec0a3d7d848eaeca2d8bd32a1b43f3d3fde6617aac3731fa4be05f"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:d576c3ef8c7b2d560e301eb33891d1944d965a4d7a2eacb6332eee8a71827db6"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed89861ee8c8c47d6beb742a602f912b1bb64f598b1e2f3d758948721d44d468"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1054a08e818f8e18910f1bee731583fe8f899b0a0a5044c6e680ceea34f93876"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:99e7c4bb27ff1aab90dcc3e9d37ee5af0231ed98d99cb6f5250de28889a3d502"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c545d9d14d47be716495076b659db179206e3fd997769bc01e2d550eeb685596"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9039a11bca3c41be5a58282ed81ae422fa680409022b996032a43badef2a3752"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fb39aca7a64ad0c9490adfa719dbeeb87d13be137ca189d2564e596f8ba32c07"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2d8b3b3a2ce0eaa00c5bbbb60b6713e94e7e0becab7b3db6c5c77f979e8ed1f1"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:99b1c16f732b3a9971406fbfe18468592c5a3529585a45a35adbc1389a529a03"}, - {file = "rpds_py-0.9.2-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c27ee01a6c3223025f4badd533bea5e87c988cb0ba2811b690395dfe16088cfe"}, - {file = "rpds_py-0.9.2.tar.gz", hash = "sha256:8d70e8f14900f2657c249ea4def963bed86a29b81f81f5b76b5a9215680de945"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, ] [[package]] name = "scikit-learn" -version = "1.3.0" +version = "1.3.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.8" files = [ - {file = "scikit-learn-1.3.0.tar.gz", hash = "sha256:8be549886f5eda46436b6e555b0e4873b4f10aa21c07df45c4bc1735afbccd7a"}, - {file = "scikit_learn-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981287869e576d42c682cf7ca96af0c6ac544ed9316328fd0d9292795c742cf5"}, - {file = "scikit_learn-1.3.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:436aaaae2c916ad16631142488e4c82f4296af2404f480e031d866863425d2a2"}, - {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e28d8fa47a0b30ae1bd7a079519dd852764e31708a7804da6cb6f8b36e3630"}, - {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80c08834a473d08a204d966982a62e11c976228d306a2648c575e3ead12111"}, - {file = "scikit_learn-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:552fd1b6ee22900cf1780d7386a554bb96949e9a359999177cf30211e6b20df6"}, - {file = "scikit_learn-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79970a6d759eb00a62266a31e2637d07d2d28446fca8079cf9afa7c07b0427f8"}, - {file = "scikit_learn-1.3.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:850a00b559e636b23901aabbe79b73dc604b4e4248ba9e2d6e72f95063765603"}, - {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee04835fb016e8062ee9fe9074aef9b82e430504e420bff51e3e5fffe72750ca"}, - {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d953531f5d9f00c90c34fa3b7d7cfb43ecff4c605dac9e4255a20b114a27369"}, - {file = "scikit_learn-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:151ac2bf65ccf363664a689b8beafc9e6aae36263db114b4ca06fbbbf827444a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a885a9edc9c0a341cab27ec4f8a6c58b35f3d449c9d2503a6fd23e06bbd4f6a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9877af9c6d1b15486e18a94101b742e9d0d2f343d35a634e337411ddb57783f3"}, - {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c470f53cea065ff3d588050955c492793bb50c19a92923490d18fcb637f6383a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6e2d7389542eae01077a1ee0318c4fec20c66c957f45c7aac0c6eb0fe3c612"}, - {file = "scikit_learn-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:3a11936adbc379a6061ea32fa03338d4ca7248d86dd507c81e13af428a5bc1db"}, - {file = "scikit_learn-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:998d38fcec96584deee1e79cd127469b3ad6fefd1ea6c2dfc54e8db367eb396b"}, - {file = "scikit_learn-1.3.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ded35e810438a527e17623ac6deae3b360134345b7c598175ab7741720d7ffa7"}, - {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8102d5036e28d08ab47166b48c8d5e5810704daecf3a476a4282d562be9a28"}, - {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7617164951c422747e7c32be4afa15d75ad8044f42e7d70d3e2e0429a50e6718"}, - {file = "scikit_learn-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d54fb9e6038284548072df22fd34777e434153f7ffac72c8596f2d6987110dd"}, + {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161"}, + {file = "scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433"}, + {file = "scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c"}, + {file = "scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a19f90f95ba93c1a7f7924906d0576a84da7f3b2282ac3bfb7a08a32801add93"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e1e94cc23d04d39da797ee34236ce2375ddea158b10bee3c343647d615581d"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf"}, + {file = "scikit_learn-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:64381066f8aa63c2710e6b56edc9f0894cc7bf59bd71b8ce5613a4559b6145e0"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6c43290337f7a4b969d207e620658372ba3c1ffb611f8bc2b6f031dc5c6d1d03"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:dc9002fc200bed597d5d34e90c752b74df516d592db162f756cc52836b38fe0e"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, + {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, ] [package.dependencies] joblib = ">=1.1.1" -numpy = ">=1.17.3" +numpy = ">=1.17.3,<2.0" scipy = ">=1.5.0" threadpoolctl = ">=2.0.0" @@ -3580,34 +3952,34 @@ test = ["jupyter (>=1.0.0,<2)", "pytest (>=3.4.2)", "pytest-cov (>=2.6.0)", "pyt [[package]] name = "seaborn" -version = "0.12.2" +version = "0.13.2" description = "Statistical data visualization" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "seaborn-0.12.2-py3-none-any.whl", hash = "sha256:ebf15355a4dba46037dfd65b7350f014ceb1f13c05e814eda2c9f5fd731afc08"}, - {file = "seaborn-0.12.2.tar.gz", hash = "sha256:374645f36509d0dcab895cba5b47daf0586f77bfe3b36c97c607db7da5be0139"}, + {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.1,<3.6.1 || >3.6.1" -numpy = ">=1.17,<1.24.0 || >1.24.0" -pandas = ">=0.25" +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-copybutton", "sphinx-design", "sphinx-issues"] -stats = ["scipy (>=1.3)", "statsmodels (>=0.10)"] +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 = "send2trash" -version = "1.8.2" +version = "1.8.3" description = "Send file to trash natively under Mac OS X, Windows and Linux" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "Send2Trash-1.8.2-py3-none-any.whl", hash = "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679"}, - {file = "Send2Trash-1.8.2.tar.gz", hash = "sha256:c132d59fa44b9ca2b1699af5c86f57ce9f4c5eb56629d5d55fbb7a35f84e2312"}, + {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, + {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, ] [package.extras] @@ -3615,6 +3987,26 @@ nativelib = ["pyobjc-framework-Cocoa", "pywin32"] objc = ["pyobjc-framework-Cocoa"] win32 = ["pywin32"] +[[package]] +name = "setuptools" +version = "75.1.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-75.1.0-py3-none-any.whl", hash = "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2"}, + {file = "setuptools-75.1.0.tar.gz", hash = "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538"}, +] + +[package.extras] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] + [[package]] name = "six" version = "1.16.0" @@ -3628,13 +4020,13 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -3650,31 +4042,31 @@ files = [ [[package]] name = "soupsieve" -version = "2.4.1" +version = "2.6" description = "A modern CSS selector implementation for Beautiful Soup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, - {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, + {file = "soupsieve-2.6-py3-none-any.whl", hash = "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9"}, + {file = "soupsieve-2.6.tar.gz", hash = "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb"}, ] [[package]] name = "sphinx" -version = "6.2.1" +version = "7.1.2" description = "Python documentation generator" optional = false python-versions = ">=3.8" files = [ - {file = "Sphinx-6.2.1.tar.gz", hash = "sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b"}, - {file = "sphinx-6.2.1-py3-none-any.whl", hash = "sha256:97787ff1fa3256a3eef9eda523a63dbf299f7b47e053cfcf684a1c2a8380c912"}, + {file = "sphinx-7.1.2-py3-none-any.whl", hash = "sha256:d170a81825b2fcacb6dfd5a0d7f578a053e45d3f2b153fecc948c37344eb4cbe"}, + {file = "sphinx-7.1.2.tar.gz", hash = "sha256:780f4d32f1d7d1126576e0e5ecc19dc32ab76cd24e950228dcf7b1f6d3d9e22f"}, ] [package.dependencies] alabaster = ">=0.7,<0.8" babel = ">=2.9" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.18.1,<0.20" +docutils = ">=0.18.1,<0.21" imagesize = ">=1.3" importlib-metadata = {version = ">=4.8", markers = "python_version < \"3.10\""} Jinja2 = ">=3.0" @@ -3696,37 +4088,37 @@ test = ["cython", "filelock", "html5lib", "pytest (>=4.6)"] [[package]] name = "sphinx-autodoc-typehints" -version = "1.23.0" +version = "2.0.1" description = "Type hints (PEP 484) support for the Sphinx autodoc extension" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "sphinx_autodoc_typehints-1.23.0-py3-none-any.whl", hash = "sha256:ac099057e66b09e51b698058ba7dd76e57e1fe696cd91b54e121d3dad188f91d"}, - {file = "sphinx_autodoc_typehints-1.23.0.tar.gz", hash = "sha256:5d44e2996633cdada499b6d27a496ddf9dbc95dd1f0f09f7b37940249e61f6e9"}, + {file = "sphinx_autodoc_typehints-2.0.1-py3-none-any.whl", hash = "sha256:f73ae89b43a799e587e39266672c1075b2ef783aeb382d3ebed77c38a3fc0149"}, + {file = "sphinx_autodoc_typehints-2.0.1.tar.gz", hash = "sha256:60ed1e3b2c970acc0aa6e877be42d48029a9faec7378a17838716cacd8c10b12"}, ] [package.dependencies] -sphinx = ">=5.3" +sphinx = ">=7.1.2" [package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23.4)"] -testing = ["covdefaults (>=2.2.2)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "nptyping (>=2.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "sphobjinv (>=2.3.1)", "typing-extensions (>=4.5)"] -type-comment = ["typed-ast (>=1.5.4)"] +docs = ["furo (>=2024.1.29)"] +numpy = ["nptyping (>=2.5)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.4.2)", "diff-cover (>=8.0.3)", "pytest (>=8.0.1)", "pytest-cov (>=4.1)", "sphobjinv (>=2.3.1)", "typing-extensions (>=4.9)"] [[package]] name = "sphinx-rtd-theme" -version = "1.2.2" +version = "2.0.0" description = "Read the Docs theme for Sphinx" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.6" files = [ - {file = "sphinx_rtd_theme-1.2.2-py2.py3-none-any.whl", hash = "sha256:6a7e7d8af34eb8fc57d52a09c6b6b9c46ff44aea5951bc831eeb9245378f3689"}, - {file = "sphinx_rtd_theme-1.2.2.tar.gz", hash = "sha256:01c5c5a72e2d025bd23d1f06c59a4831b06e6ce6c01fdd5ebfe9986c0a880fc7"}, + {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"}, + {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"}, ] [package.dependencies] -docutils = "<0.19" -sphinx = ">=1.6,<7" +docutils = "<0.21" +sphinx = ">=5,<8" sphinxcontrib-jquery = ">=4,<5" [package.extras] @@ -3837,61 +4229,70 @@ test = ["pytest"] [[package]] name = "sqlalchemy" -version = "2.0.19" +version = "2.0.35" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9deaae357edc2091a9ed5d25e9ee8bba98bcfae454b3911adeaf159c2e9ca9e3"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bf0fd65b50a330261ec7fe3d091dfc1c577483c96a9fa1e4323e932961aa1b5"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d90ccc15ba1baa345796a8fb1965223ca7ded2d235ccbef80a47b85cea2d71a"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb4e688f6784427e5f9479d1a13617f573de8f7d4aa713ba82813bcd16e259d1"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:584f66e5e1979a7a00f4935015840be627e31ca29ad13f49a6e51e97a3fb8cae"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c69ce70047b801d2aba3e5ff3cba32014558966109fecab0c39d16c18510f15"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win32.whl", hash = "sha256:96f0463573469579d32ad0c91929548d78314ef95c210a8115346271beeeaaa2"}, - {file = "SQLAlchemy-2.0.19-cp310-cp310-win_amd64.whl", hash = "sha256:22bafb1da60c24514c141a7ff852b52f9f573fb933b1e6b5263f0daa28ce6db9"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d6894708eeb81f6d8193e996257223b6bb4041cb05a17cd5cf373ed836ef87a2"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8f2afd1aafded7362b397581772c670f20ea84d0a780b93a1a1529da7c3d369"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15afbf5aa76f2241184c1d3b61af1a72ba31ce4161013d7cb5c4c2fca04fd6e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc05b59142445a4efb9c1fd75c334b431d35c304b0e33f4fa0ff1ea4890f92e"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5831138f0cc06b43edf5f99541c64adf0ab0d41f9a4471fd63b54ae18399e4de"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3afa8a21a9046917b3a12ffe016ba7ebe7a55a6fc0c7d950beb303c735c3c3ad"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win32.whl", hash = "sha256:c896d4e6ab2eba2afa1d56be3d0b936c56d4666e789bfc59d6ae76e9fcf46145"}, - {file = "SQLAlchemy-2.0.19-cp311-cp311-win_amd64.whl", hash = "sha256:024d2f67fb3ec697555e48caeb7147cfe2c08065a4f1a52d93c3d44fc8e6ad1c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:89bc2b374ebee1a02fd2eae6fd0570b5ad897ee514e0f84c5c137c942772aa0c"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd4d410a76c3762511ae075d50f379ae09551d92525aa5bb307f8343bf7c2c12"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f469f15068cd8351826df4080ffe4cc6377c5bf7d29b5a07b0e717dddb4c7ea2"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:cda283700c984e699e8ef0fcc5c61f00c9d14b6f65a4f2767c97242513fcdd84"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:43699eb3f80920cc39a380c159ae21c8a8924fe071bccb68fc509e099420b148"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win32.whl", hash = "sha256:61ada5831db36d897e28eb95f0f81814525e0d7927fb51145526c4e63174920b"}, - {file = "SQLAlchemy-2.0.19-cp37-cp37m-win_amd64.whl", hash = "sha256:57d100a421d9ab4874f51285c059003292433c648df6abe6c9c904e5bd5b0828"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:16a310f5bc75a5b2ce7cb656d0e76eb13440b8354f927ff15cbaddd2523ee2d1"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cf7b5e3856cbf1876da4e9d9715546fa26b6e0ba1a682d5ed2fc3ca4c7c3ec5b"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e7b69d9ced4b53310a87117824b23c509c6fc1f692aa7272d47561347e133b6"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f9eb4575bfa5afc4b066528302bf12083da3175f71b64a43a7c0badda2be365"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6b54d1ad7a162857bb7c8ef689049c7cd9eae2f38864fc096d62ae10bc100c7d"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5d6afc41ca0ecf373366fd8e10aee2797128d3ae45eb8467b19da4899bcd1ee0"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win32.whl", hash = "sha256:430614f18443b58ceb9dedec323ecddc0abb2b34e79d03503b5a7579cd73a531"}, - {file = "SQLAlchemy-2.0.19-cp38-cp38-win_amd64.whl", hash = "sha256:eb60699de43ba1a1f77363f563bb2c652f7748127ba3a774f7cf2c7804aa0d3d"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a752b7a9aceb0ba173955d4f780c64ee15a1a991f1c52d307d6215c6c73b3a4c"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7351c05db355da112e056a7b731253cbeffab9dfdb3be1e895368513c7d70106"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa51ce4aea583b0c6b426f4b0563d3535c1c75986c4373a0987d84d22376585b"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae7473a67cd82a41decfea58c0eac581209a0aa30f8bc9190926fbf628bb17f7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851a37898a8a39783aab603c7348eb5b20d83c76a14766a43f56e6ad422d1ec8"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:539010665c90e60c4a1650afe4ab49ca100c74e6aef882466f1de6471d414be7"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win32.whl", hash = "sha256:f82c310ddf97b04e1392c33cf9a70909e0ae10a7e2ddc1d64495e3abdc5d19fb"}, - {file = "SQLAlchemy-2.0.19-cp39-cp39-win_amd64.whl", hash = "sha256:8e712cfd2e07b801bc6b60fdf64853bc2bd0af33ca8fa46166a23fe11ce0dbb0"}, - {file = "SQLAlchemy-2.0.19-py3-none-any.whl", hash = "sha256:314145c1389b021a9ad5aa3a18bac6f5d939f9087d7fc5443be28cba19d2c972"}, - {file = "SQLAlchemy-2.0.19.tar.gz", hash = "sha256:77a14fa20264af73ddcdb1e2b9c5a829b8cc6b8304d0f093271980e36c200a3f"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:67219632be22f14750f0d1c70e62f204ba69d28f62fd6432ba05ab295853de9b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4668bd8faf7e5b71c0319407b608f278f279668f358857dbfd10ef1954ac9f90"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb8bea573863762bbf45d1e13f87c2d2fd32cee2dbd50d050f83f87429c9e1ea"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f552023710d4b93d8fb29a91fadf97de89c5926c6bd758897875435f2a939f33"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:016b2e665f778f13d3c438651dd4de244214b527a275e0acf1d44c05bc6026a9"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7befc148de64b6060937231cbff8d01ccf0bfd75aa26383ffdf8d82b12ec04ff"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win32.whl", hash = "sha256:22b83aed390e3099584b839b93f80a0f4a95ee7f48270c97c90acd40ee646f0b"}, + {file = "SQLAlchemy-2.0.35-cp310-cp310-win_amd64.whl", hash = "sha256:a29762cd3d116585278ffb2e5b8cc311fb095ea278b96feef28d0b423154858e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e21f66748ab725ade40fa7af8ec8b5019c68ab00b929f6643e1b1af461eddb60"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8a6219108a15fc6d24de499d0d515c7235c617b2540d97116b663dade1a54d62"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042622a5306c23b972192283f4e22372da3b8ddf5f7aac1cc5d9c9b222ab3ff6"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:627dee0c280eea91aed87b20a1f849e9ae2fe719d52cbf847c0e0ea34464b3f7"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4fdcd72a789c1c31ed242fd8c1bcd9ea186a98ee8e5408a50e610edfef980d71"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:89b64cd8898a3a6f642db4eb7b26d1b28a497d4022eccd7717ca066823e9fb01"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win32.whl", hash = "sha256:6a93c5a0dfe8d34951e8a6f499a9479ffb9258123551fa007fc708ae2ac2bc5e"}, + {file = "SQLAlchemy-2.0.35-cp311-cp311-win_amd64.whl", hash = "sha256:c68fe3fcde03920c46697585620135b4ecfdfc1ed23e75cc2c2ae9f8502c10b8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:eb60b026d8ad0c97917cb81d3662d0b39b8ff1335e3fabb24984c6acd0c900a2"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6921ee01caf375363be5e9ae70d08ce7ca9d7e0e8983183080211a062d299468"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8cdf1a0dbe5ced887a9b127da4ffd7354e9c1a3b9bb330dce84df6b70ccb3a8d"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93a71c8601e823236ac0e5d087e4f397874a421017b3318fd92c0b14acf2b6db"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e04b622bb8a88f10e439084486f2f6349bf4d50605ac3e445869c7ea5cf0fa8c"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1b56961e2d31389aaadf4906d453859f35302b4eb818d34a26fab72596076bb8"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win32.whl", hash = "sha256:0f9f3f9a3763b9c4deb8c5d09c4cc52ffe49f9876af41cc1b2ad0138878453cf"}, + {file = "SQLAlchemy-2.0.35-cp312-cp312-win_amd64.whl", hash = "sha256:25b0f63e7fcc2a6290cb5f7f5b4fc4047843504983a28856ce9b35d8f7de03cc"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f021d334f2ca692523aaf7bbf7592ceff70c8594fad853416a81d66b35e3abf9"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05c3f58cf91683102f2f0265c0db3bd3892e9eedabe059720492dbaa4f922da1"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:032d979ce77a6c2432653322ba4cbeabf5a6837f704d16fa38b5a05d8e21fa00"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:2e795c2f7d7249b75bb5f479b432a51b59041580d20599d4e112b5f2046437a3"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:cc32b2990fc34380ec2f6195f33a76b6cdaa9eecf09f0c9404b74fc120aef36f"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win32.whl", hash = "sha256:9509c4123491d0e63fb5e16199e09f8e262066e58903e84615c301dde8fa2e87"}, + {file = "SQLAlchemy-2.0.35-cp37-cp37m-win_amd64.whl", hash = "sha256:3655af10ebcc0f1e4e06c5900bb33e080d6a1fa4228f502121f28a3b1753cde5"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4c31943b61ed8fdd63dfd12ccc919f2bf95eefca133767db6fbbd15da62078ec"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a62dd5d7cc8626a3634208df458c5fe4f21200d96a74d122c83bc2015b333bc1"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0630774b0977804fba4b6bbea6852ab56c14965a2b0c7fc7282c5f7d90a1ae72"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d625eddf7efeba2abfd9c014a22c0f6b3796e0ffb48f5d5ab106568ef01ff5a"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ada603db10bb865bbe591939de854faf2c60f43c9b763e90f653224138f910d9"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c41411e192f8d3ea39ea70e0fae48762cd11a2244e03751a98bd3c0ca9a4e936"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win32.whl", hash = "sha256:d299797d75cd747e7797b1b41817111406b8b10a4f88b6e8fe5b5e59598b43b0"}, + {file = "SQLAlchemy-2.0.35-cp38-cp38-win_amd64.whl", hash = "sha256:0375a141e1c0878103eb3d719eb6d5aa444b490c96f3fedab8471c7f6ffe70ee"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccae5de2a0140d8be6838c331604f91d6fafd0735dbdcee1ac78fc8fbaba76b4"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2a275a806f73e849e1c309ac11108ea1a14cd7058577aba962cd7190e27c9e3c"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:732e026240cdd1c1b2e3ac515c7a23820430ed94292ce33806a95869c46bd139"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:890da8cd1941fa3dab28c5bac3b9da8502e7e366f895b3b8e500896f12f94d11"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c0d8326269dbf944b9201911b0d9f3dc524d64779a07518199a58384c3d37a44"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b76d63495b0508ab9fc23f8152bac63205d2a704cd009a2b0722f4c8e0cba8e0"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win32.whl", hash = "sha256:69683e02e8a9de37f17985905a5eca18ad651bf592314b4d3d799029797d0eb3"}, + {file = "SQLAlchemy-2.0.35-cp39-cp39-win_amd64.whl", hash = "sha256:aee110e4ef3c528f3abbc3c2018c121e708938adeeff9006428dd7c8555e9b3f"}, + {file = "SQLAlchemy-2.0.35-py3-none-any.whl", hash = "sha256:2ab3f0336c0387662ce6221ad30ab3a5e6499aab01b9790879b6578fd9b8faa1"}, + {file = "sqlalchemy-2.0.35.tar.gz", hash = "sha256:e11d7ea4d24f0a262bccf9a7cd6284c976c5369dac21db237cff59586045ab9f"}, ] [package.dependencies] -greenlet = {version = "!=0.4.17", markers = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\""} -typing-extensions = ">=4.2.0" +greenlet = {version = "!=0.4.17", markers = "python_version < \"3.13\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" [package.extras] -aiomysql = ["aiomysql", "greenlet (!=0.4.17)"] -aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing-extensions (!=3.10.0.1)"] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] asyncio = ["greenlet (!=0.4.17)"] asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] @@ -3901,7 +4302,7 @@ mssql-pyodbc = ["pyodbc"] mypy = ["mypy (>=0.910)"] mysql = ["mysqlclient (>=1.4.0)"] mysql-connector = ["mysql-connector-python"] -oracle = ["cx-oracle (>=7)"] +oracle = ["cx_oracle (>=8)"] oracle-oracledb = ["oracledb (>=1.0.1)"] postgresql = ["psycopg2 (>=2.7)"] postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] @@ -3911,17 +4312,17 @@ postgresql-psycopg2binary = ["psycopg2-binary"] postgresql-psycopg2cffi = ["psycopg2cffi"] postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] pymysql = ["pymysql"] -sqlcipher = ["sqlcipher3-binary"] +sqlcipher = ["sqlcipher3_binary"] [[package]] name = "stack-data" -version = "0.6.2" +version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] [package.dependencies] @@ -3950,60 +4351,61 @@ test = ["pylint", "pytest", "pytest-black", "pytest-cov", "pytest-pylint"] [[package]] name = "structlog" -version = "23.1.0" +version = "24.4.0" description = "Structured Logging for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "structlog-23.1.0-py3-none-any.whl", hash = "sha256:79b9e68e48b54e373441e130fa447944e6f87a05b35de23138e475c05d0f7e0e"}, - {file = "structlog-23.1.0.tar.gz", hash = "sha256:270d681dd7d163c11ba500bc914b2472d2b50a8ef00faa999ded5ff83a2f906b"}, + {file = "structlog-24.4.0-py3-none-any.whl", hash = "sha256:597f61e80a91cc0749a9fd2a098ed76715a1c8a01f73e336b746504d1aad7610"}, + {file = "structlog-24.4.0.tar.gz", hash = "sha256:b27bfecede327a6d2da5fbc96bd859f114ecc398a6389d664f62085ee7ae6fc4"}, ] [package.extras] -dev = ["structlog[docs,tests,typing]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "twisted"] -tests = ["coverage[toml]", "freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] -typing = ["mypy", "rich", "twisted"] +dev = ["freezegun (>=0.2.8)", "mypy (>=1.4)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "rich", "simplejson", "twisted"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-mermaid", "sphinxext-opengraph", "twisted"] +tests = ["freezegun (>=0.2.8)", "pretend", "pytest (>=6.0)", "pytest-asyncio (>=0.17)", "simplejson"] +typing = ["mypy (>=1.4)", "rich", "twisted"] [[package]] name = "tenacity" -version = "8.2.2" +version = "9.0.0" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-9.0.0-py3-none-any.whl", hash = "sha256:93de0c98785b27fcf659856aa9f54bfbd399e29969b0621bc7f762bd441b4539"}, + {file = "tenacity-9.0.0.tar.gz", hash = "sha256:807f37ca97d62aa361264d497b0e31e92b8027044942bfa756160d908320d73b"}, ] [package.extras] -doc = ["reno", "sphinx", "tornado (>=4.5)"] +doc = ["reno", "sphinx"] +test = ["pytest", "tornado (>=4.5)", "typeguard"] [[package]] name = "tensorboardx" -version = "2.6.2" +version = "2.6.2.2" description = "TensorBoardX lets you watch Tensors Flow without Tensorflow" optional = false python-versions = "*" files = [ - {file = "tensorboardX-2.6.2-py2.py3-none-any.whl", hash = "sha256:951260a78c63dc97a89b1e6756c2bfc4c7dfd70782382e5b8b3a65e396a14149"}, - {file = "tensorboardX-2.6.2.tar.gz", hash = "sha256:836cd33d751353494a6ac76aaeaa616a039e6594e1273467e7db99991624e31e"}, + {file = "tensorboardX-2.6.2.2-py2.py3-none-any.whl", hash = "sha256:160025acbf759ede23fd3526ae9d9bfbfd8b68eb16c38a010ebe326dc6395db8"}, + {file = "tensorboardX-2.6.2.2.tar.gz", hash = "sha256:c6476d7cd0d529b0b72f4acadb1269f9ed8b22f441e87a84f2a3b940bb87b666"}, ] [package.dependencies] numpy = "*" packaging = "*" -protobuf = "*" +protobuf = ">=3.20" [[package]] name = "terminado" -version = "0.17.1" +version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "terminado-0.17.1-py3-none-any.whl", hash = "sha256:8650d44334eba354dd591129ca3124a6ba42c3d5b70df5051b6921d506fdaeae"}, - {file = "terminado-0.17.1.tar.gz", hash = "sha256:6ccbbcd3a4f8a25a5ec04991f39a0b8db52dfcd487ea0e578d977e6752380333"}, + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, ] [package.dependencies] @@ -4014,6 +4416,7 @@ tornado = ">=6.1.0" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "text-unidecode" @@ -4028,24 +4431,24 @@ files = [ [[package]] name = "threadpoolctl" -version = "3.2.0" +version = "3.5.0" description = "threadpoolctl" optional = false python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, - {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, + {file = "threadpoolctl-3.5.0-py3-none-any.whl", hash = "sha256:56c1e26c150397e58c4926da8eeee87533b1e32bef131bd4bf6a2f45f3185467"}, + {file = "threadpoolctl-3.5.0.tar.gz", hash = "sha256:082433502dd922bf738de0d8bcc4fdcbf0979ff44c42bd40f5af8a282f6fa107"}, ] [[package]] name = "tinycss2" -version = "1.2.1" +version = "1.3.0" description = "A tiny CSS parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, - {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, + {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, + {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, ] [package.dependencies] @@ -4053,7 +4456,7 @@ webencodings = ">=0.4" [package.extras] doc = ["sphinx", "sphinx_rtd_theme"] -test = ["flake8", "isort", "pytest"] +test = ["pytest", "ruff"] [[package]] name = "tomli" @@ -4066,6 +4469,17 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "tomlkit" +version = "0.13.2" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tomlkit-0.13.2-py3-none-any.whl", hash = "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde"}, + {file = "tomlkit-0.13.2.tar.gz", hash = "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79"}, +] + [[package]] name = "torch" version = "1.8.1" @@ -4095,6 +4509,36 @@ files = [ numpy = "*" typing-extensions = "*" +[[package]] +name = "torchmetrics" +version = "1.2.1" +description = "PyTorch native Metrics" +optional = false +python-versions = ">=3.8" +files = [ + {file = "torchmetrics-1.2.1-py3-none-any.whl", hash = "sha256:fe03a8c53d0ae5800d34ea615f56295fda281282cd83f647d2184e81c1d4efee"}, + {file = "torchmetrics-1.2.1.tar.gz", hash = "sha256:217387738f84939c39b534b20d4983e737cc448d27aaa5340e0327948d97ca3e"}, +] + +[package.dependencies] +lightning-utilities = ">=0.8.0" +numpy = ">1.20.0" +packaging = ">17.1" +torch = ">=1.8.1" +typing-extensions = {version = "*", markers = "python_version < \"3.9\""} + +[package.extras] +-tests = ["bert-score (==0.3.13)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "huggingface-hub (<0.20)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "mir-eval (>=0.6)", "netcal (>1.0.0)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "pytorch-msssim (==1.0.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch-complex (<=0.4.3)"] +all = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.2.0)", "mypy (==1.7.1)", "nltk (>=3.6)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "torch (==2.1.1)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +audio = ["pystoi (>=0.3.0)", "torchaudio (>=0.10.0)"] +detection = ["pycocotools (>2.0.0)", "torchvision (>=0.8)"] +dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "huggingface-hub (<0.20)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.2.0)", "mir-eval (>=0.6)", "mypy (==1.7.1)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.1.1)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.8)"] +multimodal = ["piq (<=0.8.0)", "transformers (>=4.10.0)"] +text = ["nltk (>=3.6)", "regex (>=2021.9.24)", "tqdm (>=4.41.0)", "transformers (>4.4.0)"] +typing = ["mypy (==1.7.1)", "torch (==2.1.1)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.2.0)"] + [[package]] name = "torchvision" version = "0.12.0" @@ -4135,68 +4579,79 @@ scipy = ["scipy"] [[package]] name = "tornado" -version = "6.3.2" +version = "6.4.1" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false -python-versions = ">= 3.8" +python-versions = ">=3.8" files = [ - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, - {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, - {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, - {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, ] [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] [[package]] name = "traitlets" -version = "5.9.0" +version = "5.14.3" description = "Traitlets Python configuration system" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20240906" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-python-dateutil-2.9.0.20240906.tar.gz", hash = "sha256:9706c3b68284c25adffc47319ecc7947e5bb86b3773f843c73906fd598bc176e"}, + {file = "types_python_dateutil-2.9.0.20240906-py3-none-any.whl", hash = "sha256:27c8cc2d058ccb14946eebcaaa503088f4f6dbc4fb6093d3d456a49aef2753f6"}, +] [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.12.2" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, + {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] [[package]] @@ -4215,46 +4670,46 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.0.4" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, - {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] -secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] name = "webcolors" -version = "1.13" +version = "24.8.0" description = "A library for working with the color formats defined by HTML and CSS." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, - {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, + {file = "webcolors-24.8.0-py3-none-any.whl", hash = "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a"}, + {file = "webcolors-24.8.0.tar.gz", hash = "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d"}, ] [package.extras] docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] -tests = ["pytest", "pytest-cov"] +tests = ["coverage[toml]"] [[package]] name = "webencodings" @@ -4269,47 +4724,51 @@ files = [ [[package]] name = "websocket-client" -version = "1.6.1" +version = "1.8.0" description = "WebSocket client for Python with low level API options" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "websocket-client-1.6.1.tar.gz", hash = "sha256:c951af98631d24f8df89ab1019fc365f2227c0892f12fd150e935607c79dd0dd"}, - {file = "websocket_client-1.6.1-py3-none-any.whl", hash = "sha256:f1f9f2ad5291f0225a49efad77abf9e700b6fef553900623060dad6e26503b9d"}, + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, ] [package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] [[package]] name = "widgetsnbextension" -version = "4.0.8" +version = "4.0.13" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" files = [ - {file = "widgetsnbextension-4.0.8-py3-none-any.whl", hash = "sha256:2e37f0ce9da11651056280c7efe96f2db052fe8fc269508e3724f5cbd6c93018"}, - {file = "widgetsnbextension-4.0.8.tar.gz", hash = "sha256:9ec291ba87c2dfad42c3d5b6f68713fa18be1acd7476569516b2431682315c17"}, + {file = "widgetsnbextension-4.0.13-py3-none-any.whl", hash = "sha256:74b2692e8500525cc38c2b877236ba51d34541e6385eeed5aec15a70f88a6c71"}, + {file = "widgetsnbextension-4.0.13.tar.gz", hash = "sha256:ffcb67bc9febd10234a362795f643927f4e0c05d9342c727b65d2384f8feacb6"}, ] [[package]] name = "zipp" -version = "3.16.2" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, - {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.8, <3.10" -content-hash = "d5867a89eaf0d5bbd3099df98f36e94fcdf64f1457ab6cb499ea2377fe493abe" +content-hash = "e14d04f9ad53e1f02741fafd06d5574fe4d238b226beb29cf2e2d49549758c98" diff --git a/pyproject.toml b/pyproject.toml old mode 100644 new mode 100755 index f1a3a0e..5c13e8d --- a/pyproject.toml +++ b/pyproject.toml @@ -17,11 +17,14 @@ repository = "https://github.com/sb-ai-lab/Sim4Rec" python = ">=3.8, <3.10" pyarrow = "*" sdv = "0.15.0" -torch = "*" +torch = "<=1.12.1" +torchmetrics="*" pandas = "*" -pyspark = ">=3.0" +pyspark = "3.1.3" numpy = ">=1.20.0" -scipy = "*" +scipy = "1.5.4" +replay-rec = "0.11.0" +lightfm = {git = "https://github.com/lyst/lightfm", rev = "0c9c31e"} [tool.poetry.dev-dependencies] # visualization From 1295e6d62da5534dee73a3fa033dca69d8c424be Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Tue, 1 Oct 2024 10:26:36 +0300 Subject: [PATCH 02/14] fix recent jupyter issue --- poetry.lock | 92 +++++++++----------------------------------------- pyproject.toml | 1 + 2 files changed, 17 insertions(+), 76 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0badf06..ac3ae14 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1277,17 +1277,6 @@ box2d = ["box2d-py (>=2.3.5,<2.4.0)"] mujoco = ["imageio", "mujoco_py (>=1.50,<2.0)"] robotics = ["imageio", "mujoco_py (>=1.50,<2.0)"] -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - [[package]] name = "h5py" version = "3.11.0" @@ -1335,52 +1324,6 @@ files = [ [package.dependencies] python-dateutil = "*" -[[package]] -name = "httpcore" -version = "1.0.5" -description = "A minimal low-level HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, -] - -[package.dependencies] -certifi = "*" -h11 = ">=0.13,<0.15" - -[package.extras] -asyncio = ["anyio (>=4.0,<5.0)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] - -[[package]] -name = "httpx" -version = "0.27.2" -description = "The next generation HTTP client." -optional = false -python-versions = ">=3.8" -files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, -] - -[package.dependencies] -anyio = "*" -certifi = "*" -httpcore = "==1.*" -idna = "*" -sniffio = "*" - -[package.extras] -brotli = ["brotli", "brotlicffi"] -cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] -http2 = ["h2 (>=3,<5)"] -socks = ["socksio (==1.*)"] -zstd = ["zstandard (>=0.18.0)"] - [[package]] name = "idna" version = "3.10" @@ -1939,39 +1882,36 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.2.5" +version = "4.0.13" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.2.5-py3-none-any.whl", hash = "sha256:73b6e0775d41a9fee7ee756c80f58a6bed4040869ccc21411dc559818874d321"}, - {file = "jupyterlab-4.2.5.tar.gz", hash = "sha256:ae7f3a1b8cb88b4f55009ce79fa7c06f99d70cd63601ee4aa91815d054f46f75"}, + {file = "jupyterlab-4.0.13-py3-none-any.whl", hash = "sha256:3aa81c364d50cc715f6c2935674c7cca8936bd74b5898d6ad6598aef08c43808"}, + {file = "jupyterlab-4.0.13.tar.gz", hash = "sha256:e8950f94e0d8ab8aa7d8166b19db27f4d4fea5000ee04ba372c50116e98fb733"}, ] [package.dependencies] async-lru = ">=1.0.0" -httpx = ">=0.25.0" importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} importlib-resources = {version = ">=1.4", markers = "python_version < \"3.9\""} -ipykernel = ">=6.5.0" +ipykernel = "*" jinja2 = ">=3.0.3" jupyter-core = "*" jupyter-lsp = ">=2.0.0" jupyter-server = ">=2.4.0,<3" -jupyterlab-server = ">=2.27.1,<3" +jupyterlab-server = ">=2.19.0,<3" notebook-shim = ">=0.2" packaging = "*" -setuptools = ">=40.1.0" -tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} +tomli = {version = "*", markers = "python_version < \"3.11\""} tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.3.5)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.3.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.2)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.1.post2)", "matplotlib (==3.8.3)", "nbconvert (>=7.0.0)", "pandas (==2.2.1)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.2.0)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8,<7.2.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.2.0)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] -upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] [[package]] name = "jupyterlab-pygments" @@ -2581,26 +2521,26 @@ test = ["codecov (>=2.1)", "pytest (>=7.2)", "pytest-cov (>=4.0)"] [[package]] name = "notebook" -version = "7.2.2" +version = "7.0.8" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.2.2-py3-none-any.whl", hash = "sha256:c89264081f671bc02eec0ed470a627ed791b9156cad9285226b31611d3e9fe1c"}, - {file = "notebook-7.2.2.tar.gz", hash = "sha256:2ef07d4220421623ad3fe88118d687bc0450055570cdd160814a59cf3a1c516e"}, + {file = "notebook-7.0.8-py3-none-any.whl", hash = "sha256:7f421b3fd46a17d91830e724b94e8e9ae922af152ebfd48b1e13ae4a07d8193c"}, + {file = "notebook-7.0.8.tar.gz", hash = "sha256:3957ecd956056b0014677afc76d3bb44c2d2f29649f87b24d13606ff1d18938f"}, ] [package.dependencies] jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.2.0,<4.3" -jupyterlab-server = ">=2.27.1,<3" +jupyterlab = ">=4.0.2,<4.1" +jupyterlab-server = ">=2.22.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" [package.extras] dev = ["hatch", "pre-commit"] docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] -test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.22.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] [[package]] name = "notebook-shim" @@ -4771,4 +4711,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.8, <3.10" -content-hash = "e14d04f9ad53e1f02741fafd06d5574fe4d238b226beb29cf2e2d49549758c98" +content-hash = "3efaf74c83d48e5ab6f69eb2ea054e971cdce49afee77efbc639f874f93a6a08" diff --git a/pyproject.toml b/pyproject.toml index 5c13e8d..1c7b694 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ numpy = ">=1.20.0" scipy = "1.5.4" replay-rec = "0.11.0" lightfm = {git = "https://github.com/lyst/lightfm", rev = "0c9c31e"} +notebook = "7.0.8" [tool.poetry.dev-dependencies] # visualization From 5e78916080141602966432a4356b0f1bcdaab35c Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Tue, 1 Oct 2024 21:37:55 +0300 Subject: [PATCH 03/14] dockerfile for cuda 10.2 --- cuda102.Dockerfile | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100755 cuda102.Dockerfile diff --git a/cuda102.Dockerfile b/cuda102.Dockerfile new file mode 100755 index 0000000..3568441 --- /dev/null +++ b/cuda102.Dockerfile @@ -0,0 +1,44 @@ +# Use last torch image for our cuda +FROM pytorch/pytorch:1.9.0-cuda10.2-cudnn7-runtime + +RUN apt-get update -y && apt-get install -y \ + build-essential \ + zlib1g-dev \ + libncurses5-dev \ + libgdbm-dev \ + libnss3-dev \ + libssl-dev \ + libsqlite3-dev \ + libreadline-dev \ + libffi-dev \ + libbz2-dev \ + wget \ + curl \ + mc \ + vim \ + nano + +# Update Conda to the latest version +RUN curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \ + bash Miniconda3-latest-Linux-x86_64.sh -u -b -p /opt/conda && \ + rm Miniconda3-latest-Linux-x86_64.sh && \ + /opt/conda/bin/conda update -n base -c defaults conda + +# create a Conda environment with Python 3.10 and PyTorch 1.12.1 +# (last versions for cuda 10.2) +RUN conda create -n myenv python=3.9 && \ + echo "source activate myenv" > ~/.bashrc && \ + /opt/conda/bin/conda clean -af && \ + conda install -y pytorch==1.12.1 cudatoolkit=10.2 -c pytorch -n myenv + +# Activate the Conda environment +ENV PATH=/opt/conda/envs/myenv/bin:$PATH + +# Install Jupyter Notebook +RUN conda install -y jupyter pandas scipy scikit-learn tqdm -n myenv + +# Set up the working directory +WORKDIR /root/ + +# Start Bash by default when the container runs +CMD ["/bin/bash"] From 4fd2589892267ebc6dec861e5cd5553cdb86c1bd Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Sat, 26 Oct 2024 09:41:15 +0300 Subject: [PATCH 04/14] save intermediate progress --- sim4rec/response/__init__.py | 9 +- sim4rec/response/nn_response.py | 214 +++++++++ .../sim4rec_response_function/__init__.py | 1 + .../sim4rec_response_function/adversarial.py | 363 +++++++++++++++ .../sim4rec_response_function/datasets.py | 314 +++++++++++++ .../sim4rec_response_function/embeddings.py | 327 ++++++++++++++ .../sim4rec_response_function/models.py | 415 ++++++++++++++++++ .../sim4rec_response_function/sessionwise.py | 352 +++++++++++++++ .../sim4rec_response_function/slatewise.py | 188 ++++++++ .../sim4rec_response_function/utils.py | 246 +++++++++++ 10 files changed, 2427 insertions(+), 2 deletions(-) create mode 100644 sim4rec/response/nn_response.py create mode 100644 sim4rec/response/sim4rec_response_function/__init__.py create mode 100644 sim4rec/response/sim4rec_response_function/adversarial.py create mode 100755 sim4rec/response/sim4rec_response_function/datasets.py create mode 100755 sim4rec/response/sim4rec_response_function/embeddings.py create mode 100755 sim4rec/response/sim4rec_response_function/models.py create mode 100755 sim4rec/response/sim4rec_response_function/sessionwise.py create mode 100755 sim4rec/response/sim4rec_response_function/slatewise.py create mode 100644 sim4rec/response/sim4rec_response_function/utils.py diff --git a/sim4rec/response/__init__.py b/sim4rec/response/__init__.py index b6e05f9..43dd04c 100644 --- a/sim4rec/response/__init__.py +++ b/sim4rec/response/__init__.py @@ -5,9 +5,12 @@ NoiseResponse, CosineSimilatiry, BernoulliResponse, - ParametricResponseFunction + ParametricResponseFunction, ) +from .nn_response import NNResponseTransformer, NNResponseEstimator + + __all__ = [ 'ActionModelEstimator', 'ActionModelTransformer', @@ -15,5 +18,7 @@ 'NoiseResponse', 'CosineSimilatiry', 'BernoulliResponse', - 'ParametricResponseFunction' + 'ParametricResponseFunction', + 'NNResponseTransformer', + 'NNResponseEstimator', ] diff --git a/sim4rec/response/nn_response.py b/sim4rec/response/nn_response.py new file mode 100644 index 0000000..4de81c0 --- /dev/null +++ b/sim4rec/response/nn_response.py @@ -0,0 +1,214 @@ +import os +import pickle +import pyspark.sql.functions as sf + +from .response import ActionModelEstimator, ActionModelTransformer +from .sim4rec_response_function.models import ResponseModel +from .sim4rec_response_function.embeddings import IndexEmbedding +from .sim4rec_response_function.datasets import ( + RecommendationData, + PandasRecommendationData, +) + +from pyspark.sql.types import ( + StructType, + StructField, + IntegerType, + DoubleType, +) + +# move this to simulator core(?) +SIM_LOG_SCHEMA = StructType( + [ + StructField("user_idx", IntegerType(), True), + StructField("item_idx", IntegerType(), True), + StructField("relevance", DoubleType(), True), + StructField("response_proba", DoubleType(), True), + StructField("response", IntegerType(), True), + StructField("__iter", IntegerType(), True), + ] +) +SIM_LOG_COLS = [field.name for field in SIM_LOG_SCHEMA.fields] + + +class NNResponseTransformer(ActionModelTransformer): + def __init__(self, **kwargs): + super().__init__() + for param, value in kwargs.items(): + print(param, value) + setattr(self, param, value) + + @classmethod + def load(cls, checkpoint_dir): + with open(os.path.join(checkpoint_dir, "_params.pkl"), "rb") as f: + params_dict = pickle.load(f) + params_dict["backbone_response_model"] = ResponseModel.load(checkpoint_dir) + with open(os.path.join(checkpoint_dir, "_item_indexer.pkl"), "rb") as f: + params_dict["_item_indexer"] = pickle.load(f) + with open(os.path.join(checkpoint_dir, "_user_indexer.pkl"), "rb") as f: + params_dict["_user_indexer"] = pickle.load(f) + return cls(**params_dict) + + def save(self, path): + """Save model at given path.""" + os.makedirs(path) + self.backbone_response_model.dump(path) + with open(os.path.join(path, "_item_indexer.pkl"), "wb") as f: + pickle.dump(self.item_indexer, f, pickle.HIGHEST_PROTOCOL) + with open(os.path.join(path, "_user_indexer.pkl"), "wb") as f: + pickle.dump(self.user_indexer, f, pickle.HIGHEST_PROTOCOL) + with open(os.path.join(path, "_params.pkl"), "wb") as f: + pickle.dump( + {"outputCol": self.outputCol, "log_dir": self.log_dir}, + f, + pickle.HIGHEST_PROTOCOL, + ) + + def _transform(self, new_recs): + """ + Predict responses for given dataframe with recommendations. + + :param dataframe: new recommendations. + + """ + spark = new_recs.sql_ctx.sparkSession + self.__simlog = spark.read.schema(SIM_LOG_SCHEMA).parquet(self.log_dir) + if not self.__simlog: + print("Warning: the simulator log is empty") + self.__simlog = spark.createDataFrame([], schema=SIM_LOG_SCHEMA) + + def agg_func(df): + return self._predict_udf(df) + + # TODO: add option to make bacthed predictions by ading + # temorary "batch_id" column + groupping_column = "user_idx" + + new_recs = new_recs.withColumn("__iter", sf.lit(999999999)) + new_recs = new_recs.withColumn("response", sf.lit(0.0)) + new_recs = new_recs.withColumn("response_proba", sf.lit(0.0)) + return ( + new_recs.groupby(groupping_column) + .applyInPandas(agg_func, new_recs.schema) + .show() + ) + + def _predict_udf(self, df): + """ + Make predictions for given pandas DataFrame. + :param df: pandas DataFrame. + :return: pandas DataFrame with the same schema, but overwritten column 'respone_proba'. + """ + + # select only users whom we need + # will this be fast enought, or better filter before? + hist_data_selected_users = self.hist_data.join( + self.__simlog, on="user_idx", how="inner" + ).select(self.hist_data["*"]) + + # assume that historical data interactions were BEFORE simulate + previous_interactions = hist_data_selected_users.unionByName(self.__simlog) + + new_slates = PandasRecommendationData( + df, item_indexer=self.item_indexer, user_indexer=self.user_indexer + ) + + # generating clicks + predicted_clicks = self.backbone_response_model.transform( + dataset=previous_interactions, + new_slates=new_slates, + method="autoregressive", + ) + + print(predicted_clicks) + #### DEBUG I am here now + # removing redundant columns + predictions_clean = predicted_clicks.to_iteraction_table()[ + ["user_id", "item_id", "predicted_probs", "predicted_response"] + ] + predictions_clean["item_id"] = predictions_clean["item_id"].astype(int) + predictions_clean["user_id"] = predictions_clean["user_id"].astype(int) + predictions_clean.rename( + columns={ + "user_id": "user_idx", + "item_id": "item_idx", + "predicted_probs": "response_proba", + "predicted_response": "response", + }, + inplace=True, + ) + + final = new_recs_data[["user_idx", "item_idx", "relevance"]].join( + predictions_clean.set_index(["user_idx", "item_idx"]), + on=["user_idx", "item_idx"], + validate="one_to_one", + ) + + return final + + +class NNResponseEstimator(ActionModelEstimator): + def __init__( + self, + log_dir: str, + model_name: str, + hist_data_dir=None, + val_data_dir=None, + outputCol: str = "response_proba", + **kwargs, + ): + """ + :param log_dir: The directory containing simulation logs. + :param model_name: Backbone model name. + :param hist_data_dir: (Optional) Spark DataFrame with historical data. + :param val_data_dir: (Optional) Spark DataFrame with validation data. + TODO: split automatically. + :param outputCol: Output column for MLLib pipeline. + + """ + self.fit_params = kwargs + self.outputCol = outputCol + + # sim log is not loaded immideately, because + # it can be not created when the response model is initialized + self.log_dir = log_dir + self.hist_data_dir = hist_data_dir + self.val_data_dir = val_data_dir + + # create new model + self.item_indexer = self.user_indexer = None + self.model_name = model_name + self.backbone_response_model = None + + def _fit(self, train_data): + """ + Fits the model on given data. + + :param DataFrame train_data: Data to train on + """ + train_dataset = RecommendationData( + log=train_data, + item_indexer=self.item_indexer, + user_indexer=self.user_indexer, + ) + self.item_indexer = train_dataset._item_indexer + self.user_indexer = train_dataset._user_indexer + val_dataset = RecommendationData( + log=train_data.sql_ctx.sparkSession.read.parquet(self.val_data_dir), + item_indexer=self.item_indexer, + user_indexer=self.user_indexer, + ) + n_items = train_dataset.n_items + backbone_response_model = ResponseModel( + self.model_name, IndexEmbedding(n_items) + ) + backbone_response_model.fit( + train_dataset, val_data=val_dataset, **self.fit_params + ) + return NNResponseTransformer( + backbone_response_model=backbone_response_model, + item_indexer=self.item_indexer, + user_indexer=self.user_indexer, + hist_data_dir=self.hist_data_dir, + log_dir=self.log_dir, + ) diff --git a/sim4rec/response/sim4rec_response_function/__init__.py b/sim4rec/response/sim4rec_response_function/__init__.py new file mode 100644 index 0000000..5267186 --- /dev/null +++ b/sim4rec/response/sim4rec_response_function/__init__.py @@ -0,0 +1 @@ +# __init__ \ No newline at end of file diff --git a/sim4rec/response/sim4rec_response_function/adversarial.py b/sim4rec/response/sim4rec_response_function/adversarial.py new file mode 100644 index 0000000..7fef62d --- /dev/null +++ b/sim4rec/response/sim4rec_response_function/adversarial.py @@ -0,0 +1,363 @@ +import torch +import torch.nn as nn +import numpy as np +import gc +from tqdm.notebook import tqdm +from copy import deepcopy +import torch.nn.functional as F +from torch.nn.utils import clip_grad_norm_ +from sklearn.linear_model import LogisticRegression +from torchmetrics import F1Score, AUROC, Accuracy +from torchmetrics.functional.classification import binary_f1_score, binary_accuracy + + +def evaluate_model( + model, + data_loader, + device="cuda", + threshold=0.5, + silent=False, + debug=False, + **kwargs, +): + # run model on dataloader, compute metrics + f1 = F1Score(task="binary", average="macro", threshold=threshold).to(device) + acc = Accuracy(task="binary", threshold=threshold).to(device) + auc = AUROC(task="binary").to(device) + + model.to(device) + model.eval() + + for batch in tqdm(data_loader, desc="evaluating...", disable=silent): + batch = {k: v.to(device) for k, v in batch.items()} + with torch.no_grad(): + prediction_scores = torch.sigmoid(model(batch)) + corrects = (batch["responses"] > 0).float() + mask = batch["out_mask"] + + # # prediction_shape: (batch_size, max_sequence, 'max_slate, 2) + f1(prediction_scores[mask], corrects[mask]) + auc(prediction_scores[mask], corrects[mask]) + acc(prediction_scores[mask], corrects[mask]) + if debug: + print("\r", prediction_scores[mask], corrects[mask]) + + gc.collect() + return { + "f1": f1.compute().item(), + "roc-auc": auc.compute().item(), + "accuracy": acc.compute().item(), + } + + +def flatten(true, pred, mask, to_cpu=True): + mask = mask.flatten() + nnz_idx = mask.nonzero()[:, 0] + true, pred = [x.flatten()[nnz_idx] for x in [true, pred]] + if to_cpu: + true, pred = [x.cpu().numpy() for x in [true, pred]] + return true, pred + + +def fit_treshold(labels, scores): + best_f1, best_thold, acc = 0.0, 0.01, 0.0 + for thold in np.arange(1e-2, 1 - 1e-2, 0.01): + preds_labels = scores > thold + f1 = binary_f1_score(preds_labels, labels) + # print(f"{thold}: {f1}") + if f1 > best_f1: + acc = binary_accuracy(preds_labels, labels) + best_f1, best_thold = f1, thold + return best_f1, acc, best_thold + + +class Discriminator(nn.Module): + def __init__(self, embedding): + super(Discriminator, self).__init__() + self.embedding = embedding + self.emb_dim = embedding.embedding_dim + self.rnn_layer = nn.GRU( + input_size=self.emb_dim + 1, hidden_size=self.emb_dim, batch_first=True + ) + self.mlp = nn.Sequential( + nn.Linear(self.emb_dim, 10), nn.SELU(), nn.Linear(10, 1) + ) + + def forward(self, batch, gen_output): + item_embs, user_embs = self.embedding(batch) + + items = torch.cat( + [ + item_embs.flatten(0, 1), + # item_embs.flatten(0,1) + ], + dim=-1, + ) + h = user_embs.flatten(0, 1)[None, :, :] + clicks = (batch["responses"].flatten(0, 1) > 0).int().clone() + mask = batch["slates_mask"].flatten(0, 1).clone() # padding mask + + # x = {} + # x['items'] = torch.cat( + # [ + # item_embs.flatten(0,1), + # # torch.zeros_like(item_embs.flatten(0,1)), + # ], + # dim = -1 + # ) + # if self.training: + # indices = (batch['length'] - 1) + # else: + # indices = (batch['in_length'] - 1) + # indices[indices<0] = 0 + # indices = indices[:, None, None].repeat(1, 1, user_embs.size(-1)) + # user_embs = user_embs.gather(1, indices).squeeze(-2).unsqueeze(0) + # x['users'] = user_embs.repeat_interleave(max_sequence, 1) + # x['clicks'] = (batch['responses'].flatten(0,1) > 0 ).int().clone() + # x['mask'] = batch['slates_mask'].flatten(0,1).clone() + + # h = x['users'] + + fake = gen_output * mask + real = clicks + fake = torch.cat([items.detach(), fake[:, :, None]], axis=2) + real = torch.cat([items.detach(), real[:, :, None]], axis=2) + fake_out, _ = self.rnn_layer(fake, h) + real_out, _ = self.rnn_layer(real, h) + fake_out = fake_out * mask[:, :, None] + real_out = real_out * mask[:, :, None] + fake_out = fake_out.mean(axis=1) + real_out = real_out.mean(axis=1) + fake_out = self.mlp(fake_out)[:, 0] + real_out = self.mlp(real_out)[:, 0] + + return real_out - fake_out + + +class AdversarialNCM(nn.Module): + """ + TODO: move this model to common NCM code. + """ + + def __init__(self, embedding, readout=False): + super().__init__() + self.embedding = embedding + self.emb_dim = embedding.embedding_dim + self.rnn_layer = nn.GRU( + input_size=self.emb_dim, hidden_size=self.emb_dim, batch_first=True + ) + self.out_layer = nn.Linear(self.emb_dim, 1) + + self.thr = -1.5 + self.readout = readout + self.readout_mode = ( + "threshold" # ['soft' ,'threshold', 'sample', 'diff_sample'] + ) + + self.calibration = False + self.w = 1 + self.b = 0 + + def forward(self, batch, detach_embeddings=False, sample=None, to_reshape=True): + item_embs, user_embs = self.embedding(batch) + shp = item_embs.shape + + items = torch.cat( + [ + item_embs.flatten(0, 1), + # item_embs.flatten(0,1) + ], + dim=-1, + ) + inputs = items.detach() if detach_embeddings else items + h = user_embs.flatten(0, 1)[None, :, :] + clicks = (batch["responses"].flatten(0, 1) > 0).int().clone() + mask = batch["slates_mask"].flatten(0, 1).clone() # padding mask + + inputs = F.dropout1d(inputs, p=0.1, training=self.training) + h = F.dropout1d(h, p=0.1, training=self.training) + rnn_out, _ = self.rnn_layer(inputs, h) + y = self.out_layer(rnn_out)[:, :, 0] + + if self.training and sample is None: + clicks_flat, logits_flat = flatten(clicks, y.detach(), mask) + logreg = LogisticRegression() + logreg.fit(logits_flat[:, None], clicks_flat) + γ = 0.3 + self.w = (1 - γ) * self.w + γ * logreg.coef_[0, 0] + self.b = (1 - γ) * self.b + γ * logreg.intercept_[0] + y = self.w * y + self.b + else: + y = self.w * y + self.b + + if sample: + eps = 1e-8 + gumbel_sample = -( + (torch.rand_like(y) + eps).log() / (torch.rand_like(y) + eps).log() + + eps + ).log() + T = 0.5 + bernoulli_sample = torch.sigmoid((nn.LogSigmoid()(y) + gumbel_sample) / T) + hard_bernoulli_sample = ( + (bernoulli_sample > 0.5).to(torch.float32) - bernoulli_sample + ).detach() + bernoulli_sample + return bernoulli_sample if sample == "soft" else hard_bernoulli_sample + + else: + return y.reshape(shp[:-1]) if to_reshape else y + + +def train_adversarial( + model, + discriminator, + train_loader, + val_loader, + device="cuda", + lr=1e-3, + num_epochs=50, + silent=False, + early_stopping=None, + debug=False, + **kwargs, +): + if early_stopping is None: + early_stopping = num_epochs + model.to(device) + best_model = model + + auc = AUROC(task="binary").to(device) + optimizer = torch.optim.Adam(model.parameters(), lr=lr) + opt_dis = torch.optim.Adam(discriminator.parameters(), lr=1e-3) + epochs_without_improvement = 0 + best_val_scores = evaluate_model( + model, val_loader, device=device, silent=silent, debug=debug + ) + # best_test_scores = evaluate_model(model, test_loader, device=device, silent=silent, debug=debug) + best_loss = 999.0 + + # print(f"Test before learning: {best_test_scores}") + ebar = tqdm(range(num_epochs), desc="train") + + for epoch in ebar: + loss_accumulated = 0.0 + mean_grad_norm = 0.0 + model.train() + + labels = [] + preds = [] + + gc.collect() + # torch.cuda.empty_cache() + + if epoch > 10: + # discriminator training + for batch in tqdm(train_loader, desc=f"epoch {epoch}", disable=silent): + batch = {k: v.to(device) for k, v in batch.items()} + + sample_gen = model(batch, sample="hard", to_reshape=False).detach() + logits_dis = discriminator(batch, sample_gen) + opt_dis.zero_grad() + loss_dis = torch.nn.functional.binary_cross_entropy_with_logits( + logits_dis, torch.ones(logits_dis.shape[0]).to(device) + ) + loss_dis.backward() + opt_dis.step() + + if epoch > 20: + for g in optimizer.param_groups: + g["lr"] = 0.0001 + + # adversarial generator training + for batch in tqdm(train_loader, desc=f"epoch {epoch}", disable=silent): + batch = {k: v.to(device) for k, v in batch.items()} + + sample_gen = model(batch, detach_embeddings=True, sample="soft") + logits_dis = discriminator(batch, sample_gen) + + optimizer.zero_grad() + loss_gen = F.binary_cross_entropy_with_logits( + 1 - logits_dis, torch.ones(logits_dis.shape[0]).to(device) + ) + loss_gen.backward() + optimizer.step() + + for g in optimizer.param_groups: + g["lr"] = 0.001 + + for batch in tqdm(train_loader, desc=f"epoch {epoch}", disable=silent): + batch = {k: v.to(device) for k, v in batch.items()} + raw_scores = model(batch) ################################## + prediction_scores = torch.sigmoid(raw_scores) + corrects = (batch["responses"] > 0).float() + mask = batch["slates_mask"] + loss = torch.nn.functional.binary_cross_entropy_with_logits( + raw_scores[mask], + corrects[mask], + ) ###### + loss.backward() ############ + mean_grad_norm += clip_grad_norm_(model.parameters(), 1).sum().item() + optimizer.step() + loss_accumulated += loss.detach().cpu().item() + labels.append(corrects[batch["out_mask"]].detach().cpu()) + preds.append(prediction_scores[batch["out_mask"]].detach().cpu()) + auc( + prediction_scores[batch["out_mask"]].detach().cpu(), + corrects[batch["out_mask"]].detach().cpu(), + ) + + f1, acc, thold = fit_treshold(torch.cat(labels), torch.cat(preds)) + ebar.set_description(f"train... loss:{loss_accumulated}") + val_m = evaluate_model( + model, + val_loader, + device=device, + threshold=thold, + silent=silent, + debug=debug, + **kwargs, + ) + if not silent: + print( + f"Train: epoch: {epoch} | accuracy: {acc} | " + f"f1: {f1} | loss: {loss_accumulated} | " + f"auc: {auc.compute()} | thld {thold} | grad_norm: {mean_grad_norm / len(train_loader)}" + ) + print( + f"Val: epoch: {epoch} | accuracy: {val_m['accuracy']} | f1: {val_m['f1']} | auc: {val_m['roc-auc']}" + ) + + epochs_without_improvement += 1 + if (val_m["roc-auc"], val_m["f1"], val_m["accuracy"]) > ( + best_val_scores["roc-auc"], + best_val_scores["f1"], + best_val_scores["accuracy"], + ): + best_model = deepcopy(model) + best_val_scores = val_m + # best_test_scores = evaluate_model(model, test_loader, device=device, threshold=thold, silent=silent ) + print( + f"Val update: epoch: {epoch} |" + f"accuracy: {best_val_scores['accuracy']} | " + f"f1: {best_val_scores['f1']} | " + f"auc: {best_val_scores['roc-auc']} | " + f"treshold: {thold}" + ) + # print(f"Test: " + # f"accuracy: {best_test_scores['accuracy']} | " + # f"f1: {best_test_scores['f1']} | " + # f"auc: {best_test_scores['roc-auc']} | " + # ) + + auc.reset() + + if best_loss > loss_accumulated: + epochs_without_improvement = 0 + best_loss = loss_accumulated + + if epochs_without_improvement >= early_stopping or ( + best_val_scores["roc-auc"] == 1.0 + and best_val_scores["f1"] == 1.0 + and best_val_scores["accuracy"] == 1.0 + ): + break + return best_model, best_val_scores, thold diff --git a/sim4rec/response/sim4rec_response_function/datasets.py b/sim4rec/response/sim4rec_response_function/datasets.py new file mode 100755 index 0000000..b9c7713 --- /dev/null +++ b/sim4rec/response/sim4rec_response_function/datasets.py @@ -0,0 +1,314 @@ +import numpy as np +import pandas as pd +import pyspark +import pyspark.sql.functions as sf + +from abc import ABC, abstractmethod +from .utils import Indexer +from torch.utils.data import Dataset + + +class DatasetBase(Dataset, ABC): + """ + The items and users are reindexed, because torch.nn.Embeddings + and torch.Dataset requires integer indexes in 0...N. This class + obtains indexes from keyword arguments (`item_id2index` and + `user_id2index`) if specified. You probably want to do it, + when usind different datasets obtained from one source. + Otherwise, create new indexer. + + :param log: pySpark DataFrame with interaction log + :param Indexer item_id2index: (Optinal) indexer for items + :param Indexer users_id2index: (Optinal) indexer for users + :param str padding_id: ID for padding item + :param str unknown_id: ID for previously unseen items or users. + :param int min_item_count: if item appears in logs less than `min_item_count` + times, it will be indexed as "unknown item". + """ + + def __init__( + self, + log, + item_indexer: Indexer = None, + user_indexer: Indexer = None, + padding_id=-1, + unknown_id=-2, + ): + super().__init__() + self._log = log + if item_indexer: + self._item_indexer = item_indexer + else: + self._item_indexer = Indexer(pad_id=padding_id, unk_id=unknown_id) + + if user_indexer: + self._user_indexer = user_indexer + else: + # users always receive indexes + self._user_indexer = Indexer(pad_id=padding_id, unk_id=unknown_id) + + @property + def n_items(self): + return self._item_indexer.n_objs + + @property + def item_id2index(self): + return self._item_indexer.to_dict() + + @property + def n_users(self): + return self._user_indexer.n_objs + + @property + def user_id2index(self): + return self._user_indexer.to_dict() + + @property + def users(self): + return self._users + + def __len__(self): + return self.n_users + + def __getitem__(self, idx): + if type(idx) is list: + return self.__getitems__(idx) + return self.__getitems__([idx]) + + @abstractmethod + def apply_scoring(self, score_df): + """ + Apply scoring to the dataset. The scoring is applied to the + dataset in place. The scoring dataframe must contain the + following columns: + * `user_idx` | int | user index + * `item_idx` | int | item index + * `iter` | int | interaction number + * `response_proba` | float | score of the recommendation + """ + pass + + @abstractmethod + def _get_log_for_users(self, user_idxs): + """ + Given a list of user indexes, return a list of rows cntaining + aggregated data for given users. Each row corresponds to one interaction, + i.e. each pair ('user_idx', '__iter') supposed to be unique in log. + + The rows must be sorted by ('user_idx', '__iter'). This will allow avoid + using costlu groupby in further code. + """ + pass + + def __getitems__(self, user_idxs: list) -> dict: + """Get data points for users with ids in `user_idx`""" + users_log = self._get_log_for_users(user_idxs) + batch = [] + curr_user_log = [] + prev_user = -1 + # will it be faster if implemented with pandas udfs? + for row in users_log: + if prev_user == row["user_idx"] and prev_user != -1: + curr_user_log.append(row) + else: + user_index = self._user_indexer.index_np(prev_user) + batch.append(self._user_log_to_datapoint(curr_user_log, user_index)) + prev_user = row["user_idx"] + curr_user_log = [row] + return batch + + def get_empty_data(self, slate_size=10): + """Empty datapont""" + # everythoing is masked, hence it won't impact training nor metric computation + return { + "item_indexes": np.ones((1, slate_size), dtype=int), + "user_index": 1, # unknown index + "slates_mask": np.zeros((1, slate_size), dtype=bool), + "responses": np.zeros((1, slate_size), dtype=int), + "length": 1, # zero-length would cause problems with torch.nn.rnn_pad_sequences + "slate_size": slate_size, + "timestamps": np.ones((1, slate_size), dtype=int) * -(10**9), + } + + def _user_log_to_datapoint(self, slates: list, user_index: int): + """ + Gets one datapoint (a history of interactions for single user). + In what follows, define: + * R -- number of recommendations for this + * S - slate size + * Eu, Ei - embedding dim for users and items + Datapoint is a dictionary with the following content: + + Item data: + 'item_indexes': np.array with shape (R, S). Same as previous, + but with indexes (0...N) instead if ids. Used to + index embeddings: nn.Embeddings nor scipy.sparse + can not be used with custom index. + User data: + 'user_index': user index. + Interaction data: + 'slate_mask': np.array with shape (R, S). True for recommended items, + False for placeholder. + 'responses': np.array with shape (R, S). Cell (i, j) + contains an id number of iteractions item + at j-th position of i-th slate. + 'length': int. R. + """ + # Number of recommendations (R) + R = len(slates) + + if R == 0: + return self.get_empty_data() + + # Get the maximum slate size (S) + S = max(len(s["item_idxs"]) for s in slates) + + # Prepare arrays to store the data + item_idxs = np.zeros((R, S), dtype=object) + slates_mask = np.zeros((R, S), dtype=bool) + responses = np.zeros((R, S), dtype=int) + timestamps = np.zeros((R, S), dtype=int) + + # Fill the data + for i, slate in enumerate(slates): + slate_size = len(slate["item_idxs"]) + item_idxs[i, :slate_size] = slate["item_idxs"] + slates_mask[i, :slate_size] = [True] * slate_size + responses[i, :slate_size] = slate["responses"] + timestamps[i, :slate_size] = slate["__iter"] * slate_size + + # Create the output dictionary + data_point = { + "item_indexes": self._item_indexer.index_np(item_idxs), + "user_index": user_index, + "slates_mask": slates_mask, + "responses": responses, + "timestamps": timestamps, + "length": R, + "slate_size": S, + } + # print(data_point) + return data_point + + +class RecommendationData(DatasetBase): + """ + Recommednation dataset handler based on pySpark. Does not keep all the data in RAM. + Recommendation data is initialized as spark DataFrame with required columns: + * `user_idx` | int | user identificator + * `item_idx` | int | item identificator + * `__iter` | int | timestamp + + In additional to required columns, the following columns are optional and + used only in certain applications. + * `response` | int | response, filled with 0s if not present + * `response_proba` | float | response probability, filled with 0.0 if not present + * `slate_pos` | int | position of item in recommendation slate + * `relevance` | float | relevance of recommemded item in slate. This columns is used + only sllate_pos is not present, and then slate_pos is + assigned according to relevances. + + TODO: add embeddings. + """ + + def __init__( + self, + log: pyspark.sql.DataFrame, + item_indexer=None, + user_indexer=None, + padding_id=-1, + unknown_id=-2, + min_item_count=1, + ): + """ + Initializes the dataset from `log` pyspark dataframe. + """ + super().__init__(log, item_indexer, user_indexer, padding_id, unknown_id) + if not item_indexer: + self._item_indexer.update_from_iter( + [ + row["item_idx"] + for row in self._log.groupBy("item_idx") + .agg(sf.count("*").alias("count")) + .filter(sf.col("count") >= min_item_count) + .select("item_idx") + .collect() + ] + ) + + # in _users only users which are actually present in data are stored, rather han all indexed users + self._users = [ + row["user_idx"] for row in self._log.select("user_idx").distinct().collect() + ] + if not user_indexer: + self._user_indexer.update_from_iter(self._users) + + def _get_log_for_users(self, user_idxs: list): + users_log = self._log.filter(sf.col("user_idx").isin(user_idxs)) + users_log = ( + ( + users_log.groupBy("user_idx", "__iter").agg( + sf.collect_list("item_idx").alias("item_idxs"), + sf.collect_list("response").alias("responses"), + ) + ) + .orderBy("user_idx", "__iter") + .collect() + ) + return users_log + + def apply_scoring(self, score_df): + raise NotImplementedError("Not implemented yet") + + +class PandasRecommendationData(DatasetBase): + """Temporary Dataset, normally used inside pandas user-defined functions""" + + def __init__( + self, + log: pd.DataFrame, + item_indexer: Indexer = None, + user_indexer: Indexer = None, + padding_id=None, + min_item_count=1, + ): + """ + Initializes the dataset from `log` pandas dataframe. + """ + super().__init__(log, item_indexer, user_indexer) + if not item_indexer: + self._item_indexer.update_from_iter(self._log.item_idx.unique()) + if not item_indexer: + self._user_indexer.update_from_iter(self._log.user_idx.unique()) + self._users = self._log.user_idx.unique() + + def _get_log_for_users(self, user_idxs: list): + """ + Faster version of `__getitem__` for batched input. DataLoaders in torch >=2 + automatically use this method if it's implemented. In earlier versions of pytorch + a custom sampler is required. + + :param user_idxs: list of user indexes. If None, all users are returned. + """ + users_log = self._log + if user_idxs: + users_log = self._log[self._log["user_idx"].isin(user_idxs)] + users_log = ( + users_log.groupby(["user_idx", "__iter"]) + .agg( + item_idx=pd.NamedAgg(column="item_idx", aggfunc=list), + response=pd.NamedAgg(column="response", aggfunc=list), + ) + .rename(columns={"user_idx": "user_idxs"}) + .reset_index() + ) + # convert to list of rows to match spark .collect() format: + users_log = users_log.to_dict(orient="records") + return users_log + + def apply_scoring(self, score_df): + self.log["item_index"] = self.item_indexer.index_np(self.log("item_idx")) + self.log["user_index"] = self.item_indexer.index_np(self.log("user_idx")) + self.log = self.log.merge(score_df, on=["user_index", "item_index"], how="left") + self.log["response_proba"] = self.log["score"] + self.log.drop(columns=["score"], inplace=True) diff --git a/sim4rec/response/sim4rec_response_function/embeddings.py b/sim4rec/response/sim4rec_response_function/embeddings.py new file mode 100755 index 0000000..f051e29 --- /dev/null +++ b/sim4rec/response/sim4rec_response_function/embeddings.py @@ -0,0 +1,327 @@ +import torch +import numpy as np +import torch.nn as nn +from sklearn.utils.extmath import randomized_svd +from abc import ABC, abstractmethod + + +class EmbeddingBase(ABC, nn.Module): + """ + Defines a common interface for all embeddings + + :param embedding_dim: desired dimensionality of the embedding layer. + :param user_aggregate: if None, user embeddings will be produced + independently from item embeddings. Otherwise, user embeddings are + aggregations ('sum' or 'mean') of items previously consumed by this user. + Default: 'mean'. + """ + + def __init__(self, embedding_dim: int, user_aggregate: str = "mean"): + super().__init__() + self.user_agg = user_aggregate + self.embedding_dim = embedding_dim + + def forward(self, batch: dict) -> tuple[torch.Tensor, torch.Tensor]: + """ + This method returns embeddings for both items and users. + + If user aggregation is specified, the resulting user embeddings + are obtained by aggregating consumed item embeddings. Otherwise, + produce items and user embeddings independintly. + + Shapes of embedings are `(batch_size, sequence_len, slate_size, embedding_dim)` + for items and `(batch_size, sequence_len, embedding_dim)` for users. + + :param batch: batched data (see :func:`utils.collate_recommendation_data`) + :returns: a tuple of item and user embeddings. + """ + item_embeddings = self._get_item_embeddings(batch) + if not self.user_agg: + user_embeddings = self._get_user_embeddings(batch) + else: + user_embeddings = self._aggregate_item_embeddings(item_embeddings, batch) + return item_embeddings, user_embeddings + + @abstractmethod + def _get_item_embeddings(self, batch): + """ + This method produces embeddings for all items in the batch. + + :param batch: batched data (see :func:`utils.collate_recommendation_data`) + :returns: tensor containing user embeddings for each recommendation with shape: + `(batch_size, sequence_len, slate_size, embedding_dim)` + """ + pass + + @abstractmethod + def _get_user_embeddings(self, batch): + """ + This method produces embeddings for all items in the batch. + + :param batch: batched data (see :func:`utils.collate_recommendation_data`) + :returns: tensor containing user embeddings for each recommendation with shape: + `(batch_size, sequence_len, embedding_dim)` + """ + pass + + def _aggregate_item_embeddings(self, item_embeddings, batch): + """ + Aggregate consumed item embeddings into user embeddings. + + For each user in batch, at interaction `t` user embedding is defined as + aggregating all items during interactions `1 \hdots t-1`, which + received positive responses. Aggregation can be "sum" or "mean", + depending on the initialization parameter `user_aggregate. + For the first interaction in each session (hence without any previous clicks), + user embeddings are set to zero. + + :param item_embeddings: tensor with item embeddings with expected shape: + `(batch_size, sequence_len, slate_size, embedding dim)`. + :param batch: batched data (see :func:`utils.collate_recommendation_data`) + :returns: tensor containing user embeddings for each recommendation with shape: + `(batch_size, sequence_len, embedding_dim)` + """ + batch_size, max_sequence = batch["responses"].shape[:2] + + # Shift the batch for 1 item to avoid leakage + item_embeddings_shifted = torch.cat( + [ + torch.zeros_like(item_embeddings[:, :1, :, :]), + item_embeddings[:, :-1, :, :], + ], + dim=1, + ) + + responses_shifted = torch.cat( + [ + torch.zeros_like(batch["responses"][:, :1, :]), + batch["responses"][:, :-1, :], + ], + dim=1, + ) + consumed_embedding = item_embeddings_shifted * responses_shifted[..., None] + consumed_embedding = consumed_embedding.sum(-2).cumsum(-2) + + if self.user_agg == "sum": + pass + elif self.user_agg == "mean": + total_responses = responses_shifted.sum(-1).cumsum(-1) + nnz = total_responses > 0 + consumed_embedding[nnz] /= total_responses[nnz].unsqueeze(-1) + else: + raise ValueError(f"Unknown aggregation {self.agg}") + + return consumed_embedding + + +class NumericalEmbedding(EmbeddingBase): + """ + Embeddings obtained from numerical features represented in the dataset. + As models expect user and item embeddings to be equal in size, the + features are projected into the same space with nn.Linear layers. + + It is assumed, that every batch contains the 'item_embeddings' + and 'user_embeddings' keys with the value being torch.FloatTensor with shape + (batch_size, sequence_len, slate_size, embedding_dim) for items and + (batch_size, sequence_len, embedding_dim) for users. + + :param item_dim: dimensionality of item numerical features in your data. + :param user_dim: dimensionality of user numerical features in your data. + """ + + def __init__( + self, + item_dim: int, + user_dim: int = None, + embedding_dim: int = 32, + user_aggregate: str = "mean", + ): + super().__init__(embedding_dim, user_aggregate=user_aggregate) + self.item_projection_layer = nn.Linear(item_dim, embedding_dim) + if not user_aggregate: + assert user_dim, "user embeddings size is undefined" + self.user_projection_layer = nn.Linear(user_dim, embedding_dim) + + def _get_item_embeddings(self, batch): + return self.item_projection_layer(batch["item_embeddings"]) + + def _get_user_embeddings(self, batch): + return self.user_projection_layer(batch["user_embeddings"]) + + +class IndexEmbedding(EmbeddingBase): + """ + Learnable nn.Embeddings for item and user indexes. + + It is assumed, that every batch contains the 'item_indexes' + and 'user_indexes' keys with values being torch.tensor of shape + (batch_size, sequence_len, slate_size) for items and + (batch_size, sequence_len) for users. + + + :param n_items: number of unique items. + :param n_users: number of unique users. + """ + + def __init__( + self, + n_items: int, + n_users: int = None, + embedding_dim: int = 32, + user_aggregate: str = "mean", + ): + super().__init__(embedding_dim, user_aggregate=user_aggregate) + self.item_embeddings = nn.Embedding(n_items, embedding_dim) + if not user_aggregate: + assert n_users, "Number of users is undefined" + self.user_embedding = nn.Embedding(n_users, embedding_dim) + + def _get_item_embeddings(self, batch): + return self.item_embeddings(batch["item_indexes"]) + + def _get_user_embeddings(self, batch): + return self.user_embedding(batch["user_indexes"]) + + +class SVDEmbedding(EmbeddingBase): + """ + Static embeddings obtained from SVD decomposition + of the user-item interaction matrix. Item embedding + is the right matrix from decomposition, user embedding - + the left matrix multiplied by the singular values eye matrix. + + It is assumed, that every batch contains the 'item_indexes' + and 'user_indexes' keys with values being torch.tensor of shape + (batch_size, sequence_len, slate_size) for items and + (batch_size, sequence_len) for users, and theese indexes must align + with indexing of the interaction matrix. + + + :param user_item_matrix: interaction matrix with shape (n_users, n_items) + """ + + def __init__(self, user_item_matrix, embedding_dim=32, user_aggregate="mean"): + super().__init__(embedding_dim=embedding_dim, user_aggregate=user_aggregate) + self.user_embedding, singular_values, self.item_embedding = randomized_svd( + user_item_matrix, + n_components=embedding_dim, + n_iter=4, + power_iteration_normalizer="QR", + ) + self.item_embedding = torch.tensor(self.item_embedding.T).float() + self.user_embedding = torch.tensor( + self.user_embedding * singular_values + ).float() + + def _get_item_embeddings(self, batch): + return self.item_embedding.to(batch["item_indexes"].device)[ + batch["item_indexes"] + ] + + def _get_user_embeddings(self, batch): + return self.user_embedding.to(batch["user_indexes"].device)[ + batch["user_indexes"] + ] + + +class CategoricalEmbedding(EmbeddingBase): + """ + Learnable nn.Embeddings for categorical feature indexes. + + It is assumed, that every batch contains the 'item_categorical' + and 'user_indexes' keys with values being torch.tensor of shape + (batch_size, sequence_len, slate_size, n_categorical_features) for items and + (batch_size, sequence_len, n_categorical_features) for users. + + The overall dimensionality of user and item embeddings is equalized via linear projection. + + :param n_item_features: number of item categorical features. + :param item_values_count: tuple of length `n_item_features` with number of each feature unique values + :param n_user_features: number of item categorical features. + :param user_values_count: tuple of length `n_item_features` with number of each feature unique values + :param feature_embedding_dim: dimensionality of each feature embedding. + """ + + def __init__( + self, + n_item_features: int, + item_values_count: tuple, + n_user_features: int = None, + user_values_count: tuple = (), + feature_embedding_dim: int = 32, + user_aggregate="mean", + embedding_dim: int = 32, + ): + super().__init__(embedding_dim, user_aggregate=user_aggregate) + + # item embedding layers + self.item_embedding = nn.ModuleList([]) + for num_values in item_values_count: + self.item_embedding.append(nn.Embedding(num_values, feature_embedding_dim)) + self.item_projection_layer = nn.Linear( + feature_embedding_dim * n_item_features, embedding_dim + ) + # user embedding layers + if not user_aggregate: + assert n_user_features, "user embeddings size is undefined" + self.user_embedding = nn.ModuleList([]) + for num_values in user_values_count: + self.user_embedding.append( + nn.Embedding(num_values, feature_embedding_dim) + ) + self.user_projection_layer = nn.Linear( + n_user_features * feature_embedding_dim, embedding_dim + ) + + def _get_item_embeddings(self, batch): + embeddings = [] + for i, layer in enumerate(self.item_embedding): + embeddings.append(layer(batch["item_categorical"][..., i])) + return self.item_projection_layer(torch.cat(embeddings, axis=-1)) + + def _get_user_embeddings(self, batch): + embeddings = [] + for i, layer in enumerate(self.user_embedding): + embeddings.append(layer(batch["user_categorical"][..., i])) + return self.user_projection_layer(torch.cat(embeddings, axis=-1)) + + +def stack_embeddings(user_embs, item_embs): + """Concatenate user and item embeddings""" + return torch.cat( + [item_embs, user_embs[:, :, None, :].repeat(1, 1, item_embs.size(-2), 1)], + dim=-1, + ) + + +class MixedEmbedding(nn.Module): + """ + Concatenates embeddings. + + :param embedding_modules: one or more modules derived from EmbeddingBase. + """ + + def __init__(self, *embedding_modules): + super().__init__() + self.embeddings = nn.ModuleList(embedding_modules) + self.embedding_dim = sum([module.embedding_dim for module in self.embeddings]) + + def forward(self, batch): + item_embeddings = [] + user_embeddings = [] + for module in self.embeddings: + items, users = module(batch) + item_embeddings.append(items) + user_embeddings.append(users) + return torch.cat(item_embeddings, axis=-1), torch.cat(user_embeddings, axis=-1) + + +def add_zero_item(item_embeddings): + """ + Adds an artificial zero item to a given item sequence + Item embeddings are assumed to be of a shape + (batch, sequence_len, embedding_dim) or (batch, sequence_len) + """ + return torch.cat( + [torch.zeros_like(item_embeddings[:, :1, ...]), item_embeddings], dim=1 + ) diff --git a/sim4rec/response/sim4rec_response_function/models.py b/sim4rec/response/sim4rec_response_function/models.py new file mode 100755 index 0000000..428d901 --- /dev/null +++ b/sim4rec/response/sim4rec_response_function/models.py @@ -0,0 +1,415 @@ +import os +import pickle +from collections import namedtuple +from copy import deepcopy + +import numpy as np +import pandas as pd +import torch +import torch.nn as nn +from torch.nn.utils import clip_grad_norm_ +from torchmetrics import AUROC +from torchmetrics.functional import accuracy, f1_score +from tqdm.auto import tqdm + +try: + import mlflow +except ImportError: + pass + +from .adversarial import AdversarialNCM +from .datasets import RecommendationData, PandasRecommendationData +from .sessionwise import ( + SCOT, + AggregatedSlatewiseGRU, + DummyTransformerGRU, + SessionwiseGRU, + SessionwiseTransformer, + TransformerGRU, +) +from .slatewise import ( + DotProduct, + LogisticRegression, + NeuralClickModel, + SlatewiseGRU, + SlatewiseTransformer, +) +from .utils import concat_batch, create_loader, collate_rec_data + +Metrics = namedtuple("metrics", ["rocauc", "f1", "accuracy"]) + + +class ResponseModel: + def __init__( + self, model, embeddings, calibrator=None, log_to_mlflow=False, **kwargs + ): + """ + :param model: string name of model + :param embeddings: exemplar of embeddings class + :param calibrator: Sklearn-compatible calibration instance. + If given, responses are generated according to predicted probabilities + (i.e., with threshold 0.5 for determiinistic responses or sampled), + otherwise theshold is fitted to raw model scores. + """ + self._embeddings = embeddings + self.model_name = model + self.threshold = 0.5 + self._calibrator = calibrator + self.auc = AUROC(task="binary") + self.log_to_mlflow = log_to_mlflow + if model == "DotProduct": + self._model = DotProduct(embeddings, **kwargs) + elif model == "LogisticRegression": + self._model = LogisticRegression(embeddings, **kwargs) + elif model == "SlatewiseTransformer": + self._model = SlatewiseTransformer(embeddings, **kwargs) + elif model == "SessionwiseTransformer": + self._model = SessionwiseTransformer(embeddings, **kwargs) + elif model == "DummyTransformerGRU": + self._model = DummyTransformerGRU(embeddings, **kwargs) + elif model == "TransformerGRU": + self._model = TransformerGRU(embeddings, **kwargs) + elif model == "SCOT": + self._model = SCOT(embeddings, **kwargs) + elif model == "SlatewiseGRU": + self._model = SlatewiseGRU(embeddings, **kwargs) + elif model == "AggregatedSlatewiseGRU": + self._model = AggregatedSlatewiseGRU(embeddings, **kwargs) + elif model == "SessionwiseGRU": + self._model = SessionwiseGRU(embeddings, **kwargs) + elif model == "NCMBase": + self._model = NeuralClickModel(embeddings, **kwargs) + elif model == "NCMDiffSample": + self._model = NeuralClickModel(embeddings, readout="diff_sample", **kwargs) + elif model == "AdversarialNCM": + self._model = AdversarialNCM(embeddings) + else: + raise ValueError(f"unknown model {model}") + if self.log_to_mlflow: + mlflow.log_params({"model": self.model_name, **kwargs}) + + def set_calibrator(self, calibrator): + self._calibrator = calibrator + + def dump(self, path): + """ + Saves model's parameters and weights checkpoint on a disk. + :param path: where the model is saved. + """ + params = { + "model_name": self.model_name, + "threshold": self.threshold, + "device": self.device, + "calibrator": self._calibrator, + } + with open(os.path.join(path, "params.pkl"), "wb") as f: + pickle.dump(params, f, pickle.HIGHEST_PROTOCOL) + torch.save(self._model, os.path.join(path, "model.pt")) + torch.save(self._embeddings, os.path.join(path, "embeddings.pt")) + + @classmethod + def load(cls, path): + """ + Loads model from files creqated by `dump` method. + :param path: where data is located + """ + embeddings = torch.load(os.path.join(path, "embeddings.pt")) + with open(os.path.join(path, "params.pkl"), "rb") as f: + params = pickle.load(f) + model = cls(params["model_name"], embeddings) + model.threshold = params["threshold"] + model._model = torch.load(os.path.join(path, "model.pt")) + model.device = params["device"] + return model + + def _val_epoch(self, data_loader, silent=True): + # run model on dataloader, compute auc + self.auc.reset() + self._model.eval() + loss_accumulated = 0.0 + for batch in tqdm(data_loader, desc="evaluate:", disable=silent): + batch = {k: v.to(self.device) for k, v in batch.items()} + with torch.no_grad(): + scores = self._model(batch) + prediction_probs = torch.sigmoid(scores) + corrects = (batch["responses"] > 0).float() + mask = batch["out_mask"] + self.auc(prediction_probs[mask].cpu(), corrects[mask].cpu()) + + criterion = nn.functional.binary_cross_entropy_with_logits + loss_mask = batch["slates_mask"] + loss = criterion( + scores[loss_mask], + corrects[loss_mask], + ) + loss_accumulated += loss.cpu().item() + + self.val_loss = loss_accumulated + + def _train_epoch(self, data_loader, optimizer, criterion, silent=False): + loss_accumulated = 0.0 + for batch in tqdm(data_loader, desc="train epoch:", disable=silent): + batch = {k: v.to(self.device) for k, v in batch.items()} + mask = batch["slates_mask"] + corrects = (batch["responses"] > 0).float() + + scores = self._model(batch) + loss = criterion( + scores[mask], + corrects[mask], + ) + loss_accumulated += loss.detach().cpu().item() + loss.backward() + clip_grad_norm_(self._model.parameters(), 1.0) + optimizer.step() + + metric_mask = batch["out_mask"] + self.auc( + torch.sigmoid(scores[metric_mask]).detach().cpu(), + corrects[metric_mask].detach().cpu(), + ) + + return loss_accumulated + + def _train( + self, + train_loader, + val_loader, + device="cuda", + lr=1e-3, + num_epochs=100, + silent=False, + early_stopping=7, + debug=False, + ): + if early_stopping == 0: + early_stopping = num_epochs + + optimizer = torch.optim.Adam(self._model.parameters(), lr=lr) + epochs_without_improvement = 0 + criterion = nn.functional.binary_cross_entropy_with_logits + self.ebar = tqdm(range(num_epochs), desc="epoch") + best_model = deepcopy(self._model) + best_model_calibrator = deepcopy(self._calibrator) + self.best_val_scores = self.evaluate(val_loader, silent=silent) + best_val_loss = None + best_epoch = 0 + + for epoch in self.ebar: + self._model.train() + train_loss = self._train_epoch( + train_loader, optimizer, criterion, silent=silent + ) + preds, target = torch.cat(self.auc.preds), torch.cat(self.auc.target) + self._fit_threshold_f1(preds, target) + if self._calibrator: + self._calibrator.fit(preds.numpy(), target.numpy()) + self.auc.reset() + + val_scores = self.evaluate(val_loader, silent=silent) + epochs_without_improvement += 1 + # choosing best model based on roc_auc, then f1, then accuracy + if val_scores >= self.best_val_scores: + best_model = deepcopy(self._model) + best_model_calibrator = deepcopy(self._calibrator) + self.best_val_scores = val_scores + best_epoch = epoch + + if not best_val_loss or best_val_loss > self.val_loss: + epochs_without_improvement = 0 + best_val_loss = self.val_loss + + if self.log_to_mlflow: + metrics = { + "val_auc": val_scores.rocauc.numpy().tolist(), + "val_f1": val_scores.f1.numpy().tolist(), + "val_accuracy": val_scores.accuracy.numpy().tolist(), + "best_val_auc": self.best_val_scores.rocauc.numpy().tolist(), + "best_val_f1": self.best_val_scores.f1.numpy().tolist(), + "best_val_accuracy": self.best_val_scores.accuracy.numpy().tolist(), + "threshold": self.threshold, + "epochs_without_improvement": epochs_without_improvement, + "train_loss": train_loss, + "val_loss": self.val_loss, + "best_val_loss": best_val_loss, + "best_epoch": best_epoch, + } + if self._calibrator is not None: + metrics.update( + { + "calibrator_a_": self._calibrator.a_, + "calibrator_b_": self._calibrator.b_, + } + ) + + mlflow.log_metrics(metrics, step=epoch) + + # early stopping + if epochs_without_improvement >= early_stopping or val_scores == ( + 1.0, + 1.0, + 1.0, + ): + print("Early stopping") + break + self._model = best_model + self._calibrator = best_model_calibrator + + def evaluate(self, datalaoder, silent=True) -> Metrics: + self._val_epoch(datalaoder, silent=silent) + preds, target = torch.cat(self.auc.preds), torch.cat(self.auc.target) + metrics = Metrics( + self.auc.compute(), + f1_score( + preds, target, task="binary", threshold=self.threshold, average="macro" + ), + accuracy(preds, target, task="binary", threshold=self.threshold), + ) + if not silent: + print(metrics) + return metrics + + def _get_probs_and_responses(self, raw_scores, response_type="sample"): + """ + Compute calibrated probabilities and predicted responses for given raw model scores. + + :param raw_scores: backbone model output, after sigmmoid + :param resoponse_type: 'sample' or 'deterministic' + """ + if self._calibrator is None: + predicted_probs = raw_scores + predicted_responses = (predicted_probs >= self.threshold).long() + else: + shp = raw_scores.shape + predicted_probs = torch.tensor( + self._calibrator.predict(raw_scores.cpu().flatten()) + ).reshape(shp) + predicted_responses = (predicted_probs >= 0.5).long() + if response_type == "sample": + predicted_responses = torch.bernoulli(predicted_probs).long() + elif response_type == "deterministic": + pass + else: + raise ValueError(f"unkbnown response type {response_type}") + return predicted_probs, predicted_responses + + def fit( + self, + train_data: RecommendationData, + batch_size, + device="cuda", + silent=False, + val_data: RecommendationData = None, + **kwargs, + ): + """ + Fits model to given dataset. + """ + + self.to(device) + + # if validation dataset is not given, split train + if val_data is None: + train_data, val_data = train_data.split_by_users(0.8, seed=123) + val_loader = create_loader(val_data, batch_size=batch_size) + train_loader = create_loader(train_data, batch_size=batch_size) + + # dot product with svd or explicit embeddings has no params to fit + param_num = sum( + p.numel() for p in self._embeddings.parameters() if p.requires_grad + ) + param_num += sum(p.numel() for p in self._model.parameters() if p.requires_grad) + if param_num == 0: + self.best_model = deepcopy(self._model) + self.best_val_scores = self.evaluate(val_loader) + else: + self._train( + train_loader, val_loader, silent=silent, device=device, **kwargs + ) + + def _get_scores( + self, + historical_data: RecommendationData, + new_slates: RecommendationData, + **kwargs, + ): + """ + Get predicted click provavilities. + """ + users, items, scores, timestamps = [], [], [], [] + + # compute all data in on ebatch (bathcing is performed on the spark MLLIb level) + + new_recs = new_slates[[]] # all users from new slates + hist_data = historical_data[new_slates.users] # only relevant users + combined_data = concat_batch(hist_data, new_recs) + batch = collate_rec_data(combined_data) + batch = {k: v.to(self.device) for k, v in batch.items()} + + # for each session, this index tensor points to the last interaction + # which is the only interachion in new slates by design + slate_size = max( + hist_data[0]["slates_mask"].shape[-1], new_recs[0]["slates_mask"].shape[-1] + ) + hist_lengths = torch.tensor( + [d["length"] for d in hist_data], device=self.device + )[:, None] + hist_lengths = hist_lengths[..., None].repeat(1, 1, slate_size) + 1 + + with torch.no_grad(): + # run model + raw_scores = torch.sigmoid(self._model(batch)) + items.append( + batch["item_indexes"].gather(dim=1, index=hist_lengths).detach().cpu() + ) + users.append( + batch["item_indexes"] + .gather(dim=1, index=hist_lengths[..., 0]) + .detach() + .cpu() + ) + scores.append(raw_scores.gather(dim=1, index=hist_lengths).detach().cpu()) + timestamps.append( + batch["timestamps"].gather(dim=1, index=hist_lengths).detach().cpu() + ) + print(users, timestamps, items, scores) + return users, timestamps, items, scores + + def transform(self, historical_data, new_slates): + """ + Returns a recommendation dataset with response probabilities provided. + + :param PandasRecommendationData historical: initial parts of each session. + :param PandasRecommendationData new_slates: new recommendations data. + It is assumed, that only one slate per user is present. + """ + if type(new_slates) is PandasRecommendationData: + user_idx, timestamp, item_idx, score = self._get_scores( + historical_data, new_slates + ) + score_df = pd.DataFrame( + { + "user_idx": user_idx, + "__iter": timestamp, + "item_idx": item_idx, + "score": score, + } + ) + return deepcopy(new_slates).apply_scoring(score_df) + else: + raise NotImplementedError + + def to(self, device: str): + self._model = self._model.to(device) + self.device = device + + def _fit_threshold_f1(self, preds, target): + best_f1 = 0.0 + for thold in np.arange(0.0, 1.0, 0.01): + f1 = f1_score( + preds, target, task="binary", threshold=thold, average="macro" + ).item() + if f1 >= best_f1: + self.threshold = thold + best_f1 = f1 + return best_f1 diff --git a/sim4rec/response/sim4rec_response_function/sessionwise.py b/sim4rec/response/sim4rec_response_function/sessionwise.py new file mode 100755 index 0000000..3caa3f1 --- /dev/null +++ b/sim4rec/response/sim4rec_response_function/sessionwise.py @@ -0,0 +1,352 @@ +import torch +import torch.nn as nn +from .embeddings import add_zero_item, stack_embeddings + + +class SessionwiseGRU(nn.Module): + """GRU on all recommended items in session""" + + def __init__(self, embedding, output_dim=1, dropout=0.1): + super().__init__() + self.embedding_dim = embedding.embedding_dim + self.embedding = embedding + self.rnn_layer = nn.GRU( + input_size=embedding.embedding_dim, + hidden_size=embedding.embedding_dim, + batch_first=True, + dropout=dropout, + ) + self.out_layer = nn.Linear(embedding.embedding_dim, output_dim) + + def forward(self, batch): + item_embs, user_embs = self.embedding(batch) + shp = item_embs.shape[:-1] # (batch_size, session_len, slate_size) + # flatening slates into one long sequence + item_embs = item_embs.flatten(1, 2) + # hidden is the user embedding before the first iteraction + hidden = user_embs[None, :, 0, :].contiguous() + rnn_out, _ = self.rnn_layer( + item_embs, + hidden, + ) + return self.out_layer(rnn_out).reshape(shp) + + +class AggregatedSlatewiseGRU(nn.Module): + """ + Slatewise GRU cell, whose hidden state initialized + with aggregated hiddens over the previous slate + """ + + def __init__(self, embedding, output_dim=1, dropout=0.1): + super().__init__() + self.embedding_dim = embedding.embedding_dim + self.embedding = embedding + self.rnn_layer = torch.nn.GRU( + input_size=embedding.embedding_dim, + hidden_size=embedding.embedding_dim, + batch_first=True, + dropout=dropout, + ) + self.out_layer = nn.Linear(embedding.embedding_dim, output_dim) + + def forward(self, batch): + item_embs, user_embs = self.embedding(batch) + shp = item_embs.shape[:-1] # (batch_size, session_len, slate_size) + session_len = shp[1] + + # initial hidden is the user embedding before the first iteraction + hidden = user_embs[None, ..., 0, :].contiguous() + preds = [] + + # iterate over slates + for slate_no in range(session_len): + # run GRU on the current slate + rnn_out, hidden = self.rnn_layer( + item_embs[..., slate_no, :, :], + hidden, + ) + # save output for further prediction + preds.append(rnn_out[..., None, :, :]) + # aggregate hiddens for the next slate + hidden = rnn_out.mean(dim=1)[None, :, :] + + preds = torch.cat(preds, axis=1) + return self.out_layer(preds).reshape(shp) + + +class SCOT(nn.Module): + """ + Session-wise transformer, working on sequences of clicked-only items. + """ + + def __init__(self, embedding, nheads=2, output_dim=1, debug=False): + super().__init__() + self.embedding_dim = embedding.embedding_dim + self.embedding = embedding + self.nheads = nheads + self.attention = nn.MultiheadAttention( + 2 * self.embedding_dim, num_heads=nheads, batch_first=True + ) + self.out_layer = nn.Sequential( + nn.LayerNorm(2 * embedding.embedding_dim), + nn.Linear(embedding.embedding_dim * 2, embedding.embedding_dim * 2), + nn.GELU(), + nn.Linear(embedding.embedding_dim * 2, output_dim), + ) + + def forward(self, batch): + # getting embeddings & flatening them into one sequence + item_embs, user_embs = self.embedding(batch) + item_embs = stack_embeddings(user_embs, item_embs) + shp = item_embs.shape[:-1] + device = item_embs.device + slate_size = item_embs.size(-2) + session_length = item_embs.size(1) + batch_size = item_embs.size(0) + + # Tensor of shape (batch, session_length, slate_size) + # indicating which iteration this item belongs to + slate_num_for_item = torch.arange(session_length).to(device) + slate_num_for_item = slate_num_for_item[None, :, None].repeat( + batch_size, 1, slate_size + ) + + # Adding a dummy "zero item". It is required, pytorch + # attention implementation will fail if there are sequences + # with no keys in batch. We will drop out response on it later. + item_embs = item_embs.flatten(1, 2) + item_embs = add_zero_item(item_embs) + slate_num_for_item = slate_num_for_item.flatten(1, 2) + 1 + slate_num_for_item = add_zero_item(slate_num_for_item) + + # gatghering clicked items + keys = item_embs + clicked_mask = batch["responses"].flatten(1, 2) > 0 + clicked_mask = ~add_zero_item(~clicked_mask) + clicked_items_slateno, clicked_items = [], [] + for i in range(batch_size): + clicked_items.append(keys[i][clicked_mask[i], :]) + clicked_items_slateno.append(slate_num_for_item[i][clicked_mask[i]]) + keys = nn.utils.rnn.pad_sequence( + clicked_items, batch_first=True, padding_value=float("nan") + ) + slate_num_clicked_items = nn.utils.rnn.pad_sequence( + clicked_items_slateno, batch_first=True, padding_value=session_length + 1 + ) + key_padding_mask = keys.isnan().any(-1) + keys = keys.nan_to_num(0) + + # Now `keys` is a sequence of all clicked items in each session. + # We are constructing a mask to forbid model looking into future iteractions + # Mask shape: (num_heads * bsize, all_items_sequence_length, clicked_sequence_len) + # with True on position a pair (item, clicked_item) if `clicked_item` is recommended + # after the `item` + attn_mask = [] + for i in range(batch_size): + slateno = slate_num_for_item[i] + clicked_slateno = slate_num_clicked_items[i] + mask = slateno[:, None] <= clicked_slateno[None, :] + mask[:, 0] = False # always can attend the 'zero item' + attn_mask.append(mask) + + attn_mask = torch.nn.utils.rnn.pad_sequence( + attn_mask, batch_first=True, padding_value=True + ) + attn_mask.to(device) + + # Inference the model + features, attn_map = self.attention( + item_embs, + keys, + keys, + key_padding_mask=key_padding_mask, + attn_mask=attn_mask.repeat_interleave(self.nheads, 0), + ) + + # removing artificial `zero item` + features = features[:, 1:, :] + return self.out_layer(features).reshape(shp).squeeze(-1) + + +class DummyTransformerGRU(nn.Module): + """ + Output features of slatewise attention layer and + sessionwise GRU layer are concatenated. This model + id used for ablation study of Two-Stage Transformer+GRU model. + """ + + def __init__(self, embedding, nheads=2, output_dim=1): + super().__init__() + self.embedding_dim = embedding.embedding_dim + self.embedding = embedding + self.attention = nn.MultiheadAttention( + 2 * embedding.embedding_dim, num_heads=nheads, batch_first=True + ) + self.rnn_layer = nn.GRU( + input_size=embedding.embedding_dim, + hidden_size=embedding.embedding_dim, + batch_first=True, + ) + self.out_layer = nn.Linear(3 * embedding.embedding_dim, output_dim) + + def get_attention_embeddings(self, item_embs, user_embs, slate_mask): + shp = item_embs.shape[:-1] + # reinterpret sequence dimension as batch dimension + features = stack_embeddings(user_embs, item_embs).flatten(0, 1) + key_padding_mask = slate_mask.flatten(0, 1) + # add an artificial item + features = add_zero_item(features) + key_padding_mask = add_zero_item(~key_padding_mask) + features, attn_map = self.attention( + features, features, features, key_padding_mask=key_padding_mask + ) + # drop the artificial item + features = features[:, 1:, ...] + features = features.reshape(shp + (self.embedding_dim * 2,)) + return features + + def forward(self, batch): + item_embs, user_embs = self.embedding(batch) + slate_mask = batch["slates_mask"].clone() + + # slatewise attention + att_features = self.get_attention_embeddings(item_embs, user_embs, slate_mask) + + # sequencewise gru + gru_features, _ = self.rnn_layer(item_embs.flatten(1, 2)) + gru_features = gru_features.reshape(item_embs.shape) + + features = torch.cat([att_features, gru_features], dim=-1) + + return self.out_layer(features).squeeze(-1) + + +class SessionwiseTransformer(nn.Module): + """ + Just a large transformer on sequence of items. + """ + + def __init__(self, embedding, nheads=2, output_dim=1): + super().__init__() + self.nheads = nheads + self.embedding_dim = embedding.embedding_dim + self.embedding = embedding + self.attention = nn.MultiheadAttention( + 2 * self.embedding_dim, num_heads=nheads, batch_first=True + ) + self.out_layer = nn.Linear(2 * embedding.embedding_dim, output_dim) + + def forward(self, batch): + # getting embeddings & flatening them into one sequence + item_embs, user_embs = self.embedding(batch) + item_embs = stack_embeddings(user_embs, item_embs) + shp = item_embs.shape[:-1] + device = item_embs.device + slate_size = item_embs.size(-2) + session_length = item_embs.size(1) + batch_size = item_embs.size(0) + + # Tensor of shape (batch, session_length, slate_size) + # indicating which iteration this item belongs to + slate_num_for_item = torch.arange(session_length).to(device) + slate_num_for_item = slate_num_for_item[None, :, None].repeat( + batch_size, 1, slate_size + ) + + # Adding a dummy "zero item". It is required, pytorch + # attention implementation will fail if there are sequences + # with no keys in batch. We will drop out response on it later. + keys = item_embs.flatten(1, 2) + keys = add_zero_item(keys) + slate_num_for_item = slate_num_for_item.flatten(1, 2) + 1 + slate_num_for_item = add_zero_item(slate_num_for_item) + + # forbid attending to the padding `items` + key_padding_mask = batch["slates_mask"].flatten(1, 2).clone() + key_padding_mask = add_zero_item(~key_padding_mask) + + # forbid model looking into future (and into current iteraction) + attn_mask = [] + for i in range(batch_size): + slateno = slate_num_for_item[i] + clicked_slateno = slate_num_for_item[i] + mask = slateno[:, None] <= clicked_slateno[None, :] + mask[:, 0] = False # always can attend the 'zero item' + attn_mask.append(mask) + future_mask = nn.utils.rnn.pad_sequence( + attn_mask, batch_first=True, padding_value=True + ) + future_mask.to(device) + + # calculating the attention layer + features, attn_map = self.attention( + keys, + keys, + keys, + key_padding_mask=key_padding_mask, + attn_mask=future_mask.repeat_interleave(self.nheads, 0), + ) + + # removing artificial `zero item` + features = features[:, 1:, :] + keys = keys[:, 1:, :] + + return self.out_layer(features).reshape(shp).squeeze(-1) + + +class TransformerGRU(nn.Module): + """ + Two-stage model with attention layer operating on each slate independently, + and a session-wise GRU layer to handle the preference drift. + """ + + def __init__(self, embedding, nheads=2, output_dim=1): + super().__init__() + self.embedding_dim = embedding.embedding_dim + self.embedding = embedding + self.attention = nn.MultiheadAttention( + 2 * embedding.embedding_dim, num_heads=nheads, batch_first=True + ) + self.rnn_cell = nn.GRUCell( + input_size=2 * embedding.embedding_dim, + hidden_size=embedding.embedding_dim, + ) + self.out_layer = nn.Linear(2 * embedding.embedding_dim, output_dim) + + def get_attention_embeddings(self, item_embs, user_embs, slate_mask): + shp = item_embs.shape[:-1] + # reinterpret sequence dimension as batch dimension + features = stack_embeddings(user_embs, item_embs).flatten(0, 1) + key_padding_mask = slate_mask.flatten(0, 1) + # add an artificial item + features = add_zero_item(features) + key_padding_mask = add_zero_item(~key_padding_mask) + features, attn_map = self.attention( + features, features, features, key_padding_mask=key_padding_mask + ) + # drop the artificial item + features = features[:, 1:, ...] + features = features.reshape(shp + (self.embedding_dim * 2,)) + return features + + def forward(self, batch): + item_embs, user_embs = self.embedding(batch) + slate_mask = batch["slates_mask"].clone() + session_length = item_embs.shape[1] + + preds, hidden = [], user_embs[..., 0, :] + for slate_no in range(session_length): + # select current slate, run slatewise attention on it + att_features = self.get_attention_embeddings( + item_embs[..., slate_no, :, :].unsqueeze(-3), + hidden[..., None, :], + slate_mask[..., slate_no, :].unsqueeze(-3), + ) + # save the attention features + preds.append(att_features) + + # run GRU cell on aggregated attention features + hidden = self.rnn_cell(att_features.squeeze(-3).mean(-2), hidden) + preds = torch.cat(preds, dim=-3) + return self.out_layer(preds).squeeze(-1) diff --git a/sim4rec/response/sim4rec_response_function/slatewise.py b/sim4rec/response/sim4rec_response_function/slatewise.py new file mode 100755 index 0000000..7d5d8a3 --- /dev/null +++ b/sim4rec/response/sim4rec_response_function/slatewise.py @@ -0,0 +1,188 @@ +import torch +# import absч +import torch.nn as nn +from .embeddings import stack_embeddings + + +class DotProduct(torch.nn.Module): + """ + Simplest model which predictions score is just a dot product of + user and item embeddings. + """ + + def __init__(self, embedding): + super().__init__() + self.embedding = embedding + + def forward(self, batch): + item_embs, user_embs = self.embedding(batch) + scores = item_embs * user_embs[:, :, None, :].repeat( + 1, 1, item_embs.size(-2), 1 + ) + scores = scores.sum(-1) + return scores + + +class LogisticRegression(torch.nn.Module): + """ + Simple Logistic Regression run on a concatenation of the user's and the item's embedding. + """ + + def __init__(self, embedding, output_dim=1): + super().__init__() + self.embedding = embedding + self.linear = torch.nn.Linear(2 * embedding.embedding_dim, output_dim) + + def forward(self, batch): + item_embs, user_embs = self.embedding(batch) + features = stack_embeddings(user_embs, item_embs) + return self.linear(features).squeeze(-1) + + +class SlatewiseGRU(torch.nn.Module): + """ + GRU acting on each slate independently. + """ + + def __init__(self, embedding, dropout=0, output_dim=1): + super().__init__() + self.embedding = embedding + self.rnn_layer = torch.nn.GRU( + input_size=embedding.embedding_dim, + hidden_size=embedding.embedding_dim, + batch_first=True, + dropout=dropout, + ) + self.out_layer = torch.nn.Linear(embedding.embedding_dim, output_dim) + + def forward(self, batch): + item_embs, user_embs = self.embedding(batch) + # (batch_size, session_len, slate_size) + shp = item_embs.shape[:-1] + + # Reinterpreting session dim as an independent batch dim + # now it is (batch * session, slate, embedding) + item_embs = item_embs.flatten(0, 1) + hidden = user_embs.flatten(0, 1)[None, ...].contiguous() + rnn_out, _ = self.rnn_layer( + item_embs, + hidden, + ) + return self.out_layer(rnn_out).reshape(shp) + + +class SlatewiseTransformer(torch.nn.Module): + """ + Transformer acting on each slate independently. + """ + + def __init__(self, embedding, nheads=2, output_dim=1): + super().__init__() + self.embedding_dim = embedding.embedding_dim + self.embedding = embedding + self.attention = torch.nn.MultiheadAttention( + 2 * embedding.embedding_dim, num_heads=nheads, batch_first=True + ) + self.out_layer = torch.nn.Linear(2 * embedding.embedding_dim, output_dim) + + def forward(self, batch): + item_embs, user_embs = self.embedding(batch) + # (batch_size, session_len, slate_size) + shp = item_embs.shape[:-1] + + # Reinterpreting session dim as an independent batch dim + # now it is (batch * session, slate, embedding) + features = stack_embeddings(user_embs, item_embs) + features = features.flatten(0, 1) + + # adding a zero item + features = torch.cat([torch.zeros_like(features[..., :1, :]), features], dim=-2) + + # key padding mask forbids attending to padding items + key_padding_mask = batch["slates_mask"].flatten(0, 1) + key_padding_mask = torch.cat( + [torch.ones_like(key_padding_mask[..., :1]), key_padding_mask], dim=-1 + ) + + # evaluating attention layer + features, attn_map = self.attention( + features, features, features, key_padding_mask=~key_padding_mask + ) + + # removing zero item + features = features[..., 1:, :] + + out = self.out_layer(features) + out = out.reshape(shp).squeeze(-1) + return out + + +class NeuralClickModel(nn.Module): + def __init__(self, embedding, readout=None, gumbel_temperature=1.0): + """ + :param readout: can be one of None, 'soft' ,'threshold', 'sample' and 'diff_sample' + """ + super().__init__() + self.embedding = embedding + self.embedding_dim = embedding.embedding_dim + self.rnn_layer = nn.GRU( + input_size=self.embedding_dim * 2, + hidden_size=self.embedding_dim, + batch_first=True, + ) + self.out_layer = nn.Linear(self.embedding_dim, 1) + self.readout = readout + self.gumbel_temperature = gumbel_temperature + + def forward(self, batch, threshold=0.0): + item_embs, user_embs = self.embedding(batch) + shp = item_embs.shape + slate_size = item_embs.shape[2] + + # duplicate item emneddings (second part will be reweighted later) + items = torch.cat([item_embs.flatten(0, 1), item_embs.flatten(0, 1)], dim=-1) + h = user_embs.flatten(0, 1)[None, :, :] + clicks = torch.zeros_like(batch["responses"]).flatten(0, 1) + # (batch['responses'].flatten(0,1) > 0 ).int().clone() + + if self.readout: + res = [] + # iterate over recommended items in slate + for i in range(slate_size): + output, h = self.rnn_layer(items[:, [i], :], h) + y = self.out_layer(output)[:, :, 0] + if i + 1 == slate_size: + res.append(y) + break + # update the last half of item embedding + if self.readout == "threshold": + # hard readout + clicks = (y.detach()[:, :, None] > threshold).to(torch.float32) + items[:, [i + 1], self.embedding_dim :] *= clicks + elif self.readout == "soft": + # soft readout, each item is added with weight equal to predicted click proba + items[:, [i + 1], self.embedding_dim :] *= torch.sigmoid(y)[ + :, :, None + ] + elif self.readout == "diff_sample" or self.readout_mode == "sample": + # gumbel trick + eps = 1e-8 # to avoid numerical instability + gumbel_sample = (torch.rand_like(y) + eps).log() + gumbel_sample /= (torch.rand_like(y) + eps).log() + eps + gumbel_sample = gumbel_sample.log() + gumbel_sample *= -1 + bernoulli_sample = torch.sigmoid( + (nn.LogSigmoid()(y) + gumbel_sample) / self.gumbel_temperature + ) + if self.readout == "sample": + bernoulli_sample = bernoulli_sample.detach() + items[:, i + 1, self.embedding_dim :] *= bernoulli_sample + else: + raise NotImplementedError + res.append(y) + y = torch.cat(res, axis=1) + else: + items[:, 1:, self.embedding_dim :] *= clicks[:, :-1, None] + rnn_out, _ = self.rnn_layer(items, h) + y = self.out_layer(rnn_out)[:, :, 0] + return y.reshape(shp[:-1]) diff --git a/sim4rec/response/sim4rec_response_function/utils.py b/sim4rec/response/sim4rec_response_function/utils.py new file mode 100644 index 0000000..a6268a5 --- /dev/null +++ b/sim4rec/response/sim4rec_response_function/utils.py @@ -0,0 +1,246 @@ +import torch +import numpy as np + +from collections import Counter +from copy import deepcopy +from itertools import chain +from torch.utils.data import DataLoader, SubsetRandomSampler, BatchSampler + + +def pad_slates(arr, slate_size, padding_value): + return np.pad( + arr, + ((0, 0), (0, slate_size - arr.shape[1])), + mode="constant", + constant_values=padding_value, + ) + + +def collate_rec_data(batch: list, padding_value=0): + """ + Batch sessions of varying length: pad sequiences, prepare masks, etc. + :param list bacth: list of data points (usually obtained from torch sampler). + :param padding_value: value representing padding items/users. + :return dict batch: bathed data in torch.tensor format. + """ + + # lengths + batch_lengths = [b["length"] for b in batch] + batch_lengths = torch.tensor(np.stack(batch_lengths), dtype=torch.long) + + # max_sequence_len = max([b["length"] for b in batch]) + max_slate_size = max([b["slate_size"] for b in batch]) + + # if data contain slates of various length, + # pad the slates before paddings the sequences + for b in batch: + if b["slate_size"] < max_slate_size: + b["item_indexes"] = pad_slates( + b["item_indexes"], max_slate_size, padding_value + ) + b["slates_mask"] = pad_slates( + b["slates_mask"], max_slate_size, padding_value + ) + b["responses"] = pad_slates(b["responses"], max_slate_size, padding_value) + b["timestamps"] = pad_slates(b["timestamps"], max_slate_size, padding_value) + + + # user indexes + user_indexes = torch.tensor([b["user_index"] for b in batch], dtype=torch.long) + + # item indexes + # shape: batch_size, max_sequence_len, max_slate_size + item_indexes = [torch.tensor(b["item_indexes"], dtype=torch.long) for b in batch] + item_indexes = torch.nn.utils.rnn.pad_sequence( + item_indexes, padding_value=padding_value, batch_first=True + ) + + # item mask: True for recommended items, False for paddings + # (both sequence padding and slate padding) + # shape: batch_size, max_sequence_len, max_slate_size + slate_masks = [torch.tensor(b["slates_mask"], dtype=torch.bool) for b in batch] + slate_masks = torch.nn.utils.rnn.pad_sequence( + slate_masks, padding_value=False, batch_first=True + ) + + # responses: number of clicks per recommended item + # shape: batch_size, max_sequence_len, max_slate_size + responses = [torch.tensor(b["responses"], dtype=torch.long) for b in batch] + # print(responses) + responses = torch.nn.utils.rnn.pad_sequence( + responses, padding_value=padding_value, batch_first=True + ) + + # timestamps: we assume that (user_id, timestamp) is an unique + # identifier of slate, hence we need to pass it through model + # for further decoding model outputs + # shape: batch_size, max_sequence_len, max_slate_size + timestamps = [torch.tensor(b["timestamps"], dtype=torch.int) for b in batch] + # print(timestamps) + timestamps = torch.nn.utils.rnn.pad_sequence( + timestamps, padding_value=padding_value, batch_first=True + ) + batch = { + "item_indexes": item_indexes, # recommended items indexes + "slates_mask": slate_masks, # batch mask, True for non-padding items + "responses": responses, # number of clicks for each item + "timestamps": timestamps, # interaction timestamp + "length": batch_lengths, # lenghts of each session in batch + "user_indexes": user_indexes, # indexes of users + "out_mask": slate_masks, # todo: do we need this mask for metric stability? + } + # print(batch) + return batch + + +def concat_batch(left, right): + """ + Concatenate two batches (before collating). + In_lengths are summed. + Recommendation_idx are concatenated. + """ + sessionwise_fields = [ + "item_indexes", + # TODO: "item_embeddings", + # "item_categorical", + "slates_mask", + "responses", + # TODO: "user_embeddings", + # TODO: "user_categorical", + "timestamps", + "user_indexes", + "recommendation_idx", + ] + assert len(left) == len(right) + left_length = len(left) + + newbatch = deepcopy(left) + for i in range(left_length): + for key in sessionwise_fields: + if left[i][key] is None: + continue + newbatch[i][key] = np.concatenate([left[i][key], right[i][key]], axis=0) + newbatch[i]["in_length"] += right[i]["in_length"] + newbatch[i]["length"] += right[i]["length"] + return newbatch + + +def create_loader(dataset, batch_size, **kwargs): + """Creates dataloader for recommendation dataset""" + return DataLoader( + dataset, + sampler=BatchSampler( + SubsetRandomSampler(dataset.users), batch_size, drop_last=False + ), + batch_size=None, + collate_fn=collate_rec_data, + **kwargs, + ) + + +class Indexer: + """ + Handles mappings between some indexes and ids. + Padding tokens will always have index 0, and + unknown (rare) tokens will have index 1. + """ + + def __init__(self, pad_id=-1, unk_id=-2, **kwargs): + """ + :param pad_id: - Id for padding item. + :param unk_id: - Id for unknown item. + """ + self.unk_id = unk_id + self.pad_id = pad_id + self._index2id = [pad_id, unk_id] + # unknown indexes are mapped to dedicated 'unknown id' index + self._id2index = {pad_id: 0, unk_id: 1} + self._counter = Counter() + + def to_dict(self): + """Raw id -> index mapping""" + return self._id2index.copy() + + @property + def n_objs(self): + """Number of indexed IDs""" + return len(self._index2id) + + def is_known_id(self, id_): + return (id_ in self._id2index) and (id_ != self.unk_id) + + @classmethod + def from_dict(cls, d): + """ + Creates indexer from dictionary. + + :param d: id-to-index dictionary to update from + """ + assert set(d.values()) == set(range(len(d))), "Given dict values aren't indexes" + pad, unk = None, None + for key, value in d.items(): + if value == 0: + pad = key + if value == 1: + unk = key + indexer = cls(pad_id=pad, unk_id=unk) + indexer._id2index.update(d) + indexer._index2id = [0 for i in d] + for key, value in d.items(): + indexer._index2id[value] = key + return indexer + + def update_from_iter(self, iterable, min_occurrences=1): + """ + Builds mapping from given iterable. + If called several times, updates the mapping with new values, + preserving already allocated indexes. Note, that frequencies + are preserved between calls. + + :param iterable: some collection with data. + :param min_occurrences: frequency threshold for rare ids. + """ + self._counter.update(iterable) + + known_ids = set(self._index2id) + new_ids = [ + key + for key in self._counter + if self._counter[key] >= min_occurrences and key not in known_ids + ] + last_index = len(self._index2id) + self._index2id += new_ids + self._id2index.update( + {key: index + last_index for (index, key) in enumerate(new_ids)} + ) + + return self + + def index_np(self, arr: np.array): + """ + Transforms given array of IDs into array of indexes. + Previously unseen IDs will be silently replaces with unk. + + :param arr: numpy array of ID's. + :return: numpy array of the same shape filled with indexes. + """ + unk_index = self._id2index[self.unk_id] + vfunc = np.vectorize(lambda x: self._id2index.get(x, unk_index)) + return vfunc(arr) + + def index_df(self, df, inputCol, outputCol): + """ + Apply indexing to the whole spark dataframe colmn. + """ + mapping_expr = create_map([lit(x) for x in chain(*self._id2index.items())]) + return df.withColumn(outputCol, coalesce(mapping_expr[col(inputCol)], lit(1))) + + def get_id(self, arr: np.array): + """ + Transforms given array of indexes back into array of IDs. + Throws an exception if found incorrect index. + + :param arr: numpy array of indexes's. + :return: numpy array of the same shape filled with ids. + """ + return np.vectorize(lambda x: self._index2id[x])(arr) From 4a0e26cd8582b26c264c19a8d963765e7989f254 Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Sun, 10 Nov 2024 23:40:48 +0300 Subject: [PATCH 05/14] working version --- poetry.lock | 47 +- pyproject.toml | 1 + rs_performance_evaluation_latest.ipynb | 1833 +++++++++++++++++ sim4rec/response/nn_response.py | 128 +- .../sim4rec_response_function/datasets.py | 55 +- .../sim4rec_response_function/models.py | 89 +- .../sim4rec_response_function/utils.py | 18 +- 7 files changed, 1995 insertions(+), 176 deletions(-) create mode 100644 rs_performance_evaluation_latest.ipynb diff --git a/poetry.lock b/poetry.lock index ac3ae14..b7a6c6d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -4481,38 +4481,33 @@ visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.2.0)"] [[package]] name = "torchvision" -version = "0.12.0" +version = "0.9.1" description = "image and video datasets and models for torch deep learning" optional = false -python-versions = ">=3.7" +python-versions = "*" files = [ - {file = "torchvision-0.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:693656e6790b6ab21e4a6e87e81c2982bad9e455b5eb24e14bb672382ec6130f"}, - {file = "torchvision-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0be4501ca0ba1b195644c9243f49a1c49a26e52a7f37924c4239d0bf5ecbd8d"}, - {file = "torchvision-0.12.0-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:ebfb47adf65bf3926b990b2c4767e291f135e259e03232e0e1a30ecdb05eb087"}, - {file = "torchvision-0.12.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:9771231639afb5973cdaea1d449b451e2982e1ef5410ca67bbdc2b465565573a"}, - {file = "torchvision-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:894dacdc64b6e35e3f330722db51c76f4de016c7bf7bd79cf02ed2f4c106e625"}, - {file = "torchvision-0.12.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:36dfdf6451fe3072ab15118982853b848896c0fd3b26cb8135e1e7981dbb0916"}, - {file = "torchvision-0.12.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:aac76d52c5ce4229cb0eaebb762f3391fa736565eb35a4184fa0f7be30b705cd"}, - {file = "torchvision-0.12.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:926666f0b893dce6619759c19b0dd3884af7a9d7022b10395653659d28e43c48"}, - {file = "torchvision-0.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c225f55c1bfce027a03f4ca46ddb9559c83f8087c2880bed3261a76c49bb7996"}, - {file = "torchvision-0.12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d1ccb53836ba886320dcda12d00ee8b5f8f38b6c36d7906f141d25778cf74104"}, - {file = "torchvision-0.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9f42420f7f0b29cd3d61776df3157827257a0cf16b2c02776dc16c96abb1256d"}, - {file = "torchvision-0.12.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9017248c7e526c8cdcaaab8cf41d904a520a409d707398189a06d0757901d235"}, - {file = "torchvision-0.12.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0744902f2265d4c3e83c44a06b567df312e4a9faf8c92620016c7bed7056b5a7"}, - {file = "torchvision-0.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:a91db01496932350bf9c0ee8607ac8ef31c3ebfdaedefe5c5cda0515317f8b8e"}, - {file = "torchvision-0.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:24d03fcaa28004c64a24124ac4a894c50f5948c8eb290e398d6c76fff2bc678f"}, - {file = "torchvision-0.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69d82f47b67bad6ddcbb87833ba5950a6c271ba97baae4c0955610071bf034f5"}, - {file = "torchvision-0.12.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:49ed7886b93b80c9733462edd06a07f8d4c6ea4d5bd2894e7268f7a3774f4f7d"}, - {file = "torchvision-0.12.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b93a767f44e3933cb3b01a6fe9727db54590f57b7dac09d5aaf15966c6c151dd"}, - {file = "torchvision-0.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:edab05f7ba9f648c00435b384ffdbd7bde79a3b8ea893813fb50f6ccf28b1e76"}, + {file = "torchvision-0.9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:da4c4f7363b60b0637354974ea0a29dbc301f66c9f25d92ed5f10637909f3500"}, + {file = "torchvision-0.9.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8a937cd3b53656e15de03671f8a638b5e8e4c100725b854d73bdb51e41455e9e"}, + {file = "torchvision-0.9.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f16ceec2862faaffc8fc19bca20e0e79ffdab18a53e6cb75e42e33d090e80d04"}, + {file = "torchvision-0.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:99cd75163938b4b3728815696d75c0df8b66390c489abed2365a530a040059a1"}, + {file = "torchvision-0.9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8aa438869e3033cbd8749d041d1ca7beb6171ca9f7f47b42e742fabd6900f8fc"}, + {file = "torchvision-0.9.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a1421a26b21b8c098935c3375182470c4c4d99d5e14d81ec3ac14a35e7a85285"}, + {file = "torchvision-0.9.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b14b5b7fed0b7dc6245c2608b9fd2262d5b375ba998e097b980a1046683ca7f6"}, + {file = "torchvision-0.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:86e4facb1cf4670ab3d67b7a947f0c43cd0805ec269a5e22ad0b82be727bcb3b"}, + {file = "torchvision-0.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d38d0d23c6ce6ba15eba094a9319393e429796ab2bab228fa3b996abc9e33c3f"}, + {file = "torchvision-0.9.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0bfcc3ab99128081bfc9a5c3ab31f5227c4df3b802e6d4217dac104bf5ba8636"}, + {file = "torchvision-0.9.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:85f21862e504590eb4a77b1d9a1742156a296af55827fb8c82296601922b7ac1"}, + {file = "torchvision-0.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:dda0dcb914bcab1a43f823348736b8b1c926bf1fbe9cbb3be892fdbe2ab6d097"}, + {file = "torchvision-0.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:091812c9fa405bef12aca9b9c3e671fcae7c0a4945b68705534ba8a401396ad1"}, + {file = "torchvision-0.9.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:46b82b6cdccd2cb982819165b6ddaa097629315377ba6bbf77bdcb02c2e83692"}, + {file = "torchvision-0.9.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:92c936584e03dfca39ff31bbc4a4fb54edb08fe8362e75dc08a2fa4b43266068"}, + {file = "torchvision-0.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:42bec9b8e8a1dcd478751457191f317f843fa463555c141994c809c4b11ad60d"}, ] [package.dependencies] numpy = "*" -pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" -requests = "*" -torch = "*" -typing-extensions = "*" +pillow = ">=4.1.1" +torch = "1.8.1" [package.extras] scipy = ["scipy"] @@ -4711,4 +4706,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.8, <3.10" -content-hash = "3efaf74c83d48e5ab6f69eb2ea054e971cdce49afee77efbc639f874f93a6a08" +content-hash = "ef249b70b68fd5ebdee6533669ce9f61b8c872cfc25933937ab9a82b9210a665" diff --git a/pyproject.toml b/pyproject.toml index 1c7b694..e20afd3 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,7 @@ scipy = "1.5.4" replay-rec = "0.11.0" lightfm = {git = "https://github.com/lyst/lightfm", rev = "0c9c31e"} notebook = "7.0.8" +torchvision = "0.9.1" [tool.poetry.dev-dependencies] # visualization diff --git a/rs_performance_evaluation_latest.ipynb b/rs_performance_evaluation_latest.ipynb new file mode 100644 index 0000000..0da9e71 --- /dev/null +++ b/rs_performance_evaluation_latest.ipynb @@ -0,0 +1,1833 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "cellId": "5nmr5qtyi4l6dv4003f5hk", + "execution_id": "b4c3a56f-dd79-4dc8-9c15-e451a726c6d8" + }, + "source": [ + "# RS evaluation with a custom response model" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "a23y5u7l746q73y0tqxss", + "execution_id": "b0740c39-9cda-411d-b832-490de8695080" + }, + "source": [ + "## Imports and preparations" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'1.5.4'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import scipy\n", + "scipy.__version__" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# !pip install jupyter-black\n", + "%load_ext jupyter_black" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import sys\n", + "\n", + "os.environ[\"JAVA_HOME\"] = \"/usr\"\n", + "os.environ[\"PYSPARK_PYTHON\"] = sys.executable\n", + "os.environ[\"PYSPARK_DRIVER_PYTHON\"] = sys.executable\n", + "os.environ[\"CUDA_LAUNCH_BLOCKING\"] = \"1\"\n", + "os.environ[\"OMP_NUM_THREADS\"] = \"32\"\n", + "os.environ[\"NUMBA_NUM_THREADS\"] = \"4\"" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "cellId": "jlz0twee16goe1fisulv5" + }, + "outputs": [], + "source": [ + "import random\n", + "import time\n", + "import scipy\n", + "import torch\n", + "import numpy as np\n", + "import pandas as pd\n", + "import warnings\n", + "\n", + "from pyspark import SparkConf, StorageLevel\n", + "from pyspark.ml import Pipeline\n", + "from pyspark.sql import SparkSession\n", + "import pyspark.sql.functions as sf\n", + "from replay.models import UCB\n", + "from tqdm.auto import tqdm\n", + "\n", + "from experiments.response_models.utils import plot_metric, calc_metric\n", + "from pyspark.sql.functions import col" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "cellId": "jlz0twee16goe1fisulv5" + }, + "outputs": [], + "source": [ + "from sim4rec.modules import RealDataGenerator\n", + "from sim4rec.modules import Simulator\n", + "from sim4rec.response import BernoulliResponse, ActionModelTransformer\n", + "\n", + "warnings.filterwarnings(\"ignore\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# path to spark tmp folder and simulator checkpoints\n", + "SPARK_LOCAL_DIR = \"./tmp/task_1\"\n", + "CHECKPOINT_DIR = \"./tmp/task_1_checkpoints\"" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "cellId": "ku55idy38nqtlrc187ucq" + }, + "outputs": [], + "source": [ + "%%bash -s \"$CHECKPOINT_DIR\" \"$SPARK_LOCAL_DIR\"\n", + "# simulator saves the interaction history between users and recommender system\n", + "# to rerun the simulation cycle or begin a new one, clear the directory or use another CHECKPOINT_DIR\n", + "rm -rf $1 $2" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "cellId": "v1uc08ym8h8d7qxpmsop4" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING: An illegal reflective access operation has occurred\n", + "WARNING: Illegal reflective access by org.apache.spark.unsafe.Platform (file:/root/.cache/pypoetry/virtualenvs/sim4rec-lKa0R1gD-py3.9/lib/python3.9/site-packages/pyspark/jars/spark-unsafe_2.12-3.1.3.jar) to constructor java.nio.DirectByteBuffer(long,int)\n", + "WARNING: Please consider reporting this to the maintainers of org.apache.spark.unsafe.Platform\n", + "WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations\n", + "WARNING: All illegal access operations will be denied in a future release\n", + "24/11/10 20:05:23 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", + "Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties\n", + "Setting default log level to \"WARN\".\n", + "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", + "24/11/10 20:05:24 WARN SparkConf: Note that spark.local.dir will be overridden by the value set by the cluster manager (via SPARK_LOCAL_DIRS in mesos/standalone/kubernetes and LOCAL_DIRS in YARN).\n" + ] + } + ], + "source": [ + "NUM_THREADS = 4\n", + "\n", + "spark = (\n", + " SparkSession.builder.appName(\"simulator\")\n", + " .master(f\"local[{NUM_THREADS}]\")\n", + " .config(\"spark.sql.shuffle.partitions\", f\"{NUM_THREADS * 3}\")\n", + " .config(\"spark.default.parallelism\", f\"{NUM_THREADS * 3}\")\n", + " .config(\"spark.driver.memory\", \"4G\")\n", + " .config(\"spark.executor.memory\", \"4G\")\n", + " .config(\"spark.driver.extraJavaOptions\", \"-XX:+UseG1GC\")\n", + " .config(\"spark.executor.extraJavaOptions\", \"-XX:+UseG1GC\")\n", + " .config(\"spark.local.dir\", SPARK_LOCAL_DIR)\n", + " .getOrCreate()\n", + ")\n", + "\n", + "spark.sparkContext.setLogLevel(\"ERROR\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "cellId": "9vf3sqixr4vgau073549pv" + }, + "outputs": [], + "source": [ + "K = 10 # number of iterations\n", + "NUM_ITER = 10\n", + "SEED = 1234\n", + "np.random.seed(SEED)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "ffl9l89trncxzwbk5zq7gn", + "execution_id": "cbbf5328-af84-4368-957e-3c000bd80332" + }, + "source": [ + "## Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load ContentWise in tabular form. Uncomment for the first run.\n", + "\n", + "This preprocessing is similat to preprocessing in old `ContentWise` class: \n", + "join interactions with impressions, binarize clicks, etc.\n", + "\n", + "ContentWise consists of following files:\n", + "1. interactions.csv.gz:\n", + " * `utc_ts_milliseconds` -- interaction timestamp \n", + " * `user_id` -- user id\n", + " * `item_id`, `series_id` -- video id, video series id. As long as only series were recommended, we threat 'series' as primary items\n", + " * `recommendation_id` -- key to match with recommendations\n", + " * `episode_number`, `series_length`, `item_type`, `interaction_type`, `vision_factor`, `explicit_rating` are ignored\n", + "\n", + "2. impressions-direct-link.csv.gz:\n", + " * `recommendation_id` -- impression id to match with responses, `-1` for unknown recommendation\n", + " * `recommendation_list_length`\n", + " * `recommended_series_list` -- string representation of python list of series ids\n", + " * `row_position` -- a position of recommendation slate on the site" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "# cw_impr = \"data/ContentWiseImpressions/CW10M-CSV/impressions-direct-link.csv\"\n", + "# impressions = spark.read.option(\"header\", \"true\").csv(cw_impr)\n", + "# impressions = impressions.filter(col(\"recommendation_list_length\") == K)\n", + "# impressions = impressions.withColumn(\n", + "# \"tmp\", sf.regexp_replace(\"recommended_series_list\", r\"\\[\\s*\", \"\")\n", + "# )\n", + "# impressions = impressions.withColumn(\"tmp\", sf.regexp_replace(\"tmp\", r\"\\s*\\]\", \"\"))\n", + "# impressions = impressions.withColumn(\"tmp\", sf.regexp_replace(\"tmp\", r\"\\s+\", \" \"))\n", + "# impressions = impressions.withColumn(\"tmp\", sf.split(\"tmp\", \" \"))\n", + "# impressions = impressions.select(\n", + "# \"recommendation_id\", sf.posexplode(\"tmp\").alias(\"slate_pos\", \"item_id\")\n", + "# ).drop(\"tmp\", \"recommendation_list_length\", \"recommended_series_list\", \"row_position\")\n", + "# cw_inter = \"data/ContentWiseImpressions/CW10M-CSV/interactions.csv\"\n", + "# interactions = spark.read.option(\"header\", \"true\").csv(cw_inter)\n", + "# interactions = interactions.filter(col(\"recommendation_id\") != -1)\n", + "# interactions = interactions.drop(\n", + "# \"item_id\",\n", + "# \"episode_number\",\n", + "# \"series_length\",\n", + "# \"item_type\",\n", + "# \"interaction_type\",\n", + "# \"vision_factor\",\n", + "# \"explicit_rating\",\n", + "# )\n", + "# interactions = interactions.withColumnRenamed(\"series_id\", \"item_id\")\n", + "\n", + "# recommendation_metadata = interactions.groupBy(\"recommendation_id\").agg(\n", + "# sf.min(\"utc_ts_milliseconds\").alias(\"recommendation_timestamp\"),\n", + "# sf.first(\"user_id\").alias(\"user_id\"),\n", + "# )\n", + "# # click om item = first click on item\n", + "# interactions = interactions.drop(\"user_id\")\n", + "# interactions = interactions.groupBy(\"recommendation_id\", \"item_id\").agg(\n", + "# sf.min(\"utc_ts_milliseconds\").alias(\"response_timestamp\")\n", + "# )\n", + "# # add response\n", + "# interactions = interactions.withColumn(\"response\", sf.lit(1))\n", + "# content_wise_all = impressions.join(\n", + "# interactions, how=\"left\", on=[\"recommendation_id\", \"item_id\"]\n", + "# ).join(recommendation_metadata, on=\"recommendation_id\")\n", + "# content_wise_all = content_wise_all.withColumn(\n", + "# \"response\", sf.coalesce(\"response\", sf.lit(0))\n", + "# )\n", + "\n", + "# # split train-val-test by global time:\n", + "# total_cnt = content_wise_all.count()\n", + "# train_cnt = int(0.6 * total_cnt)\n", + "# test_cnt = int(0.2 * total_cnt)\n", + "# val_cnt = int(0.2 * total_cnt)\n", + "# sorted_df = content_wise_all.orderBy(\"recommendation_timestamp\")\n", + "# train = sorted_df.limit(train_cnt)\n", + "# val = sorted_df.subtract(train).limit(val_cnt)\n", + "# test = sorted_df.subtract(train).subtract(val)\n", + "# MAX_TIME = content_wise_all.agg(sf.max(\"recommendation_timestamp\")).collect()[0][0]\n", + "# MAX_TIME" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "# def content_wise_to_simlog_format(df: \"DataFrame\"):\n", + "# \"\"\"Convert ContentWise dataset to math sim4rec log schema\"\"\"\n", + "# df = df.drop(\"response_timestamp\")\n", + "# df = df.withColumn(\"response_proba\", sf.col(\"response\").cast(\"float\"))\n", + "# df = df.withColumnRenamed(\"item_id\", \"item_idx\")\n", + "# df = df.withColumnRenamed(\"user_id\", \"user_idx\")\n", + "# # place all historical interactions BEFORE the simulated\n", + "# df = df.withColumn(\n", + "# \"__iter\",\n", + "# (sf.col(\"recommendation_timestamp\").cast(\"bigint\") - int(MAX_TIME)) / 1000,\n", + "# ).drop(\"recommendation_timestamp\", \"recommendation_id\")\n", + "# return df\n", + "\n", + "\n", + "# train = content_wise_to_simlog_format(train)\n", + "# test = content_wise_to_simlog_format(test)\n", + "# val = content_wise_to_simlog_format(val)\n", + "# val.show(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "# from sim4rec.response.nn_response import SIM_LOG_SCHEMA\n", + "# print(SIM_LOG_SCHEMA, train.schema)\n", + "\n", + "# # cast types to match simlog schema\n", + "# train = train.withColumn(\"relevance\", 1 / (sf.col(\"slate_pos\") + 1))\n", + "# val = train.withColumn(\"relevance\", 1 / (sf.col(\"slate_pos\") + 1))\n", + "# test = train.withColumn(\"relevance\", 1 / (sf.col(\"slate_pos\") + 1))\n", + "\n", + "# for field in SIM_LOG_SCHEMA:\n", + "# train = train.withColumn(field.name, train[field.name].cast(field.dataType))\n", + "# val = val.withColumn(field.name, val[field.name].cast(field.dataType))\n", + "# test = test.withColumn(field.name, test[field.name].cast(field.dataType))" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "# # this takes some time\n", + "# !rm -rdf parquet && mkdir parquet\n", + "# train.write.partitionBy(\"user_idx\").parquet(\"parquet/train\")\n", + "# val.write.partitionBy(\"user_idx\").parquet(\"parquet/val\")\n", + "# test.write.partitionBy(\"user_idx\").parquet(\"parquet/test\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], + "source": [ + "# re-read:\n", + "train = spark.read.parquet(\"parquet/train\")\n", + "val = spark.read.parquet(\"parquet/val\")\n", + "test = spark.read.parquet(\"parquet/test\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------+---------+--------+--------------+--------+-------------------+--------+\n", + "|item_idx|slate_pos|response|response_proba| __iter| relevance|user_idx|\n", + "+--------+---------+--------+--------------+--------+-------------------+--------+\n", + "| 25508| 0| 0| 0.0|-8211853| 1.0| 35783|\n", + "| 9245| 8| 0| 0.0|-8211853| 0.1111111111111111| 35783|\n", + "| 5368| 6| 1| 1.0|-8211853|0.14285714285714285| 35783|\n", + "| 5939| 4| 0| 0.0|-8211853| 0.2| 35783|\n", + "| 10685| 5| 0| 0.0|-8211853|0.16666666666666666| 35783|\n", + "| 21058| 3| 0| 0.0|-8211853| 0.25| 35783|\n", + "| 5018| 9| 0| 0.0|-8211853| 0.1| 35783|\n", + "| 22613| 7| 0| 0.0|-8211853| 0.125| 35783|\n", + "| 17175| 2| 0| 0.0|-8211853| 0.3333333333333333| 35783|\n", + "| 7618| 1| 0| 0.0|-8211853| 0.5| 35783|\n", + "+--------+---------+--------+--------------+--------+-------------------+--------+\n", + "only showing top 10 rows\n", + "\n" + ] + } + ], + "source": [ + "train.show(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "cellId": "zh9qtijcn5143mi4887od" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "(2658, 19205)" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "users = [\n", + " [int(row[\"user_idx\"])] for row in train.select(\"user_idx\").distinct().collect()\n", + "]\n", + "NUM_USERS = len(users)\n", + "users = spark.createDataFrame(users, schema=[\"user_idx\"])\n", + "\n", + "items = [\n", + " [int(row[\"item_idx\"])] for row in train.select(\"item_idx\").distinct().collect()\n", + "]\n", + "NUM_ITEMS = len(items)\n", + "items = spark.createDataFrame(items, schema=[\"item_idx\"])\n", + "\n", + "NUM_ITEMS, NUM_USERS" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "cellId": "3btpzal8hblukqhq46asd" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "2658" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "item_generator = RealDataGenerator(label=\"items_real\", seed=SEED)\n", + "user_generator = RealDataGenerator(label=\"users_real\", seed=SEED)\n", + "\n", + "item_generator.fit(items)\n", + "user_generator.fit(users)\n", + "\n", + "item_generator.generate(NUM_ITEMS)\n", + "user_generator.generate(NUM_USERS)\n", + "item_generator.getDataSize()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "1crcvslqi2qm4dnavh3obq", + "execution_id": "2c640f43-9dd5-445d-9511-d0d100fc830c" + }, + "source": [ + "# One iteration of simulation cycle step by step" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "q2oio9pylodwwu9qptdom", + "execution_id": "0f252faf-52c4-4a99-ac83-b425c14d055e" + }, + "source": [ + "## (1) Choise of users" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "cellId": "erkzmjzvo06nl5bok1qv5n" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1964" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "user_generator.sample(0.1).count()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "tnbcus0l6hcbvoht2rnge", + "execution_id": "a45bc1e9-f284-4702-bfeb-d525f9349d20" + }, + "source": [ + "## (2) Choise of items\n", + "During the simulation cycle all 5276 items will be available at each iteration." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "4kfl2on9vg46431mkek4ot", + "execution_id": "85a06070-5f73-407a-ad84-ff781e7d04fb" + }, + "source": [ + "## (3) Initialization of recommender model" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "p7qktnabe0pupwrpgo1vu", + "execution_id": "4f4957f4-cea9-47fe-9140-95dafb48e159" + }, + "source": [ + "### Baseline" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "cellId": "kck71xz164nwlq1tlo81d" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idxitem_idxrelevance
0232163300.000376
1232179150.000376
223288175990.000376
323288146270.000376
\n", + "
" + ], + "text/plain": [ + " user_idx item_idx relevance\n", + "0 232 16330 0.000376\n", + "1 232 17915 0.000376\n", + "2 23288 17599 0.000376\n", + "3 23288 14627 0.000376" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# RePlay model should be fitted on historic data before it can be refitted in cycle\n", + "# Let's assume we had one interaction for simplicity\n", + "model = UCB(sample=True, seed=SEED, exploration_coef=0.1)\n", + "model.fit(\n", + " log=users.limit(1).crossJoin(items.limit(1)).withColumn(\"relevance\", sf.lit(1))\n", + ")\n", + "pred = model.predict(log=None, users=users.limit(2), items=items, k=2)\n", + "pred.toPandas()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "7m11axprgbnc8wgrnr20km", + "execution_id": "1bf409d8-8df8-4ff6-a96d-eab7b07f54d8" + }, + "source": [ + "The response function in this tutorial is very simple. The response is binary, response == 1 means the user bought the item. \n", + "The probability of response is one tenth of the last digit of an `item_idx`. The response function is constant over time.\n", + "\n", + "Response function gets dataframe with columns `user_idx`, `item_idx`, `relevance`, and returns dataframe with columns `user_idx`, `item_idx`, `relevance`, `response`, adding the response column to the initial ones. If the initial dataframe had some other columns, these will also be returned." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Example how the response is generated for user-item pair" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## (4) PDMI response function" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "from sim4rec.response import NNResponseEstimator, NNResponseTransformer\n", + "\n", + "proba_model = NNResponseEstimator(\n", + " outputCol=\"response_proba\",\n", + " log_dir=f\"{CHECKPOINT_DIR}/pipeline\",\n", + " model_name=\"LogisticRegression\",\n", + " hist_data_dir=\"parquet/train\",\n", + " val_data_dir=\"parquet/val\",\n", + " batch_size=500,\n", + " lr=1e-2,\n", + " num_epochs=10,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2ae85895ab6a4201821c545e7d746842", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "epoch: 0%| | 0/10 [00:00\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idxitem_idxrelevanceresponse_probaresponse
023288175990.0003760.0030840
123288146270.0003760.0593570
2232163300.0003760.0043040
3232179150.0003760.0108090
\n", + "" + ], + "text/plain": [ + " user_idx item_idx relevance response_proba response\n", + "0 23288 17599 0.000376 0.003084 0\n", + "1 23288 14627 0.000376 0.059357 0\n", + "2 232 16330 0.000376 0.004304 0\n", + "3 232 17915 0.000376 0.010809 0" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "test_response.toPandas()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "oklaxbiawagxloskdgy6g", + "execution_id": "418b174f-f4be-49fe-88aa-585826871197" + }, + "source": [ + "## (5) Fitting of new recommender model" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "After receiving responses to recommendations, we can use this information to update the recommender model. To do this, we should rename column `response` to `relevance`." + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idxitem_idxrelevance
023288175990
123288146270
2232163300
3232179150
\n", + "
" + ], + "text/plain": [ + " user_idx item_idx relevance\n", + "0 23288 17599 0\n", + "1 23288 14627 0\n", + "2 232 16330 0\n", + "3 232 17915 0" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_log = test_response.drop(\"relevance\", \"response_proba\").withColumnRenamed(\n", + " \"response\", \"relevance\"\n", + ")\n", + "new_log.limit(5).toPandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
item_idxrelevance
0163300.37233
1179150.37233
2146270.37233
3175990.37233
\n", + "
" + ], + "text/plain": [ + " item_idx relevance\n", + "0 16330 0.37233\n", + "1 17915 0.37233\n", + "2 14627 0.37233\n", + "3 17599 0.37233" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.fit(log=new_log)\n", + "model.item_popularity.limit(5).toPandas()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "ytr06uktdlrtba7yym35z", + "execution_id": "875247d7-4576-4f2e-8524-57a90ec7b530" + }, + "source": [ + "## (6) Quality of recommendations" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "rlp6n6ghul6do1y9tnfs3", + "execution_id": "c66c5616-7b51-46fb-bf64-ff3aae3560a3" + }, + "source": [ + "Quality is the mean number of positive responses per user." + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "cellId": "ggmpn0ggz9nq4qt06ubae" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + }, + { + "data": { + "text/plain": [ + "0.0" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "calc_metric(test_response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "o0o3kq6tjrs7tuvbdikavd", + "execution_id": "7c137458-8817-41ef-aa39-c255fe3286f6" + }, + "source": [ + "# Training the model in the simulator" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "cellId": "kkg4h3xdwqhgpk4gs9y37m" + }, + "outputs": [], + "source": [ + "%%bash -s \"$CHECKPOINT_DIR\"\n", + "rm -rf $1" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "wkff236bnjdemsw693fj6s", + "execution_id": "2f344684-ba2b-4d19-9079-527e6e2d7969" + }, + "source": [ + "## Simulator initialization" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "cellId": "9eplt0wb7cnd273dkt5n6" + }, + "outputs": [], + "source": [ + "user_generator.initSeedSequence(SEED)\n", + "item_generator.initSeedSequence(SEED)\n", + "\n", + "sim = Simulator(\n", + " user_gen=user_generator,\n", + " item_gen=item_generator,\n", + " data_dir=f\"{CHECKPOINT_DIR}/pipeline\",\n", + " user_key_col=\"user_idx\",\n", + " item_key_col=\"item_idx\",\n", + " spark_session=spark,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "32xq7dw4q0uk4bwf04bzac", + "execution_id": "5a37dcac-ecb3-4c8a-b613-96059682e31d" + }, + "source": [ + "### Check that the format is correct" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "cellId": "mz1tro3j75j8a8hcuvjvl7" + }, + "outputs": [], + "source": [ + "pred = model.predict(log=None, users=users.limit(10), items=items, k=K)\n", + "\n", + "assert pred.columns == [\"user_idx\", \"item_idx\", \"relevance\"]\n", + "assert (\n", + " pred.groupBy(\"user_idx\")\n", + " .agg(sf.countDistinct(\"item_idx\").alias(\"num_items\"))\n", + " .filter(sf.col(\"num_items\") == sf.lit(K))\n", + " .count()\n", + " == 10\n", + ")\n", + "assert (\n", + " pred.groupBy(\"user_idx\")\n", + " .agg(sf.count(\"item_idx\").alias(\"num_items\"))\n", + " .filter(sf.col(\"num_items\") == sf.lit(K))\n", + " .count()\n", + " == 10\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "log = sim.get_log(users)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "363j2r5xezoduowlgowzy8", + "execution_id": "23bcc021-9eb1-4d41-b46b-6a05442fd92e" + }, + "source": [ + "## Response function initialization" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "proba_model = NNResponseTransformer.load(\"response_function_checkpoint\")\n", + "br = BernoulliResponse(inputCol=\"response_proba\", outputCol=\"response\", seed=SEED)\n", + "response_pipeline = Pipeline(stages=[proba_model, br])\n", + "response_model = response_pipeline.fit(items)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "cellId": "1t5x6egzvjmz7yk9tc7gf", + "execution_id": "50e4dc71-1b47-4832-af9f-efcd08b5b47c" + }, + "source": [ + "## Simulation cycle" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# prepare real data log in the simulator log format" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellId": "9xd6azbslgcdb0hsl7sm" + }, + "outputs": [ + { + "data": { + "image/png": "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goODTX/+c/gAgL1792Ls2LGYP38+hg0bBjc3N6xbtw7vv/++RepUKpX1HstkMhiNRou8FhHdHYYbImoxKpUKBoOh3rY+ffrg+PHj6NixY7OOtWfPHrRr1w7/+Mc/TNsuXrx429f7X127dkVycjK0Wq0pQO3evRtyuRxdunRpVk1EZB14QzERtZiQkBDs3LkTeXl5KC4uBlA34mnPnj2YPn06srKycObMGWzZsqXBDb3/q1OnTsjJycG6detw7tw5fPzxx9i0aVOD18vOzkZWVhaKi4uh0+kaHGfs2LGwt7dHfHw8jh07hm3btuH555/H+PHjTZekiMi2MNwQUYt54403cOHCBXTo0AHe3t4AgF69emHHjh04ffo0BgwYgIiICLz++usICAi45bEefvhhzJw5E9OnT0fv3r2xZ88e0yiqGx5//HH85S9/waBBg+Dt7Y2vv/66wXEcHR3xyy+/oKSkBH379sVf//pXPPjgg/j000/N1zgRtSjOUExERESSwjM3REREJCkMN0RERCQpDDdEREQkKQw3REREJCkMN0RERCQpDDdEREQkKQw3REREJCkMN0RERCQpDDdEREQkKQw3REREJCkMN0RERCQp/w8GnEhBmnAVQwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Iteration 8 finished in 73.51121759414673 sec.\n", + "Iteration 9 started\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 4824:=======> (393 + 4) / 601][Stage 4825:> (0 + 0) / 1]\r" + ] + } + ], + "source": [ + "metrics = []\n", + "# sim.update_log(spark.createDataFrame([], schema=SIM_LOG_SCHEMA), iteration=-1)\n", + "\n", + "for i in range(NUM_ITER):\n", + " print(f\"Iteration {i} started\")\n", + " iter_time = time.time()\n", + " # visiting users\n", + " current_users = sim.sample_users(0.05).cache()\n", + " user_idx = current_users.select(\"user_idx\").rdd.flatMap(lambda x: x).collect()\n", + "\n", + " log = sim.get_log(users)\n", + " recs = model.predict(\n", + " log=log, k=K, users=current_users, items=items, filter_seen_items=False\n", + " )\n", + " # getting responses\n", + " true_resp = sim.sample_responses(\n", + " recs_df=recs,\n", + " user_features=current_users,\n", + " item_features=items,\n", + " action_models=response_model,\n", + " )\n", + " # update the interaction history\n", + " sim.update_log(true_resp, iteration=i)\n", + " # measure quality\n", + " metrics.append(calc_metric(true_resp))\n", + " # refitting the model\n", + " model._clear_cache()\n", + " train_log = sim.log\n", + " model.fit(\n", + " log=train_log.select(\"user_idx\", \"item_idx\", \"response\").withColumnRenamed(\n", + " \"response\", \"relevance\"\n", + " )\n", + " )\n", + "\n", + " current_users.unpersist()\n", + " if log is not None:\n", + " log.unpersist()\n", + " recs.unpersist()\n", + " true_resp.unpersist()\n", + " train_log.unpersist()\n", + "\n", + " plot_metric(metrics)\n", + " print(f\"Iteration {i} finished in {time.time() - iter_time} sec.\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellId": "zpg8amfm8mvopmyulehl9" + }, + "outputs": [], + "source": [ + "sim.log.filter(sf.col(\"__iter\") == 1).filter(sf.col(\"response_proba\") > 0.2).show(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Final prediction" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellId": "s06ebpys4j0613t0tm6h5p" + }, + "outputs": [], + "source": [ + "recs = model.predict(\n", + " log=sim.log, k=K, users=users, items=items, filter_seen_items=False\n", + ").cache()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "cellId": "jkr7id6a4fotox3u6qyrn" + }, + "outputs": [], + "source": [ + "# responses\n", + "true_resp = sim.sample_responses(\n", + " recs_df=recs,\n", + " user_features=users,\n", + " item_features=items,\n", + " action_models=response_model,\n", + ").cache()\n", + "\n", + "# quality\n", + "print(\n", + " f\"Average number of items purchased per user after model training = {calc_metric(true_resp)}\"\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "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.19" + }, + "notebookId": "cd4e698e-7892-45e1-a7aa-fe1453f4b402", + "notebookPath": "sources/sim4rec/sber-simulator-main/task_1.ipynb", + "vscode": { + "interpreter": { + "hash": "0c23ac1ac3d03469769ffca4283c7852312778d94b2cbd9b1a60eeafc1c4055f" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/sim4rec/response/nn_response.py b/sim4rec/response/nn_response.py index 4de81c0..5d2ec00 100644 --- a/sim4rec/response/nn_response.py +++ b/sim4rec/response/nn_response.py @@ -7,7 +7,7 @@ from .sim4rec_response_function.embeddings import IndexEmbedding from .sim4rec_response_function.datasets import ( RecommendationData, - PandasRecommendationData, + # PandasRecommendationData, ) from pyspark.sql.types import ( @@ -34,8 +34,8 @@ class NNResponseTransformer(ActionModelTransformer): def __init__(self, **kwargs): super().__init__() + self.hist_data = None for param, value in kwargs.items(): - print(param, value) setattr(self, param, value) @classmethod @@ -44,9 +44,9 @@ def load(cls, checkpoint_dir): params_dict = pickle.load(f) params_dict["backbone_response_model"] = ResponseModel.load(checkpoint_dir) with open(os.path.join(checkpoint_dir, "_item_indexer.pkl"), "rb") as f: - params_dict["_item_indexer"] = pickle.load(f) + params_dict["item_indexer"] = pickle.load(f) with open(os.path.join(checkpoint_dir, "_user_indexer.pkl"), "rb") as f: - params_dict["_user_indexer"] = pickle.load(f) + params_dict["user_indexer"] = pickle.load(f) return cls(**params_dict) def save(self, path): @@ -59,7 +59,11 @@ def save(self, path): pickle.dump(self.user_indexer, f, pickle.HIGHEST_PROTOCOL) with open(os.path.join(path, "_params.pkl"), "wb") as f: pickle.dump( - {"outputCol": self.outputCol, "log_dir": self.log_dir}, + { + "outputCol": self.outputCol, + "log_dir": self.log_dir, + "hist_data_dir": self.hist_data_dir, + }, f, pickle.HIGHEST_PROTOCOL, ) @@ -69,82 +73,67 @@ def _transform(self, new_recs): Predict responses for given dataframe with recommendations. :param dataframe: new recommendations. - """ - spark = new_recs.sql_ctx.sparkSession - self.__simlog = spark.read.schema(SIM_LOG_SCHEMA).parquet(self.log_dir) - if not self.__simlog: - print("Warning: the simulator log is empty") - self.__simlog = spark.createDataFrame([], schema=SIM_LOG_SCHEMA) - - def agg_func(df): - return self._predict_udf(df) - # TODO: add option to make bacthed predictions by ading - # temorary "batch_id" column - groupping_column = "user_idx" - - new_recs = new_recs.withColumn("__iter", sf.lit(999999999)) - new_recs = new_recs.withColumn("response", sf.lit(0.0)) - new_recs = new_recs.withColumn("response_proba", sf.lit(0.0)) - return ( - new_recs.groupby(groupping_column) - .applyInPandas(agg_func, new_recs.schema) - .show() - ) + def predict_udf(df): + # if not do this, something unstable happens to the Method Resolution Order + from .sim4rec_response_function.datasets import PandasRecommendationData - def _predict_udf(self, df): - """ - Make predictions for given pandas DataFrame. - :param df: pandas DataFrame. - :return: pandas DataFrame with the same schema, but overwritten column 'respone_proba'. - """ + dataset = PandasRecommendationData( + log=df, + item_indexer=self.item_indexer, + user_indexer=self.user_indexer, + ) - # select only users whom we need - # will this be fast enought, or better filter before? - hist_data_selected_users = self.hist_data.join( - self.__simlog, on="user_idx", how="inner" - ).select(self.hist_data["*"]) + # replacing clicks in datset with predicted + dataset = self.backbone_response_model.transform(dataset=dataset) - # assume that historical data interactions were BEFORE simulate - previous_interactions = hist_data_selected_users.unionByName(self.__simlog) + return dataset._log[SIM_LOG_COLS] - new_slates = PandasRecommendationData( - df, item_indexer=self.item_indexer, user_indexer=self.user_indexer - ) + spark = new_recs.sql_ctx.sparkSession - # generating clicks - predicted_clicks = self.backbone_response_model.transform( - dataset=previous_interactions, - new_slates=new_slates, - method="autoregressive", + # read the historical data + hist_data = spark.read.schema(SIM_LOG_SCHEMA).parquet(self.hist_data_dir) + if not hist_data: + print("Warning: the historical data is empty") + hist_data = spark.createDataFrame([], schema=SIM_LOG_SCHEMA) + # filter users whom we don't need + hist_data = hist_data.join(new_recs, on="user_idx", how="inner").select( + hist_data["*"] ) - print(predicted_clicks) - #### DEBUG I am here now - # removing redundant columns - predictions_clean = predicted_clicks.to_iteraction_table()[ - ["user_id", "item_id", "predicted_probs", "predicted_response"] - ] - predictions_clean["item_id"] = predictions_clean["item_id"].astype(int) - predictions_clean["user_id"] = predictions_clean["user_id"].astype(int) - predictions_clean.rename( - columns={ - "user_id": "user_idx", - "item_id": "item_idx", - "predicted_probs": "response_proba", - "predicted_response": "response", - }, - inplace=True, + # read the updated simulator log + simlog = spark.read.schema(SIM_LOG_SCHEMA).parquet(self.log_dir) + if not simlog: + print("Warning: the simulator log is empty") + simlog = spark.createDataFrame([], schema=SIM_LOG_SCHEMA) + # filter users whom we don't need + simlog = simlog.join(new_recs, on="user_idx", how="inner").select(simlog["*"]) + + NEW_ITER_NO = 9999999 + + # since all the historical records are older than simulated by design, + # and new slates are newer than simulated, i can simply concat it + combined_data = hist_data.unionByName(simlog).unionByName( + new_recs.withColumn("response_proba", sf.lit(0.0)) + .withColumn("response", sf.lit(0.0)) + .withColumn( + "__iter", + sf.lit( + NEW_ITER_NO + ), # this is just a large number, TODO: add correct "__iter" field to sim4rec.sample_responses to avoid this constants + ) ) - final = new_recs_data[["user_idx", "item_idx", "relevance"]].join( - predictions_clean.set_index(["user_idx", "item_idx"]), - on=["user_idx", "item_idx"], - validate="one_to_one", + # not very optimal way, it makes one worker to + # operate with one user, discarding batched computations. + # TODO: add batch_id column and use one worker ? + groupping_column = "user_idx" + result_df = combined_data.groupby(groupping_column).applyInPandas( + predict_udf, SIM_LOG_SCHEMA ) - - return final + filtered_df = result_df.filter(sf.col("__iter") == NEW_ITER_NO) + return filtered_df.select(new_recs.columns + [self.outputCol]) class NNResponseEstimator(ActionModelEstimator): @@ -211,4 +200,5 @@ def _fit(self, train_data): user_indexer=self.user_indexer, hist_data_dir=self.hist_data_dir, log_dir=self.log_dir, + outputCol=self.outputCol, ) diff --git a/sim4rec/response/sim4rec_response_function/datasets.py b/sim4rec/response/sim4rec_response_function/datasets.py index b9c7713..f11a394 100755 --- a/sim4rec/response/sim4rec_response_function/datasets.py +++ b/sim4rec/response/sim4rec_response_function/datasets.py @@ -102,24 +102,31 @@ def _get_log_for_users(self, user_idxs): def __getitems__(self, user_idxs: list) -> dict: """Get data points for users with ids in `user_idx`""" - users_log = self._get_log_for_users(user_idxs) + users_log = self._get_log_for_users( + user_idxs + ) # list of rows, each row is ineraction batch = [] curr_user_log = [] prev_user = -1 - # will it be faster if implemented with pandas udfs? + + # TODO: will it be faster if implemented via convertion to pandas? for row in users_log: - if prev_user == row["user_idx"] and prev_user != -1: + if prev_user == row["user_idx"]: curr_user_log.append(row) else: - user_index = self._user_indexer.index_np(prev_user) - batch.append(self._user_log_to_datapoint(curr_user_log, user_index)) + if prev_user != -1: + user_index = self._user_indexer.index_np(prev_user).item() + batch.append(self._user_log_to_datapoint(curr_user_log, user_index)) prev_user = row["user_idx"] curr_user_log = [row] + user_index = self._user_indexer.index_np(prev_user).item() + batch.append(self._user_log_to_datapoint(curr_user_log, user_index)) + return batch def get_empty_data(self, slate_size=10): """Empty datapont""" - # everythoing is masked, hence it won't impact training nor metric computation + # everything is masked, hence it won't impact training nor metric computation return { "item_indexes": np.ones((1, slate_size), dtype=int), "user_index": 1, # unknown index @@ -156,7 +163,6 @@ def _user_log_to_datapoint(self, slates: list, user_index: int): """ # Number of recommendations (R) R = len(slates) - if R == 0: return self.get_empty_data() @@ -175,7 +181,7 @@ def _user_log_to_datapoint(self, slates: list, user_index: int): item_idxs[i, :slate_size] = slate["item_idxs"] slates_mask[i, :slate_size] = [True] * slate_size responses[i, :slate_size] = slate["responses"] - timestamps[i, :slate_size] = slate["__iter"] * slate_size + timestamps[i, :slate_size] = [slate["__iter"]] * slate_size # Create the output dictionary data_point = { @@ -236,7 +242,7 @@ def __init__( ] ) - # in _users only users which are actually present in data are stored, rather han all indexed users + # in _users only users which are actually present in data are stored, NOT all indexed users self._users = [ row["user_idx"] for row in self._log.select("user_idx").distinct().collect() ] @@ -275,18 +281,18 @@ def __init__( """ Initializes the dataset from `log` pandas dataframe. """ - super().__init__(log, item_indexer, user_indexer) + super(PandasRecommendationData, self).__init__( + log=log, item_indexer=item_indexer, user_indexer=user_indexer + ) if not item_indexer: self._item_indexer.update_from_iter(self._log.item_idx.unique()) - if not item_indexer: + if not user_indexer: self._user_indexer.update_from_iter(self._log.user_idx.unique()) self._users = self._log.user_idx.unique() def _get_log_for_users(self, user_idxs: list): """ - Faster version of `__getitem__` for batched input. DataLoaders in torch >=2 - automatically use this method if it's implemented. In earlier versions of pytorch - a custom sampler is required. + Extract rows belonging to specific set of users. :param user_idxs: list of user indexes. If None, all users are returned. """ @@ -299,7 +305,7 @@ def _get_log_for_users(self, user_idxs: list): item_idx=pd.NamedAgg(column="item_idx", aggfunc=list), response=pd.NamedAgg(column="response", aggfunc=list), ) - .rename(columns={"user_idx": "user_idxs"}) + .rename(columns={"item_idx": "item_idxs", "response": "responses"}) .reset_index() ) # convert to list of rows to match spark .collect() format: @@ -307,8 +313,17 @@ def _get_log_for_users(self, user_idxs: list): return users_log def apply_scoring(self, score_df): - self.log["item_index"] = self.item_indexer.index_np(self.log("item_idx")) - self.log["user_index"] = self.item_indexer.index_np(self.log("user_idx")) - self.log = self.log.merge(score_df, on=["user_index", "item_index"], how="left") - self.log["response_proba"] = self.log["score"] - self.log.drop(columns=["score"], inplace=True) + """Add predicted probabilities to log""" + score_df = ( + score_df.groupby(["user_index", "item_index", "__iter"]) + .agg({"score": "first"}) + .reset_index() + ) + self._log["item_index"] = self._item_indexer.index_np(self._log["item_idx"]) + self._log["user_index"] = self._user_indexer.index_np(self._log["user_idx"]) + self._log = self._log.merge( + score_df, on=["user_index", "item_index", "__iter"], how="left" + ) + self._log["response_proba"] = self._log["score"] + self._log.drop(columns=["score", "item_index", "user_index"], inplace=True) + return self diff --git a/sim4rec/response/sim4rec_response_function/models.py b/sim4rec/response/sim4rec_response_function/models.py index 428d901..2082adc 100755 --- a/sim4rec/response/sim4rec_response_function/models.py +++ b/sim4rec/response/sim4rec_response_function/models.py @@ -34,7 +34,7 @@ SlatewiseGRU, SlatewiseTransformer, ) -from .utils import concat_batch, create_loader, collate_rec_data +from .utils import create_loader Metrics = namedtuple("metrics", ["rocauc", "f1", "accuracy"]) @@ -329,73 +329,58 @@ def fit( def _get_scores( self, - historical_data: RecommendationData, - new_slates: RecommendationData, + dataset: RecommendationData, + batch_size: int, **kwargs, ): """ - Get predicted click provavilities. + Run model on dataset, get predicted click probabilities. + + :return: (user_ids, timestamps, items, scores) """ users, items, scores, timestamps = [], [], [], [] - # compute all data in on ebatch (bathcing is performed on the spark MLLIb level) - - new_recs = new_slates[[]] # all users from new slates - hist_data = historical_data[new_slates.users] # only relevant users - combined_data = concat_batch(hist_data, new_recs) - batch = collate_rec_data(combined_data) - batch = {k: v.to(self.device) for k, v in batch.items()} - - # for each session, this index tensor points to the last interaction - # which is the only interachion in new slates by design - slate_size = max( - hist_data[0]["slates_mask"].shape[-1], new_recs[0]["slates_mask"].shape[-1] - ) - hist_lengths = torch.tensor( - [d["length"] for d in hist_data], device=self.device - )[:, None] - hist_lengths = hist_lengths[..., None].repeat(1, 1, slate_size) + 1 - - with torch.no_grad(): - # run model - raw_scores = torch.sigmoid(self._model(batch)) - items.append( - batch["item_indexes"].gather(dim=1, index=hist_lengths).detach().cpu() - ) - users.append( - batch["item_indexes"] - .gather(dim=1, index=hist_lengths[..., 0]) - .detach() - .cpu() - ) - scores.append(raw_scores.gather(dim=1, index=hist_lengths).detach().cpu()) - timestamps.append( - batch["timestamps"].gather(dim=1, index=hist_lengths).detach().cpu() - ) - print(users, timestamps, items, scores) - return users, timestamps, items, scores - - def transform(self, historical_data, new_slates): + loader = create_loader(dataset, batch_size=batch_size) + for batch in loader: + with torch.no_grad(): + # run model + batch = {k: v.to(self.device) for k, v in batch.items()} + mask = batch["slates_mask"] + raw_scores = torch.sigmoid(self._model(batch)) + items.append(batch["item_indexes"][mask].detach().cpu().numpy()) + # create a view s.t. [user_1, ... ] -> [[user_1 x slate_size] x sequence_size, ... ] + # then select by mask for items to allign with scores and item_idx sequences + users.append( + batch["user_indexes"][:, None, None] + .expand_as(mask)[mask] + .detach() + .cpu() + .numpy() + ) + scores.append(raw_scores[mask].detach().cpu().numpy()) + timestamps.append(batch["timestamps"][mask].detach().cpu().numpy()) + return users, timestamps, items, scores + + def transform(self, dataset, batch_size=128, **kwargs): """ Returns a recommendation dataset with response probabilities provided. - :param PandasRecommendationData historical: initial parts of each session. - :param PandasRecommendationData new_slates: new recommendations data. - It is assumed, that only one slate per user is present. + :param RecommendationData dataset: datset to operate on. + """ - if type(new_slates) is PandasRecommendationData: + if type(dataset) is PandasRecommendationData: user_idx, timestamp, item_idx, score = self._get_scores( - historical_data, new_slates + dataset, batch_size, **kwargs ) score_df = pd.DataFrame( { - "user_idx": user_idx, - "__iter": timestamp, - "item_idx": item_idx, - "score": score, + "user_index": np.concatenate(user_idx), + "__iter": np.concatenate(timestamp), + "item_index": np.concatenate(item_idx), + "score": np.concatenate(score), } ) - return deepcopy(new_slates).apply_scoring(score_df) + return deepcopy(dataset).apply_scoring(score_df) else: raise NotImplementedError diff --git a/sim4rec/response/sim4rec_response_function/utils.py b/sim4rec/response/sim4rec_response_function/utils.py index a6268a5..04c815b 100644 --- a/sim4rec/response/sim4rec_response_function/utils.py +++ b/sim4rec/response/sim4rec_response_function/utils.py @@ -44,8 +44,8 @@ def collate_rec_data(batch: list, padding_value=0): b["responses"] = pad_slates(b["responses"], max_slate_size, padding_value) b["timestamps"] = pad_slates(b["timestamps"], max_slate_size, padding_value) - # user indexes + # print([b["user_index"] for b in batch]) user_indexes = torch.tensor([b["user_index"] for b in batch], dtype=torch.long) # item indexes @@ -71,7 +71,7 @@ def collate_rec_data(batch: list, padding_value=0): responses, padding_value=padding_value, batch_first=True ) - # timestamps: we assume that (user_id, timestamp) is an unique + # timestamps: we assume that (user_id, timestamp) is an unique # identifier of slate, hence we need to pass it through model # for further decoding model outputs # shape: batch_size, max_sequence_len, max_slate_size @@ -102,7 +102,7 @@ def concat_batch(left, right): sessionwise_fields = [ "item_indexes", # TODO: "item_embeddings", - # "item_categorical", + # TODO: "item_categorical", "slates_mask", "responses", # TODO: "user_embeddings", @@ -228,12 +228,12 @@ def index_np(self, arr: np.array): vfunc = np.vectorize(lambda x: self._id2index.get(x, unk_index)) return vfunc(arr) - def index_df(self, df, inputCol, outputCol): - """ - Apply indexing to the whole spark dataframe colmn. - """ - mapping_expr = create_map([lit(x) for x in chain(*self._id2index.items())]) - return df.withColumn(outputCol, coalesce(mapping_expr[col(inputCol)], lit(1))) + # def index_df(self, df, inputCol, outputCol): + # """ + # Apply indexing to the whole spark dataframe colmn. + # """ + # mapping_expr = create_map([lit(x) for x in chain(*self._id2index.items())]) + # return df.withColumn(outputCol, coalesce(mapping_expr[col(inputCol)], lit(1))) def get_id(self, arr: np.array): """ From b787cc41ef74399ac7f14349f94622ee65d45eb6 Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Sat, 23 Nov 2024 23:28:15 +0300 Subject: [PATCH 06/14] rename --- sim4rec/response/nn_response.py | 6 +++--- .../{sim4rec_response_function => nn_utils}/__init__.py | 0 .../{sim4rec_response_function => nn_utils}/adversarial.py | 0 .../{sim4rec_response_function => nn_utils}/datasets.py | 0 .../{sim4rec_response_function => nn_utils}/embeddings.py | 0 .../{sim4rec_response_function => nn_utils}/models.py | 0 .../{sim4rec_response_function => nn_utils}/sessionwise.py | 0 .../{sim4rec_response_function => nn_utils}/slatewise.py | 0 .../{sim4rec_response_function => nn_utils}/utils.py | 0 9 files changed, 3 insertions(+), 3 deletions(-) rename sim4rec/response/{sim4rec_response_function => nn_utils}/__init__.py (100%) rename sim4rec/response/{sim4rec_response_function => nn_utils}/adversarial.py (100%) rename sim4rec/response/{sim4rec_response_function => nn_utils}/datasets.py (100%) rename sim4rec/response/{sim4rec_response_function => nn_utils}/embeddings.py (100%) rename sim4rec/response/{sim4rec_response_function => nn_utils}/models.py (100%) rename sim4rec/response/{sim4rec_response_function => nn_utils}/sessionwise.py (100%) rename sim4rec/response/{sim4rec_response_function => nn_utils}/slatewise.py (100%) rename sim4rec/response/{sim4rec_response_function => nn_utils}/utils.py (100%) diff --git a/sim4rec/response/nn_response.py b/sim4rec/response/nn_response.py index 5d2ec00..099ef7e 100644 --- a/sim4rec/response/nn_response.py +++ b/sim4rec/response/nn_response.py @@ -3,9 +3,9 @@ import pyspark.sql.functions as sf from .response import ActionModelEstimator, ActionModelTransformer -from .sim4rec_response_function.models import ResponseModel -from .sim4rec_response_function.embeddings import IndexEmbedding -from .sim4rec_response_function.datasets import ( +from .nn_utils.models import ResponseModel +from .nn_utils.embeddings import IndexEmbedding +from .nn_utils.datasets import ( RecommendationData, # PandasRecommendationData, ) diff --git a/sim4rec/response/sim4rec_response_function/__init__.py b/sim4rec/response/nn_utils/__init__.py similarity index 100% rename from sim4rec/response/sim4rec_response_function/__init__.py rename to sim4rec/response/nn_utils/__init__.py diff --git a/sim4rec/response/sim4rec_response_function/adversarial.py b/sim4rec/response/nn_utils/adversarial.py similarity index 100% rename from sim4rec/response/sim4rec_response_function/adversarial.py rename to sim4rec/response/nn_utils/adversarial.py diff --git a/sim4rec/response/sim4rec_response_function/datasets.py b/sim4rec/response/nn_utils/datasets.py similarity index 100% rename from sim4rec/response/sim4rec_response_function/datasets.py rename to sim4rec/response/nn_utils/datasets.py diff --git a/sim4rec/response/sim4rec_response_function/embeddings.py b/sim4rec/response/nn_utils/embeddings.py similarity index 100% rename from sim4rec/response/sim4rec_response_function/embeddings.py rename to sim4rec/response/nn_utils/embeddings.py diff --git a/sim4rec/response/sim4rec_response_function/models.py b/sim4rec/response/nn_utils/models.py similarity index 100% rename from sim4rec/response/sim4rec_response_function/models.py rename to sim4rec/response/nn_utils/models.py diff --git a/sim4rec/response/sim4rec_response_function/sessionwise.py b/sim4rec/response/nn_utils/sessionwise.py similarity index 100% rename from sim4rec/response/sim4rec_response_function/sessionwise.py rename to sim4rec/response/nn_utils/sessionwise.py diff --git a/sim4rec/response/sim4rec_response_function/slatewise.py b/sim4rec/response/nn_utils/slatewise.py similarity index 100% rename from sim4rec/response/sim4rec_response_function/slatewise.py rename to sim4rec/response/nn_utils/slatewise.py diff --git a/sim4rec/response/sim4rec_response_function/utils.py b/sim4rec/response/nn_utils/utils.py similarity index 100% rename from sim4rec/response/sim4rec_response_function/utils.py rename to sim4rec/response/nn_utils/utils.py From 9954b7dbb5fdf1c74f8edf396d5e49cef8020b9b Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Mon, 25 Nov 2024 01:09:34 +0300 Subject: [PATCH 07/14] notebook move to notebooks, changed model to SlatewiseTransformer --- .../nn_response_evaluation.ipynb | 508 ++++++------------ pyproject.toml | 5 +- sim4rec/response/nn_response.py | 2 +- 3 files changed, 176 insertions(+), 339 deletions(-) rename rs_performance_evaluation_latest.ipynb => notebooks/nn_response_evaluation.ipynb (51%) diff --git a/rs_performance_evaluation_latest.ipynb b/notebooks/nn_response_evaluation.ipynb similarity index 51% rename from rs_performance_evaluation_latest.ipynb rename to notebooks/nn_response_evaluation.ipynb index 0da9e71..7689c1f 100644 --- a/rs_performance_evaluation_latest.ipynb +++ b/notebooks/nn_response_evaluation.ipynb @@ -27,43 +27,14 @@ "outputs": [], "source": [ "%load_ext autoreload\n", - "%autoreload 2" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'1.5.4'" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import scipy\n", - "scipy.__version__" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ + "%autoreload 2\n", "# !pip install jupyter-black\n", "%load_ext jupyter_black" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -80,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, "metadata": { "cellId": "jlz0twee16goe1fisulv5" }, @@ -107,7 +78,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 4, "metadata": { "cellId": "jlz0twee16goe1fisulv5" }, @@ -117,12 +88,17 @@ "from sim4rec.modules import Simulator\n", "from sim4rec.response import BernoulliResponse, ActionModelTransformer\n", "\n", - "warnings.filterwarnings(\"ignore\")" + "\n", + "def warn(*args, **kwargs):\n", + " pass\n", + "\n", + "\n", + "warnings.warn = warn" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -133,7 +109,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "metadata": { "cellId": "ku55idy38nqtlrc187ucq" }, @@ -147,7 +123,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "metadata": { "cellId": "v1uc08ym8h8d7qxpmsop4" }, @@ -161,11 +137,11 @@ "WARNING: Please consider reporting this to the maintainers of org.apache.spark.unsafe.Platform\n", "WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations\n", "WARNING: All illegal access operations will be denied in a future release\n", - "24/11/10 20:05:23 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", + "24/11/24 21:38:08 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable\n", "Using Spark's default log4j profile: org/apache/spark/log4j-defaults.properties\n", "Setting default log level to \"WARN\".\n", "To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).\n", - "24/11/10 20:05:24 WARN SparkConf: Note that spark.local.dir will be overridden by the value set by the cluster manager (via SPARK_LOCAL_DIRS in mesos/standalone/kubernetes and LOCAL_DIRS in YARN).\n" + "24/11/24 21:38:09 WARN SparkConf: Note that spark.local.dir will be overridden by the value set by the cluster manager (via SPARK_LOCAL_DIRS in mesos/standalone/kubernetes and LOCAL_DIRS in YARN).\n" ] } ], @@ -190,7 +166,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "metadata": { "cellId": "9vf3sqixr4vgau073549pv" }, @@ -238,7 +214,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -301,7 +277,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -327,7 +303,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -347,7 +323,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "metadata": {}, "outputs": [], "source": [ @@ -360,7 +336,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -373,14 +349,14 @@ ], "source": [ "# re-read:\n", - "train = spark.read.parquet(\"parquet/train\")\n", - "val = spark.read.parquet(\"parquet/val\")\n", - "test = spark.read.parquet(\"parquet/test\")" + "train = spark.read.parquet(\"../parquet/train\")\n", + "val = spark.read.parquet(\"../parquet/val\")\n", + "test = spark.read.parquet(\"../parquet/test\")" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -412,7 +388,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "metadata": { "cellId": "zh9qtijcn5143mi4887od" }, @@ -430,7 +406,7 @@ "(2658, 19205)" ] }, - "execution_count": 17, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -453,7 +429,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "metadata": { "cellId": "3btpzal8hblukqhq46asd" }, @@ -471,7 +447,7 @@ "2658" ] }, - "execution_count": 18, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -510,7 +486,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "metadata": { "cellId": "erkzmjzvo06nl5bok1qv5n" }, @@ -521,7 +497,7 @@ "1964" ] }, - "execution_count": 19, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -563,7 +539,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "metadata": { "cellId": "kck71xz164nwlq1tlo81d" }, @@ -638,7 +614,7 @@ "3 23288 14627 0.000376" ] }, - "execution_count": 20, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -678,12 +654,12 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## (4) PDMI response function" + "## (4) Neural response function" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -692,211 +668,56 @@ "proba_model = NNResponseEstimator(\n", " outputCol=\"response_proba\",\n", " log_dir=f\"{CHECKPOINT_DIR}/pipeline\",\n", - " model_name=\"LogisticRegression\",\n", - " hist_data_dir=\"parquet/train\",\n", - " val_data_dir=\"parquet/val\",\n", - " batch_size=500,\n", - " lr=1e-2,\n", - " num_epochs=10,\n", + " model_name=\"SlatewiseTransformer\",\n", + " hist_data_dir=\"../parquet/train\",\n", + " val_data_dir=\"../parquet/val\",\n", + " batch_size=256,\n", + " lr=1e-3,\n", + " num_epochs=5,\n", ")" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 20, "metadata": {}, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - " \r" - ] - }, { "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "2ae85895ab6a4201821c545e7d746842", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "epoch: 0%| | 0/10 [00:00 (0 + 1) / 1]\r" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "+--------+--------+--------------------+--------------------+\n", - "|user_idx|item_idx| relevance| response_proba|\n", - "+--------+--------+--------------------+--------------------+\n", - "| 23288| 17599|3.762227238525207E-4|0.003084074705839157|\n", - "| 23288| 14627|3.762227238525207E-4| 0.05935697630047798|\n", - "| 232| 16330|3.762227238525207E-4|0.004304436966776848|\n", - "| 232| 17915|3.762227238525207E-4|0.010809002444148064|\n", - "+--------+--------+--------------------+--------------------+\n", + "+--------+--------+--------------------+-------------------+\n", + "|user_idx|item_idx| relevance| response_proba|\n", + "+--------+--------+--------------------+-------------------+\n", + "| 23288| 17599|3.762227238525207E-4|0.19280970096588135|\n", + "| 23288| 14627|3.762227238525207E-4| 0.1980724036693573|\n", + "| 232| 16330|3.762227238525207E-4| 0.1340920478105545|\n", + "| 232| 17915|3.762227238525207E-4|0.07575525343418121|\n", + "+--------+--------+--------------------+-------------------+\n", "\n" ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] } ], "source": [ @@ -1169,7 +997,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 26, "metadata": {}, "outputs": [], "source": [ @@ -1180,7 +1008,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 27, "metadata": {}, "outputs": [ { @@ -1197,7 +1025,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 28, "metadata": {}, "outputs": [ { @@ -1241,7 +1069,7 @@ " 23288\n", " 17599\n", " 0.000376\n", - " 0.003084\n", + " 0.192810\n", " 0\n", " \n", " \n", @@ -1249,7 +1077,7 @@ " 23288\n", " 14627\n", " 0.000376\n", - " 0.059357\n", + " 0.198072\n", " 0\n", " \n", " \n", @@ -1257,7 +1085,7 @@ " 232\n", " 16330\n", " 0.000376\n", - " 0.004304\n", + " 0.134092\n", " 0\n", " \n", " \n", @@ -1265,7 +1093,7 @@ " 232\n", " 17915\n", " 0.000376\n", - " 0.010809\n", + " 0.075755\n", " 0\n", " \n", " \n", @@ -1274,13 +1102,13 @@ ], "text/plain": [ " user_idx item_idx relevance response_proba response\n", - "0 23288 17599 0.000376 0.003084 0\n", - "1 23288 14627 0.000376 0.059357 0\n", - "2 232 16330 0.000376 0.004304 0\n", - "3 232 17915 0.000376 0.010809 0" + "0 23288 17599 0.000376 0.192810 0\n", + "1 23288 14627 0.000376 0.198072 0\n", + "2 232 16330 0.000376 0.134092 0\n", + "3 232 17915 0.000376 0.075755 0" ] }, - "execution_count": 32, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1308,7 +1136,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 29, "metadata": {}, "outputs": [ { @@ -1381,7 +1209,7 @@ "3 232 17915 0" ] }, - "execution_count": 33, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1395,7 +1223,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 30, "metadata": {}, "outputs": [ { @@ -1463,7 +1291,7 @@ "3 17599 0.37233" ] }, - "execution_count": 34, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" } @@ -1495,7 +1323,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 31, "metadata": { "cellId": "ggmpn0ggz9nq4qt06ubae" }, @@ -1513,7 +1341,7 @@ "0.0" ] }, - "execution_count": 35, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -1534,7 +1362,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 32, "metadata": { "cellId": "kkg4h3xdwqhgpk4gs9y37m" }, @@ -1556,7 +1384,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 33, "metadata": { "cellId": "9eplt0wb7cnd273dkt5n6" }, @@ -1587,7 +1415,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 34, "metadata": { "cellId": "mz1tro3j75j8a8hcuvjvl7" }, @@ -1614,7 +1442,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 35, "metadata": {}, "outputs": [], "source": [ @@ -1633,7 +1461,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 36, "metadata": {}, "outputs": [], "source": [ @@ -1653,23 +1481,16 @@ "## Simulation cycle" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# prepare real data log in the simulator log format" - ] - }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": { "cellId": "9xd6azbslgcdb0hsl7sm" }, "outputs": [ { "data": { - "image/png": "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goODTX/+c/gAgL1792Ls2LGYP38+hg0bBjc3N6xbtw7vv/++RepUKpX1HstkMhiNRou8FhHdHYYbImoxKpUKBoOh3rY+ffrg+PHj6NixY7OOtWfPHrRr1w7/+Mc/TNsuXrx429f7X127dkVycjK0Wq0pQO3evRtyuRxdunRpVk1EZB14QzERtZiQkBDs3LkTeXl5KC4uBlA34mnPnj2YPn06srKycObMGWzZsqXBDb3/q1OnTsjJycG6detw7tw5fPzxx9i0aVOD18vOzkZWVhaKi4uh0+kaHGfs2LGwt7dHfHw8jh07hm3btuH555/H+PHjTZekiMi2MNwQUYt54403cOHCBXTo0AHe3t4AgF69emHHjh04ffo0BgwYgIiICLz++usICAi45bEefvhhzJw5E9OnT0fv3r2xZ88e0yiqGx5//HH85S9/waBBg+Dt7Y2vv/66wXEcHR3xyy+/oKSkBH379sVf//pXPPjgg/j000/N1zgRtSjOUExERESSwjM3REREJCkMN0RERCQpDDdEREQkKQw3REREJCkMN0RERCQpDDdEREQkKQw3REREJCkMN0RERCQpDDdEREQkKQw3REREJCkMN0RERCQp/w8GnEhBmnAVQwAAAABJRU5ErkJggg==", + "image/png": "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IoiPj29WFuL06dPo0qWLSBE5ttraWkgkN/5zLZVKodVqRYrIPnAGyEIWLlyI6dOnIy4uDoMHD8Z7772HmpoazJgxQ+zQHNKcOXOwfv16fPvtt1AqlSgqKgIAeHp6wsXFReToHItSqWy298rNzQ0+Pj7ckyWSF198EcOGDcObb76JSZMm4fDhw1i9ejVWr14tdmgOacKECfjHP/6BsLAwREVFIT09He+88w5mzpwpdmg2jcfgLWjlypX417/+haKiIsTExOD999/HkCFDxA7LIQmC0OL1tWvX4plnnrFsMNTM8OHDeQxeZNu3b0dCQgLOnDmDiIgILFy4EM8++6zYYTmkqqoqLF68GFu2bEFJSQmCgoIwefJkvPrqq3BychI7PJvFBIiIiIgcDvcAERERkcNhAkREREQOhwkQERERORwmQERERORwmAARERGRw2ECRERERA6HCRARERE5HCZARERE5HCYABGR6IYPH44FCxaIHcYNBEHA1q1bxQ6DiMyElaCJSHTl5eWQy+VQKpUIDw/HggULLJYQLVmyBFu3bkVGRsYN14uKiuDl5QWFQmGROIjIstgMlYhE5+3tbfJnNjQ03FafpM6dO5swGiKyNlwCIyLRGZbAhg8fjosXL+LFF1+EIAg3NK3du3cv7rrrLri4uCA0NBTz589HTU2N8f3h4eF44403MG3aNHh4eGDWrFkAgJdffhk9e/aEq6srunbtisWLF0OtVgMAEhMTsXTpUmRmZhpfLzExEUDzJbBjx47h3nvvhYuLC3x8fDBr1ixUV1cb3//MM8/goYcewttvv43AwED4+Phgzpw5xtciIuvCBIiIrMbmzZsREhKC119/HYWFhSgsLAQAnDt3Dvfddx8effRRHD16FBs3bsTevXsxd+7cGz7+7bffRnR0NNLT07F48WIAgFKpRGJiIrKzs/Gf//wHn3zyCd59910AwBNPPIGXXnoJUVFRxtd74oknmsVVU1ODsWPHwsvLCykpKfjqq6/wyy+/NHv9X3/9FefOncOvv/6KTz/9FImJicaEioisC5fAiMhqeHt7QyqVQqlU3rAEtXz5ckydOtW4L6hHjx54//33cc899+DDDz+Es7MzAODee+/FSy+9dMMzX3nlFeP/h4eH489//jM2bNiAv/71r3BxcYG7uztkMlmrS17r169HfX091q1bBzc3NwDAypUrMWHCBKxYsQIBAQEAAC8vL6xcuRJSqRSRkZEYP348du7ciWeffdYkXx8iMh0mQERk9TIzM3H06FF88cUXxms6nQ5arRY5OTno3bs3ACAuLq7Zx27cuBHvv/8+zp07h+rqajQ2NsLDw6Ndr3/ixAlER0cbkx8AiI+Ph1arxalTp4wJUFRUFKRSqfGewMBAHDt2rF2vRUSWwQSIiKxedXU1Zs+ejfnz5zd7X1hYmPH/r09QAODAgQOYOnUqli5dirFjx8LT0xMbNmzAv//9b7PEKZfLb3hbEARotVqzvBYR3R4mQERkVZycnKDRaG64NmDAAGRnZ6N79+7tetb+/fvRpUsX/P3vfzdeu3jx4i1f7/d69+6NxMRE1NTUGJOsffv2QSKRoFevXu2KiYisAzdBE5FVCQ8PR3JyMvLz81FWVgZAf5Jr//79mDt3LjIyMnDmzBl8++23zTYh/16PHj2Qm5uLDRs24Ny5c3j//fexZcuWZq+Xk5ODjIwMlJWVQaVSNXvO1KlT4ezsjOnTpyMrKwu//vor5s2bh6efftq4/EVEtoUJEBFZlddffx0XLlxAt27d4OfnBwDo378/du/ejdOnT+Ouu+5CbGwsXn31VQQFBbX6rIkTJ+LFF1/E3LlzERMTg/379xtPhxk8+uijuO+++zBixAj4+fnhyy+/bPYcV1dX/PzzzygvL8egQYPw2GOPYeTIkVi5cqXpPnEisihWgiYiIiKHwxkgIiIicjhMgIiIiMjhMAEiIiIih8MEiIiIiBwOEyAiIiJyOEyAiIiIyOEwASIiIiKHwwSIiIiIHA4TICIiInI4TICIiIjI4TABIiIiIofz/7Hu5ehDeFUtAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -1681,15 +1502,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Iteration 8 finished in 73.51121759414673 sec.\n", - "Iteration 9 started\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Stage 4824:=======> (393 + 4) / 601][Stage 4825:> (0 + 0) / 1]\r" + "Iteration 9 finished in 72.66888523101807 sec.\n" ] } ], @@ -1741,11 +1554,29 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "metadata": { "cellId": "zpg8amfm8mvopmyulehl9" }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------+--------+--------------------+-------------------+--------+------+\n", + "|item_idx|user_idx| relevance| response_proba|response|__iter|\n", + "+--------+--------+--------------------+-------------------+--------+------+\n", + "| 4743| 90|8.490598951946013E-4|0.23457157611846924| 1| 1|\n", + "| 2483| 90|5.957144256105823E-4|0.24364517629146576| 1| 1|\n", + "| 4641| 90|4.484400617341632E-4|0.23488779366016388| 1| 1|\n", + "| 3372| 90|4.484400617341632E-4| 0.2816031575202942| 0| 1|\n", + "| 25689| 90|3.178713280692018...| 0.2057647705078125| 0| 1|\n", + "+--------+--------+--------------------+-------------------+--------+------+\n", + "only showing top 5 rows\n", + "\n" + ] + } + ], "source": [ "sim.log.filter(sf.col(\"__iter\") == 1).filter(sf.col(\"response_proba\") > 0.2).show(5)" ] @@ -1759,11 +1590,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "metadata": { "cellId": "s06ebpys4j0613t0tm6h5p" }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + " \r" + ] + } + ], "source": [ "recs = model.predict(\n", " log=sim.log, k=K, users=users, items=items, filter_seen_items=False\n", @@ -1776,7 +1615,15 @@ "metadata": { "cellId": "jkr7id6a4fotox3u6qyrn" }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[Stage 5082:====================================> (48 + 4) / 72]\r" + ] + } + ], "source": [ "# responses\n", "true_resp = sim.sample_responses(\n", @@ -1791,15 +1638,6 @@ " f\"Average number of items purchased per user after model training = {calc_metric(true_resp)}\"\n", ")" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "\n" - ] } ], "metadata": { diff --git a/pyproject.toml b/pyproject.toml index e20afd3..c0960e0 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,16 +17,15 @@ repository = "https://github.com/sb-ai-lab/Sim4Rec" python = ">=3.8, <3.10" pyarrow = "*" sdv = "0.15.0" -torch = "<=1.12.1" +torch = "1.9.1" torchmetrics="*" pandas = "*" pyspark = "3.1.3" numpy = ">=1.20.0" scipy = "1.5.4" -replay-rec = "0.11.0" lightfm = {git = "https://github.com/lyst/lightfm", rev = "0c9c31e"} notebook = "7.0.8" -torchvision = "0.9.1" +torchvision = "0.10.1" [tool.poetry.dev-dependencies] # visualization diff --git a/sim4rec/response/nn_response.py b/sim4rec/response/nn_response.py index 099ef7e..7170b80 100644 --- a/sim4rec/response/nn_response.py +++ b/sim4rec/response/nn_response.py @@ -77,7 +77,7 @@ def _transform(self, new_recs): def predict_udf(df): # if not do this, something unstable happens to the Method Resolution Order - from .sim4rec_response_function.datasets import PandasRecommendationData + from .nn_utils.datasets import PandasRecommendationData dataset = PandasRecommendationData( log=df, From e23704ca7b05eee39625fe073cf3ce9764f4a113 Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Mon, 25 Nov 2024 01:12:26 +0300 Subject: [PATCH 08/14] delete dockerfile --- cuda102.Dockerfile | 44 -------------------------------------------- 1 file changed, 44 deletions(-) delete mode 100755 cuda102.Dockerfile diff --git a/cuda102.Dockerfile b/cuda102.Dockerfile deleted file mode 100755 index 3568441..0000000 --- a/cuda102.Dockerfile +++ /dev/null @@ -1,44 +0,0 @@ -# Use last torch image for our cuda -FROM pytorch/pytorch:1.9.0-cuda10.2-cudnn7-runtime - -RUN apt-get update -y && apt-get install -y \ - build-essential \ - zlib1g-dev \ - libncurses5-dev \ - libgdbm-dev \ - libnss3-dev \ - libssl-dev \ - libsqlite3-dev \ - libreadline-dev \ - libffi-dev \ - libbz2-dev \ - wget \ - curl \ - mc \ - vim \ - nano - -# Update Conda to the latest version -RUN curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && \ - bash Miniconda3-latest-Linux-x86_64.sh -u -b -p /opt/conda && \ - rm Miniconda3-latest-Linux-x86_64.sh && \ - /opt/conda/bin/conda update -n base -c defaults conda - -# create a Conda environment with Python 3.10 and PyTorch 1.12.1 -# (last versions for cuda 10.2) -RUN conda create -n myenv python=3.9 && \ - echo "source activate myenv" > ~/.bashrc && \ - /opt/conda/bin/conda clean -af && \ - conda install -y pytorch==1.12.1 cudatoolkit=10.2 -c pytorch -n myenv - -# Activate the Conda environment -ENV PATH=/opt/conda/envs/myenv/bin:$PATH - -# Install Jupyter Notebook -RUN conda install -y jupyter pandas scipy scikit-learn tqdm -n myenv - -# Set up the working directory -WORKDIR /root/ - -# Start Bash by default when the container runs -CMD ["/bin/bash"] From a7b13254fdeb73293fbb4216566e0782d418a065 Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Mon, 16 Dec 2024 21:59:03 +0300 Subject: [PATCH 09/14] after-review fix --- poetry.lock | 1121 ++++++++++++++++--------------- pyproject.toml | 9 +- sim4rec/response/nn_response.py | 6 +- 3 files changed, 576 insertions(+), 560 deletions(-) diff --git a/poetry.lock b/poetry.lock index 5de83fa..3377429 100644 --- a/poetry.lock +++ b/poetry.lock @@ -13,13 +13,13 @@ files = [ [[package]] name = "anyio" -version = "4.4.0" +version = "4.5.2" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, - {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, + {file = "anyio-4.5.2-py3-none-any.whl", hash = "sha256:c011ee36bc1e8ba40e5a81cb9df91925c218fe9b778554e0b56a21e1b5d4716f"}, + {file = "anyio-4.5.2.tar.gz", hash = "sha256:23009af4ed04ce05991845451e11ef02fc7c5ed29179ac9a420e5ad0ac7ddc5b"}, ] [package.dependencies] @@ -29,9 +29,9 @@ sniffio = ">=1.1" typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} [package.extras] -doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] -trio = ["trio (>=0.23)"] +doc = ["Sphinx (>=7.4,<8.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "truststore (>=0.9.1)", "uvloop (>=0.21.0b1)"] +trio = ["trio (>=0.26.1)"] [[package]] name = "appnope" @@ -136,21 +136,18 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "asttokens" -version = "2.4.1" +version = "3.0.0" description = "Annotate AST trees with source code positions" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, - {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, + {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, + {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, ] -[package.dependencies] -six = ">=1.12.0" - [package.extras] -astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] -test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] +astroid = ["astroid (>=2,<4)"] +test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "async-lru" @@ -168,19 +165,19 @@ typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "attrs" -version = "24.2.0" +version = "24.3.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, - {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, + {file = "attrs-24.3.0-py3-none-any.whl", hash = "sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"}, + {file = "attrs-24.3.0.tar.gz", hash = "sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff"}, ] [package.extras] benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] @@ -254,13 +251,13 @@ css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "certifi" -version = "2024.8.30" +version = "2024.12.14" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8"}, - {file = "certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9"}, + {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"}, + {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"}, ] [[package]] @@ -344,101 +341,116 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "3.3.2" +version = "3.4.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, - {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, - {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, - {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, - {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, - {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, - {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, - {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win32.whl", hash = "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc"}, + {file = "charset_normalizer-3.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win32.whl", hash = "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99"}, + {file = "charset_normalizer-3.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7"}, + {file = "charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67"}, + {file = "charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win32.whl", hash = "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149"}, + {file = "charset_normalizer-3.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win32.whl", hash = "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613"}, + {file = "charset_normalizer-3.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win32.whl", hash = "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2"}, + {file = "charset_normalizer-3.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca"}, + {file = "charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079"}, + {file = "charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e"}, ] [[package]] @@ -690,33 +702,37 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.5" +version = "1.8.11" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"}, - {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"}, - {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"}, - {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"}, - {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"}, - {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"}, - {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"}, - {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"}, - {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, - {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, - {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"}, - {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"}, - {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"}, - {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"}, - {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"}, - {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"}, - {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"}, - {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"}, - {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"}, - {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"}, - {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"}, - {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"}, + {file = "debugpy-1.8.11-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:2b26fefc4e31ff85593d68b9022e35e8925714a10ab4858fb1b577a8a48cb8cd"}, + {file = "debugpy-1.8.11-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61bc8b3b265e6949855300e84dc93d02d7a3a637f2aec6d382afd4ceb9120c9f"}, + {file = "debugpy-1.8.11-cp310-cp310-win32.whl", hash = "sha256:c928bbf47f65288574b78518449edaa46c82572d340e2750889bbf8cd92f3737"}, + {file = "debugpy-1.8.11-cp310-cp310-win_amd64.whl", hash = "sha256:8da1db4ca4f22583e834dcabdc7832e56fe16275253ee53ba66627b86e304da1"}, + {file = "debugpy-1.8.11-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:85de8474ad53ad546ff1c7c7c89230db215b9b8a02754d41cb5a76f70d0be296"}, + {file = "debugpy-1.8.11-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ffc382e4afa4aee367bf413f55ed17bd91b191dcaf979890af239dda435f2a1"}, + {file = "debugpy-1.8.11-cp311-cp311-win32.whl", hash = "sha256:40499a9979c55f72f4eb2fc38695419546b62594f8af194b879d2a18439c97a9"}, + {file = "debugpy-1.8.11-cp311-cp311-win_amd64.whl", hash = "sha256:987bce16e86efa86f747d5151c54e91b3c1e36acc03ce1ddb50f9d09d16ded0e"}, + {file = "debugpy-1.8.11-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:84e511a7545d11683d32cdb8f809ef63fc17ea2a00455cc62d0a4dbb4ed1c308"}, + {file = "debugpy-1.8.11-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce291a5aca4985d82875d6779f61375e959208cdf09fcec40001e65fb0a54768"}, + {file = "debugpy-1.8.11-cp312-cp312-win32.whl", hash = "sha256:28e45b3f827d3bf2592f3cf7ae63282e859f3259db44ed2b129093ca0ac7940b"}, + {file = "debugpy-1.8.11-cp312-cp312-win_amd64.whl", hash = "sha256:44b1b8e6253bceada11f714acf4309ffb98bfa9ac55e4fce14f9e5d4484287a1"}, + {file = "debugpy-1.8.11-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:8988f7163e4381b0da7696f37eec7aca19deb02e500245df68a7159739bbd0d3"}, + {file = "debugpy-1.8.11-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c1f6a173d1140e557347419767d2b14ac1c9cd847e0b4c5444c7f3144697e4e"}, + {file = "debugpy-1.8.11-cp313-cp313-win32.whl", hash = "sha256:bb3b15e25891f38da3ca0740271e63ab9db61f41d4d8541745cfc1824252cb28"}, + {file = "debugpy-1.8.11-cp313-cp313-win_amd64.whl", hash = "sha256:d8768edcbeb34da9e11bcb8b5c2e0958d25218df7a6e56adf415ef262cd7b6d1"}, + {file = "debugpy-1.8.11-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:ad7efe588c8f5cf940f40c3de0cd683cc5b76819446abaa50dc0829a30c094db"}, + {file = "debugpy-1.8.11-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:189058d03a40103a57144752652b3ab08ff02b7595d0ce1f651b9acc3a3a35a0"}, + {file = "debugpy-1.8.11-cp38-cp38-win32.whl", hash = "sha256:32db46ba45849daed7ccf3f2e26f7a386867b077f39b2a974bb5c4c2c3b0a280"}, + {file = "debugpy-1.8.11-cp38-cp38-win_amd64.whl", hash = "sha256:116bf8342062246ca749013df4f6ea106f23bc159305843491f64672a55af2e5"}, + {file = "debugpy-1.8.11-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:654130ca6ad5de73d978057eaf9e582244ff72d4574b3e106fb8d3d2a0d32458"}, + {file = "debugpy-1.8.11-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23dc34c5e03b0212fa3c49a874df2b8b1b8fda95160bd79c01eb3ab51ea8d851"}, + {file = "debugpy-1.8.11-cp39-cp39-win32.whl", hash = "sha256:52d8a3166c9f2815bfae05f386114b0b2d274456980d41f320299a8d9a5615a7"}, + {file = "debugpy-1.8.11-cp39-cp39-win_amd64.whl", hash = "sha256:52c3cf9ecda273a19cc092961ee34eb9ba8687d67ba34cc7b79a521c1c64c4c0"}, + {file = "debugpy-1.8.11-py2.py3-none-any.whl", hash = "sha256:0e22f846f4211383e6a416d04b4c13ed174d24cc5d43f5fd52e7821d0ebc8920"}, + {file = "debugpy-1.8.11.tar.gz", hash = "sha256:6ad2688b69235c43b020e04fecccdf6a96c8943ca9c2fb340b8adc103c655e57"}, ] [[package]] @@ -764,13 +780,13 @@ files = [ [[package]] name = "dill" -version = "0.3.8" +version = "0.3.9" description = "serialize all of Python" optional = false python-versions = ">=3.8" files = [ - {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, - {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, + {file = "dill-0.3.9-py3-none-any.whl", hash = "sha256:468dff3b89520b474c0397703366b7b95eebe6303f108adf9b19da1f702be87a"}, + {file = "dill-0.3.9.tar.gz", hash = "sha256:81aa267dddf68cbfe8029c42ca9ec6a4ab3b22371d1c450abc54422577b4512c"}, ] [package.extras] @@ -833,13 +849,13 @@ text-unidecode = "1.3" [[package]] name = "fastjsonschema" -version = "2.20.0" +version = "2.21.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, - {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, + {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, + {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, ] [package.extras] @@ -847,53 +863,61 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "fonttools" -version = "4.53.1" +version = "4.55.3" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, - {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, - {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, - {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, - {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, - {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, - {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, - {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, - {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, - {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, - {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, - {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, - {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, - {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, - {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, - {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, - {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, - {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, - {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, - {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, - {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, - {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, - {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, - {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, - {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, - {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, - {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, - {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, + {file = "fonttools-4.55.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1dcc07934a2165ccdc3a5a608db56fb3c24b609658a5b340aee4ecf3ba679dc0"}, + {file = "fonttools-4.55.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f7d66c15ba875432a2d2fb419523f5d3d347f91f48f57b8b08a2dfc3c39b8a3f"}, + {file = "fonttools-4.55.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27e4ae3592e62eba83cd2c4ccd9462dcfa603ff78e09110680a5444c6925d841"}, + {file = "fonttools-4.55.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62d65a3022c35e404d19ca14f291c89cc5890032ff04f6c17af0bd1927299674"}, + {file = "fonttools-4.55.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d342e88764fb201286d185093781bf6628bbe380a913c24adf772d901baa8276"}, + {file = "fonttools-4.55.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:dd68c87a2bfe37c5b33bcda0fba39b65a353876d3b9006fde3adae31f97b3ef5"}, + {file = "fonttools-4.55.3-cp310-cp310-win32.whl", hash = "sha256:1bc7ad24ff98846282eef1cbeac05d013c2154f977a79886bb943015d2b1b261"}, + {file = "fonttools-4.55.3-cp310-cp310-win_amd64.whl", hash = "sha256:b54baf65c52952db65df39fcd4820668d0ef4766c0ccdf32879b77f7c804d5c5"}, + {file = "fonttools-4.55.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c4491699bad88efe95772543cd49870cf756b019ad56294f6498982408ab03e"}, + {file = "fonttools-4.55.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5323a22eabddf4b24f66d26894f1229261021dacd9d29e89f7872dd8c63f0b8b"}, + {file = "fonttools-4.55.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5480673f599ad410695ca2ddef2dfefe9df779a9a5cda89503881e503c9c7d90"}, + {file = "fonttools-4.55.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da9da6d65cd7aa6b0f806556f4985bcbf603bf0c5c590e61b43aa3e5a0f822d0"}, + {file = "fonttools-4.55.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e894b5bd60d9f473bed7a8f506515549cc194de08064d829464088d23097331b"}, + {file = "fonttools-4.55.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aee3b57643827e237ff6ec6d28d9ff9766bd8b21e08cd13bff479e13d4b14765"}, + {file = "fonttools-4.55.3-cp311-cp311-win32.whl", hash = "sha256:eb6ca911c4c17eb51853143624d8dc87cdcdf12a711fc38bf5bd21521e79715f"}, + {file = "fonttools-4.55.3-cp311-cp311-win_amd64.whl", hash = "sha256:6314bf82c54c53c71805318fcf6786d986461622dd926d92a465199ff54b1b72"}, + {file = "fonttools-4.55.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9e736f60f4911061235603a6119e72053073a12c6d7904011df2d8fad2c0e35"}, + {file = "fonttools-4.55.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a8aa2c5e5b8b3bcb2e4538d929f6589a5c6bdb84fd16e2ed92649fb5454f11c"}, + {file = "fonttools-4.55.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07f8288aacf0a38d174445fc78377a97fb0b83cfe352a90c9d9c1400571963c7"}, + {file = "fonttools-4.55.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8d5e8916c0970fbc0f6f1bece0063363bb5857a7f170121a4493e31c3db3314"}, + {file = "fonttools-4.55.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ae3b6600565b2d80b7c05acb8e24d2b26ac407b27a3f2e078229721ba5698427"}, + {file = "fonttools-4.55.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:54153c49913f45065c8d9e6d0c101396725c5621c8aee744719300f79771d75a"}, + {file = "fonttools-4.55.3-cp312-cp312-win32.whl", hash = "sha256:827e95fdbbd3e51f8b459af5ea10ecb4e30af50221ca103bea68218e9615de07"}, + {file = "fonttools-4.55.3-cp312-cp312-win_amd64.whl", hash = "sha256:e6e8766eeeb2de759e862004aa11a9ea3d6f6d5ec710551a88b476192b64fd54"}, + {file = "fonttools-4.55.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a430178ad3e650e695167cb53242dae3477b35c95bef6525b074d87493c4bf29"}, + {file = "fonttools-4.55.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:529cef2ce91dc44f8e407cc567fae6e49a1786f2fefefa73a294704c415322a4"}, + {file = "fonttools-4.55.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e75f12c82127486fac2d8bfbf5bf058202f54bf4f158d367e41647b972342ca"}, + {file = "fonttools-4.55.3-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:859c358ebf41db18fb72342d3080bce67c02b39e86b9fbcf1610cca14984841b"}, + {file = "fonttools-4.55.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:546565028e244a701f73df6d8dd6be489d01617863ec0c6a42fa25bf45d43048"}, + {file = "fonttools-4.55.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:aca318b77f23523309eec4475d1fbbb00a6b133eb766a8bdc401faba91261abe"}, + {file = "fonttools-4.55.3-cp313-cp313-win32.whl", hash = "sha256:8c5ec45428edaa7022f1c949a632a6f298edc7b481312fc7dc258921e9399628"}, + {file = "fonttools-4.55.3-cp313-cp313-win_amd64.whl", hash = "sha256:11e5de1ee0d95af4ae23c1a138b184b7f06e0b6abacabf1d0db41c90b03d834b"}, + {file = "fonttools-4.55.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:caf8230f3e10f8f5d7593eb6d252a37caf58c480b19a17e250a63dad63834cf3"}, + {file = "fonttools-4.55.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b586ab5b15b6097f2fb71cafa3c98edfd0dba1ad8027229e7b1e204a58b0e09d"}, + {file = "fonttools-4.55.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8c2794ded89399cc2169c4d0bf7941247b8d5932b2659e09834adfbb01589aa"}, + {file = "fonttools-4.55.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf4fe7c124aa3f4e4c1940880156e13f2f4d98170d35c749e6b4f119a872551e"}, + {file = "fonttools-4.55.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:86721fbc389ef5cc1e2f477019e5069e8e4421e8d9576e9c26f840dbb04678de"}, + {file = "fonttools-4.55.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:89bdc5d88bdeec1b15af790810e267e8332d92561dce4f0748c2b95c9bdf3926"}, + {file = "fonttools-4.55.3-cp38-cp38-win32.whl", hash = "sha256:bc5dbb4685e51235ef487e4bd501ddfc49be5aede5e40f4cefcccabc6e60fb4b"}, + {file = "fonttools-4.55.3-cp38-cp38-win_amd64.whl", hash = "sha256:cd70de1a52a8ee2d1877b6293af8a2484ac82514f10b1c67c1c5762d38073e56"}, + {file = "fonttools-4.55.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bdcc9f04b36c6c20978d3f060e5323a43f6222accc4e7fcbef3f428e216d96af"}, + {file = "fonttools-4.55.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c3ca99e0d460eff46e033cd3992a969658c3169ffcd533e0a39c63a38beb6831"}, + {file = "fonttools-4.55.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22f38464daa6cdb7b6aebd14ab06609328fe1e9705bb0fcc7d1e69de7109ee02"}, + {file = "fonttools-4.55.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed63959d00b61959b035c7d47f9313c2c1ece090ff63afea702fe86de00dbed4"}, + {file = "fonttools-4.55.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5e8d657cd7326eeaba27de2740e847c6b39dde2f8d7cd7cc56f6aad404ddf0bd"}, + {file = "fonttools-4.55.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fb594b5a99943042c702c550d5494bdd7577f6ef19b0bc73877c948a63184a32"}, + {file = "fonttools-4.55.3-cp39-cp39-win32.whl", hash = "sha256:dc5294a3d5c84226e3dbba1b6f61d7ad813a8c0238fceea4e09aa04848c3d851"}, + {file = "fonttools-4.55.3-cp39-cp39-win_amd64.whl", hash = "sha256:aedbeb1db64496d098e6be92b2e63b5fac4e53b1b92032dfc6988e1ea9134a4d"}, + {file = "fonttools-4.55.3-py3-none-any.whl", hash = "sha256:f412604ccbeee81b091b420272841e5ec5ef68967a9790e80bffd0e30b8e2977"}, + {file = "fonttools-4.55.3.tar.gz", hash = "sha256:3983313c2a04d6cc1fe9251f8fc647754cf49a61dac6cb1e7249ae67afaafc45"}, ] [package.extras] @@ -967,13 +991,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.5" +version = "1.0.7" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, - {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, + {file = "httpcore-1.0.7-py3-none-any.whl", hash = "sha256:a3fff8f43dc260d5bd363d9f9cf1830fa3a458b332856f34282de498ed420edd"}, + {file = "httpcore-1.0.7.tar.gz", hash = "sha256:8551cb62a169ec7162ac7be8d4817d561f60e08eaa485234898414bb5a8a0b4c"}, ] [package.dependencies] @@ -984,17 +1008,17 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.26.0)"] +trio = ["trio (>=0.22.0,<1.0)"] [[package]] name = "httpx" -version = "0.27.2" +version = "0.28.1" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.27.2-py3-none-any.whl", hash = "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0"}, - {file = "httpx-0.27.2.tar.gz", hash = "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2"}, + {file = "httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad"}, + {file = "httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc"}, ] [package.dependencies] @@ -1002,7 +1026,6 @@ anyio = "*" certifi = "*" httpcore = "==1.*" idna = "*" -sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] @@ -1013,15 +1036,18 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "idna" -version = "3.8" +version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" files = [ - {file = "idna-3.8-py3-none-any.whl", hash = "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac"}, - {file = "idna-3.8.tar.gz", hash = "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603"}, + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, ] +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + [[package]] name = "imagesize" version = "1.4.1" @@ -1212,22 +1238,22 @@ colors = ["colorama (>=0.4.6)"] [[package]] name = "jedi" -version = "0.19.1" +version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] [package.dependencies] -parso = ">=0.8.3,<0.9.0" +parso = ">=0.8.4,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jinja2" @@ -1259,15 +1285,18 @@ files = [ [[package]] name = "json5" -version = "0.9.25" +version = "0.10.0" description = "A Python implementation of the JSON5 data format." optional = false -python-versions = ">=3.8" +python-versions = ">=3.8.0" files = [ - {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, - {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, + {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, + {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, ] +[package.extras] +dev = ["build (==1.2.2.post1)", "coverage (==7.5.3)", "mypy (==1.13.0)", "pip (==24.3.1)", "pylint (==3.2.3)", "ruff (==0.7.3)", "twine (==5.1.1)", "uv (==0.5.1)"] + [[package]] name = "jsonpointer" version = "3.0.0" @@ -1346,13 +1375,13 @@ notebook = "*" [[package]] name = "jupyter-client" -version = "8.6.2" +version = "8.6.3" description = "Jupyter protocol implementation and client libraries" optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, - {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, + {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, + {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, ] [package.dependencies] @@ -1508,13 +1537,13 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.2.5" +version = "4.3.3" description = "JupyterLab computational environment" optional = false python-versions = ">=3.8" files = [ - {file = "jupyterlab-4.2.5-py3-none-any.whl", hash = "sha256:73b6e0775d41a9fee7ee756c80f58a6bed4040869ccc21411dc559818874d321"}, - {file = "jupyterlab-4.2.5.tar.gz", hash = "sha256:ae7f3a1b8cb88b4f55009ce79fa7c06f99d70cd63601ee4aa91815d054f46f75"}, + {file = "jupyterlab-4.3.3-py3-none-any.whl", hash = "sha256:32a8fd30677e734ffcc3916a4758b9dab21b02015b668c60eb36f84357b7d4b1"}, + {file = "jupyterlab-4.3.3.tar.gz", hash = "sha256:76fa39e548fdac94dc1204af5956c556f54c785f70ee26aa47ea08eda4d5bbcd"}, ] [package.dependencies] @@ -1530,15 +1559,15 @@ jupyter-server = ">=2.4.0,<3" jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2" packaging = "*" -setuptools = ">=40.1.0" +setuptools = ">=40.8.0" tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.3.5)"] -docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.3.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.2)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.1.post2)", "matplotlib (==3.8.3)", "nbconvert (>=7.0.0)", "pandas (==2.2.1)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.6.9)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.1.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.4.1)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.2.post3)", "matplotlib (==3.9.2)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.14.1)", "vega-datasets (==0.9.0)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] @@ -1713,6 +1742,27 @@ files = [ {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, ] +[[package]] +name = "lightning-utilities" +version = "0.11.9" +description = "Lightning toolbox for across the our ecosystem." +optional = false +python-versions = ">=3.8" +files = [ + {file = "lightning_utilities-0.11.9-py3-none-any.whl", hash = "sha256:ac6d4e9e28faf3ff4be997876750fee10dc604753dbc429bf3848a95c5d7e0d2"}, + {file = "lightning_utilities-0.11.9.tar.gz", hash = "sha256:f5052b81344cc2684aa9afd74b7ce8819a8f49a858184ec04548a5a109dfd053"}, +] + +[package.dependencies] +packaging = ">=17.1" +setuptools = "*" +typing-extensions = "*" + +[package.extras] +cli = ["fire"] +docs = ["requests (>=2.0.0)"] +typing = ["mypy (>=1.0.0)", "types-setuptools"] + [[package]] name = "llvmlite" version = "0.41.1" @@ -1921,13 +1971,13 @@ files = [ [[package]] name = "nbclient" -version = "0.10.0" +version = "0.10.1" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, - {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, + {file = "nbclient-0.10.1-py3-none-any.whl", hash = "sha256:949019b9240d66897e442888cfb618f69ef23dc71c01cb5fced8499c2cfc084d"}, + {file = "nbclient-0.10.1.tar.gz", hash = "sha256:3e93e348ab27e712acd46fccd809139e356eb9a31aab641d1a7991a6eb4e6f68"}, ] [package.dependencies] @@ -1938,7 +1988,7 @@ traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] -docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] @@ -2013,18 +2063,18 @@ files = [ [[package]] name = "notebook" -version = "7.2.2" +version = "7.3.1" description = "Jupyter Notebook - A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.8" files = [ - {file = "notebook-7.2.2-py3-none-any.whl", hash = "sha256:c89264081f671bc02eec0ed470a627ed791b9156cad9285226b31611d3e9fe1c"}, - {file = "notebook-7.2.2.tar.gz", hash = "sha256:2ef07d4220421623ad3fe88118d687bc0450055570cdd160814a59cf3a1c516e"}, + {file = "notebook-7.3.1-py3-none-any.whl", hash = "sha256:212e1486b2230fe22279043f33c7db5cf9a01d29feb063a85cb139747b7c9483"}, + {file = "notebook-7.3.1.tar.gz", hash = "sha256:84381c2a82d867517fd25b86e986dae1fe113a70b98f03edff9b94e499fec8fa"}, ] [package.dependencies] jupyter-server = ">=2.4.0,<3" -jupyterlab = ">=4.2.0,<4.3" +jupyterlab = ">=4.3.2,<4.4" jupyterlab-server = ">=2.27.1,<3" notebook-shim = ">=0.2,<0.3" tornado = ">=6.2.0" @@ -2123,67 +2173,6 @@ files = [ {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, ] -[[package]] -name = "nvidia-cublas-cu11" -version = "11.10.3.66" -description = "CUBLAS native runtime libraries" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-manylinux1_x86_64.whl", hash = "sha256:d32e4d75f94ddfb93ea0a5dda08389bcc65d8916a25cb9f37ac89edaeed3bded"}, - {file = "nvidia_cublas_cu11-11.10.3.66-py3-none-win_amd64.whl", hash = "sha256:8ac17ba6ade3ed56ab898a036f9ae0756f1e81052a317bf98f8c6d18dc3ae49e"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cuda-nvrtc-cu11" -version = "11.7.99" -description = "NVRTC native runtime libraries" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:9f1562822ea264b7e34ed5930567e89242d266448e936b85bc97a3370feabb03"}, - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:f7d9610d9b7c331fa0da2d1b2858a4a8315e6d49765091d28711c8946e7425e7"}, - {file = "nvidia_cuda_nvrtc_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:f2effeb1309bdd1b3854fc9b17eaf997808f8b25968ce0c7070945c4265d64a3"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cuda-runtime-cu11" -version = "11.7.99" -description = "CUDA Runtime native Libraries" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-manylinux1_x86_64.whl", hash = "sha256:cc768314ae58d2641f07eac350f40f99dcb35719c4faff4bc458a7cd2b119e31"}, - {file = "nvidia_cuda_runtime_cu11-11.7.99-py3-none-win_amd64.whl", hash = "sha256:bc77fa59a7679310df9d5c70ab13c4e34c64ae2124dd1efd7e5474b71be125c7"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - -[[package]] -name = "nvidia-cudnn-cu11" -version = "8.5.0.96" -description = "cuDNN runtime libraries" -optional = false -python-versions = ">=3" -files = [ - {file = "nvidia_cudnn_cu11-8.5.0.96-2-py3-none-manylinux1_x86_64.whl", hash = "sha256:402f40adfc6f418f9dae9ab402e773cfed9beae52333f6d86ae3107a1b9527e7"}, - {file = "nvidia_cudnn_cu11-8.5.0.96-py3-none-manylinux1_x86_64.whl", hash = "sha256:71f8111eb830879ff2836db3cccf03bbd735df9b0d17cd93761732ac50a8a108"}, -] - -[package.dependencies] -setuptools = "*" -wheel = "*" - [[package]] name = "overrides" version = "7.7.0" @@ -2414,13 +2403,13 @@ files = [ [[package]] name = "platformdirs" -version = "4.3.2" +version = "4.3.6" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.3.2-py3-none-any.whl", hash = "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617"}, - {file = "platformdirs-4.3.2.tar.gz", hash = "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c"}, + {file = "platformdirs-4.3.6-py3-none-any.whl", hash = "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"}, + {file = "platformdirs-4.3.6.tar.gz", hash = "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907"}, ] [package.extras] @@ -2445,13 +2434,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prometheus-client" -version = "0.20.0" +version = "0.21.1" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, - {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, + {file = "prometheus_client-0.21.1-py3-none-any.whl", hash = "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301"}, + {file = "prometheus_client-0.21.1.tar.gz", hash = "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb"}, ] [package.extras] @@ -2459,13 +2448,13 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.47" +version = "3.0.48" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, - {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, + {file = "prompt_toolkit-3.0.48-py3-none-any.whl", hash = "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e"}, + {file = "prompt_toolkit-3.0.48.tar.gz", hash = "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90"}, ] [package.dependencies] @@ -2664,12 +2653,12 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyspark" -version = "3.5.2" +version = "3.5.3" description = "Apache Spark Python API" optional = false python-versions = ">=3.8" files = [ - {file = "pyspark-3.5.2.tar.gz", hash = "sha256:bbb36eba09fa24e86e0923d7e7a986041b90c714e11c6aa976f9791fe9edde5e"}, + {file = "pyspark-3.5.3.tar.gz", hash = "sha256:68b7cc0c0c570a7d8644f49f40d2da8709b01d30c9126cc8cf93b4f84f3d9747"}, ] [package.dependencies] @@ -2684,13 +2673,13 @@ sql = ["numpy (>=1.15,<2)", "pandas (>=1.0.5)", "pyarrow (>=4.0.0)"] [[package]] name = "pytest" -version = "8.3.3" +version = "8.3.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.3-py3-none-any.whl", hash = "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2"}, - {file = "pytest-8.3.3.tar.gz", hash = "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181"}, + {file = "pytest-8.3.4-py3-none-any.whl", hash = "sha256:50e16d954148559c9a74109af1eaf0c945ba2d8f30f0a3d3335edde19788b6f6"}, + {file = "pytest-8.3.4.tar.gz", hash = "sha256:965370d062bce11e73868e0335abac31b4d3de0e82f4007408d242b4f8610761"}, ] [package.dependencies] @@ -2738,15 +2727,21 @@ six = ">=1.5" [[package]] name = "python-json-logger" -version = "2.0.7" -description = "A python library adding a json log formatter" +version = "3.2.1" +description = "JSON Log Formatter for the Python Logging Package" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, - {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, + {file = "python_json_logger-3.2.1-py3-none-any.whl", hash = "sha256:cdc17047eb5374bd311e748b42f99d71223f3b0e186f4206cc5d52aefe85b090"}, + {file = "python_json_logger-3.2.1.tar.gz", hash = "sha256:8eb0554ea17cb75b05d2848bc14fb02fbdbd9d6972120781b974380bfa162008"}, ] +[package.dependencies] +typing_extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +dev = ["backports.zoneinfo", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec", "msgspec-python313-pre", "mypy", "orjson", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] + [[package]] name = "pyts" version = "0.12.0" @@ -2782,40 +2777,44 @@ files = [ [[package]] name = "pywin32" -version = "306" +version = "308" description = "Python for Window Extensions" optional = false python-versions = "*" files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, + {file = "pywin32-308-cp310-cp310-win32.whl", hash = "sha256:796ff4426437896550d2981b9c2ac0ffd75238ad9ea2d3bfa67a1abd546d262e"}, + {file = "pywin32-308-cp310-cp310-win_amd64.whl", hash = "sha256:4fc888c59b3c0bef905ce7eb7e2106a07712015ea1c8234b703a088d46110e8e"}, + {file = "pywin32-308-cp310-cp310-win_arm64.whl", hash = "sha256:a5ab5381813b40f264fa3495b98af850098f814a25a63589a8e9eb12560f450c"}, + {file = "pywin32-308-cp311-cp311-win32.whl", hash = "sha256:5d8c8015b24a7d6855b1550d8e660d8daa09983c80e5daf89a273e5c6fb5095a"}, + {file = "pywin32-308-cp311-cp311-win_amd64.whl", hash = "sha256:575621b90f0dc2695fec346b2d6302faebd4f0f45c05ea29404cefe35d89442b"}, + {file = "pywin32-308-cp311-cp311-win_arm64.whl", hash = "sha256:100a5442b7332070983c4cd03f2e906a5648a5104b8a7f50175f7906efd16bb6"}, + {file = "pywin32-308-cp312-cp312-win32.whl", hash = "sha256:587f3e19696f4bf96fde9d8a57cec74a57021ad5f204c9e627e15c33ff568897"}, + {file = "pywin32-308-cp312-cp312-win_amd64.whl", hash = "sha256:00b3e11ef09ede56c6a43c71f2d31857cf7c54b0ab6e78ac659497abd2834f47"}, + {file = "pywin32-308-cp312-cp312-win_arm64.whl", hash = "sha256:9b4de86c8d909aed15b7011182c8cab38c8850de36e6afb1f0db22b8959e3091"}, + {file = "pywin32-308-cp313-cp313-win32.whl", hash = "sha256:1c44539a37a5b7b21d02ab34e6a4d314e0788f1690d65b48e9b0b89f31abbbed"}, + {file = "pywin32-308-cp313-cp313-win_amd64.whl", hash = "sha256:fd380990e792eaf6827fcb7e187b2b4b1cede0585e3d0c9e84201ec27b9905e4"}, + {file = "pywin32-308-cp313-cp313-win_arm64.whl", hash = "sha256:ef313c46d4c18dfb82a2431e3051ac8f112ccee1a34f29c263c583c568db63cd"}, + {file = "pywin32-308-cp37-cp37m-win32.whl", hash = "sha256:1f696ab352a2ddd63bd07430080dd598e6369152ea13a25ebcdd2f503a38f1ff"}, + {file = "pywin32-308-cp37-cp37m-win_amd64.whl", hash = "sha256:13dcb914ed4347019fbec6697a01a0aec61019c1046c2b905410d197856326a6"}, + {file = "pywin32-308-cp38-cp38-win32.whl", hash = "sha256:5794e764ebcabf4ff08c555b31bd348c9025929371763b2183172ff4708152f0"}, + {file = "pywin32-308-cp38-cp38-win_amd64.whl", hash = "sha256:3b92622e29d651c6b783e368ba7d6722b1634b8e70bd376fd7610fe1992e19de"}, + {file = "pywin32-308-cp39-cp39-win32.whl", hash = "sha256:7873ca4dc60ab3287919881a7d4f88baee4a6e639aa6962de25a98ba6b193341"}, + {file = "pywin32-308-cp39-cp39-win_amd64.whl", hash = "sha256:71b3322d949b4cc20776436a9c9ba0eeedcbc9c650daa536df63f0ff111bb920"}, ] [[package]] name = "pywinpty" -version = "2.0.13" +version = "2.0.14" description = "Pseudo terminal support for Windows from Python." optional = false python-versions = ">=3.8" files = [ - {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, - {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, - {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, - {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, - {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, - {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, + {file = "pywinpty-2.0.14-cp310-none-win_amd64.whl", hash = "sha256:0b149c2918c7974f575ba79f5a4aad58bd859a52fa9eb1296cc22aa412aa411f"}, + {file = "pywinpty-2.0.14-cp311-none-win_amd64.whl", hash = "sha256:cf2a43ac7065b3e0dc8510f8c1f13a75fb8fde805efa3b8cff7599a1ef497bc7"}, + {file = "pywinpty-2.0.14-cp312-none-win_amd64.whl", hash = "sha256:55dad362ef3e9408ade68fd173e4f9032b3ce08f68cfe7eacb2c263ea1179737"}, + {file = "pywinpty-2.0.14-cp313-none-win_amd64.whl", hash = "sha256:074fb988a56ec79ca90ed03a896d40707131897cefb8f76f926e3834227f2819"}, + {file = "pywinpty-2.0.14-cp39-none-win_amd64.whl", hash = "sha256:5725fd56f73c0531ec218663bd8c8ff5acc43c78962fab28564871b5fce053fd"}, + {file = "pywinpty-2.0.14.tar.gz", hash = "sha256:18bd9529e4a5daf2d9719aa17788ba6013e594ae94c5a0c27e83df3278b0660e"}, ] [[package]] @@ -3064,114 +3063,114 @@ files = [ [[package]] name = "rpds-py" -version = "0.20.0" +version = "0.20.1" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.8" files = [ - {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, - {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, - {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, - {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, - {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, - {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, - {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, - {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, - {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, - {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, - {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, - {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, - {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, - {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, - {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, - {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, - {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, - {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, - {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, - {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, - {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, - {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, - {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, - {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, - {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, - {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, - {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, - {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, - {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, - {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, - {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, - {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, - {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, - {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, - {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, - {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, - {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, - {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, - {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, - {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, - {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, - {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, - {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, - {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, - {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, + {file = "rpds_py-0.20.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a649dfd735fff086e8a9d0503a9f0c7d01b7912a333c7ae77e1515c08c146dad"}, + {file = "rpds_py-0.20.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f16bc1334853e91ddaaa1217045dd7be166170beec337576818461268a3de67f"}, + {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14511a539afee6f9ab492b543060c7491c99924314977a55c98bfa2ee29ce78c"}, + {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ccb8ac2d3c71cda472b75af42818981bdacf48d2e21c36331b50b4f16930163"}, + {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c142b88039b92e7e0cb2552e8967077e3179b22359e945574f5e2764c3953dcf"}, + {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f19169781dddae7478a32301b499b2858bc52fc45a112955e798ee307e294977"}, + {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13c56de6518e14b9bf6edde23c4c39dac5b48dcf04160ea7bce8fca8397cdf86"}, + {file = "rpds_py-0.20.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:925d176a549f4832c6f69fa6026071294ab5910e82a0fe6c6228fce17b0706bd"}, + {file = "rpds_py-0.20.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:78f0b6877bfce7a3d1ff150391354a410c55d3cdce386f862926a4958ad5ab7e"}, + {file = "rpds_py-0.20.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3dd645e2b0dcb0fd05bf58e2e54c13875847687d0b71941ad2e757e5d89d4356"}, + {file = "rpds_py-0.20.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4f676e21db2f8c72ff0936f895271e7a700aa1f8d31b40e4e43442ba94973899"}, + {file = "rpds_py-0.20.1-cp310-none-win32.whl", hash = "sha256:648386ddd1e19b4a6abab69139b002bc49ebf065b596119f8f37c38e9ecee8ff"}, + {file = "rpds_py-0.20.1-cp310-none-win_amd64.whl", hash = "sha256:d9ecb51120de61e4604650666d1f2b68444d46ae18fd492245a08f53ad2b7711"}, + {file = "rpds_py-0.20.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:762703bdd2b30983c1d9e62b4c88664df4a8a4d5ec0e9253b0231171f18f6d75"}, + {file = "rpds_py-0.20.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0b581f47257a9fce535c4567782a8976002d6b8afa2c39ff616edf87cbeff712"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:842c19a6ce894493563c3bd00d81d5100e8e57d70209e84d5491940fdb8b9e3a"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:42cbde7789f5c0bcd6816cb29808e36c01b960fb5d29f11e052215aa85497c93"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c8e9340ce5a52f95fa7d3b552b35c7e8f3874d74a03a8a69279fd5fca5dc751"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ba6f89cac95c0900d932c9efb7f0fb6ca47f6687feec41abcb1bd5e2bd45535"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a916087371afd9648e1962e67403c53f9c49ca47b9680adbeef79da3a7811b0"}, + {file = "rpds_py-0.20.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:200a23239781f46149e6a415f1e870c5ef1e712939fe8fa63035cd053ac2638e"}, + {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:58b1d5dd591973d426cbb2da5e27ba0339209832b2f3315928c9790e13f159e8"}, + {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6b73c67850ca7cae0f6c56f71e356d7e9fa25958d3e18a64927c2d930859b8e4"}, + {file = "rpds_py-0.20.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d8761c3c891cc51e90bc9926d6d2f59b27beaf86c74622c8979380a29cc23ac3"}, + {file = "rpds_py-0.20.1-cp311-none-win32.whl", hash = "sha256:cd945871335a639275eee904caef90041568ce3b42f402c6959b460d25ae8732"}, + {file = "rpds_py-0.20.1-cp311-none-win_amd64.whl", hash = "sha256:7e21b7031e17c6b0e445f42ccc77f79a97e2687023c5746bfb7a9e45e0921b84"}, + {file = "rpds_py-0.20.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:36785be22066966a27348444b40389f8444671630063edfb1a2eb04318721e17"}, + {file = "rpds_py-0.20.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:142c0a5124d9bd0e2976089484af5c74f47bd3298f2ed651ef54ea728d2ea42c"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbddc10776ca7ebf2a299c41a4dde8ea0d8e3547bfd731cb87af2e8f5bf8962d"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15a842bb369e00295392e7ce192de9dcbf136954614124a667f9f9f17d6a216f"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be5ef2f1fc586a7372bfc355986226484e06d1dc4f9402539872c8bb99e34b01"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbcf360c9e3399b056a238523146ea77eeb2a596ce263b8814c900263e46031a"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecd27a66740ffd621d20b9a2f2b5ee4129a56e27bfb9458a3bcc2e45794c96cb"}, + {file = "rpds_py-0.20.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0b937b2a1988f184a3e9e577adaa8aede21ec0b38320d6009e02bd026db04fa"}, + {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6889469bfdc1eddf489729b471303739bf04555bb151fe8875931f8564309afc"}, + {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:19b73643c802f4eaf13d97f7855d0fb527fbc92ab7013c4ad0e13a6ae0ed23bd"}, + {file = "rpds_py-0.20.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3c6afcf2338e7f374e8edc765c79fbcb4061d02b15dd5f8f314a4af2bdc7feb5"}, + {file = "rpds_py-0.20.1-cp312-none-win32.whl", hash = "sha256:dc73505153798c6f74854aba69cc75953888cf9866465196889c7cdd351e720c"}, + {file = "rpds_py-0.20.1-cp312-none-win_amd64.whl", hash = "sha256:8bbe951244a838a51289ee53a6bae3a07f26d4e179b96fc7ddd3301caf0518eb"}, + {file = "rpds_py-0.20.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6ca91093a4a8da4afae7fe6a222c3b53ee4eef433ebfee4d54978a103435159e"}, + {file = "rpds_py-0.20.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b9c2fe36d1f758b28121bef29ed1dee9b7a2453e997528e7d1ac99b94892527c"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f009c69bc8c53db5dfab72ac760895dc1f2bc1b62ab7408b253c8d1ec52459fc"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6740a3e8d43a32629bb9b009017ea5b9e713b7210ba48ac8d4cb6d99d86c8ee8"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:32b922e13d4c0080d03e7b62991ad7f5007d9cd74e239c4b16bc85ae8b70252d"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe00a9057d100e69b4ae4a094203a708d65b0f345ed546fdef86498bf5390982"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49fe9b04b6fa685bd39237d45fad89ba19e9163a1ccaa16611a812e682913496"}, + {file = "rpds_py-0.20.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aa7ac11e294304e615b43f8c441fee5d40094275ed7311f3420d805fde9b07b4"}, + {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aa97af1558a9bef4025f8f5d8c60d712e0a3b13a2fe875511defc6ee77a1ab7"}, + {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:483b29f6f7ffa6af845107d4efe2e3fa8fb2693de8657bc1849f674296ff6a5a"}, + {file = "rpds_py-0.20.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37fe0f12aebb6a0e3e17bb4cd356b1286d2d18d2e93b2d39fe647138458b4bcb"}, + {file = "rpds_py-0.20.1-cp313-none-win32.whl", hash = "sha256:a624cc00ef2158e04188df5e3016385b9353638139a06fb77057b3498f794782"}, + {file = "rpds_py-0.20.1-cp313-none-win_amd64.whl", hash = "sha256:b71b8666eeea69d6363248822078c075bac6ed135faa9216aa85f295ff009b1e"}, + {file = "rpds_py-0.20.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:5b48e790e0355865197ad0aca8cde3d8ede347831e1959e158369eb3493d2191"}, + {file = "rpds_py-0.20.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3e310838a5801795207c66c73ea903deda321e6146d6f282e85fa7e3e4854804"}, + {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249280b870e6a42c0d972339e9cc22ee98730a99cd7f2f727549af80dd5a963"}, + {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e79059d67bea28b53d255c1437b25391653263f0e69cd7dec170d778fdbca95e"}, + {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2b431c777c9653e569986ecf69ff4a5dba281cded16043d348bf9ba505486f36"}, + {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da584ff96ec95e97925174eb8237e32f626e7a1a97888cdd27ee2f1f24dd0ad8"}, + {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02a0629ec053fc013808a85178524e3cb63a61dbc35b22499870194a63578fb9"}, + {file = "rpds_py-0.20.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fbf15aff64a163db29a91ed0868af181d6f68ec1a3a7d5afcfe4501252840bad"}, + {file = "rpds_py-0.20.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:07924c1b938798797d60c6308fa8ad3b3f0201802f82e4a2c41bb3fafb44cc28"}, + {file = "rpds_py-0.20.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4a5a844f68776a7715ecb30843b453f07ac89bad393431efbf7accca3ef599c1"}, + {file = "rpds_py-0.20.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:518d2ca43c358929bf08f9079b617f1c2ca6e8848f83c1225c88caeac46e6cbc"}, + {file = "rpds_py-0.20.1-cp38-none-win32.whl", hash = "sha256:3aea7eed3e55119635a74bbeb80b35e776bafccb70d97e8ff838816c124539f1"}, + {file = "rpds_py-0.20.1-cp38-none-win_amd64.whl", hash = "sha256:7dca7081e9a0c3b6490a145593f6fe3173a94197f2cb9891183ef75e9d64c425"}, + {file = "rpds_py-0.20.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:b41b6321805c472f66990c2849e152aff7bc359eb92f781e3f606609eac877ad"}, + {file = "rpds_py-0.20.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0a90c373ea2975519b58dece25853dbcb9779b05cc46b4819cb1917e3b3215b6"}, + {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16d4477bcb9fbbd7b5b0e4a5d9b493e42026c0bf1f06f723a9353f5153e75d30"}, + {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84b8382a90539910b53a6307f7c35697bc7e6ffb25d9c1d4e998a13e842a5e83"}, + {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4888e117dd41b9d34194d9e31631af70d3d526efc363085e3089ab1a62c32ed1"}, + {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5265505b3d61a0f56618c9b941dc54dc334dc6e660f1592d112cd103d914a6db"}, + {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e75ba609dba23f2c95b776efb9dd3f0b78a76a151e96f96cc5b6b1b0004de66f"}, + {file = "rpds_py-0.20.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1791ff70bc975b098fe6ecf04356a10e9e2bd7dc21fa7351c1742fdeb9b4966f"}, + {file = "rpds_py-0.20.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d126b52e4a473d40232ec2052a8b232270ed1f8c9571aaf33f73a14cc298c24f"}, + {file = "rpds_py-0.20.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c14937af98c4cc362a1d4374806204dd51b1e12dded1ae30645c298e5a5c4cb1"}, + {file = "rpds_py-0.20.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3d089d0b88996df627693639d123c8158cff41c0651f646cd8fd292c7da90eaf"}, + {file = "rpds_py-0.20.1-cp39-none-win32.whl", hash = "sha256:653647b8838cf83b2e7e6a0364f49af96deec64d2a6578324db58380cff82aca"}, + {file = "rpds_py-0.20.1-cp39-none-win_amd64.whl", hash = "sha256:fa41a64ac5b08b292906e248549ab48b69c5428f3987b09689ab2441f267d04d"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7a07ced2b22f0cf0b55a6a510078174c31b6d8544f3bc00c2bcee52b3d613f74"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:68cb0a499f2c4a088fd2f521453e22ed3527154136a855c62e148b7883b99f9a"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa3060d885657abc549b2a0f8e1b79699290e5d83845141717c6c90c2df38311"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:95f3b65d2392e1c5cec27cff08fdc0080270d5a1a4b2ea1d51d5f4a2620ff08d"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2cc3712a4b0b76a1d45a9302dd2f53ff339614b1c29603a911318f2357b04dd2"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d4eea0761e37485c9b81400437adb11c40e13ef513375bbd6973e34100aeb06"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f5179583d7a6cdb981151dd349786cbc318bab54963a192692d945dd3f6435d"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fbb0ffc754490aff6dabbf28064be47f0f9ca0b9755976f945214965b3ace7e"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a94e52537a0e0a85429eda9e49f272ada715506d3b2431f64b8a3e34eb5f3e75"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:92b68b79c0da2a980b1c4197e56ac3dd0c8a149b4603747c4378914a68706979"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:93da1d3db08a827eda74356f9f58884adb254e59b6664f64cc04cdff2cc19b0d"}, + {file = "rpds_py-0.20.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:754bbed1a4ca48479e9d4182a561d001bbf81543876cdded6f695ec3d465846b"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ca449520e7484534a2a44faf629362cae62b660601432d04c482283c47eaebab"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:9c4cb04a16b0f199a8c9bf807269b2f63b7b5b11425e4a6bd44bd6961d28282c"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63804105143c7e24cee7db89e37cb3f3941f8e80c4379a0b355c52a52b6780"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:55cd1fa4ecfa6d9f14fbd97ac24803e6f73e897c738f771a9fe038f2f11ff07c"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f8f741b6292c86059ed175d80eefa80997125b7c478fb8769fd9ac8943a16c0"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fc212779bf8411667234b3cdd34d53de6c2b8b8b958e1e12cb473a5f367c338"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ad56edabcdb428c2e33bbf24f255fe2b43253b7d13a2cdbf05de955217313e6"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a3a1e9ee9728b2c1734f65d6a1d376c6f2f6fdcc13bb007a08cc4b1ff576dc5"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:e13de156137b7095442b288e72f33503a469aa1980ed856b43c353ac86390519"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:07f59760ef99f31422c49038964b31c4dfcfeb5d2384ebfc71058a7c9adae2d2"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:59240685e7da61fb78f65a9f07f8108e36a83317c53f7b276b4175dc44151684"}, + {file = "rpds_py-0.20.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:83cba698cfb3c2c5a7c3c6bac12fe6c6a51aae69513726be6411076185a8b24a"}, + {file = "rpds_py-0.20.1.tar.gz", hash = "sha256:e1791c4aabd117653530dccd24108fa03cc6baf21f58b950d0a73c3b3b29a350"}, ] [[package]] @@ -3331,33 +3330,33 @@ win32 = ["pywin32"] [[package]] name = "setuptools" -version = "74.1.2" +version = "75.3.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-74.1.2-py3-none-any.whl", hash = "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308"}, - {file = "setuptools-74.1.2.tar.gz", hash = "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6"}, + {file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"}, + {file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"}, ] [package.extras] check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"] -core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] cover = ["pytest-cov"] doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"] enabler = ["pytest-enabler (>=2.2)"] -test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] -type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"] +type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.12.*)", "pytest-mypy"] [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] @@ -3449,22 +3448,22 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.4.2)", "diff-cover (>=8.0.3)", [[package]] name = "sphinx-rtd-theme" -version = "2.0.0" +version = "3.0.2" description = "Read the Docs theme for Sphinx" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "sphinx_rtd_theme-2.0.0-py2.py3-none-any.whl", hash = "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586"}, - {file = "sphinx_rtd_theme-2.0.0.tar.gz", hash = "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b"}, + {file = "sphinx_rtd_theme-3.0.2-py2.py3-none-any.whl", hash = "sha256:422ccc750c3a3a311de4ae327e82affdaf59eb695ba4936538552f3b00f4ee13"}, + {file = "sphinx_rtd_theme-3.0.2.tar.gz", hash = "sha256:b7457bc25dda723b20b086a670b9953c859eab60a2a03ee8eb2bb23e176e5f85"}, ] [package.dependencies] -docutils = "<0.21" -sphinx = ">=5,<8" +docutils = ">0.18,<0.22" +sphinx = ">=6,<9" sphinxcontrib-jquery = ">=4,<5" [package.extras] -dev = ["bump2version", "sphinxcontrib-httpdomain", "transifex-client", "wheel"] +dev = ["bump2version", "transifex-client", "twine", "wheel"] [[package]] name = "sphinxcontrib-applehelp" @@ -3633,13 +3632,13 @@ files = [ [[package]] name = "tinycss2" -version = "1.3.0" +version = "1.4.0" description = "A tiny CSS parser" optional = false python-versions = ">=3.8" files = [ - {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, - {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, + {file = "tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289"}, + {file = "tinycss2-1.4.0.tar.gz", hash = "sha256:10c0972f6fc0fbee87c3edb76549357415e94548c1ae10ebccdea16fb404a9b7"}, ] [package.dependencies] @@ -3651,13 +3650,43 @@ test = ["pytest", "ruff"] [[package]] name = "tomli" -version = "2.0.1" +version = "2.2.1" description = "A lil' TOML parser" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] @@ -3673,118 +3702,124 @@ files = [ [[package]] name = "torch" -version = "1.13.1" +version = "1.9.1" description = "Tensors and Dynamic neural networks in Python with strong GPU acceleration" optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.6.2" files = [ - {file = "torch-1.13.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:fd12043868a34a8da7d490bf6db66991108b00ffbeecb034228bfcbbd4197143"}, - {file = "torch-1.13.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:d9fe785d375f2e26a5d5eba5de91f89e6a3be5d11efb497e76705fdf93fa3c2e"}, - {file = "torch-1.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:98124598cdff4c287dbf50f53fb455f0c1e3a88022b39648102957f3445e9b76"}, - {file = "torch-1.13.1-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:393a6273c832e047581063fb74335ff50b4c566217019cc6ace318cd79eb0566"}, - {file = "torch-1.13.1-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:0122806b111b949d21fa1a5f9764d1fd2fcc4a47cb7f8ff914204fd4fc752ed5"}, - {file = "torch-1.13.1-cp311-cp311-manylinux1_x86_64.whl", hash = "sha256:22128502fd8f5b25ac1cd849ecb64a418382ae81dd4ce2b5cebaa09ab15b0d9b"}, - {file = "torch-1.13.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:76024be052b659ac1304ab8475ab03ea0a12124c3e7626282c9c86798ac7bc11"}, - {file = "torch-1.13.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ea8dda84d796094eb8709df0fcd6b56dc20b58fdd6bc4e8d7109930dafc8e419"}, - {file = "torch-1.13.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2ee7b81e9c457252bddd7d3da66fb1f619a5d12c24d7074de91c4ddafb832c93"}, - {file = "torch-1.13.1-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:0d9b8061048cfb78e675b9d2ea8503bfe30db43d583599ae8626b1263a0c1380"}, - {file = "torch-1.13.1-cp37-none-macosx_11_0_arm64.whl", hash = "sha256:f402ca80b66e9fbd661ed4287d7553f7f3899d9ab54bf5c67faada1555abde28"}, - {file = "torch-1.13.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:727dbf00e2cf858052364c0e2a496684b9cb5aa01dc8a8bc8bbb7c54502bdcdd"}, - {file = "torch-1.13.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:df8434b0695e9ceb8cc70650afc1310d8ba949e6db2a0525ddd9c3b2b181e5fe"}, - {file = "torch-1.13.1-cp38-cp38-win_amd64.whl", hash = "sha256:5e1e722a41f52a3f26f0c4fcec227e02c6c42f7c094f32e49d4beef7d1e213ea"}, - {file = "torch-1.13.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:33e67eea526e0bbb9151263e65417a9ef2d8fa53cbe628e87310060c9dcfa312"}, - {file = "torch-1.13.1-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:eeeb204d30fd40af6a2d80879b46a7efbe3cf43cdbeb8838dd4f3d126cc90b2b"}, - {file = "torch-1.13.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:50ff5e76d70074f6653d191fe4f6a42fdbe0cf942fbe2a3af0b75eaa414ac038"}, - {file = "torch-1.13.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:2c3581a3fd81eb1f0f22997cddffea569fea53bafa372b2c0471db373b26aafc"}, - {file = "torch-1.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:0aa46f0ac95050c604bcf9ef71da9f1172e5037fdf2ebe051962d47b123848e7"}, - {file = "torch-1.13.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:6930791efa8757cb6974af73d4996b6b50c592882a324b8fb0589c6a9ba2ddaf"}, - {file = "torch-1.13.1-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:e0df902a7c7dd6c795698532ee5970ce898672625635d885eade9976e5a04949"}, -] - -[package.dependencies] -nvidia-cublas-cu11 = {version = "11.10.3.66", markers = "platform_system == \"Linux\""} -nvidia-cuda-nvrtc-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\""} -nvidia-cuda-runtime-cu11 = {version = "11.7.99", markers = "platform_system == \"Linux\""} -nvidia-cudnn-cu11 = {version = "8.5.0.96", markers = "platform_system == \"Linux\""} + {file = "torch-1.9.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:06435080ba0a2c8f88b65af0550b973c5aa7771eacd9b17f69057fc7436a8ae2"}, + {file = "torch-1.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b92f934b3c95578b3fd37cc06afca208d63f02b0d01b806e979cb4e46124a7f8"}, + {file = "torch-1.9.1-cp36-none-macosx_10_9_x86_64.whl", hash = "sha256:54dacb6a3f63c54334fadbf22fb6e9ee865085a4e0368962edff5babda057606"}, + {file = "torch-1.9.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:dd3ca91dc1a9fe3fbcddf035cb2fb8be44d57a527b845cd196ba69249adecccf"}, + {file = "torch-1.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:42ca081a2e0e759844e70cad7efd8fcfb2f81634dffa73a226564eb83d989e5b"}, + {file = "torch-1.9.1-cp37-none-macosx_10_9_x86_64.whl", hash = "sha256:335961a5c893f7b33b29aecbc19382a1a1b0106b3457a1c45148e1e14f8f5e09"}, + {file = "torch-1.9.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:1fb49ca0ca8edefbb3f47f6801482144c3a746ec21a65eb3f0839a1d8fb24705"}, + {file = "torch-1.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:936d303c5e1d60259fb71d95a33e84d84fececa25a0fae112f6a23286ff183c8"}, + {file = "torch-1.9.1-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:351dda9f483486bec66ed838234e96f077e6886c88110bb1e2f4a708ed2356ce"}, + {file = "torch-1.9.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:35ec703bc535bde7e8790ab9500f02d4413d995ac981520501fde95e268781e1"}, + {file = "torch-1.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:e470697006a4c08e4fb6a645e8ca49b0d36c8e7ccf413deef5161335bd7399f1"}, + {file = "torch-1.9.1-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:a198332e2d344d25e423ae2df98d56d83060f19e9f4cf23164dffc8d403efeb8"}, +] + +[package.dependencies] typing-extensions = "*" +[[package]] +name = "torchmetrics" +version = "1.2.1" +description = "PyTorch native Metrics" +optional = false +python-versions = ">=3.8" +files = [ + {file = "torchmetrics-1.2.1-py3-none-any.whl", hash = "sha256:fe03a8c53d0ae5800d34ea615f56295fda281282cd83f647d2184e81c1d4efee"}, + {file = "torchmetrics-1.2.1.tar.gz", hash = "sha256:217387738f84939c39b534b20d4983e737cc448d27aaa5340e0327948d97ca3e"}, +] + +[package.dependencies] +lightning-utilities = ">=0.8.0" +numpy = ">1.20.0" +packaging = ">17.1" +torch = ">=1.8.1" +typing-extensions = {version = "*", markers = "python_version < \"3.9\""} + [package.extras] -opt-einsum = ["opt-einsum (>=3.3)"] +-tests = ["bert-score (==0.3.13)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "huggingface-hub (<0.20)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "mir-eval (>=0.6)", "netcal (>1.0.0)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "pytorch-msssim (==1.0.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch-complex (<=0.4.3)"] +all = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.2.0)", "mypy (==1.7.1)", "nltk (>=3.6)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "torch (==2.1.1)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +audio = ["pystoi (>=0.3.0)", "torchaudio (>=0.10.0)"] +detection = ["pycocotools (>2.0.0)", "torchvision (>=0.8)"] +dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "huggingface-hub (<0.20)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.2.0)", "mir-eval (>=0.6)", "mypy (==1.7.1)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.1.1)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.8)"] +multimodal = ["piq (<=0.8.0)", "transformers (>=4.10.0)"] +text = ["nltk (>=3.6)", "regex (>=2021.9.24)", "tqdm (>=4.41.0)", "transformers (>4.4.0)"] +typing = ["mypy (==1.7.1)", "torch (==2.1.1)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.2.0)"] [[package]] name = "torchvision" -version = "0.14.1" +version = "0.10.1" description = "image and video datasets and models for torch deep learning" optional = false -python-versions = ">=3.7" +python-versions = "*" files = [ - {file = "torchvision-0.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb05dd9dd3af5428fee525400759daf8da8e4caec45ddd6908cfb36571f6433"}, - {file = "torchvision-0.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8d0766ea92affa7af248e327dd85f7c9cfdf51a57530b43212d4e1858548e9d7"}, - {file = "torchvision-0.14.1-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:6d7b35653113664ea3fdcb71f515cfbf29d2fe393000fd8aaff27a1284de6908"}, - {file = "torchvision-0.14.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:8a9eb773a2fa8f516e404ac09c059fb14e6882c48fdbb9c946327d2ce5dba6cd"}, - {file = "torchvision-0.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:13986f0c15377ff23039e1401012ccb6ecf71024ce53def27139e4eac5a57592"}, - {file = "torchvision-0.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb7a793fd33ce1abec24b42778419a3fb1e3159d7dfcb274a3ca8fb8cbc408dc"}, - {file = "torchvision-0.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:89fb0419780ec9a9eb9f7856a0149f6ac9f956b28f44b0c0080c6b5b48044db7"}, - {file = "torchvision-0.14.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a2d4237d3c9705d7729eb4534e4eb06f1d6be7ff1df391204dfb51586d9b0ecb"}, - {file = "torchvision-0.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:92a324712a87957443cc34223274298ae9496853f115c252f8fc02b931f2340e"}, - {file = "torchvision-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:68ed03359dcd3da9cd21b8ab94da21158df8a6a0c5bad0bf4a42f0e448d28cb3"}, - {file = "torchvision-0.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:30fcf0e9fe57d4ac4ce6426659a57dce199637ccb6c70be1128670f177692624"}, - {file = "torchvision-0.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0ed02aefd09bf1114d35f1aa7dce55aa61c2c7e57f9aa02dce362860be654e85"}, - {file = "torchvision-0.14.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a541e49fc3c4e90e49e6988428ab047415ed52ea97d0c0bfd147d8bacb8f4df8"}, - {file = "torchvision-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:6099b3191dc2516099a32ae38a5fb349b42e863872a13545ab1a524b6567be60"}, - {file = "torchvision-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c5e744f56e5f5b452deb5fc0f3f2ba4d2f00612d14d8da0dbefea8f09ac7690b"}, - {file = "torchvision-0.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:758b20d079e810b4740bd60d1eb16e49da830e3360f9be379eb177ee221fa5d4"}, - {file = "torchvision-0.14.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:83045507ef8d3c015d4df6be79491375b2f901352cfca6e72b4723e9c4f9a55d"}, - {file = "torchvision-0.14.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:eaed58cf454323ed9222d4e0dd5fb897064f454b400696e03a5200e65d3a1e76"}, - {file = "torchvision-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:b337e1245ca4353623dd563c03cd8f020c2496a7c5d12bba4d2e381999c766e0"}, + {file = "torchvision-0.10.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:bc99a984b162ee5626787eaee885d9fec1a5f16837f9d0c8223cca3269b9e47d"}, + {file = "torchvision-0.10.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:46a70a30ea7aeab63e67504778f2565fbb1c153fdd8e1a8c6a22193aec4dbddd"}, + {file = "torchvision-0.10.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e504d9d51eae60a98925aee4a3fd58655abd5669659ad7431f7791a93af166fc"}, + {file = "torchvision-0.10.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cd7e2b1a89d5a08f24325fc12441f5ba2822f407489377ac7841bf351a1f4d37"}, + {file = "torchvision-0.10.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:99d3e01e1d67d12bcc88e826431b70cad5b8e4729a277c04601f83358a120508"}, + {file = "torchvision-0.10.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4ebffeee5468a0934952030eaba1de1dbb08154132235ee1d9049e41dfb1600d"}, + {file = "torchvision-0.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d7c2d6c20244404fc9ca3568c88c305cb5a81d526d5912d52d22c64999bd4353"}, + {file = "torchvision-0.10.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:d6420bf21b9d0bdbabe55d64c8b11c61f8eb077948a55d5707946fcb17d97cec"}, + {file = "torchvision-0.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:453e935212193e89b4bbb8d51082d8138631c2f8a420390284b1946d893df6eb"}, + {file = "torchvision-0.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1c186f42b4f8aa9a01c56c3a758693b0447aa169afb9fba0051177f8fecbd691"}, + {file = "torchvision-0.10.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:ac8dfbe4933013dda898b815e2476ebbc35e3a16b9352dfdd66e773c77755bec"}, + {file = "torchvision-0.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6c8fe90213be4bce590ac9647b34db022d5d1ae94f309a733b9a64e65232173a"}, ] [package.dependencies] numpy = "*" -pillow = ">=5.3.0,<8.3.dev0 || >=8.4.dev0" -requests = "*" -torch = "1.13.1" -typing-extensions = "*" +pillow = ">=5.3.0" +torch = "1.9.1" [package.extras] scipy = ["scipy"] [[package]] name = "tornado" -version = "6.4.1" +version = "6.4.2" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.8" files = [ - {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, - {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, - {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, - {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, - {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, - {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, - {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e828cce1123e9e44ae2a50a9de3055497ab1d0aeb440c5ac23064d9e44880da1"}, + {file = "tornado-6.4.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:072ce12ada169c5b00b7d92a99ba089447ccc993ea2143c9ede887e0937aa803"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a017d239bd1bb0919f72af256a970624241f070496635784d9bf0db640d3fec"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c36e62ce8f63409301537222faffcef7dfc5284f27eec227389f2ad11b09d946"}, + {file = "tornado-6.4.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca9eb02196e789c9cb5c3c7c0f04fb447dc2adffd95265b2c7223a8a615ccbf"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:304463bd0772442ff4d0f5149c6f1c2135a1fae045adf070821c6cdc76980634"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:c82c46813ba483a385ab2a99caeaedf92585a1f90defb5693351fa7e4ea0bf73"}, + {file = "tornado-6.4.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:932d195ca9015956fa502c6b56af9eb06106140d844a335590c1ec7f5277d10c"}, + {file = "tornado-6.4.2-cp38-abi3-win32.whl", hash = "sha256:2876cef82e6c5978fde1e0d5b1f919d756968d5b4282418f3146b79b58556482"}, + {file = "tornado-6.4.2-cp38-abi3-win_amd64.whl", hash = "sha256:908b71bf3ff37d81073356a5fadcc660eb10c1476ee6e2725588626ce7e5ca38"}, + {file = "tornado-6.4.2.tar.gz", hash = "sha256:92bad5b4746e9879fd7bf1eb21dce4e3fc5128d71601f80005afa39237ad620b"}, ] [[package]] name = "tqdm" -version = "4.66.5" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, - {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] +discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] @@ -3806,13 +3841,13 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0, [[package]] name = "types-python-dateutil" -version = "2.9.0.20240906" +version = "2.9.0.20241206" description = "Typing stubs for python-dateutil" optional = false python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.9.0.20240906.tar.gz", hash = "sha256:9706c3b68284c25adffc47319ecc7947e5bb86b3773f843c73906fd598bc176e"}, - {file = "types_python_dateutil-2.9.0.20240906-py3-none-any.whl", hash = "sha256:27c8cc2d058ccb14946eebcaaa503088f4f6dbc4fb6093d3d456a49aef2753f6"}, + {file = "types_python_dateutil-2.9.0.20241206-py3-none-any.whl", hash = "sha256:e248a4bc70a486d3e3ec84d0dc30eec3a5f979d6e7ee4123ae043eedbb987f53"}, + {file = "types_python_dateutil-2.9.0.20241206.tar.gz", hash = "sha256:18f493414c26ffba692a72369fea7a154c502646301ebfe3d56a04b3767284cb"}, ] [[package]] @@ -3842,13 +3877,13 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.2.2" +version = "2.2.3" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, - {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, + {file = "urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac"}, + {file = "urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9"}, ] [package.extras] @@ -3910,20 +3945,6 @@ docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] -[[package]] -name = "wheel" -version = "0.44.0" -description = "A built-package format for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "wheel-0.44.0-py3-none-any.whl", hash = "sha256:2376a90c98cc337d18623527a97c31797bd02bad0033d41547043a1cbfbe448f"}, - {file = "wheel-0.44.0.tar.gz", hash = "sha256:a29c3f2817e95ab89aa4660681ad547c0e9547f20e75b0562fe7723c9a2a9d49"}, -] - -[package.extras] -test = ["pytest (>=6.0.0)", "setuptools (>=65)"] - [[package]] name = "widgetsnbextension" version = "4.0.13" @@ -3937,13 +3958,13 @@ files = [ [[package]] name = "zipp" -version = "3.20.1" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.20.1-py3-none-any.whl", hash = "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064"}, - {file = "zipp-3.20.1.tar.gz", hash = "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b"}, + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, ] [package.extras] @@ -3957,4 +3978,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.8, <3.10" -content-hash = "832fca2fa6b7cf8e377d2b098d8517e122ac9dc3ea2bfd5713ce6f2556126cd0" +content-hash = "a2b8dfcb4bf08b1074199b1246a4f23f90eea04cd0e540655320774fde862957" diff --git a/pyproject.toml b/pyproject.toml index c0960e0..c970915 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,15 +17,12 @@ repository = "https://github.com/sb-ai-lab/Sim4Rec" python = ">=3.8, <3.10" pyarrow = "*" sdv = "0.15.0" -torch = "1.9.1" +torch = ">=1.9.1" torchmetrics="*" pandas = "*" -pyspark = "3.1.3" +pyspark = ">=3.0" numpy = ">=1.20.0" -scipy = "1.5.4" -lightfm = {git = "https://github.com/lyst/lightfm", rev = "0c9c31e"} -notebook = "7.0.8" -torchvision = "0.10.1" +scipy = "*" [tool.poetry.dev-dependencies] # visualization diff --git a/sim4rec/response/nn_response.py b/sim4rec/response/nn_response.py index 7170b80..16bfbfd 100644 --- a/sim4rec/response/nn_response.py +++ b/sim4rec/response/nn_response.py @@ -98,9 +98,7 @@ def predict_udf(df): print("Warning: the historical data is empty") hist_data = spark.createDataFrame([], schema=SIM_LOG_SCHEMA) # filter users whom we don't need - hist_data = hist_data.join(new_recs, on="user_idx", how="inner").select( - hist_data["*"] - ) + hist_data = hist_data.join(new_recs, on="user_idx", how="semi") # read the updated simulator log simlog = spark.read.schema(SIM_LOG_SCHEMA).parquet(self.log_dir) @@ -108,7 +106,7 @@ def predict_udf(df): print("Warning: the simulator log is empty") simlog = spark.createDataFrame([], schema=SIM_LOG_SCHEMA) # filter users whom we don't need - simlog = simlog.join(new_recs, on="user_idx", how="inner").select(simlog["*"]) + simlog = simlog.join(new_recs, on="user_idx", how="semi") NEW_ITER_NO = 9999999 From e54cb8569d14a252645a2281639f75ef4d67f649 Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Tue, 24 Dec 2024 13:35:49 +0300 Subject: [PATCH 10/14] clean up comments --- sim4rec/response/nn_response.py | 3 +-- sim4rec/response/nn_utils/adversarial.py | 4 ---- sim4rec/response/nn_utils/datasets.py | 2 -- sim4rec/response/nn_utils/utils.py | 9 +-------- 4 files changed, 2 insertions(+), 16 deletions(-) diff --git a/sim4rec/response/nn_response.py b/sim4rec/response/nn_response.py index 16bfbfd..8c91ab9 100644 --- a/sim4rec/response/nn_response.py +++ b/sim4rec/response/nn_response.py @@ -124,8 +124,7 @@ def predict_udf(df): ) # not very optimal way, it makes one worker to - # operate with one user, discarding batched computations. - # TODO: add batch_id column and use one worker ? + # operate with one user, discarding batched computations inside torch groupping_column = "user_idx" result_df = combined_data.groupby(groupping_column).applyInPandas( predict_udf, SIM_LOG_SCHEMA diff --git a/sim4rec/response/nn_utils/adversarial.py b/sim4rec/response/nn_utils/adversarial.py index 7fef62d..17c28a4 100644 --- a/sim4rec/response/nn_utils/adversarial.py +++ b/sim4rec/response/nn_utils/adversarial.py @@ -135,10 +135,6 @@ def forward(self, batch, gen_output): class AdversarialNCM(nn.Module): - """ - TODO: move this model to common NCM code. - """ - def __init__(self, embedding, readout=False): super().__init__() self.embedding = embedding diff --git a/sim4rec/response/nn_utils/datasets.py b/sim4rec/response/nn_utils/datasets.py index f11a394..68598ac 100755 --- a/sim4rec/response/nn_utils/datasets.py +++ b/sim4rec/response/nn_utils/datasets.py @@ -213,8 +213,6 @@ class RecommendationData(DatasetBase): * `relevance` | float | relevance of recommemded item in slate. This columns is used only sllate_pos is not present, and then slate_pos is assigned according to relevances. - - TODO: add embeddings. """ def __init__( diff --git a/sim4rec/response/nn_utils/utils.py b/sim4rec/response/nn_utils/utils.py index 04c815b..cb5a2ae 100644 --- a/sim4rec/response/nn_utils/utils.py +++ b/sim4rec/response/nn_utils/utils.py @@ -66,7 +66,6 @@ def collate_rec_data(batch: list, padding_value=0): # responses: number of clicks per recommended item # shape: batch_size, max_sequence_len, max_slate_size responses = [torch.tensor(b["responses"], dtype=torch.long) for b in batch] - # print(responses) responses = torch.nn.utils.rnn.pad_sequence( responses, padding_value=padding_value, batch_first=True ) @@ -76,7 +75,6 @@ def collate_rec_data(batch: list, padding_value=0): # for further decoding model outputs # shape: batch_size, max_sequence_len, max_slate_size timestamps = [torch.tensor(b["timestamps"], dtype=torch.int) for b in batch] - # print(timestamps) timestamps = torch.nn.utils.rnn.pad_sequence( timestamps, padding_value=padding_value, batch_first=True ) @@ -87,9 +85,8 @@ def collate_rec_data(batch: list, padding_value=0): "timestamps": timestamps, # interaction timestamp "length": batch_lengths, # lenghts of each session in batch "user_indexes": user_indexes, # indexes of users - "out_mask": slate_masks, # todo: do we need this mask for metric stability? + "out_mask": slate_masks, # a mask for train-time metric computation } - # print(batch) return batch @@ -101,12 +98,8 @@ def concat_batch(left, right): """ sessionwise_fields = [ "item_indexes", - # TODO: "item_embeddings", - # TODO: "item_categorical", "slates_mask", "responses", - # TODO: "user_embeddings", - # TODO: "user_categorical", "timestamps", "user_indexes", "recommendation_idx", From 74bbc311e6fbadd31d5d9a8d11ef726c97845a19 Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Tue, 24 Dec 2024 13:47:38 +0300 Subject: [PATCH 11/14] update docstring for NNTransformer --- sim4rec/response/nn_response.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sim4rec/response/nn_response.py b/sim4rec/response/nn_response.py index 8c91ab9..2a90ce3 100644 --- a/sim4rec/response/nn_response.py +++ b/sim4rec/response/nn_response.py @@ -71,8 +71,14 @@ def save(self, path): def _transform(self, new_recs): """ Predict responses for given dataframe with recommendations. + Response function gets dataframe with columns + and returns dataframe with columns . + If the initial dataframe had some other columns, they will be returned as well. - :param dataframe: new recommendations. + To sample clicks from this raw probabilities, please use `.response.BernoulliResponse` + + :param new_recs: new recommendations. + :returns: same dataframe, but with predicted click probabilities. """ def predict_udf(df): From 84126838c17fd9c4abbb1cc640a65545c603ef58 Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Thu, 26 Dec 2024 20:35:18 +0300 Subject: [PATCH 12/14] cleanup --- sim4rec/response/nn_response.py | 33 +++-- sim4rec/response/nn_utils/datasets.py | 43 +++--- sim4rec/response/nn_utils/embeddings.py | 172 ----------------------- sim4rec/response/nn_utils/models.py | 36 ++--- sim4rec/response/nn_utils/sessionwise.py | 17 ++- sim4rec/response/nn_utils/slatewise.py | 11 +- sim4rec/response/nn_utils/utils.py | 8 -- 7 files changed, 61 insertions(+), 259 deletions(-) diff --git a/sim4rec/response/nn_response.py b/sim4rec/response/nn_response.py index 2a90ce3..acb6a07 100644 --- a/sim4rec/response/nn_response.py +++ b/sim4rec/response/nn_response.py @@ -5,10 +5,7 @@ from .response import ActionModelEstimator, ActionModelTransformer from .nn_utils.models import ResponseModel from .nn_utils.embeddings import IndexEmbedding -from .nn_utils.datasets import ( - RecommendationData, - # PandasRecommendationData, -) +from .nn_utils.datasets import RecommendationData from pyspark.sql.types import ( StructType, @@ -17,7 +14,7 @@ DoubleType, ) -# move this to simulator core(?) +# Dataframe schema for simulator logs. SIM_LOG_SCHEMA = StructType( [ StructField("user_idx", IntegerType(), True), @@ -40,6 +37,7 @@ def __init__(self, **kwargs): @classmethod def load(cls, checkpoint_dir): + """Load model saved with `NNResponseTransformer.save` method.""" with open(os.path.join(checkpoint_dir, "_params.pkl"), "rb") as f: params_dict = pickle.load(f) params_dict["backbone_response_model"] = ResponseModel.load(checkpoint_dir) @@ -50,7 +48,7 @@ def load(cls, checkpoint_dir): return cls(**params_dict) def save(self, path): - """Save model at given path.""" + """Save response model at given path.""" os.makedirs(path) self.backbone_response_model.dump(path) with open(os.path.join(path, "_item_indexer.pkl"), "wb") as f: @@ -82,7 +80,7 @@ def _transform(self, new_recs): """ def predict_udf(df): - # if not do this, something unstable happens to the Method Resolution Order + # This import is required for correct serialization on worker's side. from .nn_utils.datasets import PandasRecommendationData dataset = PandasRecommendationData( @@ -90,8 +88,6 @@ def predict_udf(df): item_indexer=self.item_indexer, user_indexer=self.user_indexer, ) - - # replacing clicks in datset with predicted dataset = self.backbone_response_model.transform(dataset=dataset) return dataset._log[SIM_LOG_COLS] @@ -103,6 +99,7 @@ def predict_udf(df): if not hist_data: print("Warning: the historical data is empty") hist_data = spark.createDataFrame([], schema=SIM_LOG_SCHEMA) + # filter users whom we don't need hist_data = hist_data.join(new_recs, on="user_idx", how="semi") @@ -111,13 +108,13 @@ def predict_udf(df): if not simlog: print("Warning: the simulator log is empty") simlog = spark.createDataFrame([], schema=SIM_LOG_SCHEMA) - # filter users whom we don't need + + # filter users whom we don't need simlog = simlog.join(new_recs, on="user_idx", how="semi") - NEW_ITER_NO = 9999999 - # since all the historical records are older than simulated by design, # and new slates are newer than simulated, i can simply concat it + NEW_ITER_NO = 9999999 # this is just a large number combined_data = hist_data.unionByName(simlog).unionByName( new_recs.withColumn("response_proba", sf.lit(0.0)) .withColumn("response", sf.lit(0.0)) @@ -125,12 +122,13 @@ def predict_udf(df): "__iter", sf.lit( NEW_ITER_NO - ), # this is just a large number, TODO: add correct "__iter" field to sim4rec.sample_responses to avoid this constants + ), ) ) - - # not very optimal way, it makes one worker to - # operate with one user, discarding batched computations inside torch + + # the dataframe is assumed to be already partitioned by user_idx, + # here we actually just compute response probabilities for + # one user by one worker groupping_column = "user_idx" result_df = combined_data.groupby(groupping_column).applyInPandas( predict_udf, SIM_LOG_SCHEMA @@ -176,7 +174,8 @@ def _fit(self, train_data): """ Fits the model on given data. - :param DataFrame train_data: Data to train on + :param DataFrame train_data: Data to train on, this data must match + the simulator log schema exactly. """ train_dataset = RecommendationData( log=train_data, diff --git a/sim4rec/response/nn_utils/datasets.py b/sim4rec/response/nn_utils/datasets.py index 68598ac..4cd778b 100755 --- a/sim4rec/response/nn_utils/datasets.py +++ b/sim4rec/response/nn_utils/datasets.py @@ -11,7 +11,7 @@ class DatasetBase(Dataset, ABC): """ The items and users are reindexed, because torch.nn.Embeddings - and torch.Dataset requires integer indexes in 0...N. This class + and torch.Dataset requires integer indexes in [0, N]. This class obtains indexes from keyword arguments (`item_id2index` and `user_id2index`) if specified. You probably want to do it, when usind different datasets obtained from one source. @@ -44,7 +44,6 @@ def __init__( if user_indexer: self._user_indexer = user_indexer else: - # users always receive indexes self._user_indexer = Indexer(pad_id=padding_id, unk_id=unknown_id) @property @@ -91,7 +90,7 @@ def apply_scoring(self, score_df): @abstractmethod def _get_log_for_users(self, user_idxs): """ - Given a list of user indexes, return a list of rows cntaining + Given a list of user indexes, return a list of rows containing aggregated data for given users. Each row corresponds to one interaction, i.e. each pair ('user_idx', '__iter') supposed to be unique in log. @@ -100,16 +99,14 @@ def _get_log_for_users(self, user_idxs): """ pass - def __getitems__(self, user_idxs: list) -> dict: + def __getitems__(self, user_idxs: list) -> list[dict]: """Get data points for users with ids in `user_idx`""" - users_log = self._get_log_for_users( - user_idxs - ) # list of rows, each row is ineraction + # user_log list of rows, each row corresponds to one interaction + users_log = self._get_log_for_users(user_idxs) + batch = [] curr_user_log = [] prev_user = -1 - - # TODO: will it be faster if implemented via convertion to pandas? for row in users_log: if prev_user == row["user_idx"]: curr_user_log.append(row) @@ -124,19 +121,6 @@ def __getitems__(self, user_idxs: list) -> dict: return batch - def get_empty_data(self, slate_size=10): - """Empty datapont""" - # everything is masked, hence it won't impact training nor metric computation - return { - "item_indexes": np.ones((1, slate_size), dtype=int), - "user_index": 1, # unknown index - "slates_mask": np.zeros((1, slate_size), dtype=bool), - "responses": np.zeros((1, slate_size), dtype=int), - "length": 1, # zero-length would cause problems with torch.nn.rnn_pad_sequences - "slate_size": slate_size, - "timestamps": np.ones((1, slate_size), dtype=int) * -(10**9), - } - def _user_log_to_datapoint(self, slates: list, user_index: int): """ Gets one datapoint (a history of interactions for single user). @@ -196,6 +180,18 @@ def _user_log_to_datapoint(self, slates: list, user_index: int): # print(data_point) return data_point + def get_empty_data(self, slate_size=10): + """Empty data point""" + return { + "item_indexes": np.ones((1, slate_size), dtype=int), + "user_index": 1, # unknown index + "slates_mask": np.zeros((1, slate_size), dtype=bool), + "responses": np.zeros((1, slate_size), dtype=int), + "length": 1, # zero-length would cause problems during batch collation + "slate_size": slate_size, + "timestamps": np.ones((1, slate_size), dtype=int) * -(10**9), + } + class RecommendationData(DatasetBase): """ @@ -240,7 +236,8 @@ def __init__( ] ) - # in _users only users which are actually present in data are stored, NOT all indexed users + # in _users we store only users which are actually present + # in log rather than all indexed users self._users = [ row["user_idx"] for row in self._log.select("user_idx").distinct().collect() ] diff --git a/sim4rec/response/nn_utils/embeddings.py b/sim4rec/response/nn_utils/embeddings.py index f051e29..76f7b14 100755 --- a/sim4rec/response/nn_utils/embeddings.py +++ b/sim4rec/response/nn_utils/embeddings.py @@ -113,42 +113,6 @@ def _aggregate_item_embeddings(self, item_embeddings, batch): return consumed_embedding - -class NumericalEmbedding(EmbeddingBase): - """ - Embeddings obtained from numerical features represented in the dataset. - As models expect user and item embeddings to be equal in size, the - features are projected into the same space with nn.Linear layers. - - It is assumed, that every batch contains the 'item_embeddings' - and 'user_embeddings' keys with the value being torch.FloatTensor with shape - (batch_size, sequence_len, slate_size, embedding_dim) for items and - (batch_size, sequence_len, embedding_dim) for users. - - :param item_dim: dimensionality of item numerical features in your data. - :param user_dim: dimensionality of user numerical features in your data. - """ - - def __init__( - self, - item_dim: int, - user_dim: int = None, - embedding_dim: int = 32, - user_aggregate: str = "mean", - ): - super().__init__(embedding_dim, user_aggregate=user_aggregate) - self.item_projection_layer = nn.Linear(item_dim, embedding_dim) - if not user_aggregate: - assert user_dim, "user embeddings size is undefined" - self.user_projection_layer = nn.Linear(user_dim, embedding_dim) - - def _get_item_embeddings(self, batch): - return self.item_projection_layer(batch["item_embeddings"]) - - def _get_user_embeddings(self, batch): - return self.user_projection_layer(batch["user_embeddings"]) - - class IndexEmbedding(EmbeddingBase): """ Learnable nn.Embeddings for item and user indexes. @@ -182,110 +146,6 @@ def _get_item_embeddings(self, batch): def _get_user_embeddings(self, batch): return self.user_embedding(batch["user_indexes"]) - -class SVDEmbedding(EmbeddingBase): - """ - Static embeddings obtained from SVD decomposition - of the user-item interaction matrix. Item embedding - is the right matrix from decomposition, user embedding - - the left matrix multiplied by the singular values eye matrix. - - It is assumed, that every batch contains the 'item_indexes' - and 'user_indexes' keys with values being torch.tensor of shape - (batch_size, sequence_len, slate_size) for items and - (batch_size, sequence_len) for users, and theese indexes must align - with indexing of the interaction matrix. - - - :param user_item_matrix: interaction matrix with shape (n_users, n_items) - """ - - def __init__(self, user_item_matrix, embedding_dim=32, user_aggregate="mean"): - super().__init__(embedding_dim=embedding_dim, user_aggregate=user_aggregate) - self.user_embedding, singular_values, self.item_embedding = randomized_svd( - user_item_matrix, - n_components=embedding_dim, - n_iter=4, - power_iteration_normalizer="QR", - ) - self.item_embedding = torch.tensor(self.item_embedding.T).float() - self.user_embedding = torch.tensor( - self.user_embedding * singular_values - ).float() - - def _get_item_embeddings(self, batch): - return self.item_embedding.to(batch["item_indexes"].device)[ - batch["item_indexes"] - ] - - def _get_user_embeddings(self, batch): - return self.user_embedding.to(batch["user_indexes"].device)[ - batch["user_indexes"] - ] - - -class CategoricalEmbedding(EmbeddingBase): - """ - Learnable nn.Embeddings for categorical feature indexes. - - It is assumed, that every batch contains the 'item_categorical' - and 'user_indexes' keys with values being torch.tensor of shape - (batch_size, sequence_len, slate_size, n_categorical_features) for items and - (batch_size, sequence_len, n_categorical_features) for users. - - The overall dimensionality of user and item embeddings is equalized via linear projection. - - :param n_item_features: number of item categorical features. - :param item_values_count: tuple of length `n_item_features` with number of each feature unique values - :param n_user_features: number of item categorical features. - :param user_values_count: tuple of length `n_item_features` with number of each feature unique values - :param feature_embedding_dim: dimensionality of each feature embedding. - """ - - def __init__( - self, - n_item_features: int, - item_values_count: tuple, - n_user_features: int = None, - user_values_count: tuple = (), - feature_embedding_dim: int = 32, - user_aggregate="mean", - embedding_dim: int = 32, - ): - super().__init__(embedding_dim, user_aggregate=user_aggregate) - - # item embedding layers - self.item_embedding = nn.ModuleList([]) - for num_values in item_values_count: - self.item_embedding.append(nn.Embedding(num_values, feature_embedding_dim)) - self.item_projection_layer = nn.Linear( - feature_embedding_dim * n_item_features, embedding_dim - ) - # user embedding layers - if not user_aggregate: - assert n_user_features, "user embeddings size is undefined" - self.user_embedding = nn.ModuleList([]) - for num_values in user_values_count: - self.user_embedding.append( - nn.Embedding(num_values, feature_embedding_dim) - ) - self.user_projection_layer = nn.Linear( - n_user_features * feature_embedding_dim, embedding_dim - ) - - def _get_item_embeddings(self, batch): - embeddings = [] - for i, layer in enumerate(self.item_embedding): - embeddings.append(layer(batch["item_categorical"][..., i])) - return self.item_projection_layer(torch.cat(embeddings, axis=-1)) - - def _get_user_embeddings(self, batch): - embeddings = [] - for i, layer in enumerate(self.user_embedding): - embeddings.append(layer(batch["user_categorical"][..., i])) - return self.user_projection_layer(torch.cat(embeddings, axis=-1)) - - def stack_embeddings(user_embs, item_embs): """Concatenate user and item embeddings""" return torch.cat( @@ -293,35 +153,3 @@ def stack_embeddings(user_embs, item_embs): dim=-1, ) - -class MixedEmbedding(nn.Module): - """ - Concatenates embeddings. - - :param embedding_modules: one or more modules derived from EmbeddingBase. - """ - - def __init__(self, *embedding_modules): - super().__init__() - self.embeddings = nn.ModuleList(embedding_modules) - self.embedding_dim = sum([module.embedding_dim for module in self.embeddings]) - - def forward(self, batch): - item_embeddings = [] - user_embeddings = [] - for module in self.embeddings: - items, users = module(batch) - item_embeddings.append(items) - user_embeddings.append(users) - return torch.cat(item_embeddings, axis=-1), torch.cat(user_embeddings, axis=-1) - - -def add_zero_item(item_embeddings): - """ - Adds an artificial zero item to a given item sequence - Item embeddings are assumed to be of a shape - (batch, sequence_len, embedding_dim) or (batch, sequence_len) - """ - return torch.cat( - [torch.zeros_like(item_embeddings[:, :1, ...]), item_embeddings], dim=1 - ) diff --git a/sim4rec/response/nn_utils/models.py b/sim4rec/response/nn_utils/models.py index 2082adc..d4cc43b 100755 --- a/sim4rec/response/nn_utils/models.py +++ b/sim4rec/response/nn_utils/models.py @@ -93,8 +93,8 @@ def set_calibrator(self, calibrator): def dump(self, path): """ - Saves model's parameters and weights checkpoint on a disk. - :param path: where the model is saved. + Save model parameters and weights checkpoint on a disk. + :param path: where to save teh model """ params = { "model_name": self.model_name, @@ -110,8 +110,8 @@ def dump(self, path): @classmethod def load(cls, path): """ - Loads model from files creqated by `dump` method. - :param path: where data is located + Loads model from files creqated by `ResponseModel.dump` method. + :param path: where the model is saved """ embeddings = torch.load(os.path.join(path, "embeddings.pt")) with open(os.path.join(path, "params.pkl"), "rb") as f: @@ -123,7 +123,7 @@ def load(cls, path): return model def _val_epoch(self, data_loader, silent=True): - # run model on dataloader, compute auc + """Run model on given dataloader, compute metrics""" self.auc.reset() self._model.eval() loss_accumulated = 0.0 @@ -208,17 +208,14 @@ def _train( val_scores = self.evaluate(val_loader, silent=silent) epochs_without_improvement += 1 - # choosing best model based on roc_auc, then f1, then accuracy + + # updating best checkpoint based on roc_auc, then f1, then accuracy if val_scores >= self.best_val_scores: best_model = deepcopy(self._model) best_model_calibrator = deepcopy(self._calibrator) self.best_val_scores = val_scores best_epoch = epoch - if not best_val_loss or best_val_loss > self.val_loss: - epochs_without_improvement = 0 - best_val_loss = self.val_loss - if self.log_to_mlflow: metrics = { "val_auc": val_scores.rocauc.numpy().tolist(), @@ -245,6 +242,9 @@ def _train( mlflow.log_metrics(metrics, step=epoch) # early stopping + if not best_val_loss or best_val_loss > self.val_loss: + epochs_without_improvement = 0 + best_val_loss = self.val_loss if epochs_without_improvement >= early_stopping or val_scores == ( 1.0, 1.0, @@ -313,19 +313,9 @@ def fit( train_data, val_data = train_data.split_by_users(0.8, seed=123) val_loader = create_loader(val_data, batch_size=batch_size) train_loader = create_loader(train_data, batch_size=batch_size) - - # dot product with svd or explicit embeddings has no params to fit - param_num = sum( - p.numel() for p in self._embeddings.parameters() if p.requires_grad + self._train( + train_loader, val_loader, silent=silent, device=device, **kwargs ) - param_num += sum(p.numel() for p in self._model.parameters() if p.requires_grad) - if param_num == 0: - self.best_model = deepcopy(self._model) - self.best_val_scores = self.evaluate(val_loader) - else: - self._train( - train_loader, val_loader, silent=silent, device=device, **kwargs - ) def _get_scores( self, @@ -343,7 +333,6 @@ def _get_scores( loader = create_loader(dataset, batch_size=batch_size) for batch in loader: with torch.no_grad(): - # run model batch = {k: v.to(self.device) for k, v in batch.items()} mask = batch["slates_mask"] raw_scores = torch.sigmoid(self._model(batch)) @@ -366,7 +355,6 @@ def transform(self, dataset, batch_size=128, **kwargs): Returns a recommendation dataset with response probabilities provided. :param RecommendationData dataset: datset to operate on. - """ if type(dataset) is PandasRecommendationData: user_idx, timestamp, item_idx, score = self._get_scores( diff --git a/sim4rec/response/nn_utils/sessionwise.py b/sim4rec/response/nn_utils/sessionwise.py index 3caa3f1..a81dcbb 100755 --- a/sim4rec/response/nn_utils/sessionwise.py +++ b/sim4rec/response/nn_utils/sessionwise.py @@ -23,7 +23,8 @@ def forward(self, batch): shp = item_embs.shape[:-1] # (batch_size, session_len, slate_size) # flatening slates into one long sequence item_embs = item_embs.flatten(1, 2) - # hidden is the user embedding before the first iteraction + + # hidden state is the user embedding before the first iteraction hidden = user_embs[None, :, 0, :].contiguous() rnn_out, _ = self.rnn_layer( item_embs, @@ -114,13 +115,13 @@ def forward(self, batch): # Adding a dummy "zero item". It is required, pytorch # attention implementation will fail if there are sequences - # with no keys in batch. We will drop out response on it later. + # with no keys in batch item_embs = item_embs.flatten(1, 2) item_embs = add_zero_item(item_embs) slate_num_for_item = slate_num_for_item.flatten(1, 2) + 1 slate_num_for_item = add_zero_item(slate_num_for_item) - # gatghering clicked items + # gathering clicked items keys = item_embs clicked_mask = batch["responses"].flatten(1, 2) > 0 clicked_mask = ~add_zero_item(~clicked_mask) @@ -155,7 +156,7 @@ def forward(self, batch): ) attn_mask.to(device) - # Inference the model + # run the model features, attn_map = self.attention( item_embs, keys, @@ -164,7 +165,7 @@ def forward(self, batch): attn_mask=attn_mask.repeat_interleave(self.nheads, 0), ) - # removing artificial `zero item` + # remove artificial `zero item` features = features[:, 1:, :] return self.out_layer(features).reshape(shp).squeeze(-1) @@ -198,6 +199,7 @@ def get_attention_embeddings(self, item_embs, user_embs, slate_mask): # add an artificial item features = add_zero_item(features) key_padding_mask = add_zero_item(~key_padding_mask) + # run module features, attn_map = self.attention( features, features, features, key_padding_mask=key_padding_mask ) @@ -216,9 +218,10 @@ def forward(self, batch): # sequencewise gru gru_features, _ = self.rnn_layer(item_embs.flatten(1, 2)) gru_features = gru_features.reshape(item_embs.shape) - + + # concatenation features = torch.cat([att_features, gru_features], dim=-1) - + return self.out_layer(features).squeeze(-1) diff --git a/sim4rec/response/nn_utils/slatewise.py b/sim4rec/response/nn_utils/slatewise.py index 7d5d8a3..b55dcdd 100755 --- a/sim4rec/response/nn_utils/slatewise.py +++ b/sim4rec/response/nn_utils/slatewise.py @@ -6,10 +6,8 @@ class DotProduct(torch.nn.Module): """ - Simplest model which predictions score is just a dot product of - user and item embeddings. + Model whose prediction scoreis are just a dot product of user and item embeddings. """ - def __init__(self, embedding): super().__init__() self.embedding = embedding @@ -25,9 +23,8 @@ def forward(self, batch): class LogisticRegression(torch.nn.Module): """ - Simple Logistic Regression run on a concatenation of the user's and the item's embedding. + Logistic Regression run on a concatenation of the user's and the item's embedding. """ - def __init__(self, embedding, output_dim=1): super().__init__() self.embedding = embedding @@ -43,7 +40,6 @@ class SlatewiseGRU(torch.nn.Module): """ GRU acting on each slate independently. """ - def __init__(self, embedding, dropout=0, output_dim=1): super().__init__() self.embedding = embedding @@ -143,7 +139,6 @@ def forward(self, batch, threshold=0.0): items = torch.cat([item_embs.flatten(0, 1), item_embs.flatten(0, 1)], dim=-1) h = user_embs.flatten(0, 1)[None, :, :] clicks = torch.zeros_like(batch["responses"]).flatten(0, 1) - # (batch['responses'].flatten(0,1) > 0 ).int().clone() if self.readout: res = [] @@ -165,7 +160,7 @@ def forward(self, batch, threshold=0.0): :, :, None ] elif self.readout == "diff_sample" or self.readout_mode == "sample": - # gumbel trick + # gumbel-softmax trick eps = 1e-8 # to avoid numerical instability gumbel_sample = (torch.rand_like(y) + eps).log() gumbel_sample /= (torch.rand_like(y) + eps).log() + eps diff --git a/sim4rec/response/nn_utils/utils.py b/sim4rec/response/nn_utils/utils.py index cb5a2ae..27d0afe 100644 --- a/sim4rec/response/nn_utils/utils.py +++ b/sim4rec/response/nn_utils/utils.py @@ -45,7 +45,6 @@ def collate_rec_data(batch: list, padding_value=0): b["timestamps"] = pad_slates(b["timestamps"], max_slate_size, padding_value) # user indexes - # print([b["user_index"] for b in batch]) user_indexes = torch.tensor([b["user_index"] for b in batch], dtype=torch.long) # item indexes @@ -221,13 +220,6 @@ def index_np(self, arr: np.array): vfunc = np.vectorize(lambda x: self._id2index.get(x, unk_index)) return vfunc(arr) - # def index_df(self, df, inputCol, outputCol): - # """ - # Apply indexing to the whole spark dataframe colmn. - # """ - # mapping_expr = create_map([lit(x) for x in chain(*self._id2index.items())]) - # return df.withColumn(outputCol, coalesce(mapping_expr[col(inputCol)], lit(1))) - def get_id(self, arr: np.array): """ Transforms given array of indexes back into array of IDs. From 355f1f07d561b2630a69225ac979135e231907ea Mon Sep 17 00:00:00 2001 From: Mikhail Shirokikh Date: Thu, 26 Dec 2024 20:39:55 +0300 Subject: [PATCH 13/14] black --- sim4rec/response/nn_response.py | 18 ++++++++---------- sim4rec/response/nn_utils/datasets.py | 2 +- sim4rec/response/nn_utils/embeddings.py | 3 ++- sim4rec/response/nn_utils/models.py | 8 +++----- sim4rec/response/nn_utils/sessionwise.py | 6 +++--- sim4rec/response/nn_utils/slatewise.py | 4 ++++ 6 files changed, 21 insertions(+), 20 deletions(-) diff --git a/sim4rec/response/nn_response.py b/sim4rec/response/nn_response.py index acb6a07..52d078c 100644 --- a/sim4rec/response/nn_response.py +++ b/sim4rec/response/nn_response.py @@ -14,7 +14,7 @@ DoubleType, ) -# Dataframe schema for simulator logs. +# Dataframe schema for simulator logs. SIM_LOG_SCHEMA = StructType( [ StructField("user_idx", IntegerType(), True), @@ -99,7 +99,7 @@ def predict_udf(df): if not hist_data: print("Warning: the historical data is empty") hist_data = spark.createDataFrame([], schema=SIM_LOG_SCHEMA) - + # filter users whom we don't need hist_data = hist_data.join(new_recs, on="user_idx", how="semi") @@ -108,26 +108,24 @@ def predict_udf(df): if not simlog: print("Warning: the simulator log is empty") simlog = spark.createDataFrame([], schema=SIM_LOG_SCHEMA) - - # filter users whom we don't need + + # filter users whom we don't need simlog = simlog.join(new_recs, on="user_idx", how="semi") # since all the historical records are older than simulated by design, # and new slates are newer than simulated, i can simply concat it - NEW_ITER_NO = 9999999 # this is just a large number + NEW_ITER_NO = 9999999 # this is just a large number combined_data = hist_data.unionByName(simlog).unionByName( new_recs.withColumn("response_proba", sf.lit(0.0)) .withColumn("response", sf.lit(0.0)) .withColumn( "__iter", - sf.lit( - NEW_ITER_NO - ), + sf.lit(NEW_ITER_NO), ) ) - + # the dataframe is assumed to be already partitioned by user_idx, - # here we actually just compute response probabilities for + # here we actually just compute response probabilities for # one user by one worker groupping_column = "user_idx" result_df = combined_data.groupby(groupping_column).applyInPandas( diff --git a/sim4rec/response/nn_utils/datasets.py b/sim4rec/response/nn_utils/datasets.py index 4cd778b..b68458c 100755 --- a/sim4rec/response/nn_utils/datasets.py +++ b/sim4rec/response/nn_utils/datasets.py @@ -236,7 +236,7 @@ def __init__( ] ) - # in _users we store only users which are actually present + # in _users we store only users which are actually present # in log rather than all indexed users self._users = [ row["user_idx"] for row in self._log.select("user_idx").distinct().collect() diff --git a/sim4rec/response/nn_utils/embeddings.py b/sim4rec/response/nn_utils/embeddings.py index 76f7b14..0ae680b 100755 --- a/sim4rec/response/nn_utils/embeddings.py +++ b/sim4rec/response/nn_utils/embeddings.py @@ -113,6 +113,7 @@ def _aggregate_item_embeddings(self, item_embeddings, batch): return consumed_embedding + class IndexEmbedding(EmbeddingBase): """ Learnable nn.Embeddings for item and user indexes. @@ -146,10 +147,10 @@ def _get_item_embeddings(self, batch): def _get_user_embeddings(self, batch): return self.user_embedding(batch["user_indexes"]) + def stack_embeddings(user_embs, item_embs): """Concatenate user and item embeddings""" return torch.cat( [item_embs, user_embs[:, :, None, :].repeat(1, 1, item_embs.size(-2), 1)], dim=-1, ) - diff --git a/sim4rec/response/nn_utils/models.py b/sim4rec/response/nn_utils/models.py index d4cc43b..852def3 100755 --- a/sim4rec/response/nn_utils/models.py +++ b/sim4rec/response/nn_utils/models.py @@ -123,7 +123,7 @@ def load(cls, path): return model def _val_epoch(self, data_loader, silent=True): - """Run model on given dataloader, compute metrics""" + """Run model on given dataloader, compute metrics""" self.auc.reset() self._model.eval() loss_accumulated = 0.0 @@ -208,7 +208,7 @@ def _train( val_scores = self.evaluate(val_loader, silent=silent) epochs_without_improvement += 1 - + # updating best checkpoint based on roc_auc, then f1, then accuracy if val_scores >= self.best_val_scores: best_model = deepcopy(self._model) @@ -313,9 +313,7 @@ def fit( train_data, val_data = train_data.split_by_users(0.8, seed=123) val_loader = create_loader(val_data, batch_size=batch_size) train_loader = create_loader(train_data, batch_size=batch_size) - self._train( - train_loader, val_loader, silent=silent, device=device, **kwargs - ) + self._train(train_loader, val_loader, silent=silent, device=device, **kwargs) def _get_scores( self, diff --git a/sim4rec/response/nn_utils/sessionwise.py b/sim4rec/response/nn_utils/sessionwise.py index a81dcbb..b38eb67 100755 --- a/sim4rec/response/nn_utils/sessionwise.py +++ b/sim4rec/response/nn_utils/sessionwise.py @@ -115,7 +115,7 @@ def forward(self, batch): # Adding a dummy "zero item". It is required, pytorch # attention implementation will fail if there are sequences - # with no keys in batch + # with no keys in batch item_embs = item_embs.flatten(1, 2) item_embs = add_zero_item(item_embs) slate_num_for_item = slate_num_for_item.flatten(1, 2) + 1 @@ -218,10 +218,10 @@ def forward(self, batch): # sequencewise gru gru_features, _ = self.rnn_layer(item_embs.flatten(1, 2)) gru_features = gru_features.reshape(item_embs.shape) - + # concatenation features = torch.cat([att_features, gru_features], dim=-1) - + return self.out_layer(features).squeeze(-1) diff --git a/sim4rec/response/nn_utils/slatewise.py b/sim4rec/response/nn_utils/slatewise.py index b55dcdd..eddfd15 100755 --- a/sim4rec/response/nn_utils/slatewise.py +++ b/sim4rec/response/nn_utils/slatewise.py @@ -1,4 +1,5 @@ import torch + # import absч import torch.nn as nn from .embeddings import stack_embeddings @@ -8,6 +9,7 @@ class DotProduct(torch.nn.Module): """ Model whose prediction scoreis are just a dot product of user and item embeddings. """ + def __init__(self, embedding): super().__init__() self.embedding = embedding @@ -25,6 +27,7 @@ class LogisticRegression(torch.nn.Module): """ Logistic Regression run on a concatenation of the user's and the item's embedding. """ + def __init__(self, embedding, output_dim=1): super().__init__() self.embedding = embedding @@ -40,6 +43,7 @@ class SlatewiseGRU(torch.nn.Module): """ GRU acting on each slate independently. """ + def __init__(self, embedding, dropout=0, output_dim=1): super().__init__() self.embedding = embedding From ef415620ebf779f4892f6920003ee6d42f9718ef Mon Sep 17 00:00:00 2001 From: Mikhail Schrokikh <90191400+arabel1a@users.noreply.github.com> Date: Sat, 28 Dec 2024 01:17:13 +0300 Subject: [PATCH 14/14] Update embeddings.py --- sim4rec/response/nn_utils/embeddings.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/sim4rec/response/nn_utils/embeddings.py b/sim4rec/response/nn_utils/embeddings.py index 0ae680b..f589a8a 100755 --- a/sim4rec/response/nn_utils/embeddings.py +++ b/sim4rec/response/nn_utils/embeddings.py @@ -4,6 +4,15 @@ from sklearn.utils.extmath import randomized_svd from abc import ABC, abstractmethod +def add_zero_item(item_embeddings): + """ + Adds an artificial zero item to a given item sequence + Item embeddings are assumed to be of a shape + (batch, sequence_len, embedding_dim) or (batch, sequence_len) + """ + return torch.cat( + [torch.zeros_like(item_embeddings[:, :1, ...]), item_embeddings], dim=1 + ) class EmbeddingBase(ABC, nn.Module): """