diff --git a/.gitignore b/.gitignore index f35f8a89f..00c0c8742 100644 --- a/.gitignore +++ b/.gitignore @@ -172,5 +172,32 @@ google-cloud-cli-linux-x86_64.tar.gz .vennv newenv files + +# start of ian-added gitignore +#terraform GITIGNORE + +# Local .terraform directories +**/.terraform/* + + +*.tfvars +*.tfvars.json + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Ignore transient lock info files created by terraform apply +.terraform.tfstate.lock.info + +# Ignore CLI configuration files +.terraformrc +terraform.rc +# end of ian-added gitignore + startupbackend.sh -startupfrontend.sh \ No newline at end of file +startupfrontend.sh diff --git a/backend/Dockerfile b/backend/Dockerfile index 4488129d9..0e7b1656b 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,26 +1,65 @@ -FROM python:3.10-slim +FROM python:3.10-slim-bullseye WORKDIR /code ENV PORT 8000 EXPOSE 8000 -# Install dependencies and clean up in one layer +# ENV PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION python +# Clean up apt cache and install keyring packages +RUN rm -rf /var/lib/apt/lists/* && \ + apt-get clean && \ + apt-get -o Acquire::AllowInsecureRepositories=true update && \ + apt-get install -y --no-install-recommends --no-install-suggests \ + debian-keyring \ + debian-archive-keyring \ + gnupg \ + ca-certificates && \ + apt-get clean && \ + rm -rf /var/lib/apt/lists/* + +# Install system dependencies +# this was added before pinned python:3.10-slim-bullseye, shouldn't need it anymore +# RUN apt-get update && apt-get install -y --no-install-recommends \ +# libgl1 \ +# && rm -rf /var/lib/apt/lists/* + +# Now update and install dependencies including build tools RUN apt-get update && \ - apt-get install -y --no-install-recommends \ + apt-get install -y --no-install-recommends --no-install-suggests \ libmagic1 \ libgl1-mesa-glx \ libreoffice \ cmake \ poppler-utils \ - tesseract-ocr && \ + tesseract-ocr \ + build-essential \ + python3-dev \ + gcc \ + autoconf \ + automake \ + libtool \ + pkg-config && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* + +# Manually fetch the latest Debian signing key before updating apt repositories +RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 648ACFD622F3D138 + # Set LD_LIBRARY_PATH ENV LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH + +ENV PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION='python' + # Copy requirements file and install Python dependencies COPY requirements.txt constraints.txt /code/ # --no-cache-dir --upgrade +RUN pip --version RUN pip install --upgrade pip -RUN pip install -r requirements.txt -c constraints.txt +RUN pip --version +RUN pip install -r requirements.txt -c constraints.txt +RUN python -c "import torch; print(f'PyTorch version: {torch.__version__}'); print(f'CUDA available: {torch.cuda.is_available()}'); print(f'CUDA device count: {torch.cuda.device_count()}')" +# RUN pip install -r requirements.txt # Copy application code COPY . /code + # Set command -CMD ["gunicorn", "score:app", "--workers", "8","--threads", "8", "--worker-class", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000", "--timeout", "300"] +# CMD ["gunicorn", "score:app", "--workers", "8","--threads", "8", "--worker-class", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000", "--timeout", "300"] # original line +CMD ["gunicorn", "score:app", "--workers", "2","--threads", "2", "--worker-class", "uvicorn.workers.UvicornWorker", "--bind", "0.0.0.0:8000", "--timeout", "300"] diff --git a/backend/Pipfile b/backend/Pipfile new file mode 100644 index 000000000..e7f3e8d68 --- /dev/null +++ b/backend/Pipfile @@ -0,0 +1,77 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +accelerate = "==1.6.0" +asyncio = "==3.4.3" +boto3 = "==1.37.29" +botocore = "==1.37.29" +certifi = "==2025.1.31" +fastapi = "==0.115.11" +fastapi-health = "==0.4.0" +google-api-core = "==2.24.2" +google-auth = "==2.38.0" +google-auth-oauthlib = "==1.2.1" +google-cloud-core = "==2.4.3" +json-repair = "==0.39.1" +pip-install = "==1.3.5" +langchain = "==0.3.23" +langchain-aws = "==0.2.18" +langchain-anthropic = "==0.3.9" +langchain-fireworks = "==0.2.9" +langchain-community = "==0.3.19" +langchain-core = "==0.3.51" +langchain-experimental = "==0.3.4" +langchain-google-vertexai = "==2.0.19" +langchain-groq = "==0.2.5" +langchain-openai = "==0.3.12" +langchain-text-splitters = "==0.3.8" +langchain-huggingface = "==0.1.2" +langdetect = "==1.0.9" +langsmith = "==0.3.26" +langserve = "==0.3.1" +neo4j-rust-ext = "*" +nltk = "==3.9.1" +openai = "==1.71.0" +opencv-python = "==4.11.0.86" +psutil = "==7.0.0" +pydantic = "==2.10.6" +python-dotenv = "==1.0.1" +python-magic = "==0.4.27" +pypdf2 = "==3.0.1" +pymupdf = "==1.25.5" +starlette = "==0.46.1" +sse-starlette = "==2.2.1" +starlette-session = "==0.4.3" +tqdm = "==4.67.1" +unstructured-client = "==0.32.3" +unstructured-inference = "==0.8.10" +urllib3 = "==2.3.0" +uvicorn = "==0.34.0" +gunicorn = "==23.0.0" +wikipedia = "==1.4.0" +wrapt = "==1.17.2" +yarl = "==1.18.3" +youtube-transcript-api = "==1.0.3" +zipp = "==3.21.0" +sentence-transformers = "==4.0.2" +google-cloud-logging = "==3.11.4" +pypandoc = "==1.15" +graphdatascience = "==1.14" +secweb = "==1.18.1" +ragas = "==0.2.14" +rouge-score = "==0.1.2" +langchain-neo4j = "==0.4.0" +pypandoc-binary = "==1.15" +chardet = "==5.2.0" +contextgem = "==0.8.1" +# we need to backpropagate this unstructured with doctypes to requirements.txt, right now it has unstructured[all-docs] +unstructured = {extras = ["pptx", "md", "docx"], version = "*"} + +[dev-packages] + +[requires] +python_version = "3.10" +python_full_version = "3.10.15" diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock new file mode 100644 index 000000000..2a018d152 --- /dev/null +++ b/backend/Pipfile.lock @@ -0,0 +1,4851 @@ +{ + "_meta": { + "hash": { + "sha256": "20809e5d9af171f465777eec6ae0d679e667cc6563d1b1dd8513a9373a99a15b" + }, + "pipfile-spec": 6, + "requires": { + "python_full_version": "3.10.15", + "python_version": "3.10" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "absl-py": { + "hashes": [ + "sha256:a97820526f7fbfd2ec1bce83f3f25e3a14840dac0d8e02a0b71cd75db3f77fc9", + "sha256:eeecf07f0c2a93ace0772c92e596ace6d3d3996c042b2128459aaae2a76de11d" + ], + "markers": "python_version >= '3.8'", + "version": "==2.3.1" + }, + "accelerate": { + "hashes": [ + "sha256:1aee717d3d3735ad6d09710a7c26990ee4652b79b4e93df46551551b5227c2aa", + "sha256:28c1ef1846e690944f98b68dc7b8bb6c51d032d45e85dcbb3adb0c8b99dffb32" + ], + "index": "pypi", + "markers": "python_full_version >= '3.9.0'", + "version": "==1.6.0" + }, + "aiofiles": { + "hashes": [ + "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", + "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5" + ], + "markers": "python_version >= '3.8'", + "version": "==24.1.0" + }, + "aiohappyeyeballs": { + "hashes": [ + "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", + "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" + ], + "markers": "python_version >= '3.9'", + "version": "==2.6.1" + }, + "aiohttp": { + "hashes": [ + "sha256:010cc9bbd06db80fe234d9003f67e97a10fe003bfbedb40da7d71c1008eda0fe", + "sha256:049ec0360f939cd164ecbfd2873eaa432613d5e77d6b04535e3d1fbae5a9e645", + "sha256:098e92835b8119b54c693f2f88a1dec690e20798ca5f5fe5f0520245253ee0af", + "sha256:0a146708808c9b7a988a4af3821379e379e0f0e5e466ca31a73dbdd0325b0263", + "sha256:0a23918fedc05806966a2438489dcffccbdf83e921a1170773b6178d04ade142", + "sha256:0c643f4d75adea39e92c0f01b3fb83d57abdec8c9279b3078b68a3a52b3933b6", + "sha256:1004e67962efabbaf3f03b11b4c43b834081c9e3f9b32b16a7d97d4708a9abe6", + "sha256:14954a2988feae3987f1eb49c706bff39947605f4b6fa4027c1d75743723eb09", + "sha256:1a649001580bdb37c6fdb1bebbd7e3bc688e8ec2b5c6f52edbb664662b17dc84", + "sha256:2776c7ec89c54a47029940177e75c8c07c29c66f73464784971d6a81904ce9d1", + "sha256:2abbb216a1d3a2fe86dbd2edce20cdc5e9ad0be6378455b05ec7f77361b3ab50", + "sha256:2c7d81a277fa78b2203ab626ced1487420e8c11a8e373707ab72d189fcdad20a", + "sha256:2ce13fcfb0bb2f259fb42106cdc63fa5515fb85b7e87177267d89a771a660b79", + "sha256:2e5a495cb1be69dae4b08f35a6c4579c539e9b5706f606632102c0f855bcba7c", + "sha256:2ee8a8ac39ce45f3e55663891d4b1d15598c157b4d494a4613e704c8b43112cd", + "sha256:3b6f0af863cf17e6222b1735a756d664159e58855da99cfe965134a3ff63b0b0", + "sha256:3bdd6e17e16e1dbd3db74d7f989e8af29c4d2e025f9828e6ef45fbdee158ec75", + "sha256:3beb14f053222b391bf9cf92ae82e0171067cc9c8f52453a0f1ec7c37df12a77", + "sha256:3c5092ce14361a73086b90c6efb3948ffa5be2f5b6fbcf52e8d8c8b8848bb97c", + "sha256:3ead1c00f8521a5c9070fcb88f02967b1d8a0544e6d85c253f6968b785e1a2ab", + "sha256:3eae49032c29d356b94eee45a3f39fdf4b0814b397638c2f718e96cfadf4c4e4", + "sha256:3f9d7c55b41ed687b9d7165b17672340187f87a773c98236c987f08c858145a9", + "sha256:40b3fee496a47c3b4a39a731954c06f0bd9bd3e8258c059a4beb76ac23f8e421", + "sha256:421da6fd326460517873274875c6c5a18ff225b40da2616083c5a34a7570b685", + "sha256:4420cf9d179ec8dfe4be10e7d0fe47d6d606485512ea2265b0d8c5113372771b", + "sha256:46749be6e89cd78d6068cdf7da51dbcfa4321147ab8e4116ee6678d9a056a0cf", + "sha256:47f6b962246f0a774fbd3b6b7be25d59b06fdb2f164cf2513097998fc6a29693", + "sha256:4c39e87afe48aa3e814cac5f535bc6199180a53e38d3f51c5e2530f5aa4ec58c", + "sha256:4fc61385e9c98d72fcdf47e6dd81833f47b2f77c114c29cd64a361be57a763a2", + "sha256:5015082477abeafad7203757ae44299a610e89ee82a1503e3d4184e6bafdd519", + "sha256:5346b93e62ab51ee2a9d68e8f73c7cf96ffb73568a23e683f931e52450e4148d", + "sha256:536ad7234747a37e50e7b6794ea868833d5220b49c92806ae2d7e8a9d6b5de02", + "sha256:56822ff5ddfd1b745534e658faba944012346184fbfe732e0d6134b744516eea", + "sha256:57d16590a351dfc914670bd72530fd78344b885a00b250e992faea565b7fdc05", + "sha256:5fa5d9eb82ce98959fc1031c28198b431b4d9396894f385cb63f1e2f3f20ca6b", + "sha256:6404dfc8cdde35c69aaa489bb3542fb86ef215fc70277c892be8af540e5e21c0", + "sha256:6443cca89553b7a5485331bc9bedb2342b08d073fa10b8c7d1c60579c4a7b9bd", + "sha256:691d203c2bdf4f4637792efbbcdcd157ae11e55eaeb5e9c360c1206fb03d4d98", + "sha256:6990ef617f14450bc6b34941dba4f12d5613cbf4e33805932f853fbd1cf18bfb", + "sha256:6c5f40ec615e5264f44b4282ee27628cea221fcad52f27405b80abb346d9f3f8", + "sha256:6d86a2fbdd14192e2f234a92d3b494dd4457e683ba07e5905a0b3ee25389ac9f", + "sha256:74bdd8c864b36c3673741023343565d95bfbd778ffe1eb4d412c135a28a8dc89", + "sha256:74dad41b3458dbb0511e760fb355bb0b6689e0630de8a22b1b62a98777136e16", + "sha256:760fb7db442f284996e39cf9915a94492e1896baac44f06ae551974907922b64", + "sha256:79b26fe467219add81d5e47b4a4ba0f2394e8b7c7c3198ed36609f9ba161aecb", + "sha256:7c7dd29c7b5bda137464dc9bfc738d7ceea46ff70309859ffde8c022e9b08ba7", + "sha256:7fbc8a7c410bb3ad5d595bb7118147dfbb6449d862cc1125cf8867cb337e8728", + "sha256:802d3868f5776e28f7bf69d349c26fc0efadb81676d0afa88ed00d98a26340b7", + "sha256:83603f881e11f0f710f8e2327817c82e79431ec976448839f3cd05d7afe8f830", + "sha256:8466151554b593909d30a0a125d638b4e5f3836e5aecde85b66b80ded1cb5b0d", + "sha256:86ceded4e78a992f835209e236617bffae649371c4a50d5e5a3987f237db84b8", + "sha256:894261472691d6fe76ebb7fcf2e5870a2ac284c7406ddc95823c8598a1390f0d", + "sha256:8e995e1abc4ed2a454c731385bf4082be06f875822adc4c6d9eaadf96e20d406", + "sha256:8faa08fcc2e411f7ab91d1541d9d597d3a90e9004180edb2072238c085eac8c2", + "sha256:9b2af240143dd2765e0fb661fd0361a1b469cab235039ea57663cda087250ea9", + "sha256:9f922ffd05034d439dde1c77a20461cf4a1b0831e6caa26151fe7aa8aaebc315", + "sha256:a041e7e2612041a6ddf1c6a33b883be6a421247c7afd47e885969ee4cc58bd8d", + "sha256:aaa2234bb60c4dbf82893e934d8ee8dea30446f0647e024074237a56a08c01bd", + "sha256:ac77f709a2cde2cc71257ab2d8c74dd157c67a0558a0d2799d5d571b4c63d44d", + "sha256:ad702e57dc385cae679c39d318def49aef754455f237499d5b99bea4ef582e51", + "sha256:b2acbbfff69019d9014508c4ba0401822e8bae5a5fdc3b6814285b71231b60f3", + "sha256:b390ef5f62bb508a9d67cb3bba9b8356e23b3996da7062f1a57ce1a79d2b3d34", + "sha256:b52dcf013b57464b6d1e51b627adfd69a8053e84b7103a7cd49c030f9ca44461", + "sha256:b5b7fe4972d48a4da367043b8e023fb70a04d1490aa7d68800e465d1b97e493b", + "sha256:b6fc902bff74d9b1879ad55f5404153e2b33a82e72a95c89cec5eb6cc9e92fbc", + "sha256:b7011a70b56facde58d6d26da4fec3280cc8e2a78c714c96b7a01a87930a9530", + "sha256:b761bac1192ef24e16706d761aefcb581438b34b13a2f069a6d343ec8fb693a5", + "sha256:b784d6ed757f27574dca1c336f968f4e81130b27595e458e69457e6878251f5d", + "sha256:b97752ff12cc12f46a9b20327104448042fce5c33a624f88c18f66f9368091c7", + "sha256:bc4fbc61bb3548d3b482f9ac7ddd0f18c67e4225aaa4e8552b9f1ac7e6bda9e5", + "sha256:bc9a0f6569ff990e0bbd75506c8d8fe7214c8f6579cca32f0546e54372a3bb54", + "sha256:bd44d5936ab3193c617bfd6c9a7d8d1085a8dc8c3f44d5f1dcf554d17d04cf7d", + "sha256:ced339d7c9b5030abad5854aa5413a77565e5b6e6248ff927d3e174baf3badf7", + "sha256:d3ce17ce0220383a0f9ea07175eeaa6aa13ae5a41f30bc61d84df17f0e9b1117", + "sha256:d5f1b4ce5bc528a6ee38dbf5f39bbf11dd127048726323b72b8e85769319ffc4", + "sha256:d849b0901b50f2185874b9a232f38e26b9b3d4810095a7572eacea939132d4e1", + "sha256:db71ce547012a5420a39c1b744d485cfb823564d01d5d20805977f5ea1345676", + "sha256:e153e8adacfe2af562861b72f8bc47f8a5c08e010ac94eebbe33dc21d677cd5b", + "sha256:edd533a07da85baa4b423ee8839e3e91681c7bfa19b04260a469ee94b778bf6d", + "sha256:f0adb4177fa748072546fb650d9bd7398caaf0e15b370ed3317280b13f4083b0", + "sha256:f0fa751efb11a541f57db59c1dd821bec09031e01452b2b6217319b3a1f34f3d", + "sha256:f2800614cd560287be05e33a679638e586a2d7401f4ddf99e304d98878c29444", + "sha256:f813c3e9032331024de2eb2e32a88d86afb69291fbc37a3a3ae81cc9917fb3d0", + "sha256:fc49c4de44977aa8601a00edbf157e9a421f227aa7eb477d9e3df48343311065", + "sha256:fd736ed420f4db2b8148b52b46b88ed038d0354255f9a73196b7bbce3ea97545", + "sha256:fe086edf38b2222328cdf89af0dde2439ee173b8ad7cb659b4e4c6f385b2be3d" + ], + "markers": "python_version >= '3.9'", + "version": "==3.12.15" + }, + "aiolimiter": { + "hashes": [ + "sha256:d3f249e9059a20badcb56b61601a83556133655c11d1eb3dd3e04ff069e5f3c7", + "sha256:e02a37ea1a855d9e832252a105420ad4d15011505512a1a1d814647451b5cca9" + ], + "markers": "python_version >= '3.8' and python_version < '4.0'", + "version": "==1.2.1" + }, + "aiosignal": { + "hashes": [ + "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", + "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7" + ], + "markers": "python_version >= '3.9'", + "version": "==1.4.0" + }, + "annotated-types": { + "hashes": [ + "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", + "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89" + ], + "markers": "python_version >= '3.8'", + "version": "==0.7.0" + }, + "anthropic": { + "hashes": [ + "sha256:adcf2af98aa2b11e3b7c71afb2e0cb0613f679ad4a18ef58c38f17784b3df72e", + "sha256:d45389229db9e443ea1a877f8d63309947f134991473cf8e88efee322840d084" + ], + "markers": "python_version >= '3.8'", + "version": "==0.62.0" + }, + "anyio": { + "hashes": [ + "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6", + "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1" + ], + "markers": "python_version >= '3.9'", + "version": "==4.10.0" + }, + "appdirs": { + "hashes": [ + "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", + "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" + ], + "version": "==1.4.4" + }, + "async-timeout": { + "hashes": [ + "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", + "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028" + ], + "markers": "python_version < '3.11'", + "version": "==4.0.3" + }, + "asyncio": { + "hashes": [ + "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41", + "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de", + "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c", + "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d" + ], + "index": "pypi", + "version": "==3.4.3" + }, + "asyncstdlib-fw": { + "hashes": [ + "sha256:51ad094c204c5936c3040f38c32fd6d549b391c980f21f1fa095b65fb6806a1f", + "sha256:91cc2b19c232cd377f26eec0f353468eec7d80cf83709e1ca903bd954a694b27" + ], + "markers": "python_version >= '3.8'", + "version": "==3.13.2" + }, + "attrs": { + "hashes": [ + "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", + "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b" + ], + "markers": "python_version >= '3.8'", + "version": "==25.3.0" + }, + "backoff": { + "hashes": [ + "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba", + "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8" + ], + "markers": "python_version >= '3.7' and python_version < '4.0'", + "version": "==2.2.1" + }, + "beautifulsoup4": { + "hashes": [ + "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", + "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==4.13.4" + }, + "betterproto-fw": { + "extras": [ + "compiler" + ], + "hashes": [ + "sha256:af66a24e5d182922121b7119947166289442b19d2664d057e0b0a96c1f049757", + "sha256:bade467215224f2807842da18fe81258a0a856766bad5f0a20a1474c5cdb6b93" + ], + "markers": "python_version >= '3.9'", + "version": "==2.0.3" + }, + "boto3": { + "hashes": [ + "sha256:5702e38356b93c56ed2a27e17f7664d791f1fe2eafd58ae6ab3853b2804cadd2", + "sha256:869979050e2cf6f5461503e0f1c8f226e47ec02802e88a2210f085ec22485945" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.37.29" + }, + "botocore": { + "hashes": [ + "sha256:092c41e346df37a8d7cf60a799791f8225ad3a5ba7cda749047eb31d1440b9c5", + "sha256:728c1ef3b66a0f79bc08008a59f6fd6bef2a0a0195e5b3b9e9bef255df519890" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.37.29" + }, + "cachetools": { + "hashes": [ + "sha256:1a661caa9175d26759571b2e19580f9d6393969e5dfca11fdb1f947a23e640d4", + "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a" + ], + "markers": "python_version >= '3.7'", + "version": "==5.5.2" + }, + "certifi": { + "hashes": [ + "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", + "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==2025.1.31" + }, + "cffi": { + "hashes": [ + "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", + "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", + "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", + "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", + "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", + "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", + "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", + "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", + "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", + "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", + "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", + "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", + "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", + "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", + "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", + "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", + "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", + "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", + "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", + "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", + "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", + "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", + "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", + "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", + "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", + "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", + "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", + "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", + "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", + "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", + "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", + "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", + "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", + "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", + "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", + "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", + "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", + "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", + "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", + "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", + "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", + "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", + "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", + "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", + "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", + "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", + "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", + "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", + "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", + "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", + "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", + "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", + "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", + "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", + "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", + "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", + "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", + "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", + "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", + "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", + "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" + ], + "markers": "platform_python_implementation != 'PyPy'", + "version": "==1.17.1" + }, + "chardet": { + "hashes": [ + "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", + "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==5.2.0" + }, + "charset-normalizer": { + "hashes": [ + "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", + "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", + "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", + "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", + "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", + "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", + "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c", + "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", + "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", + "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", + "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", + "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", + "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", + "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", + "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", + "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", + "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", + "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", + "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4", + "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", + "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", + "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", + "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", + "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", + "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", + "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", + "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b", + "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", + "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", + "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", + "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", + "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", + "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", + "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", + "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", + "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", + "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a", + "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40", + "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", + "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", + "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", + "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", + "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", + "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", + "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", + "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", + "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", + "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", + "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9", + "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", + "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", + "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", + "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b", + "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", + "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942", + "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", + "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", + "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b", + "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", + "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", + "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", + "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", + "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", + "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", + "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", + "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", + "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", + "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", + "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", + "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", + "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", + "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb", + "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", + "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557", + "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", + "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", + "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", + "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", + "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9" + ], + "markers": "python_version >= '3.7'", + "version": "==3.4.3" + }, + "click": { + "hashes": [ + "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", + "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b" + ], + "markers": "python_version >= '3.10'", + "version": "==8.2.1" + }, + "coloredlogs": { + "hashes": [ + "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934", + "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==15.0.1" + }, + "contextgem": { + "hashes": [ + "sha256:6ec0528037deb2477c359346e0fe84a9416cba99c402a13c3cbef6251fa8a1a0", + "sha256:9c5be0078fc41cde3e22f3b4a6a23f723bb22b86033acc4ac47cf88c5fa20ede" + ], + "index": "pypi", + "markers": "python_version >= '3.10' and python_version < '3.14'", + "version": "==0.8.1" + }, + "contourpy": { + "hashes": [ + "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", + "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", + "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", + "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", + "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", + "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", + "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", + "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", + "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", + "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", + "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", + "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", + "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", + "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", + "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", + "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", + "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", + "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", + "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", + "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", + "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", + "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", + "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", + "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", + "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", + "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", + "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", + "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", + "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", + "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", + "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", + "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", + "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", + "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", + "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", + "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", + "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", + "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", + "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", + "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", + "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", + "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", + "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", + "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", + "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", + "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", + "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", + "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", + "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", + "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", + "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", + "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", + "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", + "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", + "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", + "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", + "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c" + ], + "markers": "python_version >= '3.10'", + "version": "==1.3.2" + }, + "cryptography": { + "hashes": [ + "sha256:00e8724bdad672d75e6f069b27970883179bd472cd24a63f6e620ca7e41cc0c5", + "sha256:048e7ad9e08cf4c0ab07ff7f36cc3115924e22e2266e034450a890d9e312dd74", + "sha256:0d9ef57b6768d9fa58e92f4947cea96ade1233c0e236db22ba44748ffedca394", + "sha256:18f878a34b90d688982e43f4b700408b478102dd58b3e39de21b5ebf6509c301", + "sha256:1b7fa6a1c1188c7ee32e47590d16a5a0646270921f8020efc9a511648e1b2e08", + "sha256:20ae4906a13716139d6d762ceb3e0e7e110f7955f3bc3876e3a07f5daadec5f3", + "sha256:20d15aed3ee522faac1a39fbfdfee25d17b1284bafd808e1640a74846d7c4d1b", + "sha256:2384f2ab18d9be88a6e4f8972923405e2dbb8d3e16c6b43f15ca491d7831bd18", + "sha256:275ba5cc0d9e320cd70f8e7b96d9e59903c815ca579ab96c1e37278d231fc402", + "sha256:2dac5ec199038b8e131365e2324c03d20e97fe214af051d20c49db129844e8b3", + "sha256:31a2b9a10530a1cb04ffd6aa1cd4d3be9ed49f7d77a4dafe198f3b382f41545c", + "sha256:3436128a60a5e5490603ab2adbabc8763613f638513ffa7d311c900a8349a2a0", + "sha256:3b5bf5267e98661b9b888a9250d05b063220dfa917a8203744454573c7eb79db", + "sha256:3de77e4df42ac8d4e4d6cdb342d989803ad37707cf8f3fbf7b088c9cbdd46427", + "sha256:44647c5d796f5fc042bbc6d61307d04bf29bccb74d188f18051b635f20a9c75f", + "sha256:550ae02148206beb722cfe4ef0933f9352bab26b087af00e48fdfb9ade35c5b3", + "sha256:599c8d7df950aa68baa7e98f7b73f4f414c9f02d0e8104a30c0182a07732638b", + "sha256:5b64e668fc3528e77efa51ca70fadcd6610e8ab231e3e06ae2bab3b31c2b8ed9", + "sha256:5bd6020c80c5b2b2242d6c48487d7b85700f5e0038e67b29d706f98440d66eb5", + "sha256:5c966c732cf6e4a276ce83b6e4c729edda2df6929083a952cc7da973c539c719", + "sha256:629127cfdcdc6806dfe234734d7cb8ac54edaf572148274fa377a7d3405b0043", + "sha256:705bb7c7ecc3d79a50f236adda12ca331c8e7ecfbea51edd931ce5a7a7c4f012", + "sha256:780c40fb751c7d2b0c6786ceee6b6f871e86e8718a8ff4bc35073ac353c7cd02", + "sha256:7a3085d1b319d35296176af31c90338eeb2ddac8104661df79f80e1d9787b8b2", + "sha256:826b46dae41a1155a0c0e66fafba43d0ede1dc16570b95e40c4d83bfcf0a451d", + "sha256:833dc32dfc1e39b7376a87b9a6a4288a10aae234631268486558920029b086ec", + "sha256:cc4d66f5dc4dc37b89cfef1bd5044387f7a1f6f0abb490815628501909332d5d", + "sha256:d063341378d7ee9c91f9d23b431a3502fc8bfacd54ef0a27baa72a0843b29159", + "sha256:e2a21a8eda2d86bb604934b6b37691585bd095c1f788530c1fcefc53a82b3453", + "sha256:e40b80ecf35ec265c452eea0ba94c9587ca763e739b8e559c128d23bff7ebbbf", + "sha256:e5b3dda1b00fb41da3af4c5ef3f922a200e33ee5ba0f0bc9ecf0b0c173958385", + "sha256:ea3c42f2016a5bbf71825537c2ad753f2870191134933196bee408aac397b3d9", + "sha256:eccddbd986e43014263eda489abbddfbc287af5cddfd690477993dbb31e31016", + "sha256:ee411a1b977f40bd075392c80c10b58025ee5c6b47a822a33c1198598a7a5f05", + "sha256:f4028f29a9f38a2025abedb2e409973709c660d44319c61762202206ed577c42", + "sha256:f68f833a9d445cc49f01097d95c83a850795921b3f7cc6488731e69bde3288da", + "sha256:fc022c1fa5acff6def2fc6d7819bbbd31ccddfe67d075331a65d9cfb28a20983" + ], + "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", + "version": "==45.0.6" + }, + "cycler": { + "hashes": [ + "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", + "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "dataclasses-json": { + "hashes": [ + "sha256:0dbf33f26c8d5305befd61b39d2b3414e8a407bedc2834dea9b8d642666fb40a", + "sha256:b6b3e528266ea45b9535223bc53ca645f5208833c29229e847b3f26a1cc55fc0" + ], + "markers": "python_version >= '3.7' and python_version < '4.0'", + "version": "==0.6.7" + }, + "datasets": { + "hashes": [ + "sha256:7ef95e62025fd122882dbce6cb904c8cd3fbc829de6669a5eb939c77d50e203d", + "sha256:9657e7140a9050db13443ba21cb5de185af8af944479b00e7ff1e00a61c8dbf1" + ], + "markers": "python_full_version >= '3.9.0'", + "version": "==4.0.0" + }, + "defusedxml": { + "hashes": [ + "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", + "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.7.1" + }, + "dill": { + "hashes": [ + "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca", + "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7" + ], + "markers": "python_version >= '3.8'", + "version": "==0.3.8" + }, + "diskcache": { + "hashes": [ + "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", + "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19" + ], + "markers": "python_version >= '3'", + "version": "==5.6.3" + }, + "distro": { + "hashes": [ + "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", + "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2" + ], + "markers": "python_version >= '3.6'", + "version": "==1.9.0" + }, + "docstring-parser": { + "hashes": [ + "sha256:583de4a309722b3315439bb31d64ba3eebada841f2e2cee23b99df001434c912", + "sha256:cf2569abd23dce8099b300f9b4fa8191e9582dda731fd533daf54c4551658708" + ], + "markers": "python_version >= '3.8'", + "version": "==0.17.0" + }, + "emoji": { + "hashes": [ + "sha256:35a8a486c1460addb1499e3bf7929d3889b2e2841a57401903699fef595e942b", + "sha256:f8c50043d79a2c1410ebfae833ae1868d5941a67a6cd4d18377e2eb0bd79346b" + ], + "markers": "python_version >= '3.7'", + "version": "==2.14.1" + }, + "eval-type-backport": { + "hashes": [ + "sha256:cb6ad7c393517f476f96d456d0412ea80f0a8cf96f6892834cd9340149111b0a", + "sha256:f0576b4cf01ebb5bd358d02314d31846af5e07678387486e2c798af0e7d849c1" + ], + "markers": "python_version >= '3.8'", + "version": "==0.2.2" + }, + "exceptiongroup": { + "hashes": [ + "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", + "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88" + ], + "markers": "python_version < '3.11'", + "version": "==1.3.0" + }, + "fastapi": { + "hashes": [ + "sha256:32e1541b7b74602e4ef4a0260ecaf3aadf9d4f19590bba3e1bf2ac4666aa2c64", + "sha256:cc81f03f688678b92600a65a5e618b93592c65005db37157147204d8924bf94f" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==0.115.11" + }, + "fastapi-health": { + "hashes": [ + "sha256:a0781b2359732d50cddda1195784f78950265c6b3689d7a1e6e65a21aed4d6a5", + "sha256:d6c1795f7596009cffa7a84d5a67a6b66bbf9d6ce79b040fd50601ed5392089f" + ], + "index": "pypi", + "markers": "python_full_version >= '3.6.1' and python_full_version < '4.0.0'", + "version": "==0.4.0" + }, + "filelock": { + "hashes": [ + "sha256:adbc88eabb99d2fec8c9c1b229b171f18afa655400173ddc653d5d01501fb9f2", + "sha256:c401f4f8377c4464e6db25fff06205fd89bdd83b65eb0488ed1b160f780e21de" + ], + "markers": "python_version >= '3.9'", + "version": "==3.18.0" + }, + "filetype": { + "hashes": [ + "sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb", + "sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25" + ], + "version": "==1.2.0" + }, + "fireworks-ai": { + "hashes": [ + "sha256:59b95c01a6239f3c0f4b89f9ae2c4d1db1cb3464c4ddb4cf5ef43d9586757fd0", + "sha256:9125bf0625af160cb72f91d55262bc40db78a616126f6e62677e55a2bfd7db99" + ], + "markers": "python_version >= '3.9'", + "version": "==0.17.16" + }, + "flatbuffers": { + "hashes": [ + "sha256:97e451377a41262f8d9bd4295cc836133415cc03d8cb966410a4af92eb00d26e", + "sha256:ebba5f4d5ea615af3f7fd70fc310636fbb2bbd1f566ac0a23d98dd412de50051" + ], + "version": "==25.2.10" + }, + "fonttools": { + "hashes": [ + "sha256:052444a5d0151878e87e3e512a1aa1a0ab35ee4c28afde0a778e23b0ace4a7de", + "sha256:169b99a2553a227f7b5fea8d9ecd673aa258617f466b2abc6091fe4512a0dcd0", + "sha256:209b75943d158f610b78320eacb5539aa9e920bee2c775445b2846c65d20e19d", + "sha256:21e606b2d38fed938dde871c5736822dd6bda7a4631b92e509a1f5cd1b90c5df", + "sha256:241313683afd3baacb32a6bd124d0bce7404bc5280e12e291bae1b9bba28711d", + "sha256:26731739daa23b872643f0e4072d5939960237d540c35c14e6a06d47d71ca8fe", + "sha256:2e7cf8044ce2598bb87e44ba1d2c6e45d7a8decf56055b92906dc53f67c76d64", + "sha256:31003b6a10f70742a63126b80863ab48175fb8272a18ca0846c0482968f0588e", + "sha256:332bfe685d1ac58ca8d62b8d6c71c2e52a6c64bc218dc8f7825c9ea51385aa01", + "sha256:37c377f7cb2ab2eca8a0b319c68146d34a339792f9420fca6cd49cf28d370705", + "sha256:37e01c6ec0c98599778c2e688350d624fa4770fbd6144551bd5e032f1199171c", + "sha256:401b1941ce37e78b8fd119b419b617277c65ae9417742a63282257434fd68ea2", + "sha256:4536f2695fe5c1ffb528d84a35a7d3967e5558d2af58b4775e7ab1449d65767b", + "sha256:4c908a7036f0f3677f8afa577bcd973e3e20ddd2f7c42a33208d18bee95cdb6f", + "sha256:51ab1ff33c19e336c02dee1e9fd1abd974a4ca3d8f7eef2a104d0816a241ce97", + "sha256:524133c1be38445c5c0575eacea42dbd44374b310b1ffc4b60ff01d881fabb96", + "sha256:57bb7e26928573ee7c6504f54c05860d867fd35e675769f3ce01b52af38d48e2", + "sha256:60f6665579e909b618282f3c14fa0b80570fbf1ee0e67678b9a9d43aa5d67a37", + "sha256:62224a9bb85b4b66d1b46d45cbe43d71cbf8f527d332b177e3b96191ffbc1e64", + "sha256:6770d7da00f358183d8fd5c4615436189e4f683bdb6affb02cad3d221d7bb757", + "sha256:6801aeddb6acb2c42eafa45bc1cb98ba236871ae6f33f31e984670b749a8e58e", + "sha256:70d6b3ceaa9cc5a6ac52884f3b3d9544e8e231e95b23f138bdb78e6d4dc0eae3", + "sha256:78813b49d749e1bb4db1c57f2d4d7e6db22c253cb0a86ad819f5dc197710d4b2", + "sha256:841b2186adce48903c0fef235421ae21549020eca942c1da773ac380b056ab3c", + "sha256:84fc186980231a287b28560d3123bd255d3c6b6659828c642b4cf961e2b923d0", + "sha256:885bde7d26e5b40e15c47bd5def48b38cbd50830a65f98122a8fb90962af7cd1", + "sha256:8b4309a2775e4feee7356e63b163969a215d663399cce1b3d3b65e7ec2d9680e", + "sha256:8d77f92438daeaddc05682f0f3dac90c5b9829bcac75b57e8ce09cb67786073c", + "sha256:902425f5afe28572d65d2bf9c33edd5265c612ff82c69e6f83ea13eafc0dcbea", + "sha256:9bcc1e77fbd1609198966ded6b2a9897bd6c6bcbd2287a2fc7d75f1a254179c5", + "sha256:a408c3c51358c89b29cfa5317cf11518b7ce5de1717abb55c5ae2d2921027de6", + "sha256:a9bf8adc9e1f3012edc8f09b08336272aec0c55bc677422273e21280db748f7c", + "sha256:b818db35879d2edf7f46c7e729c700a0bce03b61b9412f5a7118406687cb151d", + "sha256:b8974b2a266b54c96709bd5e239979cddfd2dbceed331aa567ea1d7c4a2202db", + "sha256:be392ec3529e2f57faa28709d60723a763904f71a2b63aabe14fee6648fe3b14", + "sha256:d3972b13148c1d1fbc092b27678a33b3080d1ac0ca305742b0119b75f9e87e38", + "sha256:d40dcf533ca481355aa7b682e9e079f766f35715defa4929aeb5597f9604272e", + "sha256:e93df708c69a193fc7987192f94df250f83f3851fda49413f02ba5dded639482", + "sha256:efd7e6660674e234e29937bc1481dceb7e0336bfae75b856b4fb272b5093c5d4", + "sha256:f9b3a78f69dcbd803cf2fb3f972779875b244c1115481dfbdd567b2c22b31f6b", + "sha256:fa39475eaccb98f9199eccfda4298abaf35ae0caec676ffc25b3a5e224044464", + "sha256:fbce6dae41b692a5973d0f2158f782b9ad05babc2c2019a970a1094a23909b1b" + ], + "markers": "python_version >= '3.9'", + "version": "==4.59.0" + }, + "frozenlist": { + "hashes": [ + "sha256:04fb24d104f425da3540ed83cbfc31388a586a7696142004c577fa61c6298c3f", + "sha256:05579bf020096fe05a764f1f84cd104a12f78eaab68842d036772dc6d4870b4b", + "sha256:0aa7e176ebe115379b5b1c95b4096fb1c17cce0847402e227e712c27bdb5a949", + "sha256:1073557c941395fdfcfac13eb2456cb8aad89f9de27bae29fabca8e563b12615", + "sha256:1137b78384eebaf70560a36b7b229f752fb64d463d38d1304939984d5cb887b6", + "sha256:15900082e886edb37480335d9d518cec978afc69ccbc30bd18610b7c1b22a718", + "sha256:15a7eaba63983d22c54d255b854e8108e7e5f3e89f647fc854bd77a237e767df", + "sha256:1a85e345b4c43db8b842cab1feb41be5cc0b10a1830e6295b69d7310f99becaf", + "sha256:1e63344c4e929b1a01e29bc184bbb5fd82954869033765bfe8d65d09e336a677", + "sha256:1eaa7e9c6d15df825bf255649e05bd8a74b04a4d2baa1ae46d9c2d00b2ca2cb5", + "sha256:1ed8d2fa095aae4bdc7fdd80351009a48d286635edffee66bf865e37a9125c50", + "sha256:1f5906d3359300b8a9bb194239491122e6cf1444c2efb88865426f170c262cdb", + "sha256:21884e23cffabb157a9dd7e353779077bf5b8f9a58e9b262c6caad2ef5f80a56", + "sha256:24c34bea555fe42d9f928ba0a740c553088500377448febecaa82cc3e88aa1fa", + "sha256:284d233a8953d7b24f9159b8a3496fc1ddc00f4db99c324bd5fb5f22d8698ea7", + "sha256:290a172aae5a4c278c6da8a96222e6337744cd9c77313efe33d5670b9f65fc43", + "sha256:2e310d81923c2437ea8670467121cc3e9b0f76d3043cc1d2331d56c7fb7a3a8f", + "sha256:2ea2a7369eb76de2217a842f22087913cdf75f63cf1307b9024ab82dfb525938", + "sha256:32dc2e08c67d86d0969714dd484fd60ff08ff81d1a1e40a77dd34a387e6ebc0c", + "sha256:34a69a85e34ff37791e94542065c8416c1afbf820b68f720452f636d5fb990cd", + "sha256:376b6222d114e97eeec13d46c486facd41d4f43bab626b7c3f6a8b4e81a5192c", + "sha256:3789ebc19cb811163e70fe2bd354cea097254ce6e707ae42e56f45e31e96cb8e", + "sha256:387cbfdcde2f2353f19c2f66bbb52406d06ed77519ac7ee21be0232147c2592d", + "sha256:3a14027124ddb70dfcee5148979998066897e79f89f64b13328595c4bdf77c81", + "sha256:3bf8010d71d4507775f658e9823210b7427be36625b387221642725b515dcf3e", + "sha256:3d688126c242a6fabbd92e02633414d40f50bb6002fa4cf995a1d18051525657", + "sha256:3dabd5a8f84573c8d10d8859a50ea2dec01eea372031929871368c09fa103478", + "sha256:3dbf9952c4bb0e90e98aec1bd992b3318685005702656bc6f67c1a32b76787f2", + "sha256:3fbba20e662b9c2130dc771e332a99eff5da078b2b2648153a40669a6d0e36ca", + "sha256:400ddd24ab4e55014bba442d917203c73b2846391dd42ca5e38ff52bb18c3c5e", + "sha256:41be2964bd4b15bf575e5daee5a5ce7ed3115320fb3c2b71fca05582ffa4dc9e", + "sha256:426c7bc70e07cfebc178bc4c2bf2d861d720c4fff172181eeb4a4c41d4ca2ad3", + "sha256:43a82fce6769c70f2f5a06248b614a7d268080a9d20f7457ef10ecee5af82b63", + "sha256:45a6f2fdbd10e074e8814eb98b05292f27bad7d1883afbe009d96abdcf3bc898", + "sha256:46d84d49e00c9429238a7ce02dc0be8f6d7cd0cd405abd1bebdc991bf27c15bd", + "sha256:488d0a7d6a0008ca0db273c542098a0fa9e7dfaa7e57f70acef43f32b3f69dca", + "sha256:4a646531fa8d82c87fe4bb2e596f23173caec9185bfbca5d583b4ccfb95183e2", + "sha256:4e7e9652b3d367c7bd449a727dc79d5043f48b88d0cbfd4f9f1060cf2b414104", + "sha256:52109052b9791a3e6b5d1b65f4b909703984b770694d3eb64fad124c835d7cba", + "sha256:563b72efe5da92e02eb68c59cb37205457c977aa7a449ed1b37e6939e5c47c6a", + "sha256:5fc4df05a6591c7768459caba1b342d9ec23fa16195e744939ba5914596ae3e1", + "sha256:61d1a5baeaac6c0798ff6edfaeaa00e0e412d49946c53fae8d4b8e8b3566c4ae", + "sha256:69cac419ac6a6baad202c85aaf467b65ac860ac2e7f2ac1686dc40dbb52f6577", + "sha256:6a5c505156368e4ea6b53b5ac23c92d7edc864537ff911d2fb24c140bb175e60", + "sha256:6aeac207a759d0dedd2e40745575ae32ab30926ff4fa49b1635def65806fddee", + "sha256:6eb93efb8101ef39d32d50bce242c84bcbddb4f7e9febfa7b524532a239b4464", + "sha256:716a9973a2cc963160394f701964fe25012600f3d311f60c790400b00e568b61", + "sha256:72c1b0fe8fe451b34f12dce46445ddf14bd2a5bcad7e324987194dc8e3a74c86", + "sha256:73bd45e1488c40b63fe5a7df892baf9e2a4d4bb6409a2b3b78ac1c6236178e01", + "sha256:74739ba8e4e38221d2c5c03d90a7e542cb8ad681915f4ca8f68d04f810ee0a87", + "sha256:765bb588c86e47d0b68f23c1bee323d4b703218037765dcf3f25c838c6fecceb", + "sha256:79b2ffbba483f4ed36a0f236ccb85fbb16e670c9238313709638167670ba235f", + "sha256:7d536ee086b23fecc36c2073c371572374ff50ef4db515e4e503925361c24f71", + "sha256:7edf5c043c062462f09b6820de9854bf28cc6cc5b6714b383149745e287181a8", + "sha256:82d664628865abeb32d90ae497fb93df398a69bb3434463d172b80fc25b0dd7d", + "sha256:836b42f472a0e006e02499cef9352ce8097f33df43baaba3e0a28a964c26c7d2", + "sha256:8bd7eb96a675f18aa5c553eb7ddc24a43c8c18f22e1f9925528128c052cdbe00", + "sha256:8fc5d5cda37f62b262405cf9652cf0856839c4be8ee41be0afe8858f17f4c94b", + "sha256:912a7e8375a1c9a68325a902f3953191b7b292aa3c3fb0d71a216221deca460b", + "sha256:9537c2777167488d539bc5de2ad262efc44388230e5118868e172dd4a552b146", + "sha256:960d67d0611f4c87da7e2ae2eacf7ea81a5be967861e0c63cf205215afbfac59", + "sha256:974c5336e61d6e7eb1ea5b929cb645e882aadab0095c5a6974a111e6479f8878", + "sha256:99886d98e1643269760e5fe0df31e5ae7050788dd288947f7f007209b8c33f08", + "sha256:9a19e85cc503d958abe5218953df722748d87172f71b73cf3c9257a91b999890", + "sha256:9a5af342e34f7e97caf8c995864c7a396418ae2859cc6fdf1b1073020d516a7e", + "sha256:9b35db7ce1cd71d36ba24f80f0c9e7cff73a28d7a74e91fe83e23d27c7828750", + "sha256:9ccec739a99e4ccf664ea0775149f2749b8a6418eb5b8384b4dc0a7d15d304cb", + "sha256:a0fd1bad056a3600047fb9462cff4c5322cebc59ebf5d0a3725e0ee78955001d", + "sha256:a26f205c9ca5829cbf82bb2a84b5c36f7184c4316617d7ef1b271a56720d6b30", + "sha256:a47f2abb4e29b3a8d0b530f7c3598badc6b134562b1a5caee867f7c62fee51e3", + "sha256:a6f86e4193bb0e235ef6ce3dde5cbabed887e0b11f516ce8a0f4d3b33078ec2d", + "sha256:aa51e147a66b2d74de1e6e2cf5921890de6b0f4820b257465101d7f37b49fb5a", + "sha256:aa57daa5917f1738064f302bf2626281a1cb01920c32f711fbc7bc36111058a8", + "sha256:ac64b6478722eeb7a3313d494f8342ef3478dff539d17002f849101b212ef97c", + "sha256:acd03d224b0175f5a850edc104ac19040d35419eddad04e7cf2d5986d98427f1", + "sha256:af369aa35ee34f132fcfad5be45fbfcde0e3a5f6a1ec0712857f286b7d20cca9", + "sha256:b0d5ce521d1dd7d620198829b87ea002956e4319002ef0bc8d3e6d045cb4646e", + "sha256:b3950f11058310008a87757f3eee16a8e1ca97979833239439586857bc25482e", + "sha256:b8c05e4c8e5f36e5e088caa1bf78a687528f83c043706640a92cb76cd6999384", + "sha256:bcacfad3185a623fa11ea0e0634aac7b691aa925d50a440f39b458e41c561d98", + "sha256:bd8c4e58ad14b4fa7802b8be49d47993182fdd4023393899632c88fd8cd994eb", + "sha256:bfe2b675cf0aaa6d61bf8fbffd3c274b3c9b7b1623beb3809df8a81399a4a9c4", + "sha256:c0303e597eb5a5321b4de9c68e9845ac8f290d2ab3f3e2c864437d3c5a30cd65", + "sha256:c193dda2b6d49f4c4398962810fa7d7c78f032bf45572b3e04dd5249dff27e08", + "sha256:c70db4a0ab5ab20878432c40563573229a7ed9241506181bba12f6b7d0dc41cb", + "sha256:cbb65198a9132ebc334f237d7b0df163e4de83fb4f2bdfe46c1e654bdb0c5d43", + "sha256:cc4df77d638aa2ed703b878dd093725b72a824c3c546c076e8fdf276f78ee84a", + "sha256:ce48b2fece5aeb45265bb7a58259f45027db0abff478e3077e12b05b17fb9da7", + "sha256:cea3dbd15aea1341ea2de490574a4a37ca080b2ae24e4b4f4b51b9057b4c3630", + "sha256:d1a81c85417b914139e3a9b995d4a1c84559afc839a93cf2cb7f15e6e5f6ed2d", + "sha256:d50ac7627b3a1bd2dcef6f9da89a772694ec04d9a61b66cf87f7d9446b4a0c31", + "sha256:dab46c723eeb2c255a64f9dc05b8dd601fde66d6b19cdb82b2e09cc6ff8d8b5d", + "sha256:dfcebf56f703cb2e346315431699f00db126d158455e513bd14089d992101e44", + "sha256:e22b9a99741294b2571667c07d9f8cceec07cb92aae5ccda39ea1b6052ed4319", + "sha256:e2cdfaaec6a2f9327bf43c933c0319a7c429058e8537c508964a133dffee412e", + "sha256:e4389e06714cfa9d47ab87f784a7c5be91d3934cd6e9a7b85beef808297cc025", + "sha256:e793a9f01b3e8b5c0bc646fb59140ce0efcc580d22a3468d70766091beb81b35", + "sha256:ee80eeda5e2a4e660651370ebffd1286542b67e268aa1ac8d6dbe973120ef7ee", + "sha256:f2038310bc582f3d6a09b3816ab01737d60bf7b1ec70f5356b09e84fb7408ab1", + "sha256:f22dac33bb3ee8fe3e013aa7b91dc12f60d61d05b7fe32191ffa84c3aafe77bd", + "sha256:f34560fb1b4c3e30ba35fa9a13894ba39e5acfc5f60f57d8accde65f46cc5e74", + "sha256:f3f4410a0a601d349dd406b5713fec59b4cee7e71678d5b17edda7f4655a940b", + "sha256:f89f65d85774f1797239693cef07ad4c97fdd0639544bad9ac4b869782eb1981", + "sha256:fe2365ae915a1fafd982c146754e1de6ab3478def8a59c86e1f7242d794f97d5" + ], + "markers": "python_version >= '3.9'", + "version": "==1.7.0" + }, + "fsspec": { + "extras": [ + "http" + ], + "hashes": [ + "sha256:670700c977ed2fb51e0d9f9253177ed20cbde4a3e5c0283cc5385b5870c8533f", + "sha256:b520aed47ad9804237ff878b504267a3b0b441e97508bd6d2d8774e3db85cee2" + ], + "markers": "python_version >= '3.8'", + "version": "==2024.12.0" + }, + "google-api-core": { + "extras": [ + "grpc" + ], + "hashes": [ + "sha256:810a63ac95f3c441b7c0e43d344e372887f62ce9071ba972eacf32672e072de9", + "sha256:81718493daf06d96d6bc76a91c23874dbf2fac0adbbf542831b805ee6e974696" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.24.2" + }, + "google-auth": { + "hashes": [ + "sha256:8285113607d3b80a3f1543b75962447ba8a09fe85783432a784fdeef6ac094c4", + "sha256:e7dae6694313f434a2727bf2906f27ad259bae090d7aa896590d86feec3d9d4a" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.38.0" + }, + "google-auth-oauthlib": { + "hashes": [ + "sha256:2d58a27262d55aa1b87678c3ba7142a080098cbc2024f903c62355deb235d91f", + "sha256:afd0cad092a2eaa53cd8e8298557d6de1034c6cb4a740500b5357b648af97263" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==1.2.1" + }, + "google-cloud-aiplatform": { + "hashes": [ + "sha256:2001c3be0d704fe4a1d5adc815172391a0e10a9009e9c3eed721a12d3d431ba6", + "sha256:ebff9931f948622ea2d34890b2ca8f8f4915c575814fdc1bcc16bc1b1beb5549" + ], + "markers": "python_version >= '3.9'", + "version": "==1.108.0" + }, + "google-cloud-appengine-logging": { + "hashes": [ + "sha256:2b28ed715e92b67e334c6fcfe1deb523f001919560257b25fc8fcda95fd63938", + "sha256:4890928464c98da9eecc7bf4e0542eba2551512c0265462c10f3a3d2a6424b90" + ], + "markers": "python_version >= '3.7'", + "version": "==1.6.2" + }, + "google-cloud-audit-log": { + "hashes": [ + "sha256:2598f1533a7d7cdd6c7bf448c12e5519c1d53162d78784e10bcdd1df67791bc3", + "sha256:daaedfb947a0d77f524e1bd2b560242ab4836fe1afd6b06b92f152b9658554ed" + ], + "markers": "python_version >= '3.7'", + "version": "==0.3.2" + }, + "google-cloud-bigquery": { + "hashes": [ + "sha256:599f26cacf190acfe88000f6cc5f4bc9e6baac7899e4f406ca054f1906f71960", + "sha256:6739a6ba63c6d80735ca2b34b1df2090ff473b80c1a62354caa2debe6dbbd961" + ], + "markers": "python_version >= '3.9'", + "version": "==3.35.1" + }, + "google-cloud-core": { + "hashes": [ + "sha256:1fab62d7102844b278fe6dead3af32408b1df3eb06f5c7e8634cbd40edc4da53", + "sha256:5130f9f4c14b4fafdff75c79448f9495cfade0d8775facf1b09c3bf67e027f6e" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==2.4.3" + }, + "google-cloud-logging": { + "hashes": [ + "sha256:1d465ac62df29fb94bba4d6b4891035e57d573d84541dd8a40eebbc74422b2f0", + "sha256:32305d989323f3c58603044e2ac5d9cf23e9465ede511bbe90b4309270d3195c" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.11.4" + }, + "google-cloud-resource-manager": { + "hashes": [ + "sha256:962e2d904c550d7bac48372607904ff7bb3277e3bb4a36d80cc9a37e28e6eb74", + "sha256:d0fa954dedd1d2b8e13feae9099c01b8aac515b648e612834f9942d2795a9900" + ], + "markers": "python_version >= '3.7'", + "version": "==1.14.2" + }, + "google-cloud-storage": { + "hashes": [ + "sha256:aeb971b5c29cf8ab98445082cbfe7b161a1f48ed275822f59ed3f1524ea54fba", + "sha256:cd05e9e7191ba6cb68934d8eb76054d9be4562aa89dbc4236feee4d7d51342b2" + ], + "markers": "python_version >= '3.7'", + "version": "==2.19.0" + }, + "google-crc32c": { + "hashes": [ + "sha256:0f99eaa09a9a7e642a61e06742856eec8b19fc0037832e03f941fe7cf0c8e4db", + "sha256:19eafa0e4af11b0a4eb3974483d55d2d77ad1911e6cf6f832e1574f6781fd337", + "sha256:1c67ca0a1f5b56162951a9dae987988679a7db682d6f97ce0f6381ebf0fbea4c", + "sha256:1f2b3522222746fff0e04a9bd0a23ea003ba3cccc8cf21385c564deb1f223242", + "sha256:22beacf83baaf59f9d3ab2bbb4db0fb018da8e5aebdce07ef9f09fce8220285e", + "sha256:2bff2305f98846f3e825dbeec9ee406f89da7962accdb29356e4eadc251bd472", + "sha256:2d73a68a653c57281401871dd4aeebbb6af3191dcac751a76ce430df4d403194", + "sha256:32d1da0d74ec5634a05f53ef7df18fc646666a25efaaca9fc7dcfd4caf1d98c3", + "sha256:3bda0fcb632d390e3ea8b6b07bf6b4f4a66c9d02dcd6fbf7ba00a197c143f582", + "sha256:6335de12921f06e1f774d0dd1fbea6bf610abe0887a1638f64d694013138be5d", + "sha256:6b211ddaf20f7ebeec5c333448582c224a7c90a9d98826fbab82c0ddc11348e6", + "sha256:6efb97eb4369d52593ad6f75e7e10d053cf00c48983f7a973105bc70b0ac4d82", + "sha256:6fbab4b935989e2c3610371963ba1b86afb09537fd0c633049be82afe153ac06", + "sha256:713121af19f1a617054c41f952294764e0c5443d5a5d9034b2cd60f5dd7e0349", + "sha256:754561c6c66e89d55754106739e22fdaa93fafa8da7221b29c8b8e8270c6ec8a", + "sha256:7cc81b3a2fbd932a4313eb53cc7d9dde424088ca3a0337160f35d91826880c1d", + "sha256:85fef7fae11494e747c9fd1359a527e5970fc9603c90764843caabd3a16a0a48", + "sha256:905a385140bf492ac300026717af339790921f411c0dfd9aa5a9e69a08ed32eb", + "sha256:9fc196f0b8d8bd2789352c6a522db03f89e83a0ed6b64315923c396d7a932315", + "sha256:a8e9afc74168b0b2232fb32dd202c93e46b7d5e4bf03e66ba5dc273bb3559589", + "sha256:b07d48faf8292b4db7c3d64ab86f950c2e94e93a11fd47271c28ba458e4a0d76", + "sha256:b6d86616faaea68101195c6bdc40c494e4d76f41e07a37ffdef270879c15fb65", + "sha256:b7491bdc0c7564fcf48c0179d2048ab2f7c7ba36b84ccd3a3e1c3f7a72d3bba6", + "sha256:bb5e35dcd8552f76eed9461a23de1030920a3c953c1982f324be8f97946e7127", + "sha256:d68e17bad8f7dd9a49181a1f5a8f4b251c6dbc8cc96fb79f1d321dfd57d66f53", + "sha256:dcdf5a64adb747610140572ed18d011896e3b9ae5195f2514b7ff678c80f1603", + "sha256:df8b38bdaf1629d62d51be8bdd04888f37c451564c2042d36e5812da9eff3c35", + "sha256:e10554d4abc5238823112c2ad7e4560f96c7bf3820b202660373d769d9e6e4c9", + "sha256:e42e20a83a29aa2709a0cf271c7f8aefaa23b7ab52e53b322585297bb94d4638", + "sha256:ed66cbe1ed9cbaaad9392b5259b3eba4a9e565420d734e6238813c428c3336c9", + "sha256:ee6547b657621b6cbed3562ea7826c3e11cab01cd33b74e1f677690652883e77", + "sha256:f2226b6a8da04f1d9e61d3e357f2460b9551c5e6950071437e122c958a18ae14", + "sha256:fa8136cc14dd27f34a3221c0f16fd42d8a40e4778273e61a3c19aedaa44daf6b", + "sha256:fc5319db92daa516b653600794d5b9f9439a9a121f3e162f94b0e1891c7933cb" + ], + "markers": "python_version >= '3.9'", + "version": "==1.7.1" + }, + "google-genai": { + "hashes": [ + "sha256:8b64737de008d15ca4737e593913f88f656f0568544ab6901f768f0d1fd69bbf", + "sha256:a6b036ab032830f668d137b198c2a5abd8951a036d7a8480b61ce837c1c7f36b" + ], + "markers": "python_version >= '3.9'", + "version": "==1.29.0" + }, + "google-resumable-media": { + "hashes": [ + "sha256:3ce7551e9fe6d99e9a126101d2536612bb73486721951e9562fee0f90c6ababa", + "sha256:5280aed4629f2b60b847b0d42f9857fd4935c11af266744df33d8074cae92fe0" + ], + "markers": "python_version >= '3.7'", + "version": "==2.7.2" + }, + "googleapis-common-protos": { + "extras": [ + "grpc" + ], + "hashes": [ + "sha256:0e1b44e0ea153e6594f9f394fef15193a68aaaea2d843f83e2742717ca753257", + "sha256:b8bfcca8c25a2bb253e0e0b0adaf8c00773e5e6af6fd92397576680b807e0fd8" + ], + "markers": "python_version >= '3.7'", + "version": "==1.70.0" + }, + "graphdatascience": { + "hashes": [ + "sha256:6f83e18f2e6d32d7c92ce4a762b11736a281c9cc001b3d85d95fcf9e8344f584", + "sha256:6fd0ab6f04354a1e9b322c18fa79925af238803406d4bb23e151e1683d1be2b8" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==1.14" + }, + "groq": { + "hashes": [ + "sha256:182252e9bf0d696df607c137cbafa851d2c84aaf94bcfe9165c0bc231043490c", + "sha256:5e3c7ec9728b7cccf913da982a9b5ebb46dc18a070b35e12a3d6a1e12d6b0f7f" + ], + "markers": "python_version >= '3.8'", + "version": "==0.31.0" + }, + "grpc-google-iam-v1": { + "hashes": [ + "sha256:a3171468459770907926d56a440b2bb643eec1d7ba215f48f3ecece42b4d8351", + "sha256:b3e1fc387a1a329e41672197d0ace9de22c78dd7d215048c4c78712073f7bd20" + ], + "markers": "python_version >= '3.7'", + "version": "==0.14.2" + }, + "grpcio": { + "hashes": [ + "sha256:0f87bddd6e27fc776aacf7ebfec367b6d49cad0455123951e4488ea99d9b9b8f", + "sha256:136b53c91ac1d02c8c24201bfdeb56f8b3ac3278668cbb8e0ba49c88069e1bdc", + "sha256:1733969040989f7acc3d94c22f55b4a9501a30f6aaacdbccfaba0a3ffb255ab7", + "sha256:176d60a5168d7948539def20b2a3adcce67d72454d9ae05969a2e73f3a0feee7", + "sha256:1a2b06afe2e50ebfd46247ac3ba60cac523f54ec7792ae9ba6073c12daf26f0a", + "sha256:1bf949792cee20d2078323a9b02bacbbae002b9e3b9e2433f2741c15bdeba1c4", + "sha256:22b834cef33429ca6cc28303c9c327ba9a3fafecbf62fae17e9a7b7163cc43ac", + "sha256:2918948864fec2a11721d91568effffbe0a02b23ecd57f281391d986847982f6", + "sha256:2bc2d7d8d184e2362b53905cb1708c84cb16354771c04b490485fa07ce3a1d89", + "sha256:2f609a39f62a6f6f05c7512746798282546358a37ea93c1fcbadf8b2fed162e3", + "sha256:3601274bc0523f6dc07666c0e01682c94472402ac2fd1226fd96e079863bfa49", + "sha256:3b03d8f2a07f0fea8c8f74deb59f8352b770e3900d143b3d1475effcb08eec20", + "sha256:3d14e3c4d65e19d8430a4e28ceb71ace4728776fd6c3ce34016947474479683f", + "sha256:42f8fee287427b94be63d916c90399ed310ed10aadbf9e2e5538b3e497d269bc", + "sha256:4bc5fca10aaf74779081e16c2bcc3d5ec643ffd528d9e7b1c9039000ead73bae", + "sha256:4e4181bfc24413d1e3a37a0b7889bea68d973d4b45dd2bc68bb766c140718f82", + "sha256:55b453812fa7c7ce2f5c88be3018fb4a490519b6ce80788d5913f3f9d7da8c7b", + "sha256:566b9395b90cc3d0d0c6404bc8572c7c18786ede549cdb540ae27b58afe0fb91", + "sha256:5f251c355167b2360537cf17bea2cf0197995e551ab9da6a0a59b3da5e8704f9", + "sha256:60d2d48b0580e70d2e1954d0d19fa3c2e60dd7cbed826aca104fff518310d1c5", + "sha256:64229c1e9cea079420527fa8ac45d80fc1e8d3f94deaa35643c381fa8d98f362", + "sha256:655726919b75ab3c34cdad39da5c530ac6fa32696fb23119e36b64adcfca174a", + "sha256:662456c4513e298db6d7bd9c3b8df6f75f8752f0ba01fb653e252ed4a59b5a5d", + "sha256:68c8ebcca945efff9d86d8d6d7bfb0841cf0071024417e2d7f45c5e46b5b08eb", + "sha256:69e1a8180868a2576f02356565f16635b99088da7df3d45aaa7e24e73a054e31", + "sha256:6bab67d15ad617aff094c382c882e0177637da73cbc5532d52c07b4ee887a87b", + "sha256:7d95d71ff35291bab3f1c52f52f474c632db26ea12700c2ff0ea0532cb0b5854", + "sha256:80d1f4fbb35b0742d3e3d3bb654b7381cd5f015f8497279a1e9c21ba623e01b1", + "sha256:834988b6c34515545b3edd13e902c1acdd9f2465d386ea5143fb558f153a7176", + "sha256:8533e6e9c5bd630ca98062e3a1326249e6ada07d05acf191a77bc33f8948f3d8", + "sha256:85bd5cdf4ed7b2d6438871adf6afff9af7096486fcf51818a81b77ef4dd30907", + "sha256:86ad489db097141a907c559988c29718719aa3e13370d40e20506f11b4de0d11", + "sha256:885912559974df35d92219e2dc98f51a16a48395f37b92865ad45186f294096c", + "sha256:8efe72fde5500f47aca1ef59495cb59c885afe04ac89dd11d810f2de87d935d4", + "sha256:8f7b5882fb50632ab1e48cb3122d6df55b9afabc265582808036b6e51b9fd6b7", + "sha256:9e7c4389771855a92934b2846bd807fc25a3dfa820fd912fe6bd8136026b2707", + "sha256:9e912d3c993a29df6c627459af58975b2e5c897d93287939b9d5065f000249b5", + "sha256:a8f0302f9ac4e9923f98d8e243939a6fb627cd048f5cd38595c97e38020dffce", + "sha256:b6a73b2ba83e663b2480a90b82fdae6a7aa6427f62bf43b29912c0cfd1aa2bfa", + "sha256:c14e803037e572c177ba54a3e090d6eb12efd795d49327c5ee2b3bddb836bf01", + "sha256:c3d7bd6e3929fd2ea7fbc3f562e4987229ead70c9ae5f01501a46701e08f1ad9", + "sha256:c98e0b7434a7fa4e3e63f250456eaef52499fba5ae661c58cc5b5477d11e7182", + "sha256:cce634b10aeab37010449124814b05a62fb5f18928ca878f1bf4750d1f0c815b", + "sha256:e154d230dc1bbbd78ad2fdc3039fa50ad7ffcf438e4eb2fa30bce223a70c7486", + "sha256:e1ea6176d7dfd5b941ea01c2ec34de9531ba494d541fe2057c904e601879f249", + "sha256:e759f9e8bc908aaae0412642afe5416c9f983a80499448fcc7fab8692ae044c3", + "sha256:e8978003816c7b9eabe217f88c78bc26adc8f9304bf6a594b02e5a49b2ef9c11", + "sha256:ecde9ab49f58433abe02f9ed076c7b5be839cf0153883a6d23995937a82392fa", + "sha256:f6ec94f0e50eb8fa1744a731088b966427575e40c2944a980049798b127a687e", + "sha256:fd3c71aeee838299c5887230b8a1822795325ddfea635edd82954c1eaa831e24", + "sha256:fe0f540750a13fd8e5da4b3eaba91a785eea8dca5ccd2bc2ffe978caa403090e" + ], + "markers": "python_version >= '3.9'", + "version": "==1.74.0" + }, + "grpcio-status": { + "hashes": [ + "sha256:803c98cb6a8b7dc6dbb785b1111aed739f241ab5e9da0bba96888aa74704cfd3", + "sha256:c7a97e176df71cdc2c179cd1847d7fc86cca5832ad12e9798d7fed6b7a1aab50" + ], + "version": "==1.71.2" + }, + "grpclib": { + "hashes": [ + "sha256:a5047733a7acc1c1cee6abf3c841c7c6fab67d2844a45a853b113fa2e6cd2654", + "sha256:d8823763780ef94fed8b2c562f7485cf0bbee15fc7d065a640673667f7719c9a" + ], + "markers": "python_version >= '3.8'", + "version": "==0.4.8" + }, + "gunicorn": { + "hashes": [ + "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", + "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==23.0.0" + }, + "h11": { + "hashes": [ + "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", + "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" + ], + "markers": "python_version >= '3.8'", + "version": "==0.16.0" + }, + "h2": { + "hashes": [ + "sha256:479a53ad425bb29af087f3458a61d30780bc818e4ebcf01f0b536ba916462ed0", + "sha256:c8a52129695e88b1a0578d8d2cc6842bbd79128ac685463b887ee278126ad01f" + ], + "markers": "python_version >= '3.9'", + "version": "==4.2.0" + }, + "hf-xet": { + "hashes": [ + "sha256:18b61bbae92d56ae731b92087c44efcac216071182c603fc535f8e29ec4b09b8", + "sha256:20cec8db4561338824a3b5f8c19774055b04a8df7fff0cb1ff2cb1a0c1607b80", + "sha256:2e356da7d284479ae0f1dea3cf5a2f74fdf925d6dca84ac4341930d892c7cb34", + "sha256:60dae4b44d520819e54e216a2505685248ec0adbdb2dd4848b17aa85a0375cde", + "sha256:6efaaf1a5a9fc3a501d3e71e88a6bfebc69ee3a716d0e713a931c8b8d920038f", + "sha256:713f2bff61b252f8523739969f247aa354ad8e6d869b8281e174e2ea1bb8d604", + "sha256:751571540f9c1fbad9afcf222a5fb96daf2384bf821317b8bfb0c59d86078513", + "sha256:b109f4c11e01c057fc82004c9e51e6cdfe2cb230637644ade40c599739067b2e" + ], + "markers": "platform_machine == 'x86_64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'aarch64'", + "version": "==1.1.7" + }, + "hpack": { + "hashes": [ + "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", + "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca" + ], + "markers": "python_version >= '3.9'", + "version": "==4.1.0" + }, + "html5lib": { + "hashes": [ + "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", + "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.1" + }, + "httpcore": { + "hashes": [ + "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", + "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.9" + }, + "httpx": { + "hashes": [ + "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", + "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad" + ], + "markers": "python_version >= '3.8'", + "version": "==0.28.1" + }, + "httpx-aiohttp": { + "hashes": [ + "sha256:756c5e74cdb568c3248ba63fe82bfe8bbe64b928728720f7eaac64b3cf46f308", + "sha256:b7bd958d1331f3759a38a0ba22ad29832cb63ca69498c17735228055bf78fa7e" + ], + "markers": "python_version >= '3.9'", + "version": "==0.1.8" + }, + "httpx-sse": { + "hashes": [ + "sha256:8f44d34414bc7b21bf3602713005c5df4917884f76072479b21f68befa4ea26e", + "sha256:cba42174344c3a5b06f255ce65b350880f962d99ead85e776f23c6618a377a37" + ], + "markers": "python_version >= '3.9'", + "version": "==0.4.1" + }, + "httpx-ws": { + "hashes": [ + "sha256:93edea6c8fc313464fc287bff7d2ad20e6196b7754c76f946f73b4af79886d4e", + "sha256:dd7bf9dbaa96dcd5cef1af3a7e1130cfac068bebecce25a74145022f5a8427a3" + ], + "markers": "python_version >= '3.9'", + "version": "==0.7.2" + }, + "huggingface-hub": { + "hashes": [ + "sha256:9b365d781739c93ff90c359844221beef048403f1bc1f1c123c191257c3c890a", + "sha256:a4228daa6fb001be3f4f4bdaf9a0db00e1739235702848df00885c9b5742c85c" + ], + "markers": "python_full_version >= '3.8.0'", + "version": "==0.34.4" + }, + "humanfriendly": { + "hashes": [ + "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", + "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==10.0" + }, + "hyperframe": { + "hashes": [ + "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", + "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08" + ], + "markers": "python_version >= '3.9'", + "version": "==6.1.0" + }, + "idna": { + "hashes": [ + "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" + ], + "markers": "python_version >= '3.6'", + "version": "==3.10" + }, + "importlib-metadata": { + "hashes": [ + "sha256:d13b81ad223b890aa16c5471f2ac3056cf76c5f10f82d6f9292f0b415f389000", + "sha256:e5dd1551894c77868a30651cef00984d50e1002d06942a7101d34870c5f02afd" + ], + "markers": "python_version >= '3.9'", + "version": "==8.7.0" + }, + "itsdangerous": { + "hashes": [ + "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", + "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.0" + }, + "jinja2": { + "hashes": [ + "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", + "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" + ], + "markers": "python_version >= '3.7'", + "version": "==3.1.6" + }, + "jiter": { + "hashes": [ + "sha256:023aa0204126fe5b87ccbcd75c8a0d0261b9abdbbf46d55e7ae9f8e22424eeb8", + "sha256:03997d2f37f6b67d2f5c475da4412be584e1cec273c1cfc03d642c46db43f8cf", + "sha256:07a7142c38aacc85194391108dc91b5b57093c978a9932bd86a36862759d9500", + "sha256:0c5867d40ab716e4684858e4887489685968a47e3ba222e44cde6e4a2154f959", + "sha256:13252b58c1f4d8c5b63ab103c03d909e8e1e7842d302473f482915d95fefd605", + "sha256:13ddbc6ae311175a3b03bd8994881bc4635c923754932918e18da841632349db", + "sha256:14a4c418b1ec86a195f1ca69da8b23e8926c752b685af665ce30777233dfe070", + "sha256:15720084d90d1098ca0229352607cd68256c76991f6b374af96f36920eae13c4", + "sha256:15acb267ea5e2c64515574b06a8bf393fbfee6a50eb1673614aa45f4613c0cca", + "sha256:166f3606f11920f9a1746b2eea84fa2c0a5d50fd313c38bdea4edc072000b0af", + "sha256:1956f934dca32d7bb647ea21d06d93ca40868b505c228556d3373cbd255ce853", + "sha256:1b28302349dc65703a9e4ead16f163b1c339efffbe1049c30a44b001a2a4fff9", + "sha256:1e274728e4a5345a6dde2d343c8da018b9d4bd4350f5a472fa91f66fda44911b", + "sha256:23ba7722d6748b6920ed02a8f1726fb4b33e0fd2f3f621816a8b486c66410ab2", + "sha256:286299b74cc49e25cd42eea19b72aa82c515d2f2ee12d11392c56d8701f52224", + "sha256:28dcecbb4ba402916034fc14eba7709f250c4d24b0c43fc94d187ee0580af181", + "sha256:28ed2a4c05a1f32ef0e1d24c2611330219fed727dae01789f4a335617634b1ca", + "sha256:2e2227db6ba93cb3e2bf67c87e594adde0609f146344e8207e8730364db27041", + "sha256:31c50c40272e189d50006ad5c73883caabb73d4e9748a688b216e85a9a9ca3b9", + "sha256:32bb468e3af278f095d3fa5b90314728a6916d89ba3d0ffb726dd9bf7367285e", + "sha256:371eab43c0a288537d30e1f0b193bc4eca90439fc08a022dd83e5e07500ed026", + "sha256:395bb9a26111b60141757d874d27fdea01b17e8fac958b91c20128ba8f4acc8a", + "sha256:39de429dcaeb6808d75ffe9effefe96a4903c6a4b376b2f6d08d77c1aaee2f18", + "sha256:3aa96f2abba33dc77f79b4cf791840230375f9534e5fac927ccceb58c5e604a5", + "sha256:3bebe0c558e19902c96e99217e0b8e8b17d570906e72ed8a87170bc290b1e978", + "sha256:3c189c4f1779c05f75fc17c0c1267594ed918996a231593a21a5ca5438445216", + "sha256:48a403277ad1ee208fb930bdf91745e4d2d6e47253eedc96e2559d1e6527006d", + "sha256:4c440ea003ad10927a30521a9062ce10b5479592e8a70da27f21eeb457b4a9c5", + "sha256:4d613e4b379a07d7c8453c5712ce7014e86c6ac93d990a0b8e7377e18505e98d", + "sha256:5161e201172de298a8a1baad95eb85db4fb90e902353b1f6a41d64ea64644e25", + "sha256:520ef6d981172693786a49ff5b09eda72a42e539f14788124a07530f785c3ad6", + "sha256:52ce124f13a7a616fad3bb723f2bfb537d78239d1f7f219566dc52b6f2a9e48d", + "sha256:533efbce2cacec78d5ba73a41756beff8431dfa1694b6346ce7af3a12c42202b", + "sha256:554dedfd05937f8fc45d17ebdf298fe7e0c77458232bcb73d9fbbf4c6455f5b3", + "sha256:558cc7e44fd8e507a236bee6a02fa17199ba752874400a0ca6cd6e2196cdb7dc", + "sha256:5bc299da7789deacf95f64052d97f75c16d4fc8c4c214a22bf8d859a4288a1c2", + "sha256:5e9251a5e83fab8d87799d3e1a46cb4b7f2919b895c6f4483629ed2446f66522", + "sha256:5ed975b83a2b8639356151cef5c0d597c68376fc4922b45d0eb384ac058cfa00", + "sha256:5f51e048540dd27f204ff4a87f5d79294ea0aa3aa552aca34934588cf27023cf", + "sha256:62755d1bcea9876770d4df713d82606c8c1a3dca88ff39046b85a048566d56ea", + "sha256:66e989410b6666d3ddb27a74c7e50d0829704ede652fd4c858e91f8d64b403d0", + "sha256:6842184aed5cdb07e0c7e20e5bdcfafe33515ee1741a6835353bb45fe5d1bd95", + "sha256:6c675736059020365cebc845a820214765162728b51ab1e03a1b7b3abb70f74c", + "sha256:6ed5649ceeaeffc28d87fb012d25a4cd356dcd53eff5acff1f0466b831dda2a7", + "sha256:7202ae396446c988cb2a5feb33a543ab2165b786ac97f53b59aafb803fef0744", + "sha256:75f9eb72ecb640619c29bf714e78c9c46c9c4eaafd644bf78577ede459f330d4", + "sha256:7d1bbf3c465de4a24ab12fb7766a0003f6f9bce48b8b6a886158c4d569452dc5", + "sha256:86c5aa6910f9bebcc7bc4f8bc461aff68504388b43bfe5e5c0bd21efa33b52f4", + "sha256:8be921f0cadd245e981b964dfbcd6fd4bc4e254cdc069490416dd7a2632ecc01", + "sha256:901b92f2e2947dc6dfcb52fd624453862e16665ea909a08398dde19c0731b7f4", + "sha256:919d139cdfa8ae8945112398511cb7fca58a77382617d279556b344867a37e61", + "sha256:9ab7fd8738094139b6c1ab1822d6f2000ebe41515c537235fd45dabe13ec9324", + "sha256:9c9c1d5f10e18909e993f9641f12fe1c77b3e9b533ee94ffa970acc14ded3812", + "sha256:a7c7d785ae9dda68c2678532a5a1581347e9c15362ae9f6e68f3fdbfb64f2e49", + "sha256:a9be4d0fa2b79f7222a88aa488bd89e2ae0a0a5b189462a12def6ece2faa45f1", + "sha256:aa8b3e0068c26ddedc7abc6fac37da2d0af16b921e288a5a613f4b86f050354f", + "sha256:ac509f7eccca54b2a29daeb516fb95b6f0bd0d0d8084efaf8ed5dfc7b9f0b357", + "sha256:b2ab0051160cb758a70716448908ef14ad476c3774bd03ddce075f3c1f90a3d6", + "sha256:b532d3af9ef4f6374609a3bcb5e05a1951d3bf6190dc6b176fdb277c9bbf15ee", + "sha256:bd6292a43c0fc09ce7c154ec0fa646a536b877d1e8f2f96c19707f65355b5a4d", + "sha256:c404a99352d839fed80d6afd6c1d66071f3bacaaa5c4268983fc10f769112e90", + "sha256:cafc4628b616dc32530c20ee53d71589816cf385dd9449633e910d596b1f5c8a", + "sha256:cd2fb72b02478f06a900a5782de2ef47e0396b3e1f7d5aba30daeb1fce66f303", + "sha256:ce541693355fc6da424c08b7edf39a2895f58d6ea17d92cc2b168d20907dee12", + "sha256:ceeb52d242b315d7f1f74b441b6a167f78cea801ad7c11c36da77ff2d42e8a28", + "sha256:d0cb9a125d5a3ec971a094a845eadde2db0de85b33c9f13eb94a0c63d463879e", + "sha256:d7bfed2fe1fe0e4dda6ef682cee888ba444b21e7a6553e03252e4feb6cf0adca", + "sha256:da9be20b333970e28b72edc4dff63d4fec3398e05770fb3205f7fb460eb48dd4", + "sha256:db16e4848b7e826edca4ccdd5b145939758dadf0dc06e7007ad0e9cfb5928ae7", + "sha256:dc347c87944983481e138dea467c0551080c86b9d21de6ea9306efb12ca8f606", + "sha256:e0588107ec8e11b6f5ef0e0d656fb2803ac6cf94a96b2b9fc675c0e3ab5e8644", + "sha256:e4f2fb68e5f1cfee30e2b2a09549a00683e0fde4c6a2ab88c94072fc33cb7426", + "sha256:f59e533afed0c5b0ac3eba20d2548c4a550336d8282ee69eb07b37ea526ee4e5", + "sha256:f62cf8ba0618eda841b9bf61797f21c5ebd15a7a1e19daab76e4e4b498d515b2", + "sha256:fa3402a2ff9815960e0372a47b75c76979d74402448509ccd49a275fa983ef8a", + "sha256:fcedb049bdfc555e261d6f65a6abe1d5ad68825b7202ccb9692636c70fcced86", + "sha256:ff76d8887c8c8ee1e772274fcf8cc1071c2c58590d13e33bd12d02dc9a560397" + ], + "markers": "python_version >= '3.9'", + "version": "==0.10.0" + }, + "jmespath": { + "hashes": [ + "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", + "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" + ], + "markers": "python_version >= '3.7'", + "version": "==1.0.1" + }, + "joblib": { + "hashes": [ + "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a", + "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444" + ], + "markers": "python_version >= '3.9'", + "version": "==1.5.1" + }, + "json-repair": { + "hashes": [ + "sha256:3001409a2f319249f13e13d6c622117a5b70ea7e0c6f43864a0233cdffc3a599", + "sha256:e90a489f247e1a8fc86612a5c719872a3dbf9cbaffd6d55f238ec571a77740fa" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.39.1" + }, + "jsonpatch": { + "hashes": [ + "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", + "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "version": "==1.33" + }, + "jsonpointer": { + "hashes": [ + "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942", + "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef" + ], + "markers": "python_version >= '3.7'", + "version": "==3.0.0" + }, + "jsonschema": { + "hashes": [ + "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716", + "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f" + ], + "markers": "python_version >= '3.9'", + "version": "==4.25.0" + }, + "jsonschema-specifications": { + "hashes": [ + "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", + "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608" + ], + "markers": "python_version >= '3.9'", + "version": "==2025.4.1" + }, + "kiwisolver": { + "hashes": [ + "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c", + "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7", + "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21", + "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e", + "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff", + "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7", + "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c", + "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26", + "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa", + "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f", + "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1", + "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891", + "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77", + "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543", + "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d", + "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce", + "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3", + "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60", + "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a", + "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089", + "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab", + "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78", + "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771", + "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f", + "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b", + "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14", + "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32", + "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527", + "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185", + "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634", + "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed", + "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1", + "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c", + "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11", + "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752", + "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5", + "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4", + "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58", + "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5", + "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198", + "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536", + "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134", + "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf", + "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2", + "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2", + "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370", + "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1", + "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154", + "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b", + "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197", + "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386", + "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a", + "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48", + "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748", + "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c", + "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8", + "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5", + "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999", + "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369", + "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122", + "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b", + "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098", + "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9", + "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f", + "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799", + "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028", + "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2", + "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525", + "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d", + "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb", + "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872", + "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64", + "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586", + "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf", + "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552", + "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2", + "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415", + "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c", + "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6", + "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64", + "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d", + "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548", + "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07", + "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61", + "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d", + "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771", + "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9", + "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c", + "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3", + "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16", + "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145", + "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611", + "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2", + "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464", + "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2", + "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04", + "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54", + "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df", + "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f", + "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1", + "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220" + ], + "markers": "python_version >= '3.10'", + "version": "==1.4.9" + }, + "langchain": { + "hashes": [ + "sha256:084f05ee7e80b7c3f378ebadd7309f2a37868ce2906fa0ae64365a67843ade3d", + "sha256:d95004afe8abebb52d51d6026270248da3f4b53d93e9bf699f76005e0c83ad34" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.3.23" + }, + "langchain-anthropic": { + "hashes": [ + "sha256:adbbfaf3ce9798d46fb43d6fc01105630238f375dc6043d35d0aafab61fdbb71", + "sha256:e8012d7986ad1d8412df6914c56f3c0d2797f231766a03bb1ad22cc7023e6e1d" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.3.9" + }, + "langchain-aws": { + "hashes": [ + "sha256:5aa98c90eda244419a27a433739ff4cb22ade749efff3dc8f120d76d420102fb", + "sha256:9407322a0a94cce79e009bdadb64a83219ced87f6149bdc3bbba844768f2f223" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.2.18" + }, + "langchain-community": { + "hashes": [ + "sha256:268ce7b322c0d1961d7bab1a9419d6ff30c99ad09487dca48d47389b69875b16", + "sha256:fc100b6d4d6523566a957cdc306b0500e4982d5b221b98f67432da18ba5b2bf5" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.3.19" + }, + "langchain-core": { + "hashes": [ + "sha256:4bd71e8acd45362aa428953f2a91d8162318014544a2216e4b769463caf68e13", + "sha256:db76b9cc331411602cb40ba0469a161febe7a0663fbcaddbc9056046ac2d22f4" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.3.51" + }, + "langchain-experimental": { + "hashes": [ + "sha256:2e587306aea36b60fa5e5fc05dc7281bee9f60a806f0bf9d30916e0ee096af80", + "sha256:937c4259ee4a639c618d19acf0e2c5c2898ef127050346edc5655259aa281a21" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.3.4" + }, + "langchain-fireworks": { + "hashes": [ + "sha256:340ffe195216d1ab3b333b6ebc6d1b3482341afb40822919d66d7db8ec2ad81b", + "sha256:c80dabaf8e884f8c6741732ca7239fd243e7554fdfeb5c458c0caab89c974e82" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.2.9" + }, + "langchain-google-vertexai": { + "hashes": [ + "sha256:30978dd8942dae5af9a654c5c5b8376db2581d7c84af7086af3d988c9778006f", + "sha256:a578af30edbbc55c9e28e2605a826eb128c7bb9b9cd9e2e453bf8a925328ec43" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==2.0.19" + }, + "langchain-groq": { + "hashes": [ + "sha256:1d1635a8274228654c440a9115a32d51c4d99944f36ac3180a7c27076694036c", + "sha256:7f194c77bffbbaf3cf4f038d46927043e4364cca97f406a939a69be3b34ce595" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.2.5" + }, + "langchain-huggingface": { + "hashes": [ + "sha256:4a66d5c449298fd353bd84c9ed01f9bf4303bf2e4ffce14aab8c55c584eee57c", + "sha256:7de5cfcae32bfb6a99c084fc16176f02583a4f8d94febb6bb45bed5b34699174" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.1.2" + }, + "langchain-neo4j": { + "hashes": [ + "sha256:2760b5757e7a402884cf3419830217651df97fe4f44b3fec6c96b14b6d7fd18e", + "sha256:3f059a66411cec1062a2b8c44953a70d0fff9e123e9fb1d6b3f17a0bef6d6114" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.4.0" + }, + "langchain-openai": { + "hashes": [ + "sha256:0fab64d58ec95e65ffbaf659470cd362e815685e15edbcb171641e90eca4eb86", + "sha256:c9dbff63551f6bd91913bca9f99a2d057fd95dc58d4778657d67e5baa1737f61" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.3.12" + }, + "langchain-text-splitters": { + "hashes": [ + "sha256:116d4b9f2a22dda357d0b79e30acf005c5518177971c66a9f1ab0edfdb0f912e", + "sha256:e75cc0f4ae58dcf07d9f18776400cf8ade27fadd4ff6d264df6278bb302f6f02" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.3.8" + }, + "langdetect": { + "hashes": [ + "sha256:7cbc0746252f19e76f77c0b1690aadf01963be835ef0cd4b56dddf2a8f1dfc2a", + "sha256:cbc1fef89f8d062739774bd51eda3da3274006b3661d199c2655f6b3f6d605a0" + ], + "index": "pypi", + "version": "==1.0.9" + }, + "langserve": { + "hashes": [ + "sha256:17bf7f7d7c182623298748c2eab176c4c0e1872e20f88be89ba89a962c94988d", + "sha256:c860435ebbcc2c051c3e34c349c9d6020921a8af9216ad17700b58dbd01be9a2" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.3.1" + }, + "langsmith": { + "hashes": [ + "sha256:3ae49e49d6f3c980a524d15ac2fd895896e709ecedc83ac150c38e1ead776e1b", + "sha256:3bd5b952a5fc82d69b0e2c030e502ee081a8ccf20468e96fd3d53e1572aef6fc" + ], + "index": "pypi", + "markers": "python_version >= '3.9' and python_version < '4.0'", + "version": "==0.3.26" + }, + "litellm": { + "hashes": [ + "sha256:9b94e250c58fba3c87c6ebb77e33c1cc8aa9110cee99dfdc37b368a11cec57c7", + "sha256:c20e5917fdbe771ba4b6d1862b3d38d6e89cfba53e85bb337013f848256566eb" + ], + "markers": "python_version not in '2.7, 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7' and python_version >= '3.8'", + "version": "==1.71.1" + }, + "loguru": { + "hashes": [ + "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", + "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c" + ], + "markers": "python_version >= '3.5' and python_version < '4.0'", + "version": "==0.7.3" + }, + "lxml": { + "hashes": [ + "sha256:00b8686694423ddae324cf614e1b9659c2edb754de617703c3d29ff568448df5", + "sha256:073eb6dcdf1f587d9b88c8c93528b57eccda40209cf9be549d469b942b41d70b", + "sha256:09846782b1ef650b321484ad429217f5154da4d6e786636c38e434fa32e94e49", + "sha256:0a01ce7d8479dce84fc03324e3b0c9c90b1ece9a9bb6a1b6c9025e7e4520e78c", + "sha256:0be91891bdb06ebe65122aa6bf3fc94489960cf7e03033c6f83a90863b23c58b", + "sha256:0cef4feae82709eed352cd7e97ae062ef6ae9c7b5dbe3663f104cd2c0e8d94ba", + "sha256:0e108352e203c7afd0eb91d782582f00a0b16a948d204d4dec8565024fafeea5", + "sha256:0ea0252b51d296a75f6118ed0d8696888e7403408ad42345d7dfd0d1e93309a7", + "sha256:0fce1294a0497edb034cb416ad3e77ecc89b313cff7adbee5334e4dc0d11f422", + "sha256:1320091caa89805df7dcb9e908add28166113dcd062590668514dbd510798c88", + "sha256:142accb3e4d1edae4b392bd165a9abdee8a3c432a2cca193df995bc3886249c8", + "sha256:14479c2ad1cb08b62bb941ba8e0e05938524ee3c3114644df905d2331c76cd57", + "sha256:151d6c40bc9db11e960619d2bf2ec5829f0aaffb10b41dcf6ad2ce0f3c0b2325", + "sha256:15a665ad90054a3d4f397bc40f73948d48e36e4c09f9bcffc7d90c87410e478a", + "sha256:1a42b3a19346e5601d1b8296ff6ef3d76038058f311902edd574461e9c036982", + "sha256:1af80c6316ae68aded77e91cd9d80648f7dd40406cef73df841aa3c36f6907c8", + "sha256:1b717b00a71b901b4667226bba282dd462c42ccf618ade12f9ba3674e1fabc55", + "sha256:1dc4ca99e89c335a7ed47d38964abcb36c5910790f9bd106f2a8fa2ee0b909d2", + "sha256:20e16c08254b9b6466526bc1828d9370ee6c0d60a4b64836bc3ac2917d1e16df", + "sha256:226046e386556a45ebc787871d6d2467b32c37ce76c2680f5c608e25823ffc84", + "sha256:24974f774f3a78ac12b95e3a20ef0931795ff04dbb16db81a90c37f589819551", + "sha256:24f6df5f24fc3385f622c0c9d63fe34604893bc1a5bdbb2dbf5870f85f9a404a", + "sha256:27a9ded0f0b52098ff89dd4c418325b987feed2ea5cc86e8860b0f844285d740", + "sha256:29f451a4b614a7b5b6c2e043d7b64a15bd8304d7e767055e8ab68387a8cacf4e", + "sha256:2b31a3a77501d86d8ade128abb01082724c0dfd9524f542f2f07d693c9f1175f", + "sha256:2c62891b1ea3094bb12097822b3d44b93fc6c325f2043c4d2736a8ff09e65f60", + "sha256:2dc191e60425ad70e75a68c9fd90ab284df64d9cd410ba8d2b641c0c45bc006e", + "sha256:31e63621e073e04697c1b2d23fcb89991790eef370ec37ce4d5d469f40924ed6", + "sha256:32697d2ea994e0db19c1df9e40275ffe84973e4232b5c274f47e7c1ec9763cdd", + "sha256:3a3178b4873df8ef9457a4875703488eb1622632a9cee6d76464b60e90adbfcd", + "sha256:3b9c2754cef6963f3408ab381ea55f47dabc6f78f4b8ebb0f0b25cf1ac1f7609", + "sha256:3d3c30ba1c9b48c68489dc1829a6eede9873f52edca1dda900066542528d6b20", + "sha256:3e6d5557989cdc3ebb5302bbdc42b439733a841891762ded9514e74f60319ad6", + "sha256:4025bf2884ac4370a3243c5aa8d66d3cb9e15d3ddd0af2d796eccc5f0244390e", + "sha256:4291d3c409a17febf817259cb37bc62cb7eb398bcc95c1356947e2871911ae61", + "sha256:4329422de653cdb2b72afa39b0aa04252fca9071550044904b2e7036d9d97fe4", + "sha256:43d549b876ce64aa18b2328faff70f5877f8c6dede415f80a2f799d31644d776", + "sha256:460508a4b07364d6abf53acaa0a90b6d370fafde5693ef37602566613a9b0779", + "sha256:47fb24cc0f052f0576ea382872b3fc7e1f7e3028e53299ea751839418ade92a6", + "sha256:48b4afaf38bf79109bb060d9016fad014a9a48fb244e11b94f74ae366a64d252", + "sha256:497cab4d8254c2a90bf988f162ace2ddbfdd806fce3bda3f581b9d24c852e03c", + "sha256:4aa412a82e460571fad592d0f93ce9935a20090029ba08eca05c614f99b0cc92", + "sha256:4b7ce10634113651d6f383aa712a194179dcd496bd8c41e191cec2099fa09de5", + "sha256:4cd915c0fb1bed47b5e6d6edd424ac25856252f09120e3e8ba5154b6b921860e", + "sha256:4d885698f5019abe0de3d352caf9466d5de2baded00a06ef3f1216c1a58ae78f", + "sha256:4f5322cf38fe0e21c2d73901abf68e6329dc02a4994e483adbcf92b568a09a54", + "sha256:50441c9de951a153c698b9b99992e806b71c1f36d14b154592580ff4a9d0d877", + "sha256:529024ab3a505fed78fe3cc5ddc079464e709f6c892733e3f5842007cec8ac6e", + "sha256:53370c26500d22b45182f98847243efb518d268374a9570409d2e2276232fd37", + "sha256:53d9469ab5460402c19553b56c3648746774ecd0681b1b27ea74d5d8a3ef5590", + "sha256:56dbdbab0551532bb26c19c914848d7251d73edb507c3079d6805fa8bba5b706", + "sha256:5a99d86351f9c15e4a901fc56404b485b1462039db59288b203f8c629260a142", + "sha256:5cca36a194a4eb4e2ed6be36923d3cffd03dcdf477515dea687185506583d4c9", + "sha256:5f11a1526ebd0dee85e7b1e39e39a0cc0d9d03fb527f56d8457f6df48a10dc0c", + "sha256:61c7bbf432f09ee44b1ccaa24896d21075e533cd01477966a5ff5a71d88b2f56", + "sha256:639978bccb04c42677db43c79bdaa23785dc7f9b83bfd87570da8207872f1ce5", + "sha256:63e7968ff83da2eb6fdda967483a7a023aa497d85ad8f05c3ad9b1f2e8c84987", + "sha256:664cdc733bc87449fe781dbb1f309090966c11cc0c0cd7b84af956a02a8a4729", + "sha256:67ed8a40665b84d161bae3181aa2763beea3747f748bca5874b4af4d75998f87", + "sha256:67f779374c6b9753ae0a0195a892a1c234ce8416e4448fe1e9f34746482070a7", + "sha256:6854f8bd8a1536f8a1d9a3655e6354faa6406621cf857dc27b681b69860645c7", + "sha256:696ea9e87442467819ac22394ca36cb3d01848dad1be6fac3fb612d3bd5a12cf", + "sha256:6ef80aeac414f33c24b3815ecd560cee272786c3adfa5f31316d8b349bfade28", + "sha256:72ac9762a9f8ce74c9eed4a4e74306f2f18613a6b71fa065495a67ac227b3056", + "sha256:75133890e40d229d6c5837b0312abbe5bac1c342452cf0e12523477cd3aa21e7", + "sha256:7605c1c32c3d6e8c990dd28a0970a3cbbf1429d5b92279e37fda05fb0c92190e", + "sha256:773e27b62920199c6197130632c18fb7ead3257fce1ffb7d286912e56ddb79e0", + "sha256:795f61bcaf8770e1b37eec24edf9771b307df3af74d1d6f27d812e15a9ff3872", + "sha256:79d5bfa9c1b455336f52343130b2067164040604e41f6dc4d8313867ed540079", + "sha256:7a62cc23d754bb449d63ff35334acc9f5c02e6dae830d78dab4dd12b78a524f4", + "sha256:7be701c24e7f843e6788353c055d806e8bd8466b52907bafe5d13ec6a6dbaecd", + "sha256:7ca56ebc2c474e8f3d5761debfd9283b8b18c76c4fc0967b74aeafba1f5647f9", + "sha256:7ce1a171ec325192c6a636b64c94418e71a1964f56d002cc28122fceff0b6121", + "sha256:891f7f991a68d20c75cb13c5c9142b2a3f9eb161f1f12a9489c82172d1f133c0", + "sha256:8f82125bc7203c5ae8633a7d5d20bcfdff0ba33e436e4ab0abc026a53a8960b7", + "sha256:91505d3ddebf268bb1588eb0f63821f738d20e1e7f05d3c647a5ca900288760b", + "sha256:942a5d73f739ad7c452bf739a62a0f83e2578afd6b8e5406308731f4ce78b16d", + "sha256:9454b8d8200ec99a224df8854786262b1bd6461f4280064c807303c642c05e76", + "sha256:9459e6892f59ecea2e2584ee1058f5d8f629446eab52ba2305ae13a32a059530", + "sha256:9776af1aad5a4b4a1317242ee2bea51da54b2a7b7b48674be736d463c999f37d", + "sha256:97dac543661e84a284502e0cf8a67b5c711b0ad5fb661d1bd505c02f8cf716d7", + "sha256:98a3912194c079ef37e716ed228ae0dcb960992100461b704aea4e93af6b0bb9", + "sha256:9b4a3bd174cc9cdaa1afbc4620c049038b441d6ba07629d89a83b408e54c35cd", + "sha256:9c886b481aefdf818ad44846145f6eaf373a20d200b5ce1a5c8e1bc2d8745410", + "sha256:9ceaf423b50ecfc23ca00b7f50b64baba85fb3fb91c53e2c9d00bc86150c7e40", + "sha256:a11a96c3b3f7551c8a8109aa65e8594e551d5a84c76bf950da33d0fb6dfafab7", + "sha256:a3bcdde35d82ff385f4ede021df801b5c4a5bcdfb61ea87caabcebfc4945dc1b", + "sha256:a7fb111eef4d05909b82152721a59c1b14d0f365e2be4c742a473c5d7372f4f5", + "sha256:a81e1196f0a5b4167a8dafe3a66aa67c4addac1b22dc47947abd5d5c7a3f24b5", + "sha256:a8c9b7f16b63e65bbba889acb436a1034a82d34fa09752d754f88d708eca80e1", + "sha256:a8ef956fce64c8551221f395ba21d0724fed6b9b6242ca4f2f7beb4ce2f41997", + "sha256:ab339536aa798b1e17750733663d272038bf28069761d5be57cb4a9b0137b4f8", + "sha256:ac7ba71f9561cd7d7b55e1ea5511543c0282e2b6450f122672a2694621d63b7e", + "sha256:aea53d51859b6c64e7c51d522c03cc2c48b9b5d6172126854cc7f01aa11f52bc", + "sha256:aea7c06667b987787c7d1f5e1dfcd70419b711cdb47d6b4bb4ad4b76777a0563", + "sha256:aefe1a7cb852fa61150fcb21a8c8fcea7b58c4cb11fbe59c97a0a4b31cae3c8c", + "sha256:b0989737a3ba6cf2a16efb857fb0dfa20bc5c542737fddb6d893fde48be45433", + "sha256:b108134b9667bcd71236c5a02aad5ddd073e372fb5d48ea74853e009fe38acb6", + "sha256:b12cb6527599808ada9eb2cd6e0e7d3d8f13fe7bbb01c6311255a15ded4c7ab4", + "sha256:b5aff6f3e818e6bdbbb38e5967520f174b18f539c2b9de867b1e7fde6f8d95a4", + "sha256:b67319b4aef1a6c56576ff544b67a2a6fbd7eaee485b241cabf53115e8908b8f", + "sha256:b7c86884ad23d61b025989d99bfdd92a7351de956e01c61307cb87035960bcb1", + "sha256:b92b69441d1bd39f4940f9eadfa417a25862242ca2c396b406f9272ef09cdcaa", + "sha256:bcb7a1096b4b6b24ce1ac24d4942ad98f983cd3810f9711bcd0293f43a9d8b9f", + "sha256:bda3ea44c39eb74e2488297bb39d47186ed01342f0022c8ff407c250ac3f498e", + "sha256:be2ba4c3c5b7900246a8f866580700ef0d538f2ca32535e991027bdaba944063", + "sha256:c5681160758d3f6ac5b4fea370495c48aac0989d6a0f01bb9a72ad8ef5ab75c4", + "sha256:c5d32f5284012deaccd37da1e2cd42f081feaa76981f0eaa474351b68df813c5", + "sha256:c6364038c519dffdbe07e3cf42e6a7f8b90c275d4d1617a69bb59734c1a2d571", + "sha256:c70e93fba207106cb16bf852e421c37bbded92acd5964390aad07cb50d60f5cf", + "sha256:ca755eebf0d9e62d6cb013f1261e510317a41bf4650f22963474a663fdfe02aa", + "sha256:cccd007d5c95279e529c146d095f1d39ac05139de26c098166c4beb9374b0f4d", + "sha256:ce31158630a6ac85bddd6b830cffd46085ff90498b397bd0a259f59d27a12188", + "sha256:ce9c671845de9699904b1e9df95acfe8dfc183f2310f163cdaa91a3535af95de", + "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd", + "sha256:d2ed1b3cb9ff1c10e6e8b00941bb2e5bb568b307bfc6b17dffbbe8be5eecba86", + "sha256:d5663bc1b471c79f5c833cffbc9b87d7bf13f87e055a5c86c363ccd2348d7e82", + "sha256:d90b729fd2732df28130c064aac9bb8aff14ba20baa4aee7bd0795ff1187545f", + "sha256:dc0af80267edc68adf85f2a5d9be1cdf062f973db6790c1d065e45025fa26140", + "sha256:de5b4e1088523e2b6f730d0509a9a813355b7f5659d70eb4f319c76beea2e250", + "sha256:de6f6bb8a7840c7bf216fb83eec4e2f79f7325eca8858167b68708b929ab2172", + "sha256:df53330a3bff250f10472ce96a9af28628ff1f4efc51ccba351a8820bca2a8ba", + "sha256:e094ec83694b59d263802ed03a8384594fcce477ce484b0cbcd0008a211ca751", + "sha256:e794f698ae4c5084414efea0f5cc9f4ac562ec02d66e1484ff822ef97c2cadff", + "sha256:e7bc6df34d42322c5289e37e9971d6ed114e3776b45fa879f734bded9d1fea9c", + "sha256:eaf24066ad0b30917186420d51e2e3edf4b0e2ea68d8cd885b14dc8afdcf6556", + "sha256:ecf4c4b83f1ab3d5a7ace10bafcb6f11df6156857a3c418244cef41ca9fa3e44", + "sha256:ef5a7178fcc73b7d8c07229e89f8eb45b2908a9238eb90dcfc46571ccf0383b8", + "sha256:f5cb182f6396706dc6cc1896dd02b1c889d644c081b0cdec38747573db88a7d7", + "sha256:fa0e294046de09acd6146be0ed6727d1f42ded4ce3ea1e9a19c11b6774eea27c", + "sha256:fb54f7c6bafaa808f27166569b1511fc42701a7713858dddc08afdde9746849e", + "sha256:fd3be6481ef54b8cfd0e1e953323b7aa9d9789b94842d0e5b142ef4bb7999539" + ], + "markers": "python_version >= '3.6'", + "version": "==5.4.0" + }, + "markdown": { + "hashes": [ + "sha256:247b9a70dd12e27f67431ce62523e675b866d254f900c4fe75ce3dda62237c45", + "sha256:5c83764dbd4e00bdd94d85a19b8d55ccca20fe35b2e678a1422b380324dd5f24" + ], + "version": "==3.8.2" + }, + "markdown-it-py": { + "hashes": [ + "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", + "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3" + ], + "markers": "python_version >= '3.10'", + "version": "==4.0.0" + }, + "markupsafe": { + "hashes": [ + "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", + "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", + "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", + "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", + "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", + "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", + "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", + "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", + "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", + "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", + "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", + "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", + "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", + "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", + "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", + "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", + "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", + "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", + "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", + "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", + "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", + "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", + "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", + "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", + "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", + "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", + "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", + "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", + "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", + "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", + "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", + "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", + "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", + "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", + "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", + "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", + "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", + "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", + "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", + "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", + "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", + "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", + "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", + "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", + "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", + "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", + "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", + "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", + "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", + "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", + "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", + "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", + "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", + "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", + "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", + "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", + "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", + "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", + "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", + "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", + "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" + ], + "markers": "python_version >= '3.9'", + "version": "==3.0.2" + }, + "marshmallow": { + "hashes": [ + "sha256:3350409f20a70a7e4e11a27661187b77cdcaeb20abca41c1454fe33636bea09c", + "sha256:e6d8affb6cb61d39d26402096dc0aee12d5a26d490a121f118d2e81dc0719dc6" + ], + "markers": "python_version >= '3.9'", + "version": "==3.26.1" + }, + "matplotlib": { + "hashes": [ + "sha256:00b6feadc28a08bd3c65b2894f56cf3c94fc8f7adcbc6ab4516ae1e8ed8f62e2", + "sha256:07442d2692c9bd1cceaa4afb4bbe5b57b98a7599de4dabfcca92d3eea70f9ebe", + "sha256:080c3676a56b8ee1c762bcf8fca3fe709daa1ee23e6ef06ad9f3fc17332f2d2a", + "sha256:160e125da27a749481eaddc0627962990f6029811dbeae23881833a011a0907f", + "sha256:1f5f3ec4c191253c5f2b7c07096a142c6a1c024d9f738247bfc8e3f9643fc975", + "sha256:1fc0d2a3241cdcb9daaca279204a3351ce9df3c0e7e621c7e04ec28aaacaca30", + "sha256:1ff10ea43288f0c8bab608a305dc6c918cc729d429c31dcbbecde3b9f4d5b569", + "sha256:21a95b9bf408178d372814de7baacd61c712a62cae560b5e6f35d791776f6516", + "sha256:27f52634315e96b1debbfdc5c416592edcd9c4221bc2f520fd39c33db5d9f202", + "sha256:2efaf97d72629e74252e0b5e3c46813e9eeaa94e011ecf8084a971a31a97f40b", + "sha256:33775bbeb75528555a15ac29396940128ef5613cf9a2d31fb1bfd18b3c0c0903", + "sha256:352ed6ccfb7998a00881692f38b4ca083c691d3e275b4145423704c34c909076", + "sha256:354204db3f7d5caaa10e5de74549ef6a05a4550fdd1c8f831ab9bca81efd39ed", + "sha256:3967424121d3a46705c9fa9bdb0931de3228f13f73d7bb03c999c88343a89d89", + "sha256:3b80eb8621331449fc519541a7461987f10afa4f9cfd91afcd2276ebe19bd56c", + "sha256:47a388908e469d6ca2a6015858fa924e0e8a2345a37125948d8e93a91c47933e", + "sha256:48fe6d47380b68a37ccfcc94f009530e84d41f71f5dae7eda7c4a5a84aa0a674", + "sha256:4b4984d5064a35b6f66d2c11d668565f4389b1119cc64db7a4c1725bc11adffc", + "sha256:4fa40a8f98428f789a9dcacd625f59b7bc4e3ef6c8c7c80187a7a709475cf592", + "sha256:525f6e28c485c769d1f07935b660c864de41c37fd716bfa64158ea646f7084bb", + "sha256:52c6573dfcb7726a9907b482cd5b92e6b5499b284ffacb04ffbfe06b3e568124", + "sha256:56da3b102cf6da2776fef3e71cd96fcf22103a13594a18ac9a9b31314e0be154", + "sha256:5d4773a6d1c106ca05cb5a5515d277a6bb96ed09e5c8fab6b7741b8fcaa62c8f", + "sha256:64c4535419d5617f7363dad171a5a59963308e0f3f813c4bed6c9e6e2c131512", + "sha256:6c49465bf689c4d59d174d0c7795fb42a21d4244d11d70e52b8011987367ac61", + "sha256:707f9c292c4cd4716f19ab8a1f93f26598222cd931e0cd98fbbb1c5994bf7667", + "sha256:77fab633e94b9da60512d4fa0213daeb76d5a7b05156840c4fd0399b4b818837", + "sha256:7e44cada61bec8833c106547786814dd4a266c1b2964fd25daa3804f1b8d4467", + "sha256:8a8da0453a7fd8e3da114234ba70c5ba9ef0e98f190309ddfde0f089accd46ea", + "sha256:8b6b49167d208358983ce26e43aa4196073b4702858670f2eb111f9a10652b4b", + "sha256:8dee65cb1424b7dc982fe87895b5613d4e691cc57117e8af840da0148ca6c1d7", + "sha256:903352681b59f3efbf4546985142a9686ea1d616bb054b09a537a06e4b892ccf", + "sha256:94986a242747a0605cb3ff1cb98691c736f28a59f8ffe5175acaeb7397c49a5a", + "sha256:95672a5d628b44207aab91ec20bf59c26da99de12b88f7e0b1fb0a84a86ff959", + "sha256:96ef8f5a3696f20f55597ffa91c28e2e73088df25c555f8d4754931515512715", + "sha256:97b9d6443419085950ee4a5b1ee08c363e5c43d7176e55513479e53669e88468", + "sha256:a17e57e33de901d221a07af32c08870ed4528db0b6059dce7d7e65c1122d4bea", + "sha256:a23193db2e9d64ece69cac0c8231849db7dd77ce59c7b89948cf9d0ce655a3ce", + "sha256:a277033048ab22d34f88a3c5243938cef776493f6201a8742ed5f8b553201343", + "sha256:a41bcb6e2c8e79dc99c5511ae6f7787d2fb52efd3d805fff06d5d4f667db16b2", + "sha256:a6b310f95e1102a8c7c817ef17b60ee5d1851b8c71b63d9286b66b177963039e", + "sha256:ac3d50760394d78a3c9be6b28318fe22b494c4fcf6407e8fd4794b538251899b", + "sha256:b072aac0c3ad563a2b3318124756cb6112157017f7431626600ecbe890df57a1", + "sha256:b5fa2e941f77eb579005fb804026f9d0a1082276118d01cc6051d0d9626eaa7f", + "sha256:ba6c3c9c067b83481d647af88b4e441d532acdb5ef22178a14935b0b881188f4", + "sha256:c04cba0f93d40e45b3c187c6c52c17f24535b27d545f757a2fffebc06c12b98b", + "sha256:c61333a8e5e6240e73769d5826b9a31d8b22df76c0778f8480baf1b4b01c9420", + "sha256:ceefe5d40807d29a66ae916c6a3915d60ef9f028ce1927b84e727be91d884369", + "sha256:d52fd5b684d541b5a51fb276b2b97b010c75bee9aa392f96b4a07aeb491e33c7", + "sha256:dc88af74e7ba27de6cbe6faee916024ea35d895ed3d61ef6f58c4ce97da7185a", + "sha256:dcfc39c452c6a9f9028d3e44d2d721484f665304857188124b505b2c95e1eecf", + "sha256:e4a6470a118a2e93022ecc7d3bd16b3114b2004ea2bf014fff875b3bc99b70c6", + "sha256:ee7a09ae2f4676276f5a65bd9f2bd91b4f9fbaedf49f40267ce3f9b448de501f", + "sha256:ee98a5c5344dc7f48dc261b6ba5d9900c008fc12beb3fa6ebda81273602cc389", + "sha256:f6adb644c9d040ffb0d3434e440490a66cf73dbfa118a6f79cd7568431f7a012" + ], + "markers": "python_version >= '3.10'", + "version": "==3.10.5" + }, + "mdurl": { + "hashes": [ + "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" + ], + "markers": "python_version >= '3.7'", + "version": "==0.1.2" + }, + "mmh3": { + "hashes": [ + "sha256:03e08c6ebaf666ec1e3d6ea657a2d363bb01effd1a9acfe41f9197decaef0051", + "sha256:097e13c8b8a66c5753c6968b7640faefe85d8e38992703c1f666eda6ef4c3762", + "sha256:0b898cecff57442724a0f52bf42c2de42de63083a91008fb452887e372f9c328", + "sha256:10983c10f5c77683bd845751905ba535ec47409874acc759d5ce3ff7ef34398a", + "sha256:11730eeb16dfcf9674fdea9bb6b8e6dd9b40813b7eb839bc35113649eef38aeb", + "sha256:127c95336f2a98c51e7682341ab7cb0be3adb9df0819ab8505a726ed1801876d", + "sha256:12da42c0a55c9d86ab566395324213c319c73ecb0c239fad4726324212b9441c", + "sha256:132dd943451a7c7546978863d2f5a64977928410782e1a87d583cb60eb89e667", + "sha256:1556e31e4bd0ac0c17eaf220be17a09c171d7396919c3794274cb3415a9d3646", + "sha256:1a5f4d2e59d6bba8ef01b013c472741835ad961e7c28f50c82b27c57748744a4", + "sha256:1ba55d6ca32eeef8b2625e1e4bfc3b3db52bc63014bd7e5df8cc11bf2b036b12", + "sha256:1efc8fec8478e9243a78bb993422cf79f8ff85cb4cf6b79647480a31e0d950a8", + "sha256:1f8d8b627799f4e2fcc7c034fed8f5f24dc7724ff52f69838a3d6d15f1ad4765", + "sha256:1fae471339ae1b9c641f19cf46dfe6ffd7f64b1fba7c4333b99fa3dd7f21ae0a", + "sha256:1fdb36b940e9261aff0b5177c5b74a36936b902f473180f6c15bde26143681a9", + "sha256:2421b9d665a0b1ad724ec7332fb5a98d075f50bc51a6ff854f3a1882bd650d49", + "sha256:29c2b9ce61886809d0492a274a5a53047742dea0f703f9c4d5d223c3ea6377d3", + "sha256:2c9da0d568569cc87315cb063486d761e38458b8ad513fedd3dc9263e1b81bcd", + "sha256:2ebfc46b39168ab1cd44670a32ea5489bcbc74a25795c61b6d888c5c2cf654ed", + "sha256:3193752fc05ea72366c2b63ff24b9a190f422e32d75fdeae71087c08fff26115", + "sha256:33576136c06b46a7046b6d83a3d75fbca7d25f84cec743f1ae156362608dc6d2", + "sha256:37a358cc881fe796e099c1db6ce07ff757f088827b4e8467ac52b7a7ffdca647", + "sha256:382a6bb3f8c6532ea084e7acc5be6ae0c6effa529240836d59352398f002e3fc", + "sha256:384eda9361a7bf83a85e09447e1feafe081034af9dd428893701b959230d84be", + "sha256:38d899a156549da8ef6a9f1d6f7ef231228d29f8f69bce2ee12f5fba6d6fd7c5", + "sha256:3bc244802ccab5220008cb712ca1508cb6a12f0eb64ad62997156410579a1770", + "sha256:3c6041fd9d5fb5fcac57d5c80f521a36b74aea06b8566431c63e4ffc49aced51", + "sha256:3ca975c51c5028947bbcfc24966517aac06a01d6c921e30f7c5383c195f87991", + "sha256:3d6bfd9662a20c054bc216f861fa330c2dac7c81e7fb8307b5e32ab5b9b4d2e0", + "sha256:419005f84ba1cab47a77465a2a843562dadadd6671b8758bf179d82a15ca63eb", + "sha256:45b590e31bc552c6f8e2150ff1ad0c28dd151e9f87589e7eaf508fbdd8e8e908", + "sha256:49037d417419863b222ae47ee562b2de9c3416add0a45c8d7f4e864be8dc4f89", + "sha256:4a5f5536b1cbfa72318ab3bfc8a8188b949260baed186b75f0abc75b95d8c051", + "sha256:582f9dbeefe15c32a5fa528b79b088b599a1dfe290a4436351c6090f90ddebb8", + "sha256:58477cf9ef16664d1ce2b038f87d2dc96d70fe50733a34a7f07da6c9a5e3538c", + "sha256:58981d6ea9646dbbf9e59a30890cbf9f610df0e4a57dbfe09215116fd90b0093", + "sha256:5a5dba98e514fb26241868f6eb90a7f7ca0e039aed779342965ce24ea32ba513", + "sha256:5b0b58215befe0f0e120b828f7645e97719bbba9f23b69e268ed0ac7adde8645", + "sha256:61ac226af521a572700f863d6ecddc6ece97220ce7174e311948ff8c8919a363", + "sha256:63830f846797187c5d3e2dae50f0848fdc86032f5bfdc58ae352f02f857e9025", + "sha256:69fc339d7202bea69ef9bd7c39bfdf9fdabc8e6822a01eba62fb43233c1b3932", + "sha256:6d541038b3fc360ec538fc116de87462627944765a6750308118f8b509a8eec7", + "sha256:6ecb4e750d712abde046858ee6992b65c93f1f71b397fce7975c3860c07365d2", + "sha256:72d80005b7634a3a2220f81fbeb94775ebd12794623bb2e1451701ea732b4aa3", + "sha256:7303aab41e97adcf010a09efd8f1403e719e59b7705d5e3cfed3dd7571589290", + "sha256:7434a27754049144539d2099a6d2da5d88b8bdeedf935180bf42ad59b3607aa3", + "sha256:746a5ee71c6d1103d9b560fa147881b5e68fd35da56e54e03d5acefad0e7c055", + "sha256:7733ec52296fc1ba22e9b90a245c821adbb943e98c91d8a330a2254612726106", + "sha256:7901c893e704ee3c65f92d39b951f8f34ccf8e8566768c58103fb10e55afb8c1", + "sha256:7aa18cdb58983ee660c9c400b46272e14fa253c675ed963d3812487f8ca42037", + "sha256:7b986d506a8e8ea345791897ba5d8ba0d9d8820cd4fc3e52dbe6de19388de2e7", + "sha256:7bbb0df897944b5ec830f3ad883e32c5a7375370a521565f5fe24443bfb2c4f7", + "sha256:7c7f0b342fd06044bedd0b6e72177ddc0076f54fd89ee239447f8b271d919d9b", + "sha256:7e5634565367b6d98dc4aa2983703526ef556b3688ba3065edb4b9b90ede1c54", + "sha256:7fddccd4113e7b736706e17a239a696332360cbaddf25ae75b57ba1acce65081", + "sha256:81c504ad11c588c8629536b032940f2a359dda3b6cbfd4ad8f74cb24dcd1b0bc", + "sha256:81df0dae22cd0da87f1c978602750f33d17fb3d21fb0f326c89dc89834fea79b", + "sha256:86d1be5d63232e6eb93c50881aea55ff06eb86d8e08f9b5417c8c9b10db9db96", + "sha256:8b0c53fe0994beade1ad7c0f13bd6fec980a0664bfbe5a6a7d64500b9ab76772", + "sha256:8ebf241072cf2777a492d0e09252f8cc2b3edd07dfdb9404b9757bffeb4f2cee", + "sha256:931d47e08c9c8a67bf75d82f0ada8399eac18b03388818b62bfa42882d571d72", + "sha256:932a6eec1d2e2c3c9e630d10f7128d80e70e2d47fe6b8c7ea5e1afbd98733e65", + "sha256:941603bfd75a46023807511c1ac2f1b0f39cccc393c15039969806063b27e6db", + "sha256:956127e663d05edbeec54df38885d943dfa27406594c411139690485128525de", + "sha256:96f1e1ac44cbb42bcc406e509f70c9af42c594e72ccc7b1257f97554204445f0", + "sha256:99bb6a4d809aa4e528ddfe2c85dd5239b78b9dd14be62cca0329db78505e7b50", + "sha256:9f64bf06f4bf623325fda3a6d02d36cd69199b9ace99b04bb2d7fd9f89688504", + "sha256:a094319ec0db52a04af9fdc391b4d39a1bc72bc8424b47c4411afb05413a44b5", + "sha256:a367d4741ac0103f8198c82f429bccb9359f543ca542b06a51f4f0332e8de279", + "sha256:a7c0c7845566b9686480e6a7e9044db4afb60038d5fabd19227443f0104eeee4", + "sha256:aa6e5d31fdc5ed9e3e95f9873508615a778fe9b523d52c17fc770a3eb39ab6e4", + "sha256:ae9d032488fcec32d22be6542d1a836f00247f40f320844dbb361393b5b22773", + "sha256:b0271ac12415afd3171ab9a3c7cbfc71dee2c68760a7dc9d05bf8ed6ddfa3a7a", + "sha256:b0d753ad566c721faa33db7e2e0eddd74b224cdd3eaf8481d76c926603c7a00e", + "sha256:b29044e1ffdb84fe164d0a7ea05c7316afea93c00f8ed9449cf357c36fc4f814", + "sha256:b5995088dd7023d2d9f310a0c67de5a2b2e06a570ecfd00f9ff4ab94a67cde43", + "sha256:b5f317a727bba0e633a12e71228bc6a4acb4f471a98b1c003163b917311ea9a9", + "sha256:b9a87025121d1c448f24f27ff53a5fe7b6ef980574b4a4f11acaabe702420d63", + "sha256:bb0fdc451fb6d86d81ab8f23d881b8d6e37fc373a2deae1c02d27002d2ad7a05", + "sha256:bb4fe46bdc6104fbc28db7a6bacb115ee6368ff993366bbd8a2a7f0076e6f0c0", + "sha256:bc44fc2b886243d7c0d8daeb37864e16f232e5b56aaec27cc781d848264cfd28", + "sha256:bdde97310d59604f2a9119322f61b31546748499a21b44f6715e8ced9308a6c5", + "sha256:be1374df449465c9f2500e62eee73a39db62152a8bdfbe12ec5b5c1cd451344d", + "sha256:be7d3dca9358e01dab1bad881fb2b4e8730cec58d36dd44482bc068bfcd3bc65", + "sha256:bf7bee43e17e81671c447e9c83499f53d99bf440bc6d9dc26a841e21acfbe094", + "sha256:c3dca4cb5b946ee91b3d6bb700d137b1cd85c20827f89fdf9c16258253489044", + "sha256:c3f563e8901960e2eaa64c8e8821895818acabeb41c96f2efbb936f65dbe486c", + "sha256:c463d7c1c4cfc9d751efeaadd936bbba07b5b0ed81a012b3a9f5a12f0872bd6e", + "sha256:c4a2f3d83879e3de2eb8cbf562e71563a8ed15ee9b9c2e77ca5d9f73072ac15c", + "sha256:c5584061fd3da584659b13587f26c6cad25a096246a481636d64375d0c1f6c07", + "sha256:c677d78887244bf3095020b73c42b505b700f801c690f8eaa90ad12d3179612f", + "sha256:c903e71fd8debb35ad2a4184c1316b3cb22f64ce517b4e6747f25b0a34e41266", + "sha256:c9ff37ba9f15637e424c2ab57a1a590c52897c845b768e4e0a4958084ec87f22", + "sha256:cadc16e8ea64b5d9a47363013e2bea469e121e6e7cb416a7593aeb24f2ad122e", + "sha256:cedac4f4054b8f7859e5aed41aaa31ad03fce6851901a7fdc2af0275ac533c10", + "sha256:d22c9dcafed659fadc605538946c041722b6d1104fe619dbf5cc73b3c8a0ded8", + "sha256:d765058da196f68dc721116cab335e696e87e76720e6ef8ee5a24801af65e63d", + "sha256:d86651fa45799530885ba4dab3d21144486ed15285e8784181a0ab37a4552384", + "sha256:dd966df3489ec13848d6c6303429bbace94a153f43d1ae2a55115fd36fd5ca5d", + "sha256:ddc63328889bcaee77b743309e5c7d2d52cee0d7d577837c91b6e7cc9e755e0b", + "sha256:dfbead5575f6470c17e955b94f92d62a03dfc3d07f2e6f817d9b93dc211a1515", + "sha256:e0f3ed828d709f5b82d8bfe14f8856120718ec4bd44a5b26102c3030a1e12501", + "sha256:e1861fb6b1d0453ed7293200139c0a9011eeb1376632e048e3766945b13313c5", + "sha256:e5015f0bb6eb50008bed2d4b1ce0f2a294698a926111e4bb202c0987b4f89078", + "sha256:e651e17bfde5840e9e4174b01e9e080ce49277b70d424308b36a7969d0d1af73", + "sha256:e7884931fe5e788163e7b3c511614130c2c59feffdc21112290a194487efb2e9", + "sha256:e79c00eba78f7258e5b354eccd4d7907d60317ced924ea4a5f2e9d83f5453065", + "sha256:e912b19cf2378f2967d0c08e86ff4c6c360129887f678e27e4dde970d21b3f4d", + "sha256:e9a011469b47b752e7d20de296bb34591cdfcbe76c99c2e863ceaa2aa61113d2", + "sha256:eb756caf8975882630ce4e9fbbeb9d3401242a72528230422c9ab3a0d278e60c", + "sha256:eba01ec3bd4a49b9ac5ca2bc6a73ff5f3af53374b8556fcc2966dd2af9eb7779", + "sha256:ecbfc0437ddfdced5e7822d1ce4855c9c64f46819d0fdc4482c53f56c707b935", + "sha256:eed4bba7ff8a0d37106ba931ab03bdd3915fbb025bcf4e1f0aa02bc8114960c5", + "sha256:f35727c5118aba95f0397e18a1a5b8405425581bfe53e821f0fb444cbdc2bc9b", + "sha256:f698733a8a494466432d611a8f0d1e026f5286dee051beea4b3c3146817e35d5", + "sha256:f7f9034c7cf05ddfaac8d7a2e63a3c97a840d4615d0a0e65ba8bdf6f8576e3be", + "sha256:fa0c966ee727aad5406d516375593c5f058c766b21236ab8985693934bb5085b", + "sha256:fc9c5f280438cf1c1a8f9abb87dc8ce9630a964120cfb5dd50d1e7ce79690c7a", + "sha256:fd6e6c3d90660d085f7e73710eab6f5545d4854b81b0135a3526e797009dbda3", + "sha256:fdfd3fb739f4e22746e13ad7ba0c6eedf5f454b18d11249724a388868e308ee4", + "sha256:ff3d50dc3fe8a98059f99b445dfb62792b5d006c5e0b8f03c6de2813b8376110" + ], + "markers": "python_version >= '3.9'", + "version": "==5.2.0" + }, + "mpmath": { + "hashes": [ + "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", + "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" + ], + "version": "==1.3.0" + }, + "multidict": { + "hashes": [ + "sha256:01368e3c94032ba6ca0b78e7ccb099643466cf24f8dc8eefcfdc0571d56e58f9", + "sha256:01d0959807a451fe9fdd4da3e139cb5b77f7328baf2140feeaf233e1d777b729", + "sha256:024ce601f92d780ca1617ad4be5ac15b501cc2414970ffa2bb2bbc2bd5a68fa5", + "sha256:047d9425860a8c9544fed1b9584f0c8bcd31bcde9568b047c5e567a1025ecd6e", + "sha256:0a2088c126b6f72db6c9212ad827d0ba088c01d951cee25e758c450da732c138", + "sha256:0af5f9dee472371e36d6ae38bde009bd8ce65ac7335f55dcc240379d7bed1495", + "sha256:0b2e886624be5773e69cf32bcb8534aecdeb38943520b240fed3d5596a430f2f", + "sha256:0c5cbac6b55ad69cb6aa17ee9343dfbba903118fd530348c330211dc7aa756d1", + "sha256:0e0558693063c75f3d952abf645c78f3c5dfdd825a41d8c4d8156fc0b0da6e7e", + "sha256:0f37bed7319b848097085d7d48116f545985db988e2256b2e6f00563a3416ee6", + "sha256:0ffb87be160942d56d7b87b0fdf098e81ed565add09eaa1294268c7f3caac4c8", + "sha256:105245cc6b76f51e408451a844a54e6823bbd5a490ebfe5bdfc79798511ceded", + "sha256:10a68a9191f284fe9d501fef4efe93226e74df92ce7a24e301371293bd4918ae", + "sha256:14616a30fe6d0a48d0a48d1a633ab3b8bec4cf293aac65f32ed116f620adfd69", + "sha256:14754eb72feaa1e8ae528468f24250dd997b8e2188c3d2f593f9eba259e4b364", + "sha256:163c7ea522ea9365a8a57832dea7618e6cbdc3cd75f8c627663587459a4e328f", + "sha256:17d2cbbfa6ff20821396b25890f155f40c986f9cfbce5667759696d83504954f", + "sha256:190766dac95aab54cae5b152a56520fd99298f32a1266d66d27fdd1b5ac00f4e", + "sha256:1a0ccbfe93ca114c5d65a2471d52d8829e56d467c97b0e341cf5ee45410033b3", + "sha256:21f216669109e02ef3e2415ede07f4f8987f00de8cdfa0cc0b3440d42534f9f0", + "sha256:22e38b2bc176c5eb9c0a0e379f9d188ae4cd8b28c0f53b52bce7ab0a9e534657", + "sha256:27d8f8e125c07cb954e54d75d04905a9bba8a439c1d84aca94949d4d03d8601c", + "sha256:2a4c6875c37aae9794308ec43e3530e4aa0d36579ce38d89979bbf89582002bb", + "sha256:34d8f2a5ffdceab9dcd97c7a016deb2308531d5f0fced2bb0c9e1df45b3363d7", + "sha256:350f6b0fe1ced61e778037fdc7613f4051c8baf64b1ee19371b42a3acdb016a0", + "sha256:37b7187197da6af3ee0b044dbc9625afd0c885f2800815b228a0e70f9a7f473d", + "sha256:38a0956dd92d918ad5feff3db8fcb4a5eb7dba114da917e1a88475619781b57b", + "sha256:3ba5aaf600edaf2a868a391779f7a85d93bed147854925f34edd24cc70a3e141", + "sha256:3bb0eae408fa1996d87247ca0d6a57b7fc1dcf83e8a5c47ab82c558c250d4adf", + "sha256:3f8e2384cb83ebd23fd07e9eada8ba64afc4c759cd94817433ab8c81ee4b403f", + "sha256:40cd05eaeb39e2bc8939451f033e57feaa2ac99e07dbca8afe2be450a4a3b6cf", + "sha256:43868297a5759a845fa3a483fb4392973a95fb1de891605a3728130c52b8f40f", + "sha256:452ff5da78d4720d7516a3a2abd804957532dd69296cb77319c193e3ffb87e24", + "sha256:467fe64138cfac771f0e949b938c2e1ada2b5af22f39692aa9258715e9ea613a", + "sha256:49517449b58d043023720aa58e62b2f74ce9b28f740a0b5d33971149553d72aa", + "sha256:497a2954adc25c08daff36f795077f63ad33e13f19bfff7736e72c785391534f", + "sha256:4a1fb393a2c9d202cb766c76208bd7945bc194eba8ac920ce98c6e458f0b524b", + "sha256:4bb7627fd7a968f41905a4d6343b0d63244a0623f006e9ed989fa2b78f4438a0", + "sha256:4d09384e75788861e046330308e7af54dd306aaf20eb760eb1d0de26b2bea2cb", + "sha256:4fefd4a815e362d4f011919d97d7b4a1e566f1dde83dc4ad8cfb5b41de1df68d", + "sha256:52e3c8d43cdfff587ceedce9deb25e6ae77daba560b626e97a56ddcad3756879", + "sha256:55624b3f321d84c403cb7d8e6e982f41ae233d85f85db54ba6286f7295dc8a9c", + "sha256:56c6b3652f945c9bc3ac6c8178cd93132b8d82dd581fcbc3a00676c51302bc1a", + "sha256:580b643b7fd2c295d83cad90d78419081f53fd532d1f1eb67ceb7060f61cff0d", + "sha256:59e8d40ab1f5a8597abcef00d04845155a5693b5da00d2c93dbe88f2050f2812", + "sha256:5df8afd26f162da59e218ac0eefaa01b01b2e6cd606cffa46608f699539246da", + "sha256:630f70c32b8066ddfd920350bc236225814ad94dfa493fe1910ee17fe4365cbb", + "sha256:66247d72ed62d5dd29752ffc1d3b88f135c6a8de8b5f63b7c14e973ef5bda19e", + "sha256:6865f6d3b7900ae020b495d599fcf3765653bc927951c1abb959017f81ae8287", + "sha256:6bf2f10f70acc7a2446965ffbc726e5fc0b272c97a90b485857e5c70022213eb", + "sha256:6c84378acd4f37d1b507dfa0d459b449e2321b3ba5f2338f9b085cf7a7ba95eb", + "sha256:6d46a180acdf6e87cc41dc15d8f5c2986e1e8739dc25dbb7dac826731ef381a4", + "sha256:756989334015e3335d087a27331659820d53ba432befdef6a718398b0a8493ad", + "sha256:75aa52fba2d96bf972e85451b99d8e19cc37ce26fd016f6d4aa60da9ab2b005f", + "sha256:7dd57515bebffd8ebd714d101d4c434063322e4fe24042e90ced41f18b6d3395", + "sha256:7f683a551e92bdb7fac545b9c6f9fa2aebdeefa61d607510b3533286fcab67f5", + "sha256:87a32d20759dc52a9e850fe1061b6e41ab28e2998d44168a8a341b99ded1dba0", + "sha256:8c2fcb12136530ed19572bbba61b407f655e3953ba669b96a35036a11a485793", + "sha256:8c91cdb30809a96d9ecf442ec9bc45e8cfaa0f7f8bdf534e082c2443a196727e", + "sha256:8c9854df0eaa610a23494c32a6f44a3a550fb398b6b51a56e8c6b9b3689578db", + "sha256:8e42332cf8276bb7645d310cdecca93a16920256a5b01bebf747365f86a1675b", + "sha256:8fe323540c255db0bffee79ad7f048c909f2ab0edb87a597e1c17da6a54e493c", + "sha256:967af5f238ebc2eb1da4e77af5492219fbd9b4b812347da39a7b5f5c72c0fa45", + "sha256:9a950b7cf54099c1209f455ac5970b1ea81410f2af60ed9eb3c3f14f0bfcf987", + "sha256:a1b20a9d56b2d81e2ff52ecc0670d583eaabaa55f402e8d16dd062373dbbe796", + "sha256:a506a77ddee1efcca81ecbeae27ade3e09cdf21a8ae854d766c2bb4f14053f92", + "sha256:a59c63061f1a07b861c004e53869eb1211ffd1a4acbca330e3322efa6dd02978", + "sha256:a650629970fa21ac1fb06ba25dabfc5b8a2054fcbf6ae97c758aa956b8dba802", + "sha256:a693fc5ed9bdd1c9e898013e0da4dcc640de7963a371c0bd458e50e046bf6438", + "sha256:aaea28ba20a9026dfa77f4b80369e51cb767c61e33a2d4043399c67bd95fb7c6", + "sha256:ad8850921d3a8d8ff6fbef790e773cecfc260bbfa0566998980d3fa8f520bc4a", + "sha256:ad887a8250eb47d3ab083d2f98db7f48098d13d42eb7a3b67d8a5c795f224ace", + "sha256:ae9408439537c5afdca05edd128a63f56a62680f4b3c234301055d7a2000220f", + "sha256:af7618b591bae552b40dbb6f93f5518328a949dac626ee75927bba1ecdeea9f4", + "sha256:b6819f83aef06f560cb15482d619d0e623ce9bf155115150a85ab11b8342a665", + "sha256:b8aa6f0bd8125ddd04a6593437bad6a7e70f300ff4180a531654aa2ab3f6d58f", + "sha256:b8eb3025f17b0a4c3cd08cda49acf312a19ad6e8a4edd9dbd591e6506d999402", + "sha256:b95494daf857602eccf4c18ca33337dd2be705bccdb6dddbfc9d513e6addb9d9", + "sha256:b9e5853bbd7264baca42ffc53391b490d65fe62849bf2c690fa3f6273dbcd0cb", + "sha256:bbc14f0365534d35a06970d6a83478b249752e922d662dc24d489af1aa0d1be7", + "sha256:be5bf4b3224948032a845d12ab0f69f208293742df96dc14c4ff9b09e508fc17", + "sha256:c5c97aa666cf70e667dfa5af945424ba1329af5dd988a437efeb3a09430389fb", + "sha256:c7a0e9b561e6460484318a7612e725df1145d46b0ef57c6b9866441bf6e27e0c", + "sha256:caebafea30ed049c57c673d0b36238b1748683be2593965614d7b0e99125c877", + "sha256:cbbc54e58b34c3bae389ef00046be0961f30fef7cb0dd9c7756aee376a4f7683", + "sha256:cc356250cffd6e78416cf5b40dc6a74f1edf3be8e834cf8862d9ed5265cf9b0e", + "sha256:ce9a40fbe52e57e7edf20113a4eaddfacac0561a0879734e636aa6d4bb5e3fb0", + "sha256:d191de6cbab2aff5de6c5723101705fd044b3e4c7cfd587a1929b5028b9714b3", + "sha256:d24f351e4d759f5054b641c81e8291e5d122af0fca5c72454ff77f7cbe492de8", + "sha256:d2d4e4787672911b48350df02ed3fa3fffdc2f2e8ca06dd6afdf34189b76a9dd", + "sha256:d8c112f7a90d8ca5d20213aa41eac690bb50a76da153e3afb3886418e61cb22e", + "sha256:d9890d68c45d1aeac5178ded1d1cccf3bc8d7accf1f976f79bf63099fb16e4bd", + "sha256:dadf95aa862714ea468a49ad1e09fe00fcc9ec67d122f6596a8d40caf6cec7d0", + "sha256:db6a3810eec08280a172a6cd541ff4a5f6a97b161d93ec94e6c4018917deb6b7", + "sha256:db9801fe021f59a5b375ab778973127ca0ac52429a26e2fd86aa9508f4d26eb7", + "sha256:e167bf899c3d724f9662ef00b4f7fef87a19c22b2fead198a6f68b263618df52", + "sha256:e1b93790ed0bc26feb72e2f08299691ceb6da5e9e14a0d13cc74f1869af327a0", + "sha256:e5b1413361cef15340ab9dc61523e653d25723e82d488ef7d60a12878227ed50", + "sha256:ecab51ad2462197a4c000b6d5701fc8585b80eecb90583635d7e327b7b6923eb", + "sha256:ed3b94c5e362a8a84d69642dbeac615452e8af9b8eb825b7bc9f31a53a1051e2", + "sha256:ed8358ae7d94ffb7c397cecb62cbac9578a83ecefc1eba27b9090ee910e2efb6", + "sha256:edfdcae97cdc5d1a89477c436b61f472c4d40971774ac4729c613b4b133163cb", + "sha256:ee25f82f53262f9ac93bd7e58e47ea1bdcc3393cef815847e397cba17e284210", + "sha256:f3be27440f7644ab9a13a6fc86f09cdd90b347c3c5e30c6d6d860de822d7cb53", + "sha256:f46a6e8597f9bd71b31cc708195d42b634c8527fecbcf93febf1052cacc1f16e", + "sha256:f6eb37d511bfae9e13e82cb4d1af36b91150466f24d9b2b8a9785816deb16605", + "sha256:f8d4916a81697faec6cb724a273bd5457e4c6c43d82b29f9dc02c5542fd21fc9", + "sha256:f93b2b2279883d1d0a9e1bd01f312d6fc315c5e4c1f09e112e4736e2f650bc4e", + "sha256:f9867e55590e0855bcec60d4f9a092b69476db64573c9fe17e92b0c50614c16a", + "sha256:f996b87b420995a9174b2a7c1a8daf7db4750be6848b03eb5e639674f7963773" + ], + "markers": "python_version >= '3.9'", + "version": "==6.6.4" + }, + "multimethod": { + "hashes": [ + "sha256:45aa231dc9dbb7f980c0f2ad8179e2c2b72a8cd5c7d7534337be66dde29d35be", + "sha256:c628b6d2e7d61fbe58484dd884d990901e8314faf58af062e72b65e3423cb109" + ], + "markers": "python_version >= '3.9'", + "version": "==2.0" + }, + "multiprocess": { + "hashes": [ + "sha256:0dfd078c306e08d46d7a8d06fb120313d87aa43af60d66da43ffff40b44d2f41", + "sha256:161af703d4652a0e1410be6abccecde4a7ddffd19341be0a7011b94aeb171ac1", + "sha256:37b55f71c07e2d741374998c043b9520b626a8dddc8b3129222ca4f1a06ef67a", + "sha256:476887be10e2f59ff183c006af746cb6f1fd0eadcfd4ef49e605cbe2659920ee", + "sha256:a0bafd3ae1b732eac64be2e72038231c1ba97724b60b09400d68f229fcc2fbf3", + "sha256:a71d82033454891091a226dfc319d0cfa8019a4e888ef9ca910372a446de4435", + "sha256:af4cabb0dac72abfb1e794fa7855c325fd2b55a10a44628a3c1ad3311c04127a", + "sha256:ba8c31889abf4511c7308a8c52bb4a30b9d590e7f58523302ba00237702ca054", + "sha256:c4a9944c67bd49f823687463660a2d6daae94c289adff97e0f9d696ba6371d02", + "sha256:d951bed82c8f73929ac82c61f01a7b5ce8f3e5ef40f5b52553b4f547ce2b08ec", + "sha256:e7b9d0f307cd9bd50851afaac0dba2cb6c44449efff697df7c7645f7d3f2be3a", + "sha256:fc0544c531920dde3b00c29863377f87e1632601092ea2daca74e4beb40faa2e" + ], + "markers": "python_version >= '3.8'", + "version": "==0.70.16" + }, + "mypy-extensions": { + "hashes": [ + "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", + "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558" + ], + "markers": "python_version >= '3.8'", + "version": "==1.1.0" + }, + "neo4j": { + "hashes": [ + "sha256:5c53b5c3eee6dee7e920c9724391aa38d7135a651e71b766da00533b92a91a94", + "sha256:7d38e27e4f987a45cc9052500c6ee27325cb23dae6509037fe31dd7ddaed70c7" + ], + "markers": "python_version >= '3.7'", + "version": "==5.28.2" + }, + "neo4j-graphrag": { + "hashes": [ + "sha256:29a854f2f1e268f043446cdd387c72ee954b87726329ef6479c59ed7b9cf0751", + "sha256:c6c1f730e680d8af3ff3e1ee6086c465c15dd3245157e6c40606ac3ddae7d4f0" + ], + "markers": "python_version < '3.13' and python_full_version >= '3.9.0'", + "version": "==1.7.0" + }, + "neo4j-rust-ext": { + "hashes": [ + "sha256:04728586f4996cba3f1841c8a33dba954810a2e8bc2fa94499f93233d6c98eb4", + "sha256:06ea3f943b9ffa9f8983d8a4788c6a5dab9d66c555abd6cb2b7a2bab5de0b66e", + "sha256:0963005626792aff380ff2ff9b0f4918670b1b15af20663261fa42cd00846874", + "sha256:0a9b1c188dd8a28a22689b424cbf3f6483de8cebbb68c8190e12b676e0ed3954", + "sha256:0ad56564ec595d8c4b561fbdd8d8e748b3c457ca2ed1086189409eac5b8e1c22", + "sha256:0c74a33cba9c4534e912ee8440832ff4edd07c6fc83c34d288b1fd2fdc9dcfc6", + "sha256:1564568da5f8a215121c59d2bccf13cb2b63614d7602caed0d869f66ac026564", + "sha256:1b993f77cf2217165dfd5a7193fefbd971ba76f0f247154dd0a4273f777be775", + "sha256:258fd75e7ad5d8a44f1aa1cf049581b84ab71d98090e1837bf7cc1aa98fa17d8", + "sha256:264bcc67e16aadda9b1dfca16618bb012a3882a2797bf2cd7be06ed6e1afa511", + "sha256:28b4c3da0cc9abdf9293d7292c24618404c8ea9aafc5c254b2475d7f8430ec9c", + "sha256:299408c032a157f4fba6db92fcc939271693531ef848e80e4f20172096c6ce59", + "sha256:2ce40a0b48d1d9564e79bc71645183b8cc306a0f5a966ce0e27c17a1a352c214", + "sha256:335c7a04f8444e70f9d6e3c4478b01a1c93ca4c73d77fe71b8573e6c129569b0", + "sha256:34089a060afd261cee17172d71b73865f22163cd581cb6b9c1df315ef1cf6747", + "sha256:366e64f6743660b391a90eea906d92162e47314b49489f9bf46d42dceb23c289", + "sha256:39b316da62392d53556b1f40d75eda12f03f421e03d8957bff1583321670efd5", + "sha256:3f324f757100d1c4971976ec9a8de4cd32afcaf9f8a6be2afbe5fa11ba10f7f1", + "sha256:40c79069a58e9708df7d6a3cb4865857fefa6986aeda47db6f9ae5298837bb75", + "sha256:40d85304d132d604cdf795209c76c901f2303cf4436d9a5c5837005c37350054", + "sha256:458b7256cbe28cd863c2408d3a7ab87f406acba9e0b26be87879d9ca841fe856", + "sha256:46ea30ad328d56f1dc13ecbd8352972670b5d74dac17e3ab07d56623ca143ec9", + "sha256:48ca8a623dd74f26f60021910b8a15b9e1ba7293e22e4257682be71c6cea0290", + "sha256:5062a7f81b9e97b1cdca634dce9c207396fa225efedcbe3dd15a357161489a50", + "sha256:569aff406e79434dd98f110eb3b8b69f94f9cf00100b9fe2ccd2057d89a2c232", + "sha256:57f00a30f2d43c1a4d2f0861e66498ada030f67b043e41a2fdf369f0f8a73afa", + "sha256:58ce2939dddc8e1186ab783d5b7c9c18cc61a39545669bcc0145372f21a781aa", + "sha256:593626ca539cefe51a9018d7a12cc9edee4289131575c926a3a4910393eed2ee", + "sha256:5f4462b5385d38df01666eaad8c141cd09c53cde630aa1c7b6e576a5c9915271", + "sha256:617fa90596c64fb0c8c863fdae3e305e6d4129c6e3f313d06b3bf33afa8545d3", + "sha256:64cce2090f931a9f84a8885ea7b70414fe720cc7af9345ec68ac6adb8c6d8484", + "sha256:67013974596e54f49601635f711d50cd8230c4cf99f32a94fd6957a21d38f255", + "sha256:689808d30361b0bb9243e873e8ffd7f38568dd0b3cef11c360ba2795e72890ca", + "sha256:69ebb11870633e09cbc74fd532c35bd57f15eef1d60600f530014a049ed13b17", + "sha256:6c93b4e2fa54863a5843258fae91b7b71792896d4b30ca2111fa0f49b0381f01", + "sha256:6cdcbe6785de87d71d8c1eaee9b371c974c1c94624f23f9624f35fee1d3f9f95", + "sha256:70303b9385e0d659e2070679ddfcec87577764d5e3847d3003d0e60cde134036", + "sha256:70522c12357f3e1bf3ae222010c71ebe2c66f30a9bd5023e6b7a49ea2a68e461", + "sha256:85483222f2bfb087fcd7a646bb38ae4a87e749459c1e1269b8a8a1054e46219c", + "sha256:857fe5382b88dcba0a0f91b04426e3886907a9e5bdb56293ae2e74859d1c0abe", + "sha256:86fe37d7fac128d36a829122e29a91a5e0440e46d5849e61fca6eb15b206266b", + "sha256:895c3730e5794c8775b8f7518a867b0768b126c8be330af5f228aa7d574284b4", + "sha256:89ea9cb82013ae07b3e6dbc1e3f7b924928a06d2585afa4b60c137aa1960babf", + "sha256:8d86e25732184cdb69faa0f894cfce066a55cbac3de5834a50730459849c4b3a", + "sha256:8e6228f27618f6944fad80d022255d1174c17e78b8547216c021205a52677105", + "sha256:8fe140473eb5bcaa20bc46e4353a3808123ce6084c22e81c6c15cba0e9cde372", + "sha256:acabb22e5a7bd39f5780b2e533cc0d0a9a1106cc6c199eb7d8bcab556cd6c595", + "sha256:aed752465c2a0cbf5a0eba973c9eb30cddde26b215bb240387a3de72abf764c3", + "sha256:b53322a7f3c180a74193a94ada6310f2d082ee857529c0666d1e33306a454821", + "sha256:b73e9ccf3c6f939e03ad1f3aaccbd1306148234440a5d3b2503fb24118ed668a", + "sha256:baec0a2a47bfadffad9c25d12cc4300ce45a88e218ecc06dbd99fe582b5e6a6c", + "sha256:bc259e9db39bc716fccf670b4300a268de4b764bff31053f47b420fada0e1feb", + "sha256:c40ea7cccbd3ea20107603b961ec5b97a39091cbc357cd96e9c3d5a416118f44", + "sha256:c63c759b78c0e0c0474ab6ae61b6099e53b9cbb830744e1c657af4f4ab6a6692", + "sha256:d300a5f8a52240fd839cc3c58d95ec27be0f9f7a88e717e86b1cf65737a4f80d", + "sha256:d769f65ed3c537aac3f8db0c3f7a910f2a79341022c2ac2cdd58a842a6e42494", + "sha256:dc600847b7c91cb0df7eb8605d7d1875fd392b6bc9d962782281988e4c4e87d1", + "sha256:de3682e832f32a4725ca69a4ba6925b5a031b8138a73eea282164b83cd8ad967", + "sha256:e60bf3382c592c9260d8caaccfb78d1aa312898c17dd8c8acbfe9d62c43c7a8e", + "sha256:efd84ead7e133c61abd20cb2c9b28bdd783cdb3a738641a33f706eb41dc8d634", + "sha256:f31ec7dc99f8147af9a9b88f7ed95a2867120b7a146e3a9d72ac5d1013e51001", + "sha256:f99485f10cdb761b9888bd34dd4edbe82c09798aa2f6e39815c93b164faadcae", + "sha256:fde5b83f35b77a647ecc0cd572064436c24ce4abac66b1abdb7d6d810619ac9c", + "sha256:ffa4f05f1907d966f0694f7158e8f817d89c7dfda8ff1d7fd2a0f3541224897f" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==5.28.2.0" + }, + "nest-asyncio": { + "hashes": [ + "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", + "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" + ], + "markers": "python_version >= '3.5'", + "version": "==1.6.0" + }, + "networkx": { + "hashes": [ + "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", + "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f" + ], + "markers": "python_version >= '3.10'", + "version": "==3.4.2" + }, + "nltk": { + "hashes": [ + "sha256:4fa26829c5b00715afe3061398a8989dc643b92ce7dd93fb4585a70930d168a1", + "sha256:87d127bd3de4bd89a4f81265e5fa59cb1b199b27440175370f7417d2bc7ae868" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==3.9.1" + }, + "numpy": { + "hashes": [ + "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", + "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", + "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", + "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", + "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", + "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", + "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", + "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", + "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", + "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", + "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", + "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", + "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", + "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", + "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", + "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", + "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", + "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", + "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", + "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", + "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", + "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", + "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", + "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", + "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", + "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", + "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", + "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", + "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", + "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", + "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", + "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", + "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", + "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", + "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", + "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" + ], + "markers": "python_version >= '3.9'", + "version": "==1.26.4" + }, + "oauthlib": { + "hashes": [ + "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", + "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1" + ], + "markers": "python_version >= '3.8'", + "version": "==3.3.1" + }, + "olefile": { + "hashes": [ + "sha256:543c7da2a7adadf21214938bb79c83ea12b473a4b6ee4ad4bf854e7715e13d1f", + "sha256:599383381a0bf3dfbd932ca0ca6515acd174ed48870cbf7fee123d698c192c1c" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.47" + }, + "onnx": { + "hashes": [ + "sha256:030d9f5f878c5f4c0ff70a4545b90d7812cd6bfe511de2f3e469d3669c8cff95", + "sha256:102c04edc76b16e9dfeda5a64c1fccd7d3d2913b1544750c01d38f1ac3c04e05", + "sha256:230b0fb615e5b798dc4a3718999ec1828360bc71274abd14f915135eab0255f1", + "sha256:2bd5c0c55669b6d8f12e859cc27f3a631fe58730871b21f001527e1d56219e2a", + "sha256:2f4d37b0b5c96a873887652d1cbf3f3c70821b8c66302d84b0f0d89dd6e47653", + "sha256:3c137eecf6bc618c2f9398bcc381474b55c817237992b169dfe728e169549e8f", + "sha256:3d8dbf9e996629131ba3aa1afd1d8239b660d1f830c6688dd7e03157cccd6b9c", + "sha256:4a3b50d94620e2c7c1404d1d59bc53e665883ae3fecbd856cc86da0639fd0fc3", + "sha256:4c8c4bbda760c654e65eaffddb1a7de71ec02e60092d33f9000521f897c99be9", + "sha256:521bac578448667cbb37c50bf05b53c301243ede8233029555239930996a625b", + "sha256:6acafb3823238bbe8f4340c7ac32fb218689442e074d797bee1c5c9a02fdae75", + "sha256:6c093ffc593e07f7e33862824eab9225f86aa189c048dd43ffde207d7041a55f", + "sha256:6f91930c1a284135db0f891695a263fc876466bf2afbd2215834ac08f600cfca", + "sha256:73160799472e1a86083f786fecdf864cf43d55325492a9b5a1cfa64d8a523ecc", + "sha256:735e06d8d0cf250dc498f54038831401063c655a8d6e5975b2527a4e7d24be3e", + "sha256:7839bf2adb494e46ccf375a7936b5d9e241b63e1a84254f3eb2e2e184e3292c8", + "sha256:8521544987d713941ee1e591520044d35e702f73dc87e91e6d4b15a064ae813d", + "sha256:911b37d724a5d97396f3c2ef9ea25361c55cbc9aa18d75b12a52b620b67145af", + "sha256:9235b3493951e11e75465d56f4cd97e3e9247f096160dd3466bfabe4cbc938bc", + "sha256:99afac90b4cdb1471432203c3c1f74e16549c526df27056d39f41a9a47cfb4af", + "sha256:a186b1518450e04dc3679da315a663a56429418e7ccfd947d721de9bd710b0ea", + "sha256:a3ff1735f99589be4f311eb586f2b949998614a82fb6261ae6af5a29879b9375", + "sha256:a5810194f0f6be2e58c8d6dedc6119510df7a14280dd07ed5f0f0a85bd74816a", + "sha256:a69afd0baa372162948b52c13f3aa2730123381edf926d7ef3f68ca7cec6d0d0", + "sha256:aa1b7483fac6cdec26922174fc4433f8f5c2f239b1133c5625063bb3b35957d0", + "sha256:bfb1f271b1523b29f324bfd223f6a4cfbdc5a2f2f16e73563671932d33663365", + "sha256:dc22abacfb0d3cd024d6ab784cb5eb5aca9c966a791e8e13b1a4ecb93ddb47d3", + "sha256:e03071041efd82e0317b3c45433b2f28146385b80f26f82039bc68048ac1a7a0", + "sha256:e189652dad6e70a0465035c55cc565c27aa38803dd4f4e74e4b952ee1c2de94b", + "sha256:e4da451bf1c5ae381f32d430004a89f0405bc57a8471b0bddb6325a5b334aa40", + "sha256:ee159b41a3ae58d9c7341cf432fc74b96aaf50bd7bb1160029f657b40dc69715" + ], + "markers": "python_version >= '3.9'", + "version": "==1.18.0" + }, + "onnxruntime": { + "hashes": [ + "sha256:006c8d326835c017a9e9f74c9c77ebb570a71174a1e89fe078b29a557d9c3848", + "sha256:016229660adea180e9a32ce218b95f8f84860a200f0f13b50070d7d90e92956c", + "sha256:17ed7382d2c58d4b7354fb2b301ff30b9bf308a1c7eac9546449cd122d21cae5", + "sha256:190103273ea4507638ffc31d66a980594b237874b65379e273125150eb044857", + "sha256:1c3e5d415b78337fa0b1b75291e9ea9fb2a4c1f148eb5811e7212fed02cfffa8", + "sha256:31c12840b1cde4ac1f7d27d540c44e13e34f2345cf3642762d2a3333621abb6a", + "sha256:38475e29a95c5f6c62c2c603d69fc7d4c6ccbf4df602bd567b86ae1138881c49", + "sha256:477b93df4db467e9cbf34051662a4b27c18e131fa1836e05974eae0d6e4cf29b", + "sha256:4b3d723cc154c8ddeb9f6d0a8c0d6243774c6b5930847cc83170bfe4678fafb3", + "sha256:50cbb8dc69d6befad4746a69760e5b00cc3ff0a59c6c3fb27f8afa20e2cab7e7", + "sha256:5bd8b875757ea941cbcfe01582970cc299893d1b65bd56731e326a8333f638a3", + "sha256:636bc1d4cc051d40bc52e1f9da87fbb9c57d9d47164695dfb1c41646ea51ea66", + "sha256:68e7051bef9cfefcbb858d2d2646536829894d72a4130c24019219442b1dd2ed", + "sha256:84fa57369c06cadd3c2a538ae2a26d76d583e7c34bdecd5769d71ca5c0fc750e", + "sha256:9a174073dc5608fad05f7cf7f320b52e8035e73d80b0a23c80f840e5a97c0147", + "sha256:a36511dc07c5c964b916697e42e366fa43c48cdb3d3503578d78cef30417cb84", + "sha256:b2046fc9560f97947bbc1acbe4c6d48585ef0f12742744307d3364b131ac5778", + "sha256:bdc471a66df0c1cdef774accef69e9f2ca168c851ab5e4f2f3341512c7ef4666", + "sha256:c1dfe4f660a71b31caa81fc298a25f9612815215a47b286236e61d540350d7b6", + "sha256:d2d366fbcc205ce68a8a3bde2185fd15c604d9645888703785b61ef174265168", + "sha256:d863e8acdc7232d705d49e41087e10b274c42f09e259016a46f32c34e06dc4fd", + "sha256:dc5430f473e8706fff837ae01323be9dcfddd3ea471c900a91fa7c9b807ec5d3", + "sha256:df2a94179a42d530b936f154615b54748239c2908ee44f0d722cb4df10670f68", + "sha256:e3a4ce906105d99ebbe817f536d50a91ed8a4d1592553f49b3c23c4be2560ae6", + "sha256:fae4b4de45894b9ce7ae418c5484cbf0341db6813effec01bb2216091c52f7fb" + ], + "version": "==1.19.2" + }, + "openai": { + "hashes": [ + "sha256:52b20bb990a1780f9b0b8ccebac93416343ebd3e4e714e3eff730336833ca207", + "sha256:e1c643738f1fff1af52bce6ef06a7716c95d089281e7011777179614f32937aa" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.71.0" + }, + "opencv-python": { + "hashes": [ + "sha256:03d60ccae62304860d232272e4a4fda93c39d595780cb40b161b310244b736a4", + "sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec", + "sha256:1b92ae2c8852208817e6776ba1ea0d6b1e0a1b5431e971a2a0ddd2a8cc398202", + "sha256:432f67c223f1dc2824f5e73cdfcd9db0efc8710647d4e813012195dc9122a52a", + "sha256:6b02611523803495003bd87362db3e1d2a0454a6a63025dc6658a9830570aa0d", + "sha256:810549cb2a4aedaa84ad9a1c92fbfdfc14090e2749cedf2c1589ad8359aa169b", + "sha256:9d05ef13d23fe97f575153558653e2d6e87103995d54e6a35db3f282fe1f9c66" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==4.11.0.86" + }, + "opentelemetry-api": { + "hashes": [ + "sha256:02f20bcacf666e1333b6b1f04e647dc1d5111f86b8e510238fcc56d7762cda8c", + "sha256:9a72572b9c416d004d492cbc6e61962c0501eaf945ece9b5a0f56597d8348aa0" + ], + "markers": "python_version >= '3.9'", + "version": "==1.36.0" + }, + "orjson": { + "hashes": [ + "sha256:07349e88025b9b5c783077bf7a9f401ffbfb07fd20e86ec6fc5b7432c28c2c5e", + "sha256:0afb89f16f07220183fd00f5f297328ed0a68d8722ad1b0c8dcd95b12bc82804", + "sha256:0b84455e60c4bc12c1e4cbaa5cfc1acdc7775a9da9cec040e17232f4b05458bd", + "sha256:0ff285d14917ea1408a821786e3677c5261fa6095277410409c694b8e7720ae0", + "sha256:13d8d8db6cd8d89d4d4e0f4161acbbb373a4d2a4929e862d1d2119de4aa324ac", + "sha256:140f84e3c8d4c142575898c91e3981000afebf0333df753a90b3435d349a5fe5", + "sha256:15d17bdb76a142e1f55d91913e012e6e6769659daa6bfef3ef93f11083137e81", + "sha256:191ed27a1dddb305083d8716af413d7219f40ec1d4c9b0e977453b4db0d6fb6c", + "sha256:21cf261e8e79284242e4cb1e5924df16ae28255184aafeff19be1405f6d33f67", + "sha256:24e32a558ebed73a6a71c8f1cbc163a7dd5132da5270ff3d8eeb727f4b6d1bc7", + "sha256:2662f908114864b63ff75ffe6ffacf996418dd6cc25e02a72ad4bda81b1ec45a", + "sha256:26693dde66910078229a943e80eeb99fdce6cd2c26277dc80ead9f3ab97d2131", + "sha256:26e99e98df8990ecfe3772bbdd7361f602149715c2cbc82e61af89bfad9528a4", + "sha256:29c0f84fc50398773a702732c87cd622737bf11c0721e6db3041ac7802a686fb", + "sha256:29d91d74942b7436f29b5d1ed9bcfc3f6ef2d4f7c4997616509004679936650d", + "sha256:2cc42960515076eb639b705f105712b658c525863d89a1704d984b929b0577d1", + "sha256:2e4d423a6f838552e3a6d9ec734b729f61f88b1124fd697eab82805ea1a2a97d", + "sha256:32769e04cd7fdc4a59854376211145a1bbbc0aea5e9d6c9755d3d3c301d7c0df", + "sha256:3d7612bb227d5d9582f1f50a60bd55c64618fc22c4a32825d233a4f2771a428a", + "sha256:3dacfc621be3079ec69e0d4cb32e3764067726e0ef5a5576428f68b6dc85b4f6", + "sha256:3dcba7101ea6a8d4ef060746c0f2e7aa8e2453a1012083e1ecce9726d7554cb7", + "sha256:40193ada63fab25e35703454d65b6afc71dbc65f20041cb46c6d91709141ef7f", + "sha256:45841fbb79c96441a8c58aa29ffef570c5df9af91f0f7a9572e5505e12412f15", + "sha256:465166773265f3cc25db10199f5d11c81898a309e26a2481acf33ddbec433fda", + "sha256:4a0a4c29ae90b11d0c00bcc31533854d89f77bde2649ec602f512a7e16e00640", + "sha256:4ad4c8acb50a28211c33fc7ef85ddf5cb18d4636a5205fd3fa2dce0411a0e30c", + "sha256:4ca4fb5ac21cd1e48028d4f708b1bb13e39c42d45614befd2ead004a8bba8535", + "sha256:50995bbeb5d41a32ad15e023305807f561ac5dcd9bd41a12c8d8d1d2c83e44e6", + "sha256:51da1ee2178ed09c00d09c1b953e45846bbc16b6420965eb7a913ba209f606d8", + "sha256:51dc033df2e4a4c91c0ba4f43247de99b3cbf42ee7a42ee2b2b2f76c8b2f2cb5", + "sha256:53c9e81768c69d4b66b8876ec3c8e431c6e13477186d0db1089d82622bccd19f", + "sha256:5814313b3e75a2be7fe6c7958201c16c4560e21a813dbad25920752cecd6ad66", + "sha256:585d712b1880f68370108bc5534a257b561672d1592fae54938738fe7f6f1e33", + "sha256:59f8d5ad08602711af9589375be98477d70e1d102645430b5a7985fdbf613b36", + "sha256:64414241bde943cbf3c00d45fcb5223dca6d9210148ba984aae6b5d63294502b", + "sha256:652ca14e283b13ece35bf3a86503c25592f294dbcfc5bb91b20a9c9a62a3d4be", + "sha256:6a5f62ebbc530bb8bb4b1ead103647b395ba523559149b91a6c545f7cd4110ad", + "sha256:6ab6e6b4e93b1573a026b6ec16fca9541354dd58e514b62c558b58554ae04307", + "sha256:6f59dfea7da1fced6e782bb3699718088b1036cb361f36c6e4dd843c5111aefe", + "sha256:73cee7867c1fcbd1cc5b6688b3e13db067f968889242955780123a68b3d03316", + "sha256:7773e71c0ae8c9660192ff144a3d69df89725325e3d0b6a6bb2c50e5ebaf9b84", + "sha256:7c8ac5f6b682d3494217085cf04dadae66efee45349ad4ee2a1da3c97e2305a8", + "sha256:83387cc8b26c9fa0ae34d1ea8861a7ae6cff8fb3e346ab53e987d085315a728e", + "sha256:888b64ef7eaeeff63f773881929434a5834a6a140a63ad45183d59287f07fc6a", + "sha256:8a669e31ab8eb466c9142ac7a4be2bb2758ad236a31ef40dcd4cf8774ab40f33", + "sha256:8ad8873979659ad98fc56377b9c5b93eb8059bf01e6412f7abf7dbb3d637a991", + "sha256:901d80d349d8452162b3aa1afb82cec5bee79a10550660bc21311cc61a4c5486", + "sha256:91bdcf5e69a8fd8e8bdb3de32b31ff01d2bd60c1e8d5fe7d5afabdcf19920309", + "sha256:9482ef83b2bf796157566dd2d2742a8a1e377045fe6065fa67acb1cb1d21d9a3", + "sha256:955811c8405251d9e09cbe8606ad8fdef49a451bcf5520095a5ed38c669223d8", + "sha256:957f10c7b5bce3d3f2ad577f3b307c784f5dabafcce3b836229c269c11841c86", + "sha256:96304a2b7235e0f3f2d9363ddccdbfb027d27338722fe469fe656832a017602e", + "sha256:994181e7f1725bb5f2d481d7d228738e0743b16bf319ca85c29369c65913df14", + "sha256:9c04325839c5754c253ff301cee8aaed7442d974860a44447bb3be785c411c27", + "sha256:9cb23527efb61fb75527df55d20ee47989c4ee34e01a9c98ee9ede232abf6219", + "sha256:9fdff73a029cde5f4a1cf5ec9dbc6acab98c9ddd69f5580c2b3f02ce43ba9f9f", + "sha256:a079fdba7062ab396380eeedb589afb81dc6683f07f528a03b6f7aae420a0219", + "sha256:a134587d18fe493befc2defffef2a8d27cfcada5696cb7234de54a21903ae89a", + "sha256:a4dd1268e4035af21b8a09e4adf2e61f87ee7bf63b86d7bb0a237ac03fad5b45", + "sha256:ab463cf5d08ad6623a4dac1badd20e88a5eb4b840050c4812c782e3149fe2334", + "sha256:adedf7d887416c51ad49de3c53b111887e0b63db36c6eb9f846a8430952303d8", + "sha256:ae3bb10279d57872f9aba68c9931aa71ed3b295fa880f25e68da79e79453f46e", + "sha256:b1efbdc479c6451138c3733e415b4d0e16526644e54e2f3689f699c4cda303bf", + "sha256:b5ca86300aeb383c8fa759566aca065878d3d98c3389d769b43f0a2e84d52c5f", + "sha256:bc000190a7b1d2d8e36cba990b3209a1e15c0efb6c7750e87f8bead01afc0d46", + "sha256:bde64aa469b5ee46cc960ed241fae3721d6a8801dacb2ca3466547a2535951e4", + "sha256:c56777cab2a7b2a8ea687fedafb84b3d7fdafae382165c31a2adf88634c432fa", + "sha256:c9ec0cc0d4308cad1e38a1ee23b64567e2ff364c2a3fe3d6cbc69cf911c45712", + "sha256:cc04036eeae11ad4180d1f7b5faddb5dab1dee49ecd147cd431523869514873b", + "sha256:cf3bd3967a360e87ee14ed82cb258b7f18c710dacf3822fb0042a14313a673a1", + "sha256:d026e1967239ec11a2559b4146a61d13914504b396f74510a1c4d6b19dfd8732", + "sha256:d08e342a7143f8a7c11f1c4033efe81acbd3c98c68ba1b26b96080396019701f", + "sha256:d4f13af59a7b84c1ca6b8a7ab70d608f61f7c44f9740cd42409e6ae7b6c8d8b7", + "sha256:d6b8a78c33496230a60dc9487118c284c15ebdf6724386057239641e1eb69761", + "sha256:d7df6c7b8b0931feb3420b72838c3e2ba98c228f7aa60d461bc050cf4ca5f7b2", + "sha256:d7e35f003692c216d7ee901b6b916b5734d6fc4180fcaa44c52081f974c08e17", + "sha256:dbb79a0476393c07656b69c8e763c3cc925fa8e1d9e9b7d1f626901bb5025448", + "sha256:dc471ce2225ab4c42ca672f70600d46a8b8e28e8d4e536088c1ccdb1d22b35ce", + "sha256:df3fdd8efa842ccbb81135d6f58a73512f11dba02ed08d9466261c2e9417af4e", + "sha256:e36319a5d15b97e4344110517450396845cc6789aed712b1fbf83c1bd95792f6", + "sha256:edf49146520fef308c31aa4c45b9925fd9c7584645caca7c0c4217d7900214ae", + "sha256:f0660efeac223f0731a70884e6914a5f04d613b5ae500744c43f7bf7b78f00f9", + "sha256:ff8b155b145eaf5a9d94d2c476fbe18d6021de93cf36c2ae2c8c5b775763f14e" + ], + "markers": "platform_python_implementation != 'PyPy'", + "version": "==3.11.2" + }, + "packaging": { + "hashes": [ + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + ], + "markers": "python_version >= '3.8'", + "version": "==24.2" + }, + "pandas": { + "hashes": [ + "sha256:025e92411c16cbe5bb2a4abc99732a6b132f439b8aab23a59fa593eb00704232", + "sha256:09e3b1587f0f3b0913e21e8b32c3119174551deb4a4eba4a89bc7377947977e7", + "sha256:0a95b9ac964fe83ce317827f80304d37388ea77616b1425f0ae41c9d2d0d7bb2", + "sha256:0f951fbb702dacd390561e0ea45cdd8ecfa7fb56935eb3dd78e306c19104b9b0", + "sha256:1b916a627919a247d865aed068eb65eb91a344b13f5b57ab9f610b7716c92de1", + "sha256:1c78cf43c8fde236342a1cb2c34bcff89564a7bfed7e474ed2fffa6aed03a956", + "sha256:1d12f618d80379fde6af007f65f0c25bd3e40251dbd1636480dfffce2cf1e6da", + "sha256:22c2e866f7209ebc3a8f08d75766566aae02bcc91d196935a1d9e59c7b990ac9", + "sha256:2323294c73ed50f612f67e2bf3ae45aea04dce5690778e08a09391897f35ff88", + "sha256:2b0540963d83431f5ce8870ea02a7430adca100cec8a050f0811f8e31035541b", + "sha256:2ba6aff74075311fc88504b1db890187a3cd0f887a5b10f5525f8e2ef55bfdb9", + "sha256:2eb789ae0274672acbd3c575b0598d213345660120a257b47b5dafdc618aec83", + "sha256:2f4d6feeba91744872a600e6edbbd5b033005b431d5ae8379abee5bcfa479fab", + "sha256:342e59589cc454aaff7484d75b816a433350b3d7964d7847327edda4d532a2e3", + "sha256:3462c3735fe19f2638f2c3a40bd94ec2dc5ba13abbb032dd2fa1f540a075509d", + "sha256:3583d348546201aff730c8c47e49bc159833f971c2899d6097bce68b9112a4f1", + "sha256:4645f770f98d656f11c69e81aeb21c6fca076a44bed3dcbb9396a4311bc7f6d8", + "sha256:4d544806b485ddf29e52d75b1f559142514e60ef58a832f74fb38e48d757b299", + "sha256:56a342b231e8862c96bdb6ab97170e203ce511f4d0429589c8ede1ee8ece48b8", + "sha256:5db9637dbc24b631ff3707269ae4559bce4b7fd75c1c4d7e13f40edc42df4444", + "sha256:689968e841136f9e542020698ee1c4fbe9caa2ed2213ae2388dc7b81721510d3", + "sha256:6de8547d4fdb12421e2d047a2c446c623ff4c11f47fddb6b9169eb98ffba485a", + "sha256:6f3bf5ec947526106399a9e1d26d40ee2b259c66422efdf4de63c848492d91bb", + "sha256:782647ddc63c83133b2506912cc6b108140a38a37292102aaa19c81c83db2928", + "sha256:7dcb79bf373a47d2a40cf7232928eb7540155abbc460925c2c96d2d30b006eb4", + "sha256:8dfc17328e8da77be3cf9f47509e5637ba8f137148ed0e9b5241e1baf526e20a", + "sha256:9026bd4a80108fac2239294a15ef9003c4ee191a0f64b90f170b40cfb7cf2d22", + "sha256:911580460fc4884d9b05254b38a6bfadddfcc6aaef856fb5859e7ca202e45275", + "sha256:98bcc8b5bf7afed22cc753a28bc4d9e26e078e777066bc53fac7904ddef9a678", + "sha256:9b7ff55f31c4fcb3e316e8f7fa194566b286d6ac430afec0d461163312c5841e", + "sha256:ac942bfd0aca577bef61f2bc8da8147c4ef6879965ef883d8e8d5d2dc3e744b8", + "sha256:b3cd4273d3cb3707b6fffd217204c52ed92859533e31dc03b7c5008aa933aaab", + "sha256:b4b0de34dc8499c2db34000ef8baad684cfa4cbd836ecee05f323ebfba348c7d", + "sha256:ca7ed14832bce68baef331f4d7f294411bed8efd032f8109d690df45e00c4679", + "sha256:cd05b72ec02ebfb993569b4931b2e16fbb4d6ad6ce80224a3ee838387d83a191", + "sha256:dd71c47a911da120d72ef173aeac0bf5241423f9bfea57320110a978457e069e", + "sha256:e5635178b387bd2ba4ac040f82bc2ef6e6b500483975c4ebacd34bec945fda12", + "sha256:e6723a27ad7b244c0c79d8e7007092d7c8f0f11305770e2f4cd778b3ad5f9f85", + "sha256:ec6c851509364c59a5344458ab935e6451b31b818be467eb24b0fe89bd05b6b9", + "sha256:fe37e757f462d31a9cd7580236a82f353f5713a80e059a29753cf938c6775d96", + "sha256:fe67dc676818c186d5a3d5425250e40f179c2a89145df477dd82945eaea89e97", + "sha256:fe7317f578c6a153912bd2292f02e40c1d8f253e93c599e82620c7f69755c74f" + ], + "markers": "python_version >= '3.9'", + "version": "==2.3.1" + }, + "pdfminer-six": { + "hashes": [ + "sha256:b03cc8df09cf3c7aba8246deae52e0bca7ebb112a38895b5e1d4f5dd2b8ca2e7", + "sha256:d81ad173f62e5f841b53a8ba63af1a4a355933cfc0ffabd608e568b9193909e3" + ], + "markers": "python_version >= '3.9'", + "version": "==20250506" + }, + "pillow": { + "hashes": [ + "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", + "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", + "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", + "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", + "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", + "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", + "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06", + "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", + "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", + "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", + "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", + "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", + "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", + "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", + "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", + "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", + "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", + "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", + "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", + "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", + "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", + "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4", + "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", + "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", + "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", + "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", + "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", + "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", + "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", + "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", + "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", + "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", + "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", + "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", + "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", + "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", + "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f", + "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", + "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", + "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", + "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", + "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", + "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", + "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", + "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc", + "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", + "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", + "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", + "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", + "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978", + "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb", + "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", + "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", + "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", + "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", + "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", + "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", + "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081", + "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", + "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", + "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", + "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", + "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", + "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", + "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", + "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", + "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", + "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", + "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", + "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", + "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", + "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", + "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", + "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d", + "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", + "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", + "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", + "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", + "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", + "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", + "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", + "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", + "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", + "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", + "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", + "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", + "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", + "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", + "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", + "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a", + "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", + "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", + "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", + "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", + "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada", + "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", + "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71", + "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", + "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", + "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", + "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", + "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", + "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", + "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", + "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", + "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3" + ], + "markers": "python_version >= '3.9'", + "version": "==11.3.0" + }, + "pip-install": { + "hashes": [ + "sha256:68f2aae5bad33b43410672385b5e7ab177c9a3b4baa5fa41fb12d2dd12d490e6", + "sha256:89761b5b74c3e31a4593759d1a93f65e6c3dc5ad9f9e8402e7585ed9ccf681f7" + ], + "index": "pypi", + "markers": "python_version >= '2.7'", + "version": "==1.3.5" + }, + "propcache": { + "hashes": [ + "sha256:035e631be25d6975ed87ab23153db6a73426a48db688070d925aa27e996fe93c", + "sha256:03c89c1b14a5452cf15403e291c0ccd7751d5b9736ecb2c5bab977ad6c5bcd81", + "sha256:06766d8f34733416e2e34f46fea488ad5d60726bb9481d3cddf89a6fa2d9603f", + "sha256:0a2f2235ac46a7aa25bdeb03a9e7060f6ecbd213b1f9101c43b3090ffb971ef6", + "sha256:0b504d29f3c47cf6b9e936c1852246c83d450e8e063d50562115a6be6d3a2535", + "sha256:0b8d2f607bd8f80ddc04088bc2a037fdd17884a6fcadc47a96e334d72f3717be", + "sha256:0cc17efde71e12bbaad086d679ce575268d70bc123a5a71ea7ad76f70ba30bba", + "sha256:0d0fda578d1dc3f77b6b5a5dce3b9ad69a8250a891760a548df850a5e8da87f3", + "sha256:156c03d07dc1323d8dacaa221fbe028c5c70d16709cdd63502778e6c3ccca1b0", + "sha256:1f43837d4ca000243fd7fd6301947d7cb93360d03cd08369969450cc6b2ce3b4", + "sha256:20d7d62e4e7ef05f221e0db2856b979540686342e7dd9973b815599c7057e168", + "sha256:2183111651d710d3097338dd1893fcf09c9f54e27ff1a8795495a16a469cc90b", + "sha256:21d8759141a9e00a681d35a1f160892a36fb6caa715ba0b832f7747da48fb6ea", + "sha256:22d9962a358aedbb7a2e36187ff273adeaab9743373a272976d2e348d08c7770", + "sha256:261df2e9474a5949c46e962065d88eb9b96ce0f2bd30e9d3136bcde84befd8f2", + "sha256:261fa020c1c14deafd54c76b014956e2f86991af198c51139faf41c4d5e83892", + "sha256:28710b0d3975117239c76600ea351934ac7b5ff56e60953474342608dbbb6154", + "sha256:2a4092e8549031e82facf3decdbc0883755d5bbcc62d3aea9d9e185549936dcf", + "sha256:2ca6d378f09adb13837614ad2754fa8afaee330254f404299611bce41a8438cb", + "sha256:310d11aa44635298397db47a3ebce7db99a4cc4b9bbdfcf6c98a60c8d5261cf1", + "sha256:31248e44b81d59d6addbb182c4720f90b44e1efdc19f58112a3c3a1615fb47ef", + "sha256:34a624af06c048946709f4278b4176470073deda88d91342665d95f7c6270fbe", + "sha256:36c8d9b673ec57900c3554264e630d45980fd302458e4ac801802a7fd2ef7897", + "sha256:3def3da3ac3ce41562d85db655d18ebac740cb3fa4367f11a52b3da9d03a5cc3", + "sha256:404d70768080d3d3bdb41d0771037da19d8340d50b08e104ca0e7f9ce55fce70", + "sha256:4445542398bd0b5d32df908031cb1b30d43ac848e20470a878b770ec2dcc6330", + "sha256:46d7f8aa79c927e5f987ee3a80205c987717d3659f035c85cf0c3680526bdb44", + "sha256:4927842833830942a5d0a56e6f4839bc484785b8e1ce8d287359794818633ba0", + "sha256:4adfb44cb588001f68c5466579d3f1157ca07f7504fc91ec87862e2b8e556b88", + "sha256:4ba3fef1c30f306b1c274ce0b8baaa2c3cdd91f645c48f06394068f37d3837a1", + "sha256:4c1396592321ac83157ac03a2023aa6cc4a3cc3cfdecb71090054c09e5a7cce3", + "sha256:4c181cad81158d71c41a2bce88edce078458e2dd5ffee7eddd6b05da85079f43", + "sha256:54e02207c79968ebbdffc169591009f4474dde3b4679e16634d34c9363ff56b4", + "sha256:55780d5e9a2ddc59711d727226bb1ba83a22dd32f64ee15594b9392b1f544eb1", + "sha256:55ffda449a507e9fbd4aca1a7d9aa6753b07d6166140e5a18d2ac9bc49eac220", + "sha256:5745bc7acdafa978ca1642891b82c19238eadc78ba2aaa293c6863b304e552d7", + "sha256:59d61f6970ecbd8ff2e9360304d5c8876a6abd4530cb752c06586849ac8a9dc9", + "sha256:5f559e127134b07425134b4065be45b166183fdcb433cb6c24c8e4149056ad50", + "sha256:5f57aa0847730daceff0497f417c9de353c575d8da3579162cc74ac294c5369e", + "sha256:6107ddd08b02654a30fb8ad7a132021759d750a82578b94cd55ee2772b6ebea2", + "sha256:62180e0b8dbb6b004baec00a7983e4cc52f5ada9cd11f48c3528d8cfa7b96a66", + "sha256:62b4239611205294cc433845b914131b2a1f03500ff3c1ed093ed216b82621e1", + "sha256:64a67fb39229a8a8491dd42f864e5e263155e729c2e7ff723d6e25f596b1e8cb", + "sha256:6d8f3f0eebf73e3c0ff0e7853f68be638b4043c65a70517bb575eff54edd8dbe", + "sha256:7046e79b989d7fe457bb755844019e10f693752d169076138abf17f31380800c", + "sha256:70bd8b9cd6b519e12859c99f3fc9a93f375ebd22a50296c3a295028bea73b9e7", + "sha256:7435d766f978b4ede777002e6b3b6641dd229cd1da8d3d3106a45770365f9ad9", + "sha256:74413c0ba02ba86f55cf60d18daab219f7e531620c15f1e23d95563f505efe7e", + "sha256:76cace5d6b2a54e55b137669b30f31aa15977eeed390c7cbfb1dafa8dfe9a701", + "sha256:7a2368eed65fc69a7a7a40b27f22e85e7627b74216f0846b04ba5c116e191ec9", + "sha256:7a4f30862869fa2b68380d677cc1c5fcf1e0f2b9ea0cf665812895c75d0ca3b8", + "sha256:7ca3aee1aa955438c4dba34fc20a9f390e4c79967257d830f137bd5a8a32ed3b", + "sha256:7f08f1cc28bd2eade7a8a3d2954ccc673bb02062e3e7da09bc75d843386b342f", + "sha256:85871b050f174bc0bfb437efbdb68aaf860611953ed12418e4361bc9c392749e", + "sha256:8a08154613f2249519e549de2330cf8e2071c2887309a7b07fb56098f5170a02", + "sha256:8a544caaae1ac73f1fecfae70ded3e93728831affebd017d53449e3ac052ac1e", + "sha256:8cabf5b5902272565e78197edb682017d21cf3b550ba0460ee473753f28d23c1", + "sha256:8de106b6c84506b31c27168582cd3cb3000a6412c16df14a8628e5871ff83c10", + "sha256:92b69e12e34869a6970fd2f3da91669899994b47c98f5d430b781c26f1d9f387", + "sha256:9704bedf6e7cbe3c65eca4379a9b53ee6a83749f047808cbb5044d40d7d72198", + "sha256:98f1ec44fb675f5052cccc8e609c46ed23a35a1cfd18545ad4e29002d858a43f", + "sha256:9a3cf035bbaf035f109987d9d55dc90e4b0e36e04bbbb95af3055ef17194057b", + "sha256:9bec58347a5a6cebf239daba9bda37dffec5b8d2ce004d9fe4edef3d2815137e", + "sha256:9da1cf97b92b51253d5b68cf5a2b9e0dafca095e36b7f2da335e27dc6172a614", + "sha256:9ecb0aad4020e275652ba3975740f241bd12a61f1a784df044cf7477a02bc252", + "sha256:a2dc1f4a1df4fecf4e6f68013575ff4af84ef6f478fe5344317a65d38a8e6dc9", + "sha256:a7fad897f14d92086d6b03fdd2eb844777b0c4d7ec5e3bac0fbae2ab0602bbe5", + "sha256:ab50cef01b372763a13333b4e54021bdcb291fc9a8e2ccb9c2df98be51bcde6c", + "sha256:abb7fa19dbf88d3857363e0493b999b8011eea856b846305d8c0512dfdf8fbb1", + "sha256:acdf05d00696bc0447e278bb53cb04ca72354e562cf88ea6f9107df8e7fd9770", + "sha256:aff2e4e06435d61f11a428360a932138d0ec288b0a31dd9bd78d200bd4a2b339", + "sha256:b77ec3c257d7816d9f3700013639db7491a434644c906a2578a11daf13176251", + "sha256:bca54bd347a253af2cf4544bbec232ab982f4868de0dd684246b67a51bc6b1db", + "sha256:be29c4f4810c5789cf10ddf6af80b041c724e629fa51e308a7a0fb19ed1ef7bf", + "sha256:c0075bf773d66fa8c9d41f66cc132ecc75e5bb9dd7cce3cfd14adc5ca184cb95", + "sha256:c144ca294a204c470f18cf4c9d78887810d04a3e2fbb30eea903575a779159df", + "sha256:c5c2a784234c28854878d68978265617aa6dc0780e53d44b4d67f3651a17a9a2", + "sha256:ca592ed634a73ca002967458187109265e980422116c0a107cf93d81f95af945", + "sha256:cab90ac9d3f14b2d5050928483d3d3b8fb6b4018893fc75710e6aa361ecb2474", + "sha256:cc2782eb0f7a16462285b6f8394bbbd0e1ee5f928034e941ffc444012224171b", + "sha256:ce26862344bdf836650ed2487c3d724b00fbfec4233a1013f597b78c1cb73615", + "sha256:ce2ac2675a6aa41ddb2a0c9cbff53780a617ac3d43e620f8fd77ba1c84dcfc06", + "sha256:d1a342c834734edb4be5ecb1e9fb48cb64b1e2320fccbd8c54bf8da8f2a84c33", + "sha256:d4a996adb6904f85894570301939afeee65f072b4fd265ed7e569e8d9058e4ec", + "sha256:d81ac3ae39d38588ad0549e321e6f773a4e7cc68e7751524a22885d5bbadf886", + "sha256:db429c19a6c7e8a1c320e6a13c99799450f411b02251fb1b75e6217cf4a14fcb", + "sha256:df4a81b9b53449ebc90cc4deefb052c1dd934ba85012aa912c7ea7b7e38b60c1", + "sha256:e41671f1594fc4ab0a6dec1351864713cb3a279910ae8b58f884a88a0a632c05", + "sha256:e514326b79e51f0a177daab1052bc164d9d9e54133797a3a58d24c9c87a3fe6d", + "sha256:e53af8cb6a781b02d2ea079b5b853ba9430fcbe18a8e3ce647d5982a3ff69f39", + "sha256:ee6f22b6eaa39297c751d0e80c0d3a454f112f5c6481214fcf4c092074cecd67", + "sha256:eef914c014bf72d18efb55619447e0aecd5fb7c2e3fa7441e2e5d6099bddff7e", + "sha256:f066b437bb3fa39c58ff97ab2ca351db465157d68ed0440abecb21715eb24b28", + "sha256:f1304b085c83067914721e7e9d9917d41ad87696bf70f0bc7dee450e9c71ad0a", + "sha256:f86e5d7cd03afb3a1db8e9f9f6eff15794e79e791350ac48a8c924e6f439f394", + "sha256:fad3b2a085ec259ad2c2842666b2a0a49dea8463579c606426128925af1ed725", + "sha256:fb075ad271405dcad8e2a7ffc9a750a3bf70e533bd86e89f0603e607b93aa64c", + "sha256:fd3e6019dc1261cd0291ee8919dd91fbab7b169bb76aeef6c716833a3f65d206" + ], + "markers": "python_version >= '3.9'", + "version": "==0.3.2" + }, + "proto-plus": { + "hashes": [ + "sha256:13285478c2dcf2abb829db158e1047e2f1e8d63a077d94263c2b88b043c75a66", + "sha256:21a515a4c4c0088a773899e23c7bbade3d18f9c66c73edd4c7ee3816bc96a012" + ], + "markers": "python_version >= '3.7'", + "version": "==1.26.1" + }, + "protobuf": { + "hashes": [ + "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7", + "sha256:1832f0515b62d12d8e6ffc078d7e9eb06969aa6dc13c13e1036e39d73bebc2de", + "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0", + "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862", + "sha256:476cb7b14914c780605a8cf62e38c2a85f8caff2e28a6a0bad827ec7d6c85d68", + "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99", + "sha256:678974e1e3a9b975b8bc2447fca458db5f93a2fb6b0c8db46b6675b5b5346812", + "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e", + "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d", + "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922", + "sha256:fd32223020cb25a2cc100366f1dedc904e2d71d9322403224cdde5fdced0dabe" + ], + "markers": "python_version >= '3.8'", + "version": "==5.29.4" + }, + "psutil": { + "hashes": [ + "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25", + "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e", + "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91", + "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da", + "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34", + "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553", + "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456", + "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17", + "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993", + "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==7.0.0" + }, + "pyarrow": { + "hashes": [ + "sha256:008a4009efdb4ea3d2e18f05cd31f9d43c388aad29c636112c2966605ba33466", + "sha256:0148bb4fc158bfbc3d6dfe5001d93ebeed253793fff4435167f6ce1dc4bddeae", + "sha256:1b93ef2c93e77c442c979b0d596af45e4665d8b96da598db145b0fec014b9136", + "sha256:1c7556165bd38cf0cd992df2636f8bcdd2d4b26916c6b7e646101aff3c16f76f", + "sha256:335d170e050bcc7da867a1ed8ffb8b44c57aaa6e0843b156a501298657b1e972", + "sha256:3bf266b485df66a400f282ac0b6d1b500b9d2ae73314a153dbe97d6d5cc8a99e", + "sha256:41f9706fbe505e0abc10e84bf3a906a1338905cbbcf1177b71486b03e6ea6608", + "sha256:4982f8e2b7afd6dae8608d70ba5bd91699077323f812a0448d8b7abdff6cb5d3", + "sha256:49a3aecb62c1be1d822f8bf629226d4a96418228a42f5b40835c1f10d42e4db6", + "sha256:4d5d1ec7ec5324b98887bdc006f4d2ce534e10e60f7ad995e7875ffa0ff9cb14", + "sha256:58d9397b2e273ef76264b45531e9d552d8ec8a6688b7390b5be44c02a37aade8", + "sha256:5a9137cf7e1640dce4c190551ee69d478f7121b5c6f323553b319cac936395f6", + "sha256:5bd1618ae5e5476b7654c7b55a6364ae87686d4724538c24185bbb2952679960", + "sha256:65cf9feebab489b19cdfcfe4aa82f62147218558d8d3f0fc1e9dea0ab8e7905a", + "sha256:699799f9c80bebcf1da0983ba86d7f289c5a2a5c04b945e2f2bcf7e874a91911", + "sha256:6c5941c1aac89a6c2f2b16cd64fe76bcdb94b2b1e99ca6459de4e6f07638d755", + "sha256:6ebfb5171bb5f4a52319344ebbbecc731af3f021e49318c74f33d520d31ae0c4", + "sha256:7a544ec12de66769612b2d6988c36adc96fb9767ecc8ee0a4d270b10b1c51e00", + "sha256:7c1bca1897c28013db5e4c83944a2ab53231f541b9e0c3f4791206d0c0de389a", + "sha256:80b2ad2b193e7d19e81008a96e313fbd53157945c7be9ac65f44f8937a55427b", + "sha256:8464c9fbe6d94a7fe1599e7e8965f350fd233532868232ab2596a71586c5a429", + "sha256:8f04d49a6b64cf24719c080b3c2029a3a5b16417fd5fd7c4041f94233af732f3", + "sha256:96606c3ba57944d128e8a8399da4812f56c7f61de8c647e3470b417f795d0ef9", + "sha256:99bc1bec6d234359743b01e70d4310d0ab240c3d6b0da7e2a93663b0158616f6", + "sha256:ad76aef7f5f7e4a757fddcdcf010a8290958f09e3470ea458c80d26f4316ae89", + "sha256:b4c4156a625f1e35d6c0b2132635a237708944eb41df5fbe7d50f20d20c17832", + "sha256:b9766a47a9cb56fefe95cb27f535038b5a195707a08bf61b180e642324963b46", + "sha256:c0fe3dbbf054a00d1f162fda94ce236a899ca01123a798c561ba307ca38af5f0", + "sha256:c6cb2335a411b713fdf1e82a752162f72d4a7b5dbc588e32aa18383318b05866", + "sha256:cc55d71898ea30dc95900297d191377caba257612f384207fe9f8293b5850f90", + "sha256:d03c9d6f2a3dffbd62671ca070f13fc527bb1867b4ec2b98c7eeed381d4f389a", + "sha256:d383591f3dcbe545f6cc62daaef9c7cdfe0dff0fb9e1c8121101cabe9098cfa6", + "sha256:d9d46e06846a41ba906ab25302cf0fd522f81aa2a85a71021826f34639ad31ef", + "sha256:d9dedeaf19097a143ed6da37f04f4051aba353c95ef507764d344229b2b740ae", + "sha256:e45274b20e524ae5c39d7fc1ca2aa923aab494776d2d4b316b49ec7572ca324c", + "sha256:ee8dec072569f43835932a3b10c55973593abc00936c202707a4ad06af7cb294", + "sha256:f24faab6ed18f216a37870d8c5623f9c044566d75ec586ef884e13a02a9d62c5", + "sha256:f2a21d39fbdb948857f67eacb5bbaaf36802de044ec36fbef7a1c8f0dd3a4ab2", + "sha256:f3ad4c0eb4e2a9aeb990af6c09e6fa0b195c8c0e7b272ecc8d4d2b6574809d34", + "sha256:fc28912a2dc924dddc2087679cc8b7263accc71b9ff025a1362b004711661a69", + "sha256:fca15aabbe9b8355800d923cc2e82c8ef514af321e18b437c3d782aa884eaeec", + "sha256:fd44d66093a239358d07c42a91eebf5015aa54fccba959db899f932218ac9cc8" + ], + "markers": "python_version >= '3.9'", + "version": "==19.0.1" + }, + "pyasn1": { + "hashes": [ + "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", + "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034" + ], + "markers": "python_version >= '3.8'", + "version": "==0.6.1" + }, + "pyasn1-modules": { + "hashes": [ + "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", + "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6" + ], + "markers": "python_version >= '3.8'", + "version": "==0.4.2" + }, + "pycparser": { + "hashes": [ + "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" + ], + "markers": "python_version >= '3.8'", + "version": "==2.22" + }, + "pydantic": { + "hashes": [ + "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", + "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==2.10.6" + }, + "pydantic-core": { + "hashes": [ + "sha256:00bad2484fa6bda1e216e7345a798bd37c68fb2d97558edd584942aa41b7d278", + "sha256:0296abcb83a797db256b773f45773da397da75a08f5fcaef41f2044adec05f50", + "sha256:03d0f86ea3184a12f41a2d23f7ccb79cdb5a18e06993f8a45baa8dfec746f0e9", + "sha256:044a50963a614ecfae59bb1eaf7ea7efc4bc62f49ed594e18fa1e5d953c40e9f", + "sha256:05e3a55d124407fffba0dd6b0c0cd056d10e983ceb4e5dbd10dda135c31071d6", + "sha256:08e125dbdc505fa69ca7d9c499639ab6407cfa909214d500897d02afb816e7cc", + "sha256:097830ed52fd9e427942ff3b9bc17fab52913b2f50f2880dc4a5611446606a54", + "sha256:0d1e85068e818c73e048fe28cfc769040bb1f475524f4745a5dc621f75ac7630", + "sha256:0d75070718e369e452075a6017fbf187f788e17ed67a3abd47fa934d001863d9", + "sha256:14d4a5c49d2f009d62a2a7140d3064f686d17a5d1a268bc641954ba181880236", + "sha256:172fce187655fece0c90d90a678424b013f8fbb0ca8b036ac266749c09438cb7", + "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", + "sha256:1a4207639fb02ec2dbb76227d7c751a20b1a6b4bc52850568e52260cae64ca3b", + "sha256:1c1fd185014191700554795c99b347d64f2bb637966c4cfc16998a0ca700d048", + "sha256:1e2cb691ed9834cd6a8be61228471d0a503731abfb42f82458ff27be7b2186fc", + "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", + "sha256:220f892729375e2d736b97d0e51466252ad84c51857d4d15f5e9692f9ef12be4", + "sha256:251136cdad0cb722e93732cb45ca5299fb56e1344a833640bf93b2803f8d1bfd", + "sha256:26f0d68d4b235a2bae0c3fc585c585b4ecc51382db0e3ba402a22cbc440915e4", + "sha256:26f32e0adf166a84d0cb63be85c562ca8a6fa8de28e5f0d92250c6b7e9e2aff7", + "sha256:280d219beebb0752699480fe8f1dc61ab6615c2046d76b7ab7ee38858de0a4e7", + "sha256:28ccb213807e037460326424ceb8b5245acb88f32f3d2777427476e1b32c48c4", + "sha256:2bf14caea37e91198329b828eae1618c068dfb8ef17bb33287a7ad4b61ac314e", + "sha256:2d367ca20b2f14095a8f4fa1210f5a7b78b8a20009ecced6b12818f455b1e9fa", + "sha256:30c5f68ded0c36466acede341551106821043e9afaad516adfb6e8fa80a4e6a6", + "sha256:337b443af21d488716f8d0b6164de833e788aa6bd7e3a39c005febc1284f4962", + "sha256:3911ac9284cd8a1792d3cb26a2da18f3ca26c6908cc434a18f730dc0db7bfa3b", + "sha256:3d591580c34f4d731592f0e9fe40f9cc1b430d297eecc70b962e93c5c668f15f", + "sha256:3de3ce3c9ddc8bbd88f6e0e304dea0e66d843ec9de1b0042b0911c1663ffd474", + "sha256:3de9961f2a346257caf0aa508a4da705467f53778e9ef6fe744c038119737ef5", + "sha256:40d02e7d45c9f8af700f3452f329ead92da4c5f4317ca9b896de7ce7199ea459", + "sha256:42c5f762659e47fdb7b16956c71598292f60a03aa92f8b6351504359dbdba6cf", + "sha256:47956ae78b6422cbd46f772f1746799cbb862de838fd8d1fbd34a82e05b0983a", + "sha256:491a2b73db93fab69731eaee494f320faa4e093dbed776be1a829c2eb222c34c", + "sha256:4c9775e339e42e79ec99c441d9730fccf07414af63eac2f0e48e08fd38a64d76", + "sha256:4e0b4220ba5b40d727c7f879eac379b822eee5d8fff418e9d3381ee45b3b0362", + "sha256:50a68f3e3819077be2c98110c1f9dcb3817e93f267ba80a2c05bb4f8799e2ff4", + "sha256:519f29f5213271eeeeb3093f662ba2fd512b91c5f188f3bb7b27bc5973816934", + "sha256:521eb9b7f036c9b6187f0b47318ab0d7ca14bd87f776240b90b21c1f4f149320", + "sha256:57762139821c31847cfb2df63c12f725788bd9f04bc2fb392790959b8f70f118", + "sha256:5e4f4bb20d75e9325cc9696c6802657b58bc1dbbe3022f32cc2b2b632c3fbb96", + "sha256:5e68c4446fe0810e959cdff46ab0a41ce2f2c86d227d96dc3847af0ba7def306", + "sha256:669e193c1c576a58f132e3158f9dfa9662969edb1a250c54d8fa52590045f046", + "sha256:688d3fd9fcb71f41c4c015c023d12a79d1c4c0732ec9eb35d96e3388a120dcf3", + "sha256:6fb4aadc0b9a0c063206846d603b92030eb6f03069151a625667f982887153e2", + "sha256:7041c36f5680c6e0f08d922aed302e98b3745d97fe1589db0a3eebf6624523af", + "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", + "sha256:77d1bca19b0f7021b3a982e6f903dcd5b2b06076def36a652e3907f596e29f67", + "sha256:7969e133a6f183be60e9f6f56bfae753585680f3b7307a8e555a948d443cc05a", + "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", + "sha256:7d0c8399fcc1848491f00e0314bd59fb34a9c008761bcb422a057670c3f65e35", + "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", + "sha256:7e17b560be3c98a8e3aa66ce828bdebb9e9ac6ad5466fba92eb74c4c95cb1151", + "sha256:8083d4e875ebe0b864ffef72a4304827015cff328a1be6e22cc850753bfb122b", + "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", + "sha256:82f986faf4e644ffc189a7f1aafc86e46ef70372bb153e7001e8afccc6e54133", + "sha256:83097677b8e3bd7eaa6775720ec8e0405f1575015a463285a92bfdfe254529ef", + "sha256:85210c4d99a0114f5a9481b44560d7d1e35e32cc5634c656bc48e590b669b145", + "sha256:8c19d1ea0673cd13cc2f872f6c9ab42acc4e4f492a7ca9d3795ce2b112dd7e15", + "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", + "sha256:8e10c99ef58cfdf2a66fc15d66b16c4a04f62bca39db589ae8cba08bc55331bc", + "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", + "sha256:9c3ed807c7b91de05e63930188f19e921d1fe90de6b4f5cd43ee7fcc3525cb8c", + "sha256:9e0c8cfefa0ef83b4da9588448b6d8d2a2bf1a53c3f1ae5fca39eb3061e2f0b0", + "sha256:9fdbe7629b996647b99c01b37f11170a57ae675375b14b8c13b8518b8320ced5", + "sha256:a0fcd29cd6b4e74fe8ddd2c90330fd8edf2e30cb52acda47f06dd615ae72da57", + "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", + "sha256:b0cb791f5b45307caae8810c2023a184c74605ec3bcbb67d13846c28ff731ff8", + "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", + "sha256:bca101c00bff0adb45a833f8451b9105d9df18accb8743b08107d7ada14bd7da", + "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", + "sha256:bec317a27290e2537f922639cafd54990551725fc844249e64c523301d0822fc", + "sha256:c10eb4f1659290b523af58fa7cffb452a61ad6ae5613404519aee4bfbf1df993", + "sha256:c33939a82924da9ed65dab5a65d427205a73181d8098e79b6b426bdf8ad4e656", + "sha256:c61709a844acc6bf0b7dce7daae75195a10aac96a596ea1b776996414791ede4", + "sha256:c70c26d2c99f78b125a3459f8afe1aed4d9687c24fd677c6a4436bc042e50d6c", + "sha256:c817e2b40aba42bac6f457498dacabc568c3b7a986fc9ba7c8d9d260b71485fb", + "sha256:cabb9bcb7e0d97f74df8646f34fc76fbf793b7f6dc2438517d7a9e50eee4f14d", + "sha256:cc3f1a99a4f4f9dd1de4fe0312c114e740b5ddead65bb4102884b384c15d8bc9", + "sha256:cca63613e90d001b9f2f9a9ceb276c308bfa2a43fafb75c8031c4f66039e8c6e", + "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", + "sha256:d2088237af596f0a524d3afc39ab3b036e8adb054ee57cbb1dcf8e09da5b29cc", + "sha256:d262606bf386a5ba0b0af3b97f37c83d7011439e3dc1a9298f21efb292e42f1a", + "sha256:d2d63f1215638d28221f664596b1ccb3944f6e25dd18cd3b86b0a4c408d5ebb9", + "sha256:d3e8d504bdd3f10835468f29008d72fc8359d95c9c415ce6e767203db6127506", + "sha256:d4041c0b966a84b4ae7a09832eb691a35aec90910cd2dbe7a208de59be77965b", + "sha256:d716e2e30c6f140d7560ef1538953a5cd1a87264c737643d481f2779fc247fe1", + "sha256:d81d2068e1c1228a565af076598f9e7451712700b673de8f502f0334f281387d", + "sha256:d9640b0059ff4f14d1f37321b94061c6db164fbe49b334b31643e0528d100d99", + "sha256:de3cd1899e2c279b140adde9357c4495ed9d47131b4a4eaff9052f23398076b3", + "sha256:e0fd26b16394ead34a424eecf8a31a1f5137094cabe84a1bcb10fa6ba39d3d31", + "sha256:e2bb4d3e5873c37bb3dd58714d4cd0b0e6238cebc4177ac8fe878f8b3aa8e74c", + "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", + "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", + "sha256:ef592d4bad47296fb11f96cd7dc898b92e795032b4894dfb4076cfccd43a9308", + "sha256:f141ee28a0ad2123b6611b6ceff018039df17f32ada8b534e6aa039545a3efb2", + "sha256:f66d89ba397d92f840f8654756196d93804278457b5fbede59598a1f9f90b228", + "sha256:f6f8e111843bbb0dee4cb6594cdc73e79b3329b526037ec242a3e49012495b3b", + "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", + "sha256:fd1aea04935a508f62e0d0ef1f5ae968774a32afc306fb8545e06f5ff5cdf3ad" + ], + "markers": "python_version >= '3.8'", + "version": "==2.27.2" + }, + "pydantic-settings": { + "hashes": [ + "sha256:06f0062169818d0f5524420a360d632d5857b83cffd4d42fe29597807a1614ee", + "sha256:a60952460b99cf661dc25c29c0ef171721f98bfcb52ef8d9ea4c943d7c8cc796" + ], + "markers": "python_version >= '3.9'", + "version": "==2.10.1" + }, + "pygments": { + "hashes": [ + "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", + "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" + ], + "markers": "python_version >= '3.8'", + "version": "==2.19.2" + }, + "pymupdf": { + "hashes": [ + "sha256:5a35e2725fae0ab57f058dff77615c15eb5961eac50ba04f41ebc792cd8facad", + "sha256:5f96311cacd13254c905f6654a004a0a2025b71cabc04fda667f5472f72c15a0", + "sha256:65e18ddb37fe8ec4edcdbebe9be3a8486b6a2f42609d0a142677e42f3a0614f8", + "sha256:6ed7fc25271004d6d3279c20a80cb2bb4cda3efa9f9088dcc07cd790eca0bc63", + "sha256:7f44bc3d03ea45b2f68c96464f96105e8c7908896f2fb5e8c04f1fb8dae7981e", + "sha256:cde4e1c9cfb09c0e1e9c2b7f4b787dd6bb34a32cfe141a4675e24af7c0c25dd3", + "sha256:d94b800e9501929c42283d39bc241001dd87fdeea297b5cb40d5b5714534452f", + "sha256:ee22155d3a634642d76553204867d862ae1bdd9f7cf70c0797d8127ebee6bed5" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==1.25.5" + }, + "pypandoc": { + "hashes": [ + "sha256:4ededcc76c8770f27aaca6dff47724578428eca84212a31479403a9731fc2b16", + "sha256:ea25beebe712ae41d63f7410c08741a3cab0e420f6703f95bc9b3a749192ce13" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==1.15" + }, + "pypandoc-binary": { + "hashes": [ + "sha256:12a43df66f59cb489a9a2659b6f049ec103132e43e4f284b7e33e7ae4dd9cadb", + "sha256:79b215279a6470d3e2a24135826b446f44259f6abce361e31d713ac1b0b5aa69", + "sha256:de7a234ffb674a4e650490acc7a5986161e2fd8b5bb106f1c9ffc30d76d2cf23", + "sha256:df54edb00331a8fc80516c71cd81de69954512163037c3d4577c315091a0d6f6", + "sha256:e465a09e8aac18e8fda37516a6d1a891e51cdd1d066ab585f85a81620de575e2", + "sha256:f9ebdf92059e9c1ae5231ee193d1fdafbc0188d5ec9d5f53e95fa21a42339481", + "sha256:fa29176f4eb9eb93f555dac6926a8d53c6ab4fd2deba3a1edb002e04899b237d" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==1.15" + }, + "pyparsing": { + "hashes": [ + "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", + "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be" + ], + "markers": "python_version >= '3.9'", + "version": "==3.2.3" + }, + "pypdf": { + "hashes": [ + "sha256:30f67a614d558e495e1fbb157ba58c1de91ffc1718f5e0dfeb82a029233890a1", + "sha256:be10a4c54202f46d9daceaa8788be07aa8cd5ea8c25c529c50dd509206382c35" + ], + "markers": "python_version >= '3.8'", + "version": "==5.9.0" + }, + "pypdf2": { + "hashes": [ + "sha256:a74408f69ba6271f71b9352ef4ed03dc53a31aa404d29b5d31f53bfecfee1440", + "sha256:d16e4205cfee272fbdc0568b68d82be796540b1537508cef59388f839c191928" + ], + "index": "pypi", + "markers": "python_version >= '3.6'", + "version": "==3.0.1" + }, + "pypdfium2": { + "hashes": [ + "sha256:0dfa61421b5eb68e1188b0b2231e7ba35735aef2d867d86e48ee6cab6975195e", + "sha256:119b2969a6d6b1e8d55e99caaf05290294f2d0fe49c12a3f17102d01c441bd29", + "sha256:3d0dd3ecaffd0b6dbda3da663220e705cb563918249bda26058c6036752ba3a2", + "sha256:48b5b7e5566665bc1015b9d69c1ebabe21f6aee468b509531c3c8318eeee2e16", + "sha256:4e55689f4b06e2d2406203e771f78789bd4f190731b5d57383d05cf611d829de", + "sha256:4e6e50f5ce7f65a40a33d7c9edc39f23140c57e37144c2d6d9e9262a2a854854", + "sha256:5eda3641a2da7a7a0b2f4dbd71d706401a656fea521b6b6faa0675b15d31a163", + "sha256:90dbb2ac07be53219f56be09961eb95cf2473f834d01a42d901d13ccfad64b4c", + "sha256:b33ceded0b6ff5b2b93bc1fe0ad4b71aa6b7e7bd5875f1ca0cdfb6ba6ac01aab", + "sha256:cc3bf29b0db8c76cdfaac1ec1cde8edf211a7de7390fbf8934ad2aa9b4d6dfad", + "sha256:ee2410f15d576d976c2ab2558c93d392a25fb9f6635e8dd0a8a3a5241b275e0e", + "sha256:f1f78d2189e0ddf9ac2b7a9b9bd4f0c66f54d1389ff6c17e9fd9dc034d06eb3f", + "sha256:f33bd79e7a09d5f7acca3b0b69ff6c8a488869a7fab48fdf400fec6e20b9c8be" + ], + "markers": "python_version >= '3.6'", + "version": "==4.30.0" + }, + "python-dateutil": { + "hashes": [ + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==2.9.0.post0" + }, + "python-docx": { + "hashes": [ + "sha256:3fd478f3250fbbbfd3b94fe1e985955737c145627498896a8a6bf81f4baf66c7", + "sha256:7bc9d7b7d8a69c9c02ca09216118c86552704edc23bac179283f2e38f86220ce" + ], + "version": "==1.2.0" + }, + "python-dotenv": { + "hashes": [ + "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca", + "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.0.1" + }, + "python-iso639": { + "hashes": [ + "sha256:34e31e8e76eb3fc839629e257b12bcfd957c6edcbd486bbf66ba5185d1f566e8", + "sha256:b2d471c37483a26f19248458b20e7bd96492e15368b01053b540126bcc23152f" + ], + "markers": "python_version >= '3.9'", + "version": "==2025.2.18" + }, + "python-magic": { + "hashes": [ + "sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b", + "sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3" + ], + "index": "pypi", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==0.4.27" + }, + "python-multipart": { + "hashes": [ + "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104", + "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13" + ], + "markers": "python_version >= '3.8'", + "version": "==0.0.20" + }, + "python-oxmsg": { + "hashes": [ + "sha256:22be29b14c46016bcd05e34abddfd8e05ee82082f53b82753d115da3fc7d0355", + "sha256:a6aff4deb1b5975d44d49dab1d9384089ffeec819e19c6940bc7ffbc84775fad" + ], + "markers": "python_version >= '3.9'", + "version": "==0.0.2" + }, + "python-pptx": { + "hashes": [ + "sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba", + "sha256:479a8af0eaf0f0d76b6f00b0887732874ad2e3188230315290cd1f9dd9cc7095" + ], + "version": "==1.0.2" + }, + "python-ulid": { + "hashes": [ + "sha256:e4c4942ff50dbd79167ad01ac725ec58f924b4018025ce22c858bfcff99a5e31", + "sha256:e50296a47dc8209d28629a22fc81ca26c00982c78934bd7766377ba37ea49a9f" + ], + "markers": "python_version >= '3.9'", + "version": "==3.0.0" + }, + "pytz": { + "hashes": [ + "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", + "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00" + ], + "version": "==2025.2" + }, + "pyyaml": { + "hashes": [ + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" + ], + "markers": "python_version >= '3.8'", + "version": "==6.0.2" + }, + "ragas": { + "hashes": [ + "sha256:874ebe9f4e04d83f88b7fded35cc2fe849e7dec2cff824db39c686faca8bb6e2", + "sha256:a438d93cee9eccdcfb749ab741cb36438ab69e8903684b6fb39ad24b6241d1cb" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.2.14" + }, + "rapidfuzz": { + "hashes": [ + "sha256:09e908064d3684c541d312bd4c7b05acb99a2c764f6231bd507d4b4b65226c23", + "sha256:0da54aa8547b3c2c188db3d1c7eb4d1bb6dd80baa8cdaeaec3d1da3346ec9caa", + "sha256:0e1d08cb884805a543f2de1f6744069495ef527e279e05370dd7c83416af83f8", + "sha256:0fd05336db4d0b8348d7eaaf6fa3c517b11a56abaa5e89470ce1714e73e4aca7", + "sha256:11b125d8edd67e767b2295eac6eb9afe0b1cdc82ea3d4b9257da4b8e06077798", + "sha256:11b47b40650e06147dee5e51a9c9ad73bb7b86968b6f7d30e503b9f8dd1292db", + "sha256:1343d745fbf4688e412d8f398c6e6d6f269db99a54456873f232ba2e7aeb4939", + "sha256:1a79a2f07786a2070669b4b8e45bd96a01c788e7a3c218f531f3947878e0f956", + "sha256:1ba007f4d35a45ee68656b2eb83b8715e11d0f90e5b9f02d615a8a321ff00c27", + "sha256:1dc82b6ed01acb536b94a43996a94471a218f4d89f3fdd9185ab496de4b2a981", + "sha256:1f219f1e3c3194d7a7de222f54450ce12bc907862ff9a8962d83061c1f923c86", + "sha256:200030dfc0a1d5d6ac18e993c5097c870c97c41574e67f227300a1fb74457b1d", + "sha256:202a87760f5145140d56153b193a797ae9338f7939eb16652dd7ff96f8faf64c", + "sha256:25343ccc589a4579fbde832e6a1e27258bfdd7f2eb0f28cb836d6694ab8591fc", + "sha256:2d18228a2390375cf45726ce1af9d36ff3dc1f11dce9775eae1f1b13ac6ec50f", + "sha256:2fd0975e015b05c79a97f38883a11236f5a24cca83aa992bd2558ceaa5652b26", + "sha256:30fd1451f87ccb6c2f9d18f6caa483116bbb57b5a55d04d3ddbd7b86f5b14998", + "sha256:3abe6a4e8eb4cfc4cda04dd650a2dc6d2934cbdeda5def7e6fd1c20f6e7d2a0b", + "sha256:3b6f913ee4618ddb6d6f3e387b76e8ec2fc5efee313a128809fbd44e65c2bbb2", + "sha256:3f32f15bacd1838c929b35c84b43618481e1b3d7a61b5ed2db0291b70ae88b53", + "sha256:435071fd07a085ecbf4d28702a66fd2e676a03369ee497cc38bcb69a46bc77e2", + "sha256:45dd4628dd9c21acc5c97627dad0bb791764feea81436fb6e0a06eef4c6dceaa", + "sha256:461fd13250a2adf8e90ca9a0e1e166515cbcaa5e9c3b1f37545cbbeff9e77f6b", + "sha256:4671ee300d1818d7bdfd8fa0608580d7778ba701817216f0c17fb29e6b972514", + "sha256:48719f7dcf62dfb181063b60ee2d0a39d327fa8ad81b05e3e510680c44e1c078", + "sha256:4a1a6a906ba62f2556372282b1ef37b26bca67e3d2ea957277cfcefc6275cca7", + "sha256:4d9d7f84c8e992a8dbe5a3fdbea73d733da39bf464e62c912ac3ceba9c0cff93", + "sha256:5158da7f2ec02a930be13bac53bb5903527c073c90ee37804090614cab83c29e", + "sha256:5280be8fd7e2bee5822e254fe0a5763aa0ad57054b85a32a3d9970e9b09bbcbf", + "sha256:5435fcac94c9ecf0504bf88a8a60c55482c32e18e108d6079a0089c47f3f8cf6", + "sha256:558bf526bcd777de32b7885790a95a9548ffdcce68f704a81207be4a286c1095", + "sha256:573ad267eb9b3f6e9b04febce5de55d8538a87c56c64bf8fd2599a48dc9d8b77", + "sha256:57c390336cb50d5d3bfb0cfe1467478a15733703af61f6dffb14b1cd312a6fae", + "sha256:5d4e13593d298c50c4f94ce453f757b4b398af3fa0fd2fde693c3e51195b7f69", + "sha256:5dc71ef23845bb6b62d194c39a97bb30ff171389c9812d83030c1199f319098c", + "sha256:624a108122039af89ddda1a2b7ab2a11abe60c1521956f142f5d11bcd42ef138", + "sha256:65cc97c2fc2c2fe23586599686f3b1ceeedeca8e598cfcc1b7e56dc8ca7e2aa7", + "sha256:694eb531889f71022b2be86f625a4209c4049e74be9ca836919b9e395d5e33b3", + "sha256:6af42f2ede8b596a6aaf6d49fdee3066ca578f4856b85ab5c1e2145de367a12d", + "sha256:6c0efa73afbc5b265aca0d8a467ae2a3f40d6854cbe1481cb442a62b7bf23c99", + "sha256:6e2065f68fb1d0bf65adc289c1bdc45ba7e464e406b319d67bb54441a1b9da9e", + "sha256:7ac21489de962a4e2fc1e8f0b0da4aa1adc6ab9512fd845563fecb4b4c52093a", + "sha256:7d7cec4242d30dd521ef91c0df872e14449d1dffc2a6990ede33943b0dae56c3", + "sha256:85c9a131a44a95f9cac2eb6e65531db014e09d89c4f18c7b1fa54979cb9ff1f3", + "sha256:8c99b76b93f7b495eee7dcb0d6a38fb3ce91e72e99d9f78faa5664a881cb2b7d", + "sha256:9093cdeb926deb32a4887ebe6910f57fbcdbc9fbfa52252c10b56ef2efb0289f", + "sha256:9256218ac8f1a957806ec2fb9a6ddfc6c32ea937c0429e88cf16362a20ed8602", + "sha256:9327a4577f65fc3fb712e79f78233815b8a1c94433d0c2c9f6bc5953018b3565", + "sha256:93a755266856599be4ab6346273f192acde3102d7aa0735e2f48b456397a041f", + "sha256:98b8107ff14f5af0243f27d236bcc6e1ef8e7e3b3c25df114e91e3a99572da73", + "sha256:98e0bfa602e1942d542de077baf15d658bd9d5dcfe9b762aff791724c1c38b70", + "sha256:9a7c6232be5f809cd39da30ee5d24e6cadd919831e6020ec6c2391f4c3bc9264", + "sha256:9f338e71c45b69a482de8b11bf4a029993230760120c8c6e7c9b71760b6825a1", + "sha256:9f5fe634c9482ec5d4a6692afb8c45d370ae86755e5f57aa6c50bfe4ca2bdd87", + "sha256:a50856f49a4016ef56edd10caabdaf3608993f9faf1e05c3c7f4beeac46bd12a", + "sha256:a6dd36d4916cf57ddb05286ed40b09d034ca5d4bca85c17be0cb6a21290597d9", + "sha256:a9ad1f37894e3ffb76bbab76256e8a8b789657183870be11aa64e306bb5228fd", + "sha256:aafc42a1dc5e1beeba52cd83baa41372228d6d8266f6d803c16dbabbcc156255", + "sha256:adb40ca8ddfcd4edd07b0713a860be32bdf632687f656963bcbce84cea04b8d8", + "sha256:ae4574cb66cf1e85d32bb7e9ec45af5409c5b3970b7ceb8dea90168024127566", + "sha256:b1b065f370d54551dcc785c6f9eeb5bd517ae14c983d2784c064b3aa525896df", + "sha256:b5104b62711565e0ff6deab2a8f5dbf1fbe333c5155abe26d2cfd6f1849b6c87", + "sha256:b7b3eda607a019169f7187328a8d1648fb9a90265087f6903d7ee3a8eee01805", + "sha256:b7f4c65facdb94f44be759bbd9b6dda1fa54d0d6169cdf1a209a5ab97d311a75", + "sha256:b836f486dba0aceb2551e838ff3f514a38ee72b015364f739e526d720fdb823a", + "sha256:bef86df6d59667d9655905b02770a0c776d2853971c0773767d5ef8077acd624", + "sha256:c2b3dd5d206a12deca16870acc0d6e5036abeb70e3cad6549c294eff15591527", + "sha256:c33f9c841630b2bb7e69a3fb5c84a854075bb812c47620978bddc591f764da3d", + "sha256:c523620d14ebd03a8d473c89e05fa1ae152821920c3ff78b839218ff69e19ca3", + "sha256:cc269e74cad6043cb8a46d0ce580031ab642b5930562c2bb79aa7fbf9c858d26", + "sha256:cc64da907114d7a18b5e589057e3acaf2fec723d31c49e13fedf043592a3f6a7", + "sha256:ccbd0e7ea1a216315f63ffdc7cd09c55f57851afc8fe59a74184cb7316c0598b", + "sha256:cdb33ee9f8a8e4742c6b268fa6bd739024f34651a06b26913381b1413ebe7590", + "sha256:cfcccc08f671646ccb1e413c773bb92e7bba789e3a1796fd49d23c12539fe2e4", + "sha256:d21f188f6fe4fbf422e647ae9d5a68671d00218e187f91859c963d0738ccd88c", + "sha256:d25fdbce6459ccbbbf23b4b044f56fbd1158b97ac50994eaae2a1c0baae78301", + "sha256:d2eaf3839e52cbcc0accbe9817a67b4b0fcf70aaeb229cfddc1c28061f9ce5d8", + "sha256:d395a5cad0c09c7f096433e5fd4224d83b53298d53499945a9b0e5a971a84f3a", + "sha256:d7a217310429b43be95b3b8ad7f8fc41aba341109dc91e978cd7c703f928c58f", + "sha256:d8cf5f7cd6e4d5eb272baf6a54e182b2c237548d048e2882258336533f3f02b7", + "sha256:df8e8c21e67afb9d7fbe18f42c6111fe155e801ab103c81109a61312927cc611", + "sha256:e05752418b24bbd411841b256344c26f57da1148c5509e34ea39c7eb5099ab72", + "sha256:e1bdd2e6d0c5f9706ef7595773a81ca2b40f3b33fd7f9840b726fb00c6c4eb2e", + "sha256:e297c09972698c95649e89121e3550cee761ca3640cd005e24aaa2619175464e", + "sha256:e62779c6371bd2b21dbd1fdce89eaec2d93fd98179d36f61130b489f62294a92", + "sha256:e8ddb58961401da7d6f55f185512c0d6bd24f529a637078d41dd8ffa5a49c107", + "sha256:e9d824de871daa6e443b39ff495a884931970d567eb0dfa213d234337343835f", + "sha256:ed6f416bda1c9133000009d84d9409823eb2358df0950231cc936e4bf784eb97", + "sha256:ef0f5f03f61b0e5a57b1df7beafd83df993fd5811a09871bad6038d08e526d0d", + "sha256:f4797f821dc5d7c2b6fc818b89f8a3f37bcc900dd9e4369e6ebf1e525efce5db", + "sha256:f70f646751b6aa9d05be1fb40372f006cc89d6aad54e9d79ae97bd1f5fce5203", + "sha256:fd742c03885db1fce798a1cd87a20f47f144ccf26d75d52feb6f2bae3d57af05", + "sha256:fe5790a36d33a5d0a6a1f802aa42ecae282bf29ac6f7506d8e12510847b82a45", + "sha256:fedd316c165beed6307bf754dee54d3faca2c47e1f3bcbd67595001dfa11e969" + ], + "markers": "python_version >= '3.9'", + "version": "==3.13.0" + }, + "referencing": { + "hashes": [ + "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa", + "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0" + ], + "markers": "python_version >= '3.9'", + "version": "==0.36.2" + }, + "regex": { + "hashes": [ + "sha256:95b4639c77d414efa93c8de14ce3f7965a94d007e068a94f9d4997bb9bd9c81f", + "sha256:9ead9765217afd04a86822dfcd4ed2747dfe426e887da413b15ff0ac2457e21a", + "sha256:d856164d25e2b3b07b779bfed813eb4b6b6ce73c2fd818d46f47c1eb5cd79bd6" + ], + "markers": "python_version >= '3.9'", + "version": "==2025.7.34" + }, + "requests": { + "hashes": [ + "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", + "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422" + ], + "markers": "python_version >= '3.8'", + "version": "==2.32.4" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", + "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9" + ], + "markers": "python_version >= '3.4'", + "version": "==2.0.0" + }, + "requests-toolbelt": { + "hashes": [ + "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", + "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.0.0" + }, + "rich": { + "hashes": [ + "sha256:536f5f1785986d6dbdea3c75205c473f970777b4a0d6c6dd1b696aa05a3fa04f", + "sha256:e497a48b844b0320d45007cdebfeaeed8db2a4f4bcf49f15e455cfc4af11eaa8" + ], + "markers": "python_full_version >= '3.8.0'", + "version": "==14.1.0" + }, + "rouge-score": { + "hashes": [ + "sha256:c7d4da2683e68c9abf0135ef915d63a46643666f848e558a1b9f7ead17ff0f04" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==0.1.2" + }, + "rpds-py": { + "hashes": [ + "sha256:010c4843a3b92b54373e3d2291a7447d6c3fc29f591772cc2ea0e9f5c1da434b", + "sha256:05284439ebe7d9f5f5a668d4d8a0a1d851d16f7d47c78e1fab968c8ad30cab04", + "sha256:0665be515767dc727ffa5f74bd2ef60b0ff85dad6bb8f50d91eaa6b5fb226f51", + "sha256:069e0384a54f427bd65d7fda83b68a90606a3835901aaff42185fcd94f5a9295", + "sha256:08680820d23df1df0a0260f714d12966bc6c42d02e8055a91d61e03f0c47dda0", + "sha256:0954e3a92e1d62e83a54ea7b3fdc9efa5d61acef8488a8a3d31fdafbfb00460d", + "sha256:09965b314091829b378b60607022048953e25f0b396c2b70e7c4c81bcecf932e", + "sha256:0c431bfb91478d7cbe368d0a699978050d3b112d7f1d440a41e90faa325557fd", + "sha256:0f401c369186a5743694dd9fc08cba66cf70908757552e1f714bfc5219c655b5", + "sha256:0f4f69d7a4300fbf91efb1fb4916421bd57804c01ab938ab50ac9c4aa2212f03", + "sha256:11e8e28c0ba0373d052818b600474cfee2fafa6c9f36c8587d217b13ee28ca7d", + "sha256:130c1ffa5039a333f5926b09e346ab335f0d4ec393b030a18549a7c7e7c2cea4", + "sha256:1321bce595ad70e80f97f998db37356b2e22cf98094eba6fe91782e626da2f71", + "sha256:13bbc4846ae4c993f07c93feb21a24d8ec637573d567a924b1001e81c8ae80f9", + "sha256:14f028eb47f59e9169bfdf9f7ceafd29dd64902141840633683d0bad5b04ff34", + "sha256:15ea4d2e182345dd1b4286593601d766411b43f868924afe297570658c31a62b", + "sha256:181bc29e59e5e5e6e9d63b143ff4d5191224d355e246b5a48c88ce6b35c4e466", + "sha256:183f5e221ba3e283cd36fdfbe311d95cd87699a083330b4f792543987167eff1", + "sha256:184f0d7b342967f6cda94a07d0e1fae177d11d0b8f17d73e06e36ac02889f303", + "sha256:190d7285cd3bb6d31d37a0534d7359c1ee191eb194c511c301f32a4afa5a1dd4", + "sha256:19c990fdf5acecbf0623e906ae2e09ce1c58947197f9bced6bbd7482662231c4", + "sha256:1d66f45b9399036e890fb9c04e9f70c33857fd8f58ac8db9f3278cfa835440c3", + "sha256:203f581accef67300a942e49a37d74c12ceeef4514874c7cede21b012613ca2c", + "sha256:20e222a44ae9f507d0f2678ee3dd0c45ec1e930f6875d99b8459631c24058aec", + "sha256:2406d034635d1497c596c40c85f86ecf2bf9611c1df73d14078af8444fe48031", + "sha256:249ab91ceaa6b41abc5f19513cb95b45c6f956f6b89f1fe3d99c81255a849f9e", + "sha256:25a4aebf8ca02bbb90a9b3e7a463bbf3bee02ab1c446840ca07b1695a68ce424", + "sha256:27bac29bbbf39601b2aab474daf99dbc8e7176ca3389237a23944b17f8913d97", + "sha256:299a245537e697f28a7511d01038c310ac74e8ea213c0019e1fc65f52c0dcb23", + "sha256:2cff9bdd6c7b906cc562a505c04a57d92e82d37200027e8d362518df427f96cd", + "sha256:2e307cb5f66c59ede95c00e93cd84190a5b7f3533d7953690b2036780622ba81", + "sha256:2e39169ac6aae06dd79c07c8a69d9da867cef6a6d7883a0186b46bb46ccfb0c3", + "sha256:2fe6e18e5c8581f0361b35ae575043c7029d0a92cb3429e6e596c2cdde251432", + "sha256:3001013dae10f806380ba739d40dee11db1ecb91684febb8406a87c2ded23dae", + "sha256:32196b5a99821476537b3f7732432d64d93a58d680a52c5e12a190ee0135d8b5", + "sha256:33ba649a6e55ae3808e4c39e01580dc9a9b0d5b02e77b66bb86ef117922b1264", + "sha256:341d8acb6724c0c17bdf714319c393bb27f6d23d39bc74f94221b3e59fc31828", + "sha256:343cf24de9ed6c728abefc5d5c851d5de06497caa7ac37e5e65dd572921ed1b5", + "sha256:36184b44bf60a480863e51021c26aca3dfe8dd2f5eeabb33622b132b9d8b8b54", + "sha256:3841f66c1ffdc6cebce8aed64e36db71466f1dc23c0d9a5592e2a782a3042c79", + "sha256:4045e2fc4b37ec4b48e8907a5819bdd3380708c139d7cc358f03a3653abedb89", + "sha256:419dd9c98bcc9fb0242be89e0c6e922df333b975d4268faa90d58499fd9c9ebe", + "sha256:42894616da0fc0dcb2ec08a77896c3f56e9cb2f4b66acd76fc8992c3557ceb1c", + "sha256:42ccc57ff99166a55a59d8c7d14f1a357b7749f9ed3584df74053fd098243451", + "sha256:4300e15e7d03660f04be84a125d1bdd0e6b2f674bc0723bc0fd0122f1a4585dc", + "sha256:443d239d02d9ae55b74015234f2cd8eb09e59fbba30bf60baeb3123ad4c6d5ff", + "sha256:44524b96481a4c9b8e6c46d6afe43fa1fb485c261e359fbe32b63ff60e3884d8", + "sha256:45d04a73c54b6a5fd2bab91a4b5bc8b426949586e61340e212a8484919183859", + "sha256:46f48482c1a4748ab2773f75fffbdd1951eb59794e32788834b945da857c47a8", + "sha256:4790c9d5dd565ddb3e9f656092f57268951398cef52e364c405ed3112dc7c7c1", + "sha256:4bc262ace5a1a7dc3e2eac2fa97b8257ae795389f688b5adf22c5db1e2431c43", + "sha256:4c3f8a0d4802df34fcdbeb3dfe3a4d8c9a530baea8fafdf80816fcaac5379d83", + "sha256:5355527adaa713ab693cbce7c1e0ec71682f599f61b128cf19d07e5c13c9b1f1", + "sha256:555ed147cbe8c8f76e72a4c6cd3b7b761cbf9987891b9448808148204aed74a5", + "sha256:55d42a0ef2bdf6bc81e1cc2d49d12460f63c6ae1423c4f4851b828e454ccf6f1", + "sha256:59195dc244fc183209cf8a93406889cadde47dfd2f0a6b137783aa9c56d67c85", + "sha256:59714ab0a5af25d723d8e9816638faf7f4254234decb7d212715c1aa71eee7be", + "sha256:5b3a5c8089eed498a3af23ce87a80805ff98f6ef8f7bdb70bd1b7dae5105f6ac", + "sha256:5d6790ff400254137b81b8053b34417e2c46921e302d655181d55ea46df58cf7", + "sha256:5df559e9e7644d9042f626f2c3997b555f347d7a855a15f170b253f6c5bfe358", + "sha256:5fa01b3d5e3b7d97efab65bd3d88f164e289ec323a8c033c5c38e53ee25c007e", + "sha256:61490d57e82e23b45c66f96184237994bfafa914433b8cd1a9bb57fecfced59d", + "sha256:6168af0be75bba990a39f9431cdfae5f0ad501f4af32ae62e8856307200517b8", + "sha256:64a0fe3f334a40b989812de70160de6b0ec7e3c9e4a04c0bbc48d97c5d3600ae", + "sha256:64f689ab822f9b5eb6dfc69893b4b9366db1d2420f7db1f6a2adf2a9ca15ad64", + "sha256:699c346abc73993962cac7bb4f02f58e438840fa5458a048d3a178a7a670ba86", + "sha256:6b96b0b784fe5fd03beffff2b1533dc0d85e92bab8d1b2c24ef3a5dc8fac5669", + "sha256:6bde37765564cd22a676dd8101b657839a1854cfaa9c382c5abf6ff7accfd4ae", + "sha256:6c135708e987f46053e0a1246a206f53717f9fadfba27174a9769ad4befba5c3", + "sha256:6c27a7054b5224710fcfb1a626ec3ff4f28bcb89b899148c72873b18210e446b", + "sha256:6de6a7f622860af0146cb9ee148682ff4d0cea0b8fd3ad51ce4d40efb2f061d0", + "sha256:737005088449ddd3b3df5a95476ee1c2c5c669f5c30eed909548a92939c0e12d", + "sha256:7451ede3560086abe1aa27dcdcf55cd15c96b56f543fb12e5826eee6f721f858", + "sha256:7873b65686a6471c0037139aa000d23fe94628e0daaa27b6e40607c90e3f5ec4", + "sha256:79af163a4b40bbd8cfd7ca86ec8b54b81121d3b213b4435ea27d6568bcba3e9d", + "sha256:7aed8118ae20515974650d08eb724150dc2e20c2814bcc307089569995e88a14", + "sha256:7cf9bc4508efb18d8dff6934b602324eb9f8c6644749627ce001d6f38a490889", + "sha256:7e57906e38583a2cba67046a09c2637e23297618dc1f3caddbc493f2be97c93f", + "sha256:7ec85994f96a58cf7ed288caa344b7fe31fd1d503bdf13d7331ead5f70ab60d5", + "sha256:81f81bbd7cdb4bdc418c09a73809abeda8f263a6bf8f9c7f93ed98b5597af39d", + "sha256:86aca1616922b40d8ac1b3073a1ead4255a2f13405e5700c01f7c8d29a03972d", + "sha256:88051c3b7d5325409f433c5a40328fcb0685fc04e5db49ff936e910901d10114", + "sha256:887ab1f12b0d227e9260558a4a2320024b20102207ada65c43e1ffc4546df72e", + "sha256:8a06aa1197ec0281eb1d7daf6073e199eb832fe591ffa329b88bae28f25f5fe5", + "sha256:8a1dca5507fa1337f75dcd5070218b20bc68cf8844271c923c1b79dfcbc20391", + "sha256:8b23cf252f180cda89220b378d917180f29d313cd6a07b2431c0d3b776aae86f", + "sha256:8d0e09cf4863c74106b5265c2c310f36146e2b445ff7b3018a56799f28f39f6f", + "sha256:8de567dec6d451649a781633d36f5c7501711adee329d76c095be2178855b042", + "sha256:90fb790138c1a89a2e58c9282fe1089638401f2f3b8dddd758499041bc6e0774", + "sha256:92f3b3ec3e6008a1fe00b7c0946a170f161ac00645cde35e3c9a68c2475e8156", + "sha256:935afcdea4751b0ac918047a2df3f720212892347767aea28f5b3bf7be4f27c0", + "sha256:9a0ff7ee28583ab30a52f371b40f54e7138c52ca67f8ca17ccb7ccf0b383cb5f", + "sha256:9ad08547995a57e74fea6abaf5940d399447935faebbd2612b3b0ca6f987946b", + "sha256:9b2a4e17bfd68536c3b801800941c95a1d4a06e3cada11c146093ba939d9638d", + "sha256:9b78430703cfcf5f5e86eb74027a1ed03a93509273d7c705babb547f03e60016", + "sha256:9d0f92b78cfc3b74a42239fdd8c1266f4715b573204c234d2f9fc3fc7a24f185", + "sha256:9da162b718b12c4219eeeeb68a5b7552fbc7aadedf2efee440f88b9c0e54b45d", + "sha256:a00c91104c173c9043bc46f7b30ee5e6d2f6b1149f11f545580f5d6fdff42c0b", + "sha256:a029be818059870664157194e46ce0e995082ac49926f1423c1f058534d2aaa9", + "sha256:a1b3db5fae5cbce2131b7420a3f83553d4d89514c03d67804ced36161fe8b6b2", + "sha256:a4cf32a26fa744101b67bfd28c55d992cd19438aff611a46cac7f066afca8fd4", + "sha256:aa0bf113d15e8abdfee92aa4db86761b709a09954083afcb5bf0f952d6065fdb", + "sha256:ab47fe727c13c09d0e6f508e3a49e545008e23bf762a245b020391b621f5b726", + "sha256:af22763a0a1eff106426a6e1f13c4582e0d0ad89c1493ab6c058236174cd6c6a", + "sha256:af9d4fd79ee1cc8e7caf693ee02737daabfc0fcf2773ca0a4735b356c8ad6f7c", + "sha256:b1fef1f13c842a39a03409e30ca0bf87b39a1e2a305a9924deadb75a43105d23", + "sha256:b2eff8ee57c5996b0d2a07c3601fb4ce5fbc37547344a26945dd9e5cbd1ed27a", + "sha256:b4c4fbbcff474e1e5f38be1bf04511c03d492d42eec0babda5d03af3b5589374", + "sha256:b8a4131698b6992b2a56015f51646711ec5d893a0b314a4b985477868e240c87", + "sha256:b8a7acf04fda1f30f1007f3cc96d29d8cf0a53e626e4e1655fdf4eabc082d367", + "sha256:ba783541be46f27c8faea5a6645e193943c17ea2f0ffe593639d906a327a9bcc", + "sha256:be0744661afbc4099fef7f4e604e7f1ea1be1dd7284f357924af12a705cc7d5c", + "sha256:be3964f7312ea05ed283b20f87cb533fdc555b2e428cc7be64612c0b2124f08c", + "sha256:be806e2961cd390a89d6c3ce8c2ae34271cfcd05660f716257838bb560f1c3b6", + "sha256:bec77545d188f8bdd29d42bccb9191682a46fb2e655e3d1fb446d47c55ac3b8d", + "sha256:c10d92fb6d7fd827e44055fcd932ad93dac6a11e832d51534d77b97d1d85400f", + "sha256:c3782fb753aa825b4ccabc04292e07897e2fd941448eabf666856c5530277626", + "sha256:c9ce7a9e967afc0a2af7caa0d15a3e9c1054815f73d6a8cb9225b61921b419bd", + "sha256:cb0702c12983be3b2fab98ead349ac63a98216d28dda6f518f52da5498a27a1b", + "sha256:cbc619e84a5e3ab2d452de831c88bdcad824414e9c2d28cd101f94dbdf26329c", + "sha256:ce4ed8e0c7dbc5b19352b9c2c6131dd23b95fa8698b5cdd076307a33626b72dc", + "sha256:ce96ab0bdfcef1b8c371ada2100767ace6804ea35aacce0aef3aeb4f3f499ca8", + "sha256:cf824aceaeffff029ccfba0da637d432ca71ab21f13e7f6f5179cd88ebc77a8a", + "sha256:d2a81bdcfde4245468f7030a75a37d50400ac2455c3a4819d9d550c937f90ab5", + "sha256:d2cc2b34f9e1d31ce255174da82902ad75bd7c0d88a33df54a77a22f2ef421ee", + "sha256:d2f184336bc1d6abfaaa1262ed42739c3789b1e3a65a29916a615307d22ffd2e", + "sha256:d3c622c39f04d5751408f5b801ecb527e6e0a471b367f420a877f7a660d583f6", + "sha256:d7cf5e726b6fa977e428a61880fb108a62f28b6d0c7ef675b117eaff7076df49", + "sha256:d85d784c619370d9329bbd670f41ff5f2ae62ea4519761b679d0f57f0f0ee267", + "sha256:d93ebdb82363d2e7bec64eecdc3632b59e84bd270d74fe5be1659f7787052f9b", + "sha256:db8a6313dbac934193fc17fe7610f70cd8181c542a91382531bef5ed785e5615", + "sha256:dbc2ab5d10544eb485baa76c63c501303b716a5c405ff2469a1d8ceffaabf622", + "sha256:dbd749cff1defbde270ca346b69b3baf5f1297213ef322254bf2a28537f0b046", + "sha256:dc662bc9375a6a394b62dfd331874c434819f10ee3902123200dbcf116963f89", + "sha256:dc6b0d5a1ea0318ef2def2b6a55dccf1dcaf77d605672347271ed7b829860765", + "sha256:dc79d192fb76fc0c84f2c58672c17bbbc383fd26c3cdc29daae16ce3d927e8b2", + "sha256:dd2c1d27ebfe6a015cfa2005b7fe8c52d5019f7bbdd801bc6f7499aab9ae739e", + "sha256:dea0808153f1fbbad772669d906cddd92100277533a03845de6893cadeffc8be", + "sha256:e0d7151a1bd5d0a203a5008fc4ae51a159a610cb82ab0a9b2c4d80241745582e", + "sha256:e14aab02258cb776a108107bd15f5b5e4a1bbaa61ef33b36693dfab6f89d54f9", + "sha256:e24d8031a2c62f34853756d9208eeafa6b940a1efcbfe36e8f57d99d52bb7261", + "sha256:e36c80c49853b3ffda7aa1831bf175c13356b210c73128c861f3aa93c3cc4015", + "sha256:e377e4cf8795cdbdff75b8f0223d7b6c68ff4fef36799d88ccf3a995a91c0112", + "sha256:e3acb9c16530362aeaef4e84d57db357002dc5cbfac9a23414c3e73c08301ab2", + "sha256:e3dc8d4ede2dbae6c0fc2b6c958bf51ce9fd7e9b40c0f5b8835c3fde44f5807d", + "sha256:e6491658dd2569f05860bad645569145c8626ac231877b0fb2d5f9bcb7054089", + "sha256:eb91d252b35004a84670dfeafadb042528b19842a0080d8b53e5ec1128e8f433", + "sha256:f0396e894bd1e66c74ecbc08b4f6a03dc331140942c4b1d345dd131b68574a60", + "sha256:f09c9d4c26fa79c1bad927efb05aca2391350b8e61c38cbc0d7d3c814e463124", + "sha256:f3cd110e02c5bf17d8fb562f6c9df5c20e73029d587cf8602a2da6c5ef1e32cb", + "sha256:f7a37dd208f0d658e0487522078b1ed68cd6bce20ef4b5a915d2809b9094b410", + "sha256:fae4a01ef8c4cb2bbe92ef2063149596907dc4a881a8d26743b3f6b304713171", + "sha256:fc327f4497b7087d06204235199daf208fd01c82d80465dc5efa4ec9df1c5b4e", + "sha256:fcc01c57ce6e70b728af02b2401c5bc853a9e14eb07deda30624374f0aebfe42", + "sha256:fde355b02934cc6b07200cc3b27ab0c15870a757d1a72fd401aa92e2ea3c6bfe" + ], + "markers": "python_version >= '3.9'", + "version": "==0.27.0" + }, + "rsa": { + "hashes": [ + "sha256:68635866661c6836b8d39430f97a996acbd61bfa49406748ea243539fe239762", + "sha256:e7bdbfdb5497da4c07dfd35530e1a902659db6ff241e39d9953cad06ebd0ae75" + ], + "markers": "python_version >= '3.6' and python_version < '4'", + "version": "==4.9.1" + }, + "ruff": { + "hashes": [ + "sha256:188a6638dab1aa9bb6228a7302387b2c9954e455fb25d6b4470cb0641d16759d", + "sha256:47678f39fa2a3da62724851107f438c8229a3470f533894b5568a39b40029c0c", + "sha256:524ee184d92f7c7304aa568e2db20f50c32d1d0caa235d8ddf10497566ea1a12", + "sha256:5284dcac6b9dbc2fcb71fdfc26a217b2ca4ede6ccd57476f52a587451ebe450d", + "sha256:5f202f0d93738c28a89f8ed9eaba01b7be339e5d8d642c994347eaa81c6d75b8", + "sha256:5fd804c0327a5e5ea26615550e706942f348b197d5475ff34c19733aee4b2e69", + "sha256:99713a6e2766b7a17147b309e8c915b32b07a25c9efd12ada79f217c9c778b3e", + "sha256:9bacb735d7bada9cfb0f2c227d3658fc443d90a727b47f206fb33f52f3c0eac7", + "sha256:b60dec7201c0b10d6d11be00e8f2dbb6f40ef1828ee75ed739923799513db24c", + "sha256:bfb834e87c916521ce46b1788fbb8484966e5113c02df216680102e9eb960029", + "sha256:ccaf903108b899beb8e09a63ffae5869057ab649c1e9231c05ae354ebc62066c", + "sha256:d257f95b65806104b6b1ffca0ea53f4ef98454036df65b1eda3693534813ecd1", + "sha256:d838b60007da7a39c046fcdd317293d10b845001f38bcb55ba766c3875b01e43", + "sha256:de42e4edc296f520bb84954eb992a07a0ec5a02fecb834498415908469854a52", + "sha256:df92aeac30af821f9acf819fc01b4afc3dfb829d2782884f8739fb52a8119a16", + "sha256:eb4d25532cfd9fe461acc83498361ec2e2252795b4f40b17e80692814329e42d", + "sha256:f2160eeef3031bf4b17df74e307d4c5fb689a6f3a26a2de3f7ef4044e3c484f1", + "sha256:f9567d135265d46e59d62dc60c0bfad10e9a6822e231f5b24032dba5a55be6b5" + ], + "version": "==0.9.10" + }, + "s3transfer": { + "hashes": [ + "sha256:757af0f2ac150d3c75bc4177a32355c3862a98d20447b69a0161812992fe0bd4", + "sha256:8c8aad92784779ab8688a61aefff3e28e9ebdce43142808eaa3f0b0f402f68b7" + ], + "markers": "python_version >= '3.8'", + "version": "==0.11.5" + }, + "safetensors": { + "hashes": [ + "sha256:1d2d2b3ce1e2509c68932ca03ab8f20570920cd9754b05063d4368ee52833ecd", + "sha256:43ff2aa0e6fa2dc3ea5524ac7ad93a9839256b8703761e76e2d0b2a3fa4f15d9", + "sha256:8045db2c872db8f4cbe3faa0495932d89c38c899c603f21e9b6486951a5ecb8f", + "sha256:81e67e8bab9878bb568cffbc5f5e655adb38d2418351dc0859ccac158f753e19", + "sha256:89a89b505f335640f9120fac65ddeb83e40f1fd081cb8ed88b505bdccec8d0a1", + "sha256:93de35a18f46b0f5a6a1f9e26d91b442094f2df02e9fd7acf224cfec4238821a", + "sha256:9c85ede8ec58f120bad982ec47746981e210492a6db876882aa021446af8ffba", + "sha256:b0e4d029ab0a0e0e4fdf142b194514695b1d7d3735503ba700cf36d0fc7136ce", + "sha256:c7b214870df923cbc1593c3faee16bec59ea462758699bd3fee399d00aac072c", + "sha256:cab75ca7c064d3911411461151cb69380c9225798a20e712b102edda2542ddb1", + "sha256:d6675cf4b39c98dbd7d940598028f3742e0375a6b4d4277e76beb0c35f4b843b", + "sha256:d83c20c12c2d2f465997c51b7ecb00e407e5f94d7dec3ea0cc11d86f60d3fde5", + "sha256:d944cea65fad0ead848b6ec2c37cc0b197194bec228f8020054742190e9312ac", + "sha256:fa48268185c52bfe8771e46325a1e21d317207bcabcb72e65c6e28e9ffeb29c7", + "sha256:fc4d0d0b937e04bdf2ae6f70cd3ad51328635fe0e6214aa1fc811f3b576b3bda" + ], + "markers": "python_version >= '3.9'", + "version": "==0.6.2" + }, + "scikit-learn": { + "hashes": [ + "sha256:10679f7f125fe7ecd5fad37dd1aa2daae7e3ad8df7f3eefa08901b8254b3e12c", + "sha256:13679981fdaebc10cc4c13c43344416a86fcbc61449cb3e6517e1df9d12c8309", + "sha256:16af2e44164f05d04337fd1fc3ae7c4ea61fd9b0d527e22665346336920fe0e1", + "sha256:1f812729e38c8cb37f760dce71a9b83ccfb04f59b3dca7c6079dcdc60544fa9e", + "sha256:24b3f1e976a4665aa74ee0fcaac2b8fccc6ae77c8e07ab25da3ba6d3292b9802", + "sha256:2f2e78e56a40c7587dea9a28dc4a49500fa2ead366869418c66f0fd75b80885c", + "sha256:2fd8b8d35817b0d9ebf0b576f7d5ffbbabdb55536b0655a8aaae629d7ffd2e1f", + "sha256:30d1f413cfc0aa5a99132a554f1d80517563c34a9d3e7c118fde2d273c6fe0f7", + "sha256:3cee419b49b5bbae8796ecd690f97aa412ef1674410c23fc3257c6b8b85b8087", + "sha256:3ddd9092c1bd469acab337d87930067c87eac6bd544f8d5027430983f1e1ae88", + "sha256:406204dd4004f0517f0b23cf4b28c6245cbd51ab1b6b78153bc784def214946d", + "sha256:40daccd1b5623f39e8943ab39735cadf0bdce80e67cdca2adcb5426e987320a8", + "sha256:4f1262883c6a63f067a980a8cdd2d2e7f2513dddcef6a9eaada6416a7a7cbe43", + "sha256:588410fa19a96a69763202f1d6b7b91d5d7a5d73be36e189bc6396bfb355bd87", + "sha256:781674d096303cfe3d351ae6963ff7c958db61cde3421cd490e3a5a58f2a94ae", + "sha256:88e1a20131cf741b84b89567e1717f27a2ced228e0f29103426102bc2e3b8ef7", + "sha256:90c8494ea23e24c0fb371afc474618c1019dc152ce4a10e4607e62196113851b", + "sha256:9963b065677a4ce295e8ccdee80a1dd62b37249e667095039adcd5bce6e90deb", + "sha256:a10f276639195a96c86aa572ee0698ad64ee939a7b042060b98bd1930c261d10", + "sha256:b1bd1d919210b6a10b7554b717c9000b5485aa95a1d0f177ae0d7ee8ec750da5", + "sha256:b62b76ad408a821475b43b7bb90a9b1c9a4d8d125d505c2df0539f06d6e631b1", + "sha256:b7839687fa46d02e01035ad775982f2470be2668e13ddd151f0f55a5bf123bae", + "sha256:bb870c0daf3bf3be145ec51df8ac84720d9972170786601039f024bf6d61a518", + "sha256:c711d652829a1805a95d7fe96654604a8f16eab5a9e9ad87b3e60173415cb650", + "sha256:ca6d31fb10e04d50bfd2b50d66744729dbb512d4efd0223b864e2fdbfc4cee11", + "sha256:e3142f0abe1ad1d1c31a2ae987621e41f6b578144a911ff4ac94781a583adad7" + ], + "markers": "python_version >= '3.10'", + "version": "==1.7.1" + }, + "scipy": { + "hashes": [ + "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", + "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", + "sha256:0a769105537aa07a69468a0eefcd121be52006db61cdd8cac8a0e68980bbb723", + "sha256:0bdd905264c0c9cfa74a4772cdb2070171790381a5c4d312c973382fc6eaf730", + "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", + "sha256:14ed70039d182f411ffc74789a16df3835e05dc469b898233a245cdfd7f162cb", + "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", + "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", + "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", + "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", + "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", + "sha256:2c620736bcc334782e24d173c0fdbb7590a0a436d2fdf39310a8902505008759", + "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", + "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", + "sha256:3ac07623267feb3ae308487c260ac684b32ea35fd81e12845039952f558047b8", + "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", + "sha256:40e54d5c7e7ebf1aa596c374c49fa3135f04648a0caabcb66c52884b943f02b4", + "sha256:50f9e62461c95d933d5c5ef4a1f2ebf9a2b4e83b0db374cb3f1de104d935922e", + "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", + "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", + "sha256:5e721fed53187e71d0ccf382b6bf977644c533e506c4d33c3fb24de89f5c3ed5", + "sha256:6487aa99c2a3d509a5227d9a5e889ff05830a06b2ce08ec30df6d79db5fcd5c5", + "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", + "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", + "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", + "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", + "sha256:76ad1fb5f8752eabf0fa02e4cc0336b4e8f021e2d5f061ed37d6d264db35e3ca", + "sha256:79167bba085c31f38603e11a267d862957cbb3ce018d8b38f79ac043bc92d825", + "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", + "sha256:7e11270a000969409d37ed399585ee530b9ef6aa99d50c019de4cb01e8e54e62", + "sha256:8c9ed3ba2c8a2ce098163a9bdb26f891746d02136995df25227a20e71c396ebb", + "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", + "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", + "sha256:9db984639887e3dffb3928d118145ffe40eff2fa40cb241a306ec57c219ebbbb", + "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", + "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", + "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", + "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", + "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", + "sha256:b90ab29d0c37ec9bf55424c064312930ca5f4bde15ee8619ee44e69319aab163", + "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", + "sha256:c9deabd6d547aee2c9a81dee6cc96c6d7e9a9b1953f74850c179f91fdc729cb7", + "sha256:dde4fc32993071ac0c7dd2d82569e544f0bdaff66269cb475e0f369adad13f11", + "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", + "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", + "sha256:f77f853d584e72e874d87357ad70f44b437331507d1c311457bed8ed2b956126" + ], + "markers": "python_version >= '3.10'", + "version": "==1.15.3" + }, + "secweb": { + "hashes": [ + "sha256:49917049b2c0bbd692fcc2a99c2ff12b86477c4096616ab24f280554f8238dcd", + "sha256:f25954021f0fa8bbcf8f19909fce9edceeccd559a58db191443079c65b7b601c" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==1.18.1" + }, + "sentence-transformers": { + "hashes": [ + "sha256:25f5086d0746c22177f9fb7d431f3eebe6375f3afe1dc7c341c4ca9061e98771", + "sha256:d33d0c5a69ae0d682115c90e74fc1dc24c4786aeea78e26f5889b037e5921880" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==4.0.2" + }, + "shapely": { + "hashes": [ + "sha256:04e4c12a45a1d70aeb266618d8cf81a2de9c4df511b63e105b90bfdfb52146de", + "sha256:0c062384316a47f776305ed2fa22182717508ffdeb4a56d0ff4087a77b2a0f6d", + "sha256:13d643256f81d55a50013eff6321142781cf777eb6a9e207c2c9e6315ba6044a", + "sha256:1415146fa12d80a47d13cfad5310b3c8b9c2aa8c14a0c845c9d3d75e77cb54f6", + "sha256:20a9d79958b3d6c70d8a886b250047ea32ff40489d7abb47d01498c704557a93", + "sha256:21fcab88b7520820ec16d09d6bea68652ca13993c84dffc6129dc3607c95594c", + "sha256:23b8772c3b815e7790fb2eab75a0b3951f435bc0fce7bb146cb064f17d35ab4f", + "sha256:2827365b58bf98efb60affc94a8e01c56dd1995a80aabe4b701465d86dcbba43", + "sha256:2c7b2b6143abf4fa77851cef8ef690e03feade9a0d48acd6dc41d9e0e78d7ca6", + "sha256:2e2b9125ebfbc28ecf5353511de62f75a8515ae9470521c9a693e4bb9fbe0cf1", + "sha256:3004a644d9e89e26c20286d5fdc10f41b1744c48ce910bd1867fdff963fe6c48", + "sha256:39dca52201e02996df02e447f729da97cfb6ff41a03cb50f5547f19d02905af8", + "sha256:45112a5be0b745b49e50f8829ce490eb67fefb0cea8d4f8ac5764bfedaa83d2d", + "sha256:4866de2673a971820c75c0167b1f1cd8fb76f2d641101c23d3ca021ad0449bab", + "sha256:4b96cea171b3d7f6786976a0520f178c42792897653ecca0c5422fb1e6946e6d", + "sha256:4ecf6c196b896e8f1360cc219ed4eee1c1e5f5883e505d449f263bd053fb8c05", + "sha256:500621967f2ffe9642454808009044c21e5b35db89ce69f8a2042c2ffd0e2772", + "sha256:586f6aee1edec04e16227517a866df3e9a2e43c1f635efc32978bb3dc9c63753", + "sha256:587a1aa72bc858fab9b8c20427b5f6027b7cbc92743b8e2c73b9de55aa71c7a7", + "sha256:61168010dfe4e45f956ffbbaf080c88afce199ea81eb1f0ac43230065df320bd", + "sha256:69e08bf9697c1b73ec6aa70437db922bafcea7baca131c90c26d59491a9760f9", + "sha256:6ca74d851ca5264aae16c2b47e96735579686cb69fa93c4078070a0ec845b8d8", + "sha256:78dec4d4fbe7b1db8dc36de3031767e7ece5911fb7782bc9e95c5cdec58fb1e9", + "sha256:872d3c0a7b8b37da0e23d80496ec5973c4692920b90de9f502b5beb994bbaaef", + "sha256:8c10ce6f11904d65e9bbb3e41e774903c944e20b3f0b282559885302f52f224a", + "sha256:8cb8f17c377260452e9d7720eeaf59082c5f8ea48cf104524d953e5d36d4bdb7", + "sha256:9fa5c53b0791a4b998f9ad84aad456c988600757a96b0a05e14bba10cebaaaea", + "sha256:a9c551f7fa7f1e917af2347fe983f21f212863f1d04f08eece01e9c275903fad", + "sha256:aabecd038841ab5310d23495253f01c2a82a3aedae5ab9ca489be214aa458aa7", + "sha256:ab8d878687b438a2f4c138ed1a80941c6ab0029e0f4c785ecfe114413b498a97", + "sha256:b640e390dabde790e3fb947198b466e63223e0a9ccd787da5f07bcb14756c28d", + "sha256:b9878b9e37ad26c72aada8de0c9cfe418d9e2ff36992a1693b7f65a075b28647", + "sha256:cacf067cdff741cd5c56a21c52f54ece4e4dad9d311130493a791997da4a886b", + "sha256:d14a9afa5fa980fbe7bf63706fdfb8ff588f638f145a1d9dbc18374b5b7de913", + "sha256:d8ccc872a632acb7bdcb69e5e78df27213f7efd195882668ffba5405497337c6", + "sha256:d9a531c48f289ba355e37b134e98e28c557ff13965d4653a5228d0f42a09aed0", + "sha256:e5ce6a5cc52c974b291237a96c08c5592e50f066871704fb5b12be2639d9026a", + "sha256:ef2d09d5a964cc90c2c18b03566cf918a61c248596998a0301d5b632beadb9db", + "sha256:f24f2ecda1e6c091da64bcbef8dd121380948074875bd1b247b3d17e99407099", + "sha256:fb00070b4c4860f6743c600285109c273cca5241e970ad56bb87bef0be1ea3a0", + "sha256:fd9130501bf42ffb7e0695b9ea17a27ae8ce68d50b56b6941c7f9b3d3453bc52" + ], + "markers": "python_version >= '3.10'", + "version": "==2.1.1" + }, + "six": { + "hashes": [ + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.17.0" + }, + "sniffio": { + "hashes": [ + "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", + "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc" + ], + "markers": "python_version >= '3.7'", + "version": "==1.3.1" + }, + "soupsieve": { + "hashes": [ + "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", + "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a" + ], + "markers": "python_version >= '3.8'", + "version": "==2.7" + }, + "sqlalchemy": { + "hashes": [ + "sha256:022e436a1cb39b13756cf93b48ecce7aa95382b9cfacceb80a7d263129dfd019", + "sha256:03d73ab2a37d9e40dec4984d1813d7878e01dbdc742448d44a7341b7a9f408c7", + "sha256:11b9503fa6f8721bef9b8567730f664c5a5153d25e247aadc69247c4bc605227", + "sha256:13194276e69bb2af56198fef7909d48fd34820de01d9c92711a5fa45497cc7ed", + "sha256:14111d22c29efad445cd5021a70a8b42f7d9152d8ba7f73304c4d82460946aaa", + "sha256:1681c21dd2ccee222c2fe0bef671d1aef7c504087c9c4e800371cfcc8ac966fc", + "sha256:1a113da919c25f7f641ffbd07fbc9077abd4b3b75097c888ab818f962707eb48", + "sha256:1c6d85327ca688dbae7e2b06d7d84cfe4f3fffa5b5f9e21bb6ce9d0e1a0e0e0a", + "sha256:20d81fc2736509d7a2bd33292e489b056cbae543661bb7de7ce9f1c0cd6e7f24", + "sha256:21b27b56eb2f82653168cefe6cb8e970cdaf4f3a6cb2c5e3c3c1cf3158968ff9", + "sha256:21ba7a08a4253c5825d1db389d4299f64a100ef9800e4624c8bf70d8f136e6ed", + "sha256:227119ce0a89e762ecd882dc661e0aa677a690c914e358f0dd8932a2e8b2765b", + "sha256:25b9fc27650ff5a2c9d490c13c14906b918b0de1f8fcbb4c992712d8caf40e83", + "sha256:334f41fa28de9f9be4b78445e68530da3c5fa054c907176460c81494f4ae1f5e", + "sha256:413391b2239db55be14fa4223034d7e13325a1812c8396ecd4f2c08696d5ccad", + "sha256:4286a1139f14b7d70141c67a8ae1582fc2b69105f1b09d9573494eb4bb4b2687", + "sha256:46293c39252f93ea0910aababa8752ad628bcce3a10d3f260648dd472256983f", + "sha256:4bf0edb24c128b7be0c61cd17eef432e4bef507013292415f3fb7023f02b7d4b", + "sha256:4d3d9b904ad4a6b175a2de0738248822f5ac410f52c2fd389ada0b5262d6a1e3", + "sha256:4fb1a8c5438e0c5ea51afe9c6564f951525795cf432bed0c028c1cb081276685", + "sha256:529064085be2f4d8a6e5fab12d36ad44f1909a18848fcfbdb59cc6d4bbe48efe", + "sha256:52d9b73b8fb3e9da34c2b31e6d99d60f5f99fd8c1225c9dad24aeb74a91e1d29", + "sha256:5cda6b51faff2639296e276591808c1726c4a77929cfaa0f514f30a5f6156921", + "sha256:5d79f9fdc9584ec83d1b3c75e9f4595c49017f5594fee1a2217117647225d738", + "sha256:6772e3ca8a43a65a37c88e2f3e2adfd511b0b1da37ef11ed78dea16aeae85bd9", + "sha256:6e2bf13d9256398d037fef09fd8bf9b0bf77876e22647d10761d35593b9ac547", + "sha256:70322986c0c699dca241418fcf18e637a4369e0ec50540a2b907b184c8bca069", + "sha256:788bfcef6787a7764169cfe9859fe425bf44559619e1d9f56f5bddf2ebf6f417", + "sha256:7f1ac7828857fcedb0361b48b9ac4821469f7694089d15550bbcf9ab22564a1d", + "sha256:87accdbba88f33efa7b592dc2e8b2a9c2cdbca73db2f9d5c510790428c09c154", + "sha256:971ba928fcde01869361f504fcff3b7143b47d30de188b11c6357c0505824197", + "sha256:9c2e02f06c68092b875d5cbe4824238ab93a7fa35d9c38052c033f7ca45daa18", + "sha256:9c5a9da957c56e43d72126a3f5845603da00e0293720b03bde0aacffcf2dc04f", + "sha256:9df7126fd9db49e3a5a3999442cc67e9ee8971f3cb9644250107d7296cb2a164", + "sha256:b3edaec7e8b6dc5cd94523c6df4f294014df67097c8217a89929c99975811414", + "sha256:b535d35dea8bbb8195e7e2b40059e2253acb2b7579b73c1b432a35363694641d", + "sha256:c00e7845d2f692ebfc7d5e4ec1a3fd87698e4337d09e58d6749a16aedfdf8612", + "sha256:c5d1730b25d9a07727d20ad74bc1039bbbb0a6ca24e6769861c1aa5bf2c4c4a8", + "sha256:c5e73ba0d76eefc82ec0219d2301cb33bfe5205ed7a2602523111e2e56ccbd20", + "sha256:c697575d0e2b0a5f0433f679bda22f63873821d991e95a90e9e52aae517b2e32", + "sha256:cdeff998cb294896a34e5b2f00e383e7c5c4ef3b4bfa375d9104723f15186443", + "sha256:d34c0f6dbefd2e816e8f341d0df7d4763d382e3f452423e752ffd1e213da2512", + "sha256:db691fa174e8f7036afefe3061bc40ac2b770718be2862bfb03aabae09051aca", + "sha256:e7a903b5b45b0d9fa03ac6a331e1c1d6b7e0ab41c63b6217b3d10357b83c8b00", + "sha256:e7c08f57f75a2bb62d7ee80a89686a5e5669f199235c6d1dac75cd59374091c3", + "sha256:f42f23e152e4545157fa367b2435a1ace7571cab016ca26038867eb7df2c3631", + "sha256:fe2b3b4927d0bc03d02ad883f402d5de201dbc8894ac87d2e981e7d87430e60d" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.43" + }, + "sse-starlette": { + "hashes": [ + "sha256:54470d5f19274aeed6b2d473430b08b4b379ea851d953b11d7f1c4a2c118b419", + "sha256:6410a3d3ba0c89e7675d4c273a301d64649c03a5ef1ca101f10b47f895fd0e99" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==2.2.1" + }, + "starlette": { + "hashes": [ + "sha256:3c88d58ee4bd1bb807c0d1acb381838afc7752f9ddaec81bbe4383611d833230", + "sha256:77c74ed9d2720138b25875133f3a2dae6d854af2ec37dceb56aef370c1d8a227" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.46.1" + }, + "starlette-session": { + "hashes": [ + "sha256:5b50a1c91a2ca1cf594574c0b386eea5dbed140dcb397ee73f0c43956bd2bfcc", + "sha256:bfc2559ec0fec566b44865f20d1c4262b1132de867a936abe8771cf139cbbe0b" + ], + "index": "pypi", + "markers": "python_version >= '3.7' and python_version < '4'", + "version": "==0.4.3" + }, + "sympy": { + "hashes": [ + "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", + "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5" + ], + "markers": "python_version >= '3.9'", + "version": "==1.14.0" + }, + "tenacity": { + "hashes": [ + "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", + "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138" + ], + "markers": "python_version >= '3.9'", + "version": "==9.1.2" + }, + "textdistance": { + "hashes": [ + "sha256:0cb1b2cc8e3339ddc3e0f8c870e49fb49de6ecc42a718917308b3c971f34aa56", + "sha256:d6dabc50b4ea832cdcf0e1e6021bd0c7fcd9ade155888d79bb6a3c31fce2dc6f" + ], + "markers": "python_version >= '3.5'", + "version": "==4.6.3" + }, + "threadpoolctl": { + "hashes": [ + "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", + "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e" + ], + "markers": "python_version >= '3.9'", + "version": "==3.6.0" + }, + "tiktoken": { + "hashes": [ + "sha256:10331d08b5ecf7a780b4fe4d0281328b23ab22cdb4ff65e68d56caeda9940ecc", + "sha256:13220f12c9e82e399377e768640ddfe28bea962739cc3a869cad98f42c419a89", + "sha256:195d84bec46169af3b1349a1495c151d37a0ff4cba73fd08282736be7f92cc6c", + "sha256:20b977989afe44c94bcc50db1f76971bb26dca44218bd203ba95925ef56f8e7a", + "sha256:2130127471e293d385179c1f3f9cd445070c0772be73cdafb7cec9a3684c0458", + "sha256:2177ffda31dec4023356a441793fed82f7af5291120751dee4d696414f54db0c", + "sha256:21e43022bf2c33f733ea9b54f6a3f6b4354b909f5a73388fb1b9347ca54a069c", + "sha256:2302772f035dceb2bcf8e55a735e4604a0b51a6dd50f38218ff664d46ec43807", + "sha256:25a512ff25dc6c85b58f5dd4f3d8c674dc05f96b02d66cdacf628d26a4e4866b", + "sha256:3c518641aee1c52247c2b97e74d8d07d780092af79d5911a6ab5e79359d9b06a", + "sha256:45927a71ab6643dfd3ef57d515a5db3d199137adf551f66453be098502838b0f", + "sha256:4ae374c46afadad0f501046db3da1b36cd4dfbfa52af23c998773682446097cf", + "sha256:5a0517634d67a8a48fd4a4ad73930c3022629a85a217d256a6e9b8b47439d1e4", + "sha256:61f1d15822e4404953d499fd1dcc62817a12ae9fb1e4898033ec8fe3915fdf8e", + "sha256:669a1aa1ad6ebf1b3c26b45deb346f345da7680f845b5ea700bba45c20dea24c", + "sha256:6a76d53cee2da71ee2731c9caa747398762bda19d7f92665e882fef229cb0b5b", + "sha256:6ef72aab3ea240646e642413cb363b73869fed4e604dcfd69eec63dc54d603e8", + "sha256:7dc6e9ad16a2a75b4c4be7208055a1f707c9510541d94d9cc31f7fbdc8db41d8", + "sha256:7f2db627f5c74477c0404b4089fd8a28ae22fa982a6f7d9c7d4c305c375218f3", + "sha256:7f929255c705efec7a28bf515e29dc74220b2f07544a8c81b8d69e8efc4578bd", + "sha256:7fb4effe60574675118b73c6fbfd3b5868e5d7a1f570d6cc0d18724b09ecf318", + "sha256:8a9b517d6331d7103f8bef29ef93b3cca95fa766e293147fe7bacddf310d5917", + "sha256:94f984c9831fd32688aef4348803b0905d4ae9c432303087bae370dc1381a2b8", + "sha256:a5f3f25ffb152ee7fec78e90a5e5ea5b03b4ea240beed03305615847f7a6ace2", + "sha256:adb4e308eb64380dc70fa30493e21c93475eaa11669dea313b6bbf8210bfd013", + "sha256:b062c82300341dc87e0258c69f79bed725f87e753c21887aea90d272816be882", + "sha256:b4ddb1849e6bf0afa6cc1c5d809fb980ca240a5fffe585a04e119519758788c0", + "sha256:e363f33c720a055586f730c00e330df4c7ea0024bf1c83a8a9a9dbc054c4f304", + "sha256:ece6b76bfeeb61a125c44bbefdfccc279b5288e6007fbedc0d32bfec602df2f2", + "sha256:fd9e6b23e860973cf9526544e220b223c60badf5b62e80a33509d6d40e6c8f5d", + "sha256:fe91581b0ecdd8783ce8cb6e3178f2260a3912e8724d2f2d49552b98714641a1" + ], + "markers": "python_version >= '3.9'", + "version": "==0.11.0" + }, + "timm": { + "hashes": [ + "sha256:6e71e1f67ac80c229d3a78ca58347090514c508aeba8f2e2eb5289eda86e9f43", + "sha256:c07b56c32f3d3226c656f75c1b5479c08eb34eefed927c82fd8751a852f47931" + ], + "markers": "python_version >= '3.8'", + "version": "==1.0.19" + }, + "tokenizers": { + "hashes": [ + "sha256:1340ff877ceedfa937544b7d79f5b7becf33a4cfb58f89b3b49927004ef66f78", + "sha256:2107ad649e2cda4488d41dfd031469e9da3fcbfd6183e74e4958fa729ffbf9c6", + "sha256:2ccc10a7c3bcefe0f242867dc914fc1226ee44321eb618cfe3019b5df3400133", + "sha256:39b376f5a1aee67b4d29032ee85511bbd1b99007ec735f7f35c8a2eb104eade5", + "sha256:3c1f4317576e465ac9ef0d165b247825a2a4078bcd01cba6b54b867bdf9fdd8b", + "sha256:3c73012da95afafdf235ba80047699df4384fdc481527448a078ffd00e45a7d9", + "sha256:475d807a5c3eb72c59ad9b5fcdb254f6e17f53dfcbb9903233b0dfa9c943b597", + "sha256:51b7eabb104f46c1c50b486520555715457ae833d5aee9ff6ae853d1130506ff", + "sha256:5e2f601a8e0cd5be5cc7506b20a79112370b9b3e9cb5f13f68ab11acd6ca7d60", + "sha256:6c42a930bc5f4c47f4ea775c91de47d27910881902b0f20e4990ebe045a415d0", + "sha256:714b05b2e1af1288bd1bc56ce496c4cebb64a20d158ee802887757791191e6e2", + "sha256:c212aa4e45ec0bb5274b16b6f31dd3f1c41944025c2358faaa5782c754e84c24", + "sha256:cc88bb34e23a54cc42713d6d98af5f1bf79c07653d24fe984d2d695ba2c922a2", + "sha256:f23186c40395fc390d27f519679a58023f368a0aad234af145e0f39ad1212732", + "sha256:fa23f85fbc9a02ec5c6978da172cdcbac23498c3ca9f3645c5c68740ac007880" + ], + "markers": "python_version >= '3.9'", + "version": "==0.21.4" + }, + "torch": { + "hashes": [ + "sha256:06fcee8000e5c62a9f3e52a688b9c5abb7c6228d0e56e3452983416025c41381", + "sha256:0be92c08b44009d4131d1ff7a8060d10bafdb7ddcb7359ef8d8c5169007ea905", + "sha256:1a62a1ec4b0498930e2543535cf70b1bef8c777713de7ceb84cd79115f553767", + "sha256:220a06fd7af8b653c35d359dfe1aaf32f65aa85befa342629f716acb134b9710", + "sha256:2b2f96814e0345f5a5aed9bf9734efa913678ed19caf6dc2cddb7930672d6128", + "sha256:2f4ac52f0130275d7517b03a33d2493bab3693c83dcfadf4f81688ea82147d2e", + "sha256:5128fe752a355d9308e56af1ad28b15266fe2da5948660fad44de9e3a9e36e8c", + "sha256:5ae0524688fb6707c57a530c2325e13bb0090b745ba7b4a2cd6a3ce262572916", + "sha256:619c2869db3ada2c0105487ba21b5008defcc472d23f8b80ed91ac4a380283b0", + "sha256:65616ca8ec6f43245e1f5f296603e33923f4c30f93d65e103d9e50c25b35150b", + "sha256:659df54119ae03e83a800addc125856effda88b016dfc54d9f65215c3975be16", + "sha256:7b677e17f5a3e69fdef7eb3b9da72622f8d322692930297e4ccb52fefc6c8211", + "sha256:83c13411a26fac3d101fe8035a6b0476ae606deb8688e904e796a3534c197def", + "sha256:89aa9ee820bb39d4d72b794345cccef106b574508dd17dbec457949678c76011", + "sha256:8c7ef765e27551b2fbfc0f41bcf270e1292d9bf79f8e0724848b1682be6e80aa", + "sha256:8f0a9d617a66509ded240add3754e462430a6c1fc5589f86c17b433dd808f97a", + "sha256:a3f16a58a9a800f589b26d47ee15aca3acf065546137fc2af039876135f4c760", + "sha256:a7242b86f42be98ac674b88a4988643b9bc6145437ec8f048fea23f72feb5eca", + "sha256:b2aca0939fb7e4d842561febbd4ffda67a8e958ff725c1c27e244e85e982173c", + "sha256:c12fa219f51a933d5f80eeb3a7a5d0cbe9168c0a14bbb4055f1979431660879b", + "sha256:da6afa31c13b669d4ba49d8a2169f0db2c3ec6bec4af898aa714f401d4c38904", + "sha256:e2fab4153768d433f8ed9279c8133a114a034a61e77a3a104dcdf54388838705", + "sha256:e8e5bf982e87e2b59d932769938b698858c64cc53753894be25629bdf5cf2f46", + "sha256:e9f071f5b52a9f6970dc8a919694b27a91ae9dc08898b2b988abbef5eddfd1ae" + ], + "markers": "python_full_version >= '3.9.0'", + "version": "==2.8.0" + }, + "torchvision": { + "hashes": [ + "sha256:01dc33ee24c79148aee7cdbcf34ae8a3c9da1674a591e781577b716d233b1fa6", + "sha256:07d069cb29691ff566e3b7f11f20d91044f079e1dbdc9d72e0655899a9b06938", + "sha256:09bfde260e7963a15b80c9e442faa9f021c7e7f877ac0a36ca6561b367185013", + "sha256:1c37e325e09a184b730c3ef51424f383ec5745378dc0eca244520aca29722600", + "sha256:2a3299d2b1d5a7aed2d3b6ffb69c672ca8830671967eb1cee1497bacd82fe47b", + "sha256:2df618e1143805a7673aaf82cb5720dd9112d4e771983156aaf2ffff692eebf9", + "sha256:2f7fd6c15f3697e80627b77934f77705f3bc0e98278b989b2655de01f6903e1d", + "sha256:31c583ba27426a3a04eca8c05450524105c1564db41be6632f7536ef405a6de2", + "sha256:35c27941831b653f5101edfe62c03d196c13f32139310519e8228f35eae0e96a", + "sha256:3932bf67256f2d095ce90a9f826f6033694c818856f4bb26794cf2ce64253e53", + "sha256:49aa20e21f0c2bd458c71d7b449776cbd5f16693dd5807195a820612b8a229b7", + "sha256:4e7d31c43bc7cbecbb1a5652ac0106b436aa66e26437585fc2c4b2cf04d6014c", + "sha256:6c74cbc1cbee26dd4f35f989cd80dccc40411f258dee476b29871dee4b483af0", + "sha256:6dd7c4d329a0e03157803031bc856220c6155ef08c26d4f5bbac938acecf0948", + "sha256:7266871daca00ad46d1c073e55d972179d12a58fa5c9adec9a3db9bbed71284a", + "sha256:76bc4c0b63d5114aa81281390f8472a12a6a35ce9906e67ea6044e5af4cab60c", + "sha256:83ee5bf827d61a8af14620c0a61d8608558638ac9c3bac8adb7b27138e2147d1", + "sha256:a2e45272abe7b8bf0d06c405e78521b5757be1bd0ed7e5cd78120f7fdd4cbf35", + "sha256:a76fafe113b2977be3a21bf78f115438c1f88631d7a87203acb3dd6ae55889e6", + "sha256:a9e9d7552d34547b80843eaf64ab0737b19b2e8bec2514286b8cfd30861ca8b5", + "sha256:b190db205f90206c230fc2f91cbdfd5733334babc0e0d19bddb90a40b8cf26c2", + "sha256:b9e2dabf0da9c8aa9ea241afb63a8f3e98489e706b22ac3f30416a1be377153b", + "sha256:dc7ce5accbbb8c9df9a79f8cef6a6df042f28e2250a6ae0d2ca70b06473fa03b", + "sha256:e0e2c04a91403e8dd3af9756c6a024a1d9c0ed9c0d592a8314ded8f4fe30d440" + ], + "markers": "python_version >= '3.9'", + "version": "==0.23.0" + }, + "tqdm": { + "hashes": [ + "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", + "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==4.67.1" + }, + "transformers": { + "hashes": [ + "sha256:15aa138a05d07a15b30d191ea2c45e23061ebf9fcc928a1318e03fe2234f3ae1", + "sha256:29d9b8800e32a4a831bb16efb5f762f6a9742fef9fce5d693ed018d19b106490" + ], + "markers": "python_full_version >= '3.9.0'", + "version": "==4.55.0" + }, + "types-pyyaml": { + "hashes": [ + "sha256:032b6003b798e7de1a1ddfeefee32fac6486bdfe4845e0ae0e7fb3ee4512b52f", + "sha256:af4a1aca028f18e75297da2ee0da465f799627370d74073e96fee876524f61b5" + ], + "markers": "python_version >= '3.9'", + "version": "==6.0.12.20250809" + }, + "typing-extensions": { + "hashes": [ + "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36", + "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76" + ], + "markers": "python_version >= '3.9'", + "version": "==4.14.1" + }, + "typing-inspect": { + "hashes": [ + "sha256:9ee6fc59062311ef8547596ab6b955e1b8aa46242d854bfc78f4f6b0eff35f9f", + "sha256:b23fc42ff6f6ef6954e4852c1fb512cdd18dbea03134f91f856a95ccc9461f78" + ], + "version": "==0.9.0" + }, + "typing-inspection": { + "hashes": [ + "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51", + "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28" + ], + "markers": "python_version >= '3.9'", + "version": "==0.4.1" + }, + "tzdata": { + "hashes": [ + "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", + "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9" + ], + "markers": "python_version >= '2'", + "version": "==2025.2" + }, + "unstructured": { + "extras": [ + "docx", + "md", + "pptx" + ], + "hashes": [ + "sha256:85aec87032177b826ec278e57e3f74ef3a2aa7e887ab137875e572293cf9659b", + "sha256:cf177d2a212a8bcd3a5a6750d8400c079764d30dabdb6605e7ba0a65679e00a0" + ], + "markers": "python_full_version >= '3.10.0'", + "version": "==0.18.11" + }, + "unstructured-client": { + "hashes": [ + "sha256:1426d03325f7b93daad524ad2b954f1e7cceb0c15e67a4f4e88b49220dd2472c", + "sha256:50b8198a3c3f984bdb53d848be7665d352093a99841858976f596cc2105903ec" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.32.3" + }, + "unstructured-inference": { + "hashes": [ + "sha256:bfea8923bb1ad7e94e0a6d0ac8f9c65a8d676f2974def9ccdc982101825d16ef", + "sha256:e547ff6b7f77813f064913916ac59408f43ad2b15f0eaf61c48eb3964d52dee9" + ], + "index": "pypi", + "markers": "python_full_version >= '3.7.0'", + "version": "==0.8.10" + }, + "urllib3": { + "hashes": [ + "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", + "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==2.3.0" + }, + "uvicorn": { + "hashes": [ + "sha256:023dc038422502fa28a09c7a30bf2b6991512da7dcdb8fd35fe57cfc154126f4", + "sha256:404051050cd7e905de2c9a7e61790943440b3416f49cb409f965d9dcd0fa73e9" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.34.0" + }, + "validators": { + "hashes": [ + "sha256:647fe407b45af9a74d245b943b18e6a816acf4926974278f6dd617778e1e781f", + "sha256:c804b476e3e6d3786fa07a30073a4ef694e617805eb1946ceee3fe5a9b8b1321" + ], + "markers": "python_version >= '3.8'", + "version": "==0.34.0" + }, + "webencodings": { + "hashes": [ + "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", + "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" + ], + "version": "==0.5.1" + }, + "websockets": { + "hashes": [ + "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", + "sha256:0a34631031a8f05657e8e90903e656959234f3a04552259458aac0b0f9ae6fd9", + "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", + "sha256:0c9e74d766f2818bb95f84c25be4dea09841ac0f734d1966f415e4edfc4ef1c3", + "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", + "sha256:0fdfe3e2a29e4db3659dbd5bbf04560cea53dd9610273917799f1cde46aa725e", + "sha256:1009ee0c7739c08a0cd59de430d6de452a55e42d6b522de7aa15e6f67db0b8e1", + "sha256:1234d4ef35db82f5446dca8e35a7da7964d02c127b095e172e54397fb6a6c256", + "sha256:16b6c1b3e57799b9d38427dda63edcbe4926352c47cf88588c0be4ace18dac85", + "sha256:2034693ad3097d5355bfdacfffcbd3ef5694f9718ab7f29c29689a9eae841880", + "sha256:21c1fa28a6a7e3cbdc171c694398b6df4744613ce9b36b1a498e816787e28123", + "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", + "sha256:27ccee0071a0e75d22cb35849b1db43f2ecd3e161041ac1ee9d2352ddf72f065", + "sha256:363c6f671b761efcb30608d24925a382497c12c506b51661883c3e22337265ed", + "sha256:39c1fec2c11dc8d89bba6b2bf1556af381611a173ac2b511cf7231622058af41", + "sha256:3b1ac0d3e594bf121308112697cf4b32be538fb1444468fb0a6ae4feebc83411", + "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", + "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", + "sha256:3d00075aa65772e7ce9e990cab3ff1de702aa09be3940d1dc88d5abf1ab8a09c", + "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", + "sha256:47819cea040f31d670cc8d324bb6435c6f133b8c7a19ec3d61634e62f8d8f9eb", + "sha256:47b099e1f4fbc95b701b6e85768e1fcdaf1630f3cbe4765fa216596f12310e2e", + "sha256:4a9fac8e469d04ce6c25bb2610dc535235bd4aa14996b4e6dbebf5e007eba5ee", + "sha256:4b826973a4a2ae47ba357e4e82fa44a463b8f168e1ca775ac64521442b19e87f", + "sha256:4c2529b320eb9e35af0fa3016c187dffb84a3ecc572bcee7c3ce302bfeba52bf", + "sha256:54479983bd5fb469c38f2f5c7e3a24f9a4e70594cd68cd1fa6b9340dadaff7cf", + "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", + "sha256:5756779642579d902eed757b21b0164cd6fe338506a8083eb58af5c372e39d9a", + "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", + "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", + "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", + "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", + "sha256:5df592cd503496351d6dc14f7cdad49f268d8e618f80dce0cd5a36b93c3fc08d", + "sha256:5f4c04ead5aed67c8a1a20491d54cdfba5884507a48dd798ecaf13c74c4489f5", + "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", + "sha256:66dd88c918e3287efc22409d426c8f729688d89a0c587c88971a0faa2c2f3792", + "sha256:678999709e68425ae2593acf2e3ebcbcf2e69885a5ee78f9eb80e6e371f1bf57", + "sha256:67f2b6de947f8c757db2db9c71527933ad0019737ec374a8a6be9a956786aaf9", + "sha256:693f0192126df6c2327cce3baa7c06f2a117575e32ab2308f7f8216c29d9e2e3", + "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", + "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", + "sha256:76d1f20b1c7a2fa82367e04982e708723ba0e7b8d43aa643d3dcd404d74f1475", + "sha256:7f493881579c90fc262d9cdbaa05a6b54b3811c2f300766748db79f098db9940", + "sha256:823c248b690b2fd9303ba00c4f66cd5e2d8c3ba4aa968b2779be9532a4dad431", + "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", + "sha256:8dd8327c795b3e3f219760fa603dcae1dcc148172290a8ab15158cf85a953413", + "sha256:8fdc51055e6ff4adeb88d58a11042ec9a5eae317a0a53d12c062c8a8865909e8", + "sha256:a625e06551975f4b7ea7102bc43895b90742746797e2e14b70ed61c43a90f09b", + "sha256:abdc0c6c8c648b4805c5eacd131910d2a7f6455dfd3becab248ef108e89ab16a", + "sha256:ac017dd64572e5c3bd01939121e4d16cf30e5d7e110a119399cf3133b63ad054", + "sha256:ac1e5c9054fe23226fb11e05a6e630837f074174c4c2f0fe442996112a6de4fb", + "sha256:ac60e3b188ec7574cb761b08d50fcedf9d77f1530352db4eef1707fe9dee7205", + "sha256:b359ed09954d7c18bbc1680f380c7301f92c60bf924171629c5db97febb12f04", + "sha256:b7643a03db5c95c799b89b31c036d5f27eeb4d259c798e878d6937d71832b1e4", + "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", + "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", + "sha256:cad21560da69f4ce7658ca2cb83138fb4cf695a2ba3e475e0559e05991aa8122", + "sha256:d08eb4c2b7d6c41da6ca0600c077e93f5adcfd979cd777d747e9ee624556da4b", + "sha256:d50fd1ee42388dcfb2b3676132c78116490976f1300da28eb629272d5d93e905", + "sha256:d591f8de75824cbb7acad4e05d2d710484f15f29d4a915092675ad3456f11770", + "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", + "sha256:d63efaa0cd96cf0c5fe4d581521d9fa87744540d4bc999ae6e08595a1014b45b", + "sha256:d99e5546bf73dbad5bf3547174cd6cb8ba7273062a23808ffea025ecb1cf8562", + "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", + "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", + "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", + "sha256:f29d80eb9a9263b8d109135351caf568cc3f80b9928bccde535c235de55c22d9", + "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", + "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7" + ], + "markers": "python_version >= '3.9'", + "version": "==15.0.1" + }, + "wikipedia": { + "hashes": [ + "sha256:db0fad1829fdd441b1852306e9856398204dc0786d2996dd2e0c8bb8e26133b2" + ], + "index": "pypi", + "version": "==1.4.0" + }, + "wrapt": { + "hashes": [ + "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f", + "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c", + "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a", + "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b", + "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555", + "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c", + "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b", + "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6", + "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8", + "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662", + "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061", + "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998", + "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb", + "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62", + "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984", + "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392", + "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2", + "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306", + "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7", + "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3", + "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9", + "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6", + "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192", + "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317", + "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f", + "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda", + "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563", + "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a", + "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f", + "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d", + "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9", + "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8", + "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82", + "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9", + "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845", + "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82", + "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125", + "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504", + "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b", + "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7", + "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc", + "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6", + "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40", + "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a", + "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3", + "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a", + "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72", + "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681", + "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438", + "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae", + "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2", + "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb", + "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5", + "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a", + "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3", + "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8", + "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2", + "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22", + "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72", + "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061", + "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f", + "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9", + "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04", + "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98", + "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9", + "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f", + "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b", + "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925", + "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6", + "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0", + "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9", + "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c", + "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991", + "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6", + "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000", + "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb", + "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119", + "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b", + "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==1.17.2" + }, + "wsproto": { + "hashes": [ + "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065", + "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==1.2.0" + }, + "wtpsplit-lite": { + "hashes": [ + "sha256:3277a711f5c4c16162901fc37426557f4eb6eb6d90ba8fca276433fa9aa5fa4c", + "sha256:aaf9168cdbba9a20671df93dea0bd6ffb6f3a39f1b74cdd86ab3e81a073e97e8" + ], + "markers": "python_version >= '3.10' and python_version < '4.0'", + "version": "==0.2.0" + }, + "xlsxwriter": { + "hashes": [ + "sha256:4f4824234e1eaf9d95df9a8fe974585ff91d0f5e3d3f12ace5b71e443c1c6abd", + "sha256:7e88469d607cdc920151c0ab3ce9cf1a83992d4b7bc730c5ffdd1a12115a7dbe" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.5" + }, + "xxhash": { + "hashes": [ + "sha256:02c2e816896dc6f85922ced60097bcf6f008dedfc5073dcba32f9c8dd786f3c1", + "sha256:0691bfcc4f9c656bcb96cc5db94b4d75980b9d5589f2e59de790091028580837", + "sha256:07fda5de378626e502b42b311b049848c2ef38784d0d67b6f30bb5008642f8eb", + "sha256:08424f6648526076e28fae6ea2806c0a7d504b9ef05ae61d196d571e5c879c84", + "sha256:0a80ad0ffd78bef9509eee27b4a29e56f5414b87fb01a888353e3d5bda7038bd", + "sha256:0adfbd36003d9f86c8c97110039f7539b379f28656a04097e7434d3eaf9aa131", + "sha256:0ec70a89be933ea49222fafc3999987d7899fc676f688dd12252509434636622", + "sha256:1030a39ba01b0c519b1a82f80e8802630d16ab95dc3f2b2386a0b5c8ed5cbb10", + "sha256:109b436096d0a2dd039c355fa3414160ec4d843dfecc64a14077332a00aeb7da", + "sha256:1308fa542bbdbf2fa85e9e66b1077eea3a88bef38ee8a06270b4298a7a62a166", + "sha256:1328f6d8cca2b86acb14104e381225a3d7b42c92c4b86ceae814e5c400dbb415", + "sha256:13de2b76c1835399b2e419a296d5b38dc4855385d9e96916299170085ef72f57", + "sha256:14470ace8bd3b5d51318782cd94e6f94431974f16cb3b8dc15d52f3b69df8e00", + "sha256:149b7914451eb154b3dfaa721315117ea1dac2cc55a01bfbd4df7c68c5dd683d", + "sha256:160e0c19ee500482ddfb5d5570a0415f565d8ae2b3fd69c5dcfce8a58107b1c3", + "sha256:2014c5b3ff15e64feecb6b713af12093f75b7926049e26a580e94dcad3c73d8c", + "sha256:2061188a1ba352fc699c82bff722f4baacb4b4b8b2f0c745d2001e56d0dfb514", + "sha256:220f3f896c6b8d0316f63f16c077d52c412619e475f9372333474ee15133a558", + "sha256:23241ff6423378a731d84864bf923a41649dc67b144debd1077f02e6249a0d54", + "sha256:25b5a51dc3dfb20a10833c8eee25903fd2e14059e9afcd329c9da20609a307b2", + "sha256:297595fe6138d4da2c8ce9e72a04d73e58725bb60f3a19048bc96ab2ff31c692", + "sha256:2b4154c00eb22e4d543f472cfca430e7962a0f1d0f3778334f2e08a7ba59363c", + "sha256:2e76e83efc7b443052dd1e585a76201e40b3411fe3da7af4fe434ec51b2f163b", + "sha256:30eb2efe6503c379b7ab99c81ba4a779748e3830241f032ab46bd182bf5873af", + "sha256:3171f693dbc2cef6477054a665dc255d996646b4023fe56cb4db80e26f4cc520", + "sha256:33513d6cc3ed3b559134fb307aae9bdd94d7e7c02907b37896a6c45ff9ce51bd", + "sha256:33eac61d0796ca0591f94548dcfe37bb193671e0c9bcf065789b5792f2eda644", + "sha256:37889a0d13b0b7d739cfc128b1c902f04e32de17b33d74b637ad42f1c55101f6", + "sha256:38c384c434021e4f62b8d9ba0bc9467e14d394893077e2c66d826243025e1f81", + "sha256:392f52ebbb932db566973693de48f15ce787cabd15cf6334e855ed22ea0be5b3", + "sha256:3dbbd9892c5ebffeca1ed620cf0ade13eb55a0d8c84e0751a6653adc6ac40d0c", + "sha256:3e5b5e16c5a480fe5f59f56c30abdeba09ffd75da8d13f6b9b6fd224d0b4d0a2", + "sha256:3ff2c0a34eae7df88c868be53a8dd56fbdf592109e21d4bfa092a27b0bf4a7bf", + "sha256:42eca420c8fa072cc1dd62597635d140e78e384a79bb4944f825fbef8bfeeef6", + "sha256:4811336f1ce11cac89dcbd18f3a25c527c16311709a89313c3acaf771def2d4b", + "sha256:4cc2d67fdb4d057730c75a64c5923abfa17775ae234a71b0200346bfb0a7f482", + "sha256:4e28503dccc7d32e0b9817aa0cbfc1f45f563b2c995b7a66c4c8a0d232e840c7", + "sha256:4e2febf914ace002132aa09169cc572e0d8959d0f305f93d5828c4836f9bc5a6", + "sha256:50ac2184ffb1b999e11e27c7e3e70cc1139047e7ebc1aa95ed12f4269abe98d4", + "sha256:531af8845aaadcadf951b7e0c1345c6b9c68a990eeb74ff9acd8501a0ad6a1c9", + "sha256:53a068fe70301ec30d868ece566ac90d873e3bb059cf83c32e76012c889b8637", + "sha256:586886c7e89cb9828bcd8a5686b12e161368e0064d040e225e72607b43858ba2", + "sha256:59aa1203de1cb96dbeab595ded0ad0c0056bb2245ae11fac11c0ceea861382b9", + "sha256:5a74f23335b9689b66eb6dbe2a931a88fcd7a4c2cc4b1cb0edba8ce381c7a1da", + "sha256:5d0d307d27099bb0cbeea7260eb39ed4fdb99c5542e21e94bb6fd29e49c57a23", + "sha256:5d2a01dcce81789cf4b12d478b5464632204f4c834dc2d064902ee27d2d1f0ee", + "sha256:5d3a10609c51da2a1c0ea0293fc3968ca0a18bd73838455b5bca3069d7f8e32b", + "sha256:5ed9ebc46f24cf91034544b26b131241b699edbfc99ec5e7f8f3d02d6eb7fba4", + "sha256:6027dcd885e21581e46d3c7f682cfb2b870942feeed58a21c29583512c3f09f8", + "sha256:602d339548d35a8579c6b013339fb34aee2df9b4e105f985443d2860e4d7ffaa", + "sha256:604253b2143e13218ff1ef0b59ce67f18b8bd1c4205d2ffda22b09b426386898", + "sha256:61a1ff00674879725b194695e17f23d3248998b843eb5e933007ca743310f793", + "sha256:61c722ed8d49ac9bc26c7071eeaa1f6ff24053d553146d5df031802deffd03da", + "sha256:63107013578c8a730419adc05608756c3fa640bdc6abe806c3123a49fb829f43", + "sha256:683b94dbd1ca67557850b86423318a2e323511648f9f3f7b1840408a02b9a48c", + "sha256:685c4f4e8c59837de103344eb1c8a3851f670309eb5c361f746805c5471b8c88", + "sha256:695735deeddfb35da1677dbc16a083445360e37ff46d8ac5c6fcd64917ff9ade", + "sha256:6e5f70f6dca1d3b09bccb7daf4e087075ff776e3da9ac870f86ca316736bb4aa", + "sha256:6e93a5ad22f434d7876665444a97e713a8f60b5b1a3521e8df11b98309bff833", + "sha256:6fa0b72f2423e2aa53077e54a61c28e181d23effeaafd73fcb9c494e60930c8e", + "sha256:70dabf941dede727cca579e8c205e61121afc9b28516752fd65724be1355cc90", + "sha256:74752ecaa544657d88b1d1c94ae68031e364a4d47005a90288f3bab3da3c970f", + "sha256:7a46e1d6d2817ba8024de44c4fd79913a90e5f7265434cef97026215b7d30df6", + "sha256:7c5d3e570ef46adaf93fc81b44aca6002b5a4d8ca11bd0580c07eac537f36680", + "sha256:7cb29a034301e2982df8b1fe6328a84f4b676106a13e9135a0d7e0c3e9f806da", + "sha256:7ccb800c9418e438b44b060a32adeb8393764da7441eb52aa2aa195448935306", + "sha256:7ce379bcaa9fcc00f19affa7773084dd09f5b59947b3fb47a1ceb0179f91aaa1", + "sha256:7f85e0108d51092bdda90672476c7d909c04ada6923c14ff9d913c4f7dc8a3bc", + "sha256:80babcc30e7a1a484eab952d76a4f4673ff601f54d5142c26826502740e70b43", + "sha256:82085c2abec437abebf457c1d12fccb30cc8b3774a0814872511f0f0562c768c", + "sha256:82b833d5563fefd6fceafb1aed2f3f3ebe19f84760fdd289f8b926731c2e6e91", + "sha256:84f2caddf951c9cbf8dc2e22a89d4ccf5d86391ac6418fe81e3c67d0cf60b45f", + "sha256:893074d651cf25c1cc14e3bea4fceefd67f2921b1bb8e40fcfeba56820de80c6", + "sha256:89997aa1c4b6a5b1e5b588979d1da048a3c6f15e55c11d117a56b75c84531f5a", + "sha256:89e66ceed67b213dec5a773e2f7a9e8c58f64daeb38c7859d8815d2c89f39ad7", + "sha256:8d47ebd9f5d9607fd039c1fbf4994e3b071ea23eff42f4ecef246ab2b7334198", + "sha256:924361811732ddad75ff23e90efd9ccfda4f664132feecb90895bade6a1b4623", + "sha256:963be41bcd49f53af6d795f65c0da9b4cc518c0dd9c47145c98f61cb464f4839", + "sha256:97a662338797c660178e682f3bc180277b9569a59abfb5925e8620fba00b9fc5", + "sha256:9bed5144c6923cc902cd14bb8963f2d5e034def4486ab0bbe1f58f03f042f9a9", + "sha256:9c770750cc80e8694492244bca7251385188bc5597b6a39d98a9f30e8da984e0", + "sha256:9d32a592cac88d18cc09a89172e1c32d7f2a6e516c3dfde1b9adb90ab5df54a6", + "sha256:a5bc08f33c4966f4eb6590d6ff3ceae76151ad744576b5fc6c4ba8edd459fdec", + "sha256:a606c8070ada8aa2a88e181773fa1ef17ba65ce5dd168b9d08038e2a61b33754", + "sha256:a6c50017518329ed65a9e4829154626f008916d36295b6a3ba336e2458824c8c", + "sha256:a7b1d8315d9b5e9f89eb2933b73afae6ec9597a258d52190944437158b49d38e", + "sha256:a8fb786fb754ef6ff8c120cb96629fb518f8eb5a61a16aac3a979a9dbd40a084", + "sha256:a905ad00ad1e1c34fe4e9d7c1d949ab09c6fa90c919860c1534ff479f40fd12d", + "sha256:a9d360a792cbcce2fe7b66b8d51274ec297c53cbc423401480e53b26161a290d", + "sha256:b150b8467852e1bd844387459aa6fbe11d7f38b56e901f9f3b3e6aba0d660240", + "sha256:b702f806693201ad6c0a05ddbbe4c8f359626d0b3305f766077d51388a6bac58", + "sha256:b96d559e0fcddd3343c510a0fe2b127fbff16bf346dd76280b82292567523442", + "sha256:bcd51708a633410737111e998ceb3b45d3dbc98c0931f743d9bb0a209033a326", + "sha256:bfc8cdd7f33d57f0468b0614ae634cc38ab9202c6957a60e31d285a71ebe0301", + "sha256:c0342aafd421795d740e514bc9858ebddfc705a75a8c5046ac56d85fe97bf196", + "sha256:c279f0d2b34ef15f922b77966640ade58b4ccdfef1c4d94b20f2a364617a493f", + "sha256:c28b2fdcee797e1c1961cd3bcd3d545cab22ad202c846235197935e1df2f8ef7", + "sha256:c3bc7bf8cb8806f8d1c9bf149c18708cb1c406520097d6b0a73977460ea03602", + "sha256:c4dcb4120d0cc3cc448624147dba64e9021b278c63e34a38789b688fd0da9bf3", + "sha256:c8aa771ff2c13dd9cda8166d685d7333d389fae30a4d2bb39d63ab5775de8606", + "sha256:cc1276d369452040cbb943300dc8abeedab14245ea44056a2943183822513a18", + "sha256:cd2fd827b0ba763ac919440042302315c564fdb797294d86e8cdd4578e3bc7f3", + "sha256:d30bbc1644f726b825b3278764240f449d75f1a8bdda892e641d4a688b1494ae", + "sha256:d5e9db7ef3ecbfc0b4733579cea45713a76852b002cf605420b12ef3ef1ec148", + "sha256:dbd2ecfbfee70bc1a4acb7461fa6af7748ec2ab08ac0fa298f281c51518f982c", + "sha256:dd86b8e7f703ec6ff4f351cfdb9f428955859537125904aa8c963604f2e9d3e7", + "sha256:dee1316133c9b463aa81aca676bc506d3f80d8f65aeb0bba2b78d0b30c51d7bd", + "sha256:e0c48b6300cd0b0106bf49169c3e0536408dfbeb1ccb53180068a18b03c662ab", + "sha256:e5d0ddaca65ecca9c10dcf01730165fd858533d0be84c75c327487c37a906a27", + "sha256:e6a4dd644d72ab316b580a1c120b375890e4c52ec392d4aef3c63361ec4d77d1", + "sha256:eade977f5c96c677035ff39c56ac74d851b1cca7d607ab3d8f23c6b859379cab", + "sha256:ec28adb204b759306a3d64358a5e5c07d7b1dd0ccbce04aa76cb9377b7b70296", + "sha256:ece616532c499ee9afbb83078b1b952beffef121d989841f7f4b3dc5ac0fd212", + "sha256:eefc37f6138f522e771ac6db71a6d4838ec7933939676f3753eafd7d3f4c40bc", + "sha256:f0b48edbebea1b7421a9c687c304f7b44d0677c46498a046079d445454504737", + "sha256:f1abffa122452481a61c3551ab3c89d72238e279e517705b8b03847b1d93d738", + "sha256:f2f2c61bee5844d41c3eb015ac652a0229e901074951ae48581d58bfb2ba01be", + "sha256:f7b58d1fd3551b8c80a971199543379be1cee3d0d409e1f6d8b01c1a2eebf1f8", + "sha256:fa0cafd3a2af231b4e113fba24a65d7922af91aeb23774a8b78228e6cd785e3e", + "sha256:fa9f547bd98f5553d03160967866a71056a60960be00356a15ecc44efb40ba8e", + "sha256:fab81ef75003eda96239a23eda4e4543cedc22e34c373edcaf744e721a163986", + "sha256:fd1b2281d01723f076df3c8188f43f2472248a6b63118b036e641243656b1b0f", + "sha256:fe1a92cfbaa0a1253e339ccec42dbe6db262615e52df591b68726ab10338003f" + ], + "markers": "python_version >= '3.7'", + "version": "==3.5.0" + }, + "yarl": { + "hashes": [ + "sha256:00e5a1fea0fd4f5bfa7440a47eff01d9822a65b4488f7cff83155a0f31a2ecba", + "sha256:02ddb6756f8f4517a2d5e99d8b2f272488e18dd0bfbc802f31c16c6c20f22193", + "sha256:045b8482ce9483ada4f3f23b3774f4e1bf4f23a2d5c912ed5170f68efb053318", + "sha256:09c7907c8548bcd6ab860e5f513e727c53b4a714f459b084f6580b49fa1b9cee", + "sha256:0b0cad37311123211dc91eadcb322ef4d4a66008d3e1bdc404808992260e1a0e", + "sha256:0b3c92fa08759dbf12b3a59579a4096ba9af8dd344d9a813fc7f5070d86bbab1", + "sha256:0fb2171a4486bb075316ee754c6d8382ea6eb8b399d4ec62fde2b591f879778a", + "sha256:1a74a13a4c857a84a845505fd2d68e54826a2cd01935a96efb1e9d86c728e186", + "sha256:1d407181cfa6e70077df3377938c08012d18893f9f20e92f7d2f314a437c30b1", + "sha256:1dd4bdd05407ced96fed3d7f25dbbf88d2ffb045a0db60dbc247f5b3c5c25d50", + "sha256:25b411eddcfd56a2f0cd6a384e9f4f7aa3efee14b188de13048c25b5e91f1640", + "sha256:2d06d3005e668744e11ed80812e61efd77d70bb7f03e33c1598c301eea20efbb", + "sha256:2ec9bbba33b2d00999af4631a3397d1fd78290c48e2a3e52d8dd72db3a067ac8", + "sha256:3236da9272872443f81fedc389bace88408f64f89f75d1bdb2256069a8730ccc", + "sha256:35098b24e0327fc4ebdc8ffe336cee0a87a700c24ffed13161af80124b7dc8e5", + "sha256:41f7ce59d6ee7741af71d82020346af364949314ed3d87553763a2df1829cc58", + "sha256:436c4fc0a4d66b2badc6c5fc5ef4e47bb10e4fd9bf0c79524ac719a01f3607c2", + "sha256:4891ed92157e5430874dad17b15eb1fda57627710756c27422200c52d8a4e393", + "sha256:4ac515b860c36becb81bb84b667466885096b5fc85596948548b667da3bf9f24", + "sha256:5094d9206c64181d0f6e76ebd8fb2f8fe274950a63890ee9e0ebfd58bf9d787b", + "sha256:54d6921f07555713b9300bee9c50fb46e57e2e639027089b1d795ecd9f7fa910", + "sha256:578e281c393af575879990861823ef19d66e2b1d0098414855dd367e234f5b3c", + "sha256:5a3f356548e34a70b0172d8890006c37be92995f62d95a07b4a42e90fba54272", + "sha256:602d98f2c2d929f8e697ed274fbadc09902c4025c5a9963bf4e9edfc3ab6f7ed", + "sha256:61b1a825a13bef4a5f10b1885245377d3cd0bf87cba068e1d9a88c2ae36880e1", + "sha256:61e5e68cb65ac8f547f6b5ef933f510134a6bf31bb178be428994b0cb46c2a04", + "sha256:61ee62ead9b68b9123ec24bc866cbef297dd266175d53296e2db5e7f797f902d", + "sha256:6333c5a377c8e2f5fae35e7b8f145c617b02c939d04110c76f29ee3676b5f9a5", + "sha256:6748dbf9bfa5ba1afcc7556b71cda0d7ce5f24768043a02a58846e4a443d808d", + "sha256:67a283dd2882ac98cc6318384f565bffc751ab564605959df4752d42483ad889", + "sha256:75674776d96d7b851b6498f17824ba17849d790a44d282929c42dbb77d4f17ae", + "sha256:757e81cae69244257d125ff31663249b3013b5dc0a8520d73694aed497fb195b", + "sha256:77a6e85b90a7641d2e07184df5557132a337f136250caafc9ccaa4a2a998ca2c", + "sha256:7c33dd1931a95e5d9a772d0ac5e44cac8957eaf58e3c8da8c1414de7dd27c576", + "sha256:7df647e8edd71f000a5208fe6ff8c382a1de8edfbccdbbfe649d263de07d8c34", + "sha256:7e2ee16578af3b52ac2f334c3b1f92262f47e02cc6193c598502bd46f5cd1477", + "sha256:80316a8bd5109320d38eef8833ccf5f89608c9107d02d2a7f985f98ed6876990", + "sha256:82123d0c954dc58db301f5021a01854a85bf1f3bb7d12ae0c01afc414a882ca2", + "sha256:84b2deecba4a3f1a398df819151eb72d29bfeb3b69abb145a00ddc8d30094512", + "sha256:8503ad47387b8ebd39cbbbdf0bf113e17330ffd339ba1144074da24c545f0069", + "sha256:877d209b6aebeb5b16c42cbb377f5f94d9e556626b1bfff66d7b0d115be88d0a", + "sha256:8874027a53e3aea659a6d62751800cf6e63314c160fd607489ba5c2edd753cf6", + "sha256:88a19f62ff30117e706ebc9090b8ecc79aeb77d0b1f5ec10d2d27a12bc9f66d0", + "sha256:8d39d351e7faf01483cc7ff7c0213c412e38e5a340238826be7e0e4da450fdc8", + "sha256:90adb47ad432332d4f0bc28f83a5963f426ce9a1a8809f5e584e704b82685dcb", + "sha256:913829534200eb0f789d45349e55203a091f45c37a2674678744ae52fae23efa", + "sha256:93b2e109287f93db79210f86deb6b9bbb81ac32fc97236b16f7433db7fc437d8", + "sha256:9d41beda9dc97ca9ab0b9888cb71f7539124bc05df02c0cff6e5acc5a19dcc6e", + "sha256:a440a2a624683108a1b454705ecd7afc1c3438a08e890a1513d468671d90a04e", + "sha256:a4bb030cf46a434ec0225bddbebd4b89e6471814ca851abb8696170adb163985", + "sha256:a9ca04806f3be0ac6d558fffc2fdf8fcef767e0489d2684a21912cc4ed0cd1b8", + "sha256:ac1801c45cbf77b6c99242eeff4fffb5e4e73a800b5c4ad4fc0be5def634d2e1", + "sha256:ac36703a585e0929b032fbaab0707b75dc12703766d0b53486eabd5139ebadd5", + "sha256:b1771de9944d875f1b98a745bc547e684b863abf8f8287da8466cf470ef52690", + "sha256:b464c4ab4bfcb41e3bfd3f1c26600d038376c2de3297760dfe064d2cb7ea8e10", + "sha256:b4f6450109834af88cb4cc5ecddfc5380ebb9c228695afc11915a0bf82116789", + "sha256:b57f4f58099328dfb26c6a771d09fb20dbbae81d20cfb66141251ea063bd101b", + "sha256:b643562c12680b01e17239be267bc306bbc6aac1f34f6444d1bded0c5ce438ca", + "sha256:b958ddd075ddba5b09bb0be8a6d9906d2ce933aee81100db289badbeb966f54e", + "sha256:b9d60031cf568c627d028239693fd718025719c02c9f55df0a53e587aab951b5", + "sha256:ba23302c0c61a9999784e73809427c9dbedd79f66a13d84ad1b1943802eaaf59", + "sha256:ba87babd629f8af77f557b61e49e7c7cac36f22f871156b91e10a6e9d4f829e9", + "sha256:c017a3b6df3a1bd45b9fa49a0f54005e53fbcad16633870104b66fa1a30a29d8", + "sha256:c1e1cc06da1491e6734f0ea1e6294ce00792193c463350626571c287c9a704db", + "sha256:c654d5207c78e0bd6d749f6dae1dcbbfde3403ad3a4b11f3c5544d9906969dde", + "sha256:c69697d3adff5aa4f874b19c0e4ed65180ceed6318ec856ebc423aa5850d84f7", + "sha256:c7d79f7d9aabd6011004e33b22bc13056a3e3fb54794d138af57f5ee9d9032cb", + "sha256:ccaa3a4b521b780a7e771cc336a2dba389a0861592bbce09a476190bb0c8b4b3", + "sha256:ccd17349166b1bee6e529b4add61727d3f55edb7babbe4069b5764c9587a8cc6", + "sha256:ce1af883b94304f493698b00d0f006d56aea98aeb49d75ec7d98cd4a777e9285", + "sha256:d0e883008013c0e4aef84dcfe2a0b172c4d23c2669412cf5b3371003941f72bb", + "sha256:d980e0325b6eddc81331d3f4551e2a333999fb176fd153e075c6d1c2530aa8a8", + "sha256:e17c9361d46a4d5addf777c6dd5eab0715a7684c2f11b88c67ac37edfba6c482", + "sha256:e2c08cc9b16f4f4bc522771d96734c7901e7ebef70c6c5c35dd0f10845270bcd", + "sha256:e35ef8683211db69ffe129a25d5634319a677570ab6b2eba4afa860f54eeaf75", + "sha256:e3b9fd71836999aad54084906f8663dffcd2a7fb5cdafd6c37713b2e72be1760", + "sha256:ef9f7768395923c3039055c14334ba4d926f3baf7b776c923c93d80195624782", + "sha256:f52a265001d830bc425f82ca9eabda94a64a4d753b07d623a9f2863fde532b53", + "sha256:f91c4803173928a25e1a55b943c81f55b8872f0018be83e3ad4938adffb77dd2", + "sha256:fbd6748e8ab9b41171bb95c6142faf068f5ef1511935a0aa07025438dd9a9bc1", + "sha256:fe57328fbc1bfd0bd0514470ac692630f3901c0ee39052ae47acd1d90a436719", + "sha256:fea09ca13323376a2fdfb353a5fa2e59f90cd18d7ca4eaa1fd31f0a8b4f91e62" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==1.18.3" + }, + "youtube-transcript-api": { + "hashes": [ + "sha256:902baf90e7840a42e1e148335e09fe5575dbff64c81414957aea7038e8a4db46", + "sha256:d1874e57de65cf14c9d7d09b2b37c814d6287fa0e770d4922c4cd32a5b3f6c47" + ], + "index": "pypi", + "markers": "python_version < '3.14' and python_version >= '3.8'", + "version": "==1.0.3" + }, + "zipp": { + "hashes": [ + "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4", + "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==3.21.0" + }, + "zstandard": { + "hashes": [ + "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", + "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916", + "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15", + "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", + "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4", + "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", + "sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26", + "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", + "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5", + "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", + "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", + "sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db", + "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", + "sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc", + "sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152", + "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269", + "sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045", + "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", + "sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d", + "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", + "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb", + "sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740", + "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", + "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274", + "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", + "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58", + "sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b", + "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", + "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", + "sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e", + "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", + "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", + "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", + "sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e", + "sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512", + "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", + "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", + "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", + "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", + "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", + "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", + "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", + "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", + "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", + "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", + "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", + "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", + "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", + "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", + "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70", + "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259", + "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", + "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700", + "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", + "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", + "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", + "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", + "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", + "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", + "sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f", + "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", + "sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d", + "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9", + "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", + "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", + "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", + "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", + "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", + "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", + "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", + "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", + "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", + "sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9", + "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", + "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", + "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", + "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", + "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2", + "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", + "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", + "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", + "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", + "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", + "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", + "sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54", + "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", + "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", + "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", + "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", + "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58", + "sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8", + "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", + "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a", + "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", + "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", + "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", + "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69" + ], + "markers": "python_version >= '3.8'", + "version": "==0.23.0" + } + }, + "develop": {} +} diff --git a/backend/constraints.txt b/backend/constraints.txt index 2c785f6de..0e4dbc4a4 100644 --- a/backend/constraints.txt +++ b/backend/constraints.txt @@ -1,4 +1,8 @@ -f https://download.pytorch.org/whl/torch_stable.html -torch==2.3.1+cpu -torchvision==0.18.1+cpu -torchaudio==2.3.1+cpu \ No newline at end of file +# torch==2.3.1+cpu +# torchvision==0.18.1+cpu +# torchaudio==2.3.1+cpu +torch==2.3.1 +torchvision==0.18.1 +torchaudio==2.3.1 + diff --git a/backend/requirements.txt b/backend/requirements.txt index 7ced40181..fefd3fc6f 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,3 +1,4 @@ +#pycryptodome==3.22.0 #added by ian to pin version to prevent bug (maybe move to constraints.txt) commented out hoping the upstream config fixes these errors. accelerate==1.6.0 asyncio==3.4.3 boto3==1.37.29 @@ -40,7 +41,7 @@ starlette==0.46.1 sse-starlette==2.2.1 starlette-session==0.4.3 tqdm==4.67.1 -unstructured[all-docs] +unstructured[all-docs] #in the pipfile we have unstructured[pdf,md,docx,pptx], need to reconcile these two unstructured==0.17.2 unstructured-client==0.32.3 unstructured-inference==0.8.10 @@ -59,6 +60,11 @@ graphdatascience==1.14 Secweb==1.18.1 ragas==0.2.14 rouge_score==0.1.2 + + # ian added this langchain-neo4j==0.1.1 to prevent a bug, commented out bc upstream added a newer version + #langchain-neo4j==0.1.1 # added by ian to prevent bug (maybe move to constraints.txt) +#pdfminer.six==20240706 # added by ian to prevent bud (maybe move to constraints.txt) commented out hoping the upstream config fixes these errors. langchain-neo4j==0.4.0 pypandoc-binary==1.15 chardet==5.2.0 +contextgem==0.8.1 \ No newline at end of file diff --git a/backend/score.py b/backend/score.py index 11209a0b4..2da12487a 100644 --- a/backend/score.py +++ b/backend/score.py @@ -4,6 +4,7 @@ from src.main import * from src.QA_integration import * from src.shared.common_fn import * +from src.shared.constants import CHAT_SEARCH_KWARG_SCORE_THRESHOLD from src.shared.llm_graph_builder_exception import LLMGraphBuilderException import uvicorn import asyncio @@ -19,6 +20,8 @@ from src.communities import create_communities from src.neighbours import get_neighbour_nodes import json +from typing import Dict, Any +from starlette.middleware.sessions import SessionMiddleware from typing import List, Optional from google.oauth2.credentials import Credentials import os @@ -32,15 +35,63 @@ from src.ragas_eval import * from starlette.types import ASGIApp, Receive, Scope, Send from langchain_neo4j import Neo4jGraph +from pydantic import BaseModel + +# this load_dotenv added by ian for non-docker environments from starlette.middleware.sessions import SessionMiddleware from starlette.requests import Request from dotenv import load_dotenv load_dotenv(override=True) +# # Get the absolute path to the .env file +# env_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), '.env') +# logging.info(f"Loading .env file from: {env_path}") + +# # Debug: Print contents of .env file +# try: +# with open(env_path, 'r') as f: +# env_contents = f.read() +# logging.info(f"\nContents of main .env file:\n{env_contents}") +# except Exception as e: +# logging.error(f"Error reading .env file: {e}") + + +class Message(BaseModel): + role: str + content: str + +class MessageData(BaseModel): + messages: List[Message] # Wrap the messages array in an object + question: str + filter_properties: Optional[Dict[str, Any]] = None + requireGrounding: bool = True + document_names: Optional[List[str]] = [] + uri: Optional[str] = None + userName: Optional[str] = None + password: Optional[str] = None + database: Optional[str] = None + model: Optional[str] = None + chunk_similarity_threshold: Optional[float] = None + session_id: Optional[str] = None + # tools: List[str] + logger = CustomLogger() CHUNK_DIR = os.path.join(os.path.dirname(__file__), "chunks") MERGED_DIR = os.path.join(os.path.dirname(__file__), "merged_files") +# def printEnvKey(key): +# if key in os.environ: +# value = os.environ.get(key) +# logging.info(f"{key} exists and has value: {value}") +# else: +# logging.info(f"{key} does NOT exist in environment variables") + +# def printAllEnvVars(): +# logging.info("All environment variables:") +# for key, value in os.environ.items(): +# logging.info(f"{key} = {value}") + +# printAllEnvVars() def sanitize_filename(filename): """ Sanitize the user-provided filename to prevent directory traversal and remove unsafe characters. @@ -413,10 +464,113 @@ async def post_processing(uri=Form(None), userName=Form(None), password=Form(Non finally: gc.collect() + +@app.post("/magic-trek-chatbot") +async def magic_trek_chat_bot( + messageData: MessageData, + #uri=Form(), + # model=Form(None), + # userName=Form(), + # password=Form(), + # database=Form(), + # question=Form(None), + # document_names=Form(None) + # session_id=str, + # mode=Form(None) + ): + logging.info(messageData) + messages = messageData.messages + question = messageData.question + filter_properties = messageData.filter_properties + model = messageData.model if hasattr(messageData, 'model') else "openai_gpt_4o_mini" + requireGrounding = messageData.requireGrounding if hasattr(messageData, 'requireGrounding') else True + document_names = messageData.document_names if hasattr(messageData, 'document_names') else [] + document_names = json.dumps(document_names) + chunk_similarity_threshold = messageData.chunk_similarity_threshold if hasattr(messageData, 'chunk_similarity_threshold') and messageData.chunk_similarity_threshold is not None else CHAT_SEARCH_KWARG_SCORE_THRESHOLD + session_id = messageData.session_id if hasattr(messageData, 'session_id') and messageData.session_id is not None else "7f7fb2ac-d849-4569-9647-17d5f3a1615e" + # Get connection parameters from API params, fallback to environment variables + uri = messageData.uri if messageData.uri else os.getenv('MAGIC_TREK_NEO4J_URI') + userName = messageData.userName if messageData.userName else os.getenv('MAGIC_TREK_NEO4J_USERNAME') + password = messageData.password if messageData.password else os.getenv('MAGIC_TREK_NEO4J_PASSWORD') + database = messageData.database if messageData.database else os.getenv('MAGIC_TREK_NEO4J_DATABASE') + + print(f'question = {question}') + print(messages) + print(len(messages)) + print(f"document_names = {document_names}") + print(f"filter_properties = {filter_properties}") + logging.info(f"requireGrounding = {requireGrounding}") + logging.info(f"IAN-TEST called at {datetime.now()}") + qa_rag_start_time = time.time() + logging.info(f"model = {model}") + + # model = "openai_gpt_3.5" # changed from this model by ian friday mar 21, 2025 + # model = "openai_gpt_4o_mini" + # model = "gpt-4-turbo-preview" + mode = os.getenv('MAGIC_TREK_RAG_MODE') ## changed by ian from graph_vector_fulltext to graph_vector april 1, 2025 + # uri = "neo4j+s://bf80b146.databases.neo4j.io" + + print(f"MAGIC_TREK_NEO4J_URI: {uri}") + print(f"MAGIC_TREK_RAG_MODE: {mode}") + print(f"CHAT_SEARCH_KWARG_SCORE_THRESHOLD: {CHAT_SEARCH_KWARG_SCORE_THRESHOLD}") + + mode = "graph_vector" + # document_names= '["MM Disease State Overview_FGuide_March2025_scrubbed.txt"]' + ## end of added by ian + try: + if mode == "graph": + graph = Neo4jGraph( url=uri,username=userName,password=password,database=database,sanitize = True, refresh_schema=True) + print("created neo4j graph object") + else: + graph = create_graph_database_connection(uri, userName, password, database) + + graph_DB_dataAccess = graphDBdataAccess(graph) + write_access = graph_DB_dataAccess.check_account_access(database=database) + result = await asyncio.to_thread( + MAGIC_TREK_QA_RAG, + graph=graph, + model=model, + messages=messages, + question=question, + document_names=document_names, + session_id=session_id, + mode=mode, + write_access=write_access, + filter_properties=filter_properties, + requireGrounding=requireGrounding, + chunk_similarity_threshold=chunk_similarity_threshold + ) + + total_call_time = time.time() - qa_rag_start_time + logging.info(f"Total Response time is {total_call_time:.2f} seconds") + result["info"]["response_time"] = round(total_call_time, 2) + + json_obj = {'api_name':'chat_bot','db_url':uri, 'userName':userName, 'database':database, 'question':question,'document_names':document_names, + 'session_id':session_id, 'mode':mode, 'logging_time': formatted_time(datetime.now(timezone.utc)), 'elapsed_api_time':f'{total_call_time:.2f}'} + logger.log_struct(json_obj, "INFO") + + logging.info("printing tool calls in magic_trek_chat_bot") + logging.info(result["tool_calls"]) + response = create_api_response('Success',data=result) + log_start = time.time() + logging.info("response") + logging.info(response) + log_time = time.time() - log_start + logging.info(f"Logging response took {log_time:.2f} seconds") + return response + except Exception as e: + job_status = "Failed" + message="Unable to get chat response" + error_message = str(e) + logging.exception(f'Exception in chat bot:{error_message}') + return create_api_response(job_status, message=message, error=error_message,data=mode) + finally: + gc.collect() @app.post("/chat_bot") async def chat_bot(uri=Form(None),model=Form(None),userName=Form(None), password=Form(None), database=Form(None),question=Form(None), document_names=Form(None),session_id=Form(None),mode=Form(None),email=Form(None)): logging.info(f"QA_RAG called at {datetime.now()}") + logging.info(f"document_names = {document_names}") qa_rag_start_time = time.time() try: if mode == "graph": @@ -446,6 +600,70 @@ async def chat_bot(uri=Form(None),model=Form(None),userName=Form(None), password finally: gc.collect() +@app.post("/chat_bot_grounding") +async def chat_bot_grounding( + uri=Form(None), + model=Form(None), + userName=Form(None), + password=Form(None), + database=Form(None), + question=Form(None), + document_names=Form(None), + session_id=Form(None), + mode=Form(None), + email=Form(None), + requireGrounding: bool = Form(True), + filterProperties: str = Form(None), + chunk_similarity_threshold: float = Form(None) +): + logging.info(f"QA_RAG (grounding) called at {datetime.now()}") + logging.info(f"document_names = {document_names}") + logging.info(f"filterProperties = {filterProperties}") + logging.info(f"model = {model}") + qa_rag_start_time = time.time() + + # Parse filterProperties JSON if provided + filter_properties = None + if filterProperties: + try: + filter_properties = json.loads(filterProperties) + except json.JSONDecodeError as e: + logging.warning(f"Invalid JSON in filterProperties: {e}") + filter_properties = None + + # Use chunk_similarity_threshold parameter if provided, otherwise fallback to default constant + effective_chunk_similarity_threshold = chunk_similarity_threshold if chunk_similarity_threshold is not None else CHAT_SEARCH_KWARG_SCORE_THRESHOLD + logging.info(f"effective_chunk_similarity_threshold = {effective_chunk_similarity_threshold}") + try: + if mode == "graph": + graph = Neo4jGraph( url=uri,username=userName,password=password,database=database,sanitize = True, refresh_schema=True) + else: + graph = create_graph_database_connection(uri, userName, password, database) + + graph_DB_dataAccess = graphDBdataAccess(graph) + write_access = graph_DB_dataAccess.check_account_access(database=database) + # Select the system template based on requireGrounding (to be used inside QA_RAG or before calling it): + # system_template = CHAT_SYSTEM_TEMPLATE if requireGrounding else CHAT_SYSTEM_TEMPLATE_UNGROUNDED + result = await asyncio.to_thread(QA_RAG_GROUNDING,graph=graph,model=model,question=question,document_names=document_names,session_id=session_id,mode=mode,write_access=write_access,filter_properties=filter_properties,requireGrounding=requireGrounding,chunk_similarity_threshold=effective_chunk_similarity_threshold) + + total_call_time = time.time() - qa_rag_start_time + logging.info(f"Total Response time is {total_call_time:.2f} seconds") + result["info"]["response_time"] = round(total_call_time, 2) + + json_obj = {'api_name':'chat_bot_grounding','db_url':uri, 'userName':userName, 'database':database, 'question':question,'document_names':document_names, + 'session_id':session_id, 'mode':mode, 'requireGrounding': requireGrounding, 'filterProperties': filterProperties, 'logging_time': formatted_time(datetime.now(timezone.utc)), 'elapsed_api_time':f'{total_call_time:.2f}','email':email} + logger.log_struct(json_obj, "INFO") + + return create_api_response('Success',data=result) + except Exception as e: + job_status = "Failed" + message="Unable to get chat response" + error_message = str(e) + logging.exception(f'Exception in chat bot grounding:{error_message}') + return create_api_response(job_status, message=message, error=error_message,data=mode) + finally: + gc.collect() + @app.post("/chunk_entities") async def chunk_entities(uri=Form(None),userName=Form(None), password=Form(None), database=Form(None), nodedetails=Form(None),entities=Form(),mode=Form(),email=Form(None)): try: diff --git a/backend/src/QA_integration.py b/backend/src/QA_integration.py index 1d3afb8e8..421a32931 100644 --- a/backend/src/QA_integration.py +++ b/backend/src/QA_integration.py @@ -8,6 +8,10 @@ from typing import Any from dotenv import load_dotenv +# Set tokenizer parallelism to false to avoid warnings and deadlock +# added by ian because of hugging face threading tokenizer deadlock warning +os.environ["TOKENIZERS_PARALLELISM"] = "false" + from langchain_neo4j import Neo4jVector from langchain_neo4j import Neo4jChatMessageHistory from langchain_neo4j import GraphCypherQAChain @@ -18,7 +22,7 @@ from langchain_community.document_transformers import EmbeddingsRedundantFilter from langchain.retrievers.document_compressors import EmbeddingsFilter, DocumentCompressorPipeline from langchain_text_splitters import TokenTextSplitter -from langchain_core.messages import HumanMessage, AIMessage +from langchain_core.messages import HumanMessage, AIMessage, SystemMessage from langchain_community.chat_message_histories import ChatMessageHistory from langchain_core.callbacks import StdOutCallbackHandler, BaseCallbackHandler @@ -32,7 +36,7 @@ from langchain_community.chat_models import ChatOllama # Local imports -from src.llm import get_llm +from src.llm import get_llm, create_chat_completion_sync from src.shared.common_fn import load_embedding_model from src.shared.constants import * load_dotenv() @@ -40,6 +44,18 @@ EMBEDDING_MODEL = os.getenv('EMBEDDING_MODEL') EMBEDDING_FUNCTION , _ = load_embedding_model(EMBEDDING_MODEL) +# old tool extraction prompt +# "Only invoke tools based off when the user makes a selection in their messages. +# Only reference older messages to understand what the user's selection is." + +TOOL_EXTRACTION_PROMPT = """ +You are an intelligent assistant responsible for analyzing user inputs and invoking functions when the user makes a selection. +The conversation you are analyzing is between an ai assistant helping a user to make choices about a lesson they are creating. +- Call a function only when the user makes an active selection that matches one of the tools. +- Avoid invoking functions for tools that have already been called. +- If multiple functions need to be called based on the user's input, invoke all relevant functions simultaneously. +- Only the user's most recent input should trigger a function, but reference past context when needed to understand their intent. +""" class SessionChatHistory: history_dict = {} @@ -63,6 +79,7 @@ def on_llm_end( ) -> None: logging.info("question transformed") self.transformed_question = response.generations[0][0].text.strip() + logging.info(self.transformed_question) def get_history_by_session_id(session_id): try: @@ -225,13 +242,13 @@ def format_documents(documents, model,chat_mode_settings): return "\n\n".join(formatted_docs), sources,entities,global_communities -def process_documents(docs, question, messages, llm, model,chat_mode_settings): +def process_documents(docs, question, messages, llm, model,chat_mode_settings, requireGrounding=True): start_time = time.time() try: formatted_docs, sources, entitydetails, communities = format_documents(docs, model,chat_mode_settings) - - rag_chain = get_rag_chain(llm=llm) + logging.info(f"process_documents requireGrounding = {requireGrounding}") + rag_chain = get_rag_chain(llm=llm, system_template=CHAT_SYSTEM_TEMPLATE if requireGrounding else CHAT_SYSTEM_TEMPLATE_UNGROUNDED) ai_response = rag_chain.invoke({ "messages": messages[:-1], @@ -273,9 +290,16 @@ def retrieve_documents(doc_retriever, messages): start_time = time.time() try: + logging.info(f"=== DOCUMENT RETRIEVAL - MESSAGES BEING USED ===") + for i, msg in enumerate(messages): + logging.info(f"Retrieval Message {i}: Role={msg.type}, Content={msg.content}") + logging.info(msg.content) + logging.info(f"=== END RETRIEVAL MESSAGES (Total: {len(messages)} messages) ===") + handler = CustomCallback() docs = doc_retriever.invoke({"messages": messages},{"callbacks":[handler]}) transformed_question = handler.transformed_question + logging.info(f"transformed question {transformed_question}") if transformed_question: logging.info(f"Transformed question : {transformed_question}") doc_retrieval_time = time.time() - start_time @@ -300,6 +324,8 @@ def create_document_retriever_chain(llm, retriever): MessagesPlaceholder(variable_name="messages") ] ) + logging.info("query_transform_prompt created") + logging.info(query_transform_prompt) output_parser = StrOutputParser() @@ -375,42 +401,110 @@ def initialize_neo4j_vector(graph, chat_mode_settings): raise return neo_db -def create_retriever(neo_db, document_names, chat_mode_settings,search_k, score_threshold,ef_ratio): +def create_retriever(neo_db, document_names, chat_mode_settings,search_k, score_threshold,ef_ratio, filter_properties=None): if document_names and chat_mode_settings["document_filter"]: + # Combine filter_properties with fileName filter + base_filter = {'fileName': {'$in': document_names}} + if filter_properties: + base_filter.update(filter_properties) + retriever = neo_db.as_retriever( search_type="similarity_score_threshold", search_kwargs={ 'top_k': search_k, 'effective_search_ratio': ef_ratio, 'score_threshold': score_threshold, - 'filter': {'fileName': {'$in': document_names}} - } + 'filter': base_filter + }, ) logging.info(f"Successfully created retriever with search_k={search_k}, score_threshold={score_threshold} for documents {document_names}") else: + # note from ian changed the way this is written slightly to match how the upstream team is doing it, passing filter_properties or None to search_kwargs literal. + + # search_kwargs = { + # 'k': search_k, + # 'score_threshold': score_threshold, + # "filter": { + # "topics": { "$like": "topic_ENDOC"} + # } + # } + search_kwargs = { + 'k': search_k, + 'score_threshold': score_threshold, + # "filter": filter_properties + } + if filter_properties is not None: + search_kwargs['filter'] = filter_properties + retriever = neo_db.as_retriever( search_type="similarity_score_threshold", - search_kwargs={'top_k': search_k,'effective_search_ratio': ef_ratio, 'score_threshold': score_threshold} + # search_kwargs={'top_k': search_k,'effective_search_ratio': ef_ratio, 'score_threshold': score_threshold, "filter_properties": filter_properties if filter_properties is not None else None } + search_kwargs=search_kwargs ) - logging.info(f"Successfully created retriever with search_k={search_k}, score_threshold={score_threshold}") + print(f"search_kwargs = {search_kwargs}") + logging.info(f"Successfully created retriever with search_k={search_k}, score_threshold={score_threshold}, filter={filter_properties}") return retriever -def get_neo4j_retriever(graph, document_names,chat_mode_settings, score_threshold=CHAT_SEARCH_KWARG_SCORE_THRESHOLD): +def get_neo4j_retriever(graph, document_names, chat_mode_settings, score_threshold=CHAT_SEARCH_KWARG_SCORE_THRESHOLD, filter_properties=None): try: - neo_db = initialize_neo4j_vector(graph, chat_mode_settings) # document_names= list(map(str.strip, json.loads(document_names))) search_k = chat_mode_settings["top_k"] ef_ratio = int(os.getenv("EFFECTIVE_SEARCH_RATIO", "2")) if os.getenv("EFFECTIVE_SEARCH_RATIO", "2").isdigit() else 2 - retriever = create_retriever(neo_db, document_names,chat_mode_settings, search_k, score_threshold,ef_ratio) + + # Use the parameter instead of hardcoded value + retriever = create_retriever(neo_db, document_names,chat_mode_settings, search_k, score_threshold,ef_ratio, filter_properties) return retriever except Exception as e: index_name = chat_mode_settings.get("index_name") logging.error(f"Error retrieving Neo4jVector index {index_name} or creating retriever: {e}") raise Exception(f"An error occurred while retrieving the Neo4jVector index or creating the retriever. Please drop and create a new vector index '{index_name}': {e}") from e +def extract_tool_calls_direct(model, messages): + """ + Synchronous version of extract_tool_calls that uses OpenAI chat completion API directly. + Leaves original extract_tool_calls function unchanged. + """ + if not isinstance(messages, list): + return [] + logging.info("extract_tool_calls_direct called with messages below") + logging.info(messages) + + # extract tool calling + messages_copy = list(messages) + + # remove the system message and insert our tool extraction prompt + messages.pop(0) + messages.insert(0, SystemMessage(TOOL_EXTRACTION_PROMPT)) + + # Convert messages to the format expected by create_chat_completion + formatted_messages = [ + { + "role": "system" if isinstance(msg, SystemMessage) else + "assistant" if isinstance(msg, AIMessage) else + "user", + "content": msg.content + } + for msg in messages + ] -def setup_chat(model, graph, document_names, chat_mode_settings): + logging.info("calling tool extracting with direct OpenAI API") + start_time = time.time() + response = create_chat_completion_sync( + messages=formatted_messages, + model=model, + add_tools=True + ) + tool_extraction_time = time.time() - start_time + logging.info(f"Tool extraction took {tool_extraction_time:.2f} seconds") + + logging.info(response) + # Extract tool calls from additional_kwargs, handle missing key gracefully + tools = response.additional_kwargs.get("tool_calls", []) + tools = list(map(remap_tool_names, tools)) + return tools + +def setup_chat(model, graph, document_names, chat_mode_settings, filter_properties=None, chunk_similarity_threshold=None): start_time = time.time() try: if model == "diffbot": @@ -419,7 +513,9 @@ def setup_chat(model, graph, document_names, chat_mode_settings): llm, model_name = get_llm(model=model) logging.info(f"Model called in chat: {model} (version: {model_name})") - retriever = get_neo4j_retriever(graph=graph, chat_mode_settings=chat_mode_settings, document_names=document_names) + # Use chunk_similarity_threshold as score_threshold if provided, otherwise use default + effective_score_threshold = chunk_similarity_threshold if chunk_similarity_threshold is not None else CHAT_SEARCH_KWARG_SCORE_THRESHOLD + retriever = get_neo4j_retriever(graph=graph, chat_mode_settings=chat_mode_settings, document_names=document_names, filter_properties=filter_properties, score_threshold=effective_score_threshold) doc_retriever = create_document_retriever_chain(llm, retriever) chat_setup_time = time.time() - start_time @@ -431,15 +527,72 @@ def setup_chat(model, graph, document_names, chat_mode_settings): return llm, doc_retriever, model_name -def process_chat_response(messages, history, question, model, graph, document_names, chat_mode_settings): +def remap_tool_names(tool): + tool_name_map = { + "EducationLevelInput": "onSelectEducationLevel", + "LessonTopicInput": "onSelectLessonTopic", + "SelectSubjectInput": "onSelectSubject", + "OnGenerateKeywordsInput": "onGenerateKeywords" + } + current_name = tool["function"]["name"] + if current_name in tool_name_map: + tool["function"]["name"] = tool_name_map[current_name] + return tool + +def extract_tool_calls(model, messages): + if not isinstance(messages, list): + return [] + logging.info("extract_tool_calls called with messages below") + logging.info(messages) + # extract tool calling + messages_copy = list(messages) + + # remove the system + messages.pop(0) + messages.insert(0, SystemMessage(TOOL_EXTRACTION_PROMPT)) + + llm_with_tools,model_name = get_llm(model, add_tools=True) + logging.info("calling tool extracting llm") + + response = llm_with_tools.invoke(messages) + logging.info(response) + # Extract tool calls from additional_kwargs, handle missing key gracefully + tools = response.additional_kwargs.get("tool_calls", []) + tools = list(map(remap_tool_names, tools)) + return tools + + +def process_chat_response(messages, history, question, model, graph, document_names, chat_mode_settings, extract_tools=False, filter_properties=None, requireGrounding=True, chunk_similarity_threshold=None): try: - llm, doc_retriever, model_version = setup_chat(model, graph, document_names, chat_mode_settings) - - docs,transformed_question = retrieve_documents(doc_retriever, messages) + llm, doc_retriever, model_version = setup_chat(model, graph, document_names, chat_mode_settings, filter_properties, chunk_similarity_threshold) + + # Shared variable to store tool calls, initialized as empty list + tool_calls = [] + tool_calls_lock = threading.Lock() + + def extract_tools_thread(): + nonlocal tool_calls + if extract_tools: + extracted_tools = extract_tool_calls_direct(model, messages) + with tool_calls_lock: + tool_calls = extracted_tools + logging.info("returned tool calls") + logging.info(tool_calls) + + # Start tool extraction thread if needed + tool_thread = None + if extract_tools: + tool_thread = threading.Thread(target=extract_tools_thread) + tool_thread.start() + + # Run document retrieval and processing in parallel with tool extraction + docs, transformed_question = retrieve_documents(doc_retriever, messages) if docs: - content, result, total_tokens,formatted_docs = process_documents(docs, question, messages, llm, model, chat_mode_settings) + logging.info("documents found, process_documents about to be called") + content, result, total_tokens, formatted_docs = process_documents(docs, question, messages, llm, model, chat_mode_settings, requireGrounding) else: + logging.info("No document clause running") content = "I couldn't find any relevant documents to answer your question." result = {"sources": list(), "nodedetails": list(), "entities": list()} total_tokens = 0 @@ -448,16 +601,20 @@ def process_chat_response(messages, history, question, model, graph, document_na ai_response = AIMessage(content=content) messages.append(ai_response) - summarization_thread = threading.Thread(target=summarize_and_log, args=(history, messages, llm)) - summarization_thread.start() - logging.info("Summarization thread started.") - # summarize_and_log(history, messages, llm) - metric_details = {"question":question,"contexts":formatted_docs,"answer":content} + if history: + summarization_thread = threading.Thread(target=summarize_and_log, args=(history, messages, llm)) + summarization_thread.start() + logging.info("Summarization thread started.") + + # Wait for tool extraction to complete if it was started + if tool_thread: + tool_thread.join() + + metric_details = {"question": question, "contexts": formatted_docs, "answer": content} return { "session_id": "", "message": content, "info": { - # "metrics" : metrics, "sources": result["sources"], "model": model_version, "nodedetails": result["nodedetails"], @@ -467,7 +624,7 @@ def process_chat_response(messages, history, question, model, graph, document_na "entities": result["entities"], "metric_details": metric_details, }, - + "tool_calls": tool_calls, "user": "chatbot" } @@ -531,7 +688,7 @@ def create_graph_chain(model, graph): logging.info(f"Graph QA Chain using LLM model: {model}") cypher_llm,model_name = get_llm(model) - qa_llm,model_name = get_llm(model) + qa_llm,model_name = get_llm(model, True) graph_chain = GraphCypherQAChain.from_llm( cypher_llm=cypher_llm, qa_llm=qa_llm, @@ -572,20 +729,23 @@ def get_graph_response(graph_chain, question): except Exception as e: logging.error(f"An error occurred while getting the graph response : {e}") -def process_graph_response(model, graph, question, messages, history): +def process_graph_response(model, graph, question, messages, history=None): try: graph_chain, qa_llm, model_version = create_graph_chain(model, graph) - + extract_tool_calls(model, question) graph_response = get_graph_response(graph_chain, question) - + logging.info("graph_response") + logging.info(graph_response) ai_response_content = graph_response.get("response", "Something went wrong") + logging.info(ai_response_content) ai_response = AIMessage(content=ai_response_content) messages.append(ai_response) # summarize_and_log(history, messages, qa_llm) - summarization_thread = threading.Thread(target=summarize_and_log, args=(history, messages, qa_llm)) - summarization_thread.start() - logging.info("Summarization thread started.") + if(history): + summarization_thread = threading.Thread(target=summarize_and_log, args=(history, messages, qa_llm)) + summarization_thread.start() + logging.info("Summarization thread started.") metric_details = {"question":question,"contexts":graph_response.get("context", ""),"answer":ai_response_content} result = { "session_id": "", @@ -640,6 +800,7 @@ def create_neo4j_chat_message_history(graph, session_id, write_access=True): raise def get_chat_mode_settings(mode,settings_map=CHAT_MODE_CONFIG_MAP): + logging.info(f"get_chat_mode_settings called with mode: {mode}") default_settings = settings_map[CHAT_DEFAULT_MODE] try: chat_mode_settings = settings_map.get(mode, default_settings) @@ -652,21 +813,163 @@ def get_chat_mode_settings(mode,settings_map=CHAT_MODE_CONFIG_MAP): raise return chat_mode_settings + +# Function to convert JSON message list to Langchain message objects +def convert_messages_to_langchain(messages): + langchain_messages = [] + + for msg in messages: + role = msg.role + content = msg.content + + if role == 'system': + langchain_messages.append(SystemMessage(content=content)) + elif role == 'assistant': + langchain_messages.append(AIMessage(content=content)) + elif role == 'user': # assuming the user role maps to HumanMessage + langchain_messages.append(HumanMessage(content=content)) + else: + raise ValueError(f"Unknown role: {role}") + return langchain_messages + +def MAGIC_TREK_QA_RAG(graph,model, messages, question, document_names, session_id, mode, write_access=True, filter_properties=None, requireGrounding=True, chunk_similarity_threshold=None): + logging.info(f"Chat Mode: {mode}") + logging.info(f"document_names = {document_names}") + logging.info(f"document_names type: {type(document_names)}") + # document_names = "[]" + logging.info(f"session_id = {session_id}") + logging.info(f"question = {question}") + logging.info(f"filter_properties = {filter_properties}") + logging.info(f"chunk_similarity_threshold = {chunk_similarity_threshold}") + # receive the message history from our frontend + messages = convert_messages_to_langchain(messages) + logging.info("translated message history:") + logging.info(messages) + + # NOTE: for now we are going to take our message history from the one maintained on magic trek + # frontend + # history = create_neo4j_chat_message_history(graph, session_id, write_access) + # messages = history.messages + + # print("message history") + # print(messages) + + user_question = HumanMessage(content=question) + messages.append(user_question) + + logging.info("messages") + logging.info(messages) + + if mode == CHAT_GRAPH_MODE: + logging.info("process_graph_response called") + result = process_graph_response(model, graph, question, messages, history=None) + else: + chat_mode_settings = get_chat_mode_settings(mode=mode) + document_names= list(map(str.strip, json.loads(document_names))) + if document_names and not chat_mode_settings["document_filter"]: + result = { + "session_id": "", + "message": "Please deselect all documents in the table before using this chat mode", + "info": { + "sources": [], + "model": "", + "nodedetails": [], + "total_tokens": 0, + "response_time": 0, + "mode": chat_mode_settings["mode"], + "entities": [], + "metric_details": [], + }, + "user": "chatbot" + } + else: + logging.info("process_chat_response called") + result = process_chat_response( + messages=messages, + history=None, # TODO: once we set up history pass it again instead of None + question=question, + model=model, + graph=graph, + document_names=document_names, + chat_mode_settings=chat_mode_settings, + extract_tools=True, + filter_properties=filter_properties, + requireGrounding=requireGrounding, + chunk_similarity_threshold=chunk_similarity_threshold + ) + + # result["session_id"] = session_id + # return False + return result + def QA_RAG(graph,model, question, document_names, session_id, mode, write_access=True): logging.info(f"Chat Mode: {mode}") history = create_neo4j_chat_message_history(graph, session_id, write_access) + print(history) + messages = history.messages + + print("message history") + print(messages) + + user_question = HumanMessage(content=question) + messages.append(user_question) + + tool_calls = extract_tool_calls(model, user_question) + logging.info(tool_calls) + + if mode == CHAT_GRAPH_MODE: + result = process_graph_response(model, graph, question, messages, history) + else: + chat_mode_settings = get_chat_mode_settings(mode=mode) + document_names= list(map(str.strip, json.loads(document_names))) + logging.info(f"chat_mode_settings['document_filter'] = {chat_mode_settings['document_filter']}") + if document_names and not chat_mode_settings["document_filter"]: + result = { + "session_id": "", + "message": "Please deselect all documents in the table before using this chat mode", + "info": { + "sources": [], + "model": "", + "nodedetails": [], + "total_tokens": 0, + "response_time": 0, + "mode": chat_mode_settings["mode"], + "entities": [], + "metric_details": [], + }, + "user": "chatbot" + } + else: + result = process_chat_response(messages,history, question, model, graph, document_names,chat_mode_settings, extract_tools=False, filter_properties={}) + + result["session_id"] = session_id + + return result + +def QA_RAG_GROUNDING(graph,model, question, document_names, session_id, mode, write_access=True, filter_properties=None, requireGrounding=True, chunk_similarity_threshold=None): + logging.info(f"Chat Mode: {mode}") + + history = create_neo4j_chat_message_history(graph, session_id, write_access) + print(history) messages = history.messages + print("message history") + print(messages) + user_question = HumanMessage(content=question) messages.append(user_question) + tool_calls = extract_tool_calls(model, user_question) + logging.info(tool_calls) + if mode == CHAT_GRAPH_MODE: result = process_graph_response(model, graph, question, messages, history) else: chat_mode_settings = get_chat_mode_settings(mode=mode) document_names= list(map(str.strip, json.loads(document_names))) + logging.info(f"chat_mode_settings['document_filter'] = {chat_mode_settings['document_filter']}") if document_names and not chat_mode_settings["document_filter"]: result = { "session_id": "", @@ -684,7 +987,7 @@ def QA_RAG(graph,model, question, document_names, session_id, mode, write_access "user": "chatbot" } else: - result = process_chat_response(messages,history, question, model, graph, document_names,chat_mode_settings) + result = process_chat_response(messages,history, question, model, graph, document_names,chat_mode_settings, extract_tools=False, filter_properties=filter_properties, requireGrounding=requireGrounding, chunk_similarity_threshold=chunk_similarity_threshold) result["session_id"] = session_id diff --git a/backend/src/chunkid_entities.py b/backend/src/chunkid_entities.py index b9bccbf84..a00dcfc68 100644 --- a/backend/src/chunkid_entities.py +++ b/backend/src/chunkid_entities.py @@ -98,7 +98,7 @@ def process_chunkids(driver, chunk_ids, entities): logging.info(f"Query process completed successfully for chunk ids: {chunk_ids}") return result except Exception as e: - logging.error(f"chunkid_entities module: Error processing chunk ids: {chunk_ids}. Error: {e}") + logging.error(f"_entities module: Error processing chunk ids: {chunk_ids}. Error: {e}") raise def remove_duplicate_nodes(nodes,property="element_id"): diff --git a/backend/src/document_metadata_extractor/__init__.py b/backend/src/document_metadata_extractor/__init__.py new file mode 100644 index 000000000..90af1e0c8 --- /dev/null +++ b/backend/src/document_metadata_extractor/__init__.py @@ -0,0 +1,16 @@ +from .metadata_processor import MetadataProcessor, DocumentMetadata, MetadataExtractor +from .domain_extractor import DomainExtractor + +def create_metadata_processor() -> MetadataProcessor: + """Create and configure a metadata processor with default extractors""" + processor = MetadataProcessor() + processor.add_extractor(DomainExtractor()) + return processor + +__all__ = [ + 'MetadataProcessor', + 'DocumentMetadata', + 'MetadataExtractor', + 'DomainExtractor', + 'create_metadata_processor' +] \ No newline at end of file diff --git a/backend/src/document_metadata_extractor/domain_extractor.py b/backend/src/document_metadata_extractor/domain_extractor.py new file mode 100644 index 000000000..e7e893a23 --- /dev/null +++ b/backend/src/document_metadata_extractor/domain_extractor.py @@ -0,0 +1,54 @@ +from contextgem import Document as ContextGemDocument, DocumentLLM, LabelConcept +from langchain.schema import Document +from .metadata_processor import MetadataExtractor, DocumentMetadata +from typing import List + +DOMAIN_LABELS = [ + "Multiple Myeloma", + "Emotional Intelligence", + "Business Management", + "Instruction Manual", + "Sales Training", + "Leadership Coaching", +] + +class DomainExtractor(MetadataExtractor): + """Classifies document into knowledge domains""" + + def __init__(self): + super().__init__() + self.num_pages = 20 + + def extract(self, pages: List[Document], file_name: str) -> DocumentMetadata: + raw_text = f"filename: {file_name}" + "\n".join([page.page_content for page in pages[:self.num_pages]]) + print("classification raw text: ", raw_text) + contextgem_doc = ContextGemDocument(raw_text=raw_text) + + # Define a LabelConcept for contract type classification + document_type_concept = LabelConcept( + name="Document Domain Label", + description="Classify the knowledge domain of the document", + labels=DOMAIN_LABELS, + classification_type="multi_class", # only one label can be selected (mutually exclusive labels) + singular_occurrence=True, # expect only one classification result + ) + + contextgem_doc.add_concepts([document_type_concept]) + + model = "ollama/phi4:14b" + llm = DocumentLLM( + model=model, + # api_key=os.getenv("CONTEXTGEM_OPENAI_API_KEY"), + ) + + concept_label = llm.extract_concepts_from_document(contextgem_doc)[0] + + if concept_label.extracted_items: + # Get the classified document type + classified_type = concept_label.extracted_items[0].value + print(f"Document: {file_name}, classified as: {classified_type}") # Output: ['NDA'] + return DocumentMetadata(domain=classified_type) + else: + print(f"no label assigned to document {file_name}") + return DocumentMetadata(domain=None) + diff --git a/backend/src/document_metadata_extractor/metadata_processor.py b/backend/src/document_metadata_extractor/metadata_processor.py new file mode 100644 index 000000000..938bed2a8 --- /dev/null +++ b/backend/src/document_metadata_extractor/metadata_processor.py @@ -0,0 +1,66 @@ +from typing import Dict, Any, List, Optional +from dataclasses import dataclass +from abc import ABC, abstractmethod +import logging +from datetime import datetime + +@dataclass +class DocumentMetadata: + """Container for document-level metadata""" + title: Optional[str] = None + author: Optional[str] = None + date: Optional[datetime] = None + language: Optional[str] = None + domain: Optional[str] = None + keywords: List[str] = None + summary: Optional[str] = None + custom_metadata: Dict[str, Any] = None + + def __post_init__(self): + if self.keywords is None: + self.keywords = [] + if self.custom_metadata is None: + self.custom_metadata = {} + +class MetadataExtractor(ABC): + """Abstract base class for metadata extractors""" + + @abstractmethod + def extract(self, pages: str, file_name: str) -> DocumentMetadata: + """Extract metadata from document content""" + pass + +class MetadataProcessor: + """Orchestrates metadata extraction using multiple extractors""" + + def __init__(self): + self.extractors: List[MetadataExtractor] = [] + + def add_extractor(self, extractor: MetadataExtractor): + """Add a metadata extractor to the pipeline""" + self.extractors.append(extractor) + + def process_document(self, document_content: str, file_name: str) -> DocumentMetadata: + """Process document through all extractors and combine results""" + metadata = DocumentMetadata() + + for extractor in self.extractors: + try: + extracted = extractor.extract(document_content, file_name) + # Merge extracted metadata + for field in metadata.__dataclass_fields__: + value = getattr(extracted, field) + if value is not None: + setattr(metadata, field, value) + except Exception as e: + logging.error(f"Error in {extractor.__class__.__name__}: {str(e)}") + + return metadata + +# Factory function to create a configured metadata processor +def create_metadata_processor() -> MetadataProcessor: + """Create and configure a metadata processor with default extractors""" + processor = MetadataProcessor() + # processor.add_extractor(TitleExtractor()) + # processor.add_extractor(DomainClassifier()) + return processor \ No newline at end of file diff --git a/backend/src/llm.py b/backend/src/llm.py index 854e5926f..838a2d1fc 100644 --- a/backend/src/llm.py +++ b/backend/src/llm.py @@ -13,22 +13,375 @@ from langchain_community.chat_models import ChatOllama import boto3 import google.auth +# added by ian +from langchain_core.messages import AIMessage +from typing import Dict, Optional +from openai import OpenAI +#end of added by ian from src.shared.constants import ADDITIONAL_INSTRUCTIONS from src.shared.llm_graph_builder_exception import LLMGraphBuilderException import re from typing import List -def get_llm(model: str): +# Added by ian +from pydantic import BaseModel, Field +from enum import Enum + + +# Step 1: Define the Pydantic model for the function parameters +class EducationLevelInput(BaseModel): + course: str = Field( + ..., + description="Call this tool when the user selects an education level. Provide the education level from the enum, for example grade9.", + enum=["grade9", "grade10", "grade11", "grade12"], + ) + + +# class LessonTopicInput(BaseModel): +# lessonTopic: str = Field(..., description="Call this tool when the user selects an lesson topic. Provide a topic name for a lesson, e.g. History of Astronomy.") + + +class LessonTopicInput(BaseModel): + lessonTopic: str = Field( + ..., + description=( + "Call this tool ONLY when the user explicitly selects a lesson topic, " + "such as saying 'I want to select lesson topic X' or 'I choose X'. " + "DO NOT call this tool when the user is asking for keywords or selecting keywords or subtopics." + "DO NOT call this tool when the user is asking for topic suggestions, " + "such as 'Can you suggest some topics?' or 'I want to teach a lesson related to X, " + "please suggest some related lesson topics.' " + "Provide the specific topic name the user has selected, e.g., 'History of Astronomy'." + ), + ) + + +# Define the enum of subjects +class SubjectEnum(str, Enum): + Anatomy = "Anatomy" + Astronomy = "Astronomy" + Chemistry = "Chemistry" + US_History = "U.S. History" + Zoology = "Zoology" + History_of_Science = "History of Science" + Theater = "Theater" + Artificial_Intelligence = "Artificial Intelligence" + Mythology = "Mythology" + SEL = "Social and Emotional Learning" + + +# Define the input model using Pydantic +class SelectSubjectInput(BaseModel): + subject: SubjectEnum = Field( + ..., + description="Call this when the user selects a subject in their message. Get a subject from the enum, for example Chemistry.", + ) + + +# end of added by ian + + +class OnGenerateKeywordsInput(BaseModel): + keywords: str = Field( + ..., + description=( + "ONLY call this tool when ALL of these conditions are met:\n" + "1. The MOST RECENT message was from the human/user (not from the assistant)\n" + "2. The user EXPLICITLY APPROVES previously suggested keywords\n" + "3. The user says something like 'yes, those keywords look good' or " + "4. The user is not making any changes to the keywords" + "'I approve these keywords' or 'let's use these keywords'\n\n" + "DO NOT call this tool when:\n" + "1. You (the assistant) are suggesting initial keywords to the user\n" + "2. The user asks for keyword suggestions\n" + "3. The user hasn't explicitly approved the keywords\n" + "4. The most recent message was from you (the assistant)\n\n" + "Example valid triggers (must be the most recent message):\n" + "- User: 'Yes, those keywords look good'\n" + "- User: 'I approve these keywords'\n" + "- User: 'Let's use these keywords'\n\n" + "The keywords should be provided as a comma-separated string of 3 terms that were " + "previously suggested and approved by the user." + ), + ) + + class Config: + schema_extra = {"example": {"keywords": "education, technology, AI"}} + + +# OpenAI-compatible tool definitions +OPENAI_TOOLS = [ + # learning objective tool + { + "type": "function", + "function": { + "name": "onSelectTeacherIntent", + "description": ( + "Call this tool when the user sets an intention for the content of the lesson. " + "Extract ONLY the content/subject matter intention, excluding any pedagogy style or lesson format preferences.\n\n" + "Examples:\n" + "- If user says: 'I want to teach a lesson on the scientific process. I want to use behaviourism pedagogy style'\n" + " → Return: 'I want to teach a lesson on the scientific process'\n" + "- If user says: 'I want to teach a lesson on safety precautions in the science lab using a constructivist pedagogy style'\n" + " → Return: 'I want to teach a lesson on safety precautions in the science lab'\n\n" + "Note: Only include the teaching content intention - omit any mentions of pedagogy style, teaching methods, or lesson format." + ), + "parameters": { + "type": "object", + "properties": { + "teacherIntent": { + "type": "string", + "description": "The teacher's content intention for what the lesson should cover, excluding pedagogy style or format", + } + }, + "required": ["teacherIntent"], + }, + }, + }, + # { + # "type": "function", + # "function": { + # "name": "onSelectLearningObjective", + # "description": "Call this tool when the user selects a learning objective for the lesson.", + # "parameters": { + # "type": "object", + # "properties": { + # "learningObjective": { + # "type": "string", + # "description": "The learning objective for the lesson" + # } + # }, + # "required": ["learningObjective"] + # } + # } + # }, + # pedagogySelection tool + { + "type": "function", + "function": { + "name": "onSelectPedagogy", + "description": ( + "Call this tool when the user specifies HOW they want to teach the lesson - their preferred teaching style, " + "format, or approach. This should capture the METHOD of teaching, not the lesson content itself.\n\n" + "Examples:\n" + "- If user says: 'I want to teach this through hands-on experiments' → Return: 'hands-on experiments'\n" + "- If user says: 'I want to use group discussions and peer learning' → Return: 'group discussions and peer learning'\n" + "- If user says: 'I want to teach about chemical reactions using demonstrations' → Return: 'demonstrations'\n\n" + "Note: Only include the teaching style/format - omit the actual lesson content or subject matter." + ), + "parameters": { + "type": "object", + "properties": { + "pedagogyApproach": { + "type": "string", + "description": "The teaching style, format, or themed approach the teacher wants to use for delivering the lesson", + } + }, + "required": ["pedagogyApproach"], + }, + }, + }, + # { + # "type": "function", + # "function": { + # "name": "onSelectEducationLevel", + # "description": "Call this tool when the user selects an education level. Only provide the education levels from the enum, for example grade9.", + # "parameters": { + # "type": "object", + # "properties": { + # "course": { + # "type": "string", + # "enum": ["grade9", "grade10", "grade11", "grade12"] + # } + # }, + # "required": ["course"] + # } + # } + # }, + { + "type": "function", + "function": { + "name": "onSelectLessonTopic", + "description": ( + "Call this tool ONLY when the user explicitly selects a lesson topic or a lesson summary. " + "if the user selects a lesson summary from a list, provide just the lesson title as the lesson topic. " + "such as saying 'I want to select lesson topic X', 'I want to select lesson summary X', or 'I choose X'. " + "DO NOT call this tool when the user is asking for keywords or selecting keywords or subtopics. " + "DO NOT call this tool when the user is asking for topic suggestions, " + "such as 'Can you suggest some topics?' or 'I want to teach a lesson related to X, " + "please suggest some related lesson topics.' " + "Provide the specific lesson topic name the user has selected, e.g., 'History of Astronomy'." + ), + "parameters": { + "type": "object", + "properties": { + "lessonTopic": { + "type": "string", + "description": "The specific lesson topic selected by the user", + } + }, + "required": ["lessonTopic"], + }, + }, + }, + { + "type": "function", + "function": { + "name": "onSelectLessonSummary", + "description": ( + "ONLY call this tool when ALL of these conditions are met:\n" + "1. The MOST RECENT message was from the human/user (not from the assistant)\n" + "2. The user EXPLICITLY SELECTS a specific lesson summary from a presented list\n" + "3. The user says something like 'I choose lesson summary X' or 'I want to select lesson summary X'\n\n" + "DO NOT call this tool when:\n" + "1. You (the assistant) are generating or suggesting lesson summaries\n" + "2. The user asks for lesson summary suggestions\n" + "3. The user hasn't explicitly selected a specific lesson summary\n" + "4. The most recent message was from you (the assistant)\n\n" + "Example valid triggers (must be the most recent message):\n" + "- User: 'I choose lesson summary 2'\n" + "- User: 'Let's go with the Chemical Reactions Lab summary'\n" + "- User: 'I want to select the second lesson summary'\n\n" + "When called, extract the lesson title from the selected summary for the lessonTopic parameter, " + "and include the complete lesson summary text in the lessonSummary parameter.\n\n" + "Example lesson summary format:\n" + '"2. **Lesson Summary 2: "Chemical Reactions Lab"**\n' + "- Key Concepts: Chemical Reactions, Variables, Data Analysis\n" + "- Key Vocabulary: Reactants, Products, Catalyst\n" + '- In this lab-based lesson, students design and conduct experiments..."' + ), + "parameters": { + "type": "object", + "properties": { + "lessonSummary": { + "type": "string", + "description": "The complete lesson summary text that was selected by the user", + }, + "lessonTopic": { + "type": "string", + "description": "The lesson title extracted from the selected summary", + }, + }, + "required": ["lessonTopic", "lessonSummary"], + }, + }, + }, + # { + # "type": "function", + # "function": { + # "name": "onSelectSubject", + # "description": "Call this when the user selects a subject in their message. Get a subject from the enum, for example Chemistry.", + # "parameters": { + # "type": "object", + # "properties": { + # "subject": { + # "type": "string", + # "enum": [ + # "Anatomy", + # "Astronomy", + # "Chemistry", + # "U.S. History", + # "Zoology", + # "History of Science", + # "Theater", + # "Artificial Intelligence", + # "Mythology", + # "Social and Emotional Learning" + # ] + # } + # }, + # "required": ["subject"] + # } + # } + # }, + # this onConfirmKeywords below was working well at NOT calling on generation, commented out for more experimentation + # { + # "type": "function", + # "function": { + # "name": "onConfirmKeywords", + # "description": ( + # "STRICT REQUIREMENTS:\n" + # "1. LAST MESSAGE MUST BE role='user'\n" + # "2. NEVER call if last message is role='system' or role='assistant'\n" + # "3. ONLY call when user FULLY ACCEPTS ALL previous keywords WITHOUT ANY CHANGES\n\n" + # "Valid last messages (role='user' only):\n" + # "✓ 'Yes, those keywords look good'\n" + # "✓ 'I approve these keywords'\n" + # "✓ 'Let's use these keywords'\n\n" + # "DO NOT CALL if last message contains:\n" + # "✗ Any requests to modify keywords\n" + # "✗ Any suggestions for new keywords\n" + # "✗ Any requests to add/remove keywords\n" + # "✗ Any questions about the keywords" + # ), + # "parameters": { + # "type": "object", + # "properties": { + # "keywords": { + # "type": "string", + # "description": "Comma-separated string of the user-approved keywords" + # } + # }, + # "required": ["keywords"] + # } + # } + # }, + { + "type": "function", + "function": { + "name": "onUserAcceptsKeywords", + "description": ( + "STRICT REQUIREMENTS:\n" + "1. LAST MESSAGE MUST BE role='user'\n" + "2. NEVER call if last message is role='system' or role='assistant'\n" + "3. ONLY call when the user has CLEARLY and UNAMBIGUOUSLY accepted ALL keywords WITHOUT ANY CHANGES\n\n" + "Valid last messages to trigger this tool (role='user' only):\n" + "✓ 'Yes, those keywords look good'\n" + "✓ 'I approve these keywords'\n" + "✓ 'Let's use these keywords'\n\n" + "DO NOT CALL if last message contains ANY of the following:\n" + "- ✗ Requests to modify, remove, or add keywords\n" + "- ✗ Suggestions for new keywords\n" + "- ✗ Questions, uncertainty, or dissatisfaction with the keywords\n" + "- ✗ Words like 'replace,' 'remove,' 'change,' 'adjust,' 'modify,' or 'not satisfied'\n" + "- ✗ Phrases such as:\n" + " - 'These keywords are not ready yet'\n" + " - 'Please remove the last one'\n" + " - 'Can you adjust this list?'\n" + " - 'I'm not sure about these keywords'\n" + " - 'I'm not satisfied with these keywords'\n" + "4. WHEN IN DOUBT, DO NOT CALL.\n" + ), + "parameters": { + "type": "object", + "properties": { + "keywords": { + "type": "string", + "description": "Comma-separated string of the user-approved keywords", + } + }, + "required": ["keywords"], + }, + }, + }, +] + + +def get_llm(model: str, add_tools=False): """Retrieve the specified language model based on the model name.""" + + logging.info(f"get_llm called with add_tools {add_tools}") model = model.lower().strip() env_key = f"LLM_MODEL_CONFIG_{model}" env_value = os.environ.get(env_key) if not env_value: - err = f"Environment variable '{env_key}' is not defined as per format or missing" + err = ( + f"Environment variable '{env_key}' is not defined as per format or missing" + ) logging.error(err) raise Exception(err) - + logging.info("Model: {}".format(env_key)) try: if "gemini" in model: @@ -36,7 +389,7 @@ def get_llm(model: str): credentials, project_id = google.auth.default() llm = ChatVertexAI( model_name=model_name, - #convert_system_message_to_human=True, + # convert_system_message_to_human=True, credentials=credentials, project=project_id, temperature=0, @@ -50,7 +403,7 @@ def get_llm(model: str): ) elif "openai" in model: model_name, api_key = env_value.split(",") - if "o3-mini" in model: + if "o3-mini" in model or "gpt-5" in model_name: llm= ChatOpenAI( api_key=api_key, model=model_name) @@ -59,7 +412,18 @@ def get_llm(model: str): api_key=api_key, model=model_name, temperature=0, + ) + if add_tools == True: + logging.info("binding tool") + llm = llm.bind_tools( + [ + EducationLevelInput, + LessonTopicInput, + SelectSubjectInput, + OnGenerateKeywordsInput, + ] ) + logging.info("bound the tool") elif "azure" in model: model_name, api_endpoint, api_key, api_version = env_value.split(",") @@ -88,7 +452,9 @@ def get_llm(model: str): llm = ChatGroq(api_key=api_key, model_name=model_name, temperature=0) elif "bedrock" in model: - model_name, aws_access_key, aws_secret_key, region_name = env_value.split(",") + model_name, aws_access_key, aws_secret_key, region_name = env_value.split( + "," + ) bedrock_client = boto3.client( service_name="bedrock-runtime", region_name=region_name, @@ -105,14 +471,14 @@ def get_llm(model: str): llm = ChatOllama(base_url=base_url, model=model_name) elif "diffbot" in model: - #model_name = "diffbot" + # model_name = "diffbot" model_name, api_key = env_value.split(",") llm = DiffbotGraphTransformer( diffbot_api_key=api_key, extract_types=["entities", "facts"], ) - - else: + + else: model_name, api_endpoint, api_key = env_value.split(",") llm = ChatOpenAI( api_key=api_key, @@ -124,7 +490,7 @@ def get_llm(model: str): err = f"Error while creating LLM '{model}': {str(e)}" logging.error(err) raise Exception(err) - + logging.info(f"Model created - Model Version: {model}") return llm, model_name @@ -163,16 +529,17 @@ def get_combined_chunks(chunkId_chunkDoc_list, chunks_to_combine): ) return combined_chunk_document_list + def get_chunk_id_as_doc_metadata(chunkId_chunkDoc_list): combined_chunk_document_list = [ - Document( - page_content=document["chunk_doc"].page_content, - metadata={"chunk_id": [document["chunk_id"]]}, - ) - for document in chunkId_chunkDoc_list - ] + Document( + page_content=document["chunk_doc"].page_content, + metadata={"chunk_id": [document["chunk_id"]]}, + ) + for document in chunkId_chunkDoc_list + ] return combined_chunk_document_list - + async def get_graph_document_list( llm, combined_chunk_document_list, allowedNodes, allowedRelationship, additional_instructions=None @@ -202,11 +569,15 @@ async def get_graph_document_list( ignore_tool_usage=ignore_tool_usage, additional_instructions=ADDITIONAL_INSTRUCTIONS+ (additional_instructions if additional_instructions else "") ) - - if isinstance(llm,DiffbotGraphTransformer): - graph_document_list = llm_transformer.convert_to_graph_documents(combined_chunk_document_list) + + if isinstance(llm, DiffbotGraphTransformer): + graph_document_list = llm_transformer.convert_to_graph_documents( + combined_chunk_document_list + ) else: - graph_document_list = await llm_transformer.aconvert_to_graph_documents(combined_chunk_document_list) + graph_document_list = await llm_transformer.aconvert_to_graph_documents( + combined_chunk_document_list + ) return graph_document_list async def get_graph_from_llm(model, chunkId_chunkDoc_list, allowedNodes, allowedRelationship, chunks_to_combine, additional_instructions=None): @@ -236,7 +607,6 @@ async def get_graph_from_llm(model, chunkId_chunkDoc_list, allowedNodes, allowed logging.info(f"Allowed relationships: {allowed_relationships}") else: logging.info("No allowed relationships provided") - graph_document_list = await get_graph_document_list( llm, combined_chunk_document_list, @@ -271,3 +641,88 @@ def sanitize_additional_instruction(instruction: str) -> str: # Step 4: Normalize spaces instruction = re.sub(r'\s+', ' ', instruction).strip() return instruction + +def create_chat_completion_sync( + messages: List[Dict[str, str]], + model: str = "openai_gpt_4o_mini", + add_tools: bool = False, + temperature: float = 0, +) -> AIMessage: + """ + Synchronous version of create_chat_completion using OpenAI's synchronous client. + Returns an AIMessage object matching Langchain's ChatOpenAI output format. + """ + try: + # Get model configuration + env_key = f"LLM_MODEL_CONFIG_{model.lower().strip()}" + env_value = os.environ.get(env_key) + + if not env_value: + err = f"Environment variable '{env_key}' is not defined" + logging.error(err) + raise Exception(err) + + # Parse model config + if "openai" in model.lower(): + model_name, api_key = env_value.split(",") + else: + model_name, api_endpoint, api_key = env_value.split(",") + + # Initialize client + client = OpenAI( + api_key=api_key, + base_url=api_endpoint if "openai" not in model.lower() else None, + ) + + # Prepare request parameters + completion_params = { + "model": model_name, + "messages": messages, + # "temperature": temperature, # commented out so only add if not gpt-5 + } + + if not "gpt-5" in model_name: + completion_params["temperature"] = temperature + + # Add tools if requested + if add_tools: + logging.info("Adding tool_choice = auto") + completion_params["tools"] = OPENAI_TOOLS + completion_params["tool_choice"] = "auto" + + # Make the API call + response = client.chat.completions.create(**completion_params) + + # Extract content and tool calls + content = ( + response.choices[0].message.content or "" + ) # Default to empty string if None + additional_kwargs = {} + + # Handle tool calls if present + if ( + hasattr(response.choices[0].message, "tool_calls") + and response.choices[0].message.tool_calls + ): + additional_kwargs["tool_calls"] = [ + { + "id": tool_call.id, + "type": "function", + "function": { + "name": tool_call.function.name, + "arguments": tool_call.function.arguments, + }, + } + for tool_call in response.choices[0].message.tool_calls + ] + + # Return in Langchain's AIMessage format + return AIMessage( + content=content, # Will never be None now + additional_kwargs=additional_kwargs, + ) + + except Exception as e: + err = f"Error in create_chat_completion_sync: {str(e)}" + logging.error(err) + raise Exception(err) \ No newline at end of file diff --git a/backend/src/main.py b/backend/src/main.py index 4bdb6ba51..5b8469c73 100644 --- a/backend/src/main.py +++ b/backend/src/main.py @@ -32,6 +32,7 @@ import urllib.parse import json from src.shared.llm_graph_builder_exception import LLMGraphBuilderException +from src.document_metadata_extractor import create_metadata_processor, DocumentMetadata warnings.filterwarnings("ignore") load_dotenv() @@ -322,6 +323,16 @@ async def processing_source(uri, userName, password, database, model, file_name, uri_latency["create_connection"] = f'{elapsed_create_connection:.2f}' graphDb_data_Access = graphDBdataAccess(graph) create_chunk_vector_index(graph) + + # Process document metadata + # if pages and len(pages) > 0: + # metadata_processor = create_metadata_processor() + # # document_content = " ".join([page.page_content for page in pages]) + # metadata = metadata_processor.process_document(pages, file_name) + # logging.info(f"Extracted metadata for {file_name}: {metadata}") + # else: + # metadata = DocumentMetadata() + start_get_chunkId_chunkDoc_list = time.time() total_chunks, chunkId_chunkDoc_list = get_chunkId_chunkDoc_list(graph, file_name, pages, token_chunk_size, chunk_overlap, retry_condition) end_get_chunkId_chunkDoc_list = time.time() @@ -330,6 +341,25 @@ async def processing_source(uri, userName, password, database, model, file_name, uri_latency["create_list_chunk_and_document"] = f'{elapsed_get_chunkId_chunkDoc_list:.2f}' uri_latency["total_chunks"] = total_chunks + # Add hardcoded label to Document node + # uncomment this bloc when ingesting - Ian + # start_add_hardcoded_label = time.time() + # add_hardcoded_label_to_document(graph, file_name, "persona_FIRST_LINE_MANAGER") + # end_add_hardcoded_label = time.time() + # elapsed_add_hardcoded_label = end_add_hardcoded_label - start_add_hardcoded_label + # logging.info(f'Time taken to add hardcoded label to document: {elapsed_add_hardcoded_label:.2f} seconds') + # uri_latency["add_hardcoded_label"] = f'{elapsed_add_hardcoded_label:.2f}' + + # this was autogenerated by cursor - we may want to write the data to the document differenttly + # Update document node with metadata + # if metadata.domain: + # query = """ + # MATCH (d:Document {fileName: $file_name}) + # SET d.domain = $domain + # """ + # graph.query(query, {"file_name": file_name, "domain": metadata.domain}) + # end of cursor generated code + start_status_document_node = time.time() result = graphDb_data_Access.get_current_status_document_node(file_name) end_status_document_node = time.time() @@ -765,4 +795,26 @@ def failed_file_process(uri,file_name, merged_file_path): delete_file_from_gcs(BUCKET_UPLOAD,folder_name,file_name) else: logging.info(f'Deleted File Path: {merged_file_path} and Deleted File Name : {file_name}') - delete_uploaded_local_file(merged_file_path,file_name) \ No newline at end of file + delete_uploaded_local_file(merged_file_path,file_name) + +def add_hardcoded_label_to_document(graph, file_name, label): + """ + Add a hardcoded label to the Document node for the given file. + + Args: + graph: Neo4jGraph connection object + file_name: Name of the file to add label to + label: The label to add to the Document node + """ + try: + # Add a hardcoded label to the Document node + # Using string formatting for the label since Cypher doesn't support parameterized labels + query = f""" + MATCH (d:Document {{fileName: $file_name}}) + SET d:Document:{label} + """ + graph.query(query, {"file_name": file_name}) + logging.info(f"Successfully added hardcoded label '{label}' to Document node for file: {file_name}") + except Exception as e: + logging.error(f"Error adding hardcoded label '{label}' to Document node for file {file_name}: {e}") + # Don't raise the exception to avoid stopping the processing pipeline \ No newline at end of file diff --git a/backend/src/shared/constants.py b/backend/src/shared/constants.py index 30cedfdfd..820fa0e76 100644 --- a/backend/src/shared/constants.py +++ b/backend/src/shared/constants.py @@ -260,6 +260,7 @@ } ### CHAT TEMPLATES +## THIS IS ORIGINAL CHAT_SYSTEM_TEMPLATE = """ You are an AI-powered question-answering agent. Your task is to provide accurate and comprehensive responses to user queries based on the given context, chat history, and available resources. @@ -302,6 +303,46 @@ Note: This system does not generate answers based solely on internal knowledge. It answers from the information provided in the user's current and previous inputs, and from the context. """ +## this one below is MODIFIED by ian to take out the line saying don't use your knowledge base +CHAT_SYSTEM_TEMPLATE_UNGROUNDED = """ +You are an AI-powered question-answering agent. Your task is to provide accurate and comprehensive responses to user queries based on the given context, chat history, and available resources. + +### Response Guidelines: +1. **Direct Answers**: Provide clear and thorough answers to the user's queries without headers unless requested. Avoid speculative responses. +2. **Utilize History and Context**: Leverage relevant information from previous interactions, the current user input, and the context provided below. +3. **No Greetings in Follow-ups**: Start with a greeting in initial interactions. Avoid greetings in subsequent responses unless there's a significant break or the chat restarts. +4. **Admit Unknowns**: Clearly state if an answer is unknown. Avoid making unsupported statements. +5. **Avoid Hallucination**: Only provide information based on the context provided. Do not invent information. +6. **Response Length**: Keep responses concise and relevant. Aim for clarity and completeness within 4-5 sentences unless more detail is requested. +7. **Tone and Style**: Maintain a professional and informative tone. Be friendly and approachable. +8. **Error Handling**: If a query is ambiguous or unclear, ask for clarification rather than providing a potentially incorrect answer. + + + +### Context: + +{context} + + +### Example Responses: +User: Hi +AI Response: 'Hello there! How can I assist you today?' + +User: "What is Langchain?" +AI Response: "Langchain is a framework that enables the development of applications powered by large language models, such as chatbots. It simplifies the integration of language models into various applications by providing useful tools and components." + +User: "Can you explain how to use memory management in Langchain?" +AI Response: "Langchain's memory management involves utilizing built-in mechanisms to manage conversational context effectively. It ensures that the conversation remains coherent and relevant by maintaining the history of interactions and using it to inform responses." + +User: "I need help with PyCaret's classification model." +AI Response: "PyCaret simplifies the process of building and deploying machine learning models. For classification tasks, you can use PyCaret's setup function to prepare your data. After setup, you can compare multiple models to find the best one, and then fine-tune it for better performance." + +User: "What can you tell me about the latest realtime trends in AI?" +AI Response: "I don't have that information right now. Is there something else I can help with?" + +""" + + QUESTION_TRANSFORM_TEMPLATE = "Given the below conversation, generate a search query to look up in order to get information relevant to the conversation. Only respond with the query, nothing else." ## CHAT QUERIES diff --git a/deploy.sh b/deploy.sh new file mode 100755 index 000000000..014f5c899 --- /dev/null +++ b/deploy.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +# Variables - Replace with your actual values + + +# uncomment htis for 'dev' (labs llm-graphbuilder) +# AWS_REGION="us-east-1" +# AWS_ENV="dev" +# AWS_ACCOUNT_ID="288761770129" # 288 is graphbuilder-dev + +# uncomment this for 'metrix-demo-dev' (metrix-demo-dev) +AWS_REGION="us-east-2" +AWS_ENV="metrix-demo-dev" +AWS_ACCOUNT_ID="860839672899" + +ECR_REPOSITORY="graphbuilder-docker-repo-$AWS_ENV" +ENV_FILE="./${AWS_ENV}.env" +echo "Using ENV_FILE $ENV_FILE" +TAG="latest" # You can change this if you need a specific tag + +folder_name=$(basename "$PWD") + +echo "Using AWS_PROFILE $AWS_PROFILE" +echo "Using AWS_ENV $AWS_ENV" +echo "Using ECR_REPOSITORY $ECR_REPOSITORY" + +# 1. Load environment variables from .env file +echo "Loading environment variables from $ENV_FILE..." +set -a # automatically export all variables +source $ENV_FILE +set +a # turn off automatic export + +# 2. Build Docker images using Docker Compose +echo "Building Docker images..." +docker-compose build --no-cache --progress=plain +# docker-compose build + +# 2. Authenticate Docker to AWS ECR +echo "Authenticating to AWS ECR..." +aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com + +# 3. Tag Docker images for ECR +echo "Tagging Docker images..." +for service in $(docker-compose config --services); do + # Get the image name (service name) from Docker Compose + IMAGE_NAME="${folder_name}_${service}:${TAG}" + ECR_IMAGE="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY/$service:$TAG" + + echo "Tagging image $IMAGE_NAME as $ECR_IMAGE..." + docker tag $IMAGE_NAME $ECR_IMAGE +done + +echo "Docker images build successfully!" + +# 4. Push Docker images to AWS ECR +echo "Pushing Docker images to ECR..." +for service in $(docker-compose config --services); do + ECR_IMAGE="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/$ECR_REPOSITORY/$service:$TAG" + + echo "Pushing $ECR_IMAGE..." + docker push $ECR_IMAGE +done + +echo "Docker images pushed to ECR successfully!" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 4b166f490..0702dd12e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,7 @@ services: - NEO4J_URI=${NEO4J_URI-neo4j://database:7687} - NEO4J_PASSWORD=${NEO4J_PASSWORD-password} - NEO4J_USERNAME=${NEO4J_USERNAME-neo4j} - - OPENAI_API_KEY=${OPENAI_API_KEY-} + # - OPENAI_API_KEY=${OPENAI_API_KEY-} - DIFFBOT_API_KEY=${DIFFBOT_API_KEY-} - EMBEDDING_MODEL=${EMBEDDING_MODEL-all-MiniLM-L6-v2} - LANGCHAIN_ENDPOINT=${LANGCHAIN_ENDPOINT-} @@ -34,6 +34,10 @@ services: # - LLM_MODEL_CONFIG_bedrock_claude_3_5_sonnet=${LLM_MODEL_CONFIG_bedrock_claude_3_5_sonnet-} # - LLM_MODEL_CONFIG_fireworks_qwen_72b=${LLM_MODEL_CONFIG_fireworks_qwen_72b-} - LLM_MODEL_CONFIG_ollama_llama3=${LLM_MODEL_CONFIG_ollama_llama3-} + + # this env_file line added by ian + env_file: + - ./backend/.env container_name: backend extra_hosts: - host.docker.internal:host-gateway @@ -50,6 +54,7 @@ services: dockerfile: Dockerfile args: - VITE_BACKEND_API_URL=${VITE_BACKEND_API_URL-http://localhost:8000} + # - VITE_BACKEND_API_URL=http://3.216.126.151:8000 - VITE_REACT_APP_SOURCES=${VITE_REACT_APP_SOURCES-local,wiki,s3} - VITE_GOOGLE_CLIENT_ID=${VITE_GOOGLE_CLIENT_ID-} - VITE_BLOOM_URL=${VITE_BLOOM_URL-https://workspace-preview.neo4j.io/workspace/explore?connectURL={CONNECT_URL}&search=Show+me+a+graph&featureGenAISuggestions=true&featureGenAISuggestionsInternal=true} @@ -72,7 +77,8 @@ services: - ./frontend:/app - /app/node_modules env_file: - - ./frontend/.env + # - ./frontend/dev.env + - ./frontend/metrix-demo-dev.env container_name: frontend ports: - "8080:8080" diff --git a/frontend/public/favicons/favicon-16x16.png b/frontend/public/favicons/favicon-16x16.png index 5c1ca662d..6e3a9a90c 100644 Binary files a/frontend/public/favicons/favicon-16x16.png and b/frontend/public/favicons/favicon-16x16.png differ diff --git a/frontend/public/favicons/favicon-194x194.png b/frontend/public/favicons/favicon-194x194.png deleted file mode 100644 index 378c74cd3..000000000 Binary files a/frontend/public/favicons/favicon-194x194.png and /dev/null differ diff --git a/frontend/public/favicons/favicon-32x32.png b/frontend/public/favicons/favicon-32x32.png index 55bab3058..67968e9da 100644 Binary files a/frontend/public/favicons/favicon-32x32.png and b/frontend/public/favicons/favicon-32x32.png differ diff --git a/frontend/public/favicons/favicon.ico b/frontend/public/favicons/favicon.ico index e6d2fdef4..679c89688 100644 Binary files a/frontend/public/favicons/favicon.ico and b/frontend/public/favicons/favicon.ico differ diff --git a/frontend/src/logo-color.svg b/frontend/src/logo-color.svg index 0d9f1b264..07f02f254 100644 --- a/frontend/src/logo-color.svg +++ b/frontend/src/logo-color.svg @@ -1,9 +1,20 @@ - - - - - - - - - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/frontend/src/logo.svg b/frontend/src/logo.svg index d0c86c5f5..d0eeaa350 100644 --- a/frontend/src/logo.svg +++ b/frontend/src/logo.svg @@ -1,32 +1,27 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/terraform/dev.backend.conf b/terraform/dev.backend.conf new file mode 100644 index 000000000..6236f57b7 --- /dev/null +++ b/terraform/dev.backend.conf @@ -0,0 +1,4 @@ +bucket = "graphbuilder-dev-tfstate-live" +key = "graphbuilder/dev/graphbuilder.tfstate" +dynamodb_table = "graphbuilder-dev-tfstate-locking" +region = "us-east-1" diff --git a/terraform/environments/dev/.terraform.lock.hcl b/terraform/environments/dev/.terraform.lock.hcl new file mode 100644 index 000000000..6fdb5a1b4 --- /dev/null +++ b/terraform/environments/dev/.terraform.lock.hcl @@ -0,0 +1,25 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/aws" { + version = "5.84.0" + constraints = "~> 5.84.0" + hashes = [ + "h1:OJ53RNte7HLHSMxSkzu1S6H8sC0T8qnCAOcNLjjtMpc=", + "zh:078f77438aba6ec8bf9154b7d223e5c71c48d805d6cd3bcf9db0cc1e82668ac3", + "zh:1f6591ff96be00501e71b792ed3a5a14b21ff03afec9a1c4a3fd9300e6e5b674", + "zh:2ab694e022e81dd74485351c5836148a842ed71cf640664c9d871cb517b09602", + "zh:33c8ccb6e3dc496e828a7572dd981366c6271075c1189f249b9b5236361d7eff", + "zh:6f31068ebad1d627e421c72ccdaafe678c53600ca73714e977bf45ff43ae5d17", + "zh:7488623dccfb639347cae66f9001d39cf06b92e8081975235a1ac3a0ac3f44aa", + "zh:7f042b78b9690a8725c95b91a70fc8e264011b836605bcc342ac297b9ea3937d", + "zh:88b56ac6c7209dc0a775b79975a371918f3aed8f015c37d5899f31deff37c61a", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:a1979ba840d704af0932f8de5f541cbb4caa9b6bbd25ed552a24e6772175ba07", + "zh:b058c0533dae580e69d1adbc1f69e6a80632374abfc10e8634d06187a108e87b", + "zh:c88610af9cf957f8dcf4382e0c9ca566ef10e3290f5de01d4d90b2d81b078aa8", + "zh:e9562c055a2247d0c287772b55abef468c79f8d66a74780fe1c5e5dae1a284a9", + "zh:f7a7c71d28441d925a25c08c4485c015b2d9f0338bc9707443e91ff8e161d3d9", + "zh:fee533e81976d0900aa6fa443dc54ef171cbd901847f28a6e8edb1d161fa6fde", + ] +} diff --git a/terraform/environments/dev/main.tf b/terraform/environments/dev/main.tf new file mode 100644 index 000000000..6b8cae0f0 --- /dev/null +++ b/terraform/environments/dev/main.tf @@ -0,0 +1,64 @@ +terraform { + required_version = "1.10.5" + + backend "s3" { + # eschewed this for supplying via --backend-config=backend.conf + } + + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.84.0" + } + } +} + +provider "aws" { + region = "us-east-1" +} + +locals { + project_name = "graphbuilder" +} + +module "my_ecr_repo" { + source = "../../modules/ecr" # Path to the module + project_name = local.project_name + environment = var.environment +} + +module "vpc" { + source = "../../modules/vpc" + project_name = local.project_name + vpc_cidr_block = "10.0.0.0/16" + environment = var.environment + region = var.aws_region +} + + +module "sg" { + source = "../../modules/sg" + project_name = local.project_name + vpc_id = module.vpc.vpc_id + env = var.environment +} + +module "ecs" { + source = "../../modules/ecs" + project_name = local.project_name + environment = var.environment + aws_region = var.aws_region + instance_type = "t4g.large" + vpc_security_group_ids = [module.sg.sg.id] + vpc_id = module.vpc.vpc_id + subnet_id = module.vpc.public_subnet.id + ami_id = "ami-0bdaeb9a41fea7b10" + ec2_keypair_name = "graphbuilder-dev-ec2-keypair" + user_data_path = "./ec2-user-data.ps1" + backend_ecr_url = module.my_ecr_repo.backend_ecr_repository_url + backend_ecr_arn = module.my_ecr_repo.backend_repository_arn + backend_repository_name = module.my_ecr_repo.backend_repository_name + frontend_ecr_url = module.my_ecr_repo.frontend_ecr_repository_url + frontend_ecr_arn = module.my_ecr_repo.frontend_repository_arn + frontend_repository_name = module.my_ecr_repo.frontend_repository_name +} \ No newline at end of file diff --git a/terraform/environments/dev/variables.tf b/terraform/environments/dev/variables.tf new file mode 100644 index 000000000..6e7096468 --- /dev/null +++ b/terraform/environments/dev/variables.tf @@ -0,0 +1,9 @@ +variable "environment" { + type = string + description = "environment name to deploy to (dev, prod, developer_name etc)" +} + +variable "aws_region" { + type = string + description = "aws region to deploy to" +} \ No newline at end of file diff --git a/terraform/environments/metrix-demo-dev/.terraform.lock.hcl b/terraform/environments/metrix-demo-dev/.terraform.lock.hcl new file mode 100644 index 000000000..6fdb5a1b4 --- /dev/null +++ b/terraform/environments/metrix-demo-dev/.terraform.lock.hcl @@ -0,0 +1,25 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/aws" { + version = "5.84.0" + constraints = "~> 5.84.0" + hashes = [ + "h1:OJ53RNte7HLHSMxSkzu1S6H8sC0T8qnCAOcNLjjtMpc=", + "zh:078f77438aba6ec8bf9154b7d223e5c71c48d805d6cd3bcf9db0cc1e82668ac3", + "zh:1f6591ff96be00501e71b792ed3a5a14b21ff03afec9a1c4a3fd9300e6e5b674", + "zh:2ab694e022e81dd74485351c5836148a842ed71cf640664c9d871cb517b09602", + "zh:33c8ccb6e3dc496e828a7572dd981366c6271075c1189f249b9b5236361d7eff", + "zh:6f31068ebad1d627e421c72ccdaafe678c53600ca73714e977bf45ff43ae5d17", + "zh:7488623dccfb639347cae66f9001d39cf06b92e8081975235a1ac3a0ac3f44aa", + "zh:7f042b78b9690a8725c95b91a70fc8e264011b836605bcc342ac297b9ea3937d", + "zh:88b56ac6c7209dc0a775b79975a371918f3aed8f015c37d5899f31deff37c61a", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:a1979ba840d704af0932f8de5f541cbb4caa9b6bbd25ed552a24e6772175ba07", + "zh:b058c0533dae580e69d1adbc1f69e6a80632374abfc10e8634d06187a108e87b", + "zh:c88610af9cf957f8dcf4382e0c9ca566ef10e3290f5de01d4d90b2d81b078aa8", + "zh:e9562c055a2247d0c287772b55abef468c79f8d66a74780fe1c5e5dae1a284a9", + "zh:f7a7c71d28441d925a25c08c4485c015b2d9f0338bc9707443e91ff8e161d3d9", + "zh:fee533e81976d0900aa6fa443dc54ef171cbd901847f28a6e8edb1d161fa6fde", + ] +} diff --git a/terraform/environments/metrix-demo-dev/main.tf b/terraform/environments/metrix-demo-dev/main.tf new file mode 100644 index 000000000..1771c96ad --- /dev/null +++ b/terraform/environments/metrix-demo-dev/main.tf @@ -0,0 +1,85 @@ +terraform { + required_version = "1.10.5" + + backend "s3" { + # eschewed this for supplying via --backend-config=metrix-demo-dev.backend.conf + } + + required_providers { + aws = { + source = "hashicorp/aws" + version = "~> 5.84.0" + } + } +} + +provider "aws" { + region = "us-east-2" +} + +locals { + project_name = "graphbuilder" +} + +module "my_ecr_repo" { + source = "../../modules/ecr" # Path to the module + project_name = local.project_name + environment = var.environment +} + +module "vpc" { + source = "../../modules/vpc" + project_name = local.project_name + vpc_cidr_block = "10.0.0.0/16" + environment = var.environment + region = var.aws_region +} + + +module "sg" { + source = "../../modules/sg" + project_name = local.project_name + vpc_id = module.vpc.vpc_id + env = var.environment +} + +module "ecs" { + source = "../../modules/ecs" + project_name = local.project_name + environment = var.environment + aws_region = var.aws_region + instance_type = "t4g.large" + vpc_security_group_ids = [module.sg.sg.id] + vpc_id = module.vpc.vpc_id + subnet_id = module.vpc.public_subnet.id + ami_id = "ami-016032b20e02dbcad" + ec2_keypair_name = "metrix-demo-dev-ec2-keypair" + user_data_path = "./ec2-user-data.ps1" + backend_ecr_url = module.my_ecr_repo.backend_ecr_repository_url + backend_ecr_arn = module.my_ecr_repo.backend_repository_arn + backend_repository_name = module.my_ecr_repo.backend_repository_name + frontend_ecr_url = module.my_ecr_repo.frontend_ecr_repository_url + frontend_ecr_arn = module.my_ecr_repo.frontend_repository_arn + frontend_repository_name = module.my_ecr_repo.frontend_repository_name +} + +module "alb" { + source = "../../modules/alb" + acm_certificate_domain = "*.futuretalk.ca" + environment = var.environment + project_name = local.project_name + vpc_id = module.vpc.vpc_id + subnet_ids = [module.vpc.public_subnet.id, module.vpc.public_subnet_2.id] + target_group_port = 8000 + ec2_instance_id = module.ecs.ec2_instance_id + health_check_path = "/health" + health_check_port = 8000 +} + +output "vpc_id" { + value = module.vpc.vpc_id +} + +output "certificate_arn" { + value = module.alb.certificate_arn +} diff --git a/terraform/environments/metrix-demo-dev/variables.tf b/terraform/environments/metrix-demo-dev/variables.tf new file mode 100644 index 000000000..6e7096468 --- /dev/null +++ b/terraform/environments/metrix-demo-dev/variables.tf @@ -0,0 +1,9 @@ +variable "environment" { + type = string + description = "environment name to deploy to (dev, prod, developer_name etc)" +} + +variable "aws_region" { + type = string + description = "aws region to deploy to" +} \ No newline at end of file diff --git a/terraform/modules/alb/alb.tf b/terraform/modules/alb/alb.tf new file mode 100644 index 000000000..0ea058897 --- /dev/null +++ b/terraform/modules/alb/alb.tf @@ -0,0 +1,138 @@ +# # Application Load Balancer +resource "aws_lb" "main" { + name = "${var.project_name}-${var.environment}-alb" + internal = false + load_balancer_type = "application" + security_groups = [aws_security_group.alb.id] + subnets = var.subnet_ids + idle_timeout = 360 # 6 minutes + + enable_deletion_protection = false + + tags = { + Name = "${var.project_name}-${var.environment}-alb" + Environment = var.environment + Project = var.project_name + } +} + +# Security Group for ALB +resource "aws_security_group" "alb" { + name = "${var.project_name}-${var.environment}-alb-sg" + description = "Security group for Application Load Balancer" + vpc_id = var.vpc_id + + ingress { + description = "HTTPS from Internet" + from_port = 443 + to_port = 443 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + description = "HTTP from Internet" + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } + + tags = { + Name = "${var.project_name}-${var.environment}-alb-sg" + Environment = var.environment + Project = var.project_name + } +} + +# Target Group +resource "aws_lb_target_group" "main" { + name = "${var.project_name}-${var.environment}-tg" + port = var.target_group_port + protocol = "HTTP" + vpc_id = var.vpc_id + + health_check { + enabled = true + healthy_threshold = 2 + interval = 30 + matcher = "200" + path = var.health_check_path + port = var.health_check_port + protocol = "HTTP" + timeout = 5 + unhealthy_threshold = 2 + } + + tags = { + Name = "${var.project_name}-${var.environment}-tg" + Environment = var.environment + Project = var.project_name + } +} + +# Target Group Attachment +resource "aws_lb_target_group_attachment" "main" { + target_group_arn = aws_lb_target_group.main.arn + target_id = var.ec2_instance_id + port = var.target_group_port +} + +# Data source for ACM certificate +data "aws_acm_certificate" "main" { + count = var.acm_certificate_domain != null ? 1 : 0 + domain = var.acm_certificate_domain + statuses = ["ISSUED"] + most_recent = true +} + +# HTTPS Listener (only created if certificate is available) +resource "aws_lb_listener" "https" { + count = (var.certificate_arn != null || var.acm_certificate_domain != null) ? 1 : 0 + load_balancer_arn = aws_lb.main.arn + port = "443" + protocol = "HTTPS" + ssl_policy = "ELBSecurityPolicy-2016-08" + certificate_arn = var.certificate_arn != null ? var.certificate_arn : data.aws_acm_certificate.main[0].arn + + default_action { + type = "forward" + target_group_arn = aws_lb_target_group.main.arn + } +} + +# HTTP Listener (redirects to HTTPS if HTTPS listener exists, otherwise forwards to target group) +resource "aws_lb_listener" "http" { + load_balancer_arn = aws_lb.main.arn + port = "80" + protocol = "HTTP" + + default_action { + type = (var.certificate_arn != null || var.acm_certificate_domain != null) ? "redirect" : "forward" + + dynamic "redirect" { + for_each = (var.certificate_arn != null || var.acm_certificate_domain != null) ? [1] : [] + content { + port = "443" + protocol = "HTTPS" + status_code = "HTTP_301" + } + } + + dynamic "forward" { + for_each = (var.certificate_arn == null && var.acm_certificate_domain == null) ? [1] : [] + content { + target_group { + arn = aws_lb_target_group.main.arn + } + } + } + } +} diff --git a/terraform/modules/alb/outputs.tf b/terraform/modules/alb/outputs.tf new file mode 100644 index 000000000..5c7d5432e --- /dev/null +++ b/terraform/modules/alb/outputs.tf @@ -0,0 +1,33 @@ +# output "alb_dns_name" { +# description = "DNS name of the Application Load Balancer" +# value = aws_lb.main.dns_name +# } + +# output "alb_arn" { +# description = "ARN of the Application Load Balancer" +# value = aws_lb.main.arn +# } + +# output "target_group_arn" { +# description = "ARN of the target group" +# value = aws_lb_target_group.main.arn +# } + +# output "alb_zone_id" { +# description = "Zone ID of the Application Load Balancer" +# value = aws_lb.main.zone_id +# } + +# output "https_listener_arn" { +# description = "ARN of the HTTPS listener (if created)" +# value = length(aws_lb_listener.https) > 0 ? aws_lb_listener.https[0].arn : null +# } + +# output "certificate_arn" { +# description = "ARN of the certificate being used" +# value = var.certificate_arn != null ? var.certificate_arn : (var.acm_certificate_domain != null ? data.aws_acm_certificate.main[0].arn : null) +# } + +output "certificate_arn" { + value = data.aws_acm_certificate.main[0].arn +} \ No newline at end of file diff --git a/terraform/modules/alb/variables.tf b/terraform/modules/alb/variables.tf new file mode 100644 index 000000000..85271dccc --- /dev/null +++ b/terraform/modules/alb/variables.tf @@ -0,0 +1,54 @@ +variable "environment" { + type = string + description = "environment for the ecr docker image repo" +} + +variable "project_name" { + type = string + description = "project name for the repo" +} + +variable "vpc_id" { + type = string + description = "VPC ID where the ALB will be created" +} + +variable "subnet_ids" { + type = list(string) + description = "List of subnet IDs where the ALB will be deployed" +} + +variable "ec2_instance_id" { + type = string + description = "EC2 instance ID to register with the target group" +} + +variable "certificate_arn" { + type = string + description = "ARN of the SSL certificate for HTTPS listener" + default = null +} + +variable "acm_certificate_domain" { + type = string + description = "Domain name for the ACM certificate (e.g., example.com). This isused to find certificate ARN" + default = null +} + +variable "health_check_path" { + type = string + description = "Health check path for the target group" + default = "/" +} + +variable "health_check_port" { + type = number + description = "Health check port for the target group" + default = 80 +} + +variable "target_group_port" { + type = number + description = "Port for the target group" + default = 443 +} diff --git a/terraform/modules/ecr/main.tf b/terraform/modules/ecr/main.tf new file mode 100644 index 000000000..1d8b892f4 --- /dev/null +++ b/terraform/modules/ecr/main.tf @@ -0,0 +1,22 @@ +resource "aws_ecr_repository" "graphbuilder_backend_docker_repo" { + name = "${var.project_name}-docker-repo-${var.environment}/backend" # Change this to your desired repository name + image_tag_mutability = "MUTABLE" + + tags = { + "Environment" = var.environment + "Project" = var.project_name + "Service" = "backend" + } +} + +resource "aws_ecr_repository" "graphbuilder_frontend_docker_repo" { + name = "${var.project_name}-docker-repo-${var.environment}/frontend" # Change this to your desired repository name + image_tag_mutability = "MUTABLE" + + tags = { + "Environment" = var.environment + "Project" = var.project_name + "Service" = "frontend" + + } +} \ No newline at end of file diff --git a/terraform/modules/ecr/outputs.tf b/terraform/modules/ecr/outputs.tf new file mode 100644 index 000000000..e8f8b43cd --- /dev/null +++ b/terraform/modules/ecr/outputs.tf @@ -0,0 +1,29 @@ +output "backend_ecr_repository_url" { + value = aws_ecr_repository.graphbuilder_backend_docker_repo.repository_url + description = "The URI of the backend ECR repository" +} + +output "backend_repository_arn" { + value = aws_ecr_repository.graphbuilder_backend_docker_repo.arn + description = "The ARN of the backend ECR repository" +} + +output "frontend_ecr_repository_url" { + value = aws_ecr_repository.graphbuilder_frontend_docker_repo.repository_url + description = "The URI of the frontend ECR repository" +} + +output "frontend_repository_arn" { + value = aws_ecr_repository.graphbuilder_frontend_docker_repo.arn + description = "The ARN of the frontend ECR repository" +} + +output "backend_repository_name" { + value = aws_ecr_repository.graphbuilder_backend_docker_repo.name + description = "The name of the backend ECR repository" +} + +output "frontend_repository_name" { + value = aws_ecr_repository.graphbuilder_frontend_docker_repo.name + description = "The name of the frontend ECR repository" +} \ No newline at end of file diff --git a/terraform/modules/ecr/variables.tf b/terraform/modules/ecr/variables.tf new file mode 100644 index 000000000..97bc83c3b --- /dev/null +++ b/terraform/modules/ecr/variables.tf @@ -0,0 +1,9 @@ +variable "environment" { + type = string + description = "environment for the ecr docker image repo" +} + +variable "project_name" { + type = string + description = "project name for the repo" +} \ No newline at end of file diff --git a/terraform/modules/ecs/cloudwatch.tf b/terraform/modules/ecs/cloudwatch.tf new file mode 100644 index 000000000..adede4bb4 --- /dev/null +++ b/terraform/modules/ecs/cloudwatch.tf @@ -0,0 +1,27 @@ +resource "aws_cloudwatch_log_group" "ec2_log_group" { + name = "/aws/ec2/${var.project_name}/${var.environment}" # Replace with your desired log group name + retention_in_days = 14 # Replace with your desired retention period in days +} + +resource "aws_cloudwatch_log_stream" "ec2_log_stream" { + name = "${var.project_name}-${var.environment}-ec2-log-stream" + log_group_name = aws_cloudwatch_log_group.ec2_log_group.name +} + +resource "aws_cloudwatch_log_group" "backend_task_log_group" { + name = "/ecs/${var.project_name}/${var.environment}/backend" # Replace with your desired log group name + retention_in_days = 14 # Replace with your desired retention period in days +} + +resource "aws_cloudwatch_log_group" "frontend_task_log_group" { + name = "/ecs/${var.project_name}/${var.environment}/frontend" # Replace with your desired log group name + retention_in_days = 14 # Replace with your desired retention period in days +} + +output "ec2_log_group" { + value = aws_cloudwatch_log_group.ec2_log_group.name +} + +output "ec2_log_stream" { + value = aws_cloudwatch_log_stream.ec2_log_stream.name +} diff --git a/terraform/modules/ecs/cluster.tf b/terraform/modules/ecs/cluster.tf new file mode 100644 index 000000000..58a582840 --- /dev/null +++ b/terraform/modules/ecs/cluster.tf @@ -0,0 +1,3 @@ +resource "aws_ecs_cluster" "graphbuilder_ecs_cluster" { + name = "${var.project_name}-${var.environment}-ecs-cluster" +} \ No newline at end of file diff --git a/terraform/modules/ecs/ec2.tf b/terraform/modules/ecs/ec2.tf new file mode 100644 index 000000000..dceeb4c36 --- /dev/null +++ b/terraform/modules/ecs/ec2.tf @@ -0,0 +1,31 @@ +resource "aws_instance" "ecs_instance" { + depends_on = [aws_ecs_cluster.graphbuilder_ecs_cluster, aws_iam_instance_profile.ecs_instance_profile] + + # right now this ami is arm64 + ami = var.ami_id # Replace with a valid ECS-optimized AMI + instance_type = var.instance_type # must choose arm64 capable hardware + subnet_id = var.subnet_id # Replace with your subnet ID + vpc_security_group_ids = var.vpc_security_group_ids + key_name = var.ec2_keypair_name # Replace with your EC2 key pair name + iam_instance_profile = aws_iam_instance_profile.ecs_instance_profile.name + associate_public_ip_address = true + + # Add root volume configuration + root_block_device { + volume_size = 30 + volume_type = "gp3" # General Purpose SSD + delete_on_termination = true + encrypted = true # recommended for security + } + + user_data = <<-EOF + #!/bin/bash + echo ECS_CLUSTER=${aws_ecs_cluster.graphbuilder_ecs_cluster.name} >> /etc/ecs/ecs.config + yum update -y + EOF + + tags = { + Environment = var.environment + Project = var.project_name + } +} \ No newline at end of file diff --git a/terraform/modules/ecs/iam.tf b/terraform/modules/ecs/iam.tf new file mode 100644 index 000000000..8b17014ff --- /dev/null +++ b/terraform/modules/ecs/iam.tf @@ -0,0 +1,127 @@ +data "aws_caller_identity" "current" {} + + +# Define an IAM policy for CloudWatch logging with restricted permissions +resource "aws_iam_policy" "cloudwatch_logging_policy" { + name = "CloudWatchLoggingPolicy-${var.environment}" + description = "Allows EC2 instances to write logs to app's ec2 CloudWatch log group" + + policy = jsonencode({ + Version = "2012-10-17", + Statement = [ + { + Effect = "Allow", + Action = [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + Resource = [ + # Allow for only specific log group ARNs + "arn:aws:logs:*:${data.aws_caller_identity.current.account_id}:*" # allow write to any log in this account + ] + } + ] + }) +} + +# ECS Instance role allows the ec2 to log ecs agent stuff to ecs log group +# and also to poll ecs agent for metrics +resource "aws_iam_role" "ecs_instance_role" { + name = "${var.project_name}-${var.environment}-ecsInstanceRole" + + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = { + Service = "ec2.amazonaws.com" + } + Action = "sts:AssumeRole" + } + ] + }) +} + +# this attaches the policy to the instance role +resource "aws_iam_role_policy_attachment" "ecs_instance_policy_attach" { + role = aws_iam_role.ecs_instance_role.name + policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role" +} + +# this attaches the policy to the instance role +resource "aws_iam_role_policy_attachment" "ecs_instance_logging_policy_attach" { + role = aws_iam_role.ecs_instance_role.name + policy_arn = aws_iam_policy.cloudwatch_logging_policy.arn +} + + +resource "aws_iam_instance_profile" "ecs_instance_profile" { + name = "${var.project_name}-${var.environment}-ecsInstanceProfile" + role = aws_iam_role.ecs_instance_role.name +} + +# ECS Task Execution Role allows container in task to do stuff +resource "aws_iam_role" "ecs_task_execution_role" { + name = "ecsTaskExecutionRole" + + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [ + { + Effect = "Allow" + Principal = { + Service = "ecs-tasks.amazonaws.com" + } + Action = "sts:AssumeRole" + } + ] + }) +} + +resource "aws_iam_policy" "ecs_task_execution_policy" { + name = "${var.project_name}-${var.environment}-ecsTaskExecutionPolicy" + description = "ECS task execution policy with CloudWatch and specific ECR repository access" + + policy = jsonencode({ + Version = "2012-10-17", + Statement = [ + # Permissions for specific ECR repository + { + Effect = "Allow", + Action = [ + "ecr:GetAuthorizationToken" + ], + Resource = "*" + }, + { + Effect = "Allow", + Action = [ + "ecr:BatchCheckLayerAvailability", + "ecr:GetDownloadUrlForLayer", + "ecr:BatchGetImage" + ], + Resource = [ + var.backend_ecr_arn, + var.frontend_ecr_arn + ] + }, + # Permissions for CloudWatch Logs + { + Effect = "Allow", + Action = [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + Resource = "arn:aws:logs:*:*:*" + } + ] + }) +} + +resource "aws_iam_role_policy_attachment" "ecs_task_execution_policy_attach" { + role = aws_iam_role.ecs_task_execution_role.name + policy_arn = aws_iam_policy.ecs_task_execution_policy.arn +} \ No newline at end of file diff --git a/terraform/modules/ecs/outputs.tf b/terraform/modules/ecs/outputs.tf new file mode 100644 index 000000000..8206c38a7 --- /dev/null +++ b/terraform/modules/ecs/outputs.tf @@ -0,0 +1,4 @@ +output "ec2_instance_id" { + description = "The ID of the EC2 instance" + value = aws_instance.ecs_instance.id +} \ No newline at end of file diff --git a/terraform/modules/ecs/service.tf b/terraform/modules/ecs/service.tf new file mode 100644 index 000000000..9acb6a8c0 --- /dev/null +++ b/terraform/modules/ecs/service.tf @@ -0,0 +1,21 @@ +resource "aws_ecs_service" "frontend_service" { + name = "${var.project_name}-ecs-service-${var.environment}" + cluster = aws_ecs_cluster.graphbuilder_ecs_cluster.id + task_definition = aws_ecs_task_definition.graphbuilder_task.arn + desired_count = 1 + launch_type = "EC2" + + # Health check grace period for automatic restart + health_check_grace_period_seconds = 180 + + # Force new deployment when task definition changes + force_new_deployment = true + + depends_on = [aws_ecs_task_definition.graphbuilder_task] + + tags = { + Environment = var.environment + Project = var.project_name + Service = "graphbuilder" + } +} \ No newline at end of file diff --git a/terraform/modules/ecs/task-definition.tf b/terraform/modules/ecs/task-definition.tf new file mode 100644 index 000000000..ccf79f925 --- /dev/null +++ b/terraform/modules/ecs/task-definition.tf @@ -0,0 +1,162 @@ + +locals { + backend_task_name = "${var.project_name}-${var.environment}-backend" +} + +# 1. Look up the latest image tag in ECR (we’ll use "latest") +data "aws_ecr_image" "latest" { + repository_name = var.frontend_repository_name # your ECR repo name + image_tag = "latest" +} + +resource "aws_ecs_task_definition" "graphbuilder_task" { + family = "${var.project_name}-${var.environment}" + network_mode = "bridge" # Use "awsvpc" if running in Fargate + # network_mode = "awsvpc" # Use "awsvpc" if running in Fargate + requires_compatibilities = ["EC2"] # Change to "FARGATE" if needed + execution_role_arn = aws_iam_role.ecs_task_execution_role.arn # IAM Role for ECS tasks + container_definitions = jsonencode([ + { + name = local.backend_task_name + image = "${var.backend_ecr_url}:latest" + + # currently we are on t4g.medium which has 4GB memory, 2vCPU (each vCPU is 1024) + memory = 2048 # 2048MB + cpu = 1024 # = 1vCPU, half of our t4g.medium + memoryReservation = 1024 # Soft limit prevent memory contention + essential = true + portMappings = [ + # { + # containerPort = 80 + # hostPort = 80 + # } + # our backend service listens on container port 8000 + { + containerPort = 8000 + hostPort = 8000 + protocol = "tcp" + } + ] + # here we can pass environment variables that will be made avialable + # inside the container + environment = [ + { + name = "TEST_ENV_VAR" + value = "example-ft-test-value" + } + ] + logConfiguration = { + logDriver = "awslogs" + options = { + # this awslogs-group path needs to match up with the task cloudwatch log group in cloudwatch.tf + awslogs-group = aws_cloudwatch_log_group.backend_task_log_group.name + awslogs-region = var.aws_region # Change to your AWS region + awslogs-stream-prefix = "ecs" + } + } + }, + { + name = "${var.project_name}-${var.environment}-frontend" + # image = "${var.frontend_ecr_url}:latest" + image = "${var.frontend_ecr_url}@${data.aws_ecr_image.latest.image_digest}" + memory = 512 # Reduced from 4096MB + cpu = 512 # Reduced from 1024 CPU units + memoryReservation = 512 # Soft limit to prevent memory contention + # essential = true + # dependsOn = [ + # { + # containerName = local.backend_task_name + # condition = "START" + # } + # ] + portMappings = [ + { + containerPort = 8080 + hostPort = 8080 + protocol = "tcp" + } + ] + environment = [ + { + name = "VITE_BACKEND_API_URL" + # value = "http://${aws_instance.ecs_instance.public_ip}:8000" + value = "http://localhost:8000" + }, + { + name = "VITE_ENV" + value = "DEV" + } + ] + logConfiguration = { + logDriver = "awslogs" + options = { + awslogs-group = aws_cloudwatch_log_group.frontend_task_log_group.name + awslogs-region = var.aws_region + awslogs-stream-prefix = "ecs" + } + } + } + ]) +} + +resource "aws_security_group" "ecs_tasks" { + name = "${var.project_name}-${var.environment}-ecs-tasks-sg" + description = "Security group for ECS tasks" + vpc_id = var.vpc_id + + ingress { + from_port = 8000 + to_port = 8000 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] # Adjust based on your needs + } + + ingress { + from_port = 8080 + to_port = 8080 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] # Adjust based on your needs + } + + # Allow Neo4j Bolt protocol for ECS + ingress { + from_port = 7687 + to_port = 7687 + protocol = "tcp" + description = "Allow Bolt protocol from ECS" + cidr_blocks = ["0.0.0.0/0"] # Adjust based on your needs + } + + # (Optional) Allow Neo4j HTTP API if needed + ingress { + from_port = 7474 + to_port = 7474 + protocol = "tcp" + description = "Allow HTTP API from ECS" + cidr_blocks = ["0.0.0.0/0"] # Adjust based on your needs + } + + # (Optional) Allow Neo4j HTTPS API if needed + ingress { + from_port = 7473 + to_port = 7473 + protocol = "tcp" + description = "Allow HTTPS API from ECS" + cidr_blocks = ["0.0.0.0/0"] # Adjust based on your needss + } + + ingress { + from_port = 22 + to_port = 22 + protocol = "tcp" + description = "Allow SSH from anywhere" + cidr_blocks = ["0.0.0.0/0"] # Adjust based on your needss + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" + cidr_blocks = ["0.0.0.0/0"] + } +} diff --git a/terraform/modules/ecs/variables.tf b/terraform/modules/ecs/variables.tf new file mode 100644 index 000000000..8955b4c5e --- /dev/null +++ b/terraform/modules/ecs/variables.tf @@ -0,0 +1,75 @@ +variable "aws_region" { + type = string + description = "aws region for the deployment" +} + +variable "environment" { + type = string + description = "environment for the ecr docker image repo" +} + +variable "project_name" { + type = string + description = "project name for the repo" +} + +variable "instance_type" { + type = string + default = "t2.small" +} + +variable "subnet_id" { + type = string +} + +variable "vpc_id" { + type = string +} + +variable "vpc_security_group_ids" { + type = list(string) +} + +variable "ami_id" { + type = string + description = "ami for the ec2 instance" +} + +variable "ec2_keypair_name" { + type = string +} + +variable "user_data_path" { + type = string + description = "filepath to user_data file to run on aws_instance startup" +} + +variable "backend_ecr_url" { + type = string + description = "the ecr url of the backend service" +} + +variable "backend_ecr_arn" { + type = string + description = "the ecr arn of the backend service" +} + +variable "backend_repository_name" { + type = string + description = "the name of the backend ecr repository" +} + +variable "frontend_ecr_url" { + type = string + description = "the ecr url of the frontend service" +} + +variable "frontend_ecr_arn" { + type = string + description = "the ecr arn of the frontend service" +} + +variable "frontend_repository_name" { + type = string + description = "the name of the frontend ecr repository" +} \ No newline at end of file diff --git a/terraform/modules/sg/main.tf b/terraform/modules/sg/main.tf new file mode 100644 index 000000000..327c8073a --- /dev/null +++ b/terraform/modules/sg/main.tf @@ -0,0 +1,103 @@ +# --- ECS Node SG --- + +resource "aws_security_group" "graphbuilder_sg" { + name_prefix = "${var.project_name}-ec2-sg-${var.env}" + vpc_id = var.vpc_id + description = "${var.project_name}-ec2-sg" + + ingress { + from_port = 22 + to_port = 22 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + from_port = 80 + to_port = 80 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + from_port = 443 + to_port = 443 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + ingress { + from_port = -1 # -1 means all ICMP types + to_port = -1 # -1 means all ICMP types + protocol = "icmp" + cidr_blocks = ["0.0.0.0/0"] # Allow ICMP from anywhere (you can restrict this if needed) + } + + # need this bc the application in docker listens on 8000 and we are binding to same host port + ingress { + from_port = 8000 # -1 means all ICMP types + to_port = 8000 # -1 means all ICMP types + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] # Allow ICMP from anywhere (you can restrict this if needed) + } + + ingress { + from_port = 8080 + to_port = 8080 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] # Adjust based on your needs + } + + # Allow Neo4j Bolt protocol for ECS + ingress { + from_port = 7687 + to_port = 7687 + protocol = "tcp" + description = "Allow Bolt protocol from ECS" + cidr_blocks = ["0.0.0.0/0"] + } + + # (Optional) Allow Neo4j HTTP API if needed + ingress { + from_port = 7474 + to_port = 7474 + protocol = "tcp" + description = "Allow HTTP API from ECS" + cidr_blocks = ["0.0.0.0/0"] + } + + # (Optional) Allow Neo4j HTTPS API if needed + ingress { + from_port = 7473 + to_port = 7473 + protocol = "tcp" + description = "Allow HTTPS API from ECS" + cidr_blocks = ["0.0.0.0/0"] + } + + + # send internet traffic anywhwrere + egress { + from_port = 0 + to_port = 65535 + protocol = "tcp" + cidr_blocks = ["0.0.0.0/0"] + } + + egress { + from_port = 0 + to_port = 0 + protocol = "-1" # All traffic + cidr_blocks = ["0.0.0.0/0"] + } + + tags = { + name = "graphbuilder-sg-${var.env}" + } +} + + + +output "sg" { + value = aws_security_group.graphbuilder_sg +} diff --git a/terraform/modules/sg/variables.tf b/terraform/modules/sg/variables.tf new file mode 100644 index 000000000..6ada2fbd1 --- /dev/null +++ b/terraform/modules/sg/variables.tf @@ -0,0 +1,10 @@ +variable "env" { + type = string +} +variable "vpc_id" { + type = string +} + +variable "project_name" { + type = string +} \ No newline at end of file diff --git a/terraform/modules/vpc/main.tf b/terraform/modules/vpc/main.tf new file mode 100644 index 000000000..7da63f2ce --- /dev/null +++ b/terraform/modules/vpc/main.tf @@ -0,0 +1,85 @@ +resource "aws_vpc" "main" { + cidr_block = var.vpc_cidr_block + + tags = { + Name = "${var.project_name}-${var.environment}-vpc" + Environment = var.environment + } +} + +resource "aws_subnet" "public" { + vpc_id = aws_vpc.main.id + cidr_block = var.public_subnet_cidr_block + availability_zone = "${var.region}a" + map_public_ip_on_launch = true # need this for ec2 to have outgoing internet access + + tags = { + Name = "${var.project_name}-${var.environment} VPC Public Subnet" + Environment = var.environment + } +} + +resource "aws_subnet" "public_2" { + vpc_id = aws_vpc.main.id + cidr_block = var.public_subnet_cidr_block_2 + availability_zone = "${var.region}b" + map_public_ip_on_launch = true # need this for ec2 to have outgoing internet access + + tags = { + Name = "${var.project_name}-${var.environment} VPC Public Subnet 2" + Environment = var.environment + } +} + +# --- Internet Gateway --- + +resource "aws_internet_gateway" "main" { + vpc_id = aws_vpc.main.id + tags = { + Name = "${var.project_name}-${var.environment}-igw" + Environment = var.environment + } +} + +# this was copied from nexrender server may not be needed copied out for now $5/month +# resource "aws_eip" "main" { +# depends_on = [aws_internet_gateway.main] +# tags = { +# Name = "${var.project_name}-${var.environment}-eip" +# Environment = var.environment +# } +# } + +# --- Public Route Table --- + +resource "aws_route_table" "public" { + vpc_id = aws_vpc.main.id + tags = { Name = "${var.project_name}-${var.environment}-rt-public" } + + route { + cidr_block = "0.0.0.0/0" + gateway_id = aws_internet_gateway.main.id + } +} + +resource "aws_route_table_association" "public" { + subnet_id = aws_subnet.public.id + route_table_id = aws_route_table.public.id +} + +resource "aws_route_table_association" "public_2" { + subnet_id = aws_subnet.public_2.id + route_table_id = aws_route_table.public.id +} + +output "vpc_id" { + value = aws_vpc.main.id +} + +output "public_subnet" { + value = aws_subnet.public +} + +output "public_subnet_2" { + value = aws_subnet.public_2 +} \ No newline at end of file diff --git a/terraform/modules/vpc/variables.tf b/terraform/modules/vpc/variables.tf new file mode 100644 index 000000000..24ad8333d --- /dev/null +++ b/terraform/modules/vpc/variables.tf @@ -0,0 +1,29 @@ +variable "environment" { + type = string + description = "the environment you are deploying to, used for naming resources" +} + +variable "region" { + type = string + description = "the AWS region you are deploying to" +} + +variable "project_name" { + type = string + description = "the name of the project" +} + +variable "vpc_cidr_block" { + type = string + default = "10.0.0.0/16" +} + +variable "public_subnet_cidr_block" { + type = string + default = "10.0.1.0/24" +} + +variable "public_subnet_cidr_block_2" { + type = string + default = "10.0.2.0/24" +} \ No newline at end of file diff --git a/terraform/user-data.sh b/terraform/user-data.sh new file mode 100644 index 000000000..08b6d5fbe --- /dev/null +++ b/terraform/user-data.sh @@ -0,0 +1,2 @@ +#!/bin/bash +echo ECS_CLUSTER=my-cluster-name >> /etc/ecs/ecs.config \ No newline at end of file