From 04575ecd50b82a5c0703f6e47eca1662a523f0a8 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Sun, 9 Jun 2024 08:29:01 -0400 Subject: [PATCH 01/47] feat(*): remove experiments --- .gitignore | 170 +++++++++++++++++++++++++++++++++++++ README.md | 5 +- caleb/README.md | 0 jonah/README.md | 0 will/01-simple.py | 24 ------ will/02.py | 36 -------- will/03-pythonic.py | 24 ------ will/04-pythonic.py | 22 ----- will/05-pythonic.py | 29 ------- will/06-pythonic.py | 35 -------- will/README.md | 0 will/job-launch-pyodide.py | 31 ------- 12 files changed, 173 insertions(+), 203 deletions(-) create mode 100644 .gitignore delete mode 100644 caleb/README.md delete mode 100644 jonah/README.md delete mode 100755 will/01-simple.py delete mode 100755 will/02.py delete mode 100755 will/03-pythonic.py delete mode 100755 will/04-pythonic.py delete mode 100755 will/05-pythonic.py delete mode 100755 will/06-pythonic.py delete mode 100644 will/README.md delete mode 100755 will/job-launch-pyodide.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea9798b --- /dev/null +++ b/.gitignore @@ -0,0 +1,170 @@ +### Distributive Specific Gitignore rules +*.swp +*node_modules* +node_modules/ +.eslintcache + +### GitHub Standard Python Gitignore below +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + diff --git a/README.md b/README.md index 0443041..719ae6d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ -# A playground for experiments +# Bifrost2 - The Python SDK for [DCP](https://www.dcp.dev/) + + -For now, please keep work to your own subdirectory. We may, or may not, organize it later. diff --git a/caleb/README.md b/caleb/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/jonah/README.md b/jonah/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/will/01-simple.py b/will/01-simple.py deleted file mode 100755 index 7ba510c..0000000 --- a/will/01-simple.py +++ /dev/null @@ -1,24 +0,0 @@ -#! /usr/bin/env python3 - -import dcp_client from distributive -import pythonmonkey as pm - -async def run_job(): - dcp = pm.globalThis.dcp - job = dcp.compute['for']([1,2,3], """ -def my_func(datum): - dcp.progress() - return datum * 3 -dcp.set_slice_handler(my_func) -""") - job.on("readystatechange", lambda state: print ("ready state change:", state)) - job.on("accepted", lambda x: print ("job accepted, id", job.id)) - job.on("result", lambda res: print ("got result for slice number", res.sliceNumber)) - job.worktime = "pyodide" - - results = await job.exec() - print("job", job.id, "finished") - print("results:", pm.eval("Array.from")(results)) - -dcp_client["init"] -run_job() diff --git a/will/02.py b/will/02.py deleted file mode 100755 index f6f4e4a..0000000 --- a/will/02.py +++ /dev/null @@ -1,36 +0,0 @@ -#! /usr/bin/env python3 -""" -Small chanages, pretty much looks the same -- dcp is loaded synchronously -- job.worktime is set to pyodide by default -- job.exec_sync so no async python required - -Notes -- with job.exec_sync as the only option, it doesn't leave the python - dev with the opportunity to just grab the job id does it? In NodeJS - we can just ignore the promise, but it's not as clean here in Python - - It would be nice if there was a way to synchronously deploy a job - and just wait for it to be successfully deployed. If it's deployed - properly, we'd then use the job id to do whatever stuff we need to - do. This is similar to the Diana server workflow for non-hanging - jobs. -""" - -import dcp from distributive - -job = dcp.compute_for([1,2,3], """ -def my_func(datum): - dcp.progress() - return datum * 3 -dcp.set_slice_handler(my_func) -""") - -job.on("readystatechange", lambda state: print ("ready state change:", state)) -job.on("accepted", lambda x: print ("job accepted, id", job.id)) -job.on("result", lambda res: print ("got result for slice number", res.sliceNumber)) - -results = job.exec_sync() - -print("job", job.id, "finished") -print("results:", results) - diff --git a/will/03-pythonic.py b/will/03-pythonic.py deleted file mode 100755 index 9c1fd42..0000000 --- a/will/03-pythonic.py +++ /dev/null @@ -1,24 +0,0 @@ -#! /usr/bin/env python3 -""" -My first more Pythonic appraoch. - -The idea here is that the decorator will decorate the my_func function -as a function which creates a job with compute.for and passes my_func -as the workFunction with some extra code added for setting the slice -handler for instance. - -You can also specify exec or localExec, perhaps you can stack compute -groups and other stuff ontop? Hmm... I'll consider that in a more -advanced appraoch. -""" - -import dcp from distributive - -@dcp.work_function.exec -def my_func(datum): - dcp.progress() - return datum * 3 - -results = my_func([1,2,3,4,5,6]) -print("results:", results) # 3,6,9,12,15,18 - diff --git a/will/04-pythonic.py b/will/04-pythonic.py deleted file mode 100755 index 665447e..0000000 --- a/will/04-pythonic.py +++ /dev/null @@ -1,22 +0,0 @@ -#! /usr/bin/env python3 -""" -Another pythonic approach - -But there's a problem - passing kwargs into the decorator like that just feels... ugly? - -I think it's an intersting concept to apply the job properties like this in the decorator - -but I'm not sure if kwargs is the way to go... -""" - -import dcp from distributive - -@dcp.job(compute_groups=[{ "joinKey": "will", "joinSecret": "bozo"}], public={ "name": "My Epic Job" }) -def my_func(datum): - dcp.progress() - return datum * 3 - -job = my_func([1,2,3,4,5,6]) -results = job.exec_sync() -print("results:", results) # 3,6,9,12,15,18 - diff --git a/will/05-pythonic.py b/will/05-pythonic.py deleted file mode 100755 index 30e9767..0000000 --- a/will/05-pythonic.py +++ /dev/null @@ -1,29 +0,0 @@ -#! /usr/bin/env python3 -""" -Another pythonic approach similar to 04 but using an options object - -I think I like it a little more, this one returns a job from compute -dot for with the properties set from the job_options arg passed to the -decorator. -""" - -import dcp from distributive - -job_options = { - "computeGroups": [{ - "joinKey": "will", - "joinSecret": "bozo" - }], - "public": { "name": "my epic job" }, - "autoClose": False, -} - -@dcp.job(job_options) -def my_func(datum): - dcp.progress() - return datum * 3 - -job = my_func([1,2,3,4,5,6]) -results = job.exec_sync() -print("results:", results) # 3,6,9,12,15,18 - diff --git a/will/06-pythonic.py b/will/06-pythonic.py deleted file mode 100755 index bb703fe..0000000 --- a/will/06-pythonic.py +++ /dev/null @@ -1,35 +0,0 @@ -#! /usr/bin/env python3 -""" -Kwargs - - - - -""" - -import dcp from distributive - -@dcp.job( - compute_groups=[{ - "joinKey": "will", - "joinSecret": "bozo" - }], - public={ "name": "my epic job" }, - auto_close=False, -) -def my_func(datum): - dcp.progress() - return datum * 3 - -job = my_func([1,2,3,4,5,6]) - -@job.on('readystatechange') -def state_change_cb(state) - print(f"Job in state: {state}") - -results = job.exec_sync( - slice_payment_offer=0.35, -) - -print("results:", results) # 3,6,9,12,15,18 - diff --git a/will/README.md b/will/README.md deleted file mode 100644 index e69de29..0000000 diff --git a/will/job-launch-pyodide.py b/will/job-launch-pyodide.py deleted file mode 100755 index e0c90be..0000000 --- a/will/job-launch-pyodide.py +++ /dev/null @@ -1,31 +0,0 @@ -#! /usr/bin/env python3 -# -# @file job-launch-pyodide.py -# Simple python program to launch a trivial DCP job -# which executes in the Pyodide worktime -# @author Wes Garland, wes@distributive.network -# @author Will Pringle, will@distributive.network -# @date March 2024 -# - -import pythonmonkey as pm - -async def run_job(): - dcp = pm.globalThis.dcp - job = dcp.compute['for']([1,2,3], """ -def my_func(datum): - dcp.progress() - return datum * 3 -dcp.set_slice_handler(my_func) -""") - job.on("readystatechange", lambda state: print ("ready state change:", state)) - job.on("accepted", lambda x: print ("job accepted, id", job.id)) - job.on("result", lambda res: print ("got result for slice number", res.sliceNumber)) - job.worktime = "pyodide" - - results = await job.exec() - print("job", job.id, "finished") - print("results:", pm.eval("Array.from")(results)) - -dcp_client = pm.require("dcp-client") -dcp_client["init"](run_job) From 693131e2f884db19d563881148e0cb3b97523075 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Sun, 9 Jun 2024 09:49:48 -0400 Subject: [PATCH 02/47] build(poetry): initial poetry project files --- README.md | 7 + poetry.lock | 887 +++++++++++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 30 ++ 3 files changed, 924 insertions(+) create mode 100644 poetry.lock create mode 100644 pyproject.toml diff --git a/README.md b/README.md index 719ae6d..9129ec6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,11 @@ # Bifrost2 - The Python SDK for [DCP](https://www.dcp.dev/) +## Build +Install [Poetry](https://python-poetry.org/), then in the root of the project directory run the following: +- `$ poetry install` +- `$ poetry shell` + +Verify your installation is correct by running the test suite: +- `$ poetry run pytest` diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..4018e0d --- /dev/null +++ b/poetry.lock @@ -0,0 +1,887 @@ +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. + +[[package]] +name = "aiodns" +version = "3.2.0" +description = "Simple DNS resolver for asyncio" +optional = false +python-versions = "*" +files = [ + {file = "aiodns-3.2.0-py3-none-any.whl", hash = "sha256:e443c0c27b07da3174a109fd9e736d69058d808f144d3c9d56dbd1776964c5f5"}, + {file = "aiodns-3.2.0.tar.gz", hash = "sha256:62869b23409349c21b072883ec8998316b234c9a9e36675756e8e317e8768f72"}, +] + +[package.dependencies] +pycares = ">=4.0.0" + +[[package]] +name = "aiohttp" +version = "3.9.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, +] + +[package.dependencies] +aiodns = {version = "*", optional = true, markers = "(sys_platform == \"linux\" or sys_platform == \"darwin\") and extra == \"speedups\""} +aiosignal = ">=1.1.2" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +attrs = ">=17.3.0" +Brotli = {version = "*", optional = true, markers = "platform_python_implementation == \"CPython\" and extra == \"speedups\""} +brotlicffi = {version = "*", optional = true, markers = "platform_python_implementation != \"CPython\" and extra == \"speedups\""} +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "brotlicffi"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "brotli" +version = "1.1.0" +description = "Python bindings for the Brotli compression library" +optional = false +python-versions = "*" +files = [ + {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752"}, + {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"}, + {file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"}, + {file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"}, + {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"}, + {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"}, + {file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"}, + {file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"}, + {file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"}, + {file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"}, + {file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4d4a848d1837973bf0f4b5e54e3bec977d99be36a7895c61abb659301b02c112"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fdc3ff3bfccdc6b9cc7c342c03aa2400683f0cb891d46e94b64a197910dc4064"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5eeb539606f18a0b232d4ba45adccde4125592f3f636a6182b4a8a436548b914"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"}, + {file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"}, + {file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"}, + {file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f733d788519c7e3e71f0855c96618720f5d3d60c3cb829d8bbb722dddce37985"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:929811df5462e182b13920da56c6e0284af407d1de637d8e536c5cd00a7daf60"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b63b949ff929fbc2d6d3ce0e924c9b93c9785d877a21a1b678877ffbbc4423a"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d192f0f30804e55db0d0e0a35d83a9fead0e9a359a9ed0285dbacea60cc10a84"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f296c40e23065d0d6650c4aefe7470d2a25fffda489bcc3eb66083f3ac9f6643"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"}, + {file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"}, + {file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"}, + {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"}, + {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03d20af184290887bdea3f0f78c4f737d126c74dc2f3ccadf07e54ceca3bf208"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6172447e1b368dcbc458925e5ddaf9113477b0ed542df258d84fa28fc45ceea7"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a743e5a28af5f70f9c080380a5f908d4d21d40e8f0e0c8901604d15cfa9ba751"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0541e747cce78e24ea12d69176f6a7ddb690e62c425e01d31cc065e69ce55b48"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cdbc1fc1bc0bff1cef838eafe581b55bfbffaed4ed0318b724d0b71d4d377619"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:890b5a14ce214389b2cc36ce82f3093f96f4cc730c1cffdbefff77a7c71f2a97"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"}, + {file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"}, + {file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"}, + {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"}, + {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7905193081db9bfa73b1219140b3d315831cbff0d8941f22da695832f0dd188f"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a77def80806c421b4b0af06f45d65a136e7ac0bdca3c09d9e2ea4e515367c7e9"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dadd1314583ec0bf2d1379f7008ad627cd6336625d6679cf2f8e67081b83acf"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:901032ff242d479a0efa956d853d16875d42157f98951c0230f69e69f9c09bac"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22fc2a8549ffe699bfba2256ab2ed0421a7b8fadff114a3d201794e45a9ff578"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ae15b066e5ad21366600ebec29a7ccbc86812ed267e4b28e860b8ca16a2bc474"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"}, + {file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"}, + {file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"}, + {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"}, +] + +[[package]] +name = "brotlicffi" +version = "1.1.0.0" +description = "Python CFFI bindings to the Brotli library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "brotlicffi-1.1.0.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9b7ae6bd1a3f0df532b6d67ff674099a96d22bc0948955cb338488c31bfb8851"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19ffc919fa4fc6ace69286e0a23b3789b4219058313cf9b45625016bf7ff996b"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9feb210d932ffe7798ee62e6145d3a757eb6233aa9a4e7db78dd3690d7755814"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84763dbdef5dd5c24b75597a77e1b30c66604725707565188ba54bab4f114820"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-win32.whl", hash = "sha256:1b12b50e07c3911e1efa3a8971543e7648100713d4e0971b13631cce22c587eb"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:994a4f0681bb6c6c3b0925530a1926b7a189d878e6e5e38fae8efa47c5d9c613"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e4aeb0bd2540cb91b069dbdd54d458da8c4334ceaf2d25df2f4af576d6766ca"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b7b0033b0d37bb33009fb2fef73310e432e76f688af76c156b3594389d81391"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54a07bb2374a1eba8ebb52b6fafffa2afd3c4df85ddd38fcc0511f2bb387c2a8"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7901a7dc4b88f1c1475de59ae9be59799db1007b7d059817948d8e4f12e24e35"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce01c7316aebc7fce59da734286148b1d1b9455f89cf2c8a4dfce7d41db55c2d"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:246f1d1a90279bb6069de3de8d75a8856e073b8ff0b09dcca18ccc14cec85979"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc4bc5d82bc56ebd8b514fb8350cfac4627d6b0743382e46d033976a5f80fab6"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c26ecb14386a44b118ce36e546ce307f4810bc9598a6e6cb4f7fca725ae7e6"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca72968ae4eaf6470498d5c2887073f7efe3b1e7d7ec8be11a06a79cc810e990"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:add0de5b9ad9e9aa293c3aa4e9deb2b61e99ad6c1634e01d01d98c03e6a354cc"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b6068e0f3769992d6b622a1cd2e7835eae3cf8d9da123d7f51ca9c1e9c333e5"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8557a8559509b61e65083f8782329188a250102372576093c88930c875a69838"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a7ae37e5d79c5bdfb5b4b99f2715a6035e6c5bf538c3746abc8e26694f92f33"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391151ec86bb1c683835980f4816272a87eaddc46bb91cbf44f62228b84d8cca"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2f3711be9290f0453de8eed5275d93d286abe26b08ab4a35d7452caa1fef532f"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a807d760763e398bbf2c6394ae9da5815901aa93ee0a37bca5efe78d4ee3171"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa8ca0623b26c94fccc3a1fdd895be1743b838f3917300506d04aa3346fd2a14"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3de0cf28a53a3238b252aca9fed1593e9d36c1d116748013339f0949bfc84112"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6be5ec0e88a4925c91f3dea2bb0013b3a2accda6f77238f76a34a1ea532a1cb0"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d9eb71bb1085d996244439154387266fd23d6ad37161f6f52f1cd41dd95a3808"}, + {file = "brotlicffi-1.1.0.0.tar.gz", hash = "sha256:b77827a689905143f87915310b93b273ab17888fd43ef350d4832c4a71083c13"}, +] + +[package.dependencies] +cffi = ">=1.0.0" + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "frozenlist" +version = "1.4.1" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, +] + +[[package]] +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "multidict" +version = "6.0.5" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, +] + +[[package]] +name = "packaging" +version = "24.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pminit" +version = "0.6.0" +description = "Post-install hook for PythonMonkey" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "pminit-0.6.0.tar.gz", hash = "sha256:0b6f3fa3fa9fcb2b95c1fff2443f7150220764b8359ae35b0bc0f64ff8620897"}, +] + +[[package]] +name = "pycares" +version = "4.4.0" +description = "Python interface for c-ares" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycares-4.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:24da119850841d16996713d9c3374ca28a21deee056d609fbbed29065d17e1f6"}, + {file = "pycares-4.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8f64cb58729689d4d0e78f0bfb4c25ce2f851d0274c0273ac751795c04b8798a"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33e2a1120887e89075f7f814ec144f66a6ce06a54f5722ccefc62fbeda83cff"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c680fef1b502ee680f8f0b95a41af4ec2c234e50e16c0af5bbda31999d3584bd"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fff16b09042ba077f7b8aa5868d1d22456f0002574d0ba43462b10a009331677"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:229a1675eb33bc9afb1fc463e73ee334950ccc485bc83a43f6ae5839fb4d5fa3"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3aebc73e5ad70464f998f77f2da2063aa617cbd8d3e8174dd7c5b4518f967153"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6ef64649eba56448f65e26546d85c860709844d2fc22ef14d324fe0b27f761a9"}, + {file = "pycares-4.4.0-cp310-cp310-win32.whl", hash = "sha256:4afc2644423f4eef97857a9fd61be9758ce5e336b4b0bd3d591238bb4b8b03e0"}, + {file = "pycares-4.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5ed4e04af4012f875b78219d34434a6d08a67175150ac1b79eb70ab585d4ba8c"}, + {file = "pycares-4.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bce8db2fc6f3174bd39b81405210b9b88d7b607d33e56a970c34a0c190da0490"}, + {file = "pycares-4.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a0303428d013ccf5c51de59c83f9127aba6200adb7fd4be57eddb432a1edd2a"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb91792f1556f97be7f7acb57dc7756d89c5a87bd8b90363a77dbf9ea653817"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b61579cecf1f4d616e5ea31a6e423a16680ab0d3a24a2ffe7bb1d4ee162477ff"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7af06968cbf6851566e806bf3e72825b0e6671832a2cbe840be1d2d65350710"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ceb12974367b0a68a05d52f4162b29f575d241bd53de155efe632bf2c943c7f6"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2eeec144bcf6a7b6f2d74d6e70cbba7886a84dd373c886f06cb137a07de4954c"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e3a6f7cfdfd11eb5493d6d632e582408c8f3b429f295f8799c584c108b28db6f"}, + {file = "pycares-4.4.0-cp311-cp311-win32.whl", hash = "sha256:34736a2ffaa9c08ca9c707011a2d7b69074bbf82d645d8138bba771479b2362f"}, + {file = "pycares-4.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:eb66c30eb11e877976b7ead13632082a8621df648c408b8e15cdb91a452dd502"}, + {file = "pycares-4.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fd644505a8cfd7f6584d33a9066d4e3d47700f050ef1490230c962de5dfb28c6"}, + {file = "pycares-4.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52084961262232ec04bd75f5043aed7e5d8d9695e542ff691dfef0110209f2d4"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0c5368206057884cde18602580083aeaad9b860e2eac14fd253543158ce1e93"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:112a4979c695b1c86f6782163d7dec58d57a3b9510536dcf4826550f9053dd9a"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d186dafccdaa3409194c0f94db93c1a5d191145a275f19da6591f9499b8e7b8"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:64965dc19c578a683ea73487a215a8897276224e004d50eeb21f0bc7a0b63c88"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ed2a38e34bec6f2586435f6ff0bc5fe11d14bebd7ed492cf739a424e81681540"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:94d6962db81541eb0396d2f0dfcbb18cdb8c8b251d165efc2d974ae652c547d4"}, + {file = "pycares-4.4.0-cp312-cp312-win32.whl", hash = "sha256:1168a48a834813aa80f412be2df4abaf630528a58d15c704857448b20b1675c0"}, + {file = "pycares-4.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:db24c4e7fea4a052c6e869cbf387dd85d53b9736cfe1ef5d8d568d1ca925e977"}, + {file = "pycares-4.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:21a5a0468861ec7df7befa69050f952da13db5427ae41ffe4713bc96291d1d95"}, + {file = "pycares-4.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:22c00bf659a9fa44d7b405cf1cd69b68b9d37537899898d8cbe5dffa4016b273"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23aa3993a352491a47fcf17867f61472f32f874df4adcbb486294bd9fbe8abee"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:813d661cbe2e37d87da2d16b7110a6860e93ddb11735c6919c8a3545c7b9c8d8"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77cf5a2fd5583c670de41a7f4a7b46e5cbabe7180d8029f728571f4d2e864084"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3eaa6681c0a3e3f3868c77aca14b7760fed35fdfda2fe587e15c701950e7bc69"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad58e284a658a8a6a84af2e0b62f2f961f303cedfe551854d7bd40c3cbb61912"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bfb89ca9e3d0a9b5332deeb666b2ede9d3469107742158f4aeda5ce032d003f4"}, + {file = "pycares-4.4.0-cp38-cp38-win32.whl", hash = "sha256:f36bdc1562142e3695555d2f4ac0cb69af165eddcefa98efc1c79495b533481f"}, + {file = "pycares-4.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:902461a92b6a80fd5041a2ec5235680c7cc35e43615639ec2a40e63fca2dfb51"}, + {file = "pycares-4.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7bddc6adba8f699728f7fc1c9ce8cef359817ad78e2ed52b9502cb5f8dc7f741"}, + {file = "pycares-4.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cb49d5805cd347c404f928c5ae7c35e86ba0c58ffa701dbe905365e77ce7d641"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56cf3349fa3a2e67ed387a7974c11d233734636fe19facfcda261b411af14d80"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bf2eaa83a5987e48fa63302f0fe7ce3275cfda87b34d40fef9ce703fb3ac002"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82bba2ab77eb5addbf9758d514d9bdef3c1bfe7d1649a47bd9a0d55a23ef478b"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c6a8bde63106f162fca736e842a916853cad3c8d9d137e11c9ffa37efa818b02"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5f646eec041db6ffdbcaf3e0756fb92018f7af3266138c756bb09d2b5baadec"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9dc04c54c6ea615210c1b9e803d0e2d2255f87a3d5d119b6482c8f0dfa15b26b"}, + {file = "pycares-4.4.0-cp39-cp39-win32.whl", hash = "sha256:97892cced5794d721fb4ff8765764aa4ea48fe8b2c3820677505b96b83d4ef47"}, + {file = "pycares-4.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:917f08f0b5d9324e9a34211e68d27447c552b50ab967044776bbab7e42a553a2"}, + {file = "pycares-4.4.0.tar.gz", hash = "sha256:f47579d508f2f56eddd16ce72045782ad3b1b3b678098699e2b6a1b30733e1c2"}, +] + +[package.dependencies] +cffi = ">=1.5.0" + +[package.extras] +idna = ["idna (>=2.1)"] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pyreadline3" +version = "3.4.1" +description = "A python implementation of GNU readline." +optional = false +python-versions = "*" +files = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] + +[[package]] +name = "pytest" +version = "7.4.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, +] + +[package.dependencies] +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\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pythonmonkey" +version = "0.6.0" +description = "" +optional = false +python-versions = "<4.0,>=3.8" +files = [ + {file = "pythonmonkey-0.6.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:66845e9e4f81c5654495e0ffddf616f7b3f144dfcd152b01be3121258a776eaa"}, + {file = "pythonmonkey-0.6.0-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:d8ab351a07f7fd00d515523465d62ed2a41509018cad87a0b748e52066d5fa73"}, + {file = "pythonmonkey-0.6.0-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:14264e69eaf72cb752020cc6a8e1bab2a648808a6f6369e889c6ab144be7ee57"}, + {file = "pythonmonkey-0.6.0-cp310-cp310-manylinux_2_31_x86_64.whl", hash = "sha256:1b88a5b30780b1b1c9a8d48221595ddd8440cb93f0f97e65daab6e0a3e2351aa"}, + {file = "pythonmonkey-0.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:2cd624877d51fdd02a662c3a547db86df7234aa973ccb6157159b04af9318497"}, + {file = "pythonmonkey-0.6.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:fc3fabef23673c5158e7702cefe7a6bcaa780efbc8e04304b6252ec02b3413f4"}, + {file = "pythonmonkey-0.6.0-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:b930ee55b99994891e58252a812283b385780c08288a4269bd426addb663176d"}, + {file = "pythonmonkey-0.6.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:9aa3251a1c3bce930db7e95fbea58f6787e8f302fec66f0220c4e8ca39e1b27e"}, + {file = "pythonmonkey-0.6.0-cp311-cp311-manylinux_2_31_x86_64.whl", hash = "sha256:d5a84c9c80ad121f500b76f2f0556355e3582c8e13f0ae5107333557069c5277"}, + {file = "pythonmonkey-0.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:137ca8655326e11419763e9900ac53bfc755480c9d5281863f0f895f1bbab817"}, + {file = "pythonmonkey-0.6.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:1219e4fddd7280684179a1dd2383ff9a63769758053308fb02083ed6b43a2e39"}, + {file = "pythonmonkey-0.6.0-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:5661b672f7cdb0cf0162393e722754ab7c1478719bbffc8e917d3396b09d9bb6"}, + {file = "pythonmonkey-0.6.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:0b7ac09648a6f19bc8b6b3e024321fb1f2f4a7f4fe7a1486d9d0d58f6665f5be"}, + {file = "pythonmonkey-0.6.0-cp312-cp312-manylinux_2_31_x86_64.whl", hash = "sha256:8d5d8968982e55aa803440d0837cc425a9c4a852571a7863789f2fcbe86549f3"}, + {file = "pythonmonkey-0.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:9b14c8f667acf2b5774df99c0ff410e7893ebcb2032a9784c4f1b0f8d063e564"}, + {file = "pythonmonkey-0.6.0-cp38-cp38-macosx_13_0_x86_64.whl", hash = "sha256:4e42fe25d986edb249d9c37b3bf289c2a0047ae9b7e12e4e563ed6498d891735"}, + {file = "pythonmonkey-0.6.0-cp38-cp38-manylinux_2_31_x86_64.whl", hash = "sha256:e11bf3cc5e215dce384ecb3bb346e56c077038a351a294efe2453c2a4aaf2077"}, + {file = "pythonmonkey-0.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:4a6868dd87319e40b3ec30f051032afa61eb88d5fae13a9805e96f33248705a4"}, + {file = "pythonmonkey-0.6.0-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:d6c499be8b00cdae7db4b8600b66783d4b66e95aeca1dc92e27db97928a560a8"}, + {file = "pythonmonkey-0.6.0-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:9b91ba1e79e3a1c9da525bb940047633b480803a88bb224f4444111f75b1193b"}, + {file = "pythonmonkey-0.6.0-cp39-cp39-manylinux_2_31_x86_64.whl", hash = "sha256:f03f5148def5d3b43bce5fd1f26c87ba2e9fffa4ec4e4f25669308d0a286ed38"}, + {file = "pythonmonkey-0.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:30139208a17d9a534966068ff4b5ce5ce6086b429d30e85540211de379c06fb4"}, + {file = "pythonmonkey-0.6.0.tar.gz", hash = "sha256:f0d6f16cd32a2e42bf24b055b38092c15764f5a6d83c7f09f2c570fc31c31d4d"}, +] + +[package.dependencies] +aiohttp = {version = ">=3.9.5,<4.0.0", extras = ["speedups"]} +pminit = ">=0.4.0" +pyreadline3 = {version = ">=3.4.1,<4.0.0", markers = "sys_platform == \"win32\""} + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "yarl" +version = "1.9.4" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = "^3.8" +content-hash = "99eb048b780e3e5572fb97919c50df41113acc7cfa618e3e8809331df9ed9cdd" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..42a4867 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,30 @@ +[tool.poetry] +name = "distributive" +version = "0.1.0" +description = "A DCP SDK" +authors = [ + "Distributive ", + "Will Pringle ", +] +license = "MIT" +repository = "https://github.com/Distributive-Network/bifrost2" + +packages = [ + { include = "dcp" } +] + +[tool.poetry.dependencies] +python = "^3.8" +pythonmonkey = ">=0.6.0" +pminit = ">=0.6.0" + +[tool.poetry.dev-dependencies] +pytest = "^7.3.1" + +[build-system] +requires = ["poetry>=1.1.0"] +build-backend = "poetry.core.masonry.api" + +[tool.pminit] +npm_install = true + From 53ada957974fef2394c26b87c93c3a6444a67336 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Sun, 9 Jun 2024 10:13:31 -0400 Subject: [PATCH 03/47] feat(dcp/*): initial module layout --- dcp/__init__.py | 15 + dcp/js/__init__.py | 0 dcp/js/load_dcp_client.py | 3 + dcp/js/package-lock.json | 2401 +++++++++++++++++++++++++++++++++++++ dcp/js/package.json | 5 + dcp/sanity.py | 3 + tests/__init__.py | 0 tests/test_insanity.py | 14 + tests/test_sanity.py | 12 + 9 files changed, 2453 insertions(+) create mode 100644 dcp/__init__.py create mode 100644 dcp/js/__init__.py create mode 100644 dcp/js/load_dcp_client.py create mode 100644 dcp/js/package-lock.json create mode 100644 dcp/js/package.json create mode 100644 dcp/sanity.py create mode 100644 tests/__init__.py create mode 100644 tests/test_insanity.py create mode 100644 tests/test_sanity.py diff --git a/dcp/__init__.py b/dcp/__init__.py new file mode 100644 index 0000000..8b7ff04 --- /dev/null +++ b/dcp/__init__.py @@ -0,0 +1,15 @@ +def init(function_names): + """ + Dynamically adds functions to the dcp module. + + Args: + function_names (list of str): List of function names to add. + """ + import sys + module = sys.modules[__name__] + + for name in function_names: + # Create a function that returns True + func = lambda: True + # Assign the function to the module with the given name + setattr(module, name, func) diff --git a/dcp/js/__init__.py b/dcp/js/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dcp/js/load_dcp_client.py b/dcp/js/load_dcp_client.py new file mode 100644 index 0000000..45cb446 --- /dev/null +++ b/dcp/js/load_dcp_client.py @@ -0,0 +1,3 @@ +import pythonmonkey as pm + + diff --git a/dcp/js/package-lock.json b/dcp/js/package-lock.json new file mode 100644 index 0000000..31b1262 --- /dev/null +++ b/dcp/js/package-lock.json @@ -0,0 +1,2401 @@ +{ + "name": "_js", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "dcp-client": "^4.4.4" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kingsds/engine.io-client": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/@kingsds/engine.io-client/-/engine.io-client-6.2.3.tgz", + "integrity": "sha512-7+JgbK/uEMzVT14SvELTJny6vaWpiDA4zyBdzobCJ20Huym21yjnWw01bZzuCb/b0P/5Wz1SB/UNivIRUM0O/A==", + "dependencies": { + "@kingsds/xmlhttprequest-ssl": "^2.1.0", + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + } + }, + "node_modules/@kingsds/engine.io-client/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@kingsds/engine.io-client/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/@kingsds/socket.io-client": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/@kingsds/socket.io-client/-/socket.io-client-4.5.4.tgz", + "integrity": "sha512-R2/O3nqDmVSYvfJUjEZ+snprL1o+l3xBOEal7jeMaY6huZJbXNhp1/HzKd+YqcMJTKxWT3iBzXzWwZBAS+vSLQ==", + "dependencies": { + "@kingsds/engine.io-client": "^6.2.3", + "@socket.io/component-emitter": "~3.1.0", + "debug": "^3.2.7", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@kingsds/xmlhttprequest-ssl": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@kingsds/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz", + "integrity": "sha512-gxDD8VnHc83E5jS17iDpJzhd489panYtw/Kyh+W0BdFNTBpUa2nSITSZvBWDchMGrhaJ/Ha5PeXHhaJ2xn3Zgw==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" + }, + "node_modules/@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/secp256k1": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/aes-js": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", + "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/bravojs": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/bravojs/-/bravojs-1.0.16.tgz", + "integrity": "sha512-08N9nBCErNicgD70SiIpXzuzr9wkkAevpBTlOczesmwnSOjzYqucG4L5KxaXSMXPx5N4I+Ot5T2o6Yo1x5XKrw==" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "bin": { + "btoa": "bin/btoa.js" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001629", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001629.tgz", + "integrity": "sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/dcp-client": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/dcp-client/-/dcp-client-4.4.4.tgz", + "integrity": "sha512-fDZkl0SATOC2mimpw0Cm/9QQHMBH1epicM0ixvISmEPtiSQXZ6/K+fs82KXsLy6kB0YaD/x805IKD/hVx5Gxyg==", + "dependencies": { + "@kingsds/socket.io-client": "^4.5.4", + "@kingsds/xmlhttprequest-ssl": "^2.1.0", + "atob": "2.1.2", + "bravojs": "^1.0.16", + "btoa": "^1.2.1", + "chalk": "^4.1.2", + "ethereumjs-util": "^7.1.5", + "ethereumjs-wallet": "^1.0.2", + "html-to-text": "^5.1.1", + "http-proxy-agent": "^4.0.1", + "https-agent": "^1.0.0", + "https-proxy-agent": "^5.0.0", + "kvin": "^1.2.13", + "nanoid": "^3.2.0", + "node-localstorage": "^2.1.5", + "physical-cpu-count": "^2.0.0", + "polyfill-crypto.getrandomvalues": "^1.0.0", + "regedit": "^3.0.3", + "semver": "^7.3.5", + "webpack": "^5.79.0", + "webpack-cli": "^4.7.2", + "yargs": "16.2.0" + }, + "engines": { + "node": ">=18", + "npm": ">=7" + } + }, + "node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.796", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.796.tgz", + "integrity": "sha512-NglN/xprcM+SHD2XCli4oC6bWe6kHoytcyLKCWXmRL854F0qhPhaYgUswUsglnPxYaNQIg2uMY4BvaomIf3kLA==" + }, + "node_modules/elliptic": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/engine.io-parser": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/envinfo": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", + "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==" + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethereumjs-wallet": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", + "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", + "dependencies": { + "aes-js": "^3.1.2", + "bs58check": "^2.1.2", + "ethereum-cryptography": "^0.1.3", + "ethereumjs-util": "^7.1.2", + "randombytes": "^2.1.0", + "scrypt-js": "^3.0.1", + "utf8": "^3.0.0", + "uuid": "^8.3.2" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/html-to-text": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", + "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", + "dependencies": { + "he": "^1.2.0", + "htmlparser2": "^3.10.1", + "lodash": "^4.17.11", + "minimist": "^1.2.0" + }, + "bin": { + "html-to-text": "bin/cli.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/https-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-agent/-/https-agent-1.0.0.tgz", + "integrity": "sha512-Y55aWtVwkhb1hDKZ6GMjY0hcUxMpjgxtP4i+EWqYDQktT7Qsx2yPWio6dcSuhQxyUHoZ1FHlpGK4Bfva5BhyIw==", + "dependencies": { + "tunnel": "^0.0.3" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/if-async": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/if-async/-/if-async-3.7.4.tgz", + "integrity": "sha512-BFEH2mZyeF6KZKaKLVPZ0wMjIiWOdjvZ7zbx8ENec0qfZhJwKFbX/4jKM5LTKyJEc/GOqUKiiJ2IFKT9yWrZqA==" + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/keccak": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kvin": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/kvin/-/kvin-1.2.14.tgz", + "integrity": "sha512-xGcVUdyH/4UOQnhNOEpY6VlSjS9LWRlBj50T/qmRDo8Hby1cnFT6Iwxtg4K9gHDLFJfaJd0MODa1e5q8vEi5Ug==" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/mersenne-twister": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mersenne-twister/-/mersenne-twister-1.1.0.tgz", + "integrity": "sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-gyp-build": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-localstorage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", + "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", + "dependencies": { + "write-file-atomic": "^1.1.4" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/physical-cpu-count": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", + "integrity": "sha512-rxJOljMuWtYlvREBmd6TZYanfcPhNUKtGDZBjBBS8WG1dpN2iwPsRJZgQqN/OtJuiQckdRFOfzogqJClTrsi7g==" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/polyfill-crypto.getrandomvalues": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/polyfill-crypto.getrandomvalues/-/polyfill-crypto.getrandomvalues-1.0.0.tgz", + "integrity": "sha512-GIkU6bg4auRnDFOqUNit7eLn9hzznrJU1CGFuivQzDeVp4Ys8cY4OY6GhAdndJwo4jryz5cJyjg9ELhvQjdrtw==", + "dependencies": { + "mersenne-twister": "^1.0.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regedit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/regedit/-/regedit-3.0.3.tgz", + "integrity": "sha512-SpHmMKOtiEYx0MiRRC48apBsmThoZ4svZNsYoK8leHd5bdUHV1nYb8pk8gh6Moou7/S9EDi1QsjBTpyXVQrPuQ==", + "dependencies": { + "debug": "^4.1.0", + "if-async": "^3.7.4", + "stream-slicer": "0.0.6", + "through2": "^0.6.3" + } + }, + "node_modules/regedit/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/regedit/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", + "engines": { + "node": "*" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/stream-slicer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stream-slicer/-/stream-slicer-0.0.6.tgz", + "integrity": "sha512-QsY0LbweYE5L+e+iBQgtkM5WUIf7+kCMA/m2VULv8rEEDDnlDPsPvOHH4nli6uaZOKQEt64u65h0l/eeZo7lCw==" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", + "dependencies": { + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + }, + "node_modules/tunnel": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.3.tgz", + "integrity": "sha512-YohLhrnpZrbzloZ4AOHh+zKgGrkNO5LDw72UMhfGPC4ccHnNAyimzEb0RMZgqAIuR+PqXO4BzRhaqsv8UBw13Q==", + "engines": { + "node": ">=0.6.11 <=0.7.0 || >=0.7.3" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + } + } +} diff --git a/dcp/js/package.json b/dcp/js/package.json new file mode 100644 index 0000000..5d5f473 --- /dev/null +++ b/dcp/js/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "dcp-client": "^4.4.4" + } +} diff --git a/dcp/sanity.py b/dcp/sanity.py new file mode 100644 index 0000000..b06e8f3 --- /dev/null +++ b/dcp/sanity.py @@ -0,0 +1,3 @@ +def sanity(): + return True + diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_insanity.py b/tests/test_insanity.py new file mode 100644 index 0000000..05bb53a --- /dev/null +++ b/tests/test_insanity.py @@ -0,0 +1,14 @@ +# tests/test_sanity.py + +import unittest +import dcp + +class TestInSanityFunction(unittest.TestCase): + def test_insanity_returns_true(self): + """Test if the sanity function returns True.""" + dcp.init(['will', 'pringle']) + self.assertTrue(dcp.will) + self.assertTrue(dcp.pringle) + +if __name__ == '__main__': + unittest.main() diff --git a/tests/test_sanity.py b/tests/test_sanity.py new file mode 100644 index 0000000..2aff244 --- /dev/null +++ b/tests/test_sanity.py @@ -0,0 +1,12 @@ +# tests/test_sanity.py + +import unittest +from dcp.sanity import sanity + +class TestSanityFunction(unittest.TestCase): + def test_sanity_returns_true(self): + """Test if the sanity function returns True.""" + self.assertTrue(sanity()) + +if __name__ == '__main__': + unittest.main() From 68101c65b88ba76ec4f49c84fa3c784caa8e944b Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Sun, 9 Jun 2024 10:59:53 -0400 Subject: [PATCH 04/47] dev(loop.sh): Loop - interactive development Bad name, but I like the concept. Each time a file changes, it re-runs allowing you to see when tests fail. More interestingly is that unlike using watch for accomplish this, you can also debug your code with pdb --- tests/loop.sh | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100755 tests/loop.sh diff --git a/tests/loop.sh b/tests/loop.sh new file mode 100755 index 0000000..98f81b8 --- /dev/null +++ b/tests/loop.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +# +# Watch for file changes, re-run tests, land on debuggers. +# + +find .. -name "*.py" -o -name "*.js" | entr -c sh -c 'poetry run pytest --color=yes' + From e611e0d2b40d59126b1b7f06b0763c424b14e98c Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Sun, 9 Jun 2024 16:22:09 -0400 Subject: [PATCH 05/47] feat(js_object.py): make generic js obj wrapper for api usage Wraps functions which return awaitables for use in a blocking fashion while still providing access to them via an aio submodule of each class. --- README.md | 5 + dcp/__init__.py | 57 +- dcp/dcp_client_js/__init__.py | 4 + dcp/dcp_client_js/load_dcp_client.py | 4 + dcp/dcp_client_js/package-lock.json | 53 + dcp/dcp_client_js/package.json | 5 + dcp/js/load_dcp_client.py | 3 - dcp/js/package-lock.json | 2401 ----------------- dcp/js/package.json | 5 - dcp/js_wrappers/__init__.py | 4 + .../js_function.py} | 0 dcp/js_wrappers/js_module.py | 0 dcp/js_wrappers/js_object.py | 67 + tests/loop.sh | 2 +- tests/test_init.py | 19 + tests/test_insanity.py | 14 - tests/test_js_wrappers/__init__.py | 0 tests/test_js_wrappers/test_js_object.py | 92 + tests/test_sanity.py | 4 +- 19 files changed, 299 insertions(+), 2440 deletions(-) create mode 100644 dcp/dcp_client_js/__init__.py create mode 100644 dcp/dcp_client_js/load_dcp_client.py create mode 100644 dcp/dcp_client_js/package-lock.json create mode 100644 dcp/dcp_client_js/package.json delete mode 100644 dcp/js/load_dcp_client.py delete mode 100644 dcp/js/package-lock.json delete mode 100644 dcp/js/package.json create mode 100644 dcp/js_wrappers/__init__.py rename dcp/{js/__init__.py => js_wrappers/js_function.py} (100%) create mode 100644 dcp/js_wrappers/js_module.py create mode 100644 dcp/js_wrappers/js_object.py create mode 100644 tests/test_init.py delete mode 100644 tests/test_insanity.py create mode 100644 tests/test_js_wrappers/__init__.py create mode 100644 tests/test_js_wrappers/test_js_object.py diff --git a/README.md b/README.md index 9129ec6..4eba10b 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,8 @@ Install [Poetry](https://python-poetry.org/), then in the root of the project di Verify your installation is correct by running the test suite: - `$ poetry run pytest` +## Tests + +Run tests with: +- `$ poetry run pytest` + diff --git a/dcp/__init__.py b/dcp/__init__.py index 8b7ff04..5e16bf6 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -1,15 +1,42 @@ -def init(function_names): - """ - Dynamically adds functions to the dcp module. - - Args: - function_names (list of str): List of function names to add. - """ - import sys - module = sys.modules[__name__] - - for name in function_names: - # Create a function that returns True - func = lambda: True - # Assign the function to the module with the given name - setattr(module, name, func) +import sys +from types import ModuleType as Module + +import pythonmonkey as pm + +from .sanity import sanity +from .dcp_client_js import dcp_js + +# state +init_memo = None + + +def init(**kwargs): + global init_memo + + # no-op on multiple initializations + if init_memo is not None: + return init_memo + + # initialize dcp + dcp_js['init'](**kwargs) + init_memo = True + + # build dcp modules + for name in pm.globalThis.dcp.keys(): + module_tree(sys.modules[__name__], pm.globalThis.dcp[name], name) + + print(dir(sys.modules[__name__])) + + +def module_tree(py_parent, js_child, js_name): + underscore_name = f"{js_name.replace('-', '_')}" + module_name = f"{py_parent.__name__}.{underscore_name}" + module = Module(module_name) + module.__file__ = f"" + module._js = js_child + sys.modules[module_name] = module + setattr(py_parent, underscore_name, module) + + +__all__ = ["init", "sanity"] + diff --git a/dcp/dcp_client_js/__init__.py b/dcp/dcp_client_js/__init__.py new file mode 100644 index 0000000..c8a9d38 --- /dev/null +++ b/dcp/dcp_client_js/__init__.py @@ -0,0 +1,4 @@ +from .load_dcp_client import dcp_js + +__all__ = ["dcp_js"] + diff --git a/dcp/dcp_client_js/load_dcp_client.py b/dcp/dcp_client_js/load_dcp_client.py new file mode 100644 index 0000000..329dad8 --- /dev/null +++ b/dcp/dcp_client_js/load_dcp_client.py @@ -0,0 +1,4 @@ +import pythonmonkey as pm + +dcp_js = pm.require('dcp-client') + diff --git a/dcp/dcp_client_js/package-lock.json b/dcp/dcp_client_js/package-lock.json new file mode 100644 index 0000000..e798bbc --- /dev/null +++ b/dcp/dcp_client_js/package-lock.json @@ -0,0 +1,53 @@ +{ + "name": "js", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "dcp-client": "file:../../../dcp-client" + } + }, + "../../../dcp-client": { + "version": "4.4.3", + "license": "MIT", + "dependencies": { + "@kingsds/socket.io-client": "^4.5.4", + "@kingsds/xmlhttprequest-ssl": "^2.1.0", + "atob": "2.1.2", + "bravojs": "^1.0.16", + "btoa": "^1.2.1", + "chalk": "^4.1.2", + "ethereumjs-util": "^7.1.5", + "ethereumjs-wallet": "^1.0.2", + "html-to-text": "^5.1.1", + "http-proxy-agent": "^4.0.1", + "https-agent": "^1.0.0", + "https-proxy-agent": "^5.0.0", + "kvin": "^1.2.13", + "nanoid": "^3.2.0", + "physical-cpu-count": "^2.0.0", + "polyfill-crypto.getrandomvalues": "^1.0.0", + "regedit": "^3.0.3", + "semver": "^7.3.5", + "webpack": "^5.79.0", + "webpack-cli": "^4.7.2", + "yargs": "16.2.0" + }, + "devDependencies": { + "@kingsds/eslint-config": "1.0.1", + "eslint": "7.30.0", + "express": "^4.18.2", + "peter": "2.4.3" + }, + "engines": { + "node": ">=18", + "npm": ">=7" + } + }, + "node_modules/dcp-client": { + "resolved": "../../../dcp-client", + "link": true + } + } +} diff --git a/dcp/dcp_client_js/package.json b/dcp/dcp_client_js/package.json new file mode 100644 index 0000000..cfb8f46 --- /dev/null +++ b/dcp/dcp_client_js/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "dcp-client": "file:../../../dcp-client" + } +} diff --git a/dcp/js/load_dcp_client.py b/dcp/js/load_dcp_client.py deleted file mode 100644 index 45cb446..0000000 --- a/dcp/js/load_dcp_client.py +++ /dev/null @@ -1,3 +0,0 @@ -import pythonmonkey as pm - - diff --git a/dcp/js/package-lock.json b/dcp/js/package-lock.json deleted file mode 100644 index 31b1262..0000000 --- a/dcp/js/package-lock.json +++ /dev/null @@ -1,2401 +0,0 @@ -{ - "name": "_js", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "dcp-client": "^4.4.4" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kingsds/engine.io-client": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/@kingsds/engine.io-client/-/engine.io-client-6.2.3.tgz", - "integrity": "sha512-7+JgbK/uEMzVT14SvELTJny6vaWpiDA4zyBdzobCJ20Huym21yjnWw01bZzuCb/b0P/5Wz1SB/UNivIRUM0O/A==", - "dependencies": { - "@kingsds/xmlhttprequest-ssl": "^2.1.0", - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.2.3" - } - }, - "node_modules/@kingsds/engine.io-client/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@kingsds/engine.io-client/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@kingsds/socket.io-client": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/@kingsds/socket.io-client/-/socket.io-client-4.5.4.tgz", - "integrity": "sha512-R2/O3nqDmVSYvfJUjEZ+snprL1o+l3xBOEal7jeMaY6huZJbXNhp1/HzKd+YqcMJTKxWT3iBzXzWwZBAS+vSLQ==", - "dependencies": { - "@kingsds/engine.io-client": "^6.2.3", - "@socket.io/component-emitter": "~3.1.0", - "debug": "^3.2.7", - "socket.io-parser": "~4.2.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@kingsds/xmlhttprequest-ssl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@kingsds/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz", - "integrity": "sha512-gxDD8VnHc83E5jS17iDpJzhd489panYtw/Kyh+W0BdFNTBpUa2nSITSZvBWDchMGrhaJ/Ha5PeXHhaJ2xn3Zgw==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/bn.js": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", - "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" - }, - "node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/secp256k1": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/aes-js": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz", - "integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/bravojs": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/bravojs/-/bravojs-1.0.16.tgz", - "integrity": "sha512-08N9nBCErNicgD70SiIpXzuzr9wkkAevpBTlOczesmwnSOjzYqucG4L5KxaXSMXPx5N4I+Ot5T2o6Yo1x5XKrw==" - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/btoa": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", - "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", - "bin": { - "btoa": "bin/btoa.js" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001629", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001629.tgz", - "integrity": "sha512-c3dl911slnQhmxUIT4HhYzT7wnBK/XYpGnYLOj4nJBaRiw52Ibe7YxlDaAeRECvA786zCuExhxIUJ2K7nHMrBw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/dcp-client": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/dcp-client/-/dcp-client-4.4.4.tgz", - "integrity": "sha512-fDZkl0SATOC2mimpw0Cm/9QQHMBH1epicM0ixvISmEPtiSQXZ6/K+fs82KXsLy6kB0YaD/x805IKD/hVx5Gxyg==", - "dependencies": { - "@kingsds/socket.io-client": "^4.5.4", - "@kingsds/xmlhttprequest-ssl": "^2.1.0", - "atob": "2.1.2", - "bravojs": "^1.0.16", - "btoa": "^1.2.1", - "chalk": "^4.1.2", - "ethereumjs-util": "^7.1.5", - "ethereumjs-wallet": "^1.0.2", - "html-to-text": "^5.1.1", - "http-proxy-agent": "^4.0.1", - "https-agent": "^1.0.0", - "https-proxy-agent": "^5.0.0", - "kvin": "^1.2.13", - "nanoid": "^3.2.0", - "node-localstorage": "^2.1.5", - "physical-cpu-count": "^2.0.0", - "polyfill-crypto.getrandomvalues": "^1.0.0", - "regedit": "^3.0.3", - "semver": "^7.3.5", - "webpack": "^5.79.0", - "webpack-cli": "^4.7.2", - "yargs": "16.2.0" - }, - "engines": { - "node": ">=18", - "npm": ">=7" - } - }, - "node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.796", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.796.tgz", - "integrity": "sha512-NglN/xprcM+SHD2XCli4oC6bWe6kHoytcyLKCWXmRL854F0qhPhaYgUswUsglnPxYaNQIg2uMY4BvaomIf3kLA==" - }, - "node_modules/elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/engine.io-parser": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", - "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/envinfo": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", - "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==" - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ethereumjs-wallet": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ethereumjs-wallet/-/ethereumjs-wallet-1.0.2.tgz", - "integrity": "sha512-CCWV4RESJgRdHIvFciVQFnCHfqyhXWchTPlkfp28Qc53ufs+doi5I/cV2+xeK9+qEo25XCWfP9MiL+WEPAZfdA==", - "dependencies": { - "aes-js": "^3.1.2", - "bs58check": "^2.1.2", - "ethereum-cryptography": "^0.1.3", - "ethereumjs-util": "^7.1.2", - "randombytes": "^2.1.0", - "scrypt-js": "^3.0.1", - "utf8": "^3.0.0", - "uuid": "^8.3.2" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/html-to-text": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", - "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", - "dependencies": { - "he": "^1.2.0", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.11", - "minimist": "^1.2.0" - }, - "bin": { - "html-to-text": "bin/cli.js" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/https-agent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-agent/-/https-agent-1.0.0.tgz", - "integrity": "sha512-Y55aWtVwkhb1hDKZ6GMjY0hcUxMpjgxtP4i+EWqYDQktT7Qsx2yPWio6dcSuhQxyUHoZ1FHlpGK4Bfva5BhyIw==", - "dependencies": { - "tunnel": "^0.0.3" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/if-async": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/if-async/-/if-async-3.7.4.tgz", - "integrity": "sha512-BFEH2mZyeF6KZKaKLVPZ0wMjIiWOdjvZ7zbx8ENec0qfZhJwKFbX/4jKM5LTKyJEc/GOqUKiiJ2IFKT9yWrZqA==" - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kvin": { - "version": "1.2.14", - "resolved": "https://registry.npmjs.org/kvin/-/kvin-1.2.14.tgz", - "integrity": "sha512-xGcVUdyH/4UOQnhNOEpY6VlSjS9LWRlBj50T/qmRDo8Hby1cnFT6Iwxtg4K9gHDLFJfaJd0MODa1e5q8vEi5Ug==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/mersenne-twister": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mersenne-twister/-/mersenne-twister-1.1.0.tgz", - "integrity": "sha512-mUYWsMKNrm4lfygPkL3OfGzOPTR2DBlTkBNHM//F6hGp8cLThY897crAlk3/Jo17LEOOjQUrNAx6DvgO77QJkA==" - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-localstorage": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-localstorage/-/node-localstorage-2.2.1.tgz", - "integrity": "sha512-vv8fJuOUCCvSPjDjBLlMqYMHob4aGjkmrkaE42/mZr0VT+ZAU10jRF8oTnX9+pgU9/vYJ8P7YT3Vd6ajkmzSCw==", - "dependencies": { - "write-file-atomic": "^1.1.4" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/physical-cpu-count": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz", - "integrity": "sha512-rxJOljMuWtYlvREBmd6TZYanfcPhNUKtGDZBjBBS8WG1dpN2iwPsRJZgQqN/OtJuiQckdRFOfzogqJClTrsi7g==" - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/polyfill-crypto.getrandomvalues": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/polyfill-crypto.getrandomvalues/-/polyfill-crypto.getrandomvalues-1.0.0.tgz", - "integrity": "sha512-GIkU6bg4auRnDFOqUNit7eLn9hzznrJU1CGFuivQzDeVp4Ys8cY4OY6GhAdndJwo4jryz5cJyjg9ELhvQjdrtw==", - "dependencies": { - "mersenne-twister": "^1.0.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regedit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/regedit/-/regedit-3.0.3.tgz", - "integrity": "sha512-SpHmMKOtiEYx0MiRRC48apBsmThoZ4svZNsYoK8leHd5bdUHV1nYb8pk8gh6Moou7/S9EDi1QsjBTpyXVQrPuQ==", - "dependencies": { - "debug": "^4.1.0", - "if-async": "^3.7.4", - "stream-slicer": "0.0.6", - "through2": "^0.6.3" - } - }, - "node_modules/regedit/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/regedit/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", - "engines": { - "node": "*" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-parser/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/stream-slicer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/stream-slicer/-/stream-slicer-0.0.6.tgz", - "integrity": "sha512-QsY0LbweYE5L+e+iBQgtkM5WUIf7+kCMA/m2VULv8rEEDDnlDPsPvOHH4nli6uaZOKQEt64u65h0l/eeZo7lCw==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/tunnel": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.3.tgz", - "integrity": "sha512-YohLhrnpZrbzloZ4AOHh+zKgGrkNO5LDw72UMhfGPC4ccHnNAyimzEb0RMZgqAIuR+PqXO4BzRhaqsv8UBw13Q==", - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack": { - "version": "5.91.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", - "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.16.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha512-SdrHoC/yVBPpV0Xq/mUZQIpW2sWXAShb/V4pomcJXh92RuaO+f3UTWItiR3Px+pLnV2PvC2/bfn5cwr5X6Vfxw==", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, - "node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - } - } -} diff --git a/dcp/js/package.json b/dcp/js/package.json deleted file mode 100644 index 5d5f473..0000000 --- a/dcp/js/package.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "dependencies": { - "dcp-client": "^4.4.4" - } -} diff --git a/dcp/js_wrappers/__init__.py b/dcp/js_wrappers/__init__.py new file mode 100644 index 0000000..4247f92 --- /dev/null +++ b/dcp/js_wrappers/__init__.py @@ -0,0 +1,4 @@ +from .js_object import create_js_class + +__all__ = ['create_js_class'] + diff --git a/dcp/js/__init__.py b/dcp/js_wrappers/js_function.py similarity index 100% rename from dcp/js/__init__.py rename to dcp/js_wrappers/js_function.py diff --git a/dcp/js_wrappers/js_module.py b/dcp/js_wrappers/js_module.py new file mode 100644 index 0000000..e69de29 diff --git a/dcp/js_wrappers/js_object.py b/dcp/js_wrappers/js_object.py new file mode 100644 index 0000000..5a079bc --- /dev/null +++ b/dcp/js_wrappers/js_object.py @@ -0,0 +1,67 @@ +# @file js_object.py - Wrapper Class for DCP JS Classes +# +# @author Will Pringle +# @date June 2024 + +import asyncio +import pythonmonkey as pm + + +def create_js_class(name, js_class, props={}, aio_methods=[], aio_ctor=False): + class AsyncIOMethods: + def __init__(self, parent): + self.parent = parent + + def __getattr__(self, name): + js_attr = self.parent.js_ref[name] + + if name in aio_methods: + return aio_run_wrapper(js_attr) + + def __init__(self, *args, **kwargs): + if (aio_ctor): + async_wrapped_ctor = aio_run_wrapper(pm.new(js_class)) + self.js_ref = asyncio.run(async_wrapped_ctor(*args, **kwargs)) + else: + self.js_ref = pm.new(js_class)(*args, **kwargs) + + self.aio = AsyncIOMethods(self) + + def __getattr__(self, name): + js_attr = self.js_ref[name] + + if (not callable(js_attr)): + return js_attr + + def method(*args, **kwargs): + if (name in aio_methods): + aio_attr = getattr(self.aio, name) + return asyncio.run(aio_attr(*args, **kwargs)) + + return js_attr(*args, **kwargs) + + return method + + def __setattr__(self, name, value): + if name == 'js_ref': + object.__setattr__(self, name, value) + else: + self.js_ref[name] = value + + def __str__(self): + return str(self.js_ref) + + props['__init__'] = __init__ + props['__getattr__'] = __getattr__ + props['__setattr__'] = __setattr__ + props['__str__'] = __str__ + new_class = type(name, (object,), props) + + return new_class + + +def aio_run_wrapper(leaky_async_fn): + async def aio_fn(*args, **kwargs): + return await leaky_async_fn(*args, **kwargs) + return aio_fn + diff --git a/tests/loop.sh b/tests/loop.sh index 98f81b8..bcad2a0 100755 --- a/tests/loop.sh +++ b/tests/loop.sh @@ -4,5 +4,5 @@ # Watch for file changes, re-run tests, land on debuggers. # -find .. -name "*.py" -o -name "*.js" | entr -c sh -c 'poetry run pytest --color=yes' +find .. -name "*.py" -o -name "*.js" | entr -c sh -c 'poetry run pytest --color=yes -s' diff --git a/tests/test_init.py b/tests/test_init.py new file mode 100644 index 0000000..c1ed200 --- /dev/null +++ b/tests/test_init.py @@ -0,0 +1,19 @@ +import unittest +import dcp + + +class TestDcpInitFunction(unittest.TestCase): + def test_init_exists(self): + self.assertTrue(hasattr(dcp, 'init')) + + def test_init(self): + dcp.init() + + def test_init_twice(self): + dcp.init() + dcp.init() + + +if __name__ == '__main__': + unittest.main() + diff --git a/tests/test_insanity.py b/tests/test_insanity.py deleted file mode 100644 index 05bb53a..0000000 --- a/tests/test_insanity.py +++ /dev/null @@ -1,14 +0,0 @@ -# tests/test_sanity.py - -import unittest -import dcp - -class TestInSanityFunction(unittest.TestCase): - def test_insanity_returns_true(self): - """Test if the sanity function returns True.""" - dcp.init(['will', 'pringle']) - self.assertTrue(dcp.will) - self.assertTrue(dcp.pringle) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/test_js_wrappers/__init__.py b/tests/test_js_wrappers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_js_wrappers/test_js_object.py b/tests/test_js_wrappers/test_js_object.py new file mode 100644 index 0000000..8faf58b --- /dev/null +++ b/tests/test_js_wrappers/test_js_object.py @@ -0,0 +1,92 @@ +import unittest +import asyncio +import inspect +import pythonmonkey as pm +from dcp.js_wrappers import create_js_class as make_class + + +class TestJSObjectFunction(unittest.TestCase): + def test_simple_class(self): + JSRect = pm.eval(""" +class Rectangle +{ + constructor(height, width) + { + this.height = height; + this.width = width; + } + get area() + { + return this.calcArea(); + } + calcArea() + { + return this.height * this.width; + } +} +Rectangle; + """) + + PyRect = make_class('PyRect', JSRect) + my_rect = PyRect(2, 7) + + self.assertTrue(my_rect.area == 2 * 7) + self.assertTrue(my_rect.calcArea() == 2 * 7) + return True + + def test_aio_methods(self): + MyClass = pm.eval(""" +class Coffee +{ + // brews & returns how long it took to brew + async brew(ms) + { + return new Promise((resolve) => { + setTimeout(() => resolve(ms), ms); + }); + } +} +Coffee; + """) + + Coffee = make_class('Coffee', MyClass, aio_methods=["brew"]) + cup_of_joe = Coffee() + + # should be able to sleep synchronously + resp = cup_of_joe.brew(11) + self.assertTrue(resp, 11) + + # should be able to asynchronously await .brew as well + resp = cup_of_joe.aio.brew(13) + self.assertTrue(inspect.isawaitable(resp)) + self.assertTrue(asyncio.run(resp), 13) + + def test_aio_ctor(self): + + Human = pm.eval(""" +class Human +{ + // births a baby, has to be awaited until born + constructor(name) + { + this.name = name; + const that = this; + return new Promise((resolve) => { + setTimeout(() => resolve(that), 9); + }); + } +} +Human; + """) + + HumanPy = make_class('Human', Human, aio_ctor=True) + + # verify constructor promise has been resolved + baby = HumanPy('Joe') + self.assertTrue(not inspect.isawaitable(baby)) + self.assertTrue(baby.name == 'Joe') + + +if __name__ == '__main__': + unittest.main() + diff --git a/tests/test_sanity.py b/tests/test_sanity.py index 2aff244..bb35eb5 100644 --- a/tests/test_sanity.py +++ b/tests/test_sanity.py @@ -1,12 +1,14 @@ # tests/test_sanity.py import unittest -from dcp.sanity import sanity +from dcp import sanity + class TestSanityFunction(unittest.TestCase): def test_sanity_returns_true(self): """Test if the sanity function returns True.""" self.assertTrue(sanity()) + if __name__ == '__main__': unittest.main() From 01d12c87912b5282465a47612fe986c1f801e9bf Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Sun, 9 Jun 2024 17:59:22 -0400 Subject: [PATCH 06/47] docs(js_object.py): add comments describing js_object --- dcp/js_wrappers/js_object.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/dcp/js_wrappers/js_object.py b/dcp/js_wrappers/js_object.py index 5a079bc..5d6e8c1 100644 --- a/dcp/js_wrappers/js_object.py +++ b/dcp/js_wrappers/js_object.py @@ -1,4 +1,13 @@ # @file js_object.py - Wrapper Class for DCP JS Classes +# PythonMonkey's async functions leak, by design, meaning calling +# a function which returns a promise will immediately require usage +# of an event loop or will otherwise error. Therefore, not only +# are async functions block waited, but are also wrapped for use +# with the aio subcomponent. +# +# For example: job.aio.exec will return an awaitable but job.exec +# will block until the true value is returned which the awaitable +# awaits to. # # @author Will Pringle # @date June 2024 @@ -8,6 +17,19 @@ def create_js_class(name, js_class, props={}, aio_methods=[], aio_ctor=False): + """ + Factory of Classes function for generating pleasant proxies to JS Classes. + + Parameters: + name (string): The name of the new class to make. + js_class (function): The JavaScript class to wrap. + props (dict, optional): Properties to add to the class. + aio_methods (list, optional): List of asynchronous method names to wrap. + aio_ctor (bool, optional): Whether the JS constructor is async. + + Returns: + type: A new Python class which wraps the given JavaScript class. + """ class AsyncIOMethods: def __init__(self, parent): self.parent = parent From c5eeaa1495ea47771bcc9c395b85b7fa8496c108 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Sun, 9 Jun 2024 22:26:42 -0400 Subject: [PATCH 07/47] feat(js_object.py): make wrapper from js instance --- dcp/js_wrappers/__init__.py | 4 +- dcp/js_wrappers/js_object.py | 80 +++++++++++++++++------- tests/test_js_wrappers/test_js_object.py | 23 +++++-- 3 files changed, 78 insertions(+), 29 deletions(-) diff --git a/dcp/js_wrappers/__init__.py b/dcp/js_wrappers/__init__.py index 4247f92..39bf8af 100644 --- a/dcp/js_wrappers/__init__.py +++ b/dcp/js_wrappers/__init__.py @@ -1,4 +1,4 @@ -from .js_object import create_js_class +from .js_object import make_dcp_class, wrap_js_obj -__all__ = ['create_js_class'] +__all__ = ['make_dcp_class', 'wrap_js_obj'] diff --git a/dcp/js_wrappers/js_object.py b/dcp/js_wrappers/js_object.py index 5d6e8c1..365e49a 100644 --- a/dcp/js_wrappers/js_object.py +++ b/dcp/js_wrappers/js_object.py @@ -1,47 +1,56 @@ # @file js_object.py - Wrapper Class for DCP JS Classes # PythonMonkey's async functions leak, by design, meaning calling -# a function which returns a promise will immediately require usage -# of an event loop or will otherwise error. Therefore, not only -# are async functions block waited, but are also wrapped for use -# with the aio subcomponent. +# a function which returns a promise will immediately require +# usage of an event loop or will otherwise error. Therefore, not +# only are async functions block waited, but are also wrapped for +# use with the aio subcomponent. # # For example: job.aio.exec will return an awaitable but job.exec # will block until the true value is returned which the awaitable # awaits to. # +# @TODO Should be more modular - also, needs to account for dcp object +# instances returned from methods better. +# # @author Will Pringle # @date June 2024 import asyncio +import types import pythonmonkey as pm -def create_js_class(name, js_class, props={}, aio_methods=[], aio_ctor=False): +def make_dcp_class(js_class, **kwargs): """ Factory of Classes function for generating pleasant proxies to JS Classes. Parameters: - name (string): The name of the new class to make. js_class (function): The JavaScript class to wrap. + name (string: optional): The name of the new class to make. props (dict, optional): Properties to add to the class. aio_methods (list, optional): List of asynchronous method names to wrap. aio_ctor (bool, optional): Whether the JS constructor is async. + force_blocking (list, optional): List certain methods as blocking. + js_instance (JSObjectProxy, optional): set a specific JS ref for the class. Returns: type: A new Python class which wraps the given JavaScript class. """ - class AsyncIOMethods: - def __init__(self, parent): - self.parent = parent - - def __getattr__(self, name): - js_attr = self.parent.js_ref[name] - if name in aio_methods: - return aio_run_wrapper(js_attr) + optional_defaults = { + 'name': js_class_name(js_class), + 'props': {}, + 'aio_methods': [], + 'aio_ctor': False, + 'force_blocking': [], + 'js_instance': None, + } + opts = types.SimpleNamespace(**{**optional_defaults, **kwargs}) def __init__(self, *args, **kwargs): - if (aio_ctor): + if opts.js_instance is not None: + self.js_ref = opts.js_instance + elif (opts.aio_ctor): async_wrapped_ctor = aio_run_wrapper(pm.new(js_class)) self.js_ref = asyncio.run(async_wrapped_ctor(*args, **kwargs)) else: @@ -53,13 +62,15 @@ def __getattr__(self, name): js_attr = self.js_ref[name] if (not callable(js_attr)): + # If it returns a js type, wrap it... + if isinstance(js_attr, pm.JSObjectProxy): + return wrap_js_obj(js_attr) return js_attr def method(*args, **kwargs): - if (name in aio_methods): + if (name in opts.aio_methods or name in opts.force_blocking): aio_attr = getattr(self.aio, name) return asyncio.run(aio_attr(*args, **kwargs)) - return js_attr(*args, **kwargs) return method @@ -73,17 +84,42 @@ def __setattr__(self, name, value): def __str__(self): return str(self.js_ref) - props['__init__'] = __init__ - props['__getattr__'] = __getattr__ - props['__setattr__'] = __setattr__ - props['__str__'] = __str__ - new_class = type(name, (object,), props) + opts.props['__init__'] = __init__ + opts.props['__getattr__'] = __getattr__ + opts.props['__setattr__'] = __setattr__ + opts.props['__str__'] = __str__ + new_class = type(opts.name, (object,), opts.props) return new_class +class AsyncIOMethods: + def __init__(self, parent): + self.parent = parent + + def __getattr__(self, name): + js_attr = self.parent.js_ref[name] + return aio_run_wrapper(js_attr) + + +def wrap_js_obj(js_obj, **kwargs): + if not isinstance(js_obj, pm.JSObjectProxy): + return js_obj + + JSClass = pm.eval('x=>x.constructor')(js_obj, **kwargs) + DCPClass = make_dcp_class(JSClass, js_instance=js_obj) + + generic_obj = DCPClass() + + return generic_obj + + def aio_run_wrapper(leaky_async_fn): async def aio_fn(*args, **kwargs): return await leaky_async_fn(*args, **kwargs) return aio_fn + +def js_class_name(JSClass): + return pm.eval('x=>x.name')(JSClass) + diff --git a/tests/test_js_wrappers/test_js_object.py b/tests/test_js_wrappers/test_js_object.py index 8faf58b..41f556d 100644 --- a/tests/test_js_wrappers/test_js_object.py +++ b/tests/test_js_wrappers/test_js_object.py @@ -2,7 +2,9 @@ import asyncio import inspect import pythonmonkey as pm -from dcp.js_wrappers import create_js_class as make_class +import dcp +from dcp.js_wrappers import make_dcp_class as make_class +from dcp.js_wrappers import wrap_js_obj class TestJSObjectFunction(unittest.TestCase): @@ -27,7 +29,7 @@ class Rectangle Rectangle; """) - PyRect = make_class('PyRect', JSRect) + PyRect = make_class(JSRect) my_rect = PyRect(2, 7) self.assertTrue(my_rect.area == 2 * 7) @@ -49,7 +51,7 @@ class Coffee Coffee; """) - Coffee = make_class('Coffee', MyClass, aio_methods=["brew"]) + Coffee = make_class(MyClass, aio_methods=["brew"]) cup_of_joe = Coffee() # should be able to sleep synchronously @@ -62,7 +64,6 @@ class Coffee self.assertTrue(asyncio.run(resp), 13) def test_aio_ctor(self): - Human = pm.eval(""" class Human { @@ -79,13 +80,25 @@ class Human Human; """) - HumanPy = make_class('Human', Human, aio_ctor=True) + HumanPy = make_class(Human, aio_ctor=True) # verify constructor promise has been resolved baby = HumanPy('Joe') self.assertTrue(not inspect.isawaitable(baby)) self.assertTrue(baby.name == 'Joe') + def test_wrapping_js_instance(self): + hex_code = '0x1111222233334444555566667777888899990000' + dcp.init() + Address = pm.globalThis.dcp.wallet.Address + + make_class(Address) + + address = pm.new(Address)(hex_code) + py_obj = wrap_js_obj(address) + + self.assertTrue(py_obj.address == hex_code) + if __name__ == '__main__': unittest.main() From d42ea70404bc4bb3b21b2d0e4ea7a44bd3ff5357 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Sat, 15 Jun 2024 21:00:41 -0400 Subject: [PATCH 08/47] refactor(*): reorg structure --- dcp/__init__.py | 2 +- dcp/dcp_client_js/__init__.py | 4 ---- dcp/dcp_client_js/load_dcp_client.py | 4 ---- dcp/{js_wrappers => dry}/__init__.py | 0 dcp/{js_wrappers => dry}/js_function.py | 0 dcp/{js_wrappers => dry}/js_module.py | 0 dcp/{js_wrappers => dry}/js_object.py | 0 dcp/js/__init__.py | 4 ++++ dcp/js/load_dcp_client.py | 4 ++++ dcp/{dcp_client_js => js}/package-lock.json | 2 +- dcp/{dcp_client_js => js}/package.json | 0 tests/test_js_wrappers/test_js_object.py | 4 ++-- 12 files changed, 12 insertions(+), 12 deletions(-) delete mode 100644 dcp/dcp_client_js/__init__.py delete mode 100644 dcp/dcp_client_js/load_dcp_client.py rename dcp/{js_wrappers => dry}/__init__.py (100%) rename dcp/{js_wrappers => dry}/js_function.py (100%) rename dcp/{js_wrappers => dry}/js_module.py (100%) rename dcp/{js_wrappers => dry}/js_object.py (100%) create mode 100644 dcp/js/__init__.py create mode 100644 dcp/js/load_dcp_client.py rename dcp/{dcp_client_js => js}/package-lock.json (98%) rename dcp/{dcp_client_js => js}/package.json (100%) diff --git a/dcp/__init__.py b/dcp/__init__.py index 5e16bf6..5fb22e4 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -4,7 +4,7 @@ import pythonmonkey as pm from .sanity import sanity -from .dcp_client_js import dcp_js +from .js import dcp_client as dcp_js # state init_memo = None diff --git a/dcp/dcp_client_js/__init__.py b/dcp/dcp_client_js/__init__.py deleted file mode 100644 index c8a9d38..0000000 --- a/dcp/dcp_client_js/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from .load_dcp_client import dcp_js - -__all__ = ["dcp_js"] - diff --git a/dcp/dcp_client_js/load_dcp_client.py b/dcp/dcp_client_js/load_dcp_client.py deleted file mode 100644 index 329dad8..0000000 --- a/dcp/dcp_client_js/load_dcp_client.py +++ /dev/null @@ -1,4 +0,0 @@ -import pythonmonkey as pm - -dcp_js = pm.require('dcp-client') - diff --git a/dcp/js_wrappers/__init__.py b/dcp/dry/__init__.py similarity index 100% rename from dcp/js_wrappers/__init__.py rename to dcp/dry/__init__.py diff --git a/dcp/js_wrappers/js_function.py b/dcp/dry/js_function.py similarity index 100% rename from dcp/js_wrappers/js_function.py rename to dcp/dry/js_function.py diff --git a/dcp/js_wrappers/js_module.py b/dcp/dry/js_module.py similarity index 100% rename from dcp/js_wrappers/js_module.py rename to dcp/dry/js_module.py diff --git a/dcp/js_wrappers/js_object.py b/dcp/dry/js_object.py similarity index 100% rename from dcp/js_wrappers/js_object.py rename to dcp/dry/js_object.py diff --git a/dcp/js/__init__.py b/dcp/js/__init__.py new file mode 100644 index 0000000..4f2a2bc --- /dev/null +++ b/dcp/js/__init__.py @@ -0,0 +1,4 @@ +from .load_dcp_client import dcp_client + +__all__ = ["dcp_client"] + diff --git a/dcp/js/load_dcp_client.py b/dcp/js/load_dcp_client.py new file mode 100644 index 0000000..6efcfcd --- /dev/null +++ b/dcp/js/load_dcp_client.py @@ -0,0 +1,4 @@ +import pythonmonkey as pm + +dcp_client = pm.require('dcp-client') + diff --git a/dcp/dcp_client_js/package-lock.json b/dcp/js/package-lock.json similarity index 98% rename from dcp/dcp_client_js/package-lock.json rename to dcp/js/package-lock.json index e798bbc..a205352 100644 --- a/dcp/dcp_client_js/package-lock.json +++ b/dcp/js/package-lock.json @@ -1,5 +1,5 @@ { - "name": "js", + "name": "dcp_client_js", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/dcp/dcp_client_js/package.json b/dcp/js/package.json similarity index 100% rename from dcp/dcp_client_js/package.json rename to dcp/js/package.json diff --git a/tests/test_js_wrappers/test_js_object.py b/tests/test_js_wrappers/test_js_object.py index 41f556d..9520dfd 100644 --- a/tests/test_js_wrappers/test_js_object.py +++ b/tests/test_js_wrappers/test_js_object.py @@ -3,8 +3,8 @@ import inspect import pythonmonkey as pm import dcp -from dcp.js_wrappers import make_dcp_class as make_class -from dcp.js_wrappers import wrap_js_obj +from dcp.dry import make_dcp_class as make_class +from dcp.dry import wrap_js_obj class TestJSObjectFunction(unittest.TestCase): From 6cf72713bfb1b5167e2600411e545ca9a38a7d83 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Sun, 16 Jun 2024 14:33:29 -0400 Subject: [PATCH 09/47] feat(class registry): add basic class registry --- dcp/__init__.py | 2 ++ dcp/dry/__init__.py | 2 +- dcp/dry/{js_object.py => bfclass.py} | 8 +------ dcp/dry/classes.py | 32 ++++++++++++++++++++++++++++ dcp/dry/fn.py | 19 +++++++++++++++++ dcp/dry/js_function.py | 0 dcp/dry/js_module.py | 0 7 files changed, 55 insertions(+), 8 deletions(-) rename dcp/dry/{js_object.py => bfclass.py} (96%) create mode 100644 dcp/dry/classes.py create mode 100644 dcp/dry/fn.py delete mode 100644 dcp/dry/js_function.py delete mode 100644 dcp/dry/js_module.py diff --git a/dcp/__init__.py b/dcp/__init__.py index 5fb22e4..69822b1 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -1,3 +1,5 @@ +# NOTE TO SELF - have to load class registry before classes that use it + import sys from types import ModuleType as Module diff --git a/dcp/dry/__init__.py b/dcp/dry/__init__.py index 39bf8af..490a28c 100644 --- a/dcp/dry/__init__.py +++ b/dcp/dry/__init__.py @@ -1,4 +1,4 @@ -from .js_object import make_dcp_class, wrap_js_obj +from .bfclass import make_dcp_class, wrap_js_obj __all__ = ['make_dcp_class', 'wrap_js_obj'] diff --git a/dcp/dry/js_object.py b/dcp/dry/bfclass.py similarity index 96% rename from dcp/dry/js_object.py rename to dcp/dry/bfclass.py index 365e49a..e21356e 100644 --- a/dcp/dry/js_object.py +++ b/dcp/dry/bfclass.py @@ -19,6 +19,7 @@ import types import pythonmonkey as pm +from .fn import aio_run_wrapper, blocking_run_wrapper def make_dcp_class(js_class, **kwargs): """ @@ -113,13 +114,6 @@ def wrap_js_obj(js_obj, **kwargs): return generic_obj - -def aio_run_wrapper(leaky_async_fn): - async def aio_fn(*args, **kwargs): - return await leaky_async_fn(*args, **kwargs) - return aio_fn - - def js_class_name(JSClass): return pm.eval('x=>x.name')(JSClass) diff --git a/dcp/dry/classes.py b/dcp/dry/classes.py new file mode 100644 index 0000000..2a7e027 --- /dev/null +++ b/dcp/dry/classes.py @@ -0,0 +1,32 @@ +import pythonmonkey as pm + +class ClassRegistry: + def __init__(self): + self._list = [] + + def register(self, bfclass): + self._list.append(bfclass) + + def find(self, needle, cmp): + for bfclass in self._list: + if cmp(needle, bfclass): + return bfclass + return None + + def find_class_from_js_instance(self, js_instance): + js_instanceof = pm.eval('(i,c) => i instanceof c') + return self.find(js_instance, lambda i,c : js_instanceof(i, c.js_ref)) + + def find_class_from_name(self, name): + return self.find(name, lambda name,c : name == c.__name__) + + def __str__(self): + return str(self._list) + + def __repr__(self): + return self.__str__() + +registry = ClassRegistry() + +import pdb; pdb.set_trace() # need to test with real js class / bfclass + diff --git a/dcp/dry/fn.py b/dcp/dry/fn.py new file mode 100644 index 0000000..828aba4 --- /dev/null +++ b/dcp/dry/fn.py @@ -0,0 +1,19 @@ +import asyncio +import inspect + +def aio_run_wrapper(leaky_async_fn): + # leaky_asyn_fn may not return a corotine but still require an event loop + async def aio_fn(*args, **kwargs): + return_value = leaky_async_fn(*args, **kwargs) + if inspect.isawaitable(return_value): + return await return_value + + print("AIO_RUN_WRAPPER_CASE_HIT_WHERE_FN_NOT_RETURN_CORO") # TODO??? + return return_value + return aio_fn + +def blocking_run_wrapper(async_fn): + def blocking_fn(*args, **kwargs): + return asyncio.run(aio_run_wrapper(async_fn)(*args, **kwargs)) + return blocking_fn + diff --git a/dcp/dry/js_function.py b/dcp/dry/js_function.py deleted file mode 100644 index e69de29..0000000 diff --git a/dcp/dry/js_module.py b/dcp/dry/js_module.py deleted file mode 100644 index e69de29..0000000 From ac6ebf206bdd5781282451f9bba56cf27aefbb9a Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Tue, 18 Jun 2024 07:09:45 -0400 Subject: [PATCH 10/47] feat(bfclass): add static method to retrieve js class function Each Bifrost Python class will now have a static method to get the corresponding JS Class' constructor! Useful for comparisons among other things. --- dcp/dry/bfclass.py | 1 + 1 file changed, 1 insertion(+) diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index e21356e..8cdbd95 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -89,6 +89,7 @@ def __str__(self): opts.props['__getattr__'] = __getattr__ opts.props['__setattr__'] = __setattr__ opts.props['__str__'] = __str__ + opts.props['get_js_class'] = staticmethod(lambda: js_class) new_class = type(opts.name, (object,), opts.props) return new_class From a7fc104d840885f45d68b56f90dcdedcbe75cc1b Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Tue, 18 Jun 2024 07:11:15 -0400 Subject: [PATCH 11/47] test(class_registry): write initial tests --- dcp/dry/__init__.py | 1 + dcp/dry/classes.py | 12 +-- tests/test_js_wrappers/test_class_registry.py | 85 +++++++++++++++++++ tests/test_sanity.py | 1 + 4 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 tests/test_js_wrappers/test_class_registry.py diff --git a/dcp/dry/__init__.py b/dcp/dry/__init__.py index 490a28c..37cbf8d 100644 --- a/dcp/dry/__init__.py +++ b/dcp/dry/__init__.py @@ -1,4 +1,5 @@ from .bfclass import make_dcp_class, wrap_js_obj +from .classes import registry as class_registry __all__ = ['make_dcp_class', 'wrap_js_obj'] diff --git a/dcp/dry/classes.py b/dcp/dry/classes.py index 2a7e027..c5e521d 100644 --- a/dcp/dry/classes.py +++ b/dcp/dry/classes.py @@ -13,11 +13,15 @@ def find(self, needle, cmp): return bfclass return None - def find_class_from_js_instance(self, js_instance): + def find_from_js_instance(self, js_instance): js_instanceof = pm.eval('(i,c) => i instanceof c') - return self.find(js_instance, lambda i,c : js_instanceof(i, c.js_ref)) - def find_class_from_name(self, name): + def cmp(inst, clas): + return js_instanceof(inst, clas.get_js_class()) + + return self.find(js_instance, cmp) + + def find_from_name(self, name): return self.find(name, lambda name,c : name == c.__name__) def __str__(self): @@ -28,5 +32,3 @@ def __repr__(self): registry = ClassRegistry() -import pdb; pdb.set_trace() # need to test with real js class / bfclass - diff --git a/tests/test_js_wrappers/test_class_registry.py b/tests/test_js_wrappers/test_class_registry.py new file mode 100644 index 0000000..ca80a09 --- /dev/null +++ b/tests/test_js_wrappers/test_class_registry.py @@ -0,0 +1,85 @@ +import unittest +import pythonmonkey as pm +from dcp import dry +from dcp.dry import make_dcp_class as make_class +from dcp.dry import wrap_js_obj + +JSRectangle = pm.eval(""" +class JSRectangle +{ + constructor(height, width) + { + this.height = height; + this.width = width; + } + get area() + { + return this.calcArea(); + } + calcArea() + { + return this.height * this.width; + } +} +JSRectangle; +""") + +JSCoffee = pm.eval(""" +class JSCoffee +{ + // brews & returns how long it took to brew + async brew(ms) + { + return new Promise((resolve) => { + setTimeout(() => resolve(ms), ms); + }); + } +} +JSCoffee; +""") + +JSHuman = pm.eval(""" +class JSHuman +{ + // births a baby, has to be awaited until born + constructor(name) + { + this.name = name; + const that = this; + return new Promise((resolve) => { + setTimeout(() => resolve(that), 9); + }); + } +} +JSHuman; +""") + +PyRect = make_class(JSRectangle) +PyCoff = make_class(JSCoffee) +PyHuma = make_class(JSHuman) + +class TestClassRegistry(unittest.TestCase): + def test_adding_and_retrieval(self): + dry.class_registry.register(PyRect) + dry.class_registry.register(PyCoff) + dry.class_registry.register(PyHuma) + + # retrieval by JS Class name + Class = dry.class_registry.find_from_name('JSHuman') + self.assertTrue(Class.__name__, 'JSHuman') + + # retrieval by JS Class instance + js_inst = pm.new(JSRectangle)(7,11) + Class = dry.class_registry.find_from_js_instance(js_inst) + self.assertTrue(Class.__name__, 'JSRectangle') + return True + + def test_baseclassing_from_retrieval(self): + pass + + def test_replacement(self): + pass + +if __name__ == '__main__': + unittest.main() + diff --git a/tests/test_sanity.py b/tests/test_sanity.py index bb35eb5..25e85da 100644 --- a/tests/test_sanity.py +++ b/tests/test_sanity.py @@ -12,3 +12,4 @@ def test_sanity_returns_true(self): if __name__ == '__main__': unittest.main() + From 4a6e814737b1dde01581b597a4684ad3585d00a2 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 19 Jun 2024 09:10:23 -0400 Subject: [PATCH 12/47] feat(class_registry): add replace method As well as some minor refactors... --- dcp/dry/classes.py | 29 ++++---- tests/test_js_wrappers/test_class_registry.py | 67 +++++++++++++------ 2 files changed, 62 insertions(+), 34 deletions(-) diff --git a/dcp/dry/classes.py b/dcp/dry/classes.py index c5e521d..ff4e329 100644 --- a/dcp/dry/classes.py +++ b/dcp/dry/classes.py @@ -1,28 +1,32 @@ import pythonmonkey as pm + class ClassRegistry: def __init__(self): self._list = [] + def _find(self, cmp): + return next((c for c in self._list if cmp(c)), None) + + def _replace_or_register(self, new_class, cmp): + existing = self._find(cmp) + if existing: + self._list[self._list.index(existing)] = new_class + else: + self.register(new_class) + def register(self, bfclass): self._list.append(bfclass) - def find(self, needle, cmp): - for bfclass in self._list: - if cmp(needle, bfclass): - return bfclass - return None + def replace_from_name(self, name, new_class): + self._replace_or_register(new_class, lambda c: c.__name__ == name) - def find_from_js_instance(self, js_instance): + def find_from_js_instance(self, js_inst): js_instanceof = pm.eval('(i,c) => i instanceof c') - - def cmp(inst, clas): - return js_instanceof(inst, clas.get_js_class()) - - return self.find(js_instance, cmp) + return self._find(lambda c: js_instanceof(js_inst, c.get_js_class())) def find_from_name(self, name): - return self.find(name, lambda name,c : name == c.__name__) + return self._find(lambda c: c.__name__ == name) def __str__(self): return str(self._list) @@ -30,5 +34,6 @@ def __str__(self): def __repr__(self): return self.__str__() + registry = ClassRegistry() diff --git a/tests/test_js_wrappers/test_class_registry.py b/tests/test_js_wrappers/test_class_registry.py index ca80a09..a21594d 100644 --- a/tests/test_js_wrappers/test_class_registry.py +++ b/tests/test_js_wrappers/test_class_registry.py @@ -2,7 +2,6 @@ import pythonmonkey as pm from dcp import dry from dcp.dry import make_dcp_class as make_class -from dcp.dry import wrap_js_obj JSRectangle = pm.eval(""" class JSRectangle @@ -57,28 +56,52 @@ class JSHuman PyRect = make_class(JSRectangle) PyCoff = make_class(JSCoffee) PyHuma = make_class(JSHuman) - + + class TestClassRegistry(unittest.TestCase): - def test_adding_and_retrieval(self): - dry.class_registry.register(PyRect) - dry.class_registry.register(PyCoff) - dry.class_registry.register(PyHuma) - - # retrieval by JS Class name - Class = dry.class_registry.find_from_name('JSHuman') - self.assertTrue(Class.__name__, 'JSHuman') - - # retrieval by JS Class instance - js_inst = pm.new(JSRectangle)(7,11) - Class = dry.class_registry.find_from_js_instance(js_inst) - self.assertTrue(Class.__name__, 'JSRectangle') - return True - - def test_baseclassing_from_retrieval(self): - pass - - def test_replacement(self): - pass + def test_monolithic_add_retrieve(self): + def test_adding_and_retrieval(): + dry.class_registry.register(PyRect) + dry.class_registry.register(PyCoff) + dry.class_registry.register(PyHuma) + + # retrieval by JS Class name + Class = dry.class_registry.find_from_name('JSHuman') + self.assertTrue(Class.__name__, 'JSHuman') + + # retrieval by JS Class instance + js_inst = pm.new(JSRectangle)(7, 11) + Class = dry.class_registry.find_from_js_instance(js_inst) + self.assertTrue(Class.__name__, 'JSRectangle') + + def test_baseclassing_from_retrieval(): + class PyRect2(dry.class_registry.find_from_name('JSRectangle')): + def __str__(self): + return "changed" + + def area(self): + return self.calcArea() * 100 + + my_inst = PyRect2(3, 13) + + self.assertEqual(str(my_inst), "changed") # new + self.assertEqual(my_inst.calcArea(), 3 * 13) # existing + self.assertEqual(my_inst.area(), 3 * 13 * 100) # overwritten + + def test_replacement(): + class PyCoffee2(dry.class_registry.find_from_name('JSCoffee')): + def __str__(self): + return "this was changed" + + dry.class_registry.replace_from_name('JSCoffee', PyCoffee2) + + ph2 = PyCoffee2() + self.assertEqual(str(ph2), "this was changed") + + test_adding_and_retrieval() + test_baseclassing_from_retrieval() + test_replacement() + if __name__ == '__main__': unittest.main() From 5d0d683d91cbb81101cdb7fc30fd6dccfa36c5bd Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 26 Jun 2024 18:11:23 -0400 Subject: [PATCH 13/47] feat(module buidler): basic module wraping This sets up a simple algorithm for setting up a bifrost dcp module system out of the cjs dcp-client modules. --- dcp/__init__.py | 36 ++++++++++++++++++++++++++++++------ dcp/dry/__init__.py | 1 + dcp/dry/bfclass.py | 4 +++- dcp/dry/fn.py | 4 +++- tests/test_init.py | 11 ++++++++++- 5 files changed, 47 insertions(+), 9 deletions(-) diff --git a/dcp/__init__.py b/dcp/__init__.py index 69822b1..584928c 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -4,15 +4,18 @@ from types import ModuleType as Module import pythonmonkey as pm +PMDict = pm.eval('x={};x').__class__ +proto_own_prop_names = pm.eval('x=>(x?.prototype ? Object.getOwnPropertyNames(x?.prototype) : [])') from .sanity import sanity from .js import dcp_client as dcp_js +from .dry import make_dcp_class, class_registry, wrap_js_obj, aio_run_wrapper, blocking_run_wrapper # state init_memo = None -def init(**kwargs): +def init(**kwargs) -> Module: global init_memo # no-op on multiple initializations @@ -25,20 +28,41 @@ def init(**kwargs): # build dcp modules for name in pm.globalThis.dcp.keys(): - module_tree(sys.modules[__name__], pm.globalThis.dcp[name], name) + init_dcp_module(sys.modules[__name__], pm.globalThis.dcp[name], name) - print(dir(sys.modules[__name__])) + init_memo = sys.modules[__name__] + return init_memo -def module_tree(py_parent, js_child, js_name): +def init_dcp_module(py_parent, js_module, js_name): underscore_name = f"{js_name.replace('-', '_')}" module_name = f"{py_parent.__name__}.{underscore_name}" module = Module(module_name) - module.__file__ = f"" - module._js = js_child + module.__file__ = f"" + module._js = js_module sys.modules[module_name] = module + + # add the new module as a submodule of the root module setattr(py_parent, underscore_name, module) + # wrap js elements of the cjs module + for prop_name, prop_ref in js_module.items(): + if isinstance(prop_ref, pm.JSFunctionProxy): + # TODO: come up with better way to determine if class... + if len(proto_own_prop_names(prop_ref)) > 1: + setattr(module, prop_name, make_dcp_class(prop_ref, name=prop_name)) + # TODO: check if the function is known to return a promise... + else: + setattr(module, prop_name, blocking_run_wrapper(prop_ref)) + + # js object + elif prop_ref is PMDict: + setattr(module, prop_name, wrap_js_obj(prop_ref)) + + # py dict + else: + setattr(module, prop_name, prop_ref) + __all__ = ["init", "sanity"] diff --git a/dcp/dry/__init__.py b/dcp/dry/__init__.py index 37cbf8d..334eb65 100644 --- a/dcp/dry/__init__.py +++ b/dcp/dry/__init__.py @@ -1,5 +1,6 @@ from .bfclass import make_dcp_class, wrap_js_obj from .classes import registry as class_registry +from .fn import aio_run_wrapper, blocking_run_wrapper __all__ = ['make_dcp_class', 'wrap_js_obj'] diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index 8cdbd95..17431d3 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -21,6 +21,7 @@ from .fn import aio_run_wrapper, blocking_run_wrapper + def make_dcp_class(js_class, **kwargs): """ Factory of Classes function for generating pleasant proxies to JS Classes. @@ -42,7 +43,7 @@ def make_dcp_class(js_class, **kwargs): 'name': js_class_name(js_class), 'props': {}, 'aio_methods': [], - 'aio_ctor': False, + 'aio_ctor': True, 'force_blocking': [], 'js_instance': None, } @@ -115,6 +116,7 @@ def wrap_js_obj(js_obj, **kwargs): return generic_obj + def js_class_name(JSClass): return pm.eval('x=>x.name')(JSClass) diff --git a/dcp/dry/fn.py b/dcp/dry/fn.py index 828aba4..b3a9692 100644 --- a/dcp/dry/fn.py +++ b/dcp/dry/fn.py @@ -1,6 +1,7 @@ import asyncio import inspect + def aio_run_wrapper(leaky_async_fn): # leaky_asyn_fn may not return a corotine but still require an event loop async def aio_fn(*args, **kwargs): @@ -8,10 +9,11 @@ async def aio_fn(*args, **kwargs): if inspect.isawaitable(return_value): return await return_value - print("AIO_RUN_WRAPPER_CASE_HIT_WHERE_FN_NOT_RETURN_CORO") # TODO??? + print("AIO_RUN_WRAPPER_CASE_HIT_WHERE_FN_NOT_RETURN_CORO") # TODO??? return return_value return aio_fn + def blocking_run_wrapper(async_fn): def blocking_fn(*args, **kwargs): return asyncio.run(aio_run_wrapper(async_fn)(*args, **kwargs)) diff --git a/tests/test_init.py b/tests/test_init.py index c1ed200..f05ba52 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -7,7 +7,16 @@ def test_init_exists(self): self.assertTrue(hasattr(dcp, 'init')) def test_init(self): - dcp.init() + ret_module = dcp.init() + from dcp import wallet + from dcp import job + + self.assertEqual(ret_module, dcp) + + job = job.Job('x=>{progress();return x+1', [1, 2, 3]) + + # TODO - maybe I should just smoke test if a few functions exist? + # How do I test this? def test_init_twice(self): dcp.init() From 2217eb5f8dcb3e0e802929003ce26b8b076bc2b9 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Tue, 2 Jul 2024 13:58:21 -0400 Subject: [PATCH 14/47] feat(fn): run every function in an event loop And then await it only if the value it returns is awaitable... --- dcp/__init__.py | 14 +++++++++----- dcp/dry/bfclass.py | 8 +++----- dcp/dry/fn.py | 3 ++- example.py | 27 +++++++++++++++++++++++++++ tests/test_init.py | 5 ++--- 5 files changed, 43 insertions(+), 14 deletions(-) create mode 100755 example.py diff --git a/dcp/__init__.py b/dcp/__init__.py index 584928c..d9be7be 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -1,15 +1,16 @@ # NOTE TO SELF - have to load class registry before classes that use it +from .dry import make_dcp_class, class_registry, wrap_js_obj, aio_run_wrapper, blocking_run_wrapper +from .js import dcp_client as dcp_js +from .sanity import sanity import sys from types import ModuleType as Module import pythonmonkey as pm PMDict = pm.eval('x={};x').__class__ -proto_own_prop_names = pm.eval('x=>(x?.prototype ? Object.getOwnPropertyNames(x?.prototype) : [])') +proto_own_prop_names = pm.eval( + 'x=>(x?.prototype ? Object.getOwnPropertyNames(x?.prototype) : [])') -from .sanity import sanity -from .js import dcp_client as dcp_js -from .dry import make_dcp_class, class_registry, wrap_js_obj, aio_run_wrapper, blocking_run_wrapper # state init_memo = None @@ -50,7 +51,10 @@ def init_dcp_module(py_parent, js_module, js_name): if isinstance(prop_ref, pm.JSFunctionProxy): # TODO: come up with better way to determine if class... if len(proto_own_prop_names(prop_ref)) > 1: - setattr(module, prop_name, make_dcp_class(prop_ref, name=prop_name)) + new_bfclass = make_dcp_class(prop_ref, name=prop_name) + class_registry.register(new_bfclass) + setattr(module, prop_name, new_bfclass) + # TODO: check if the function is known to return a promise... else: setattr(module, prop_name, blocking_run_wrapper(prop_ref)) diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index 17431d3..b2d7652 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -16,6 +16,7 @@ # @date June 2024 import asyncio +import inspect import types import pythonmonkey as pm @@ -43,7 +44,7 @@ def make_dcp_class(js_class, **kwargs): 'name': js_class_name(js_class), 'props': {}, 'aio_methods': [], - 'aio_ctor': True, + 'aio_ctor': True, # TODO maybe shouldn't be true 'force_blocking': [], 'js_instance': None, } @@ -70,10 +71,7 @@ def __getattr__(self, name): return js_attr def method(*args, **kwargs): - if (name in opts.aio_methods or name in opts.force_blocking): - aio_attr = getattr(self.aio, name) - return asyncio.run(aio_attr(*args, **kwargs)) - return js_attr(*args, **kwargs) + return asyncio.run(aio_run_wrapper(js_attr)(*args, **kwargs)) return method diff --git a/dcp/dry/fn.py b/dcp/dry/fn.py index b3a9692..d7ac2fa 100644 --- a/dcp/dry/fn.py +++ b/dcp/dry/fn.py @@ -9,7 +9,8 @@ async def aio_fn(*args, **kwargs): if inspect.isawaitable(return_value): return await return_value - print("AIO_RUN_WRAPPER_CASE_HIT_WHERE_FN_NOT_RETURN_CORO") # TODO??? + # TODO: check class registry if it should be wrapped instance + return return_value return aio_fn diff --git a/example.py b/example.py new file mode 100755 index 0000000..24845a5 --- /dev/null +++ b/example.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 + +import pythonmonkey as pm + +import dcp +dcp.init() + +from dcp import job + + +my_j = job.Job('x=>{progress();return x+x;}', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) + +my_j.on('readystatechange', print) +my_j.on('accepted', lambda: print(my_j.id)) +my_j.on('result', print) + +my_j.computeGroups = [{'joinKey': 'joseph', 'joinSecret': 'pringle'}] +my_j.public.name = 'simple bifrost2 example' + +res = my_j.exec() + +# my_j.exec() +# res = my_j.wait() + +print(">>>>>>>>>>>>>>>>>>>>>>>>>> RESULTS ARE IN") +print(pm.eval('Array.from')(res)) + diff --git a/tests/test_init.py b/tests/test_init.py index f05ba52..3af5ad2 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -13,10 +13,9 @@ def test_init(self): self.assertEqual(ret_module, dcp) - job = job.Job('x=>{progress();return x+1', [1, 2, 3]) + job = job.Job('x=>{progress();return x+1', []) + job.on('readystatechange', print) - # TODO - maybe I should just smoke test if a few functions exist? - # How do I test this? def test_init_twice(self): dcp.init() From 8a8adce2ce594c31c59b660838b39af97a9f7e81 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Tue, 2 Jul 2024 14:08:03 -0400 Subject: [PATCH 15/47] refactor(bfclass): remove some redundant arguments --- dcp/dry/bfclass.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index b2d7652..e3a8c75 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -31,9 +31,6 @@ def make_dcp_class(js_class, **kwargs): js_class (function): The JavaScript class to wrap. name (string: optional): The name of the new class to make. props (dict, optional): Properties to add to the class. - aio_methods (list, optional): List of asynchronous method names to wrap. - aio_ctor (bool, optional): Whether the JS constructor is async. - force_blocking (list, optional): List certain methods as blocking. js_instance (JSObjectProxy, optional): set a specific JS ref for the class. Returns: @@ -43,9 +40,6 @@ def make_dcp_class(js_class, **kwargs): optional_defaults = { 'name': js_class_name(js_class), 'props': {}, - 'aio_methods': [], - 'aio_ctor': True, # TODO maybe shouldn't be true - 'force_blocking': [], 'js_instance': None, } opts = types.SimpleNamespace(**{**optional_defaults, **kwargs}) @@ -53,11 +47,9 @@ def make_dcp_class(js_class, **kwargs): def __init__(self, *args, **kwargs): if opts.js_instance is not None: self.js_ref = opts.js_instance - elif (opts.aio_ctor): + else: async_wrapped_ctor = aio_run_wrapper(pm.new(js_class)) self.js_ref = asyncio.run(async_wrapped_ctor(*args, **kwargs)) - else: - self.js_ref = pm.new(js_class)(*args, **kwargs) self.aio = AsyncIOMethods(self) From da89ef62012ba5b85f4bfbd69150aca104cb9dc0 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 3 Jul 2024 10:18:38 -0400 Subject: [PATCH 16/47] feat(job-api): add skeleton for job api --- dcp/api/job.py | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 dcp/api/job.py diff --git a/dcp/api/job.py b/dcp/api/job.py new file mode 100644 index 0000000..4d9efc2 --- /dev/null +++ b/dcp/api/job.py @@ -0,0 +1,11 @@ +class Job(): + def exec(*args, **kwargs): + pass + + def wait(*args, **kwargs): + pass + + def on(*args, **kwargs): + pass + + From ee5c069bc745927973c4374ab1f2af8fd1ce2661 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 3 Jul 2024 15:07:35 -0400 Subject: [PATCH 17/47] feat(job.on): add job.on decorator --- dcp/__init__.py | 7 +++++++ dcp/api/__init__.py | 5 +++++ dcp/api/compute_for.py | 2 ++ dcp/api/job.py | 24 ++++++++++++++++++------ example.py | 5 ++++- 5 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 dcp/api/__init__.py create mode 100644 dcp/api/compute_for.py diff --git a/dcp/__init__.py b/dcp/__init__.py index d9be7be..b32bfc4 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -2,6 +2,8 @@ from .dry import make_dcp_class, class_registry, wrap_js_obj, aio_run_wrapper, blocking_run_wrapper from .js import dcp_client as dcp_js +from .api import compute_for as api_compute_for +from .api import Job as api_Job from .sanity import sanity import sys from types import ModuleType as Module @@ -52,6 +54,11 @@ def init_dcp_module(py_parent, js_module, js_name): # TODO: come up with better way to determine if class... if len(proto_own_prop_names(prop_ref)) > 1: new_bfclass = make_dcp_class(prop_ref, name=prop_name) + + # TODO - need to make this more prorgramatic and dry - maybe this belongs in a class manager..? TODO XXX TODO XXX + if prop_name == 'Job': + new_bfclass = type('Job', (new_bfclass,), dict(api_Job.__dict__)) + class_registry.register(new_bfclass) setattr(module, prop_name, new_bfclass) diff --git a/dcp/api/__init__.py b/dcp/api/__init__.py new file mode 100644 index 0000000..f1d4019 --- /dev/null +++ b/dcp/api/__init__.py @@ -0,0 +1,5 @@ +from .compute_for import compute_for +from .job import Job + +__all__ = ['compute_for', 'Job'] + diff --git a/dcp/api/compute_for.py b/dcp/api/compute_for.py new file mode 100644 index 0000000..5c7d8b2 --- /dev/null +++ b/dcp/api/compute_for.py @@ -0,0 +1,2 @@ +def compute_for(*args, **kwargs): + pass diff --git a/dcp/api/job.py b/dcp/api/job.py index 4d9efc2..6dcb71a 100644 --- a/dcp/api/job.py +++ b/dcp/api/job.py @@ -1,11 +1,23 @@ -class Job(): - def exec(*args, **kwargs): - pass +import pythonmonkey as pm - def wait(*args, **kwargs): - pass - def on(*args, **kwargs): +class Job(): + #def exec(self, *args, **kwargs): + # # TODO change behaviour to match spec + # #print("overidden by Job hook") + + def wait(self, *args, **kwargs): + print("NYI") # TODO pass + def on(self, *args): + if len(args) > 1 and callable(args[1]): + event_name = args[0] + event_cb = args[1] + self.js_ref.on(event_name, event_cb) + else: + event_name = args[0] + def decorator(fn): + self.js_ref.on(event_name, fn) + return decorator diff --git a/example.py b/example.py index 24845a5..c1c4d45 100755 --- a/example.py +++ b/example.py @@ -11,14 +11,17 @@ my_j = job.Job('x=>{progress();return x+x;}', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) my_j.on('readystatechange', print) -my_j.on('accepted', lambda: print(my_j.id)) my_j.on('result', print) +@my_j.on('accepted') +def accepted_handler(ev): + print(my_j.id) my_j.computeGroups = [{'joinKey': 'joseph', 'joinSecret': 'pringle'}] my_j.public.name = 'simple bifrost2 example' res = my_j.exec() +my_j.wait() # my_j.exec() # res = my_j.wait() From f4ec4dd2b76bb7c600afe4d0d6773dd1dc6b6710 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 3 Jul 2024 15:24:59 -0400 Subject: [PATCH 18/47] refactor(bfclass): remove calls to asyncio.run so it will be easier to change the arch to use a single event loop... --- dcp/dry/bfclass.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index e3a8c75..cacbd46 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -48,8 +48,8 @@ def __init__(self, *args, **kwargs): if opts.js_instance is not None: self.js_ref = opts.js_instance else: - async_wrapped_ctor = aio_run_wrapper(pm.new(js_class)) - self.js_ref = asyncio.run(async_wrapped_ctor(*args, **kwargs)) + async_wrapped_ctor = blocking_run_wrapper(pm.new(js_class)) + self.js_ref = async_wrapped_ctor(*args, **kwargs) self.aio = AsyncIOMethods(self) @@ -63,7 +63,7 @@ def __getattr__(self, name): return js_attr def method(*args, **kwargs): - return asyncio.run(aio_run_wrapper(js_attr)(*args, **kwargs)) + return blocking_run_wrapper(js_attr)(*args, **kwargs) return method From 74ba0d8db0d242a5cd0918252d43c126e4fe3d06 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 3 Jul 2024 15:36:13 -0400 Subject: [PATCH 19/47] feat(fn): use same event loop between async calls This is a temporary ugly patch to accomplish this, it should be refactored into something cleaner later... --- dcp/dry/fn.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dcp/dry/fn.py b/dcp/dry/fn.py index d7ac2fa..f276c7b 100644 --- a/dcp/dry/fn.py +++ b/dcp/dry/fn.py @@ -1,6 +1,9 @@ import asyncio import inspect +# this CAN'T LIVE HERE!!! TODO XXX but temporarily putting it here +loop = asyncio.new_event_loop() +asyncio.set_event_loop(loop) def aio_run_wrapper(leaky_async_fn): # leaky_asyn_fn may not return a corotine but still require an event loop @@ -17,6 +20,6 @@ async def aio_fn(*args, **kwargs): def blocking_run_wrapper(async_fn): def blocking_fn(*args, **kwargs): - return asyncio.run(aio_run_wrapper(async_fn)(*args, **kwargs)) + return loop.run_until_complete(aio_run_wrapper(async_fn)(*args, **kwargs)) return blocking_fn From 969e8c3b0b3122aee59effc78f14b372b61d8f06 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Thu, 4 Jul 2024 20:14:41 -0400 Subject: [PATCH 20/47] refactor(bfclass): make bfclass simpler - pass js instance to class directly - don't bother with aio_ctor or aio_methods - simplify code / make code more pythonic --- dcp/dry/bfclass.py | 86 ++++++++---------------- tests/test_js_wrappers/test_js_object.py | 4 +- 2 files changed, 30 insertions(+), 60 deletions(-) diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index cacbd46..4621545 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -1,52 +1,22 @@ -# @file js_object.py - Wrapper Class for DCP JS Classes -# PythonMonkey's async functions leak, by design, meaning calling -# a function which returns a promise will immediately require -# usage of an event loop or will otherwise error. Therefore, not -# only are async functions block waited, but are also wrapped for -# use with the aio subcomponent. -# -# For example: job.aio.exec will return an awaitable but job.exec -# will block until the true value is returned which the awaitable -# awaits to. -# -# @TODO Should be more modular - also, needs to account for dcp object -# instances returned from methods better. +# @file bfclass.py - Wrapper Class factory for DCP JS Classes # # @author Will Pringle # @date June 2024 import asyncio -import inspect import types import pythonmonkey as pm - from .fn import aio_run_wrapper, blocking_run_wrapper -def make_dcp_class(js_class, **kwargs): - """ - Factory of Classes function for generating pleasant proxies to JS Classes. - - Parameters: - js_class (function): The JavaScript class to wrap. - name (string: optional): The name of the new class to make. - props (dict, optional): Properties to add to the class. - js_instance (JSObjectProxy, optional): set a specific JS ref for the class. - - Returns: - type: A new Python class which wraps the given JavaScript class. - """ - - optional_defaults = { - 'name': js_class_name(js_class), - 'props': {}, - 'js_instance': None, - } - opts = types.SimpleNamespace(**{**optional_defaults, **kwargs}) +def make_dcp_class(js_class, name=None, js_instance=None): + name = name or js_class_name(js_class) def __init__(self, *args, **kwargs): - if opts.js_instance is not None: - self.js_ref = opts.js_instance + # if the sole argument to the ctor is a js instance, use it as the ref + if len(args) == 1 and js_instanceof(args[0], js_class): + self.js_ref = args[0] + # otherwise, instantiate a new underlying js ref using the ctor args else: async_wrapped_ctor = blocking_run_wrapper(pm.new(js_class)) self.js_ref = async_wrapped_ctor(*args, **kwargs) @@ -55,16 +25,14 @@ def __init__(self, *args, **kwargs): def __getattr__(self, name): js_attr = self.js_ref[name] - - if (not callable(js_attr)): - # If it returns a js type, wrap it... + if not callable(js_attr): if isinstance(js_attr, pm.JSObjectProxy): return wrap_js_obj(js_attr) - return js_attr + else: + return js_attr def method(*args, **kwargs): return blocking_run_wrapper(js_attr)(*args, **kwargs) - return method def __setattr__(self, name, value): @@ -76,12 +44,15 @@ def __setattr__(self, name, value): def __str__(self): return str(self.js_ref) - opts.props['__init__'] = __init__ - opts.props['__getattr__'] = __getattr__ - opts.props['__setattr__'] = __setattr__ - opts.props['__str__'] = __str__ - opts.props['get_js_class'] = staticmethod(lambda: js_class) - new_class = type(opts.name, (object,), opts.props) + props = { + '__init__': __init__, + '__getattr__': __getattr__, + '__setattr__': __setattr__, + '__str__': __str__, + 'get_js_class': staticmethod(lambda: js_class) + } + + new_class = type(name, (object,), props) return new_class @@ -91,22 +62,21 @@ def __init__(self, parent): self.parent = parent def __getattr__(self, name): - js_attr = self.parent.js_ref[name] - return aio_run_wrapper(js_attr) + return aio_run_wrapper(self.parent.js_ref[name]) -def wrap_js_obj(js_obj, **kwargs): +def wrap_js_obj(js_obj): if not isinstance(js_obj, pm.JSObjectProxy): return js_obj + JSClass = pm.eval('x => x.constructor')(js_obj) + DCPClass = make_dcp_class(JSClass) + return DCPClass(js_obj) - JSClass = pm.eval('x=>x.constructor')(js_obj, **kwargs) - DCPClass = make_dcp_class(JSClass, js_instance=js_obj) - generic_obj = DCPClass() - - return generic_obj +def js_class_name(JSClass): + return pm.eval('x => x.name')(JSClass) -def js_class_name(JSClass): - return pm.eval('x=>x.name')(JSClass) +def js_instanceof(js_instance, JSClass): + return pm.eval('(i,c) => i instanceof c')(js_instance, JSClass) diff --git a/tests/test_js_wrappers/test_js_object.py b/tests/test_js_wrappers/test_js_object.py index 9520dfd..973ff69 100644 --- a/tests/test_js_wrappers/test_js_object.py +++ b/tests/test_js_wrappers/test_js_object.py @@ -51,7 +51,7 @@ class Coffee Coffee; """) - Coffee = make_class(MyClass, aio_methods=["brew"]) + Coffee = make_class(MyClass) cup_of_joe = Coffee() # should be able to sleep synchronously @@ -80,7 +80,7 @@ class Human Human; """) - HumanPy = make_class(Human, aio_ctor=True) + HumanPy = make_class(Human) # verify constructor promise has been resolved baby = HumanPy('Joe') From 2c60d900741d143ce332ee8362356dbda42dad34 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Thu, 4 Jul 2024 20:36:21 -0400 Subject: [PATCH 21/47] refactor(js.utils): put js utils in a utils module in js --- dcp/__init__.py | 13 ++++--------- dcp/dry/bfclass.py | 14 ++++---------- dcp/js/__init__.py | 3 ++- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/dcp/__init__.py b/dcp/__init__.py index b32bfc4..9a9242e 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -1,7 +1,7 @@ # NOTE TO SELF - have to load class registry before classes that use it from .dry import make_dcp_class, class_registry, wrap_js_obj, aio_run_wrapper, blocking_run_wrapper -from .js import dcp_client as dcp_js +from . import js from .api import compute_for as api_compute_for from .api import Job as api_Job from .sanity import sanity @@ -9,10 +9,6 @@ from types import ModuleType as Module import pythonmonkey as pm -PMDict = pm.eval('x={};x').__class__ -proto_own_prop_names = pm.eval( - 'x=>(x?.prototype ? Object.getOwnPropertyNames(x?.prototype) : [])') - # state init_memo = None @@ -26,7 +22,7 @@ def init(**kwargs) -> Module: return init_memo # initialize dcp - dcp_js['init'](**kwargs) + js.dcp_client['init'](**kwargs) init_memo = True # build dcp modules @@ -51,8 +47,7 @@ def init_dcp_module(py_parent, js_module, js_name): # wrap js elements of the cjs module for prop_name, prop_ref in js_module.items(): if isinstance(prop_ref, pm.JSFunctionProxy): - # TODO: come up with better way to determine if class... - if len(proto_own_prop_names(prop_ref)) > 1: + if js.utils.isclass(prop_ref): new_bfclass = make_dcp_class(prop_ref, name=prop_name) # TODO - need to make this more prorgramatic and dry - maybe this belongs in a class manager..? TODO XXX TODO XXX @@ -67,7 +62,7 @@ def init_dcp_module(py_parent, js_module, js_name): setattr(module, prop_name, blocking_run_wrapper(prop_ref)) # js object - elif prop_ref is PMDict: + elif prop_ref is js.utils.PMDict: setattr(module, prop_name, wrap_js_obj(prop_ref)) # py dict diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index 4621545..6fc6c73 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -7,14 +7,15 @@ import types import pythonmonkey as pm from .fn import aio_run_wrapper, blocking_run_wrapper +from .. import js def make_dcp_class(js_class, name=None, js_instance=None): - name = name or js_class_name(js_class) + name = name or js.utils.class_name(js_class) def __init__(self, *args, **kwargs): # if the sole argument to the ctor is a js instance, use it as the ref - if len(args) == 1 and js_instanceof(args[0], js_class): + if len(args) == 1 and js.utils.instanceof(args[0], js_class): self.js_ref = args[0] # otherwise, instantiate a new underlying js ref using the ctor args else: @@ -68,15 +69,8 @@ def __getattr__(self, name): def wrap_js_obj(js_obj): if not isinstance(js_obj, pm.JSObjectProxy): return js_obj - JSClass = pm.eval('x => x.constructor')(js_obj) + JSClass = js.utils.obj_constructor(js_obj) DCPClass = make_dcp_class(JSClass) return DCPClass(js_obj) -def js_class_name(JSClass): - return pm.eval('x => x.name')(JSClass) - - -def js_instanceof(js_instance, JSClass): - return pm.eval('(i,c) => i instanceof c')(js_instance, JSClass) - diff --git a/dcp/js/__init__.py b/dcp/js/__init__.py index 4f2a2bc..1c937d4 100644 --- a/dcp/js/__init__.py +++ b/dcp/js/__init__.py @@ -1,4 +1,5 @@ from .load_dcp_client import dcp_client +from . import utils -__all__ = ["dcp_client"] +__all__ = ["dcp_client", "utils"] From 3833f05a0c97bebc7114f983f9e325b3de318447 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Thu, 4 Jul 2024 20:44:45 -0400 Subject: [PATCH 22/47] refactor(bfclass): use more clear naming, move async atters to ctor --- dcp/dry/bfclass.py | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index 6fc6c73..79875ca 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -10,7 +10,7 @@ from .. import js -def make_dcp_class(js_class, name=None, js_instance=None): +def make_dcp_class(js_class, name=None): name = name or js.utils.class_name(js_class) def __init__(self, *args, **kwargs): @@ -22,7 +22,14 @@ def __init__(self, *args, **kwargs): async_wrapped_ctor = blocking_run_wrapper(pm.new(js_class)) self.js_ref = async_wrapped_ctor(*args, **kwargs) - self.aio = AsyncIOMethods(self) + class AsyncAttrs: + def __init__(self, parent): + self.parent = parent + + def __getattr__(self, name): + return aio_run_wrapper(self.parent.js_ref[name]) + + self.aio = AsyncAttrs(self) def __getattr__(self, name): js_attr = self.js_ref[name] @@ -58,14 +65,6 @@ def __str__(self): return new_class -class AsyncIOMethods: - def __init__(self, parent): - self.parent = parent - - def __getattr__(self, name): - return aio_run_wrapper(self.parent.js_ref[name]) - - def wrap_js_obj(js_obj): if not isinstance(js_obj, pm.JSObjectProxy): return js_obj @@ -73,4 +72,3 @@ def wrap_js_obj(js_obj): DCPClass = make_dcp_class(JSClass) return DCPClass(js_obj) - From aaef3e3fd9925b551e224f0f945bbba7318fcf42 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Thu, 4 Jul 2024 20:59:02 -0400 Subject: [PATCH 23/47] todo(fn/class-manager): add TODO comments for later... Oh yes. --- dcp/dry/classes.py | 3 +++ dcp/dry/fn.py | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/dcp/dry/classes.py b/dcp/dry/classes.py index ff4e329..91af5e8 100644 --- a/dcp/dry/classes.py +++ b/dcp/dry/classes.py @@ -1,5 +1,7 @@ import pythonmonkey as pm +# TODO: rename to class manager +# TODO: add stuff for api inheritance setup class ClassRegistry: def __init__(self): @@ -16,6 +18,7 @@ def _replace_or_register(self, new_class, cmp): self.register(new_class) def register(self, bfclass): + # TODO: should probably check for api inheritance here? self._list.append(bfclass) def replace_from_name(self, name, new_class): diff --git a/dcp/dry/fn.py b/dcp/dry/fn.py index f276c7b..7e4fe47 100644 --- a/dcp/dry/fn.py +++ b/dcp/dry/fn.py @@ -1,5 +1,6 @@ import asyncio import inspect +from . import classes # this CAN'T LIVE HERE!!! TODO XXX but temporarily putting it here loop = asyncio.new_event_loop() @@ -13,6 +14,11 @@ async def aio_fn(*args, **kwargs): return await return_value # TODO: check class registry if it should be wrapped instance + # if obj is py obj + # find from ref + # if not found + # register it as new class + # return the new instance of that class with the ref return return_value return aio_fn From 209caac504f8139c1a82bbba4e816083ce1ec43f Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Fri, 5 Jul 2024 07:58:21 -0400 Subject: [PATCH 24/47] feat(class registry): don't overwrite registry on same ctor --- dcp/__init__.py | 7 +++--- dcp/dry/bfclass.py | 16 ++++++++++---- dcp/dry/classes.py | 15 +++++++++++-- dcp/js/utils.py | 28 ++++++++++++++++++++++++ tests/test_js_wrappers/test_js_object.py | 2 ++ 5 files changed, 59 insertions(+), 9 deletions(-) create mode 100644 dcp/js/utils.py diff --git a/dcp/__init__.py b/dcp/__init__.py index 9a9242e..8b4b714 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -48,16 +48,17 @@ def init_dcp_module(py_parent, js_module, js_name): for prop_name, prop_ref in js_module.items(): if isinstance(prop_ref, pm.JSFunctionProxy): if js.utils.isclass(prop_ref): - new_bfclass = make_dcp_class(prop_ref, name=prop_name) + new_bfclass = class_registry.find(prop_ref) + if new_bfclass is None: + new_bfclass = make_dcp_class(prop_ref, name=prop_name) + class_registry.register(new_bfclass) # TODO - need to make this more prorgramatic and dry - maybe this belongs in a class manager..? TODO XXX TODO XXX if prop_name == 'Job': new_bfclass = type('Job', (new_bfclass,), dict(api_Job.__dict__)) - class_registry.register(new_bfclass) setattr(module, prop_name, new_bfclass) - # TODO: check if the function is known to return a promise... else: setattr(module, prop_name, blocking_run_wrapper(prop_ref)) diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index 79875ca..a32cc78 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -7,6 +7,7 @@ import types import pythonmonkey as pm from .fn import aio_run_wrapper, blocking_run_wrapper +from . import classes from .. import js @@ -57,7 +58,7 @@ def __str__(self): '__getattr__': __getattr__, '__setattr__': __setattr__, '__str__': __str__, - 'get_js_class': staticmethod(lambda: js_class) + 'get_js_class': staticmethod(lambda: js_class), } new_class = type(name, (object,), props) @@ -68,7 +69,14 @@ def __str__(self): def wrap_js_obj(js_obj): if not isinstance(js_obj, pm.JSObjectProxy): return js_obj - JSClass = js.utils.obj_constructor(js_obj) - DCPClass = make_dcp_class(JSClass) - return DCPClass(js_obj) + + # check if its in the class registry + matching_class = classes.registry.find(js_obj) + + if matching_class is None: + JSClass = js.utils.obj_constructor(js_obj) + matching_class = make_dcp_class(JSClass) + classes.registry.register(matching_class) + + return matching_class(js_obj) diff --git a/dcp/dry/classes.py b/dcp/dry/classes.py index 91af5e8..e922fda 100644 --- a/dcp/dry/classes.py +++ b/dcp/dry/classes.py @@ -1,4 +1,5 @@ import pythonmonkey as pm +from .. import js # TODO: rename to class manager # TODO: add stuff for api inheritance setup @@ -25,12 +26,22 @@ def replace_from_name(self, name, new_class): self._replace_or_register(new_class, lambda c: c.__name__ == name) def find_from_js_instance(self, js_inst): - js_instanceof = pm.eval('(i,c) => i instanceof c') - return self._find(lambda c: js_instanceof(js_inst, c.get_js_class())) + return self._find(lambda c: js.utils.instanceof(js_inst, c.get_js_class())) def find_from_name(self, name): return self._find(lambda c: c.__name__ == name) + def find_from_js_ctor(self, js_ctor): + return self._find(lambda c: js.utils.equals(c.get_js_class(), js_ctor)) + + def find(self, value): + if isinstance(value, pm.JSFunctionProxy): + return self.find_from_js_ctor(value) + elif isinstance(value, pm.JSObjectProxy): + return self.find_from_js_instance(value) + elif isinstance(value, str): + return self.find_from_name(value) + def __str__(self): return str(self._list) diff --git a/dcp/js/utils.py b/dcp/js/utils.py new file mode 100644 index 0000000..912afcb --- /dev/null +++ b/dcp/js/utils.py @@ -0,0 +1,28 @@ +import pythonmonkey as pm + +PMDict = pm.eval('x = {}; x').__class__ + + +def isclass(ref): + # TODO: come up with better way to determine if class.. + # if a js object prototype has more than one own property, it is a class + proto_own_prop_names = pm.eval( + 'x=>(x?.prototype ? Object.getOwnPropertyNames(x?.prototype) : [])') + return len(proto_own_prop_names(ref)) > 1 + + +def class_name(JSClass): + return pm.eval('x => x.name')(JSClass) + + +def instanceof(js_instance, JSClass): + return pm.eval('(i,c) => i instanceof c')(js_instance, JSClass) + + +def obj_constructor(js_instance): + return pm.eval('x => x.constructor')(js_instance) + + +def equals(a, b): + return pm.eval('(a,b) => a === b')(a, b) + diff --git a/tests/test_js_wrappers/test_js_object.py b/tests/test_js_wrappers/test_js_object.py index 973ff69..35fb1db 100644 --- a/tests/test_js_wrappers/test_js_object.py +++ b/tests/test_js_wrappers/test_js_object.py @@ -99,6 +99,8 @@ def test_wrapping_js_instance(self): self.assertTrue(py_obj.address == hex_code) + self.assertTrue(isinstance(py_obj, dcp.wallet.Address)) + if __name__ == '__main__': unittest.main() From aded710e8b1cd837ba37e9600c95ed4c26cf19ad Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Fri, 5 Jul 2024 08:28:27 -0400 Subject: [PATCH 25/47] refactor(class registry): rename to class_manager.reg --- dcp/__init__.py | 8 ++++---- dcp/dry/__init__.py | 4 ++-- dcp/dry/bfclass.py | 8 ++++---- dcp/dry/{classes.py => class_manager.py} | 2 +- dcp/dry/fn.py | 4 ++-- tests/test_js_wrappers/test_class_registry.py | 16 ++++++++-------- 6 files changed, 21 insertions(+), 21 deletions(-) rename dcp/dry/{classes.py => class_manager.py} (98%) diff --git a/dcp/__init__.py b/dcp/__init__.py index 8b4b714..7497088 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -1,6 +1,6 @@ -# NOTE TO SELF - have to load class registry before classes that use it +# NOTE TO SELF - have to load class reg before classes that use it -from .dry import make_dcp_class, class_registry, wrap_js_obj, aio_run_wrapper, blocking_run_wrapper +from .dry import make_dcp_class, class_manager, wrap_js_obj, aio_run_wrapper, blocking_run_wrapper from . import js from .api import compute_for as api_compute_for from .api import Job as api_Job @@ -48,10 +48,10 @@ def init_dcp_module(py_parent, js_module, js_name): for prop_name, prop_ref in js_module.items(): if isinstance(prop_ref, pm.JSFunctionProxy): if js.utils.isclass(prop_ref): - new_bfclass = class_registry.find(prop_ref) + new_bfclass = class_manager.reg.find(prop_ref) if new_bfclass is None: new_bfclass = make_dcp_class(prop_ref, name=prop_name) - class_registry.register(new_bfclass) + class_manager.reg.register(new_bfclass) # TODO - need to make this more prorgramatic and dry - maybe this belongs in a class manager..? TODO XXX TODO XXX if prop_name == 'Job': diff --git a/dcp/dry/__init__.py b/dcp/dry/__init__.py index 334eb65..e3a2e0f 100644 --- a/dcp/dry/__init__.py +++ b/dcp/dry/__init__.py @@ -1,6 +1,6 @@ from .bfclass import make_dcp_class, wrap_js_obj -from .classes import registry as class_registry +from . import class_manager from .fn import aio_run_wrapper, blocking_run_wrapper -__all__ = ['make_dcp_class', 'wrap_js_obj'] +__all__ = ['make_dcp_class', 'wrap_js_obj', class_manager] diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index a32cc78..ff9b3c3 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -7,7 +7,7 @@ import types import pythonmonkey as pm from .fn import aio_run_wrapper, blocking_run_wrapper -from . import classes +from . import class_manager from .. import js @@ -70,13 +70,13 @@ def wrap_js_obj(js_obj): if not isinstance(js_obj, pm.JSObjectProxy): return js_obj - # check if its in the class registry - matching_class = classes.registry.find(js_obj) + # check if its in the class reg + matching_class = class_manager.reg.find(js_obj) if matching_class is None: JSClass = js.utils.obj_constructor(js_obj) matching_class = make_dcp_class(JSClass) - classes.registry.register(matching_class) + class_manager.reg.register(matching_class) return matching_class(js_obj) diff --git a/dcp/dry/classes.py b/dcp/dry/class_manager.py similarity index 98% rename from dcp/dry/classes.py rename to dcp/dry/class_manager.py index e922fda..7f41595 100644 --- a/dcp/dry/classes.py +++ b/dcp/dry/class_manager.py @@ -49,5 +49,5 @@ def __repr__(self): return self.__str__() -registry = ClassRegistry() +reg = ClassRegistry() diff --git a/dcp/dry/fn.py b/dcp/dry/fn.py index 7e4fe47..f0f1fbe 100644 --- a/dcp/dry/fn.py +++ b/dcp/dry/fn.py @@ -1,6 +1,6 @@ import asyncio import inspect -from . import classes +from . import class_manager # this CAN'T LIVE HERE!!! TODO XXX but temporarily putting it here loop = asyncio.new_event_loop() @@ -13,7 +13,7 @@ async def aio_fn(*args, **kwargs): if inspect.isawaitable(return_value): return await return_value - # TODO: check class registry if it should be wrapped instance + # TODO: check class reg if it should be wrapped instance # if obj is py obj # find from ref # if not found diff --git a/tests/test_js_wrappers/test_class_registry.py b/tests/test_js_wrappers/test_class_registry.py index a21594d..bcf3d68 100644 --- a/tests/test_js_wrappers/test_class_registry.py +++ b/tests/test_js_wrappers/test_class_registry.py @@ -61,21 +61,21 @@ class JSHuman class TestClassRegistry(unittest.TestCase): def test_monolithic_add_retrieve(self): def test_adding_and_retrieval(): - dry.class_registry.register(PyRect) - dry.class_registry.register(PyCoff) - dry.class_registry.register(PyHuma) + dry.class_manager.reg.register(PyRect) + dry.class_manager.reg.register(PyCoff) + dry.class_manager.reg.register(PyHuma) # retrieval by JS Class name - Class = dry.class_registry.find_from_name('JSHuman') + Class = dry.class_manager.reg.find_from_name('JSHuman') self.assertTrue(Class.__name__, 'JSHuman') # retrieval by JS Class instance js_inst = pm.new(JSRectangle)(7, 11) - Class = dry.class_registry.find_from_js_instance(js_inst) + Class = dry.class_manager.reg.find_from_js_instance(js_inst) self.assertTrue(Class.__name__, 'JSRectangle') def test_baseclassing_from_retrieval(): - class PyRect2(dry.class_registry.find_from_name('JSRectangle')): + class PyRect2(dry.class_manager.reg.find_from_name('JSRectangle')): def __str__(self): return "changed" @@ -89,11 +89,11 @@ def area(self): self.assertEqual(my_inst.area(), 3 * 13 * 100) # overwritten def test_replacement(): - class PyCoffee2(dry.class_registry.find_from_name('JSCoffee')): + class PyCoffee2(dry.class_manager.reg.find('JSCoffee')): def __str__(self): return "this was changed" - dry.class_registry.replace_from_name('JSCoffee', PyCoffee2) + dry.class_manager.reg.replace_from_name('JSCoffee', PyCoffee2) ph2 = PyCoffee2() self.assertEqual(str(ph2), "this was changed") From ccf9195becb56e52e7e8d672e748646a972e84a6 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Fri, 5 Jul 2024 08:33:19 -0400 Subject: [PATCH 26/47] refactor(class registry): change register to add --- dcp/__init__.py | 2 +- dcp/dry/bfclass.py | 2 +- dcp/dry/class_manager.py | 2 +- tests/test_js_wrappers/test_class_registry.py | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dcp/__init__.py b/dcp/__init__.py index 7497088..7ce674e 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -51,7 +51,7 @@ def init_dcp_module(py_parent, js_module, js_name): new_bfclass = class_manager.reg.find(prop_ref) if new_bfclass is None: new_bfclass = make_dcp_class(prop_ref, name=prop_name) - class_manager.reg.register(new_bfclass) + class_manager.reg.add(new_bfclass) # TODO - need to make this more prorgramatic and dry - maybe this belongs in a class manager..? TODO XXX TODO XXX if prop_name == 'Job': diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index ff9b3c3..aed84cd 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -76,7 +76,7 @@ def wrap_js_obj(js_obj): if matching_class is None: JSClass = js.utils.obj_constructor(js_obj) matching_class = make_dcp_class(JSClass) - class_manager.reg.register(matching_class) + class_manager.reg.add(matching_class) return matching_class(js_obj) diff --git a/dcp/dry/class_manager.py b/dcp/dry/class_manager.py index 7f41595..2269dc1 100644 --- a/dcp/dry/class_manager.py +++ b/dcp/dry/class_manager.py @@ -18,7 +18,7 @@ def _replace_or_register(self, new_class, cmp): else: self.register(new_class) - def register(self, bfclass): + def add(self, bfclass): # TODO: should probably check for api inheritance here? self._list.append(bfclass) diff --git a/tests/test_js_wrappers/test_class_registry.py b/tests/test_js_wrappers/test_class_registry.py index bcf3d68..f03be19 100644 --- a/tests/test_js_wrappers/test_class_registry.py +++ b/tests/test_js_wrappers/test_class_registry.py @@ -61,9 +61,9 @@ class JSHuman class TestClassRegistry(unittest.TestCase): def test_monolithic_add_retrieve(self): def test_adding_and_retrieval(): - dry.class_manager.reg.register(PyRect) - dry.class_manager.reg.register(PyCoff) - dry.class_manager.reg.register(PyHuma) + dry.class_manager.reg.add(PyRect) + dry.class_manager.reg.add(PyCoff) + dry.class_manager.reg.add(PyHuma) # retrieval by JS Class name Class = dry.class_manager.reg.find_from_name('JSHuman') From 92e45395b0a98725b7460a88739b0f245d5a90a8 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Fri, 5 Jul 2024 10:18:48 -0400 Subject: [PATCH 27/47] feat(class registry): remove replacement --- dcp/dry/class_manager.py | 10 ---------- tests/test_js_wrappers/test_class_registry.py | 11 ----------- 2 files changed, 21 deletions(-) diff --git a/dcp/dry/class_manager.py b/dcp/dry/class_manager.py index 2269dc1..c1bf463 100644 --- a/dcp/dry/class_manager.py +++ b/dcp/dry/class_manager.py @@ -11,20 +11,10 @@ def __init__(self): def _find(self, cmp): return next((c for c in self._list if cmp(c)), None) - def _replace_or_register(self, new_class, cmp): - existing = self._find(cmp) - if existing: - self._list[self._list.index(existing)] = new_class - else: - self.register(new_class) - def add(self, bfclass): # TODO: should probably check for api inheritance here? self._list.append(bfclass) - def replace_from_name(self, name, new_class): - self._replace_or_register(new_class, lambda c: c.__name__ == name) - def find_from_js_instance(self, js_inst): return self._find(lambda c: js.utils.instanceof(js_inst, c.get_js_class())) diff --git a/tests/test_js_wrappers/test_class_registry.py b/tests/test_js_wrappers/test_class_registry.py index f03be19..bd4b26b 100644 --- a/tests/test_js_wrappers/test_class_registry.py +++ b/tests/test_js_wrappers/test_class_registry.py @@ -88,19 +88,8 @@ def area(self): self.assertEqual(my_inst.calcArea(), 3 * 13) # existing self.assertEqual(my_inst.area(), 3 * 13 * 100) # overwritten - def test_replacement(): - class PyCoffee2(dry.class_manager.reg.find('JSCoffee')): - def __str__(self): - return "this was changed" - - dry.class_manager.reg.replace_from_name('JSCoffee', PyCoffee2) - - ph2 = PyCoffee2() - self.assertEqual(str(ph2), "this was changed") - test_adding_and_retrieval() test_baseclassing_from_retrieval() - test_replacement() if __name__ == '__main__': From 646c1d069147687abda6e39f39a53a740c7b7fd4 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Fri, 5 Jul 2024 10:51:29 -0400 Subject: [PATCH 28/47] feat(class registry): apply inheritance check on reg add But on second thought this doesn't feel like the best place to put it... --- dcp/__init__.py | 9 ++------- dcp/api/__init__.py | 6 +++++- dcp/dry/class_manager.py | 9 ++++++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/dcp/__init__.py b/dcp/__init__.py index 7ce674e..b7e98cd 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -2,8 +2,7 @@ from .dry import make_dcp_class, class_manager, wrap_js_obj, aio_run_wrapper, blocking_run_wrapper from . import js -from .api import compute_for as api_compute_for -from .api import Job as api_Job +from .api import compute_for as api_compute_for #TODO - we should handle compute for and inheritance in same place /: from .sanity import sanity import sys from types import ModuleType as Module @@ -51,11 +50,7 @@ def init_dcp_module(py_parent, js_module, js_name): new_bfclass = class_manager.reg.find(prop_ref) if new_bfclass is None: new_bfclass = make_dcp_class(prop_ref, name=prop_name) - class_manager.reg.add(new_bfclass) - - # TODO - need to make this more prorgramatic and dry - maybe this belongs in a class manager..? TODO XXX TODO XXX - if prop_name == 'Job': - new_bfclass = type('Job', (new_bfclass,), dict(api_Job.__dict__)) + new_bfclass = class_manager.reg.add(new_bfclass) setattr(module, prop_name, new_bfclass) diff --git a/dcp/api/__init__.py b/dcp/api/__init__.py index f1d4019..eb1cf70 100644 --- a/dcp/api/__init__.py +++ b/dcp/api/__init__.py @@ -1,5 +1,9 @@ from .compute_for import compute_for from .job import Job -__all__ = ['compute_for', 'Job'] +inheritance_hooks = { + 'Job': Job, +} + +__all__ = ['compute_for', 'inheritance_hooks'] diff --git a/dcp/dry/class_manager.py b/dcp/dry/class_manager.py index c1bf463..0e43e12 100644 --- a/dcp/dry/class_manager.py +++ b/dcp/dry/class_manager.py @@ -1,8 +1,7 @@ import pythonmonkey as pm from .. import js +from .. import api -# TODO: rename to class manager -# TODO: add stuff for api inheritance setup class ClassRegistry: def __init__(self): @@ -11,9 +10,13 @@ def __init__(self): def _find(self, cmp): return next((c for c in self._list if cmp(c)), None) + # TODO: this feels wrong, it's doing too many things. it should just add + # classes to the registry... instead it also does the inheritance stuff. ): def add(self, bfclass): - # TODO: should probably check for api inheritance here? + if base_class := api.inheritance_hooks.get(bfclass.__name__): + bfclass = type(bfclass.__name__, (bfclass,), dict(base_class.__dict__)) self._list.append(bfclass) + return bfclass def find_from_js_instance(self, js_inst): return self._find(lambda c: js.utils.instanceof(js_inst, c.get_js_class())) From 611f9b8afb8d1ee49153141688407b04f269b808 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Fri, 5 Jul 2024 10:56:21 -0400 Subject: [PATCH 29/47] feat(sanity): remove sanity --- dcp/__init__.py | 3 +-- dcp/sanity.py | 3 --- tests/test_sanity.py | 15 --------------- 3 files changed, 1 insertion(+), 20 deletions(-) delete mode 100644 dcp/sanity.py delete mode 100644 tests/test_sanity.py diff --git a/dcp/__init__.py b/dcp/__init__.py index b7e98cd..b7ab44b 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -3,7 +3,6 @@ from .dry import make_dcp_class, class_manager, wrap_js_obj, aio_run_wrapper, blocking_run_wrapper from . import js from .api import compute_for as api_compute_for #TODO - we should handle compute for and inheritance in same place /: -from .sanity import sanity import sys from types import ModuleType as Module @@ -66,5 +65,5 @@ def init_dcp_module(py_parent, js_module, js_name): setattr(module, prop_name, prop_ref) -__all__ = ["init", "sanity"] +__all__ = ["init"] diff --git a/dcp/sanity.py b/dcp/sanity.py deleted file mode 100644 index b06e8f3..0000000 --- a/dcp/sanity.py +++ /dev/null @@ -1,3 +0,0 @@ -def sanity(): - return True - diff --git a/tests/test_sanity.py b/tests/test_sanity.py deleted file mode 100644 index 25e85da..0000000 --- a/tests/test_sanity.py +++ /dev/null @@ -1,15 +0,0 @@ -# tests/test_sanity.py - -import unittest -from dcp import sanity - - -class TestSanityFunction(unittest.TestCase): - def test_sanity_returns_true(self): - """Test if the sanity function returns True.""" - self.assertTrue(sanity()) - - -if __name__ == '__main__': - unittest.main() - From 6e7d71604fbc075d5410f3f33370be131431cac4 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Fri, 5 Jul 2024 11:31:09 -0400 Subject: [PATCH 30/47] feat(class registry): wrap ret values with bfclass temporary. THis is ugly, wrong way to think of things need to refactor and tease it into soemthing nicer --- dcp/dry/bfclass.py | 26 ++++++++++++-------------- dcp/dry/fn.py | 1 - dcp/js/utils.py | 2 +- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index aed84cd..854e84f 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -65,18 +65,16 @@ def __str__(self): return new_class - -def wrap_js_obj(js_obj): - if not isinstance(js_obj, pm.JSObjectProxy): - return js_obj - - # check if its in the class reg - matching_class = class_manager.reg.find(js_obj) - - if matching_class is None: - JSClass = js.utils.obj_constructor(js_obj) - matching_class = make_dcp_class(JSClass) - class_manager.reg.add(matching_class) - - return matching_class(js_obj) +# TODO: ew. The bfclass uses the class manager? Shouldn't the class manager +# use bfclass? REFACTOR LATER +def wrap_js_obj(js_val): + if isinstance(js_val, pm.JSObjectProxy): + bfclass = class_manager.reg.find(js_val) + + if bfclass is None: + bfclass = make_dcp_class(js.utils.obj_ctor(js_val)) + bfclass = class_manager.reg.add(bfclass) + + return bfclass(js_val) + return js_val diff --git a/dcp/dry/fn.py b/dcp/dry/fn.py index f0f1fbe..83fb969 100644 --- a/dcp/dry/fn.py +++ b/dcp/dry/fn.py @@ -1,6 +1,5 @@ import asyncio import inspect -from . import class_manager # this CAN'T LIVE HERE!!! TODO XXX but temporarily putting it here loop = asyncio.new_event_loop() diff --git a/dcp/js/utils.py b/dcp/js/utils.py index 912afcb..44e388d 100644 --- a/dcp/js/utils.py +++ b/dcp/js/utils.py @@ -19,7 +19,7 @@ def instanceof(js_instance, JSClass): return pm.eval('(i,c) => i instanceof c')(js_instance, JSClass) -def obj_constructor(js_instance): +def obj_ctor(js_instance): return pm.eval('x => x.constructor')(js_instance) From 3057f25befb2216172b2c8afd7436fad174fe5dd Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Sun, 7 Jul 2024 17:15:21 -0400 Subject: [PATCH 31/47] refactor(fn->aio): rename fn to aio --- dcp/__init__.py | 4 ++-- dcp/dry/__init__.py | 2 +- dcp/dry/{fn.py => aio.py} | 8 +++++--- dcp/dry/bfclass.py | 8 ++++---- 4 files changed, 12 insertions(+), 10 deletions(-) rename dcp/dry/{fn.py => aio.py} (74%) diff --git a/dcp/__init__.py b/dcp/__init__.py index b7ab44b..bda7a13 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -1,6 +1,6 @@ # NOTE TO SELF - have to load class reg before classes that use it -from .dry import make_dcp_class, class_manager, wrap_js_obj, aio_run_wrapper, blocking_run_wrapper +from .dry import make_dcp_class, class_manager, wrap_js_obj, asyncify, blockify from . import js from .api import compute_for as api_compute_for #TODO - we should handle compute for and inheritance in same place /: import sys @@ -54,7 +54,7 @@ def init_dcp_module(py_parent, js_module, js_name): setattr(module, prop_name, new_bfclass) else: - setattr(module, prop_name, blocking_run_wrapper(prop_ref)) + setattr(module, prop_name, blockify(prop_ref)) # js object elif prop_ref is js.utils.PMDict: diff --git a/dcp/dry/__init__.py b/dcp/dry/__init__.py index e3a2e0f..529e1fe 100644 --- a/dcp/dry/__init__.py +++ b/dcp/dry/__init__.py @@ -1,6 +1,6 @@ from .bfclass import make_dcp_class, wrap_js_obj from . import class_manager -from .fn import aio_run_wrapper, blocking_run_wrapper +from .aio import asyncify, blockify __all__ = ['make_dcp_class', 'wrap_js_obj', class_manager] diff --git a/dcp/dry/fn.py b/dcp/dry/aio.py similarity index 74% rename from dcp/dry/fn.py rename to dcp/dry/aio.py index 83fb969..d744765 100644 --- a/dcp/dry/fn.py +++ b/dcp/dry/aio.py @@ -2,16 +2,18 @@ import inspect # this CAN'T LIVE HERE!!! TODO XXX but temporarily putting it here +# TODO: actually, this might be the best place for this to live loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) -def aio_run_wrapper(leaky_async_fn): +def asyncify(leaky_async_fn): # leaky_asyn_fn may not return a corotine but still require an event loop async def aio_fn(*args, **kwargs): return_value = leaky_async_fn(*args, **kwargs) if inspect.isawaitable(return_value): return await return_value + # TODO: ignor the following todo, it doesn't belong in the aio class # TODO: check class reg if it should be wrapped instance # if obj is py obj # find from ref @@ -23,8 +25,8 @@ async def aio_fn(*args, **kwargs): return aio_fn -def blocking_run_wrapper(async_fn): +def blockify(async_fn): def blocking_fn(*args, **kwargs): - return loop.run_until_complete(aio_run_wrapper(async_fn)(*args, **kwargs)) + return loop.run_until_complete(asyncify(async_fn)(*args, **kwargs)) return blocking_fn diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py index 854e84f..b250766 100644 --- a/dcp/dry/bfclass.py +++ b/dcp/dry/bfclass.py @@ -6,7 +6,7 @@ import asyncio import types import pythonmonkey as pm -from .fn import aio_run_wrapper, blocking_run_wrapper +from .aio import asyncify, blockify from . import class_manager from .. import js @@ -20,7 +20,7 @@ def __init__(self, *args, **kwargs): self.js_ref = args[0] # otherwise, instantiate a new underlying js ref using the ctor args else: - async_wrapped_ctor = blocking_run_wrapper(pm.new(js_class)) + async_wrapped_ctor = blockify(pm.new(js_class)) self.js_ref = async_wrapped_ctor(*args, **kwargs) class AsyncAttrs: @@ -28,7 +28,7 @@ def __init__(self, parent): self.parent = parent def __getattr__(self, name): - return aio_run_wrapper(self.parent.js_ref[name]) + return asyncify(self.parent.js_ref[name]) self.aio = AsyncAttrs(self) @@ -41,7 +41,7 @@ def __getattr__(self, name): return js_attr def method(*args, **kwargs): - return blocking_run_wrapper(js_attr)(*args, **kwargs) + return blockify(js_attr)(*args, **kwargs) return method def __setattr__(self, name, value): From a32fa75fe0b4f846cd0ce6dc85cc8fe5a819888a Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Mon, 8 Jul 2024 08:56:18 -0400 Subject: [PATCH 32/47] docs(dry/aio): remove redundant comments At some point it didn't make sense to store the event loop in aio, but now it could make sense... maybe elsewhere would be better but maybe not! Also I initially had aio be fn (for managing functions) so I had a comment TODO for checking return values. Now that is no longer needed --- dcp/dry/aio.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/dcp/dry/aio.py b/dcp/dry/aio.py index d744765..ba29829 100644 --- a/dcp/dry/aio.py +++ b/dcp/dry/aio.py @@ -1,8 +1,6 @@ import asyncio import inspect -# this CAN'T LIVE HERE!!! TODO XXX but temporarily putting it here -# TODO: actually, this might be the best place for this to live loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) @@ -13,14 +11,6 @@ async def aio_fn(*args, **kwargs): if inspect.isawaitable(return_value): return await return_value - # TODO: ignor the following todo, it doesn't belong in the aio class - # TODO: check class reg if it should be wrapped instance - # if obj is py obj - # find from ref - # if not found - # register it as new class - # return the new instance of that class with the ref - return return_value return aio_fn From 129d9077763d09500c8a5d8ace7ca6d8c1255c59 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Mon, 8 Jul 2024 09:16:35 -0400 Subject: [PATCH 33/47] refactor(dry/class_manager): restructure class mgmt And clean up the code. --- dcp/__init__.py | 8 +- dcp/api/__init__.py | 4 +- dcp/dry/__init__.py | 5 +- dcp/dry/aio.py | 13 +++ dcp/dry/bfclass.py | 80 ------------- dcp/dry/class_manager.py | 106 +++++++++++++----- dcp/dry/class_registry.py | 56 +++++++++ tests/test_js_wrappers/test_class_registry.py | 7 +- tests/test_js_wrappers/test_js_object.py | 13 +-- 9 files changed, 162 insertions(+), 130 deletions(-) delete mode 100644 dcp/dry/bfclass.py create mode 100644 dcp/dry/class_registry.py diff --git a/dcp/__init__.py b/dcp/__init__.py index bda7a13..5c5fb92 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -1,6 +1,6 @@ # NOTE TO SELF - have to load class reg before classes that use it -from .dry import make_dcp_class, class_manager, wrap_js_obj, asyncify, blockify +from .dry import class_manager, aio from . import js from .api import compute_for as api_compute_for #TODO - we should handle compute for and inheritance in same place /: import sys @@ -48,17 +48,17 @@ def init_dcp_module(py_parent, js_module, js_name): if js.utils.isclass(prop_ref): new_bfclass = class_manager.reg.find(prop_ref) if new_bfclass is None: - new_bfclass = make_dcp_class(prop_ref, name=prop_name) + new_bfclass = class_manager.wrap_class(prop_ref, name=prop_name) new_bfclass = class_manager.reg.add(new_bfclass) setattr(module, prop_name, new_bfclass) else: - setattr(module, prop_name, blockify(prop_ref)) + setattr(module, prop_name, aio.blockify(prop_ref)) # js object elif prop_ref is js.utils.PMDict: - setattr(module, prop_name, wrap_js_obj(prop_ref)) + setattr(module, prop_name, class_manager.wrap_obj(prop_ref)) # py dict else: diff --git a/dcp/api/__init__.py b/dcp/api/__init__.py index eb1cf70..12db2e4 100644 --- a/dcp/api/__init__.py +++ b/dcp/api/__init__.py @@ -1,9 +1,9 @@ from .compute_for import compute_for from .job import Job -inheritance_hooks = { +sub_classes = { 'Job': Job, } -__all__ = ['compute_for', 'inheritance_hooks'] +__all__ = ['compute_for', 'sub_classes'] diff --git a/dcp/dry/__init__.py b/dcp/dry/__init__.py index 529e1fe..be80187 100644 --- a/dcp/dry/__init__.py +++ b/dcp/dry/__init__.py @@ -1,6 +1,5 @@ -from .bfclass import make_dcp_class, wrap_js_obj from . import class_manager -from .aio import asyncify, blockify +from . import aio -__all__ = ['make_dcp_class', 'wrap_js_obj', class_manager] +__all__ = ['class_manager', 'aio'] diff --git a/dcp/dry/aio.py b/dcp/dry/aio.py index ba29829..3925a7b 100644 --- a/dcp/dry/aio.py +++ b/dcp/dry/aio.py @@ -1,3 +1,16 @@ +""" +Manage asynchronous functions involving the PythonMonkey event loop. + +Functions: +- asyncify(leaky_async_fn): make a leaky PM JS promise not leak. +- blockify(async_fn): make a leaky PM JS promise not leak and block. + +Properties: +- loop: the single event loop used for all PythonMonkey ev loop interactions. + +Author: Will Pringle +Date: June 2024 +""" import asyncio import inspect diff --git a/dcp/dry/bfclass.py b/dcp/dry/bfclass.py deleted file mode 100644 index b250766..0000000 --- a/dcp/dry/bfclass.py +++ /dev/null @@ -1,80 +0,0 @@ -# @file bfclass.py - Wrapper Class factory for DCP JS Classes -# -# @author Will Pringle -# @date June 2024 - -import asyncio -import types -import pythonmonkey as pm -from .aio import asyncify, blockify -from . import class_manager -from .. import js - - -def make_dcp_class(js_class, name=None): - name = name or js.utils.class_name(js_class) - - def __init__(self, *args, **kwargs): - # if the sole argument to the ctor is a js instance, use it as the ref - if len(args) == 1 and js.utils.instanceof(args[0], js_class): - self.js_ref = args[0] - # otherwise, instantiate a new underlying js ref using the ctor args - else: - async_wrapped_ctor = blockify(pm.new(js_class)) - self.js_ref = async_wrapped_ctor(*args, **kwargs) - - class AsyncAttrs: - def __init__(self, parent): - self.parent = parent - - def __getattr__(self, name): - return asyncify(self.parent.js_ref[name]) - - self.aio = AsyncAttrs(self) - - def __getattr__(self, name): - js_attr = self.js_ref[name] - if not callable(js_attr): - if isinstance(js_attr, pm.JSObjectProxy): - return wrap_js_obj(js_attr) - else: - return js_attr - - def method(*args, **kwargs): - return blockify(js_attr)(*args, **kwargs) - return method - - def __setattr__(self, name, value): - if name == 'js_ref': - object.__setattr__(self, name, value) - else: - self.js_ref[name] = value - - def __str__(self): - return str(self.js_ref) - - props = { - '__init__': __init__, - '__getattr__': __getattr__, - '__setattr__': __setattr__, - '__str__': __str__, - 'get_js_class': staticmethod(lambda: js_class), - } - - new_class = type(name, (object,), props) - - return new_class - -# TODO: ew. The bfclass uses the class manager? Shouldn't the class manager -# use bfclass? REFACTOR LATER -def wrap_js_obj(js_val): - if isinstance(js_val, pm.JSObjectProxy): - bfclass = class_manager.reg.find(js_val) - - if bfclass is None: - bfclass = make_dcp_class(js.utils.obj_ctor(js_val)) - bfclass = class_manager.reg.add(bfclass) - - return bfclass(js_val) - return js_val - diff --git a/dcp/dry/class_manager.py b/dcp/dry/class_manager.py index 0e43e12..c4c22ac 100644 --- a/dcp/dry/class_manager.py +++ b/dcp/dry/class_manager.py @@ -1,46 +1,92 @@ +""" +Manage Bifrost 2 Class wrappers. + +Decorate the raw PythonMonkey JS Proxies with Pythonic Bifrost 2 API classes. + +Functions: +- wrap_class(js_class, name=None): Creates a proxy class. +- wrap_obj(js_val): Returns a proxy instance. + +Properties: +- reg: a class registry of saved pythonic wrapper classes. + +Author: Will Pringle +Date: June 2024 +""" + import pythonmonkey as pm +from .aio import asyncify, blockify +from .class_registry import ClassRegistry from .. import js -from .. import api + +reg = ClassRegistry() -class ClassRegistry: - def __init__(self): - self._list = [] +def wrap_class(js_class, name=None): + """Wraps a PythonMonkey JS Proxy Class Function as a Pythonic Class""" + name = name or js.utils.class_name(js_class) - def _find(self, cmp): - return next((c for c in self._list if cmp(c)), None) + def __init__(self, *args, **kwargs): + # if the sole argument to the ctor is a js instance, use it as the ref + if len(args) == 1 and js.utils.instanceof(args[0], js_class): + self.js_ref = args[0] + # otherwise, instantiate a new underlying js ref using the ctor args + else: + async_wrapped_ctor = blockify(pm.new(js_class)) + self.js_ref = async_wrapped_ctor(*args, **kwargs) - # TODO: this feels wrong, it's doing too many things. it should just add - # classes to the registry... instead it also does the inheritance stuff. ): - def add(self, bfclass): - if base_class := api.inheritance_hooks.get(bfclass.__name__): - bfclass = type(bfclass.__name__, (bfclass,), dict(base_class.__dict__)) - self._list.append(bfclass) - return bfclass + class AsyncAttrs: + """For instance.aio.*""" + def __init__(self, parent): + self.parent = parent - def find_from_js_instance(self, js_inst): - return self._find(lambda c: js.utils.instanceof(js_inst, c.get_js_class())) + def __getattr__(self, name): + return asyncify(self.parent.js_ref[name]) - def find_from_name(self, name): - return self._find(lambda c: c.__name__ == name) + self.aio = AsyncAttrs(self) - def find_from_js_ctor(self, js_ctor): - return self._find(lambda c: js.utils.equals(c.get_js_class(), js_ctor)) + def __getattr__(self, name): + js_attr = self.js_ref[name] + if not callable(js_attr): + if isinstance(js_attr, pm.JSObjectProxy): + return wrap_obj(js_attr) + return js_attr - def find(self, value): - if isinstance(value, pm.JSFunctionProxy): - return self.find_from_js_ctor(value) - elif isinstance(value, pm.JSObjectProxy): - return self.find_from_js_instance(value) - elif isinstance(value, str): - return self.find_from_name(value) + def method(*args, **kwargs): + return blockify(js_attr)(*args, **kwargs) + return method + + def __setattr__(self, name, value): + if name == 'js_ref': + object.__setattr__(self, name, value) + else: + self.js_ref[name] = value def __str__(self): - return str(self._list) + return str(self.js_ref) - def __repr__(self): - return self.__str__() + props = { + '__init__': __init__, + '__getattr__': __getattr__, + '__setattr__': __setattr__, + '__str__': __str__, + 'get_js_class': staticmethod(lambda: js_class), + } + new_class = type(name, (object,), props) -reg = ClassRegistry() + return new_class + + +def wrap_obj(js_val): + """Wraps a PythonMonkey JS Proxy instance as a Pythonic Class instance""" + if isinstance(js_val, pm.JSObjectProxy): + bfclass = reg.find(js_val) + + if bfclass is None: + bfclass = wrap_class(js.utils.obj_ctor(js_val)) + bfclass = reg.add(bfclass) + + return bfclass(js_val) + return js_val diff --git a/dcp/dry/class_registry.py b/dcp/dry/class_registry.py new file mode 100644 index 0000000..11ee919 --- /dev/null +++ b/dcp/dry/class_registry.py @@ -0,0 +1,56 @@ +""" +Store dynamically created classes in a registry for later use. + +Classes: +- ClassRegistry(). + +Author: Will Pringle +Date: June 2024 +""" + +import pythonmonkey as pm +from .. import js +from .. import api + + +class ClassRegistry: + def __init__(self): + self._list = [] + + def _find(self, cmp): + return next((c for c in self._list if cmp(c)), None) + + # TODO: this feels wrong, it's doing too many things. it should just add + # classes to the registry... instead it also does the inheritance stuff. ): + def add(self, bfclass): + """Registers a new BF2 Wrapper class, replaces with api subclasses.""" + if sub_class := api.sub_classes.get(bfclass.__name__): + bfclass = type(bfclass.__name__, (bfclass,), dict(sub_class.__dict__)) + self._list.append(bfclass) + return bfclass + + def find_from_js_instance(self, js_inst): + return self._find(lambda c: js.utils.instanceof(js_inst, c.get_js_class())) + + def find_from_name(self, name): + return self._find(lambda c: c.__name__ == name) + + def find_from_js_ctor(self, js_ctor): + return self._find(lambda c: js.utils.equals(c.get_js_class(), js_ctor)) + + def find(self, value): + """Finds the corresponding BF2 Wrapper class from the registry.""" + if isinstance(value, pm.JSFunctionProxy): + return self.find_from_js_ctor(value) + if isinstance(value, pm.JSObjectProxy): + return self.find_from_js_instance(value) + if isinstance(value, str): + return self.find_from_name(value) + return None + + def __str__(self): + return str(self._list) + + def __repr__(self): + return self.__str__() + diff --git a/tests/test_js_wrappers/test_class_registry.py b/tests/test_js_wrappers/test_class_registry.py index bd4b26b..be455f6 100644 --- a/tests/test_js_wrappers/test_class_registry.py +++ b/tests/test_js_wrappers/test_class_registry.py @@ -1,7 +1,6 @@ import unittest import pythonmonkey as pm from dcp import dry -from dcp.dry import make_dcp_class as make_class JSRectangle = pm.eval(""" class JSRectangle @@ -53,9 +52,9 @@ class JSHuman JSHuman; """) -PyRect = make_class(JSRectangle) -PyCoff = make_class(JSCoffee) -PyHuma = make_class(JSHuman) +PyRect = dry.class_manager.wrap_class(JSRectangle) +PyCoff = dry.class_manager.wrap_class(JSCoffee) +PyHuma = dry.class_manager.wrap_class(JSHuman) class TestClassRegistry(unittest.TestCase): diff --git a/tests/test_js_wrappers/test_js_object.py b/tests/test_js_wrappers/test_js_object.py index 35fb1db..9a2e98f 100644 --- a/tests/test_js_wrappers/test_js_object.py +++ b/tests/test_js_wrappers/test_js_object.py @@ -3,8 +3,7 @@ import inspect import pythonmonkey as pm import dcp -from dcp.dry import make_dcp_class as make_class -from dcp.dry import wrap_js_obj +from dcp.dry import class_manager class TestJSObjectFunction(unittest.TestCase): @@ -29,7 +28,7 @@ class Rectangle Rectangle; """) - PyRect = make_class(JSRect) + PyRect = class_manager.wrap_class(JSRect) my_rect = PyRect(2, 7) self.assertTrue(my_rect.area == 2 * 7) @@ -51,7 +50,7 @@ class Coffee Coffee; """) - Coffee = make_class(MyClass) + Coffee = class_manager.wrap_class(MyClass) cup_of_joe = Coffee() # should be able to sleep synchronously @@ -80,7 +79,7 @@ class Human Human; """) - HumanPy = make_class(Human) + HumanPy = class_manager.wrap_class(Human) # verify constructor promise has been resolved baby = HumanPy('Joe') @@ -92,10 +91,10 @@ def test_wrapping_js_instance(self): dcp.init() Address = pm.globalThis.dcp.wallet.Address - make_class(Address) + class_manager.wrap_class(Address) address = pm.new(Address)(hex_code) - py_obj = wrap_js_obj(address) + py_obj = class_manager.wrap_obj(address) self.assertTrue(py_obj.address == hex_code) From 01e402467bebad4be9da6115f6122d46bf53a7cd Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Mon, 8 Jul 2024 11:48:10 -0400 Subject: [PATCH 34/47] feat(class_registry): improve lookup to check string ctor name This seems to be good enough for dcp classes --- dcp/dry/class_registry.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dcp/dry/class_registry.py b/dcp/dry/class_registry.py index 11ee919..acee184 100644 --- a/dcp/dry/class_registry.py +++ b/dcp/dry/class_registry.py @@ -30,7 +30,14 @@ def add(self, bfclass): return bfclass def find_from_js_instance(self, js_inst): - return self._find(lambda c: js.utils.instanceof(js_inst, c.get_js_class())) + def cmp(c): + js_inst_is_instance = js.utils.instanceof(js_inst, c.get_js_class()) + + instance_cname = js.utils.class_name(js.utils.obj_ctor(js_inst)) + class_cname = js.utils.class_name(c.get_js_class()) + + return js_inst_is_instance and instance_cname == class_cname + return self._find(cmp) def find_from_name(self, name): return self._find(lambda c: c.__name__ == name) From 5f0e4aecd1edbd81e84e28e7152cd6ad82655480 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Mon, 8 Jul 2024 11:49:42 -0400 Subject: [PATCH 35/47] feat(compute_for): initial setup for compute_for api --- dcp/__init__.py | 5 ++++- dcp/api/__init__.py | 4 ++-- dcp/api/compute_for.py | 13 +++++++++++-- dcp/dry/class_manager.py | 10 +++++----- example.py | 5 ++--- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/dcp/__init__.py b/dcp/__init__.py index 5c5fb92..bbb85a8 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -2,7 +2,7 @@ from .dry import class_manager, aio from . import js -from .api import compute_for as api_compute_for #TODO - we should handle compute for and inheritance in same place /: +from . import api import sys from types import ModuleType as Module @@ -27,6 +27,9 @@ def init(**kwargs) -> Module: for name in pm.globalThis.dcp.keys(): init_dcp_module(sys.modules[__name__], pm.globalThis.dcp[name], name) + # add some api top level imports + setattr(sys.modules[__name__], "compute_for", api.compute_for_maker(), ) + init_memo = sys.modules[__name__] return init_memo diff --git a/dcp/api/__init__.py b/dcp/api/__init__.py index 12db2e4..c9a0124 100644 --- a/dcp/api/__init__.py +++ b/dcp/api/__init__.py @@ -1,9 +1,9 @@ -from .compute_for import compute_for +from .compute_for import compute_for_maker from .job import Job sub_classes = { 'Job': Job, } -__all__ = ['compute_for', 'sub_classes'] +__all__ = ['compute_for_maker', 'sub_classes'] diff --git a/dcp/api/compute_for.py b/dcp/api/compute_for.py index 5c7d8b2..b2b43d9 100644 --- a/dcp/api/compute_for.py +++ b/dcp/api/compute_for.py @@ -1,2 +1,11 @@ -def compute_for(*args, **kwargs): - pass +import pythonmonkey as pm +from .. import dry +from .. import js + +def compute_for_maker(): + def compute_for(*args, **kwargs): + compute_for_js = pm.eval("globalThis.dcp.compute.for") + ret_val = dry.aio.blockify(compute_for_js)(*args, **kwargs) + return dry.class_manager.wrap_obj(ret_val) + return compute_for + diff --git a/dcp/dry/class_manager.py b/dcp/dry/class_manager.py index c4c22ac..d535dad 100644 --- a/dcp/dry/class_manager.py +++ b/dcp/dry/class_manager.py @@ -48,12 +48,11 @@ def __getattr__(self, name): def __getattr__(self, name): js_attr = self.js_ref[name] if not callable(js_attr): - if isinstance(js_attr, pm.JSObjectProxy): - return wrap_obj(js_attr) - return js_attr + return wrap_obj(js_attr) def method(*args, **kwargs): - return blockify(js_attr)(*args, **kwargs) + ret_val = blockify(js_attr)(*args, **kwargs) + return wrap_obj(ret_val) return method def __setattr__(self, name, value): @@ -63,7 +62,8 @@ def __setattr__(self, name, value): self.js_ref[name] = value def __str__(self): - return str(self.js_ref) + return name + #return str(self.js_ref) props = { '__init__': __init__, diff --git a/example.py b/example.py index c1c4d45..f55e04d 100755 --- a/example.py +++ b/example.py @@ -5,10 +5,9 @@ import dcp dcp.init() -from dcp import job +from dcp import compute_for - -my_j = job.Job('x=>{progress();return x+x;}', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) +my_j = compute_for([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 'x=>{progress();return x+x;}') my_j.on('readystatechange', print) my_j.on('result', print) From b0ab4fbbe26863b453ceaaf8fe317441c302225c Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Tue, 9 Jul 2024 11:48:38 -0400 Subject: [PATCH 36/47] feat(result-handle): better result-handle handling Unfortunately the ResultHandle class is a proxy to an iterator, which means it's difficult to get good introspection into it... But we can use duck typing to check for this special case )''': --- dcp/api/__init__.py | 2 ++ dcp/api/result_handle.py | 7 +++++++ dcp/dry/class_manager.py | 22 +++++++++++++++++++--- example.py | 2 +- 4 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 dcp/api/result_handle.py diff --git a/dcp/api/__init__.py b/dcp/api/__init__.py index c9a0124..8f60503 100644 --- a/dcp/api/__init__.py +++ b/dcp/api/__init__.py @@ -1,8 +1,10 @@ from .compute_for import compute_for_maker from .job import Job +from .result_handle import ResultHandle sub_classes = { 'Job': Job, + 'ResultHandle': ResultHandle, } __all__ = ['compute_for_maker', 'sub_classes'] diff --git a/dcp/api/result_handle.py b/dcp/api/result_handle.py new file mode 100644 index 0000000..f68b366 --- /dev/null +++ b/dcp/api/result_handle.py @@ -0,0 +1,7 @@ +class ResultHandle(): + def __str__(self): + return str(self.values()) + + def __repr__(self): + return self.__str__() + diff --git a/dcp/dry/class_manager.py b/dcp/dry/class_manager.py index d535dad..2be67e9 100644 --- a/dcp/dry/class_manager.py +++ b/dcp/dry/class_manager.py @@ -43,7 +43,7 @@ def __init__(self, parent): def __getattr__(self, name): return asyncify(self.parent.js_ref[name]) - self.aio = AsyncAttrs(self) + object.__setattr__(self, 'aio', AsyncAttrs(self)) def __getattr__(self, name): js_attr = self.js_ref[name] @@ -62,8 +62,11 @@ def __setattr__(self, name, value): self.js_ref[name] = value def __str__(self): - return name - #return str(self.js_ref) + # Workaround required since PythonMonkey will encounter errors while str values + try: + return str(self.js_ref) + except: + return name props = { '__init__': __init__, @@ -80,6 +83,9 @@ def __str__(self): def wrap_obj(js_val): """Wraps a PythonMonkey JS Proxy instance as a Pythonic Class instance""" + if bfclass := ugly_duck_type_check(js_val): + return bfclass(js_val) + if isinstance(js_val, pm.JSObjectProxy): bfclass = reg.find(js_val) @@ -90,3 +96,13 @@ def wrap_obj(js_val): return bfclass(js_val) return js_val +# TODO: there must be a better way to check for this... +def ugly_duck_type_check(js_val): + """Check via duck typing what the js_val is.""" + + # check if it's a result handle + result_handle_props = ['toJSON', 'newResult', 'getLength', 'slice', 'fetch'] + if js.utils.class_name(js.utils.obj_ctor(js_val)) == 'Function': + if next((x for x in result_handle_props if js_val[x] is None), None) is None: + return reg.find('ResultHandle') + diff --git a/example.py b/example.py index f55e04d..d3c5eac 100755 --- a/example.py +++ b/example.py @@ -25,5 +25,5 @@ def accepted_handler(ev): # res = my_j.wait() print(">>>>>>>>>>>>>>>>>>>>>>>>>> RESULTS ARE IN") -print(pm.eval('Array.from')(res)) +print(res) From e9f2291ac48ac643cdbd4700fe233ba5f1398c6d Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 09:17:44 -0400 Subject: [PATCH 37/47] Move contents from dcp/__init__.py to dcp/initalization.py --- dcp/__init__.py | 56 +++++++++++++++++------------------ dcp/initalization.py | 70 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 29 deletions(-) create mode 100644 dcp/initalization.py diff --git a/dcp/__init__.py b/dcp/__init__.py index bbb85a8..c3880e7 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -1,39 +1,15 @@ -# NOTE TO SELF - have to load class reg before classes that use it - +import sys +from types import ModuleType as Module +from typing import Callable +import pythonmonkey as pm from .dry import class_manager, aio from . import js from . import api -import sys -from types import ModuleType as Module -import pythonmonkey as pm # state init_memo = None - -def init(**kwargs) -> Module: - global init_memo - - # no-op on multiple initializations - if init_memo is not None: - return init_memo - - # initialize dcp - js.dcp_client['init'](**kwargs) - init_memo = True - - # build dcp modules - for name in pm.globalThis.dcp.keys(): - init_dcp_module(sys.modules[__name__], pm.globalThis.dcp[name], name) - - # add some api top level imports - setattr(sys.modules[__name__], "compute_for", api.compute_for_maker(), ) - - init_memo = sys.modules[__name__] - return init_memo - - def init_dcp_module(py_parent, js_module, js_name): underscore_name = f"{js_name.replace('-', '_')}" module_name = f"{py_parent.__name__}.{underscore_name}" @@ -68,5 +44,27 @@ def init_dcp_module(py_parent, js_module, js_name): setattr(module, prop_name, prop_ref) -__all__ = ["init"] +def make_init_fn(dcp_module) -> Callable: + def init(**kwargs) -> Module: + global init_memo + + # no-op on multiple initializations + if init_memo is not None: + return init_memo + + # initialize dcp + js.dcp_client['init'](**kwargs) + init_memo = True + + # build dcp modules + for name in pm.globalThis.dcp.keys(): + init_dcp_module(dcp_module, pm.globalThis.dcp[name], name) + + # add some api top level imports + setattr(dcp_module, "compute_for", api.compute_for_maker(), ) + + init_memo = dcp_module + return init_memo + + return init diff --git a/dcp/initalization.py b/dcp/initalization.py new file mode 100644 index 0000000..c3880e7 --- /dev/null +++ b/dcp/initalization.py @@ -0,0 +1,70 @@ +import sys +from types import ModuleType as Module +from typing import Callable +import pythonmonkey as pm +from .dry import class_manager, aio +from . import js +from . import api + + +# state +init_memo = None + +def init_dcp_module(py_parent, js_module, js_name): + underscore_name = f"{js_name.replace('-', '_')}" + module_name = f"{py_parent.__name__}.{underscore_name}" + module = Module(module_name) + module.__file__ = f"" + module._js = js_module + sys.modules[module_name] = module + + # add the new module as a submodule of the root module + setattr(py_parent, underscore_name, module) + + # wrap js elements of the cjs module + for prop_name, prop_ref in js_module.items(): + if isinstance(prop_ref, pm.JSFunctionProxy): + if js.utils.isclass(prop_ref): + new_bfclass = class_manager.reg.find(prop_ref) + if new_bfclass is None: + new_bfclass = class_manager.wrap_class(prop_ref, name=prop_name) + new_bfclass = class_manager.reg.add(new_bfclass) + + setattr(module, prop_name, new_bfclass) + + else: + setattr(module, prop_name, aio.blockify(prop_ref)) + + # js object + elif prop_ref is js.utils.PMDict: + setattr(module, prop_name, class_manager.wrap_obj(prop_ref)) + + # py dict + else: + setattr(module, prop_name, prop_ref) + + +def make_init_fn(dcp_module) -> Callable: + def init(**kwargs) -> Module: + global init_memo + + # no-op on multiple initializations + if init_memo is not None: + return init_memo + + # initialize dcp + js.dcp_client['init'](**kwargs) + init_memo = True + + # build dcp modules + for name in pm.globalThis.dcp.keys(): + init_dcp_module(dcp_module, pm.globalThis.dcp[name], name) + + # add some api top level imports + setattr(dcp_module, "compute_for", api.compute_for_maker(), ) + + init_memo = dcp_module + return init_memo + + return init + From 87ca992adef9373dd1282726a47a1975ff4cc57f Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 09:21:07 -0400 Subject: [PATCH 38/47] [git-dup] duplicate dcp/__init__.py to dcp/initialization.py --- dcp/{__init__.py => initialization.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename dcp/{__init__.py => initialization.py} (100%) diff --git a/dcp/__init__.py b/dcp/initialization.py similarity index 100% rename from dcp/__init__.py rename to dcp/initialization.py From ee440fad03c2dc572d6d2a94786b48f5885fb02e Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 09:21:07 -0400 Subject: [PATCH 39/47] [git-dup] restore dcp/__init__.py --- dcp/__init__.py | 70 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 dcp/__init__.py diff --git a/dcp/__init__.py b/dcp/__init__.py new file mode 100644 index 0000000..c3880e7 --- /dev/null +++ b/dcp/__init__.py @@ -0,0 +1,70 @@ +import sys +from types import ModuleType as Module +from typing import Callable +import pythonmonkey as pm +from .dry import class_manager, aio +from . import js +from . import api + + +# state +init_memo = None + +def init_dcp_module(py_parent, js_module, js_name): + underscore_name = f"{js_name.replace('-', '_')}" + module_name = f"{py_parent.__name__}.{underscore_name}" + module = Module(module_name) + module.__file__ = f"" + module._js = js_module + sys.modules[module_name] = module + + # add the new module as a submodule of the root module + setattr(py_parent, underscore_name, module) + + # wrap js elements of the cjs module + for prop_name, prop_ref in js_module.items(): + if isinstance(prop_ref, pm.JSFunctionProxy): + if js.utils.isclass(prop_ref): + new_bfclass = class_manager.reg.find(prop_ref) + if new_bfclass is None: + new_bfclass = class_manager.wrap_class(prop_ref, name=prop_name) + new_bfclass = class_manager.reg.add(new_bfclass) + + setattr(module, prop_name, new_bfclass) + + else: + setattr(module, prop_name, aio.blockify(prop_ref)) + + # js object + elif prop_ref is js.utils.PMDict: + setattr(module, prop_name, class_manager.wrap_obj(prop_ref)) + + # py dict + else: + setattr(module, prop_name, prop_ref) + + +def make_init_fn(dcp_module) -> Callable: + def init(**kwargs) -> Module: + global init_memo + + # no-op on multiple initializations + if init_memo is not None: + return init_memo + + # initialize dcp + js.dcp_client['init'](**kwargs) + init_memo = True + + # build dcp modules + for name in pm.globalThis.dcp.keys(): + init_dcp_module(dcp_module, pm.globalThis.dcp[name], name) + + # add some api top level imports + setattr(dcp_module, "compute_for", api.compute_for_maker(), ) + + init_memo = dcp_module + return init_memo + + return init + From 2bd49bc28bb4b84efc3ee3ff0fc30ac5a008810e Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 09:22:32 -0400 Subject: [PATCH 40/47] refactor(init): move init logic outside of __init__ --- dcp/__init__.py | 69 ++---------------------------------------- dcp/initalization.py | 70 ------------------------------------------- dcp/initialization.py | 28 ++++++++++++----- 3 files changed, 23 insertions(+), 144 deletions(-) delete mode 100644 dcp/initalization.py diff --git a/dcp/__init__.py b/dcp/__init__.py index c3880e7..7c2e9b5 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -1,70 +1,7 @@ +from .initialization import make_init_fn import sys -from types import ModuleType as Module -from typing import Callable -import pythonmonkey as pm -from .dry import class_manager, aio -from . import js -from . import api +init = make_init_fn(sys.modules[__name__]) -# state -init_memo = None - -def init_dcp_module(py_parent, js_module, js_name): - underscore_name = f"{js_name.replace('-', '_')}" - module_name = f"{py_parent.__name__}.{underscore_name}" - module = Module(module_name) - module.__file__ = f"" - module._js = js_module - sys.modules[module_name] = module - - # add the new module as a submodule of the root module - setattr(py_parent, underscore_name, module) - - # wrap js elements of the cjs module - for prop_name, prop_ref in js_module.items(): - if isinstance(prop_ref, pm.JSFunctionProxy): - if js.utils.isclass(prop_ref): - new_bfclass = class_manager.reg.find(prop_ref) - if new_bfclass is None: - new_bfclass = class_manager.wrap_class(prop_ref, name=prop_name) - new_bfclass = class_manager.reg.add(new_bfclass) - - setattr(module, prop_name, new_bfclass) - - else: - setattr(module, prop_name, aio.blockify(prop_ref)) - - # js object - elif prop_ref is js.utils.PMDict: - setattr(module, prop_name, class_manager.wrap_obj(prop_ref)) - - # py dict - else: - setattr(module, prop_name, prop_ref) - - -def make_init_fn(dcp_module) -> Callable: - def init(**kwargs) -> Module: - global init_memo - - # no-op on multiple initializations - if init_memo is not None: - return init_memo - - # initialize dcp - js.dcp_client['init'](**kwargs) - init_memo = True - - # build dcp modules - for name in pm.globalThis.dcp.keys(): - init_dcp_module(dcp_module, pm.globalThis.dcp[name], name) - - # add some api top level imports - setattr(dcp_module, "compute_for", api.compute_for_maker(), ) - - init_memo = dcp_module - return init_memo - - return init +__all__ = ['init'] diff --git a/dcp/initalization.py b/dcp/initalization.py deleted file mode 100644 index c3880e7..0000000 --- a/dcp/initalization.py +++ /dev/null @@ -1,70 +0,0 @@ -import sys -from types import ModuleType as Module -from typing import Callable -import pythonmonkey as pm -from .dry import class_manager, aio -from . import js -from . import api - - -# state -init_memo = None - -def init_dcp_module(py_parent, js_module, js_name): - underscore_name = f"{js_name.replace('-', '_')}" - module_name = f"{py_parent.__name__}.{underscore_name}" - module = Module(module_name) - module.__file__ = f"" - module._js = js_module - sys.modules[module_name] = module - - # add the new module as a submodule of the root module - setattr(py_parent, underscore_name, module) - - # wrap js elements of the cjs module - for prop_name, prop_ref in js_module.items(): - if isinstance(prop_ref, pm.JSFunctionProxy): - if js.utils.isclass(prop_ref): - new_bfclass = class_manager.reg.find(prop_ref) - if new_bfclass is None: - new_bfclass = class_manager.wrap_class(prop_ref, name=prop_name) - new_bfclass = class_manager.reg.add(new_bfclass) - - setattr(module, prop_name, new_bfclass) - - else: - setattr(module, prop_name, aio.blockify(prop_ref)) - - # js object - elif prop_ref is js.utils.PMDict: - setattr(module, prop_name, class_manager.wrap_obj(prop_ref)) - - # py dict - else: - setattr(module, prop_name, prop_ref) - - -def make_init_fn(dcp_module) -> Callable: - def init(**kwargs) -> Module: - global init_memo - - # no-op on multiple initializations - if init_memo is not None: - return init_memo - - # initialize dcp - js.dcp_client['init'](**kwargs) - init_memo = True - - # build dcp modules - for name in pm.globalThis.dcp.keys(): - init_dcp_module(dcp_module, pm.globalThis.dcp[name], name) - - # add some api top level imports - setattr(dcp_module, "compute_for", api.compute_for_maker(), ) - - init_memo = dcp_module - return init_memo - - return init - diff --git a/dcp/initialization.py b/dcp/initialization.py index c3880e7..4822d7b 100644 --- a/dcp/initialization.py +++ b/dcp/initialization.py @@ -1,3 +1,13 @@ +""" +Dynamically initialize the dcp mode. + +Traverses through the dcp-client CJS modules to generate the dcp Python module +and build a registry of classes along the way which are automatically wrapped. + +Author: Will Pringle +Date: June 2024 +""" + import sys from types import ModuleType as Module from typing import Callable @@ -6,11 +16,12 @@ from . import js from . import api - # state -init_memo = None +INIT_MEMO = None + def init_dcp_module(py_parent, js_module, js_name): + """builds the dcp module and class registry""" underscore_name = f"{js_name.replace('-', '_')}" module_name = f"{py_parent.__name__}.{underscore_name}" module = Module(module_name) @@ -45,16 +56,17 @@ def init_dcp_module(py_parent, js_module, js_name): def make_init_fn(dcp_module) -> Callable: + """Creates the init function to return.""" def init(**kwargs) -> Module: - global init_memo + global INIT_MEMO # no-op on multiple initializations - if init_memo is not None: - return init_memo + if INIT_MEMO is not None: + return INIT_MEMO # initialize dcp js.dcp_client['init'](**kwargs) - init_memo = True + INIT_MEMO = True # build dcp modules for name in pm.globalThis.dcp.keys(): @@ -63,8 +75,8 @@ def init(**kwargs) -> Module: # add some api top level imports setattr(dcp_module, "compute_for", api.compute_for_maker(), ) - init_memo = dcp_module - return init_memo + INIT_MEMO = dcp_module + return INIT_MEMO return init From 80b64c385c253c0fc700a311f533b4f3d3abc36c Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 09:51:10 -0400 Subject: [PATCH 41/47] feat(__init__): clean up namespace --- dcp/__init__.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dcp/__init__.py b/dcp/__init__.py index 7c2e9b5..73cd932 100644 --- a/dcp/__init__.py +++ b/dcp/__init__.py @@ -3,5 +3,13 @@ init = make_init_fn(sys.modules[__name__]) +# clean up namespace +del sys +del js +del dry +del api +del initialization +del make_init_fn + __all__ = ['init'] From bed69b1e72a685ed14e5ede8599f8e630fe3ea68 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 10:08:34 -0400 Subject: [PATCH 42/47] build(pyproject): use "dcp" pypi instead of "distributive" --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 42a4867..d4f1f77 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [tool.poetry] -name = "distributive" +name = "dcp" version = "0.1.0" description = "A DCP SDK" authors = [ From d0eb8f5d8638cf4e8db5f60aac44e3d6795c36f6 Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 10:10:43 -0400 Subject: [PATCH 43/47] build(package*json): update package-lock.json --- dcp/js/package-lock.json | 12 ++++++------ dcp/js/package.json | 6 +----- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/dcp/js/package-lock.json b/dcp/js/package-lock.json index a205352..cad23be 100644 --- a/dcp/js/package-lock.json +++ b/dcp/js/package-lock.json @@ -1,5 +1,5 @@ { - "name": "dcp_client_js", + "name": "js", "lockfileVersion": 3, "requires": true, "packages": { @@ -9,7 +9,7 @@ } }, "../../../dcp-client": { - "version": "4.4.3", + "version": "4.4.6", "license": "MIT", "dependencies": { "@kingsds/socket.io-client": "^4.5.4", @@ -24,13 +24,13 @@ "http-proxy-agent": "^4.0.1", "https-agent": "^1.0.0", "https-proxy-agent": "^5.0.0", - "kvin": "^1.2.13", - "nanoid": "^3.2.0", + "kvin": "1.2.14", + "nanoid": "3.3.7", "physical-cpu-count": "^2.0.0", "polyfill-crypto.getrandomvalues": "^1.0.0", "regedit": "^3.0.3", "semver": "^7.3.5", - "webpack": "^5.79.0", + "webpack": "5.92.0", "webpack-cli": "^4.7.2", "yargs": "16.2.0" }, @@ -38,7 +38,7 @@ "@kingsds/eslint-config": "1.0.1", "eslint": "7.30.0", "express": "^4.18.2", - "peter": "2.4.3" + "peter": "2.4.5" }, "engines": { "node": ">=18", diff --git a/dcp/js/package.json b/dcp/js/package.json index cfb8f46..ad70617 100644 --- a/dcp/js/package.json +++ b/dcp/js/package.json @@ -1,5 +1 @@ -{ - "dependencies": { - "dcp-client": "file:../../../dcp-client" - } -} +{"dependencies":{"dcp-client":"file:../../../dcp-client"}} \ No newline at end of file From e388205993dc6dbec24299fabe09a463a7cae99f Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 13:03:02 -0400 Subject: [PATCH 44/47] feat(initialization): access hidden props of module For instance, dcp.compute.for is "hidden", - it doesn't show up as own property. We'll still want people to be able to use it... Well not "for" since that's a syntax error but "do"! --- dcp/api/job.py | 1 - dcp/dry/class_manager.py | 4 ++ dcp/initialization.py | 69 ++++++++++++++++++++---------- tests/test_api/test_compute_for.py | 17 ++++++++ 4 files changed, 68 insertions(+), 23 deletions(-) create mode 100644 tests/test_api/test_compute_for.py diff --git a/dcp/api/job.py b/dcp/api/job.py index 6dcb71a..12f9354 100644 --- a/dcp/api/job.py +++ b/dcp/api/job.py @@ -7,7 +7,6 @@ class Job(): # #print("overidden by Job hook") def wait(self, *args, **kwargs): - print("NYI") # TODO pass def on(self, *args): diff --git a/dcp/dry/class_manager.py b/dcp/dry/class_manager.py index 2be67e9..18a4a0a 100644 --- a/dcp/dry/class_manager.py +++ b/dcp/dry/class_manager.py @@ -47,6 +47,10 @@ def __getattr__(self, name): def __getattr__(self, name): js_attr = self.js_ref[name] + + if isinstance(js_attr, pm.null.__class__): + return None + if not callable(js_attr): return wrap_obj(js_attr) diff --git a/dcp/initialization.py b/dcp/initialization.py index 4822d7b..5ff29d7 100644 --- a/dcp/initialization.py +++ b/dcp/initialization.py @@ -20,11 +20,55 @@ INIT_MEMO = None +def _wrap_js(prop_name, prop_ref): + """Determines what the js ref is, if class add to class registry.""" + if isinstance(prop_ref, pm.JSFunctionProxy): + # class + if js.utils.isclass(prop_ref): + new_bfclass = class_manager.reg.find(prop_ref) + if new_bfclass is None: + new_bfclass = class_manager.wrap_class(prop_ref, name=prop_name) + new_bfclass = class_manager.reg.add(new_bfclass) + return new_bfclass + + # function + else: + def fn_wrapper(*args, **kwargs): + ret_val = aio.blockify(prop_ref)(*args, **kwargs) + return _wrap_js('dynamically_accessed_property', ret_val) + return fn_wrapper + + # js object + elif isinstance(prop_ref, pm.JSObjectProxy): + return class_manager.wrap_obj(prop_ref) + + elif isinstance(prop_ref, pm.null.__class__): + return None + + # py dict + else: + return prop_ref + + return None + + +class _DynamicModule(Module): + """Dynamic get attribute for 'hidden' JS properties on a module.""" + def __init__(self, name, js_module): + super().__init__(name) + self._js = js_module + + def __getattr__(self, name): + if self._js[name] is not None: + return _wrap_js(name, self._js[name]) + return None + + def init_dcp_module(py_parent, js_module, js_name): - """builds the dcp module and class registry""" + """Builds the dcp module and sub modules""" underscore_name = f"{js_name.replace('-', '_')}" module_name = f"{py_parent.__name__}.{underscore_name}" - module = Module(module_name) + module = _DynamicModule(module_name, js_module) module.__file__ = f"" module._js = js_module sys.modules[module_name] = module @@ -32,27 +76,8 @@ def init_dcp_module(py_parent, js_module, js_name): # add the new module as a submodule of the root module setattr(py_parent, underscore_name, module) - # wrap js elements of the cjs module for prop_name, prop_ref in js_module.items(): - if isinstance(prop_ref, pm.JSFunctionProxy): - if js.utils.isclass(prop_ref): - new_bfclass = class_manager.reg.find(prop_ref) - if new_bfclass is None: - new_bfclass = class_manager.wrap_class(prop_ref, name=prop_name) - new_bfclass = class_manager.reg.add(new_bfclass) - - setattr(module, prop_name, new_bfclass) - - else: - setattr(module, prop_name, aio.blockify(prop_ref)) - - # js object - elif prop_ref is js.utils.PMDict: - setattr(module, prop_name, class_manager.wrap_obj(prop_ref)) - - # py dict - else: - setattr(module, prop_name, prop_ref) + setattr(module, prop_name, _wrap_js(prop_name, prop_ref)) def make_init_fn(dcp_module) -> Callable: diff --git a/tests/test_api/test_compute_for.py b/tests/test_api/test_compute_for.py new file mode 100644 index 0000000..b4eef1c --- /dev/null +++ b/tests/test_api/test_compute_for.py @@ -0,0 +1,17 @@ +import unittest +import pythonmonkey as pm +import dcp + +class TestComputeFor(unittest.TestCase): + + def test_compute_for(self): + dcp.init() + job1 = dcp.compute_for('x=>{progress(); return x * 2}', [1,2,3]) + job2 = dcp.compute.do(5, 'x=>{progress(); return x * 2}') + + # check compute_for returns the same type as compute.do + self.assertTrue(isinstance(job1, job2.__class__)) + +if __name__ == '__main__': + unittest.main() + From d08a23e0ca1f06a1b5ddd96d2395421a455e049b Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 15:37:25 -0400 Subject: [PATCH 45/47] ci(hello-world): add test ci --- .github/workflows/hello-world.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/hello-world.yml diff --git a/.github/workflows/hello-world.yml b/.github/workflows/hello-world.yml new file mode 100644 index 0000000..90dccbf --- /dev/null +++ b/.github/workflows/hello-world.yml @@ -0,0 +1,28 @@ +name: Hello World Workflow + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + hello-world-job: + runs-on: ubuntu-latest + + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11"] + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Print Hi using Python + run: python3 -c 'print("Hi")' + From b622d875d32d1e2ef159e142d13df73fae9a1c6e Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 16:36:42 -0400 Subject: [PATCH 46/47] feat(module.aio): module aio accessors --- dcp/initialization.py | 21 ++++++++ tests/test_api/test_misc_api_existence.py | 59 +++++++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 tests/test_api/test_misc_api_existence.py diff --git a/dcp/initialization.py b/dcp/initialization.py index 5ff29d7..a675479 100644 --- a/dcp/initialization.py +++ b/dcp/initialization.py @@ -64,6 +64,22 @@ def __getattr__(self, name): return None +class AIOModule(Module): + """For getting AIO.""" + def __init__(self, name, js_module): + super().__init__(name) + self._js = js_module + + def __getattr__(self, name): + js_attr = self._js[name] + + if js_attr is None: + return None + + if callable(js_attr): + return aio.asyncify(js_attr) + + def init_dcp_module(py_parent, js_module, js_name): """Builds the dcp module and sub modules""" underscore_name = f"{js_name.replace('-', '_')}" @@ -76,6 +92,10 @@ def init_dcp_module(py_parent, js_module, js_name): # add the new module as a submodule of the root module setattr(py_parent, underscore_name, module) + # add the aio api + aio_submodule = AIOModule(f'{module_name}.aio', js_module) + setattr(module, 'aio', aio_submodule) + for prop_name, prop_ref in js_module.items(): setattr(module, prop_name, _wrap_js(prop_name, prop_ref)) @@ -100,6 +120,7 @@ def init(**kwargs) -> Module: # add some api top level imports setattr(dcp_module, "compute_for", api.compute_for_maker(), ) + INIT_MEMO = dcp_module return INIT_MEMO diff --git a/tests/test_api/test_misc_api_existence.py b/tests/test_api/test_misc_api_existence.py new file mode 100644 index 0000000..3f3dcc4 --- /dev/null +++ b/tests/test_api/test_misc_api_existence.py @@ -0,0 +1,59 @@ +""" +Dumb smoke tests for api existence. This does not test functionality (;. +""" +import unittest +import inspect +import dcp +dcp.init() + +class TestApiExistence(unittest.TestCase): + def test_top_level_submodules(self): + """protocol, compute, dcp_config are commonly used.""" + self.assertTrue(hasattr(dcp, 'protocol'), "dcp.protocol") + self.assertTrue(hasattr(dcp, 'compute'), "dcp.compute") + self.assertTrue(hasattr(dcp, 'dcp_config'), "dcp.dcp_config") + self.assertTrue(hasattr(dcp, 'wallet'), "dcp.wallet") + + + def test_fetch_results(self): + """`fetchResults` chosen arbitrarily.""" + # Check if job.fetchResults is a function + self.assertTrue(hasattr(dcp.job, 'fetchResults'), "dcp.job.fetchResults") + self.assertTrue(inspect.isfunction(dcp.job.fetchResults), "dcp.job.fetchResults should be a function") + + # Check if job.aio.fetchResults is an async function + self.assertTrue(hasattr(dcp.job, 'aio'), "dcp.job.aio") + self.assertTrue(hasattr(dcp.job.aio, 'fetchResults'), "dcp.job.aio.fetchResults") + self.assertTrue(inspect.iscoroutinefunction(dcp.job.aio.fetchResults), "dcp.job.aio.fetchResults should be an async function") + + + def test_compute_api(self): + """Valid API examples from https://docs.dcp.dev/api/compute/index.html""" + self.assertTrue(hasattr(dcp.compute, 'do'), "do") + self.assertTrue(inspect.isfunction(dcp.compute.do)) + + self.assertTrue(hasattr(dcp.compute, 'getJobInfo'), "getJobInfo") + self.assertTrue(inspect.isfunction(dcp.compute.getJobInfo)) + + self.assertTrue(hasattr(dcp.compute, 'status'), "status") + self.assertTrue(inspect.isfunction(dcp.compute.status)) + + self.assertTrue(dcp.compute.marketValue) + self.assertTrue(dcp.compute.ResultHandle) + + # aio variants + self.assertTrue(hasattr(dcp.compute.aio, 'status'), "status") + self.assertTrue(inspect.iscoroutinefunction(dcp.compute.aio.status)) + + self.assertTrue(hasattr(dcp.compute.aio, 'getJobInfo'), "getJobInfo") + self.assertTrue(inspect.iscoroutinefunction(dcp.compute.aio.getJobInfo)) + + + def test_wallet_api(self): + self.assertTrue(dcp.wallet.get) + self.assertTrue(inspect.isfunction(dcp.wallet.get)) + self.assertTrue(dcp.wallet.aio.get) + self.assertTrue(inspect.iscoroutinefunction(dcp.wallet.aio.get)) + +if __name__ == '__main__': + unittest.main() From e6d2daea391a7b1cc8f3d14fe40bd13a2af3315e Mon Sep 17 00:00:00 2001 From: Will Pringle Date: Wed, 10 Jul 2024 17:49:11 -0400 Subject: [PATCH 47/47] refactor(init): replace Dynamic Module classes with bfclass --- dcp/dry/class_manager.py | 40 ++++++++++++++++++---------------- dcp/initialization.py | 46 ++++++---------------------------------- 2 files changed, 29 insertions(+), 57 deletions(-) diff --git a/dcp/dry/class_manager.py b/dcp/dry/class_manager.py index 18a4a0a..37500a0 100644 --- a/dcp/dry/class_manager.py +++ b/dcp/dry/class_manager.py @@ -3,13 +3,6 @@ Decorate the raw PythonMonkey JS Proxies with Pythonic Bifrost 2 API classes. -Functions: -- wrap_class(js_class, name=None): Creates a proxy class. -- wrap_obj(js_val): Returns a proxy instance. - -Properties: -- reg: a class registry of saved pythonic wrapper classes. - Author: Will Pringle Date: June 2024 """ @@ -22,18 +15,9 @@ reg = ClassRegistry() -def wrap_class(js_class, name=None): - """Wraps a PythonMonkey JS Proxy Class Function as a Pythonic Class""" - name = name or js.utils.class_name(js_class) - +def make_new_class(ctor_js_ref_init, name, js_class=None, mutate_js=True): def __init__(self, *args, **kwargs): - # if the sole argument to the ctor is a js instance, use it as the ref - if len(args) == 1 and js.utils.instanceof(args[0], js_class): - self.js_ref = args[0] - # otherwise, instantiate a new underlying js ref using the ctor args - else: - async_wrapped_ctor = blockify(pm.new(js_class)) - self.js_ref = async_wrapped_ctor(*args, **kwargs) + self.js_ref = ctor_js_ref_init(self, *args, **kwargs) class AsyncAttrs: """For instance.aio.*""" @@ -80,11 +64,31 @@ def __str__(self): 'get_js_class': staticmethod(lambda: js_class), } + if not mutate_js: + del props['__setattr__'] + new_class = type(name, (object,), props) return new_class +def wrap_class(js_class, name=None): + """Wraps a PythonMonkey JS Proxy Class Function as a Pythonic Class""" + name = name or js.utils.class_name(js_class) + + def js_ref_generator(self, *args, **kwargs): + # if the sole argument to the ctor is a js instance, use it as the ref + if len(args) == 1 and js.utils.instanceof(args[0], js_class): + self.js_ref = args[0] + # otherwise, instantiate a new underlying js ref using the ctor args + else: + async_wrapped_ctor = blockify(pm.new(js_class)) + self.js_ref = async_wrapped_ctor(*args, **kwargs) + return self.js_ref + + return make_new_class(js_ref_generator, name, js_class=js_class) + + def wrap_obj(js_val): """Wraps a PythonMonkey JS Proxy instance as a Pythonic Class instance""" if bfclass := ugly_duck_type_check(js_val): diff --git a/dcp/initialization.py b/dcp/initialization.py index a675479..182d13e 100644 --- a/dcp/initialization.py +++ b/dcp/initialization.py @@ -38,53 +38,25 @@ def fn_wrapper(*args, **kwargs): return _wrap_js('dynamically_accessed_property', ret_val) return fn_wrapper - # js object elif isinstance(prop_ref, pm.JSObjectProxy): return class_manager.wrap_obj(prop_ref) elif isinstance(prop_ref, pm.null.__class__): return None - # py dict - else: - return prop_ref - - return None - - -class _DynamicModule(Module): - """Dynamic get attribute for 'hidden' JS properties on a module.""" - def __init__(self, name, js_module): - super().__init__(name) - self._js = js_module - - def __getattr__(self, name): - if self._js[name] is not None: - return _wrap_js(name, self._js[name]) - return None - - -class AIOModule(Module): - """For getting AIO.""" - def __init__(self, name, js_module): - super().__init__(name) - self._js = js_module - - def __getattr__(self, name): - js_attr = self._js[name] - - if js_attr is None: - return None - - if callable(js_attr): - return aio.asyncify(js_attr) + return prop_ref def init_dcp_module(py_parent, js_module, js_name): """Builds the dcp module and sub modules""" underscore_name = f"{js_name.replace('-', '_')}" module_name = f"{py_parent.__name__}.{underscore_name}" - module = _DynamicModule(module_name, js_module) + + # TODO this is quite ugly + BfDyn = class_manager.make_new_class(lambda *args, **kwargs: js_module, 'Module', mutate_js=False) + BfDyn = type(Module.__name__, (Module,), dict(BfDyn.__dict__)) + module = BfDyn() + module.__file__ = f"" module._js = js_module sys.modules[module_name] = module @@ -92,10 +64,6 @@ def init_dcp_module(py_parent, js_module, js_name): # add the new module as a submodule of the root module setattr(py_parent, underscore_name, module) - # add the aio api - aio_submodule = AIOModule(f'{module_name}.aio', js_module) - setattr(module, 'aio', aio_submodule) - for prop_name, prop_ref in js_module.items(): setattr(module, prop_name, _wrap_js(prop_name, prop_ref))