Merge branch 'master' into part-requirements

This commit is contained in:
Oliver 2026-04-21 10:42:32 +10:00 committed by GitHub
commit 17922312fb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
219 changed files with 23555 additions and 23184 deletions

View File

@ -185,14 +185,14 @@ jobs:
fi
- name: Login to Dockerhub
if: github.event_name != 'pull_request' && steps.docker_login.outputs.skip_dockerhub_login != 'true'
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # pin@v4.0.0
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # pin@v4.1.0
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Log into registry ghcr.io
if: github.event_name != 'pull_request'
uses: docker/login-action@b45d80f862d83dbcd57f89517bcf500b2ab88fb2 # pin@v4.0.0
uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # pin@v4.1.0
with:
registry: ghcr.io
username: ${{ github.actor }}

View File

@ -202,7 +202,7 @@ jobs:
- name: Export API Documentation
run: invoke dev.schema --ignore-warnings --filename src/backend/InvenTree/schema.yml
- name: Upload schema
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # pin@v7.0.0
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
with:
name: schema.yml
path: src/backend/InvenTree/schema.yml
@ -222,7 +222,7 @@ jobs:
echo "Downloaded api.yaml"
- name: Running OpenAPI Spec diff action
id: breaking_changes
uses: oasdiff/oasdiff-action/diff@1f38ea5ea0b4a2e4e49901c3bcdf4386a05e9ea1 # pin@main
uses: oasdiff/oasdiff-action/diff@f8cb9308b42121e793f835bd14c0b8090420430c # pin@main
with:
base: "api.yaml"
revision: "src/backend/InvenTree/schema.yml"
@ -251,17 +251,17 @@ jobs:
- name: Extract settings / tags
run: invoke int.export-definitions --basedir docs
- name: Upload settings
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # pin@v7.0.0
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
with:
name: inventree_settings.json
path: docs/generated/inventree_settings.json
- name: Upload tags
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # pin@v7.0.0
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
with:
name: inventree_tags.yml
path: docs/generated/inventree_tags.yml
- name: Upload filters
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # pin@v7.0.0
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
with:
name: inventree_filters.yml
path: docs/generated/inventree_filters.yml
@ -363,7 +363,7 @@ jobs:
pip install .
if: needs.paths-filter.outputs.submit-performance == 'true'
- name: Performance Reporting
uses: CodSpeedHQ/action@1c8ae4843586d3ba879736b7f6b7b0c990757fab # pin@v4
uses: CodSpeedHQ/action@db35df748deb45fdef0960669f57d627c1956c30 # pin@v4
# check if we are in inventree/inventree - reporting only works in that OIDC context
if: github.repository == 'inventree/InvenTree' && needs.paths-filter.outputs.submit-performance == 'true'
with:
@ -409,7 +409,7 @@ jobs:
- name: Coverage Tests
run: invoke dev.test --check --coverage --translations
- name: Upload raw coverage to artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # pin@v7.0.0
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
with:
name: coverage
path: .coverage
@ -454,7 +454,7 @@ jobs:
env:
node_version: '>=20.19.0'
- name: Performance Reporting
uses: CodSpeedHQ/action@1c8ae4843586d3ba879736b7f6b7b0c990757fab # pin@v4
uses: CodSpeedHQ/action@db35df748deb45fdef0960669f57d627c1956c30 # pin@v4
with:
mode: walltime
run: inv dev.test --pytest
@ -725,7 +725,7 @@ jobs:
invoke static
env INVENTREE_CUSTOM_SPLASH="img/playwright_custom_splash.png" INVENTREE_CUSTOM_LOGO="img/playwright_custom_logo.png" npx nyc playwright test --project=customization
npx nyc playwright test --project=chromium --project=firefox
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # pin@v7.0.0
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
if: ${{ !cancelled() && steps.tests.outcome == 'failure' }}
with:
name: playwright-report
@ -770,7 +770,7 @@ jobs:
run: |
cd src/backend/InvenTree/web/static
zip -r frontend-build.zip web/ web/.vite
- uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # pin@v7.0.0
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
with:
name: frontend-build
path: src/backend/InvenTree/web/static/web

View File

@ -28,7 +28,7 @@ jobs:
pip install --require-hashes -r contrib/dev_reqs/requirements.txt
python3 .github/scripts/version_check.py
- name: Push to Stable Branch
uses: ad-m/github-push-action@77c5b412c50b723d2a4fbc6d71fb5723bcd439aa # pin@v1.0.0
uses: ad-m/github-push-action@4cc74773234f74829a8c21bc4d69dd4be9cfa599 # pin@v1.1.0
if: env.stable_release == 'true'
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
@ -86,7 +86,7 @@ jobs:
tag: ${{ github.ref }}
overwrite: true
- name: Upload frontend to artifacts
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # pin@v7.0.0
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # pin@v7.0.1
with:
name: frontend-build
path: src/backend/InvenTree/web/static/frontend-build.zip

View File

@ -59,7 +59,7 @@ jobs:
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: SARIF file
path: results.sarif

View File

@ -97,3 +97,4 @@ repos:
rev: 0.4.3
hooks:
- id: teyit
language_version: python3.11

View File

@ -23,9 +23,9 @@ gunicorn==25.3.0 \
# via
# -c src/backend/requirements.txt
# -r contrib/container/requirements.in
invoke==2.2.1 \
--hash=sha256:2413bc441b376e5cd3f55bb5d364f973ad8bdd7bf87e53c79de3c11bf3feecc8 \
--hash=sha256:515bf49b4a48932b79b024590348da22f39c4942dff991ad1fb8b8baea1be707
invoke==3.0.3 \
--hash=sha256:437b6a622223824380bfb4e64f612711a6b648c795f565efc8625af66fb57f0c \
--hash=sha256:f11327165e5cbb89b2ad1d88d3292b5113332c43b8553b494da435d6ec6f5053
# via
# -c src/backend/requirements.txt
# -r contrib/container/requirements.in

View File

@ -10,6 +10,9 @@ Plugins can inherit from the [UserInterfaceMixin](./mixins/ui.md) class to provi
Note that the [InvenTree plugin creator](./creator.md) can be used to scaffold a new plugin with the necessary structure for frontend integration. This will automatically set up the necessary files and configurations to get started with frontend development.
!!! info "Simplified Development"
Using the plugin creator can significantly simplify the process of developing a frontend plugin, as it provides a ready-made template with the necessary configurations for building and integrating the frontend code. Rolling your own frontend plugin from scratch is possible, but it requires a good understanding of the InvenTree frontend architecture and build process.
## Frontend Architecture
When designing a frontend plugin component, it is important to have at least a basic understanding of the InvenTree frontend architecture.
@ -76,20 +79,28 @@ The following properties are available in the `context` object:
| Property | Description |
| -------- | ----------- |
| `version` | An object containing the current InvenTree version information. |
| `api` | The Axios instance configured to communicate with the InvenTree API. |
| `queryClient` | The query client instance used for managing API calls in the frontend. |
| `user` | An object containing information about the currently logged-in user. |
| `userSettings` | An object containing user-specific settings. |
| `globalSettings` | An object containing global settings for the InvenTree instance. |
| `modelInformation` | An object containing information about the models available in the InvenTree instance. |
| `renderInstance` | A function to render a model instance |
| `host` | An object containing information about the current host (server) configuration. |
| `i18n` | An object containing internationalization (i18n) functions for translating text. |
| `locale` | The current locale being used for the user interface. |
| `api` | The Axios instance configured to communicate with the InvenTree API. |
| `queryClient` | The query client instance used for managing API calls in the frontend. |
| `navigate` | A function to navigate to a different page in the InvenTree web interface. |
| `globalSettings` | An object containing global settings for the InvenTree instance. |
| `userSettings` | An object containing user-specific settings. |
| `modelInformation` | An object containing information about the models available in the InvenTree instance. |
| `renderInstance` | A function to render a model instance |
| `theme` | The current Mantine theme being used in the InvenTree web interface. |
| `colorScheme` | The current color scheme being used in the InvenTree web interface. |
| `forms` | A set of functional components for rendering forms in the InvenTree web interface. |
| `tables` | A set of functional components for rendering tables in the InvenTree web interface. |
| `importer` | A set of functions for controlling the global importer drawer in the InvenTree web interface. |
| `model` | The model type associated with the rendered component (if applicable). |
| `id` | The ID (primary key) of the model instance being rendered (if applicable). |
| `instance` | The model instance data (if available). |
| `reloadContent` | A function which can be called to reload the plugin content. |
| `reloadInstance` | A function which can be called to reload the model instance. |
| `context` | Any additional context data which may be passed to the plugin. |
This set of components is passed through at render time to the plugin function, allowing the plugin code to hook directly into the InvenTree web interface and access the necessary context for rendering.

View File

@ -321,6 +321,7 @@ The following cache settings are available:
| INVENTREE_CACHE_PORT | cache.port | Cache server port | 6379 |
| INVENTREE_CACHE_PASSWORD | cache.password | Cache server password | none |
| INVENTREE_CACHE_USER | cache.user | Cache server username | none |
| INVENTREE_CACHE_DB | cache.db | Cache server database index | 0 |
| INVENTREE_CACHE_CONNECT_TIMEOUT | cache.connect_timeout | Cache connection timeout (seconds) | 3 |
| INVENTREE_CACHE_TIMEOUT | cache.timeout | Cache timeout (seconds) | 3 |
| INVENTREE_CACHE_TCP_KEEPALIVE | cache.tcp_keepalive | Cache TCP keepalive | True |

View File

@ -241,7 +241,7 @@ By default, the Dockerized InvenTree web server binds to all available network i
This can be adjusted using the following environment variables:
| Environment Variable | Default |
| --- | --- | --- | --- |
| --- | --- |
| INVENTREE_WEB_ADDR | 0.0.0.0 |
| INVENTREE_WEB_PORT | 8000 |

View File

@ -169,9 +169,9 @@ charset-normalizer==3.4.7 \
# via
# -c src/backend/requirements.txt
# requests
click==8.3.1 \
--hash=sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a \
--hash=sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6
click==8.3.2 \
--hash=sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5 \
--hash=sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d
# via
# mkdocs
# neoteroi-mkdocs
@ -463,9 +463,9 @@ pathspec==1.0.4 \
# mkdocs
# mkdocs-macros-plugin
# properdocs
platformdirs==4.9.4 \
--hash=sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934 \
--hash=sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868
platformdirs==4.9.6 \
--hash=sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a \
--hash=sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917
# via
# -c src/backend/requirements.txt
# mkdocs-get-deps

View File

@ -1,11 +1,16 @@
"""InvenTree API version information."""
# InvenTree API version
INVENTREE_API_VERSION = 478
INVENTREE_API_VERSION = 479
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about."""
INVENTREE_API_TEXT = """
v479 -> 2026-04-11 : https://github.com/inventree/InvenTree/pull/11723
- POST /api//notifications/readall/ now requires a POST action
- POST /api/admin/email/test/ - now returns a 200 on. a successful test
- GET /api/notifications/ - now uses user-centric permissions, not a general read
v478 -> 2026-04-11 : https://github.com/inventree/InvenTree/pull/11073
- Add OptionalField class for cleaner handling of optional fields in serializers

View File

@ -50,6 +50,11 @@ def cache_user():
return cache_setting('user', None)
def cache_db():
"""Return the cache database index."""
return cache_setting('db', 0, typecast=int)
def is_global_cache_enabled() -> bool:
"""Check if the global cache is enabled.
@ -95,9 +100,11 @@ def get_cache_config(global_cache: bool) -> dict:
user = cache_user() or ''
if password:
redis_url = f'redis://{user}:{password}@{cache_host()}:{cache_port()}/0'
redis_url = (
f'redis://{user}:{password}@{cache_host()}:{cache_port()}/{cache_db()}'
)
else:
redis_url = f'redis://{cache_host()}:{cache_port()}/0'
redis_url = f'redis://{cache_host()}:{cache_port()}/{cache_db()}'
keepalive_options = {
'TCP_KEEPCNT': cache_setting('keepalive_count', 5, typecast=int),

View File

@ -345,4 +345,8 @@ def sanitize_svg(
link_rel=None,
)
# Replace non-breaking spaces with regular spaces to prevent SVG rendering issues
for nbsp in [' ', ' ']:
cleaned = cleaned.replace(nbsp, ' ')
return cleaned

View File

@ -395,21 +395,8 @@ class NotificationMessageViewSet(
queryset = queryset.filter(user=request.user)
return queryset
def get_permissions(self):
"""Override permissions for list view."""
if self.action == 'list':
return [IsAuthenticatedOrReadScope()]
else:
return super().get_permissions()
def list(self, request, *args, **kwargs):
"""List view for all notifications of the current user."""
# TODO @matmair permissions for this are currently being overwritten in get_permissions - this should be moved to a dedicated endpoint
return super().list(request, *args, **kwargs)
# TODO @matmair this should really be a POST
@action(
detail=False, methods=['get'], permission_classes=[IsAuthenticatedOrReadScope]
detail=False, methods=['post'], permission_classes=[IsAuthenticatedOrReadScope]
)
def readall(self, request, *args, **kwargs):
"""Set all messages for the current user as read."""
@ -1248,7 +1235,6 @@ class EmailViewSet(BulkDeleteViewsetMixin, RetrieveDestroyModelViewSet):
'thread_id_key',
]
@extend_schema(responses={201: common.serializers.TestEmailSerializer})
@action(
detail=False,
methods=['post'],
@ -1270,8 +1256,7 @@ class EmailViewSet(BulkDeleteViewsetMixin, RetrieveDestroyModelViewSet):
raise serializers.ValidationError(
detail=f'Failed to send test email: "{reason}"'
) # pragma: no cover
# TODO @matmair - breaking change: this should be a 200
return Response(serializer.data, status=201)
return Response(serializer.data)
admin_router.register('email', EmailViewSet, basename='api-email')

View File

@ -103,7 +103,9 @@ class EmailTests(InvenTreeAPITestCase):
)
def test_email_api(self):
"""Test that the email api endpoints work."""
self.post(reverse('api-email-test'), {'email': 'test@example.org'})
self.post(
reverse('api-email-test'), {'email': 'test@example.org'}, expected_code=200
)
response = self.get(reverse('api-email-list'), expected_code=200)
self.assertIn('subject', response.data[0])

View File

@ -1332,7 +1332,7 @@ class NotificationTest(InvenTreeAPITestCase):
self.assertEqual(len(self.get(url, expected_code=200).data), 1)
# Read with readall endpoint
self.get(reverse('api-notifications-readall'), {}, expected_code=200)
self.post(reverse('api-notifications-readall'), {}, expected_code=200)
self.assertEqual(NotificationMessage.objects.filter(read=True).count(), 1)
self.assertEqual(len(self.get(url, expected_code=200).data), 1)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -101,16 +101,16 @@ blessed==1.38.0 \
# via
# -c src/backend/requirements.txt
# -r src/backend/requirements.in
boto3==1.42.82 \
--hash=sha256:6df9ca0f5047c6afe6bd42244d8e059cde69e2cdb719ebd68d52c7d7beb529b2 \
--hash=sha256:804341c8197c556e8e7ceb82388ee120f319a4efbb9dc368f6059760a11cfc7d
boto3==1.42.87 \
--hash=sha256:15cc1404b3ccbcfe17bd5834d467b1b28d53d9aca44e3798dc44876ac57362e6 \
--hash=sha256:b5b86a826f8f12c7d38679f35bd0135807a6867a21eb8be6dea7c27aeb14ec14
# via
# -c src/backend/requirements.txt
# django-anymail
# django-storages
botocore==1.42.82 \
--hash=sha256:824dbb58c99d894f193ed1dd75cf59650e25c1b5adb9d3a66b39fdede46f259b \
--hash=sha256:a2bfe8537e95462ec06a46cc29c327f84746722bb4ce106491bfd3af8075ceed
botocore==1.42.87 \
--hash=sha256:1c6cc9555c1feec50b290a42de70ba6f04826c009562c2c12bb9990d0258482d \
--hash=sha256:32832df27c039cc1a518289afe0f6006296d3df26603b5f66e911457e67f0146
# via
# -c src/backend/requirements.txt
# boto3
@ -578,9 +578,9 @@ django-cors-headers==4.9.0 \
# via
# -c src/backend/requirements.txt
# -r src/backend/requirements.in
django-dbbackup==5.2.0 \
--hash=sha256:540948869e44778b5b33333cbab0cfe44279defd47df635d309ede8666894370 \
--hash=sha256:72b11dd31758abcf8f2d405fd2efbc49c9624bc17196f8c68542d3dc8d8d53c3
django-dbbackup==5.3.0 \
--hash=sha256:2c880dba7650539e8a724174fedb5213062c4fcda3aa09e1c5f3f573192106cb \
--hash=sha256:ff80b5facd524e3f6479235aeb330b094a1c982f8b0b9503c24ba0dc613162ed
# via
# -c src/backend/requirements.txt
# -r src/backend/requirements.in
@ -990,9 +990,9 @@ inflection==0.5.1 \
# via
# -c src/backend/requirements.txt
# drf-spectacular
invoke==2.2.1 \
--hash=sha256:2413bc441b376e5cd3f55bb5d364f973ad8bdd7bf87e53c79de3c11bf3feecc8 \
--hash=sha256:515bf49b4a48932b79b024590348da22f39c4942dff991ad1fb8b8baea1be707
invoke==3.0.3 \
--hash=sha256:437b6a622223824380bfb4e64f612711a6b648c795f565efc8625af66fb57f0c \
--hash=sha256:f11327165e5cbb89b2ad1d88d3292b5113332c43b8553b494da435d6ec6f5053
# via
# -c src/backend/requirements.txt
# paramiko
@ -1033,147 +1033,141 @@ jwcrypto==1.5.7 \
# via
# -c src/backend/requirements.txt
# django-oauth-toolkit
lxml==6.0.2 \
--hash=sha256:058027e261afed589eddcfe530fcc6f3402d7fd7e89bfd0532df82ebc1563dba \
--hash=sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8 \
--hash=sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0 \
--hash=sha256:08b9d5e803c2e4725ae9e8559ee880e5328ed61aa0935244e0515d7d9dbec0aa \
--hash=sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f \
--hash=sha256:0aa7070978f893954008ab73bb9e3c24a7c56c054e00566a21b553dc18105fca \
--hash=sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf \
--hash=sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607 \
--hash=sha256:17f68764f35fd78d7c4cc4ef209a184c38b65440378013d24b8aecd327c3e0c8 \
--hash=sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452 \
--hash=sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700 \
--hash=sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d \
--hash=sha256:1e786a464c191ca43b133906c6903a7e4d56bef376b75d97ccbb8ec5cf1f0a4b \
--hash=sha256:1ea99340b3c729beea786f78c38f60f4795622f36e305d9c9be402201efdc3b7 \
--hash=sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d \
--hash=sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6 \
--hash=sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a \
--hash=sha256:24a8e756c982c001ca8d59e87c80c4d9dcd4d9b44a4cbeb8d9be4482c514d41d \
--hash=sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca \
--hash=sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb \
--hash=sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed \
--hash=sha256:2613e67de13d619fd283d58bda40bff0ee07739f624ffee8b13b631abf33083d \
--hash=sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e \
--hash=sha256:2c8458c2cdd29589a8367c09c8f030f1d202be673f0ca224ec18590b3b9fb694 \
--hash=sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd \
--hash=sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659 \
--hash=sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c \
--hash=sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314 \
--hash=sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5 \
--hash=sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849 \
--hash=sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938 \
--hash=sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a \
--hash=sha256:3efe1b21c7801ffa29a1112fab3b0f643628c30472d507f39544fd48e9549e34 \
--hash=sha256:3fee0851639d06276e6b387f1c190eb9d7f06f7f53514e966b26bae46481ec90 \
--hash=sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6 \
--hash=sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba \
--hash=sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285 \
--hash=sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553 \
--hash=sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d \
--hash=sha256:452b899faa64f1805943ec1c0c9ebeaece01a1af83e130b69cdefeda180bb42c \
--hash=sha256:45f93e6f75123f88d7f0cfd90f2d05f441b808562bf0bc01070a00f53f5028b5 \
--hash=sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601 \
--hash=sha256:4ddb1049fa0579d0cbd00503ad8c58b9ab34d1254c77bc6a5576d96ec7853dba \
--hash=sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37 \
--hash=sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f \
--hash=sha256:5921d924aa5468c939d95c9814fa9f9b5935a6ff4e679e26aaf2951f74043512 \
--hash=sha256:59c45e125140b2c4b33920d21d83681940ca29f0b83f8629ea1a2196dc8cfe6a \
--hash=sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438 \
--hash=sha256:5d444858b9f07cefff6455b983aea9a67f7462ba1f6cbe4a21e8bf6791bf2153 \
--hash=sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9 \
--hash=sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d \
--hash=sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6 \
--hash=sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f \
--hash=sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534 \
--hash=sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46 \
--hash=sha256:66328dabea70b5ba7e53d94aa774b733cf66686535f3bc9250a7aab53a91caaf \
--hash=sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f \
--hash=sha256:6cdaefac66e8b8f30e37a9b4768a391e1f8a16a7526d5bc77a7928408ef68e93 \
--hash=sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8 \
--hash=sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f \
--hash=sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1 \
--hash=sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322 \
--hash=sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f \
--hash=sha256:71695772df6acea9f3c0e59e44ba8ac50c4f125217e84aab21074a1a55e7e5c9 \
--hash=sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f \
--hash=sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7 \
--hash=sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f \
--hash=sha256:817ef43a0c0b4a77bd166dc9a09a555394105ff3374777ad41f453526e37f9cb \
--hash=sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916 \
--hash=sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec \
--hash=sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9 \
--hash=sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d \
--hash=sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679 \
--hash=sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0 \
--hash=sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192 \
--hash=sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917 \
--hash=sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c \
--hash=sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d \
--hash=sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338 \
--hash=sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d \
--hash=sha256:995e783eb0374c120f528f807443ad5a83a656a8624c467ea73781fc5f8a8304 \
--hash=sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77 \
--hash=sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba \
--hash=sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456 \
--hash=sha256:a656ca105115f6b766bba324f23a67914d9c728dafec57638e2b92a9dcd76c62 \
--hash=sha256:a6b5b39cc7e2998f968f05309e666103b53e2edd01df8dc51b90d734c0825444 \
--hash=sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a \
--hash=sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f \
--hash=sha256:a8ffaeec5dfea5881d4c9d8913a32d10cfe3923495386106e4a24d45300ef79c \
--hash=sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d \
--hash=sha256:ac02dc29fd397608f8eb15ac1610ae2f2f0154b03f631e6d724d9e2ad4ee2c84 \
--hash=sha256:af85529ae8d2a453feee4c780d9406a5e3b17cee0dd75c18bd31adcd584debc3 \
--hash=sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe \
--hash=sha256:b2142a376b40b6736dfc214fd2902409e9e3857eff554fed2d3c60f097e62a62 \
--hash=sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8 \
--hash=sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178 \
--hash=sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0 \
--hash=sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7 \
--hash=sha256:b42f4d86b451c2f9d06ffb4f8bbc776e04df3ba070b9fe2657804b1b40277c48 \
--hash=sha256:b738f7e648735714bbb82bdfd030203360cfeab7f6e8a34772b3c8c8b820568c \
--hash=sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9 \
--hash=sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7 \
--hash=sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048 \
--hash=sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c \
--hash=sha256:bc456d04db0515ce3320d714a1eac7a97774ff0849e7718b492d957da4631dd4 \
--hash=sha256:bc532422ff26b304cfb62b328826bd995c96154ffd2bac4544f37dbb95ecaa8f \
--hash=sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b \
--hash=sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0 \
--hash=sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564 \
--hash=sha256:c54d83a2188a10ebdba573f16bd97135d06c9ef60c3dc495315c7a28c80a263f \
--hash=sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee \
--hash=sha256:cb233f9c95f83707dae461b12b720c1af9c28c2d19208e1be03387222151daf5 \
--hash=sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62 \
--hash=sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272 \
--hash=sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9 \
--hash=sha256:d4aec24d6b72ee457ec665344a29acb2d35937d5192faebe429ea02633151aad \
--hash=sha256:d6690ec5ec1cce0385cb20896b16be35247ac8c2046e493d03232f1c2414d321 \
--hash=sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a \
--hash=sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312 \
--hash=sha256:dacf3c64ef3f7440e3167aa4b49aa9e0fb99e0aa4f9ff03795640bf94531bcb0 \
--hash=sha256:daf42de090d59db025af61ce6bdb2521f0f102ea0e6ea310f13c17610a97da4c \
--hash=sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37 \
--hash=sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964 \
--hash=sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484 \
--hash=sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e \
--hash=sha256:e237b807d68a61fc3b1e845407e27e5eb8ef69bc93fe8505337c1acb4ee300b6 \
--hash=sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078 \
--hash=sha256:e748d4cf8fef2526bb2a589a417eba0c8674e29ffcb570ce2ceca44f1e567bf6 \
--hash=sha256:e77dd455b9a16bbd2a5036a63ddbd479c19572af81b624e79ef422f929eef388 \
--hash=sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924 \
--hash=sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2 \
--hash=sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df \
--hash=sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd \
--hash=sha256:f2a50c3c1d11cad0ebebbac357a97b26aa79d2bcaf46f256551152aa85d3a4d1 \
--hash=sha256:f2e3b1a6bb38de0bc713edd4d612969dd250ca8b724be8d460001a387507021c \
--hash=sha256:f952dacaa552f3bb8834908dddd500ba7d508e6ea6eb8c52eb2d28f48ca06a31 \
--hash=sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed \
--hash=sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2 \
--hash=sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092 \
--hash=sha256:fe659f6b5d10fb5a17f00a50eb903eb277a71ee35df4615db573c069bcf967ac
lxml==6.0.3 \
--hash=sha256:04b7cedf52e125f86d0d426635e7fbe8e353d4cc272a1757888e3c072424381d \
--hash=sha256:06b9f3ac459b4565bbaa97aa5512aa7f9a1188c662f0108364f288f6daf35773 \
--hash=sha256:093786037b934ef4747b0e8a0e1599fe7df7dd8246e7f07d43bba1c4c8bd7b84 \
--hash=sha256:0a9a79144a8051bc5fbb223fac895b87eb67b361f27b00c2ed4a07ee34246b90 \
--hash=sha256:0b012cf200736d90f828b3ab4206857772c61b710f0a98d3814c7994decb6652 \
--hash=sha256:0c46a246df7fbab1f7b018c7eb361585b295ac95dec806158d9ed1e63b477f05 \
--hash=sha256:10bc4f37c28b4e1b3e901dde66e3a096eb128acf388d5b2962dc2941284293bb \
--hash=sha256:13f1594a183cee73f9a1dbfd35871c4e04b461f47eeb9bcf80f7d7856b1b136d \
--hash=sha256:143ac903fb6c9be6da613390825c8e8bb8c8d71517d43882031f6b9bc89770ef \
--hash=sha256:16e5cbaa1a6351f2abefa4072e9aac1f09103b47fe7ab4496d54e5995b065162 \
--hash=sha256:16fbcf06ae534b2fa5bcdc19fcf6abd9df2e74fe8563147d1c5a687a130efed4 \
--hash=sha256:19b079e81aa3a31b523a224b0dd46da4f56e1b1e248eef9a599e5c885c788813 \
--hash=sha256:1b36a3c73f2a6d9c2bfae78089ca7aedae5c2ee5fd5214a15f00b2f89e558ba7 \
--hash=sha256:1b60a3a1205f869bd47874787c792087174453b1a869db4837bf5b3ff92be017 \
--hash=sha256:20f8caa9beb61a688c4428631cb47fd6e0ba75ef30091cec5fee992138b2be77 \
--hash=sha256:239e9a6be3a79c03ec200d26f7bb17a4414704a208059e20050bf161e2d8848a \
--hash=sha256:26cdd7c3f4c3b932b28859d0b70966c2ec8b67c106717d6320121002f8f99025 \
--hash=sha256:2773dbe2cedee81f2769bd5d24ceb4037706cf032e1703513dd0e9476cd9375f \
--hash=sha256:27e317e554bc6086a082688ddf137437e5f7f20ffdd736a6f5b4e3ed1ecf1247 \
--hash=sha256:2a49123cc3209ccad7c4c5a4133bcfcfd4875f30461ea4d0aaa84e6608f712c5 \
--hash=sha256:2ce76d113a7c3bf42761ec1de7ca615b0cbf9d8ae478eb1d6c20111d9c9fc098 \
--hash=sha256:2d00902610dd91a970a06d5f1a6e4f2426e04a9fa07209d58e09b345e2269267 \
--hash=sha256:30c437d8bb9a9a9edff27e85b694342e47a26a6abc249abe00584a4824f9d80d \
--hash=sha256:322c825054d02d35755b80dc5c39ba8a71c7c09c43453394a13b9bd8c0abc84c \
--hash=sha256:336925309af5ecd9616acbe1c28d68ee0088839b1d42ae7dcc40ffecff959537 \
--hash=sha256:33741ec3b4268efffae8ba40f9b64523f4489caf270bde175535e659f03af05a \
--hash=sha256:353161f166e76f0d8228f8f5216d110601d143a8b6d0fd869230e12c098a5842 \
--hash=sha256:38652c280cf50cc5cf955e3d0b691fa6a97046d84407bbae340d8e353f9014ef \
--hash=sha256:38acf7171535ffa7fff1fcec8b82ebd4e55cd02e581efe776928108421accaa1 \
--hash=sha256:3a0484bd1e84f82766befcbd71cccd7307dacfe08071e4dbc1d9a9b498d321e8 \
--hash=sha256:448e69211e59c39f398990753d15ba49f7218ec128f64ac8012ef16762e509a3 \
--hash=sha256:46c80f7fd5dd7d8c269f6486b165c8f91c489e323f3a767221fb5b4b2b388d5f \
--hash=sha256:4723da3e8f4281853c2eaab161b69cc14bc9b0811be4cfa5a1de36df47e0c660 \
--hash=sha256:4b0f01fb8bdcaf4aa69cf55b2b2f8ef722e4423e1c020e7250dcb89a1d5db38e \
--hash=sha256:4ff774b43712b0cf40d9888a5494ca39aefe990c946511cc947b9fddcf74a29b \
--hash=sha256:50293e024afe5e2c25da2be68c8ceca8618912a0701a73f75b488317c8081aa6 \
--hash=sha256:51014ee2ab2091dcd9cdef92532f0a1addb7c2cc52a2bd70682e441363de5c0d \
--hash=sha256:5892d2ef99449ebd8e30544af5bc61fd9c30e9e989093a10589766422f6c5e1a \
--hash=sha256:59ff244cee0270fc4cf5f2ee920d4493ee88d0bcbc6e8465e9ef01439f1785e7 \
--hash=sha256:5b6913a68d98c58c673667c864500ba31bc9b0f462effac98914e9a92ebacd2e \
--hash=sha256:5c35e5c3ed300990a46a144d3514465713f812b35dacfa83e928c60db7c90af7 \
--hash=sha256:5c45bdcdc2ca6cf26fddff3faa5de7a2ed7c7f6016b3de80125313a37f972378 \
--hash=sha256:5d559a84b2fd583e5bcf8ec4af1ec895f98811684d5fbd6524ea31a04f92d4ad \
--hash=sha256:609bf136a7339aeca2bd4268c7cd190f33d13118975fe9964eda8e5138f42802 \
--hash=sha256:61399a5b01d74ec5f009762c74ab6ebf387e58393fc5d78368e12d4f577fea29 \
--hash=sha256:6289cb9145fbbc5b0e159c9fcd7fc09446dadc6b60b72c4d1012e80c7c727970 \
--hash=sha256:631567ffc3ddb989ccdcd28f6b9fa5aab1ec7fc0e99fe65572b006a6aad347e2 \
--hash=sha256:6364aa77b13e04459df6a9d2b806465287e7540955527e75ebd5fda48532913d \
--hash=sha256:6556b3197bd8a237a16fcd7278d09f094c5777ae36a1435b5e8e488826386d96 \
--hash=sha256:6c055bafdcb53e7f9f75e22c009cd183dd410475e21c296d599531d7f03d1bf5 \
--hash=sha256:724b26a38cef98d6869d00a33cb66083bee967598e44f6a8e53f1dd283c851b0 \
--hash=sha256:72d108ef9e39f45c6865ea8a5ba6736c0b1a33ddd6343653775349869e58c30b \
--hash=sha256:7373ede7ccb89e6f6e39c1423b3a4d4ee48035d3b4619a6addced5c8b48d0ecc \
--hash=sha256:738aef404c862d2c3cd951364ee7175c9d50e8290f5726611c4208c0fba8d186 \
--hash=sha256:773c22d3de2dd5454b0f89b36d366fa0052f0e924656506c40462d8107acd00f \
--hash=sha256:775266571f7027b1d77f5fce18a247b24f51a4404bdc1b90ec56be9b1e3801b9 \
--hash=sha256:794b42f0112adfa3f23670aba5bc0ac9c9adfcee699c0df129b0186c812ac3ff \
--hash=sha256:7966fbce2d18fde579d5593933d36ad98cc7c8dc7f2b1916d127057ce0415062 \
--hash=sha256:7f753db5785ce019d7b25bb75638ef5a42a0e208aa9f19933262134e668ca6af \
--hash=sha256:809726d4c72f1a902556df822c3acc5780053a12a05e16eac999392b30984c06 \
--hash=sha256:821fd53699eb498990c915ba955a392d07246454c9405e6c1d0692362503013d \
--hash=sha256:8243937d4673b46da90b4f5ea2627fd26842225e62e885828fdb8133aa1f7b32 \
--hash=sha256:8341c446fca7f6be003c60aededf2f23a53d4881cf7e0bafb9cef69c217ae26a \
--hash=sha256:83c1d75e9d124ab82a4ddaf59135112f0dc49526b47355e5928ae6126a68e236 \
--hash=sha256:83eca62141314d641ebe8089ffa532bbf572ea07dd6255b58c40130d06bb2509 \
--hash=sha256:841b89fc3d910d61c7c267db6bb7dc3a8b3dac240edb66220fcdf96fe70a0552 \
--hash=sha256:87bebd6836e88c0a007f66b89814daf5d7041430eb491c91d1851abc89aa6e93 \
--hash=sha256:88c524cf8c3b8d71dfc3de6cfb225138a876862a92d88bfa22eb9ff020729d45 \
--hash=sha256:8922a30704a4421d69a19e0499db5861da686c0bccc3a79cf3946e3155cf25f9 \
--hash=sha256:89f8746c206d8cf2c167221831645d6cc2b24464afd9c428a5eb3fd34c584eb1 \
--hash=sha256:8b81ec1ecac3be8c1ff1e00ca1c1baf8122e87db9000cd2549963847bd5e3b41 \
--hash=sha256:8c082ad2398664213a4bb5d133e2eb8bf239220b7d6688f8c8ffa9050057501f \
--hash=sha256:8c08926678852a233bf1ef645c4d683d56107f814482f8f41b21ef2c7659790e \
--hash=sha256:8d10a75e4d0a6a9ac2fec2f7ade682f468b51935102c70dab638fa4e94ffcb04 \
--hash=sha256:8eeec925ad7f81886d413b3a1f8715551f75543519229a9b35e957771e1826d5 \
--hash=sha256:911dbd0e87729016402e03533117ffe94147bfbcd7902b76af5854c4b437e096 \
--hash=sha256:955550c78afb2be47755bd1b8153724292a5b539cf3f21665b310c145d08e6f8 \
--hash=sha256:976b56bd0f4ca72280b4569eb227d012a541860f0d6fcc128ce26d22ef82c845 \
--hash=sha256:99457524afd384c330dc51e527976653d543ccadfa815d9f2d92c5911626e536 \
--hash=sha256:9a1adb0e220cb8691202ba9d97646a06292657a122df4b92733861d42f7cf4d2 \
--hash=sha256:9b8e0779780026979f217603385995202f364adc9807bd21210d81b9f562fc4e \
--hash=sha256:9d98063e6ae0da5084ec46952bb0a5ccb5e2cad168e32b4d65d1ec84e4b4ebd4 \
--hash=sha256:a10f9967859229cae38b1aa7a96eb655c96b8adc96989b52c5b1f77d963a77a4 \
--hash=sha256:a1664c5139755df44cab3834f4400b331b02205d62d3fdcb1554f63439bf3372 \
--hash=sha256:a1f258e6aa0e6eda2c1199f5582c062c96c7d4a28d96d0c4daa79e39b3f2a764 \
--hash=sha256:a4dc9f81707b9b56888fa7d3a889ac5219724cf0fbecab90ea5b197faf649534 \
--hash=sha256:a6380c5035598e4665272ad3fc86c96ddb2a220d4059cce5ba4b660f78346ad9 \
--hash=sha256:aa18653b795d2c273b8676f7ad2ca916d846d15864e335f746658e4c28eb5168 \
--hash=sha256:abc39c4fb67f029400608f9a3a4a3f351ccb3c061b05fd3ad113e4cfbba8a8ee \
--hash=sha256:ac2d6cdafa29672d6a604c641bf67ace3fd0735ec6885501a94943379219ddbf \
--hash=sha256:ac63a1ef1899ccadace10ac937c41321672771378374c254e931d001448ae372 \
--hash=sha256:ac65c08ba1bd90f662cb1d5c79f7ae4c53b1c100f0bb6ec5df1f40ac29028a7e \
--hash=sha256:ad6952810349cbfb843fe15e8afc580b2712359ae42b1d2b05d097bd48c4aea4 \
--hash=sha256:b044fe3bdb8b68efa33cb5917ae9379f07ec2e416ecd18cf5d333650d6d2fcbb \
--hash=sha256:b29300eeaadf85df7f2df4bb29cadfb13b9600d1bb8053f35d82d96f9e6d088a \
--hash=sha256:b683665d0287308adafc90a5617a51a508d8af8c7040693693bb333b5f4474fe \
--hash=sha256:b68c29aac4788438b07d768057836de47589c7deaa3ad8dc4af488dfc27be388 \
--hash=sha256:bd4f70e091f2df300396bc9ce36963f90b87611324c2ca750072a6e6375beba2 \
--hash=sha256:bf98f5f87f6484302e7cce4e2ca5af43562902852063d916c3e2f1c115fdce60 \
--hash=sha256:c137f8c8419c3de93e2998131d94628805f148e52b34da6d7533454e4d78bc2a \
--hash=sha256:c157bfef4e3b19688eb4da783c5bfabf5a3ac1ac8d317e0906f3feb18d4c89b7 \
--hash=sha256:c3de55b53f69ffa2fcfd897bd8a7e62f0f88a40a8a0c544e171e813f9d4ddbf5 \
--hash=sha256:c4fff7d77f440378cd841e340398edf5dbefee334816efbf521bb6e31651e54e \
--hash=sha256:c71a387ea133481e725079cff22de45593bf0b834824de22829365ab1d2386c9 \
--hash=sha256:c8184fdb2259bda1db2db9d6e25f667769afc2531830b4fa29f83f66a7872dea \
--hash=sha256:c8e3b8a54e65393ce1d5c7d9753fe756f0d96089e7163b20ddec3e5bb56a963e \
--hash=sha256:cbc7ce67f85b92db97c92219985432be84dc1ba9a028e68c6933e89551234df2 \
--hash=sha256:cbffd22fc8e4d80454efa968b0c93440a00b8b8a817ce0c29d2c6cb5ad324362 \
--hash=sha256:ce01ab3449015358f766a1950b3d818eedf9d4cdec3fa87e4eecaad10c0784db \
--hash=sha256:d1f14c1006722824c3f2158d147e520a82460b47ffdc2a84e444b3d244b65e4d \
--hash=sha256:d20af2784c763928d0d0879cbc5a3739e4d81eefa0d68962d3478bff4c13e644 \
--hash=sha256:d38c25bad123d6ce30bb37931d90a4e8a167cd796eeae9cd16c2bfce52718f8e \
--hash=sha256:d3d65e511e4e656ec67b472110f7a72cbf8547ca15f76fe74cffa4e97412a064 \
--hash=sha256:d573b81c29e20b1513afa386a544797a99cecde5497e6c77b6dfa4484112c819 \
--hash=sha256:d8781d812bb8efd47c35651639da38980383ff0d0c1f3269ade23e3a90799079 \
--hash=sha256:d8a8129bd502de138cdde22eac3990bde8a4efbafc72596baab67a495c48c974 \
--hash=sha256:d9e779a9c3167d2f158c41b6347fbc9e855f6d5561920a33123beb86463c3f46 \
--hash=sha256:dfc80c74233fe01157ab550fb12b9d07a2f1fa7c5900cefb484e3bf02e856fbc \
--hash=sha256:e0c88ca5fb307f7e817fc427681126e4712d3452258577bcb4ca86594c934852 \
--hash=sha256:e759ff1b244725fef428c6b54f3dab4954c293b2d242a5f2e79db5cc3873de51 \
--hash=sha256:e8ad05bb1fb4aa20ee201ab2f21c3c7571828e4fad525707437bb1c5f5ab6669 \
--hash=sha256:ecdded59dc50c0c28f652a98f69a7ada8bd2377248bf48c4a83c81204eb58b33 \
--hash=sha256:ed31e5852cd938704bc6c7a3822cbf84c7fa00ebfa914a1b4e2392d44f45bdfb \
--hash=sha256:edccf1157677db1da741d042601754b94af3926310c5763179200718ca738e70 \
--hash=sha256:f179bae37ad673f57756b59f26833b7922230bef471fdb29492428f152bae8c6 \
--hash=sha256:f27373113fda6621e4201f529908a24c8a190c2af355aed4711dadca44db4673 \
--hash=sha256:f297e9be3bbe59c31cfe5d0f38534510ed95856c480df3e8721b16d46ccaeeac \
--hash=sha256:f8f004d5c601eb50ac29a110632595a4f4c50db81c715d46a43de64ef88246cb \
--hash=sha256:f96bba9a26a064ce9e11099bad12fb08384b64d3acc0acf94bf386ca5cf4f95f \
--hash=sha256:fab00cef83d4f9d76c5e0722346e84bc174b071d68b4f725aeb0bf3877b9e6a6 \
--hash=sha256:fc6eeeddcee4d985707b3fc29fd6993e256e55798ca600586da68d3f0e04ec5a \
--hash=sha256:fdb7786ebefaa0dad0d399dfeaf146b370a14591af2f3aea59e06f931a426678 \
--hash=sha256:fddcf558bcb7a40993fb9e3ae3752d5d3a656479c71687799e43063563a2e68a \
--hash=sha256:feb5b9ed7d0510663a78b94f2b417a41c41b42a7bb157ef398ef9d78e6f0fd50
# via
# -c src/backend/requirements.txt
# python3-saml
@ -1605,9 +1599,9 @@ pip-licenses==5.5.5 \
# via
# -c src/backend/requirements.txt
# -r src/backend/requirements.in
platformdirs==4.9.4 \
--hash=sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934 \
--hash=sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868
platformdirs==4.9.6 \
--hash=sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a \
--hash=sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917
# via
# -c src/backend/requirements.txt
# pint
@ -1717,9 +1711,9 @@ pynacl==1.6.2 \
# via
# -c src/backend/requirements.txt
# paramiko
pypdf==6.10.0 \
--hash=sha256:4c5a48ba258c37024ec2505f7e8fd858525f5502784a2e1c8d415604af29f6ef \
--hash=sha256:90005e959e1596c6e6c84c8b0ad383285b3e17011751cedd17f2ce8fcdfc86de
pypdf==6.10.2 \
--hash=sha256:7d09ce108eff6bf67465d461b6ef352dcb8d84f7a91befc02f904455c6eea11d \
--hash=sha256:aa53be9826655b51c96741e5d7983ca224d898ac0a77896e64636810517624aa
# via
# -c src/backend/requirements.txt
# -r src/backend/requirements.in
@ -1749,9 +1743,9 @@ python-dotenv==1.2.2 \
# via
# -c src/backend/requirements.txt
# -r src/backend/requirements.in
python-fsutil==0.16.0 \
--hash=sha256:a60e16bad77e3f00c3dca95433209c823bc45e0ae4158e52969002f3c7957a18 \
--hash=sha256:dc957a3541215baa935f66f6f15ceb9a8b7f803919c3d99fa57c818fc545f288
python-fsutil==0.16.1 \
--hash=sha256:4cc78b9a1e64011cb4fdaeba531e457e649a6a9a560424e841426e47f3a153ad \
--hash=sha256:bda20802a19f6dc1bd221f6d2a79e0cd2b2c6eaf2b7c353a385c749917047442
# via
# -c src/backend/requirements.txt
# django-maintenance-mode
@ -1860,90 +1854,90 @@ qrcode[pil]==8.2 \
# -c src/backend/requirements.txt
# -r src/backend/requirements.in
# django-allauth
rapidfuzz==3.14.3 \
--hash=sha256:010e12e2411a4854b0434f920e72b717c43f8ec48d57e7affe5c42ecfa05dd0e \
--hash=sha256:02821366d928e68ddcb567fed8723dad7ea3a979fada6283e6914d5858674850 \
--hash=sha256:07aa0b5d8863e3151e05026a28e0d924accf0a7a3b605da978f0359bb804df43 \
--hash=sha256:0e38828d1381a0cceb8a4831212b2f673d46f5129a1897b0451c883eaf4a1747 \
--hash=sha256:152555187360978119e98ce3e8263d70dd0c40c7541193fc302e9b7125cf8f58 \
--hash=sha256:1704fc70d214294e554a2421b473779bcdeef715881c5e927dc0f11e1692a0ff \
--hash=sha256:1b7ef2f4b8583a744338a18f12c69693c194fb6777c0e9ada98cd4d9e8f09d10 \
--hash=sha256:1b86daa7419b5e8b180690efd1fdbac43ff19230803282521c5b5a9c83977655 \
--hash=sha256:1d83b8b712fa37e06d59f29a4b49e2e9e8635e908fbc21552fe4d1163db9d2a1 \
--hash=sha256:1e6eefec45625c634926a9fd46c9e4f31118ac8f3156fff9494422cee45207e6 \
--hash=sha256:1ec0c8c0c3d4f97ced46b2e191e883f8c82dbbf6d5ebc1842366d7eff13cd5a6 \
--hash=sha256:1f1925619627f8798f8c3a391d81071336942e5fe8467bc3c567f982e7ce2897 \
--hash=sha256:1faa0f8f76ba75fd7b142c984947c280ef6558b5067af2ae9b8729b0a0f99ede \
--hash=sha256:2491937177868bc4b1e469087601d53f925e8d270ccc21e07404b4b5814b7b5f \
--hash=sha256:2dc37bc20272f388b8c3a4eba4febc6e77e50a8f450c472def4751e7678f55e4 \
--hash=sha256:32eeafa3abce138bb725550c0e228fc7eaeec7059aa8093d9cbbec2b58c2371a \
--hash=sha256:33a325ed0e8e1aa20c3e75f8ab057a7b248fdea7843c2a19ade0008906c14af0 \
--hash=sha256:33da4bbaf44e9755b0ce192597f3bde7372fe2e381ab305f41b707a95ac57aa7 \
--hash=sha256:37d3c653af15cd88592633e942f5407cb4c64184efab163c40fcebad05f25141 \
--hash=sha256:3fecce764cf5a991ee2195a844196da840aba72029b2612f95ac68a8b74946bf \
--hash=sha256:43d0305c36f504232f18ea04e55f2059bb89f169d3119c4ea96a0e15b59e2a91 \
--hash=sha256:43e38c1305cffae8472572a0584d4ffc2f130865586a81038ca3965301f7c97c \
--hash=sha256:442125473b247227d3f2de807a11da6c08ccf536572d1be943f8e262bae7e4ea \
--hash=sha256:442cba39957a008dfc5bdef21a9c3f4379e30ffb4e41b8555dbaf4887eca9300 \
--hash=sha256:489ce98a895c98cad284f0a47960c3e264c724cb4cfd47a1430fa091c0c25204 \
--hash=sha256:4ad73afb688b36864a8d9b7344a9cf6da186c471e5790cbf541a635ee0f457f2 \
--hash=sha256:4b39921df948388a863f0e267edf2c36302983459b021ab928d4b801cbe6a421 \
--hash=sha256:4e49c9e992bc5fc873bd0fff7ef16a4405130ec42f2ce3d2b735ba5d3d4eb70f \
--hash=sha256:52619d25a09546b8db078981ca88939d72caa6b8701edd8b22e16482a38e799f \
--hash=sha256:54fa03062124e73086dae66a3451c553c1e20a39c077fd704dc7154092c34c63 \
--hash=sha256:56fefb4382bb12250f164250240b9dd7772e41c5c8ae976fd598a32292449cc5 \
--hash=sha256:576e4b9012a67e0bf54fccb69a7b6c94d4e86a9540a62f1a5144977359133583 \
--hash=sha256:57f878330c8d361b2ce76cebb8e3e1dc827293b6abf404e67d53260d27b5d941 \
--hash=sha256:5cfc3d57abd83c734d1714ec39c88a34dd69c85474918ebc21296f1e61eb5ca8 \
--hash=sha256:656e52b054d5b5c2524169240e50cfa080b04b1c613c5f90a2465e84888d6f15 \
--hash=sha256:685c93ea961d135893b5984a5a9851637d23767feabe414ec974f43babbd8226 \
--hash=sha256:6a014ba09657abfcfeed64b7d09407acb29af436d7fc075b23a298a7e4a6b41c \
--hash=sha256:6c5f545f454871e6af05753a0172849c82feaf0f521c5ca62ba09e1b382d6382 \
--hash=sha256:6de00eb84c71476af7d3110cf25d8fe7c792d7f5fa86764ef0b4ca97e78ca3ed \
--hash=sha256:73b07566bc7e010e7b5bd490fb04bb312e820970180df6b5655e9e6224c137db \
--hash=sha256:769f31c60cd79420188fcdb3c823227fc4a6deb35cafec9d14045c7f6743acae \
--hash=sha256:7ba009977601d8b0828bfac9a110b195b3e4e79b350dcfa48c11269a9f1918a0 \
--hash=sha256:7ccbf68100c170e9a0581accbe9291850936711548c6688ce3bfb897b8c589ad \
--hash=sha256:7cf174b52cb3ef5d49e45d0a1133b7e7d0ecf770ed01f97ae9962c5c91d97d23 \
--hash=sha256:7d9af908c2f371bfb9c985bd134e295038e3031e666e4b2ade1e7cb7f5af2f1a \
--hash=sha256:834d1e818005ed0d4ae38f6b87b86fad9b0a74085467ece0727d20e15077c094 \
--hash=sha256:8383b6d0d92f6cd008f3c9216535be215a064b2cc890398a678b56e6d280cb63 \
--hash=sha256:89acb8cbb52904f763e5ac238083b9fc193bed8d1f03c80568b20e4cef43a519 \
--hash=sha256:948b00e8476a91f510dd1ec07272efc7d78c275d83b630455559671d4e33b678 \
--hash=sha256:9ec02e62ae765a318d6de38df609c57fc6dacc65c0ed1fd489036834fd8a620c \
--hash=sha256:a0a28add871425c2fe94358c6300bbeb0bc2ed828ca003420ac6825408f5a424 \
--hash=sha256:a2135b138bcdcb4c3742d417f215ac2d8c2b87bde15b0feede231ae95f09ec41 \
--hash=sha256:adb44d996fc610c7da8c5048775b21db60dd63b1548f078e95858c05c86876a3 \
--hash=sha256:b5100fd6bcee4d27f28f4e0a1c6b5127bc8ba7c2a9959cad9eab0bf4a7ab3329 \
--hash=sha256:b9fcd4d751a4fffa17aed1dde41647923c72c74af02459ad1222e3b0022da3a1 \
--hash=sha256:beda6aa9bc44d1d81242e7b291b446be352d3451f8217fcb068fc2933927d53b \
--hash=sha256:c5fb2d978a601820d2cfd111e2c221a9a7bfdf84b41a3ccbb96ceef29f2f1ac7 \
--hash=sha256:c71ce6d4231e5ef2e33caa952bfe671cb9fd42e2afb11952df9fad41d5c821f9 \
--hash=sha256:c7bd1816db05d6c5ffb3a4df0a2b7b56fb8c81ef584d08e37058afa217da91b1 \
--hash=sha256:c7e40c0a0af02ad6e57e89f62bef8604f55a04ecae90b0ceeda591bbf5923317 \
--hash=sha256:cc594bbcd3c62f647dfac66800f307beaee56b22aaba1c005e9c4c40ed733923 \
--hash=sha256:cc65e72790ddfd310c2c8912b45106e3800fefe160b0c2ef4d6b6fec4e826457 \
--hash=sha256:cec3c0da88562727dd5a5a364bd9efeb535400ff0bfb1443156dd139a1dd7b50 \
--hash=sha256:cfe8df315ab4e6db4e1be72c5170f8e66021acde22cd2f9d04d2058a9fd8162e \
--hash=sha256:d1fa009f8b1100e4880868137e7bf0501422898f7674f2adcd85d5a67f041296 \
--hash=sha256:d7843a1abf0091773a530636fdd2a49a41bcae22f9910b86b4f903e76ddc82dc \
--hash=sha256:da2a007434323904719158e50f3076a4dadb176ce43df28ed14610c773cc9825 \
--hash=sha256:dbcb726064b12f356bf10fffdb6db4b6dce5390b23627c08652b3f6e49aa56ae \
--hash=sha256:dc8c07801df5206b81ed6bd6c35cb520cf9b6c64b9b0d19d699f8633dc942897 \
--hash=sha256:dea2d113e260a5da0c4003e0a5e9fdf24a9dc2bb9eaa43abd030a1e46ce7837d \
--hash=sha256:dea97ac3ca18cd3ba8f3d04b5c1fe4aa60e58e8d9b7793d3bd595fdb04128d7a \
--hash=sha256:dee362e7e79bae940a5e2b3f6d09c6554db6a4e301cc68343886c08be99844f1 \
--hash=sha256:e195a77d06c03c98b3fc06b8a28576ba824392ce40de8c708f96ce04849a052e \
--hash=sha256:e6b5e3036976f0fde888687d91be86d81f9ac5f7b02e218913c38285b756be6c \
--hash=sha256:e6c31a4aa68cfa75d7eede8b0ed24b9e458447db604c2db53f358be9843d81d3 \
--hash=sha256:e805e52322ae29aa945baf7168b6c898120fbc16d2b8f940b658a5e9e3999253 \
--hash=sha256:ea188aa00e9bcae8c8411f006a5f2f06c4607a02f24eab0d8dc58566aa911f35 \
--hash=sha256:ecd7453e02cf072258c3a6b8e930230d789d5d46cc849503729f9ce475d0e785 \
--hash=sha256:ef6bf930b947bd0735c550683939a032090f1d688dfd8861d6b45307b96fd5c5 \
--hash=sha256:f3d15d8527e2b293e38ce6e437631af0708df29eafd7c9fc48210854c94472f9 \
--hash=sha256:f3eb0ff3b75d6fdccd40b55e7414bb859a1cda77c52762c9c82b85569f5088e7 \
--hash=sha256:fa7c8f26f009f8c673fbfb443792f0cf8cf50c4e18121ff1e285b5e08a94fbdb \
--hash=sha256:fce3152f94afcfd12f3dd8cf51e48fa606e3cb56719bccebe3b401f43d0714f9
rapidfuzz==3.14.5 \
--hash=sha256:0084b687b02b4e569b46d8d6d4ad25659528e6081cd6d067ca453a69035f07e4 \
--hash=sha256:01550fe5f60fd176aa66b7611289d46dc4aa4b1b904874c7b6d1d54e581c5ec1 \
--hash=sha256:0298d357e2bc59d572da4db0bc631009b6f8f6c9bc8c11e99a12b833f16b6575 \
--hash=sha256:068b3e965ca9d9ee4debe40001ae7c3938ba646308afd33cf0c66618147db65c \
--hash=sha256:071d96b957a33b9296b9284b6350a0fb6d030b154a04efd7c15e56b98b79a517 \
--hash=sha256:09d6c9ba091854f07817055d795d604179c12a8f308ba4c7d56f3719dfea1646 \
--hash=sha256:0d3378f471ef440473a396ce2f8e97ee12f89a78b495540e0a5617bbfe895638 \
--hash=sha256:0ebd1a18e2e47bc0b292a07e6ed9c3642f8aaa672d12253885f599b50807a4f9 \
--hash=sha256:0f23e37019ec07712d58976b1ab2b889f8649a7f7c2f626a2f34ea9139e79279 \
--hash=sha256:11bfc2ed8fbe4ab86bd516fadefab126f90e6dcadffa761739fcb304707dfd35 \
--hash=sha256:13cb79c23ef5516e4c4e3830877be8b19aa75203636be1163d690d37803f6504 \
--hash=sha256:17a34330cd2a538c1ce5d400b61ba358c5b72c654b928ff87b362e88f8b864c7 \
--hash=sha256:1a31cc6d7d03e7318a0974c038959c59e19c752b81115f2e9138b3331cd64d45 \
--hash=sha256:1e910eebca9fd0eba245c0555e764597e8a0cccb673a92da2dc2397050725f48 \
--hash=sha256:1e989f86113be66574113b9c7bdf4793f3f863d248e47d911b355e05ca6b6b10 \
--hash=sha256:2e83cd2e25bb4edd97b689d9979d9c3acccdaaf26ceac08212ceece202febcfa \
--hash=sha256:39ef8658aaf67d51667e7bdaf7096f432333377d8302ac43c70b5df8a4cf89b8 \
--hash=sha256:3d50e5861872935fece391351cbb5ba21d1bced277cf5e1143d207a0a35f1925 \
--hash=sha256:3e91dcd2549b8f8d843f98ba03a17e01f3d8b72ce942adbbb6761bc58ffce813 \
--hash=sha256:419e4397a36e2665ec992d8d64c20ba4b2a42500c76ecadeca78a4f19cb9cc32 \
--hash=sha256:440d30faaf682ca496170a7f0cc5453ec942e3e079f0fd802c9a7f938dfb50a3 \
--hash=sha256:46b92a9970dcc34f0096901c792644094cab49554ac3547f35e3aebbdf0a3610 \
--hash=sha256:478b59bb018a6780d73f33e38d0b3ec5e968a6c1ed42876b993dd456b7aa20e8 \
--hash=sha256:48bee0b91bebfaec41e1081e351000659ab7570cc4598d617aa04d5bf827f9e6 \
--hash=sha256:4900143d82071bdda533b00300c40b14b963ff826b3642cc463b6dd0f036585e \
--hash=sha256:4a60f0057231188e3bd30216f7b4e0f279b11fa4ec818bb6c1d9f014d1562fbc \
--hash=sha256:56227a61fd3d17b0cd9793132431f3a3d07c8654be96794ba9f89fe0fc8b2d09 \
--hash=sha256:578e6051f6d5e6200c259b47a103cf06bb875ab5814d17333fc0b5c290b22f4c \
--hash=sha256:593c00dac4e30231c35bf3b4f1da8ec0998762e9e94425586a5d636fcd57f9d0 \
--hash=sha256:59b3dba758661a318995655435c6ab20a04ade79fa51e75bc8dc107cac8df280 \
--hash=sha256:5ab449c9abd0d4e1f8145dce0798a4c822a1a1933d613c764a641bea88b8bdab \
--hash=sha256:5dfa89d78f22cd773054caff44827b846161a29f2dcf7e78b8f90d086621e502 \
--hash=sha256:649712823f3abcdc48427147a5384fac15623ba435d0013959b52e6462521397 \
--hash=sha256:667f40fe9c81ad129b198d236881b00dd9e8314d9cc72d03c3e16bdfe5879051 \
--hash=sha256:6737b35d5af7479c5bf9710f7b17edd9d2c43128d974d25fb4ea653e42c64609 \
--hash=sha256:67f3f9d2b444268ab53e47d31bab89954888d23c04c6789f2c727e51fe4b1d13 \
--hash=sha256:7092a216728f80c960bd6b3807275d1ee318b168986bd5dc523349581d4890b8 \
--hash=sha256:738c96944d076deeaff70e92b65696ab4f7ecb8081d7791c5403a3257dfaf8ff \
--hash=sha256:77eac0526899b3c3ad1454bb2b03cdb491d67358ec8ef0c9c48bd61b632b431d \
--hash=sha256:7d5ca9c7832e6879a707296d1463685f7c243a27846227044504741640caec66 \
--hash=sha256:7e580cb04ad849ae9b786fa21383c6b994b6e6c1444ad1cb9f22392759d72741 \
--hash=sha256:8166efddea49fdbc61185559f47593239e4794fd7c9044dd5a789d1a90af852d \
--hash=sha256:823b1b9d9230809d8edcc18872770764bfe8ef4357995e16744047c8ccf0e489 \
--hash=sha256:88b7d31ff1cc5e9bc0e4406e6b1fa00b6d37163d50bb58091e9b976ff1129faa \
--hash=sha256:8c90cdf8516d9057e502aa6003cea71cf5ec27cc44699ca52412b502a04761bb \
--hash=sha256:8ce1d850b3c0178440efde9e884d98421b5e87ff925f364d6d79e23910d7593f \
--hash=sha256:8f4a8f5cc84c7ad6bffa0e9947b33eb343ad66e6b53e94fe54378a5508c5ed53 \
--hash=sha256:93d8da883a35116d6813432177f35e570db5b0a5e30ecb0cbd7cb39c815735df \
--hash=sha256:95d937e74c1a7a1287dfb03b62a827be08ede10a155cf1af73bbf47f2b73ee6e \
--hash=sha256:9669753caef7fdc6529f6adcc5883ed98d65976445d9322e7dbdb6b697feee13 \
--hash=sha256:97131ab2be39043054ee28d99e09efe316e6d53449b7e962dfcf3c2de8b2b246 \
--hash=sha256:97c6d85283629646fa87acc22c66b30ea9d4de7f6fdf887daa2e30fa041829b5 \
--hash=sha256:9981d38a703b86f0e315a3cd229fd1906fe1d91c989ed121fb975b3c849f89f5 \
--hash=sha256:9ad37a0be705b544af6296da8edddc260d10a8ae5462530fc9991f66498bb1f9 \
--hash=sha256:a2ae6f53f99c9a0eca7a0afc5b4e45fc73bc1dd4ac74c00509031d76df80ed98 \
--hash=sha256:aac0ad28c686a5e72b81668b906c030ee28050b244544b8af68e12fb32543895 \
--hash=sha256:af3b859726cd3374287e405e14b9634563c078c5531a4f62375508addebddad1 \
--hash=sha256:af6a90a4ed2a48fa1a2d17e9d824e6c7c950bea5bad0b707c77fd55751e6bfef \
--hash=sha256:b002c7994cc9f2bc9d9856f0fbaee6e8072c983873846c92f25cefba5b2a925f \
--hash=sha256:b486b5218808f6f4dc471b114b1054e63553db69705c97da0271f47bd706aedd \
--hash=sha256:b9c6bd754d11f6e78ac54e3d86b4b11dc1ba2f13e5fc958899574532897f5a99 \
--hash=sha256:ba10ac57884ce82112f7ed910b67e7fb6072d8ef2c06e30dc63c0f604a112e0e \
--hash=sha256:bf5018938208d4597b2e679a4f8cff9fd252f1df53583130ae56281a21801b64 \
--hash=sha256:c0919d1f89ddf91129906705723118ea09754171e4116f5a5dbc667c7bc9b261 \
--hash=sha256:c5801a89604c65ab4cc9e91b23bc4076d0ca80efd8c976fb63843d7879a85d7f \
--hash=sha256:c84af70bcf34e99aee894e46a0f1ac77f17d0ef828179c387407642e2466d28a \
--hash=sha256:cb2829fedd672dd7107267189dabe2bbe07972801d636014417c6861eb89e358 \
--hash=sha256:d45e06f60729e07d9b20c205f7e5cff90b6ef2584e852eecf46e045aea69627d \
--hash=sha256:d7ca16637c0ede8243f84074044bd0b2335a0341421f8227c85756de2d18c819 \
--hash=sha256:d8375e3da319593389727c3187ccaf3e0e84199accc530866b8e0f2b79af05e9 \
--hash=sha256:dfa552338f51aec280f17b02d28bace1e162d1a84ccd80e3339a57f98aedb56b \
--hash=sha256:dfef96543ced67d9513a422755db422ae1dc34dade0a1485e0b43e7342ed3ebf \
--hash=sha256:e012177c8e8a8a0754ae0d6027d63042aa5ff036d9f40f07cb3466a6082e21b8 \
--hash=sha256:e251126d48615e1f02b4a178f2cd0cd4f0332b8a019c01a2e10480f7552554b4 \
--hash=sha256:e52da10236aa6212de71b9e170bace65b64b129c0dea7fc243d6c9ce976f5074 \
--hash=sha256:eacb434410b8d9ca99a8d42352ef085cf423e3c76c1f0b86be2fcba3bff2952c \
--hash=sha256:ebd8fd343bf8492a1e60bcb6dc99f90f74f65d98d8241a6b3e1fed225b76ecd6 \
--hash=sha256:f0b2af76b7e7060c09e1a0dfa9410eb19369cbe6164509bff2ef94094b54d2b6 \
--hash=sha256:f2073495a7f9b75e57e600747ac09510d67683fd64d3228e009740b7ef88f9fe \
--hash=sha256:f4c1bca487a17fe4226b4ffb2d30e799d2b274d692cffa76bd0746f56235fca3 \
--hash=sha256:f9fff308486bbd2c8c24f25e8e152c7594d3fe8db265a2d6a1ce24d58671127f \
--hash=sha256:fbf1b8bb2695415b347f3727da1addca2acb82c9b97ac86bebf8b1bead1eb12d \
--hash=sha256:feedf219672eef83ea6be6f3bb093bba396a8560fc75be85ba225f082903df0a
# via
# -c src/backend/requirements.txt
# -r src/backend/requirements.in

View File

@ -247,9 +247,9 @@ charset-normalizer==3.4.7 \
# -c src/backend/requirements.txt
# pdfminer-six
# requests
click==8.3.1 \
--hash=sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a \
--hash=sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6
click==8.3.2 \
--hash=sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5 \
--hash=sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d
# via pip-tools
coverage[toml]==7.13.5 \
--hash=sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256 \
@ -515,9 +515,9 @@ pip-tools==7.5.3 \
--hash=sha256:3aac0c473240ae90db7213c033401f345b05197293ccbdd2704e52e7a783785e \
--hash=sha256:8fa364779ebc010cbfe17cb9de404457ac733e100840423f28f6955de7742d41
# via -r src/backend/requirements-dev.in
platformdirs==4.9.4 \
--hash=sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934 \
--hash=sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868
platformdirs==4.9.6 \
--hash=sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a \
--hash=sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917
# via
# -c src/backend/requirements-3.14.txt
# -c src/backend/requirements.txt
@ -550,9 +550,9 @@ pyproject-hooks==1.2.0 \
# via
# build
# pip-tools
pytest==9.0.2 \
--hash=sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b \
--hash=sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11
pytest==9.0.3 \
--hash=sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9 \
--hash=sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c
# via
# pytest-codspeed
# pytest-django
@ -578,9 +578,9 @@ pytest-django==4.12.0 \
--hash=sha256:3ff300c49f8350ba2953b90297d23bf5f589db69545f56f1ec5f8cff5da83e85 \
--hash=sha256:df94ec819a83c8979c8f6de13d9cdfbe76e8c21d39473cfe2b40c9fc9be3c758
# via -r src/backend/requirements-dev.in
python-discovery==1.2.1 \
--hash=sha256:180c4d114bff1c32462537eac5d6a332b768242b76b69c0259c7d14b1b680c9e \
--hash=sha256:b6a957b24c1cd79252484d3566d1b49527581d46e789aaf43181005e56201502
python-discovery==1.2.2 \
--hash=sha256:876e9c57139eb757cb5878cbdd9ae5379e5d96266c99ef731119e04fffe533bb \
--hash=sha256:e1ae95d9af875e78f15e19aed0c6137ab1bb49c200f21f5061786490c9585c7a
# via virtualenv
pyyaml==6.0.3 \
--hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \
@ -711,13 +711,13 @@ ty==0.0.1a21 \
--hash=sha256:e941e9a9d1e54b03eeaf9c3197c26a19cf76009fd5e41e16e5657c1c827bd6d3 \
--hash=sha256:ecf41706b803827b0de8717f32a434dad1e67be9f4b8caf403e12013179ea06a
# via -r src/backend/requirements-dev.in
types-psycopg2==2.9.21.20260223 \
--hash=sha256:78ed70de2e56bc6b5c26c8c1da8e9af54e49fdc3c94d1504609f3519e2b84f02 \
--hash=sha256:c6228ade72d813b0624f4c03feeb89471950ac27cd0506b5debed6f053086bc8
types-psycopg2==2.9.21.20260408 \
--hash=sha256:49b086bfc9e0ce901c6537403ead1c19c75275571040b037af0248a8e48c322f \
--hash=sha256:bb65cd12f53b6633077fd782607a33065e1f3bf585219c9f786b61ad2b72211c
# via django-types
types-pyyaml==6.0.12.20250915 \
--hash=sha256:0f8b54a528c303f0e6f7165687dd33fafa81c807fcac23f632b63aa624ced1d3 \
--hash=sha256:e7d4d9e064e89a3b3cae120b4990cd370874d2bf12fa5f46c97018dd5d3c9ab6
types-pyyaml==6.0.12.20260408 \
--hash=sha256:92a73f2b8d7f39ef392a38131f76b970f8c66e4c42b3125ae872b7c93b556307 \
--hash=sha256:fbc42037d12159d9c801ebfcc79ebd28335a7c13b08a4cfbc6916df78fee9384
# via django-stubs
typing-extensions==4.15.0 \
--hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
@ -735,9 +735,9 @@ urllib3==2.6.3 \
# -c src/backend/requirements-3.14.txt
# -c src/backend/requirements.txt
# requests
virtualenv==21.2.0 \
--hash=sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098 \
--hash=sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f
virtualenv==21.2.1 \
--hash=sha256:b66ffe81301766c0d5e2208fc3576652c59d44e7b731fc5f5ed701c9b537fa78 \
--hash=sha256:bd16b49c53562b28cf1a3ad2f36edb805ad71301dee70ddc449e5c88a9f919a2
# via pre-commit
wheel==0.46.3 \
--hash=sha256:4b399d56c9d9338230118d705d9737a2a468ccca63d5e813e2a4fc7815d8bc4d \

View File

@ -243,9 +243,9 @@ charset-normalizer==3.4.7 \
# -c src/backend/requirements.txt
# pdfminer-six
# requests
click==8.3.1 \
--hash=sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a \
--hash=sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6
click==8.3.2 \
--hash=sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5 \
--hash=sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d
# via pip-tools
coverage[toml]==7.13.5 \
--hash=sha256:012d5319e66e9d5a218834642d6c35d265515a62f01157a45bcc036ecf947256 \
@ -431,13 +431,13 @@ django-silk==5.5.0 \
django-slowtests==1.1.1 \
--hash=sha256:3c6936d420c9df444ac03625b41d97de043c662bbde61fbcd33e4cd407d0c247
# via -r src/backend/requirements-dev.in
django-stubs==6.0.1 \
--hash=sha256:d885044bd0876610f3eb969d6b5ed22f386002a879fdcb369cd8efa0502dbbce \
--hash=sha256:e1ca63634221b57a55e16562b9b6d1849aeee2cabfd0fc026084dbe8aa893366
django-stubs==6.0.2 \
--hash=sha256:56d43b5e3741563af0063e5b6283f908c625b0439aa06314268673699d1bdccd \
--hash=sha256:c3bc84d80421758f3b2ad9e1358e001d719388a8eb106e67c873e606216108d4
# via -r src/backend/requirements-dev.in
django-stubs-ext==6.0.1 \
--hash=sha256:17415759b9a3f4b4da7998ac3b08c7dc5137f9a019490b918aece1a8a4c2ade4 \
--hash=sha256:633b280f89c0cbb7e3ce2f2f842e0acc43d8091378e75f84921d6be675d052dc
django-stubs-ext==6.0.2 \
--hash=sha256:70b7b7ae837e7a6036e2facb64435550bf7cf8143c1a6e802864d4824ce6058c \
--hash=sha256:b35bdec1995bf49765cc39fa89aa7c23f120a23d0cb0152ab7fb4e48ff7d667b
# via django-stubs
django-test-migrations==1.5.0 \
--hash=sha256:1cbff04b1e82c5564a6f635284907b381cc11a2ff883adff46776d9126824f07 \
@ -507,9 +507,9 @@ pip-tools==7.5.3 \
--hash=sha256:3aac0c473240ae90db7213c033401f345b05197293ccbdd2704e52e7a783785e \
--hash=sha256:8fa364779ebc010cbfe17cb9de404457ac733e100840423f28f6955de7742d41
# via -r src/backend/requirements-dev.in
platformdirs==4.9.4 \
--hash=sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934 \
--hash=sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868
platformdirs==4.9.6 \
--hash=sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a \
--hash=sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917
# via
# -c src/backend/requirements.txt
# python-discovery
@ -540,9 +540,9 @@ pyproject-hooks==1.2.0 \
# via
# build
# pip-tools
pytest==9.0.2 \
--hash=sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b \
--hash=sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11
pytest==9.0.3 \
--hash=sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9 \
--hash=sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c
# via
# pytest-codspeed
# pytest-django
@ -568,9 +568,9 @@ pytest-django==4.12.0 \
--hash=sha256:3ff300c49f8350ba2953b90297d23bf5f589db69545f56f1ec5f8cff5da83e85 \
--hash=sha256:df94ec819a83c8979c8f6de13d9cdfbe76e8c21d39473cfe2b40c9fc9be3c758
# via -r src/backend/requirements-dev.in
python-discovery==1.2.1 \
--hash=sha256:180c4d114bff1c32462537eac5d6a332b768242b76b69c0259c7d14b1b680c9e \
--hash=sha256:b6a957b24c1cd79252484d3566d1b49527581d46e789aaf43181005e56201502
python-discovery==1.2.2 \
--hash=sha256:876e9c57139eb757cb5878cbdd9ae5379e5d96266c99ef731119e04fffe533bb \
--hash=sha256:e1ae95d9af875e78f15e19aed0c6137ab1bb49c200f21f5061786490c9585c7a
# via virtualenv
pyyaml==6.0.3 \
--hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \
@ -746,13 +746,13 @@ ty==0.0.1a21 \
--hash=sha256:e941e9a9d1e54b03eeaf9c3197c26a19cf76009fd5e41e16e5657c1c827bd6d3 \
--hash=sha256:ecf41706b803827b0de8717f32a434dad1e67be9f4b8caf403e12013179ea06a
# via -r src/backend/requirements-dev.in
types-psycopg2==2.9.21.20260223 \
--hash=sha256:78ed70de2e56bc6b5c26c8c1da8e9af54e49fdc3c94d1504609f3519e2b84f02 \
--hash=sha256:c6228ade72d813b0624f4c03feeb89471950ac27cd0506b5debed6f053086bc8
types-psycopg2==2.9.21.20260408 \
--hash=sha256:49b086bfc9e0ce901c6537403ead1c19c75275571040b037af0248a8e48c322f \
--hash=sha256:bb65cd12f53b6633077fd782607a33065e1f3bf585219c9f786b61ad2b72211c
# via django-types
types-pyyaml==6.0.12.20250915 \
--hash=sha256:0f8b54a528c303f0e6f7165687dd33fafa81c807fcac23f632b63aa624ced1d3 \
--hash=sha256:e7d4d9e064e89a3b3cae120b4990cd370874d2bf12fa5f46c97018dd5d3c9ab6
types-pyyaml==6.0.12.20260408 \
--hash=sha256:92a73f2b8d7f39ef392a38131f76b970f8c66e4c42b3125ae872b7c93b556307 \
--hash=sha256:fbc42037d12159d9c801ebfcc79ebd28335a7c13b08a4cfbc6916df78fee9384
# via django-stubs
typing-extensions==4.15.0 \
--hash=sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466 \
@ -768,9 +768,9 @@ urllib3==2.6.3 \
# via
# -c src/backend/requirements.txt
# requests
virtualenv==21.2.0 \
--hash=sha256:1720dc3a62ef5b443092e3f499228599045d7fea4c79199770499df8becf9098 \
--hash=sha256:1bd755b504931164a5a496d217c014d098426cddc79363ad66ac78125f9d908f
virtualenv==21.2.1 \
--hash=sha256:b66ffe81301766c0d5e2208fc3576652c59d44e7b731fc5f5ed701c9b537fa78 \
--hash=sha256:bd16b49c53562b28cf1a3ad2f36edb805ad71301dee70ddc449e5c88a9f919a2
# via pre-commit
wheel==0.46.3 \
--hash=sha256:4b399d56c9d9338230118d705d9737a2a468ccca63d5e813e2a4fc7815d8bc4d \

View File

@ -95,15 +95,15 @@ blessed==1.38.0 \
--hash=sha256:89ce6ec6567f7aced0716b73577b7a1702eb23c667838bb46d7d9bd48c36d1b3 \
--hash=sha256:905884ae650e41284fa4fd7d0c3eed5e5b4a42be8c2bfb24c90d79fbf26a1490
# via -r src/backend/requirements.in
boto3==1.42.82 \
--hash=sha256:6df9ca0f5047c6afe6bd42244d8e059cde69e2cdb719ebd68d52c7d7beb529b2 \
--hash=sha256:804341c8197c556e8e7ceb82388ee120f319a4efbb9dc368f6059760a11cfc7d
boto3==1.42.87 \
--hash=sha256:15cc1404b3ccbcfe17bd5834d467b1b28d53d9aca44e3798dc44876ac57362e6 \
--hash=sha256:b5b86a826f8f12c7d38679f35bd0135807a6867a21eb8be6dea7c27aeb14ec14
# via
# django-anymail
# django-storages
botocore==1.42.82 \
--hash=sha256:824dbb58c99d894f193ed1dd75cf59650e25c1b5adb9d3a66b39fdede46f259b \
--hash=sha256:a2bfe8537e95462ec06a46cc29c327f84746722bb4ce106491bfd3af8075ceed
botocore==1.42.87 \
--hash=sha256:1c6cc9555c1feec50b290a42de70ba6f04826c009562c2c12bb9990d0258482d \
--hash=sha256:32832df27c039cc1a518289afe0f6006296d3df26603b5f66e911457e67f0146
# via
# boto3
# s3transfer
@ -550,9 +550,9 @@ django-cors-headers==4.9.0 \
--hash=sha256:15c7f20727f90044dcee2216a9fd7303741a864865f0c3657e28b7056f61b449 \
--hash=sha256:fe5d7cb59fdc2c8c646ce84b727ac2bca8912a247e6e68e1fb507372178e59e8
# via -r src/backend/requirements.in
django-dbbackup==5.2.0 \
--hash=sha256:540948869e44778b5b33333cbab0cfe44279defd47df635d309ede8666894370 \
--hash=sha256:72b11dd31758abcf8f2d405fd2efbc49c9624bc17196f8c68542d3dc8d8d53c3
django-dbbackup==5.3.0 \
--hash=sha256:2c880dba7650539e8a724174fedb5213062c4fcda3aa09e1c5f3f573192106cb \
--hash=sha256:ff80b5facd524e3f6479235aeb330b094a1c982f8b0b9503c24ba0dc613162ed
# via -r src/backend/requirements.in
django-error-report-2==0.4.2 \
--hash=sha256:1dd99c497af09b7ea99f5fbaf910501838150a9d5390796ea00e187bc62f6c1b \
@ -876,9 +876,9 @@ inflection==0.5.1 \
--hash=sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417 \
--hash=sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2
# via drf-spectacular
invoke==2.2.1 \
--hash=sha256:2413bc441b376e5cd3f55bb5d364f973ad8bdd7bf87e53c79de3c11bf3feecc8 \
--hash=sha256:515bf49b4a48932b79b024590348da22f39c4942dff991ad1fb8b8baea1be707
invoke==3.0.3 \
--hash=sha256:437b6a622223824380bfb4e64f612711a6b648c795f565efc8625af66fb57f0c \
--hash=sha256:f11327165e5cbb89b2ad1d88d3292b5113332c43b8553b494da435d6ec6f5053
# via paramiko
isodate==0.7.2 \
--hash=sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15 \
@ -906,147 +906,141 @@ jwcrypto==1.5.7 \
--hash=sha256:70204d7cca406eda8c82352e3c41ba2d946610dafd19e54403f0a1f4f18633c6 \
--hash=sha256:729463fefe28b6de5cf1ebfda3e94f1a1b41d2799148ef98a01cb9678ebe2bb0
# via django-oauth-toolkit
lxml==6.0.2 \
--hash=sha256:058027e261afed589eddcfe530fcc6f3402d7fd7e89bfd0532df82ebc1563dba \
--hash=sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8 \
--hash=sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0 \
--hash=sha256:08b9d5e803c2e4725ae9e8559ee880e5328ed61aa0935244e0515d7d9dbec0aa \
--hash=sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f \
--hash=sha256:0aa7070978f893954008ab73bb9e3c24a7c56c054e00566a21b553dc18105fca \
--hash=sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf \
--hash=sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607 \
--hash=sha256:17f68764f35fd78d7c4cc4ef209a184c38b65440378013d24b8aecd327c3e0c8 \
--hash=sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452 \
--hash=sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700 \
--hash=sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d \
--hash=sha256:1e786a464c191ca43b133906c6903a7e4d56bef376b75d97ccbb8ec5cf1f0a4b \
--hash=sha256:1ea99340b3c729beea786f78c38f60f4795622f36e305d9c9be402201efdc3b7 \
--hash=sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d \
--hash=sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6 \
--hash=sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a \
--hash=sha256:24a8e756c982c001ca8d59e87c80c4d9dcd4d9b44a4cbeb8d9be4482c514d41d \
--hash=sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca \
--hash=sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb \
--hash=sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed \
--hash=sha256:2613e67de13d619fd283d58bda40bff0ee07739f624ffee8b13b631abf33083d \
--hash=sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e \
--hash=sha256:2c8458c2cdd29589a8367c09c8f030f1d202be673f0ca224ec18590b3b9fb694 \
--hash=sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd \
--hash=sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659 \
--hash=sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c \
--hash=sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314 \
--hash=sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5 \
--hash=sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849 \
--hash=sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938 \
--hash=sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a \
--hash=sha256:3efe1b21c7801ffa29a1112fab3b0f643628c30472d507f39544fd48e9549e34 \
--hash=sha256:3fee0851639d06276e6b387f1c190eb9d7f06f7f53514e966b26bae46481ec90 \
--hash=sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6 \
--hash=sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba \
--hash=sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285 \
--hash=sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553 \
--hash=sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d \
--hash=sha256:452b899faa64f1805943ec1c0c9ebeaece01a1af83e130b69cdefeda180bb42c \
--hash=sha256:45f93e6f75123f88d7f0cfd90f2d05f441b808562bf0bc01070a00f53f5028b5 \
--hash=sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601 \
--hash=sha256:4ddb1049fa0579d0cbd00503ad8c58b9ab34d1254c77bc6a5576d96ec7853dba \
--hash=sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37 \
--hash=sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f \
--hash=sha256:5921d924aa5468c939d95c9814fa9f9b5935a6ff4e679e26aaf2951f74043512 \
--hash=sha256:59c45e125140b2c4b33920d21d83681940ca29f0b83f8629ea1a2196dc8cfe6a \
--hash=sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438 \
--hash=sha256:5d444858b9f07cefff6455b983aea9a67f7462ba1f6cbe4a21e8bf6791bf2153 \
--hash=sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9 \
--hash=sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d \
--hash=sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6 \
--hash=sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f \
--hash=sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534 \
--hash=sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46 \
--hash=sha256:66328dabea70b5ba7e53d94aa774b733cf66686535f3bc9250a7aab53a91caaf \
--hash=sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f \
--hash=sha256:6cdaefac66e8b8f30e37a9b4768a391e1f8a16a7526d5bc77a7928408ef68e93 \
--hash=sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8 \
--hash=sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f \
--hash=sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1 \
--hash=sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322 \
--hash=sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f \
--hash=sha256:71695772df6acea9f3c0e59e44ba8ac50c4f125217e84aab21074a1a55e7e5c9 \
--hash=sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f \
--hash=sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7 \
--hash=sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f \
--hash=sha256:817ef43a0c0b4a77bd166dc9a09a555394105ff3374777ad41f453526e37f9cb \
--hash=sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916 \
--hash=sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec \
--hash=sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9 \
--hash=sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d \
--hash=sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679 \
--hash=sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0 \
--hash=sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192 \
--hash=sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917 \
--hash=sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c \
--hash=sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d \
--hash=sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338 \
--hash=sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d \
--hash=sha256:995e783eb0374c120f528f807443ad5a83a656a8624c467ea73781fc5f8a8304 \
--hash=sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77 \
--hash=sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba \
--hash=sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456 \
--hash=sha256:a656ca105115f6b766bba324f23a67914d9c728dafec57638e2b92a9dcd76c62 \
--hash=sha256:a6b5b39cc7e2998f968f05309e666103b53e2edd01df8dc51b90d734c0825444 \
--hash=sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a \
--hash=sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f \
--hash=sha256:a8ffaeec5dfea5881d4c9d8913a32d10cfe3923495386106e4a24d45300ef79c \
--hash=sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d \
--hash=sha256:ac02dc29fd397608f8eb15ac1610ae2f2f0154b03f631e6d724d9e2ad4ee2c84 \
--hash=sha256:af85529ae8d2a453feee4c780d9406a5e3b17cee0dd75c18bd31adcd584debc3 \
--hash=sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe \
--hash=sha256:b2142a376b40b6736dfc214fd2902409e9e3857eff554fed2d3c60f097e62a62 \
--hash=sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8 \
--hash=sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178 \
--hash=sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0 \
--hash=sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7 \
--hash=sha256:b42f4d86b451c2f9d06ffb4f8bbc776e04df3ba070b9fe2657804b1b40277c48 \
--hash=sha256:b738f7e648735714bbb82bdfd030203360cfeab7f6e8a34772b3c8c8b820568c \
--hash=sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9 \
--hash=sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7 \
--hash=sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048 \
--hash=sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c \
--hash=sha256:bc456d04db0515ce3320d714a1eac7a97774ff0849e7718b492d957da4631dd4 \
--hash=sha256:bc532422ff26b304cfb62b328826bd995c96154ffd2bac4544f37dbb95ecaa8f \
--hash=sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b \
--hash=sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0 \
--hash=sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564 \
--hash=sha256:c54d83a2188a10ebdba573f16bd97135d06c9ef60c3dc495315c7a28c80a263f \
--hash=sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee \
--hash=sha256:cb233f9c95f83707dae461b12b720c1af9c28c2d19208e1be03387222151daf5 \
--hash=sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62 \
--hash=sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272 \
--hash=sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9 \
--hash=sha256:d4aec24d6b72ee457ec665344a29acb2d35937d5192faebe429ea02633151aad \
--hash=sha256:d6690ec5ec1cce0385cb20896b16be35247ac8c2046e493d03232f1c2414d321 \
--hash=sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a \
--hash=sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312 \
--hash=sha256:dacf3c64ef3f7440e3167aa4b49aa9e0fb99e0aa4f9ff03795640bf94531bcb0 \
--hash=sha256:daf42de090d59db025af61ce6bdb2521f0f102ea0e6ea310f13c17610a97da4c \
--hash=sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37 \
--hash=sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964 \
--hash=sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484 \
--hash=sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e \
--hash=sha256:e237b807d68a61fc3b1e845407e27e5eb8ef69bc93fe8505337c1acb4ee300b6 \
--hash=sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078 \
--hash=sha256:e748d4cf8fef2526bb2a589a417eba0c8674e29ffcb570ce2ceca44f1e567bf6 \
--hash=sha256:e77dd455b9a16bbd2a5036a63ddbd479c19572af81b624e79ef422f929eef388 \
--hash=sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924 \
--hash=sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2 \
--hash=sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df \
--hash=sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd \
--hash=sha256:f2a50c3c1d11cad0ebebbac357a97b26aa79d2bcaf46f256551152aa85d3a4d1 \
--hash=sha256:f2e3b1a6bb38de0bc713edd4d612969dd250ca8b724be8d460001a387507021c \
--hash=sha256:f952dacaa552f3bb8834908dddd500ba7d508e6ea6eb8c52eb2d28f48ca06a31 \
--hash=sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed \
--hash=sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2 \
--hash=sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092 \
--hash=sha256:fe659f6b5d10fb5a17f00a50eb903eb277a71ee35df4615db573c069bcf967ac
lxml==6.0.3 \
--hash=sha256:04b7cedf52e125f86d0d426635e7fbe8e353d4cc272a1757888e3c072424381d \
--hash=sha256:06b9f3ac459b4565bbaa97aa5512aa7f9a1188c662f0108364f288f6daf35773 \
--hash=sha256:093786037b934ef4747b0e8a0e1599fe7df7dd8246e7f07d43bba1c4c8bd7b84 \
--hash=sha256:0a9a79144a8051bc5fbb223fac895b87eb67b361f27b00c2ed4a07ee34246b90 \
--hash=sha256:0b012cf200736d90f828b3ab4206857772c61b710f0a98d3814c7994decb6652 \
--hash=sha256:0c46a246df7fbab1f7b018c7eb361585b295ac95dec806158d9ed1e63b477f05 \
--hash=sha256:10bc4f37c28b4e1b3e901dde66e3a096eb128acf388d5b2962dc2941284293bb \
--hash=sha256:13f1594a183cee73f9a1dbfd35871c4e04b461f47eeb9bcf80f7d7856b1b136d \
--hash=sha256:143ac903fb6c9be6da613390825c8e8bb8c8d71517d43882031f6b9bc89770ef \
--hash=sha256:16e5cbaa1a6351f2abefa4072e9aac1f09103b47fe7ab4496d54e5995b065162 \
--hash=sha256:16fbcf06ae534b2fa5bcdc19fcf6abd9df2e74fe8563147d1c5a687a130efed4 \
--hash=sha256:19b079e81aa3a31b523a224b0dd46da4f56e1b1e248eef9a599e5c885c788813 \
--hash=sha256:1b36a3c73f2a6d9c2bfae78089ca7aedae5c2ee5fd5214a15f00b2f89e558ba7 \
--hash=sha256:1b60a3a1205f869bd47874787c792087174453b1a869db4837bf5b3ff92be017 \
--hash=sha256:20f8caa9beb61a688c4428631cb47fd6e0ba75ef30091cec5fee992138b2be77 \
--hash=sha256:239e9a6be3a79c03ec200d26f7bb17a4414704a208059e20050bf161e2d8848a \
--hash=sha256:26cdd7c3f4c3b932b28859d0b70966c2ec8b67c106717d6320121002f8f99025 \
--hash=sha256:2773dbe2cedee81f2769bd5d24ceb4037706cf032e1703513dd0e9476cd9375f \
--hash=sha256:27e317e554bc6086a082688ddf137437e5f7f20ffdd736a6f5b4e3ed1ecf1247 \
--hash=sha256:2a49123cc3209ccad7c4c5a4133bcfcfd4875f30461ea4d0aaa84e6608f712c5 \
--hash=sha256:2ce76d113a7c3bf42761ec1de7ca615b0cbf9d8ae478eb1d6c20111d9c9fc098 \
--hash=sha256:2d00902610dd91a970a06d5f1a6e4f2426e04a9fa07209d58e09b345e2269267 \
--hash=sha256:30c437d8bb9a9a9edff27e85b694342e47a26a6abc249abe00584a4824f9d80d \
--hash=sha256:322c825054d02d35755b80dc5c39ba8a71c7c09c43453394a13b9bd8c0abc84c \
--hash=sha256:336925309af5ecd9616acbe1c28d68ee0088839b1d42ae7dcc40ffecff959537 \
--hash=sha256:33741ec3b4268efffae8ba40f9b64523f4489caf270bde175535e659f03af05a \
--hash=sha256:353161f166e76f0d8228f8f5216d110601d143a8b6d0fd869230e12c098a5842 \
--hash=sha256:38652c280cf50cc5cf955e3d0b691fa6a97046d84407bbae340d8e353f9014ef \
--hash=sha256:38acf7171535ffa7fff1fcec8b82ebd4e55cd02e581efe776928108421accaa1 \
--hash=sha256:3a0484bd1e84f82766befcbd71cccd7307dacfe08071e4dbc1d9a9b498d321e8 \
--hash=sha256:448e69211e59c39f398990753d15ba49f7218ec128f64ac8012ef16762e509a3 \
--hash=sha256:46c80f7fd5dd7d8c269f6486b165c8f91c489e323f3a767221fb5b4b2b388d5f \
--hash=sha256:4723da3e8f4281853c2eaab161b69cc14bc9b0811be4cfa5a1de36df47e0c660 \
--hash=sha256:4b0f01fb8bdcaf4aa69cf55b2b2f8ef722e4423e1c020e7250dcb89a1d5db38e \
--hash=sha256:4ff774b43712b0cf40d9888a5494ca39aefe990c946511cc947b9fddcf74a29b \
--hash=sha256:50293e024afe5e2c25da2be68c8ceca8618912a0701a73f75b488317c8081aa6 \
--hash=sha256:51014ee2ab2091dcd9cdef92532f0a1addb7c2cc52a2bd70682e441363de5c0d \
--hash=sha256:5892d2ef99449ebd8e30544af5bc61fd9c30e9e989093a10589766422f6c5e1a \
--hash=sha256:59ff244cee0270fc4cf5f2ee920d4493ee88d0bcbc6e8465e9ef01439f1785e7 \
--hash=sha256:5b6913a68d98c58c673667c864500ba31bc9b0f462effac98914e9a92ebacd2e \
--hash=sha256:5c35e5c3ed300990a46a144d3514465713f812b35dacfa83e928c60db7c90af7 \
--hash=sha256:5c45bdcdc2ca6cf26fddff3faa5de7a2ed7c7f6016b3de80125313a37f972378 \
--hash=sha256:5d559a84b2fd583e5bcf8ec4af1ec895f98811684d5fbd6524ea31a04f92d4ad \
--hash=sha256:609bf136a7339aeca2bd4268c7cd190f33d13118975fe9964eda8e5138f42802 \
--hash=sha256:61399a5b01d74ec5f009762c74ab6ebf387e58393fc5d78368e12d4f577fea29 \
--hash=sha256:6289cb9145fbbc5b0e159c9fcd7fc09446dadc6b60b72c4d1012e80c7c727970 \
--hash=sha256:631567ffc3ddb989ccdcd28f6b9fa5aab1ec7fc0e99fe65572b006a6aad347e2 \
--hash=sha256:6364aa77b13e04459df6a9d2b806465287e7540955527e75ebd5fda48532913d \
--hash=sha256:6556b3197bd8a237a16fcd7278d09f094c5777ae36a1435b5e8e488826386d96 \
--hash=sha256:6c055bafdcb53e7f9f75e22c009cd183dd410475e21c296d599531d7f03d1bf5 \
--hash=sha256:724b26a38cef98d6869d00a33cb66083bee967598e44f6a8e53f1dd283c851b0 \
--hash=sha256:72d108ef9e39f45c6865ea8a5ba6736c0b1a33ddd6343653775349869e58c30b \
--hash=sha256:7373ede7ccb89e6f6e39c1423b3a4d4ee48035d3b4619a6addced5c8b48d0ecc \
--hash=sha256:738aef404c862d2c3cd951364ee7175c9d50e8290f5726611c4208c0fba8d186 \
--hash=sha256:773c22d3de2dd5454b0f89b36d366fa0052f0e924656506c40462d8107acd00f \
--hash=sha256:775266571f7027b1d77f5fce18a247b24f51a4404bdc1b90ec56be9b1e3801b9 \
--hash=sha256:794b42f0112adfa3f23670aba5bc0ac9c9adfcee699c0df129b0186c812ac3ff \
--hash=sha256:7966fbce2d18fde579d5593933d36ad98cc7c8dc7f2b1916d127057ce0415062 \
--hash=sha256:7f753db5785ce019d7b25bb75638ef5a42a0e208aa9f19933262134e668ca6af \
--hash=sha256:809726d4c72f1a902556df822c3acc5780053a12a05e16eac999392b30984c06 \
--hash=sha256:821fd53699eb498990c915ba955a392d07246454c9405e6c1d0692362503013d \
--hash=sha256:8243937d4673b46da90b4f5ea2627fd26842225e62e885828fdb8133aa1f7b32 \
--hash=sha256:8341c446fca7f6be003c60aededf2f23a53d4881cf7e0bafb9cef69c217ae26a \
--hash=sha256:83c1d75e9d124ab82a4ddaf59135112f0dc49526b47355e5928ae6126a68e236 \
--hash=sha256:83eca62141314d641ebe8089ffa532bbf572ea07dd6255b58c40130d06bb2509 \
--hash=sha256:841b89fc3d910d61c7c267db6bb7dc3a8b3dac240edb66220fcdf96fe70a0552 \
--hash=sha256:87bebd6836e88c0a007f66b89814daf5d7041430eb491c91d1851abc89aa6e93 \
--hash=sha256:88c524cf8c3b8d71dfc3de6cfb225138a876862a92d88bfa22eb9ff020729d45 \
--hash=sha256:8922a30704a4421d69a19e0499db5861da686c0bccc3a79cf3946e3155cf25f9 \
--hash=sha256:89f8746c206d8cf2c167221831645d6cc2b24464afd9c428a5eb3fd34c584eb1 \
--hash=sha256:8b81ec1ecac3be8c1ff1e00ca1c1baf8122e87db9000cd2549963847bd5e3b41 \
--hash=sha256:8c082ad2398664213a4bb5d133e2eb8bf239220b7d6688f8c8ffa9050057501f \
--hash=sha256:8c08926678852a233bf1ef645c4d683d56107f814482f8f41b21ef2c7659790e \
--hash=sha256:8d10a75e4d0a6a9ac2fec2f7ade682f468b51935102c70dab638fa4e94ffcb04 \
--hash=sha256:8eeec925ad7f81886d413b3a1f8715551f75543519229a9b35e957771e1826d5 \
--hash=sha256:911dbd0e87729016402e03533117ffe94147bfbcd7902b76af5854c4b437e096 \
--hash=sha256:955550c78afb2be47755bd1b8153724292a5b539cf3f21665b310c145d08e6f8 \
--hash=sha256:976b56bd0f4ca72280b4569eb227d012a541860f0d6fcc128ce26d22ef82c845 \
--hash=sha256:99457524afd384c330dc51e527976653d543ccadfa815d9f2d92c5911626e536 \
--hash=sha256:9a1adb0e220cb8691202ba9d97646a06292657a122df4b92733861d42f7cf4d2 \
--hash=sha256:9b8e0779780026979f217603385995202f364adc9807bd21210d81b9f562fc4e \
--hash=sha256:9d98063e6ae0da5084ec46952bb0a5ccb5e2cad168e32b4d65d1ec84e4b4ebd4 \
--hash=sha256:a10f9967859229cae38b1aa7a96eb655c96b8adc96989b52c5b1f77d963a77a4 \
--hash=sha256:a1664c5139755df44cab3834f4400b331b02205d62d3fdcb1554f63439bf3372 \
--hash=sha256:a1f258e6aa0e6eda2c1199f5582c062c96c7d4a28d96d0c4daa79e39b3f2a764 \
--hash=sha256:a4dc9f81707b9b56888fa7d3a889ac5219724cf0fbecab90ea5b197faf649534 \
--hash=sha256:a6380c5035598e4665272ad3fc86c96ddb2a220d4059cce5ba4b660f78346ad9 \
--hash=sha256:aa18653b795d2c273b8676f7ad2ca916d846d15864e335f746658e4c28eb5168 \
--hash=sha256:abc39c4fb67f029400608f9a3a4a3f351ccb3c061b05fd3ad113e4cfbba8a8ee \
--hash=sha256:ac2d6cdafa29672d6a604c641bf67ace3fd0735ec6885501a94943379219ddbf \
--hash=sha256:ac63a1ef1899ccadace10ac937c41321672771378374c254e931d001448ae372 \
--hash=sha256:ac65c08ba1bd90f662cb1d5c79f7ae4c53b1c100f0bb6ec5df1f40ac29028a7e \
--hash=sha256:ad6952810349cbfb843fe15e8afc580b2712359ae42b1d2b05d097bd48c4aea4 \
--hash=sha256:b044fe3bdb8b68efa33cb5917ae9379f07ec2e416ecd18cf5d333650d6d2fcbb \
--hash=sha256:b29300eeaadf85df7f2df4bb29cadfb13b9600d1bb8053f35d82d96f9e6d088a \
--hash=sha256:b683665d0287308adafc90a5617a51a508d8af8c7040693693bb333b5f4474fe \
--hash=sha256:b68c29aac4788438b07d768057836de47589c7deaa3ad8dc4af488dfc27be388 \
--hash=sha256:bd4f70e091f2df300396bc9ce36963f90b87611324c2ca750072a6e6375beba2 \
--hash=sha256:bf98f5f87f6484302e7cce4e2ca5af43562902852063d916c3e2f1c115fdce60 \
--hash=sha256:c137f8c8419c3de93e2998131d94628805f148e52b34da6d7533454e4d78bc2a \
--hash=sha256:c157bfef4e3b19688eb4da783c5bfabf5a3ac1ac8d317e0906f3feb18d4c89b7 \
--hash=sha256:c3de55b53f69ffa2fcfd897bd8a7e62f0f88a40a8a0c544e171e813f9d4ddbf5 \
--hash=sha256:c4fff7d77f440378cd841e340398edf5dbefee334816efbf521bb6e31651e54e \
--hash=sha256:c71a387ea133481e725079cff22de45593bf0b834824de22829365ab1d2386c9 \
--hash=sha256:c8184fdb2259bda1db2db9d6e25f667769afc2531830b4fa29f83f66a7872dea \
--hash=sha256:c8e3b8a54e65393ce1d5c7d9753fe756f0d96089e7163b20ddec3e5bb56a963e \
--hash=sha256:cbc7ce67f85b92db97c92219985432be84dc1ba9a028e68c6933e89551234df2 \
--hash=sha256:cbffd22fc8e4d80454efa968b0c93440a00b8b8a817ce0c29d2c6cb5ad324362 \
--hash=sha256:ce01ab3449015358f766a1950b3d818eedf9d4cdec3fa87e4eecaad10c0784db \
--hash=sha256:d1f14c1006722824c3f2158d147e520a82460b47ffdc2a84e444b3d244b65e4d \
--hash=sha256:d20af2784c763928d0d0879cbc5a3739e4d81eefa0d68962d3478bff4c13e644 \
--hash=sha256:d38c25bad123d6ce30bb37931d90a4e8a167cd796eeae9cd16c2bfce52718f8e \
--hash=sha256:d3d65e511e4e656ec67b472110f7a72cbf8547ca15f76fe74cffa4e97412a064 \
--hash=sha256:d573b81c29e20b1513afa386a544797a99cecde5497e6c77b6dfa4484112c819 \
--hash=sha256:d8781d812bb8efd47c35651639da38980383ff0d0c1f3269ade23e3a90799079 \
--hash=sha256:d8a8129bd502de138cdde22eac3990bde8a4efbafc72596baab67a495c48c974 \
--hash=sha256:d9e779a9c3167d2f158c41b6347fbc9e855f6d5561920a33123beb86463c3f46 \
--hash=sha256:dfc80c74233fe01157ab550fb12b9d07a2f1fa7c5900cefb484e3bf02e856fbc \
--hash=sha256:e0c88ca5fb307f7e817fc427681126e4712d3452258577bcb4ca86594c934852 \
--hash=sha256:e759ff1b244725fef428c6b54f3dab4954c293b2d242a5f2e79db5cc3873de51 \
--hash=sha256:e8ad05bb1fb4aa20ee201ab2f21c3c7571828e4fad525707437bb1c5f5ab6669 \
--hash=sha256:ecdded59dc50c0c28f652a98f69a7ada8bd2377248bf48c4a83c81204eb58b33 \
--hash=sha256:ed31e5852cd938704bc6c7a3822cbf84c7fa00ebfa914a1b4e2392d44f45bdfb \
--hash=sha256:edccf1157677db1da741d042601754b94af3926310c5763179200718ca738e70 \
--hash=sha256:f179bae37ad673f57756b59f26833b7922230bef471fdb29492428f152bae8c6 \
--hash=sha256:f27373113fda6621e4201f529908a24c8a190c2af355aed4711dadca44db4673 \
--hash=sha256:f297e9be3bbe59c31cfe5d0f38534510ed95856c480df3e8721b16d46ccaeeac \
--hash=sha256:f8f004d5c601eb50ac29a110632595a4f4c50db81c715d46a43de64ef88246cb \
--hash=sha256:f96bba9a26a064ce9e11099bad12fb08384b64d3acc0acf94bf386ca5cf4f95f \
--hash=sha256:fab00cef83d4f9d76c5e0722346e84bc174b071d68b4f725aeb0bf3877b9e6a6 \
--hash=sha256:fc6eeeddcee4d985707b3fc29fd6993e256e55798ca600586da68d3f0e04ec5a \
--hash=sha256:fdb7786ebefaa0dad0d399dfeaf146b370a14591af2f3aea59e06f931a426678 \
--hash=sha256:fddcf558bcb7a40993fb9e3ae3752d5d3a656479c71687799e43063563a2e68a \
--hash=sha256:feb5b9ed7d0510663a78b94f2b417a41c41b42a7bb157ef398ef9d78e6f0fd50
# via
# python3-saml
# xmlsec
@ -1429,9 +1423,9 @@ pip-licenses==5.5.5 \
--hash=sha256:60750c006adf7a0910347b726e8ee9fee3bc8d2e7c8307a5c4ec0776c8e2a276 \
--hash=sha256:f4c4c6d9e6a03612cf59f29f19dc8ab54904d82e055b8e191498f2279a224e14
# via -r src/backend/requirements.in
platformdirs==4.9.4 \
--hash=sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934 \
--hash=sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868
platformdirs==4.9.6 \
--hash=sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a \
--hash=sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917
# via pint
ppf-datamatrix==0.2 \
--hash=sha256:819be65eae444b760e178d5761853f78f8e5fca14fec2809b5e3369978fa9244 \
@ -1523,9 +1517,9 @@ pynacl==1.6.2 \
--hash=sha256:d29bfe37e20e015a7d8b23cfc8bd6aa7909c92a1b8f41ee416bbb3e79ef182b2 \
--hash=sha256:fe9847ca47d287af41e82be1dd5e23023d3c31a951da134121ab02e42ac218c9
# via paramiko
pypdf==6.10.0 \
--hash=sha256:4c5a48ba258c37024ec2505f7e8fd858525f5502784a2e1c8d415604af29f6ef \
--hash=sha256:90005e959e1596c6e6c84c8b0ad383285b3e17011751cedd17f2ce8fcdfc86de
pypdf==6.10.2 \
--hash=sha256:7d09ce108eff6bf67465d461b6ef352dcb8d84f7a91befc02f904455c6eea11d \
--hash=sha256:aa53be9826655b51c96741e5d7983ca224d898ac0a77896e64636810517624aa
# via -r src/backend/requirements.in
pyphen==0.17.2 \
--hash=sha256:3a07fb017cb2341e1d9ff31b8634efb1ae4dc4b130468c7c39dd3d32e7c3affd \
@ -1546,9 +1540,9 @@ python-dotenv==1.2.2 \
--hash=sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a \
--hash=sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3
# via -r src/backend/requirements.in
python-fsutil==0.16.0 \
--hash=sha256:a60e16bad77e3f00c3dca95433209c823bc45e0ae4158e52969002f3c7957a18 \
--hash=sha256:dc957a3541215baa935f66f6f15ceb9a8b7f803919c3d99fa57c818fc545f288
python-fsutil==0.16.1 \
--hash=sha256:4cc78b9a1e64011cb4fdaeba531e457e649a6a9a560424e841426e47f3a153ad \
--hash=sha256:bda20802a19f6dc1bd221f6d2a79e0cd2b2c6eaf2b7c353a385c749917047442
# via django-maintenance-mode
python-ipware==3.0.0 \
--hash=sha256:9117b1c4dddcb5d5ca49e6a9617de2fc66aec2ef35394563ac4eecabdf58c062 \
@ -1647,90 +1641,90 @@ qrcode[pil]==8.2 \
# via
# -r src/backend/requirements.in
# django-allauth
rapidfuzz==3.14.3 \
--hash=sha256:010e12e2411a4854b0434f920e72b717c43f8ec48d57e7affe5c42ecfa05dd0e \
--hash=sha256:02821366d928e68ddcb567fed8723dad7ea3a979fada6283e6914d5858674850 \
--hash=sha256:07aa0b5d8863e3151e05026a28e0d924accf0a7a3b605da978f0359bb804df43 \
--hash=sha256:0e38828d1381a0cceb8a4831212b2f673d46f5129a1897b0451c883eaf4a1747 \
--hash=sha256:152555187360978119e98ce3e8263d70dd0c40c7541193fc302e9b7125cf8f58 \
--hash=sha256:1704fc70d214294e554a2421b473779bcdeef715881c5e927dc0f11e1692a0ff \
--hash=sha256:1b7ef2f4b8583a744338a18f12c69693c194fb6777c0e9ada98cd4d9e8f09d10 \
--hash=sha256:1b86daa7419b5e8b180690efd1fdbac43ff19230803282521c5b5a9c83977655 \
--hash=sha256:1d83b8b712fa37e06d59f29a4b49e2e9e8635e908fbc21552fe4d1163db9d2a1 \
--hash=sha256:1e6eefec45625c634926a9fd46c9e4f31118ac8f3156fff9494422cee45207e6 \
--hash=sha256:1ec0c8c0c3d4f97ced46b2e191e883f8c82dbbf6d5ebc1842366d7eff13cd5a6 \
--hash=sha256:1f1925619627f8798f8c3a391d81071336942e5fe8467bc3c567f982e7ce2897 \
--hash=sha256:1faa0f8f76ba75fd7b142c984947c280ef6558b5067af2ae9b8729b0a0f99ede \
--hash=sha256:2491937177868bc4b1e469087601d53f925e8d270ccc21e07404b4b5814b7b5f \
--hash=sha256:2dc37bc20272f388b8c3a4eba4febc6e77e50a8f450c472def4751e7678f55e4 \
--hash=sha256:32eeafa3abce138bb725550c0e228fc7eaeec7059aa8093d9cbbec2b58c2371a \
--hash=sha256:33a325ed0e8e1aa20c3e75f8ab057a7b248fdea7843c2a19ade0008906c14af0 \
--hash=sha256:33da4bbaf44e9755b0ce192597f3bde7372fe2e381ab305f41b707a95ac57aa7 \
--hash=sha256:37d3c653af15cd88592633e942f5407cb4c64184efab163c40fcebad05f25141 \
--hash=sha256:3fecce764cf5a991ee2195a844196da840aba72029b2612f95ac68a8b74946bf \
--hash=sha256:43d0305c36f504232f18ea04e55f2059bb89f169d3119c4ea96a0e15b59e2a91 \
--hash=sha256:43e38c1305cffae8472572a0584d4ffc2f130865586a81038ca3965301f7c97c \
--hash=sha256:442125473b247227d3f2de807a11da6c08ccf536572d1be943f8e262bae7e4ea \
--hash=sha256:442cba39957a008dfc5bdef21a9c3f4379e30ffb4e41b8555dbaf4887eca9300 \
--hash=sha256:489ce98a895c98cad284f0a47960c3e264c724cb4cfd47a1430fa091c0c25204 \
--hash=sha256:4ad73afb688b36864a8d9b7344a9cf6da186c471e5790cbf541a635ee0f457f2 \
--hash=sha256:4b39921df948388a863f0e267edf2c36302983459b021ab928d4b801cbe6a421 \
--hash=sha256:4e49c9e992bc5fc873bd0fff7ef16a4405130ec42f2ce3d2b735ba5d3d4eb70f \
--hash=sha256:52619d25a09546b8db078981ca88939d72caa6b8701edd8b22e16482a38e799f \
--hash=sha256:54fa03062124e73086dae66a3451c553c1e20a39c077fd704dc7154092c34c63 \
--hash=sha256:56fefb4382bb12250f164250240b9dd7772e41c5c8ae976fd598a32292449cc5 \
--hash=sha256:576e4b9012a67e0bf54fccb69a7b6c94d4e86a9540a62f1a5144977359133583 \
--hash=sha256:57f878330c8d361b2ce76cebb8e3e1dc827293b6abf404e67d53260d27b5d941 \
--hash=sha256:5cfc3d57abd83c734d1714ec39c88a34dd69c85474918ebc21296f1e61eb5ca8 \
--hash=sha256:656e52b054d5b5c2524169240e50cfa080b04b1c613c5f90a2465e84888d6f15 \
--hash=sha256:685c93ea961d135893b5984a5a9851637d23767feabe414ec974f43babbd8226 \
--hash=sha256:6a014ba09657abfcfeed64b7d09407acb29af436d7fc075b23a298a7e4a6b41c \
--hash=sha256:6c5f545f454871e6af05753a0172849c82feaf0f521c5ca62ba09e1b382d6382 \
--hash=sha256:6de00eb84c71476af7d3110cf25d8fe7c792d7f5fa86764ef0b4ca97e78ca3ed \
--hash=sha256:73b07566bc7e010e7b5bd490fb04bb312e820970180df6b5655e9e6224c137db \
--hash=sha256:769f31c60cd79420188fcdb3c823227fc4a6deb35cafec9d14045c7f6743acae \
--hash=sha256:7ba009977601d8b0828bfac9a110b195b3e4e79b350dcfa48c11269a9f1918a0 \
--hash=sha256:7ccbf68100c170e9a0581accbe9291850936711548c6688ce3bfb897b8c589ad \
--hash=sha256:7cf174b52cb3ef5d49e45d0a1133b7e7d0ecf770ed01f97ae9962c5c91d97d23 \
--hash=sha256:7d9af908c2f371bfb9c985bd134e295038e3031e666e4b2ade1e7cb7f5af2f1a \
--hash=sha256:834d1e818005ed0d4ae38f6b87b86fad9b0a74085467ece0727d20e15077c094 \
--hash=sha256:8383b6d0d92f6cd008f3c9216535be215a064b2cc890398a678b56e6d280cb63 \
--hash=sha256:89acb8cbb52904f763e5ac238083b9fc193bed8d1f03c80568b20e4cef43a519 \
--hash=sha256:948b00e8476a91f510dd1ec07272efc7d78c275d83b630455559671d4e33b678 \
--hash=sha256:9ec02e62ae765a318d6de38df609c57fc6dacc65c0ed1fd489036834fd8a620c \
--hash=sha256:a0a28add871425c2fe94358c6300bbeb0bc2ed828ca003420ac6825408f5a424 \
--hash=sha256:a2135b138bcdcb4c3742d417f215ac2d8c2b87bde15b0feede231ae95f09ec41 \
--hash=sha256:adb44d996fc610c7da8c5048775b21db60dd63b1548f078e95858c05c86876a3 \
--hash=sha256:b5100fd6bcee4d27f28f4e0a1c6b5127bc8ba7c2a9959cad9eab0bf4a7ab3329 \
--hash=sha256:b9fcd4d751a4fffa17aed1dde41647923c72c74af02459ad1222e3b0022da3a1 \
--hash=sha256:beda6aa9bc44d1d81242e7b291b446be352d3451f8217fcb068fc2933927d53b \
--hash=sha256:c5fb2d978a601820d2cfd111e2c221a9a7bfdf84b41a3ccbb96ceef29f2f1ac7 \
--hash=sha256:c71ce6d4231e5ef2e33caa952bfe671cb9fd42e2afb11952df9fad41d5c821f9 \
--hash=sha256:c7bd1816db05d6c5ffb3a4df0a2b7b56fb8c81ef584d08e37058afa217da91b1 \
--hash=sha256:c7e40c0a0af02ad6e57e89f62bef8604f55a04ecae90b0ceeda591bbf5923317 \
--hash=sha256:cc594bbcd3c62f647dfac66800f307beaee56b22aaba1c005e9c4c40ed733923 \
--hash=sha256:cc65e72790ddfd310c2c8912b45106e3800fefe160b0c2ef4d6b6fec4e826457 \
--hash=sha256:cec3c0da88562727dd5a5a364bd9efeb535400ff0bfb1443156dd139a1dd7b50 \
--hash=sha256:cfe8df315ab4e6db4e1be72c5170f8e66021acde22cd2f9d04d2058a9fd8162e \
--hash=sha256:d1fa009f8b1100e4880868137e7bf0501422898f7674f2adcd85d5a67f041296 \
--hash=sha256:d7843a1abf0091773a530636fdd2a49a41bcae22f9910b86b4f903e76ddc82dc \
--hash=sha256:da2a007434323904719158e50f3076a4dadb176ce43df28ed14610c773cc9825 \
--hash=sha256:dbcb726064b12f356bf10fffdb6db4b6dce5390b23627c08652b3f6e49aa56ae \
--hash=sha256:dc8c07801df5206b81ed6bd6c35cb520cf9b6c64b9b0d19d699f8633dc942897 \
--hash=sha256:dea2d113e260a5da0c4003e0a5e9fdf24a9dc2bb9eaa43abd030a1e46ce7837d \
--hash=sha256:dea97ac3ca18cd3ba8f3d04b5c1fe4aa60e58e8d9b7793d3bd595fdb04128d7a \
--hash=sha256:dee362e7e79bae940a5e2b3f6d09c6554db6a4e301cc68343886c08be99844f1 \
--hash=sha256:e195a77d06c03c98b3fc06b8a28576ba824392ce40de8c708f96ce04849a052e \
--hash=sha256:e6b5e3036976f0fde888687d91be86d81f9ac5f7b02e218913c38285b756be6c \
--hash=sha256:e6c31a4aa68cfa75d7eede8b0ed24b9e458447db604c2db53f358be9843d81d3 \
--hash=sha256:e805e52322ae29aa945baf7168b6c898120fbc16d2b8f940b658a5e9e3999253 \
--hash=sha256:ea188aa00e9bcae8c8411f006a5f2f06c4607a02f24eab0d8dc58566aa911f35 \
--hash=sha256:ecd7453e02cf072258c3a6b8e930230d789d5d46cc849503729f9ce475d0e785 \
--hash=sha256:ef6bf930b947bd0735c550683939a032090f1d688dfd8861d6b45307b96fd5c5 \
--hash=sha256:f3d15d8527e2b293e38ce6e437631af0708df29eafd7c9fc48210854c94472f9 \
--hash=sha256:f3eb0ff3b75d6fdccd40b55e7414bb859a1cda77c52762c9c82b85569f5088e7 \
--hash=sha256:fa7c8f26f009f8c673fbfb443792f0cf8cf50c4e18121ff1e285b5e08a94fbdb \
--hash=sha256:fce3152f94afcfd12f3dd8cf51e48fa606e3cb56719bccebe3b401f43d0714f9
rapidfuzz==3.14.5 \
--hash=sha256:0084b687b02b4e569b46d8d6d4ad25659528e6081cd6d067ca453a69035f07e4 \
--hash=sha256:01550fe5f60fd176aa66b7611289d46dc4aa4b1b904874c7b6d1d54e581c5ec1 \
--hash=sha256:0298d357e2bc59d572da4db0bc631009b6f8f6c9bc8c11e99a12b833f16b6575 \
--hash=sha256:068b3e965ca9d9ee4debe40001ae7c3938ba646308afd33cf0c66618147db65c \
--hash=sha256:071d96b957a33b9296b9284b6350a0fb6d030b154a04efd7c15e56b98b79a517 \
--hash=sha256:09d6c9ba091854f07817055d795d604179c12a8f308ba4c7d56f3719dfea1646 \
--hash=sha256:0d3378f471ef440473a396ce2f8e97ee12f89a78b495540e0a5617bbfe895638 \
--hash=sha256:0ebd1a18e2e47bc0b292a07e6ed9c3642f8aaa672d12253885f599b50807a4f9 \
--hash=sha256:0f23e37019ec07712d58976b1ab2b889f8649a7f7c2f626a2f34ea9139e79279 \
--hash=sha256:11bfc2ed8fbe4ab86bd516fadefab126f90e6dcadffa761739fcb304707dfd35 \
--hash=sha256:13cb79c23ef5516e4c4e3830877be8b19aa75203636be1163d690d37803f6504 \
--hash=sha256:17a34330cd2a538c1ce5d400b61ba358c5b72c654b928ff87b362e88f8b864c7 \
--hash=sha256:1a31cc6d7d03e7318a0974c038959c59e19c752b81115f2e9138b3331cd64d45 \
--hash=sha256:1e910eebca9fd0eba245c0555e764597e8a0cccb673a92da2dc2397050725f48 \
--hash=sha256:1e989f86113be66574113b9c7bdf4793f3f863d248e47d911b355e05ca6b6b10 \
--hash=sha256:2e83cd2e25bb4edd97b689d9979d9c3acccdaaf26ceac08212ceece202febcfa \
--hash=sha256:39ef8658aaf67d51667e7bdaf7096f432333377d8302ac43c70b5df8a4cf89b8 \
--hash=sha256:3d50e5861872935fece391351cbb5ba21d1bced277cf5e1143d207a0a35f1925 \
--hash=sha256:3e91dcd2549b8f8d843f98ba03a17e01f3d8b72ce942adbbb6761bc58ffce813 \
--hash=sha256:419e4397a36e2665ec992d8d64c20ba4b2a42500c76ecadeca78a4f19cb9cc32 \
--hash=sha256:440d30faaf682ca496170a7f0cc5453ec942e3e079f0fd802c9a7f938dfb50a3 \
--hash=sha256:46b92a9970dcc34f0096901c792644094cab49554ac3547f35e3aebbdf0a3610 \
--hash=sha256:478b59bb018a6780d73f33e38d0b3ec5e968a6c1ed42876b993dd456b7aa20e8 \
--hash=sha256:48bee0b91bebfaec41e1081e351000659ab7570cc4598d617aa04d5bf827f9e6 \
--hash=sha256:4900143d82071bdda533b00300c40b14b963ff826b3642cc463b6dd0f036585e \
--hash=sha256:4a60f0057231188e3bd30216f7b4e0f279b11fa4ec818bb6c1d9f014d1562fbc \
--hash=sha256:56227a61fd3d17b0cd9793132431f3a3d07c8654be96794ba9f89fe0fc8b2d09 \
--hash=sha256:578e6051f6d5e6200c259b47a103cf06bb875ab5814d17333fc0b5c290b22f4c \
--hash=sha256:593c00dac4e30231c35bf3b4f1da8ec0998762e9e94425586a5d636fcd57f9d0 \
--hash=sha256:59b3dba758661a318995655435c6ab20a04ade79fa51e75bc8dc107cac8df280 \
--hash=sha256:5ab449c9abd0d4e1f8145dce0798a4c822a1a1933d613c764a641bea88b8bdab \
--hash=sha256:5dfa89d78f22cd773054caff44827b846161a29f2dcf7e78b8f90d086621e502 \
--hash=sha256:649712823f3abcdc48427147a5384fac15623ba435d0013959b52e6462521397 \
--hash=sha256:667f40fe9c81ad129b198d236881b00dd9e8314d9cc72d03c3e16bdfe5879051 \
--hash=sha256:6737b35d5af7479c5bf9710f7b17edd9d2c43128d974d25fb4ea653e42c64609 \
--hash=sha256:67f3f9d2b444268ab53e47d31bab89954888d23c04c6789f2c727e51fe4b1d13 \
--hash=sha256:7092a216728f80c960bd6b3807275d1ee318b168986bd5dc523349581d4890b8 \
--hash=sha256:738c96944d076deeaff70e92b65696ab4f7ecb8081d7791c5403a3257dfaf8ff \
--hash=sha256:77eac0526899b3c3ad1454bb2b03cdb491d67358ec8ef0c9c48bd61b632b431d \
--hash=sha256:7d5ca9c7832e6879a707296d1463685f7c243a27846227044504741640caec66 \
--hash=sha256:7e580cb04ad849ae9b786fa21383c6b994b6e6c1444ad1cb9f22392759d72741 \
--hash=sha256:8166efddea49fdbc61185559f47593239e4794fd7c9044dd5a789d1a90af852d \
--hash=sha256:823b1b9d9230809d8edcc18872770764bfe8ef4357995e16744047c8ccf0e489 \
--hash=sha256:88b7d31ff1cc5e9bc0e4406e6b1fa00b6d37163d50bb58091e9b976ff1129faa \
--hash=sha256:8c90cdf8516d9057e502aa6003cea71cf5ec27cc44699ca52412b502a04761bb \
--hash=sha256:8ce1d850b3c0178440efde9e884d98421b5e87ff925f364d6d79e23910d7593f \
--hash=sha256:8f4a8f5cc84c7ad6bffa0e9947b33eb343ad66e6b53e94fe54378a5508c5ed53 \
--hash=sha256:93d8da883a35116d6813432177f35e570db5b0a5e30ecb0cbd7cb39c815735df \
--hash=sha256:95d937e74c1a7a1287dfb03b62a827be08ede10a155cf1af73bbf47f2b73ee6e \
--hash=sha256:9669753caef7fdc6529f6adcc5883ed98d65976445d9322e7dbdb6b697feee13 \
--hash=sha256:97131ab2be39043054ee28d99e09efe316e6d53449b7e962dfcf3c2de8b2b246 \
--hash=sha256:97c6d85283629646fa87acc22c66b30ea9d4de7f6fdf887daa2e30fa041829b5 \
--hash=sha256:9981d38a703b86f0e315a3cd229fd1906fe1d91c989ed121fb975b3c849f89f5 \
--hash=sha256:9ad37a0be705b544af6296da8edddc260d10a8ae5462530fc9991f66498bb1f9 \
--hash=sha256:a2ae6f53f99c9a0eca7a0afc5b4e45fc73bc1dd4ac74c00509031d76df80ed98 \
--hash=sha256:aac0ad28c686a5e72b81668b906c030ee28050b244544b8af68e12fb32543895 \
--hash=sha256:af3b859726cd3374287e405e14b9634563c078c5531a4f62375508addebddad1 \
--hash=sha256:af6a90a4ed2a48fa1a2d17e9d824e6c7c950bea5bad0b707c77fd55751e6bfef \
--hash=sha256:b002c7994cc9f2bc9d9856f0fbaee6e8072c983873846c92f25cefba5b2a925f \
--hash=sha256:b486b5218808f6f4dc471b114b1054e63553db69705c97da0271f47bd706aedd \
--hash=sha256:b9c6bd754d11f6e78ac54e3d86b4b11dc1ba2f13e5fc958899574532897f5a99 \
--hash=sha256:ba10ac57884ce82112f7ed910b67e7fb6072d8ef2c06e30dc63c0f604a112e0e \
--hash=sha256:bf5018938208d4597b2e679a4f8cff9fd252f1df53583130ae56281a21801b64 \
--hash=sha256:c0919d1f89ddf91129906705723118ea09754171e4116f5a5dbc667c7bc9b261 \
--hash=sha256:c5801a89604c65ab4cc9e91b23bc4076d0ca80efd8c976fb63843d7879a85d7f \
--hash=sha256:c84af70bcf34e99aee894e46a0f1ac77f17d0ef828179c387407642e2466d28a \
--hash=sha256:cb2829fedd672dd7107267189dabe2bbe07972801d636014417c6861eb89e358 \
--hash=sha256:d45e06f60729e07d9b20c205f7e5cff90b6ef2584e852eecf46e045aea69627d \
--hash=sha256:d7ca16637c0ede8243f84074044bd0b2335a0341421f8227c85756de2d18c819 \
--hash=sha256:d8375e3da319593389727c3187ccaf3e0e84199accc530866b8e0f2b79af05e9 \
--hash=sha256:dfa552338f51aec280f17b02d28bace1e162d1a84ccd80e3339a57f98aedb56b \
--hash=sha256:dfef96543ced67d9513a422755db422ae1dc34dade0a1485e0b43e7342ed3ebf \
--hash=sha256:e012177c8e8a8a0754ae0d6027d63042aa5ff036d9f40f07cb3466a6082e21b8 \
--hash=sha256:e251126d48615e1f02b4a178f2cd0cd4f0332b8a019c01a2e10480f7552554b4 \
--hash=sha256:e52da10236aa6212de71b9e170bace65b64b129c0dea7fc243d6c9ce976f5074 \
--hash=sha256:eacb434410b8d9ca99a8d42352ef085cf423e3c76c1f0b86be2fcba3bff2952c \
--hash=sha256:ebd8fd343bf8492a1e60bcb6dc99f90f74f65d98d8241a6b3e1fed225b76ecd6 \
--hash=sha256:f0b2af76b7e7060c09e1a0dfa9410eb19369cbe6164509bff2ef94094b54d2b6 \
--hash=sha256:f2073495a7f9b75e57e600747ac09510d67683fd64d3228e009740b7ef88f9fe \
--hash=sha256:f4c1bca487a17fe4226b4ffb2d30e799d2b274d692cffa76bd0746f56235fca3 \
--hash=sha256:f9fff308486bbd2c8c24f25e8e152c7594d3fe8db265a2d6a1ce24d58671127f \
--hash=sha256:fbf1b8bb2695415b347f3727da1addca2acb82c9b97ac86bebf8b1bead1eb12d \
--hash=sha256:feedf219672eef83ea6be6f3bb093bba396a8560fc75be85ba225f082903df0a
# via -r src/backend/requirements.in
redis==7.4.0 \
--hash=sha256:64a6ea7bf567ad43c964d2c30d82853f8df927c5c9017766c55a1d1ed95d18ad \

View File

@ -2,6 +2,23 @@
This file contains historical changelog information for the InvenTree UI components library.
### 0.11.2 - April 2026
Exposes additional type definitions related to tables and filters:
- TableFilterChoice
- TableFilterType
- TableFilter
- FilterSetState
### 0.11.1 - April 2026
Fixes dependency issues for the `InvenTreeTable` component, which were introduced in `0.11.0`. This ensures that the component works correctly and does not cause issues with plugin builds.
### 0.11.0 - April 2026
Adds the `InvenTreeTable` component, which provides plugins with a method of implementing an API-driven data table which is consistent with the rest of the InvenTree UI. This component supports features such as pagination, sorting, and filtering, and can be used to display data from the InvenTree API in a tabular format.
### 0.10.1 - April 2026
Allows plugins to specify custom model rendering functions within the data import wizard, allowing import of data models not defined in the core InvenTree codebase.

View File

@ -10,8 +10,7 @@ import {
Text,
Tooltip
} from '@mantine/core';
import { InvenTreeIcon } from '../../functions/icons';
import { IconCheck, IconCopy } from '@tabler/icons-react';
import type { JSX } from 'react';
@ -62,11 +61,7 @@ export function CopyButton({
variant={copied ? 'transparent' : (variant ?? 'transparent')}
size={size ?? 'sm'}
>
{copied ? (
<InvenTreeIcon icon='check' />
) : (
<InvenTreeIcon icon='copy' />
)}
{copied ? <IconCheck /> : <IconCopy />}
{content}
{label && (
<Text p={size ?? 'sm'} size={size ?? 'sm'}>

View File

@ -1,6 +1,6 @@
import { Group } from '@mantine/core';
import { useState } from 'react';
import { CopyButton } from '../components/buttons/CopyButton';
import { CopyButton } from './CopyButton';
/**
* A wrapper component that adds a copy button to cell content on hover

View File

@ -0,0 +1,63 @@
import { Alert } from '@mantine/core';
import {
INVENTREE_PLUGIN_VERSION,
type InvenTreePluginContext
} from '../types/Plugins';
import type {
InvenTreeTableProps,
TableColumn,
TableState
} from '../types/Tables';
/**
* Wrapper function which allows plugins to render an InvenTree component instance directly,
* in a similar way to the standard InvenTreeTable component.
*
* Note: The InventreePluginContext "context" object must be provided when rendering the table
*
*/
export default function InvenTreeTable({
url,
tableState,
tableData,
columns,
props,
context
}: {
url?: string;
tableState: TableState;
tableData?: any[];
columns: TableColumn<any>[];
props: InvenTreeTableProps;
context: InvenTreePluginContext;
}) {
if (!context?.tables?.renderTable) {
return (
<Alert title='Plugin Version Error' color='red'>
{
'The <InvenTreeTable> component cannot be rendered because the plugin context is missing the "renderTable" function.'
}
<br />
{
'This means that the InvenTree UI library version is incompatible with this plugin version.'
}
<br />
<b>Plugin Version:</b> {INVENTREE_PLUGIN_VERSION}
<br />
<b>UI Version:</b> {context?.version?.inventree || 'unknown'}
<br />
</Alert>
);
}
return context?.tables.renderTable({
url: url,
tableState: tableState,
tableData: tableData,
columns: columns,
props: props,
api: context.api,
navigate: context.navigate
});
}

View File

@ -0,0 +1,47 @@
import type { ApiEndpoints } from '../enums/ApiEndpoints';
import type { PathParams } from '../types/Core';
import type { ApiFormFieldSet, ApiFormFieldType } from '../types/Forms';
import { apiUrl } from './Api';
/**
* Construct an API url from the provided ApiFormProps object
*/
export function constructFormUrl(
url: ApiEndpoints | string,
pk?: string | number,
pathParams?: PathParams,
queryParams?: URLSearchParams
): string {
let formUrl = apiUrl(url, pk, pathParams);
if (queryParams) {
formUrl += `?${queryParams.toString()}`;
}
return formUrl;
}
export type NestedDict = { [key: string]: string | number | NestedDict };
export function mapFields(
fields: ApiFormFieldSet,
fieldFunction: (path: string, value: ApiFormFieldType, key: string) => any,
_path?: string
): NestedDict {
const res: NestedDict = {};
for (const [k, v] of Object.entries(fields)) {
const path = _path ? `${_path}.${k}` : k;
let value: any;
if (v.field_type === 'nested object' && v.children) {
value = mapFields(v.children, fieldFunction, path);
} else {
value = fieldFunction(path, v, k);
}
if (value !== undefined) res[k] = value;
}
return res;
}

View File

@ -0,0 +1,50 @@
import { t } from '@lingui/core/macro';
import { notifications } from '@mantine/notifications';
/**
* Show a notification that the feature is not yet implemented
*/
export function notYetImplemented() {
notifications.hide('not-implemented');
notifications.show({
title: t`Not implemented`,
message: t`This feature is not yet implemented`,
color: 'red',
id: 'not-implemented'
});
}
/**
* Show a notification that the user does not have permission to perform the action
*/
export function permissionDenied() {
notifications.show({
title: t`Permission Denied`,
message: t`You do not have permission to perform this action`,
color: 'red'
});
}
/**
* Display a notification on an invalid return code
*/
export function invalidResponse(returnCode: number) {
// TODO: Specific return code messages
notifications.show({
title: t`Invalid Return Code`,
message: t`Server returned status ${returnCode}`,
color: 'red'
});
}
/**
* Display a notification on timeout
*/
export function showTimeoutNotification() {
notifications.show({
title: t`Timeout`,
message: t`The request timed out`,
color: 'red'
});
}

View File

@ -1,8 +1,8 @@
import type { FilterSetState, TableFilter } from '@lib/types/Filters';
import { useLocalStorage } from '@mantine/hooks';
import { useCallback, useMemo } from 'react';
import type { FilterSetState, TableFilter } from '../types/Filters';
export function useFilterSet(
export default function useFilterSet(
filterKey: string,
initialFilters?: TableFilter[]
): FilterSetState {

View File

@ -1,10 +1,9 @@
import { randomId } from '@mantine/hooks';
import { useCallback, useMemo, useState } from 'react';
import { useSearchParams } from 'react-router-dom';
import type { FilterSetState, TableFilter } from '@lib/types/Filters';
import type { TableState } from '@lib/types/Tables';
import { useFilterSet } from './UseFilterSet';
import type { FilterSetState, TableFilter } from '../types/Filters';
import type { TableState } from '../types/Tables';
import useFilterSet from './UseFilterSet';
export type TableStateExtraProps = {
idAccessor?: string;
@ -17,7 +16,7 @@ export type TableStateExtraProps = {
* Refer to the TableState type definition for more information.
*/
export function useTable(
export default function useTable(
tableName: string,
tableProps: TableStateExtraProps = {
idAccessor: 'pk',
@ -29,13 +28,6 @@ export function useTable(
return `${tableName.replaceAll('-', '')}-${randomId()}`;
}
// Extract URL query parameters (e.g. ?active=true&overdue=false)
const [queryFilters, setQueryFilters] = useSearchParams();
const clearQueryFilters = useCallback(() => {
setQueryFilters({});
}, []);
const [tableKey, setTableKey] = useState<string>(generateTableName());
// Callback used to refresh (reload) the table
@ -133,9 +125,6 @@ export function useTable(
isLoading,
setIsLoading,
filterSet,
queryFilters,
setQueryFilters,
clearQueryFilters,
expandedRecords,
setExpandedRecords,
isRowExpanded,

View File

@ -15,10 +15,27 @@ export { UserRoles, UserPermissions } from './enums/Roles';
export type {
InvenTreePluginContext,
InvenTreeFormsContext,
InvenTreeTablesContext,
ImporterDrawerContext,
PluginVersion,
StockAdjustmentFormsContext
} from './types/Plugins';
export type { RowAction, RowViewProps } from './types/Tables';
export type {
RowAction,
RowViewProps,
TableColumn,
TableColumnProps,
InvenTreeTableProps,
InvenTreeTableRenderProps
} from './types/Tables';
export type {
TableFilterChoice,
TableFilterType,
TableFilter,
FilterSetState
} from './types/Filters';
export type {
ApiFormFieldChoice,
@ -42,6 +59,14 @@ export {
getDetailUrl,
navigateToLink
} from './functions/Navigation';
export {
notYetImplemented,
permissionDenied,
invalidResponse,
showTimeoutNotification
} from './functions/Notification';
export {
checkPluginVersion,
initPlugin
@ -53,16 +78,32 @@ export {
formatFileSize
} from './functions/Formatting';
export {
constructFormUrl,
mapFields,
type NestedDict
} from './functions/Forms';
export {
shortenString,
hashString
} from './functions/String';
// Common UI components
export {
ActionButton,
type ActionButtonProps
} from './components/ActionButton';
export { AddItemButton } from './components/AddItemButton';
export { Boundary, DefaultFallback } from './components/Boundary';
export { ButtonMenu } from './components/ButtonMenu';
export { CopyButton } from './components/CopyButton';
export { CopyableCell } from './components/CopyableCell';
export { ProgressBar } from './components/ProgressBar';
export { PassFailButton, YesNoButton } from './components/YesNoButton';
export { SearchInput } from './components/SearchInput';
export { TableColumnSelect } from './components/TableColumnSelect';
export { default as InvenTreeTable } from './components/InvenTreeTable';
export {
RowViewAction,
RowDuplicateAction,
@ -77,7 +118,21 @@ export {
default as useMonitorDataOutput,
type MonitorDataOutputProps
} from './hooks/MonitorDataOutput';
export {
default as useMonitorBackgroundTask,
type MonitorBackgroundTaskProps
} from './hooks/MonitorBackgroundTask';
export { default as useFilterSet } from './hooks/UseFilterSet';
export {
default as useTable,
type TableStateExtraProps
} from './hooks/UseTable';
// State management
export {
type StoredTableStateProps,
useStoredTableState
} from './states/StoredTableState';

View File

@ -13,7 +13,7 @@ const DEFAULT_PAGE_SIZE: number = 25;
* - columnNames: An object mapping table keys to arrays of column names.
* - sorting: An object mapping table keys to sorting configurations.
*/
interface StoredTableStateProps {
export interface StoredTableStateProps {
pageSize: number;
setPageSize: (size: number) => void;
tableSorting: Record<string, any>;

View File

@ -13,6 +13,7 @@ import type {
import type { UseModalReturn } from './Modals';
import type { RenderInstanceProps } from './Rendering';
import type { SettingsStateProps } from './Settings';
import type { InvenTreeTableRenderProps } from './Tables';
import type { UserStateProps } from './User';
export interface PluginProps {
@ -48,6 +49,10 @@ export type InvenTreeFormsContext = {
stockActions: StockAdjustmentFormsContext;
};
export type InvenTreeTablesContext<T extends Record<string, any>> = {
renderTable: (props: InvenTreeTableRenderProps<T>) => React.ReactNode;
};
export type ImporterDrawerContext = {
open: (sessionId: number, options?: { onClose?: () => void }) => void;
close: () => void;
@ -61,20 +66,22 @@ export type ImporterDrawerContext = {
*
* @param version - The version of the running InvenTree software stack
* @param api - The Axios API instance (see ../states/ApiState.tsx)
* @param queryClient - The Tanstack QueryClient instance (see ../states/QueryState.tsx)
* @param user - The current user instance (see ../states/UserState.tsx)
* @param userSettings - The current user settings (see ../states/SettingsState.tsx)
* @param globalSettings - The global settings (see ../states/SettingsState.tsx)
* @param navigate - The navigation function (see react-router-dom)
* @param theme - The current Mantine theme
* @param forms - A set of functions for opening various API forms (see ../components/Forms.tsx)
* @param importer - A set of functions for controlling the global importer drawer (see ../components/importer/GlobalImporterDrawer.tsx)
* @param colorScheme - The current Mantine color scheme (e.g. 'light' / 'dark')
* @param modelInformation - A dictionary of available model information
* @param renderInstance - A component function for rendering a model instance
* @param host - The current host URL
* @param i18n - The i18n instance for translations (from @lingui/core)
* @param locale - The current locale string (e.g. 'en' / 'de')
* @param navigate - The navigation function (see react-router-dom)
* @param theme - The current Mantine theme
* @param colorScheme - The current Mantine color scheme (e.g. 'light' / 'dark')
* @param forms - A set of functions for opening various API forms (see ../components/Forms.tsx)
* @param tables - A set of functions for rendering API tables
* @param importer - A set of functions for controlling the global importer drawer (see ../components/importer/GlobalImporterDrawer.tsx)
* @param model - The model type associated with the rendered component (if applicable)
* @param modelInformation - A dictionary of available model information
* @param renderInstance - A component function for rendering a model instance
* @param id - The ID (primary key) of the model instance for the plugin (if applicable)
* @param instance - The model instance data (if available)
* @param reloadContent - A function which can be called to reload the plugin content
@ -95,9 +102,10 @@ export type InvenTreePluginContext = {
locale: string;
navigate: NavigateFunction;
theme: MantineTheme;
forms: InvenTreeFormsContext;
importer: ImporterDrawerContext;
colorScheme: MantineColorScheme;
forms: InvenTreeFormsContext;
tables: InvenTreeTablesContext<any>;
importer: ImporterDrawerContext;
model?: ModelType | string;
id?: string | number | null;
instance?: any;

View File

@ -1,10 +1,12 @@
import type { MantineStyleProp } from '@mantine/core';
import type { AxiosInstance } from 'axios';
import type { ShowContextMenuFunction } from 'mantine-contextmenu';
import type {
DataTableCellClickHandler,
DataTableRowExpansionProps
} from 'mantine-datatable';
import type { ReactNode } from 'react';
import type { NavigateFunction, SetURLSearchParams } from 'react-router-dom';
import type { NavigateFunction } from 'react-router-dom';
import type { ModelType } from '../enums/ModelType';
import type { FilterSetState, TableFilter } from './Filters';
import type { ApiFormFieldType } from './Forms';
@ -17,9 +19,6 @@ import type { ApiFormFieldType } from './Forms';
* isLoading: A boolean flag to indicate if the table is currently loading data
* setIsLoading: A function to set the isLoading flag
* filterSet: A group of active filters
* queryFilters: A map of query filters (e.g. ?active=true&overdue=false) passed in the URL
* setQueryFilters: A function to set the query filters
* clearQueryFilters: A function to clear all query filters
* expandedRecords: An array of expanded records (rows) in the table
* setExpandedRecords: A function to set the expanded records
* isRowExpanded: A function to determine if a record is expanded
@ -49,9 +48,6 @@ export type TableState = {
isLoading: boolean;
setIsLoading: (value: boolean) => void;
filterSet: FilterSetState;
queryFilters: URLSearchParams;
setQueryFilters: SetURLSearchParams;
clearQueryFilters: () => void;
expandedRecords: any[];
setExpandedRecords: (records: any[]) => void;
isRowExpanded: (pk: number) => boolean;
@ -219,3 +215,18 @@ export type InvenTreeTableProps<T = any> = {
minHeight?: number;
noHeader?: boolean;
};
export type InvenTreeTableRenderProps<T extends Record<string, any>> = {
url?: string;
tableState: TableState;
tableData?: T[];
columns: TableColumn<T>[];
props: InvenTreeTableProps<T>;
api: AxiosInstance;
navigate: NavigateFunction;
// The following attributes are for internal use only (plugins should not use these directly)
showContextMenu?: ShowContextMenuFunction;
searchParams?: URLSearchParams;
setSearchParams?: (params: URLSearchParams) => void;
};

View File

@ -1,7 +1,7 @@
{
"name": "@inventreedb/ui",
"description": "UI components for the InvenTree project",
"version": "0.10.1",
"version": "0.11.2",
"private": false,
"type": "module",
"license": "MIT",

View File

@ -13,9 +13,9 @@ import {
import { IconCamera, IconScan } from '@tabler/icons-react';
import { useCallback, useMemo, useState } from 'react';
import { Boundary } from '@lib/components/Boundary';
import { useLocalStorage } from '@mantine/hooks';
import { useGlobalSettingsState } from '../../states/SettingsStates';
import { Boundary } from '../Boundary';
import BarcodeCameraInput from './BarcodeCameraInput';
import BarcodeKeyboardInput from './BarcodeKeyboardInput';

View File

@ -18,11 +18,11 @@ import { useQuery } from '@tanstack/react-query';
import QR from 'qrcode';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { CopyButton } from '@lib/components/CopyButton';
import { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import { apiUrl } from '@lib/functions/Api';
import { api } from '../../App';
import { useGlobalSettingsState } from '../../states/SettingsStates';
import { CopyButton } from '../buttons/CopyButton';
import type { QrCodeType } from '../items/ActionDropdown';
import { extractErrorMessage } from '../../functions/api';

View File

@ -5,6 +5,7 @@ import interactionPlugin from '@fullcalendar/interaction';
import FullCalendar from '@fullcalendar/react';
import { ActionButton } from '@lib/components/ActionButton';
import { Boundary } from '@lib/components/Boundary';
import { SearchInput } from '@lib/components/SearchInput';
import type { TableFilter } from '@lib/types/Filters';
import { t } from '@lingui/core/macro';
@ -36,7 +37,6 @@ import {
import type { CalendarState } from '../../hooks/UseCalendar';
import { useLocalState } from '../../states/LocalState';
import { FilterSelectDrawer } from '../../tables/FilterSelectDrawer';
import { Boundary } from '../Boundary';
import { StylishText } from '../items/StylishText';
export interface InvenTreeCalendarProps extends CalendarOptions {

View File

@ -2,7 +2,7 @@ import { t } from '@lingui/core/macro';
import { ActionIcon, Box, Group, Overlay, Paper, Tooltip } from '@mantine/core';
import { IconX } from '@tabler/icons-react';
import { Boundary } from '../Boundary';
import { Boundary } from '@lib/components/Boundary';
import type { ModelType } from '@lib/index';
import type { JSX } from 'react';

View File

@ -17,6 +17,7 @@ import { getValueAtPath } from 'mantine-datatable';
import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { CopyButton } from '@lib/components/CopyButton';
import { ProgressBar } from '@lib/components/ProgressBar';
import { YesNoButton } from '@lib/components/YesNoButton';
import { ApiEndpoints } from '@lib/enums/ApiEndpoints';
@ -29,7 +30,6 @@ import { useApi } from '../../contexts/ApiContext';
import { formatDate, formatDecimal } from '../../defaults/formatters';
import { InvenTreeIcon } from '../../functions/icons';
import { useGlobalSettingsState } from '../../states/SettingsStates';
import { CopyButton } from '../buttons/CopyButton';
import { StylishText } from '../items/StylishText';
import { getModelInfo } from '../render/ModelType';
import { StatusRenderer } from '../render/StatusRenderer';

View File

@ -25,12 +25,12 @@ import Split from '@uiw/react-split';
import type React from 'react';
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { Boundary } from '@lib/components/Boundary';
import { ModelInformationDict } from '@lib/enums/ModelInformation';
import { ModelType } from '@lib/enums/ModelType';
import { apiUrl } from '@lib/functions/Api';
import { api } from '../../../App';
import type { TemplateI } from '../../../tables/settings/TemplateTable';
import { Boundary } from '../../Boundary';
import { SplitButton } from '../../buttons/SplitButton';
import { StandaloneField } from '../../forms/StandaloneField';

View File

@ -22,26 +22,25 @@ import {
} from 'react-hook-form';
import { type NavigateFunction, useNavigate } from 'react-router-dom';
import { Boundary } from '@lib/components/Boundary';
import { isTrue } from '@lib/functions/Conversion';
import {
type NestedDict,
constructFormUrl,
mapFields
} from '@lib/functions/Forms';
import { getDetailUrl } from '@lib/functions/Navigation';
import {
invalidResponse,
showTimeoutNotification
} from '@lib/functions/Notification';
import type {
ApiFormFieldSet,
ApiFormFieldType,
ApiFormProps
} from '@lib/types/Forms';
import { useApi } from '../../contexts/ApiContext';
import {
type NestedDict,
constructField,
constructFormUrl,
extractAvailableFields,
mapFields
} from '../../functions/forms';
import {
invalidResponse,
showTimeoutNotification
} from '../../functions/notifications';
import { Boundary } from '../Boundary';
import { constructField, extractAvailableFields } from '../../functions/forms';
import { KeepFormOpenSwitch } from './KeepFormOpenSwitch';
import { ApiFormField } from './fields/ApiFormField';

View File

@ -20,6 +20,7 @@ import { YesNoButton } from '@lib/components/YesNoButton';
import { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import { apiUrl } from '@lib/functions/Api';
import { cancelEvent } from '@lib/functions/Events';
import useTable from '@lib/hooks/UseTable';
import type { TableFilter } from '@lib/types/Filters';
import type { ApiFormFieldSet } from '@lib/types/Forms';
import type { TableColumn } from '@lib/types/Tables';
@ -29,7 +30,6 @@ import {
useEditApiFormModal
} from '../../hooks/UseForm';
import type { ImportSessionState } from '../../hooks/UseImportSession';
import { useTable } from '../../hooks/UseTable';
import { InvenTreeTable } from '../../tables/InvenTreeTable';
import { RenderRemoteInstance } from '../render/Instance';

View File

@ -13,13 +13,13 @@ import {
import type { ContextModalProps } from '@mantine/modals';
import { useQuery } from '@tanstack/react-query';
import { CopyButton } from '@lib/components/CopyButton';
import { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import { apiUrl } from '@lib/functions/Api';
import { useShallow } from 'zustand/react/shallow';
import { api } from '../../App';
import { generateUrl } from '../../functions/urls';
import { useServerApiState } from '../../states/ServerApiState';
import { CopyButton } from '../buttons/CopyButton';
import { StylishText } from '../items/StylishText';
import type { JSX } from 'react';

View File

@ -9,6 +9,7 @@ import { IconSearch } from '@tabler/icons-react';
import { type JSX, useEffect, useMemo, useState } from 'react';
import { Navigate, Outlet, useLocation, useNavigate } from 'react-router-dom';
import { Boundary } from '@lib/components/Boundary';
import { identifierString } from '@lib/functions/Conversion';
import { ApiEndpoints, apiUrl } from '@lib/index';
import { useQuery } from '@tanstack/react-query';
@ -20,7 +21,6 @@ import {
useUserSettingsState
} from '../../states/SettingsStates';
import { useUserState } from '../../states/UserState';
import { Boundary } from '../Boundary';
import GlobalImporterDrawer from '../importer/GlobalImporterDrawer';
import { ApiIcon } from '../items/ApiIcon';
import { useInvenTreeContext } from '../plugins/PluginContext';

View File

@ -23,6 +23,7 @@ import { useQuery } from '@tanstack/react-query';
import { useCallback, useMemo } from 'react';
import { useNavigate } from 'react-router-dom';
import { Boundary } from '@lib/components/Boundary';
import { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import { ModelInformationDict } from '@lib/enums/ModelInformation';
import type { ModelType } from '@lib/enums/ModelType';
@ -32,7 +33,6 @@ import { getBaseUrl } from '@lib/functions/Navigation';
import { navigateToLink } from '@lib/functions/Navigation';
import { api } from '../../App';
import { useUserState } from '../../states/UserState';
import { Boundary } from '../Boundary';
import { StylishText } from '../items/StylishText';
/**
@ -137,7 +137,7 @@ export function NotificationDrawer({
const markAllAsRead = useCallback(() => {
api
.get(apiUrl(ApiEndpoints.notifications_readall), {
.post(apiUrl(ApiEndpoints.notifications_readall), {
params: {
read: false
}

View File

@ -1,8 +1,8 @@
import { Group, Paper, Space, Stack, Text } from '@mantine/core';
import { useHotkeys } from '@mantine/hooks';
import { shortenString } from '@lib/functions/String';
import { Fragment, type ReactNode, useMemo } from 'react';
import { shortenString } from '../../functions/tables';
import { useUserSettingsState } from '../../states/SettingsStates';
import { ApiImage } from '../images/ApiImage';
import { StylishText } from '../items/StylishText';

View File

@ -33,6 +33,7 @@ import { useQuery } from '@tanstack/react-query';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { type NavigateFunction, useNavigate } from 'react-router-dom';
import { Boundary } from '@lib/components/Boundary';
import { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import { ModelInformationDict } from '@lib/enums/ModelInformation';
import { ModelType } from '@lib/enums/ModelType';
@ -48,7 +49,6 @@ import { showNotification } from '@mantine/notifications';
import { api } from '../../App';
import { useUserSettingsState } from '../../states/SettingsStates';
import { useUserState } from '../../states/UserState';
import { Boundary } from '../Boundary';
import { RenderInstance } from '../render/Instance';
import { getModelInfo } from '../render/ModelType';

View File

@ -32,6 +32,7 @@ import {
useParams
} from 'react-router-dom';
import { Boundary } from '@lib/components/Boundary';
import type { ModelType } from '@lib/enums/ModelType';
import { identifierString } from '@lib/functions/Conversion';
import { cancelEvent } from '@lib/functions/Events';
@ -43,7 +44,6 @@ import { generateUrl } from '../../functions/urls';
import { usePluginPanels } from '../../hooks/UsePluginPanels';
import { useLocalState } from '../../states/LocalState';
import { vars } from '../../theme';
import { Boundary } from '../Boundary';
import { StylishText } from '../items/StylishText';
import type { PanelGroupType, PanelType } from '../panels/Panel';
import * as classes from './PanelGroup.css';

View File

@ -17,7 +17,9 @@ import {
INVENTREE_REACT_VERSION,
type InvenTreePluginContext
} from '@lib/types/Plugins';
import type { InvenTreeTableRenderProps } from '@lib/types/Tables';
import { i18n } from '@lingui/core';
import { useContextMenu } from 'mantine-contextmenu';
import { defaultLocale } from '../../contexts/LanguageContext';
import {
useAddStockItem,
@ -43,6 +45,7 @@ import {
openGlobalImporter
} from '../../states/ImporterState';
import { useServerApiState } from '../../states/ServerApiState';
import { InvenTreeTableInternal } from '../../tables/InvenTreeTable';
import { RenderInstance } from '../render/Instance';
export const useInvenTreeContext = () => {
@ -54,6 +57,7 @@ export const useInvenTreeContext = () => {
const theme = useMantineTheme();
const globalSettings = useGlobalSettingsState();
const userSettings = useUserSettingsState();
const { showContextMenu } = useContextMenu();
const contextData = useMemo<InvenTreePluginContext>(() => {
return {
@ -83,6 +87,14 @@ export const useInvenTreeContext = () => {
isOpen: () => getGlobalImporterState().isOpen,
sessionId: () => getGlobalImporterState().sessionId
},
tables: {
renderTable: (props: InvenTreeTableRenderProps<any>) => (
<InvenTreeTableInternal
{...props}
showContextMenu={showContextMenu}
/>
)
},
forms: {
bulkEdit: useBulkEditApiFormModal,
create: useCreateApiFormModal,

View File

@ -3,6 +3,7 @@ import { Alert, MantineProvider, Stack, Text } from '@mantine/core';
import { IconExclamationCircle } from '@tabler/icons-react';
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { Boundary } from '@lib/components/Boundary';
import { identifierString } from '@lib/functions/Conversion';
import type { InvenTreePluginContext } from '@lib/types/Plugins';
import { type Root, createRoot } from 'react-dom/client';
@ -10,7 +11,6 @@ import { api, queryClient } from '../../App';
import { ApiProvider } from '../../contexts/ApiContext';
import { LanguageContext } from '../../contexts/LanguageContext';
import { useLocalState } from '../../states/LocalState';
import { Boundary } from '../Boundary';
import { findExternalPluginFunction } from './PluginSource';
/**

View File

@ -21,8 +21,8 @@ import type {
RenderInstanceProps
} from '@lib/types/Rendering';
export type { InstanceRenderInterface } from '@lib/types/Rendering';
import { shortenString } from '@lib/functions/String';
import { useApi } from '../../contexts/ApiContext';
import { shortenString } from '../../functions/tables';
import { Thumbnail } from '../images/Thumbnail';
import { RenderBuildItem, RenderBuildLine, RenderBuildOrder } from './Build';
import {

View File

@ -5,7 +5,7 @@ import type { ReactNode } from 'react';
import { ModelType } from '@lib/enums/ModelType';
import { formatDecimal } from '@lib/functions/Formatting';
import { getDetailUrl } from '@lib/functions/Navigation';
import { shortenString } from '../../functions/tables';
import { shortenString } from '@lib/functions/String';
import { TableHoverCard } from '../../tables/TableHoverCard';
import { ApiIcon } from '../items/ApiIcon';
import { type InstanceRenderInterface, RenderInlineModel } from './Instance';

View File

@ -5,7 +5,7 @@ import type { ReactNode } from 'react';
import { ModelType } from '@lib/enums/ModelType';
import { formatDecimal } from '@lib/functions/Formatting';
import { getDetailUrl } from '@lib/functions/Navigation';
import { shortenString } from '../../functions/tables';
import { shortenString } from '@lib/functions/String';
import { TableHoverCard } from '../../tables/TableHoverCard';
import { ApiIcon } from '../items/ApiIcon';
import {

View File

@ -13,13 +13,13 @@ import {
import { IconEdit } from '@tabler/icons-react';
import { useCallback, useEffect, useMemo, useState } from 'react';
import { Boundary } from '@lib/components/Boundary';
import { ModelInformationDict } from '@lib/enums/ModelInformation';
import { ModelType } from '@lib/enums/ModelType';
import { apiUrl } from '@lib/functions/Api';
import type { Setting } from '@lib/types/Settings';
import { api } from '../../App';
import { vars } from '../../theme';
import { Boundary } from '../Boundary';
import { RenderInstance } from '../render/Instance';
type ConfirmResult = {

View File

@ -1,5 +1,6 @@
import { ActionButton } from '@lib/components/ActionButton';
import { AddItemButton } from '@lib/components/AddItemButton';
import { CopyButton } from '@lib/components/CopyButton';
import { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import { ModelType } from '@lib/enums/ModelType';
import { apiUrl } from '@lib/functions/Api';
@ -32,7 +33,6 @@ import { useCreateApiFormModal } from '../../hooks/UseForm';
import { useInstance } from '../../hooks/UseInstance';
import useWizard from '../../hooks/UseWizard';
import { RenderPartColumn } from '../../tables/ColumnRenderers';
import { CopyButton } from '../buttons/CopyButton';
import RemoveRowButton from '../buttons/RemoveRowButton';
import { StandaloneField } from '../forms/StandaloneField';
import Expand from '../items/Expand';

View File

@ -1,3 +1,4 @@
import { Boundary } from '@lib/components/Boundary';
import { t } from '@lingui/core/macro';
import {
ActionIcon,
@ -16,7 +17,6 @@ import {
IconCircleCheck
} from '@tabler/icons-react';
import { type ReactNode, useCallback, useMemo } from 'react';
import { Boundary } from '../Boundary';
import { StylishText } from '../items/StylishText';
/**

View File

@ -3,11 +3,11 @@ import { I18nProvider } from '@lingui/react';
import { LoadingOverlay, Text } from '@mantine/core';
import { type JSX, useEffect, useRef, useState } from 'react';
import { useStoredTableState } from '@lib/states/StoredTableState';
import { useShallow } from 'zustand/react/shallow';
import { api } from '../App';
import { useLocalState } from '../states/LocalState';
import { useServerApiState } from '../states/ServerApiState';
import { useStoredTableState } from '../states/StoredTableState';
import { fetchGlobalStates } from '../states/states';
export const defaultLocale = 'en';

View File

@ -212,6 +212,10 @@ export const doLogout = async (navigate: NavigateFunction) => {
await authApi(apiUrl(ApiEndpoints.auth_session), undefined, 'delete').catch(
() => {}
);
// remove MFA token (mfa_trusted)
document.cookie =
'mfa_trusted=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
showLoginNotification({
title: t`Logged Out`,
message: t`Successfully logged out`

View File

@ -1,28 +1,6 @@
import type { AxiosResponse } from 'axios';
import type { ApiEndpoints } from '@lib/enums/ApiEndpoints';
import { apiUrl } from '@lib/functions/Api';
import type { PathParams } from '@lib/types/Core';
import { invalidResponse, permissionDenied } from '@lib/functions/Notification';
import type { ApiFormFieldSet, ApiFormFieldType } from '@lib/types/Forms';
import { invalidResponse, permissionDenied } from './notifications';
/**
* Construct an API url from the provided ApiFormProps object
*/
export function constructFormUrl(
url: ApiEndpoints | string,
pk?: string | number,
pathParams?: PathParams,
queryParams?: URLSearchParams
): string {
let formUrl = apiUrl(url, pk, pathParams);
if (queryParams) {
formUrl += `?${queryParams.toString()}`;
}
return formUrl;
}
import type { AxiosResponse } from 'axios';
/**
* Extract the available fields (for a given method) from the response object
@ -104,30 +82,6 @@ export function extractAvailableFields(
return processFields(actions[method]);
}
export type NestedDict = { [key: string]: string | number | NestedDict };
export function mapFields(
fields: ApiFormFieldSet,
fieldFunction: (path: string, value: ApiFormFieldType, key: string) => any,
_path?: string
): NestedDict {
const res: NestedDict = {};
for (const [k, v] of Object.entries(fields)) {
const path = _path ? `${_path}.${k}` : k;
let value: any;
if (v.field_type === 'nested object' && v.children) {
value = mapFields(v.children, fieldFunction, path);
} else {
value = fieldFunction(path, v, k);
}
if (value !== undefined) res[k] = value;
}
return res;
}
/*
* Build a complete field definition based on the provided data
*/

Some files were not shown because too many files have changed in this diff Show More