From 4adf20af1e587a1b273d6e8bd596e7899e8f5710 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:26:48 -0700 Subject: [PATCH 1/4] Fix: hidden canvas element causes scroll bug (#7770) --- src-ui/src/styles.scss | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src-ui/src/styles.scss b/src-ui/src/styles.scss index 412324142..c83ebd493 100644 --- a/src-ui/src/styles.scss +++ b/src-ui/src/styles.scss @@ -680,3 +680,13 @@ code { } } } + +// pdfjs +canvas.hiddenCanvasElement { + position: absolute; + left: 0; + bottom: 0; + z-index: -1; + height: 0; + width: 0; +} From c92c3e224af29b367c0246dbf61806649b0845b7 Mon Sep 17 00:00:00 2001 From: s0llvan <178677095+s0llvan@users.noreply.github.com> Date: Wed, 25 Sep 2024 17:22:12 +0200 Subject: [PATCH 2/4] Feature: page count (#7750) --------- Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com> --- docs/api.md | 1 + src-ui/messages.xlf | 112 +++++++++++------- .../saved-view-widget.component.spec.ts | 2 + .../document-card-large.component.html | 6 + .../document-card-large.component.spec.ts | 2 + .../document-card-small.component.html | 8 ++ .../document-card-small.component.spec.ts | 5 + .../document-list.component.html | 14 +++ .../document-list.component.spec.ts | 6 +- src-ui/src/app/data/document.ts | 8 ++ src-ui/src/app/services/settings.service.ts | 1 + src/documents/bulk_edit.py | 2 + src/documents/consumer.py | 11 +- src/documents/index.py | 3 + .../migrations/1053_document_page_count.py | 62 ++++++++++ src/documents/models.py | 13 ++ src/documents/parsers.py | 3 + src/documents/serialisers.py | 5 + src/documents/tests/test_bulk_edit.py | 7 ++ .../test_migration_document_pages_count.py | 59 +++++++++ src/documents/views.py | 1 + src/paperless_tesseract/parsers.py | 9 ++ src/paperless_tesseract/tests/test_parser.py | 24 ++++ 23 files changed, 319 insertions(+), 45 deletions(-) create mode 100644 src/documents/migrations/1053_document_page_count.py create mode 100644 src/documents/tests/test_migration_document_pages_count.py diff --git a/docs/api.md b/docs/api.md index 057ccaedb..bf9e88659 100644 --- a/docs/api.md +++ b/docs/api.md @@ -54,6 +54,7 @@ fields: - `archived_file_name`: Verbose filename of the archived document. Read-only. Null if no archived document is available. - `notes`: Array of notes associated with the document. +- `page_count`: Number of pages. - `set_permissions`: Allows setting document permissions. Optional, write-only. See [below](#permissions). - `custom_fields`: Array of custom fields & values, specified as diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 201cb5faa..c64cef921 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -1046,11 +1046,11 @@ src/app/data/document.ts - 62 + 63 src/app/data/document.ts - 95 + 100 @@ -1954,11 +1954,11 @@ src/app/data/document.ts - 38 + 39 src/app/data/document.ts - 92 + 97 @@ -2414,7 +2414,7 @@ src/app/components/document-list/document-card-small/document-card-small.component.html - 120 + 128 src/app/components/manage/custom-fields/custom-fields.component.html @@ -2760,7 +2760,7 @@ src/app/data/document.ts - 46 + 47 @@ -2972,7 +2972,7 @@ src/app/components/document-list/document-card-small/document-card-small.component.html - 131 + 139 @@ -3345,11 +3345,11 @@ src/app/data/document.ts - 42 + 43 src/app/data/document.ts - 93 + 98 @@ -5498,7 +5498,7 @@ src/app/components/document-list/document-list.component.html - 277 + 286 @@ -5513,7 +5513,7 @@ src/app/components/document-list/document-list.component.html - 312 + 321 @@ -5528,7 +5528,7 @@ src/app/components/document-list/document-list.component.html - 319 + 328 @@ -5826,11 +5826,11 @@ src/app/data/document.ts - 34 + 35 src/app/data/document.ts - 90 + 95 @@ -5867,11 +5867,11 @@ src/app/data/document.ts - 50 + 51 src/app/data/document.ts - 89 + 94 @@ -5894,11 +5894,11 @@ src/app/data/document.ts - 54 + 55 src/app/data/document.ts - 91 + 96 @@ -5921,7 +5921,7 @@ src/app/data/document.ts - 58 + 59 @@ -6714,7 +6714,7 @@ src/app/components/document-list/document-list.component.html - 288 + 297 @@ -6769,19 +6769,30 @@ 82,83 + + {VAR_PLURAL, plural, =1 {1 page} other { pages}} + + src/app/components/document-list/document-card-large/document-card-large.component.html + 117 + + + src/app/components/document-list/document-card-small/document-card-small.component.html + 95 + + Shared src/app/components/document-list/document-card-large/document-card-large.component.html - 121 + 127 src/app/components/document-list/document-card-small/document-card-small.component.html - 106 + 114 src/app/data/document.ts - 70 + 71 src/app/pipes/username.pipe.ts @@ -6792,7 +6803,7 @@ Score: src/app/components/document-list/document-card-large/document-card-large.component.html - 126 + 132 @@ -6931,11 +6942,11 @@ src/app/data/document.ts - 74 + 75 src/app/data/document.ts - 88 + 93 @@ -6967,11 +6978,11 @@ src/app/data/document.ts - 66 + 67 src/app/data/document.ts - 96 + 101 @@ -7009,25 +7020,51 @@ 243 + + Sort by number of pages + + src/app/components/document-list/document-list.component.html + 252 + + + + Pages + + src/app/components/document-list/document-list.component.html + 256 + + + src/app/data/document.ts + 79 + + + src/app/data/document.ts + 102 + + + src/app/data/paperless-config.ts + 90 + + Shared src/app/components/document-list/document-list.component.html - 250,252 + 259,261 Edit document src/app/components/document-list/document-list.component.html - 284 + 293 Yes src/app/components/document-list/document-list.component.html - 335 + 349 src/app/pipes/yes-no.pipe.ts @@ -7038,7 +7075,7 @@ No src/app/components/document-list/document-list.component.html - 335 + 349 src/app/pipes/yes-no.pipe.ts @@ -7972,14 +8009,14 @@ Modified src/app/data/document.ts - 94 + 99 Search score src/app/data/document.ts - 102 + 108 Score is a value returned by the full text search engine and specifies how well a result matches the given query @@ -8095,13 +8132,6 @@ 83 - - Pages - - src/app/data/paperless-config.ts - 90 - - Mode diff --git a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.spec.ts b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.spec.ts index cb120bb64..ef36b0806 100644 --- a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.spec.ts +++ b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.spec.ts @@ -65,6 +65,7 @@ const savedView: SavedView = { DisplayField.CORRESPONDENT, DisplayField.DOCUMENT_TYPE, DisplayField.STORAGE_PATH, + DisplayField.PAGE_COUNT, `${DisplayField.CUSTOM_FIELD}11` as any, `${DisplayField.CUSTOM_FIELD}15` as any, ], @@ -344,6 +345,7 @@ describe('SavedViewWidgetComponent', () => { expect(component.getColumnTitle(DisplayField.STORAGE_PATH)).toEqual( 'Storage path' ) + expect(component.getColumnTitle(DisplayField.PAGE_COUNT)).toEqual('Pages') }) it('should get correct column title for custom field', () => { diff --git a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html index 1a8c7df82..f60056c42 100644 --- a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html +++ b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.html @@ -111,6 +111,12 @@ } } + @if (displayFields.includes(DisplayField.PAGE_COUNT) && document.page_count) { +
+ + {document.page_count, plural, =1 {1 page} other {{{document.page_count}} pages}} +
+ } @if (displayFields.includes(DisplayField.OWNER) && document.owner && document.owner !== settingsService.currentUser.id) {
{{document.owner | username}} diff --git a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.spec.ts b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.spec.ts index a3f047f03..efd5076be 100644 --- a/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.spec.ts +++ b/src-ui/src/app/components/document-list/document-card-large/document-card-large.component.spec.ts @@ -31,6 +31,7 @@ const doc = { correspondent: 8, document_type: 10, storage_path: null, + page_count: 8, notes: [ { id: 11, @@ -80,6 +81,7 @@ describe('DocumentCardLargeComponent', () => { it('should display a document', () => { expect(fixture.nativeElement.textContent).toContain('Document 10') expect(fixture.nativeElement.textContent).toContain('Cupcake ipsum') + expect(fixture.nativeElement.textContent).toContain('8 pages') }) it('should show preview on mouseover after delay to preload content', fakeAsync(() => { diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html index 92449214e..26f71ee8b 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.html @@ -88,6 +88,14 @@
} + @if (displayFields.includes(DisplayField.PAGE_COUNT) && document.page_count) { +
+
+ + {document.page_count, plural, =1 {1 page} other {{{document.page_count}} pages}} +
+
+ } @if (displayFields.includes(DisplayField.ASN) && document.archive_serial_number | isNumber) {
diff --git a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts index fc15453be..b86453a25 100644 --- a/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts +++ b/src-ui/src/app/components/document-list/document-card-small/document-card-small.component.spec.ts @@ -34,6 +34,7 @@ const doc = { correspondent: 8, document_type: 10, storage_path: null, + page_count: 12, notes: [ { id: 11, @@ -91,6 +92,10 @@ describe('DocumentCardSmallComponent', () => { fixture.detectChanges() }) + it('should display page count', () => { + expect(fixture.nativeElement.textContent).toContain('12 pages') + }) + it('should display a document, limit tags to 5', () => { expect(fixture.nativeElement.textContent).toContain('Document 10') expect( diff --git a/src-ui/src/app/components/document-list/document-list.component.html b/src-ui/src/app/components/document-list/document-list.component.html index 368515970..8ca8e111d 100644 --- a/src-ui/src/app/components/document-list/document-list.component.html +++ b/src-ui/src/app/components/document-list/document-list.component.html @@ -246,6 +246,15 @@ (sort)="onSort($event)" i18n>Added } + @if (activeDisplayFields.includes(DisplayField.PAGE_COUNT)) { + Pages + } @if (activeDisplayFields.includes(DisplayField.SHARED)) { Shared @@ -330,6 +339,11 @@ {{d.added | customDate}} } + @if (activeDisplayFields.includes(DisplayField.PAGE_COUNT)) { + + {{ d.page_count }} + + } @if (activeDisplayFields.includes(DisplayField.SHARED)) { @if (d.is_shared_by_requester) { Yes } @else { No } diff --git a/src-ui/src/app/components/document-list/document-list.component.spec.ts b/src-ui/src/app/components/document-list/document-list.component.spec.ts index 26758b3c0..ad85652b8 100644 --- a/src-ui/src/app/components/document-list/document-list.component.spec.ts +++ b/src-ui/src/app/components/document-list/document-list.component.spec.ts @@ -602,7 +602,7 @@ describe('DocumentListComponent', () => { expect( fixture.debugElement.queryAll(By.directive(SortableDirective)) - ).toHaveLength(9) + ).toHaveLength(10) expect(component.notesEnabled).toBeTruthy() settingsService.set(SETTINGS_KEYS.NOTES_ENABLED, false) @@ -610,14 +610,14 @@ describe('DocumentListComponent', () => { expect(component.notesEnabled).toBeFalsy() expect( fixture.debugElement.queryAll(By.directive(SortableDirective)) - ).toHaveLength(8) + ).toHaveLength(9) // insufficient perms jest.spyOn(permissionService, 'currentUserCan').mockReturnValue(false) fixture.detectChanges() expect( fixture.debugElement.queryAll(By.directive(SortableDirective)) - ).toHaveLength(4) + ).toHaveLength(5) }) it('should support toggle on document objects', () => { diff --git a/src-ui/src/app/data/document.ts b/src-ui/src/app/data/document.ts index 1571d2a53..0b630b8cd 100644 --- a/src-ui/src/app/data/document.ts +++ b/src-ui/src/app/data/document.ts @@ -26,6 +26,7 @@ export enum DisplayField { OWNER = 'owner', SHARED = 'shared', ASN = 'asn', + PAGE_COUNT = 'pagecount', } export const DEFAULT_DISPLAY_FIELDS = [ @@ -73,6 +74,10 @@ export const DEFAULT_DISPLAY_FIELDS = [ id: DisplayField.ASN, name: $localize`ASN`, }, + { + id: DisplayField.PAGE_COUNT, + name: $localize`Pages`, + }, ] export const DEFAULT_DASHBOARD_VIEW_PAGE_SIZE = 10 @@ -94,6 +99,7 @@ export const DOCUMENT_SORT_FIELDS = [ { field: 'modified', name: $localize`Modified` }, { field: 'num_notes', name: $localize`Notes` }, { field: 'owner', name: $localize`Owner` }, + { field: 'page_count', name: $localize`Pages` }, ] export const DOCUMENT_SORT_FIELDS_FULLTEXT = [ @@ -164,4 +170,6 @@ export interface Document extends ObjectWithPermissions { // write-only field remove_inbox_tags?: boolean + + page_count?: number } diff --git a/src-ui/src/app/services/settings.service.ts b/src-ui/src/app/services/settings.service.ts index 91d1cc320..c3ea3f856 100644 --- a/src-ui/src/app/services/settings.service.ts +++ b/src-ui/src/app/services/settings.service.ts @@ -345,6 +345,7 @@ export class SettingsService { DisplayField.CREATED, DisplayField.ADDED, DisplayField.ASN, + DisplayField.PAGE_COUNT, DisplayField.SHARED, ].includes(field.id) ) { diff --git a/src/documents/bulk_edit.py b/src/documents/bulk_edit.py index 1f7a2a403..4481b2b3f 100644 --- a/src/documents/bulk_edit.py +++ b/src/documents/bulk_edit.py @@ -387,6 +387,8 @@ def delete_pages(doc_ids: list[int], pages: list[int]): pdf.remove_unreferenced_resources() pdf.save() doc.checksum = hashlib.md5(doc.source_path.read_bytes()).hexdigest() + if doc.page_count is not None: + doc.page_count = doc.page_count - len(pages) doc.save() update_document_archive_file.delay(document_id=doc.id) logger.info(f"Deleted pages {pages} from document {doc.id}") diff --git a/src/documents/consumer.py b/src/documents/consumer.py index d90b88f5a..57277e4a6 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -586,6 +586,7 @@ class ConsumerPlugin( date = None thumbnail = None archive_path = None + page_count = None try: self._send_progress( @@ -621,6 +622,7 @@ class ConsumerPlugin( ) date = parse_date(self.filename, text) archive_path = document_parser.get_archive_path() + page_count = document_parser.get_page_count(self.working_copy, mime_type) except ParseError as e: document_parser.cleanup() @@ -662,7 +664,12 @@ class ConsumerPlugin( try: with transaction.atomic(): # store the document. - document = self._store(text=text, date=date, mime_type=mime_type) + document = self._store( + text=text, + date=date, + page_count=page_count, + mime_type=mime_type, + ) # If we get here, it was successful. Proceed with post-consume # hooks. If they fail, nothing will get changed. @@ -790,6 +797,7 @@ class ConsumerPlugin( self, text: str, date: Optional[datetime.datetime], + page_count: Optional[int], mime_type: str, ) -> Document: # If someone gave us the original filename, use it instead of doc. @@ -835,6 +843,7 @@ class ConsumerPlugin( created=create_date, modified=create_date, storage_type=storage_type, + page_count=page_count, original_filename=self.filename, ) diff --git a/src/documents/index.py b/src/documents/index.py index d95a80213..03b8c4f35 100644 --- a/src/documents/index.py +++ b/src/documents/index.py @@ -80,6 +80,7 @@ def get_schema(): has_owner=BOOLEAN(), viewer_id=KEYWORD(commas=True), checksum=TEXT(), + page_count=NUMERIC(sortable=True), original_filename=TEXT(sortable=True), is_shared=BOOLEAN(), ) @@ -181,6 +182,7 @@ def update_document(writer: AsyncWriter, doc: Document): has_owner=doc.owner is not None, viewer_id=viewer_ids if viewer_ids else None, checksum=doc.checksum, + page_count=doc.page_count, original_filename=doc.original_filename, is_shared=len(viewer_ids) > 0, ) @@ -247,6 +249,7 @@ class DelayedQuery: "archive_serial_number": "asn", "num_notes": "num_notes", "owner": "owner", + "page_count": "page_count", } if field.startswith("-"): diff --git a/src/documents/migrations/1053_document_page_count.py b/src/documents/migrations/1053_document_page_count.py new file mode 100644 index 000000000..13549e00f --- /dev/null +++ b/src/documents/migrations/1053_document_page_count.py @@ -0,0 +1,62 @@ +# Generated by Django 4.2.16 on 2024-09-21 15:44 +from pathlib import Path + +import pikepdf +from django.conf import settings +from django.db import migrations +from django.db import models +from django.utils.termcolors import colorize as colourise + + +def source_path(self): + if self.filename: + fname = str(self.filename) + + return Path(settings.ORIGINALS_DIR / fname).resolve() + + +def add_number_of_pages_to_page_count(apps, schema_editor): + Document = apps.get_model("documents", "Document") + + if not Document.objects.all().exists(): + return + + for doc in Document.objects.filter(mime_type="application/pdf"): + print( + " {} {} {}".format( + colourise("*", fg="green"), + colourise("Calculating number of pages for", fg="white"), + colourise(doc.filename, fg="cyan"), + ), + ) + + try: + with pikepdf.Pdf.open(source_path(doc)) as pdf: + if pdf.pages is not None: + doc.page_count = len(pdf.pages) + doc.save() + except Exception as e: # pragma: no cover + print(f"Error retrieving number of pages for {doc.filename}: {e}") + + +class Migration(migrations.Migration): + dependencies = [ + ("documents", "1052_document_transaction_id"), + ] + + operations = [ + migrations.AddField( + model_name="document", + name="page_count", + field=models.PositiveIntegerField( + blank=False, + null=True, + unique=False, + db_index=False, + ), + ), + migrations.RunPython( + add_number_of_pages_to_page_count, + migrations.RunPython.noop, + ), + ] diff --git a/src/documents/models.py b/src/documents/models.py index 24e8c2b26..772e10fde 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -205,6 +205,18 @@ class Document(SoftDeleteModel, ModelWithOwner): help_text=_("The checksum of the archived document."), ) + page_count = models.PositiveIntegerField( + _("page count"), + blank=False, + null=True, + unique=False, + db_index=False, + validators=[MinValueValidator(1)], + help_text=_( + "The number of pages of the document.", + ), + ) + created = models.DateTimeField(_("created"), default=timezone.now, db_index=True) modified = models.DateTimeField( @@ -414,6 +426,7 @@ class SavedView(ModelWithOwner): OWNER = ("owner", _("Owner")) SHARED = ("shared", _("Shared")) ASN = ("asn", _("ASN")) + PAGE_COUNT = ("pagecount", _("Pages")) CUSTOM_FIELD = ("custom_field_%d", ("Custom Field")) name = models.CharField(_("name"), max_length=128) diff --git a/src/documents/parsers.py b/src/documents/parsers.py index 1297162e2..63599c0c5 100644 --- a/src/documents/parsers.py +++ b/src/documents/parsers.py @@ -367,6 +367,9 @@ class DocumentParser(LoggingMixin): def extract_metadata(self, document_path, mime_type): return [] + def get_page_count(self, document_path, mime_type): + return None + def parse(self, document_path, mime_type, file_name=None): raise NotImplementedError diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 5218cbf8a..737d1256f 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -750,6 +750,7 @@ class DocumentSerializer( original_file_name = SerializerMethodField() archived_file_name = SerializerMethodField() created_date = serializers.DateField(required=False) + page_count = SerializerMethodField() custom_fields = CustomFieldInstanceSerializer( many=True, @@ -770,6 +771,9 @@ class DocumentSerializer( required=False, ) + def get_page_count(self, obj): + return obj.page_count + def get_original_file_name(self, obj): return obj.original_filename @@ -885,6 +889,7 @@ class DocumentSerializer( "notes", "custom_fields", "remove_inbox_tags", + "page_count", ) list_serializer_class = OwnedObjectListSerializer diff --git a/src/documents/tests/test_bulk_edit.py b/src/documents/tests/test_bulk_edit.py index fed93cd01..d80116a80 100644 --- a/src/documents/tests/test_bulk_edit.py +++ b/src/documents/tests/test_bulk_edit.py @@ -389,6 +389,7 @@ class TestPDFActions(DirectoriesMixin, TestCase): title="B", filename=sample2, mime_type="application/pdf", + page_count=8, ) self.doc2.archive_filename = sample2_archive self.doc2.save() @@ -681,14 +682,20 @@ class TestPDFActions(DirectoriesMixin, TestCase): THEN: - Save should be called once - Archive file should be updated once + - The document's page_count should be reduced by the number of deleted pages """ doc_ids = [self.doc2.id] + initial_page_count = self.doc2.page_count pages = [1, 3] result = bulk_edit.delete_pages(doc_ids, pages) mock_pdf_save.assert_called_once() mock_update_archive_file.assert_called_once() self.assertEqual(result, "OK") + expected_page_count = initial_page_count - len(pages) + self.doc2.refresh_from_db() + self.assertEqual(self.doc2.page_count, expected_page_count) + @mock.patch("documents.tasks.update_document_archive_file.delay") @mock.patch("pikepdf.Pdf.save") def test_delete_pages_with_error(self, mock_pdf_save, mock_update_archive_file): diff --git a/src/documents/tests/test_migration_document_pages_count.py b/src/documents/tests/test_migration_document_pages_count.py new file mode 100644 index 000000000..e656bf1b8 --- /dev/null +++ b/src/documents/tests/test_migration_document_pages_count.py @@ -0,0 +1,59 @@ +import os +import shutil +from pathlib import Path + +from django.conf import settings + +from documents.tests.utils import TestMigrations + + +def source_path_before(self): + if self.filename: + fname = str(self.filename) + + return os.path.join(settings.ORIGINALS_DIR, fname) + + +class TestMigrateDocumentPageCount(TestMigrations): + migrate_from = "1052_document_transaction_id" + migrate_to = "1053_document_page_count" + + def setUpBeforeMigration(self, apps): + Document = apps.get_model("documents", "Document") + doc = Document.objects.create( + title="test1", + mime_type="application/pdf", + filename="file1.pdf", + ) + self.doc_id = doc.id + shutil.copy( + Path(__file__).parent / "samples" / "simple.pdf", + source_path_before(doc), + ) + + def testDocumentPageCountMigrated(self): + Document = self.apps.get_model("documents", "Document") + + doc = Document.objects.get(id=self.doc_id) + self.assertEqual(doc.page_count, 1) + + +class TestMigrateDocumentPageCountBackwards(TestMigrations): + migrate_from = "1053_document_page_count" + migrate_to = "1052_document_transaction_id" + + def setUpBeforeMigration(self, apps): + Document = apps.get_model("documents", "Document") + doc = Document.objects.create( + title="test1", + mime_type="application/pdf", + filename="file1.pdf", + page_count=8, + ) + self.doc_id = doc.id + + def test_remove_number_of_pages_to_page_count(self): + Document = self.apps.get_model("documents", "Document") + self.assertFalse( + "page_count" in [field.name for field in Document._meta.get_fields()], + ) diff --git a/src/documents/views.py b/src/documents/views.py index a8a5bf97d..723eddd00 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -361,6 +361,7 @@ class DocumentViewSet( "archive_serial_number", "num_notes", "owner", + "page_count", ) def get_queryset(self): diff --git a/src/paperless_tesseract/parsers.py b/src/paperless_tesseract/parsers.py index 4e92990f1..5731fe037 100644 --- a/src/paperless_tesseract/parsers.py +++ b/src/paperless_tesseract/parsers.py @@ -41,6 +41,15 @@ class RasterisedDocumentParser(DocumentParser): """ return OcrConfig() + def get_page_count(self, document_path, mime_type): + page_count = None + if mime_type == "application/pdf": + import pikepdf + + with pikepdf.Pdf.open(document_path) as pdf: + page_count = len(pdf.pages) + return page_count + def extract_metadata(self, document_path, mime_type): result = [] if mime_type == "application/pdf": diff --git a/src/paperless_tesseract/tests/test_parser.py b/src/paperless_tesseract/tests/test_parser.py index d63d965c5..45a5939ab 100644 --- a/src/paperless_tesseract/tests/test_parser.py +++ b/src/paperless_tesseract/tests/test_parser.py @@ -57,6 +57,30 @@ class TestParser(DirectoriesMixin, FileSystemAssertsMixin, TestCase): self.assertContainsStrings(text.strip(), ["This is a test document."]) + def test_get_page_count(self): + """ + GIVEN: + - PDF file with a single page + - PDF file with multiple pages + WHEN: + - The number of pages is requested + THEN: + - The method returns 1 as the expected number of pages + - The method returns the correct number of pages (6) + """ + parser = RasterisedDocumentParser(uuid.uuid4()) + page_count = parser.get_page_count( + os.path.join(self.SAMPLE_FILES, "simple-digital.pdf"), + "application/pdf", + ) + self.assertEqual(page_count, 1) + + page_count = parser.get_page_count( + os.path.join(self.SAMPLE_FILES, "multi-page-mixed.pdf"), + "application/pdf", + ) + self.assertEqual(page_count, 6) + def test_thumbnail(self): parser = RasterisedDocumentParser(uuid.uuid4()) thumb = parser.get_thumbnail( From 5e687d9a930d5450a7eee9763f16e96885be26c1 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 25 Sep 2024 08:57:20 -0700 Subject: [PATCH 3/4] Feature: auto-clean some invalid pdfs (#7651) --- docs/advanced_usage.md | 5 +++ src/documents/consumer.py | 38 +++++++++++++++++++- src/documents/serialisers.py | 15 ++++++-- src/documents/tests/samples/invalid_pdf.pdf | Bin 0 -> 215166 bytes src/documents/tests/test_api_documents.py | 21 +++++++++++ src/documents/tests/test_consumer.py | 23 ++++++++++++ src/paperless/settings.py | 2 ++ 7 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 src/documents/tests/samples/invalid_pdf.pdf diff --git a/docs/advanced_usage.md b/docs/advanced_usage.md index 30687680c..fe8d2e305 100644 --- a/docs/advanced_usage.md +++ b/docs/advanced_usage.md @@ -418,6 +418,11 @@ Insurances/ # Insurances Defining a storage path is optional. If no storage path is defined for a document, the global [`PAPERLESS_FILENAME_FORMAT`](configuration.md#PAPERLESS_FILENAME_FORMAT) is applied. +## Automatic recovery of invalid PDFs {#pdf-recovery} + +Paperless will attempt to "clean" certain invalid PDFs with `qpdf` before processing if, for example, the mime_type +detection is incorrect. This can happen if the PDF is not properly formatted or contains errors. + ## Celery Monitoring {#celery-monitoring} The monitoring tool diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 57277e4a6..97910e24b 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -532,6 +532,7 @@ class ConsumerPlugin( ) self.working_copy = Path(tempdir.name) / Path(self.filename) copy_file_with_basic_stats(self.input_doc.original_file, self.working_copy) + self.unmodified_original = None # Determine the parser class. @@ -539,6 +540,37 @@ class ConsumerPlugin( self.log.debug(f"Detected mime type: {mime_type}") + if ( + Path(self.filename).suffix.lower() == ".pdf" + and mime_type in settings.CONSUMER_PDF_RECOVERABLE_MIME_TYPES + ): + try: + # The file might be a pdf, but the mime type is wrong. + # Try to clean with qpdf + self.log.debug( + "Detected possible PDF with wrong mime type, trying to clean with qpdf", + ) + run_subprocess( + [ + "qpdf", + "--replace-input", + self.working_copy, + ], + logger=self.log, + ) + mime_type = magic.from_file(self.working_copy, mime=True) + self.log.debug(f"Detected mime type after qpdf: {mime_type}") + # Save the original file for later + self.unmodified_original = ( + Path(tempdir.name) / Path("uo") / Path(self.filename) + ) + copy_file_with_basic_stats( + self.input_doc.original_file, + self.unmodified_original, + ) + except Exception as e: + self.log.error(f"Error attempting to clean PDF: {e}") + # Based on the mime type, get the parser for that type parser_class: Optional[type[DocumentParser]] = ( get_parser_class_for_mime_type( @@ -689,7 +721,9 @@ class ConsumerPlugin( self._write( document.storage_type, - self.working_copy, + self.unmodified_original + if self.unmodified_original is not None + else self.working_copy, document.source_path, ) @@ -725,6 +759,8 @@ class ConsumerPlugin( self.log.debug(f"Deleting file {self.working_copy}") self.input_doc.original_file.unlink() self.working_copy.unlink() + if self.unmodified_original is not None: # pragma: no cover + self.unmodified_original.unlink() # https://github.com/jonaswinkler/paperless-ng/discussions/1037 shadow_file = os.path.join( diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index 737d1256f..30f3dd26d 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -1389,9 +1389,18 @@ class PostDocumentSerializer(serializers.Serializer): mime_type = magic.from_buffer(document_data, mime=True) if not is_mime_type_supported(mime_type): - raise serializers.ValidationError( - _("File type %(type)s not supported") % {"type": mime_type}, - ) + if ( + mime_type in settings.CONSUMER_PDF_RECOVERABLE_MIME_TYPES + and document.name.endswith( + ".pdf", + ) + ): + # If the file is an invalid PDF, we can try to recover it later in the consumer + mime_type = "application/pdf" + else: + raise serializers.ValidationError( + _("File type %(type)s not supported") % {"type": mime_type}, + ) return document.name, document_data diff --git a/src/documents/tests/samples/invalid_pdf.pdf b/src/documents/tests/samples/invalid_pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f226c2d84d436707091d752d808d471bea6fc3f0 GIT binary patch literal 215166 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

1_+_)H`-ox+;?qq?=Lk>5Vj0tn)X~?Q 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 Date: Thu, 26 Sep 2024 12:22:24 -0700 Subject: [PATCH 4/4] Chore: Drop Python 3.9 support (#7774) --- .github/workflows/ci.yml | 8 +- .pre-commit-config.yaml | 5 +- .python-version | 2 +- .ruff.toml | 2 +- CONTRIBUTING.md | 2 +- Dockerfile | 10 +- Pipfile.lock | 1674 ++++++++--------- docs/setup.md | 2 +- src/documents/barcodes.py | 7 +- src/documents/bulk_edit.py | 3 +- src/documents/caching.py | 12 +- src/documents/classifier.py | 10 +- src/documents/conditionals.py | 15 +- src/documents/consumer.py | 24 +- src/documents/data_models.py | 31 +- src/documents/double_sided.py | 3 +- src/documents/filters.py | 9 +- src/documents/index.py | 5 +- .../management/commands/document_consumer.py | 4 +- .../management/commands/document_exporter.py | 11 +- .../management/commands/document_importer.py | 5 +- src/documents/management/commands/mixins.py | 6 +- src/documents/matching.py | 5 +- src/documents/models.py | 3 +- src/documents/parsers.py | 13 +- src/documents/plugins/base.py | 3 +- src/documents/plugins/helpers.py | 8 +- src/documents/signals/handlers.py | 11 +- src/documents/tasks.py | 3 +- .../tests/test_api_filter_by_custom_fields.py | 2 +- src/documents/tests/test_double_sided.py | 3 +- .../tests/test_migration_archive_files.py | 5 +- ...est_migration_encrypted_webp_conversion.py | 5 +- .../tests/test_migration_webp_conversion.py | 5 +- src/documents/tests/utils.py | 26 +- src/documents/utils.py | 18 +- src/documents/views.py | 5 +- src/paperless/config.py | 9 +- src/paperless/settings.py | 22 +- src/paperless_mail/mail.py | 14 +- src/paperless_mail/parsers.py | 5 +- src/paperless_mail/tests/test_mail.py | 10 +- src/paperless_tesseract/parsers.py | 9 +- src/paperless_tika/parsers.py | 2 +- 44 files changed, 970 insertions(+), 1066 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a7228ed8b..f150020e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,9 +16,9 @@ on: env: # This is the version of pipenv all the steps will use # If changing this, change Dockerfile - DEFAULT_PIP_ENV_VERSION: "2024.0.1" + DEFAULT_PIP_ENV_VERSION: "2024.0.3" # This is the default version of Python to use in most steps which aren't specific - DEFAULT_PYTHON_VERSION: "3.10" + DEFAULT_PYTHON_VERSION: "3.11" jobs: pre-commit: @@ -100,7 +100,7 @@ jobs: - pre-commit strategy: matrix: - python-version: ['3.9', '3.10', '3.11'] + python-version: ['3.10', '3.11', '3.12'] fail-fast: false steps: - @@ -486,7 +486,7 @@ jobs: name: Patch whitenoise run: | curl --fail --silent --show-error --location --output 484.patch https://github.com/evansd/whitenoise/pull/484.patch - patch -d $(pipenv --venv)/lib/python3.10/site-packages --verbose -p2 < 484.patch + patch -d $(pipenv --venv)/lib/python3.11/site-packages --verbose -p2 < 484.patch rm 484.patch - name: Install system dependencies diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c39480421..fb38eaf26 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -48,7 +48,7 @@ repos: exclude: "(^Pipfile\\.lock$)" # Python hooks - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.6.5' + rev: 'v0.6.8' hooks: - id: ruff - id: ruff-format @@ -62,6 +62,9 @@ repos: rev: v6.2.1 hooks: - id: beautysh + language_version: '3.10' + additional_dependencies: + - setuptools args: - "--tab" - repo: https://github.com/shellcheck-py/shellcheck-py diff --git a/.python-version b/.python-version index 8e34c8131..8cc1b46f5 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.9.19 +3.10.15 diff --git a/.ruff.toml b/.ruff.toml index 6331bfaf5..2ac983fe8 100644 --- a/.ruff.toml +++ b/.ruff.toml @@ -2,7 +2,7 @@ fix = true line-length = 88 respect-gitignore = true src = ["src"] -target-version = "py39" +target-version = "py310" output-format = "grouped" show-fixes = true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a7375000b..bbc017d36 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,7 +11,7 @@ If you want to implement something big: ## Python -Paperless supports python 3.9 - 3.11 at this time. We format Python code with [ruff](https://docs.astral.sh/ruff/formatter/). +Paperless supports python 3.10 - 3.12 at this time. We format Python code with [ruff](https://docs.astral.sh/ruff/formatter/). ## Branches diff --git a/Dockerfile b/Dockerfile index 4ef558712..cfc14554e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,7 +39,7 @@ COPY Pipfile* ./ RUN set -eux \ && echo "Installing pipenv" \ - && python3 -m pip install --no-cache-dir --upgrade pipenv==2024.0.1 \ + && python3 -m pip install --no-cache-dir --upgrade pipenv==2024.0.3 \ && echo "Generating requirement.txt" \ && pipenv requirements > requirements.txt @@ -233,11 +233,11 @@ RUN --mount=type=cache,target=/root/.cache/pip/,id=pip-cache \ && python3 -m pip install --no-cache-dir --upgrade wheel \ && echo "Installing Python requirements" \ && curl --fail --silent --show-error --location \ - --output psycopg_c-3.2.1-cp311-cp311-linux_x86_64.whl \ - https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.1/psycopg_c-3.2.1-cp311-cp311-linux_x86_64.whl \ + --output psycopg_c-3.2.2-cp311-cp311-linux_x86_64.whl \ + https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.2/psycopg_c-3.2.2-cp311-cp311-linux_x86_64.whl \ && curl --fail --silent --show-error --location \ - --output psycopg_c-3.2.1-cp311-cp311-linux_aarch64.whl \ - https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.1/psycopg_c-3.2.1-cp311-cp311-linux_aarch64.whl \ + --output psycopg_c-3.2.2-cp311-cp311-linux_aarch64.whl \ + https://github.com/paperless-ngx/builder/releases/download/psycopg-3.2.2/psycopg_c-3.2.2-cp311-cp311-linux_aarch64.whl \ && python3 -m pip install --default-timeout=1000 --find-links . --requirement requirements.txt \ && echo "Patching whitenoise for compression speedup" \ && curl --fail --silent --show-error --location --output 484.patch https://github.com/evansd/whitenoise/pull/484.patch \ diff --git a/Pipfile.lock b/Pipfile.lock index 4b94f6dfe..d9d14ba17 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -24,11 +24,11 @@ }, "anyio": { "hashes": [ - "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94", - "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7" + "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb", + "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a" ], - "markers": "python_version >= '3.8'", - "version": "==4.4.0" + "markers": "python_version >= '3.9'", + "version": "==4.6.0" }, "asgiref": { "hashes": [ @@ -48,11 +48,11 @@ }, "billiard": { "hashes": [ - "sha256:07aa978b308f334ff8282bd4a746e681b3513db5c9a514cbdd810cbbdc19714d", - "sha256:9a3c3184cb275aa17a732f93f65b20c525d3d9f253722d26a82194803ade5a2c" + "sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f", + "sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb" ], "markers": "python_version >= '3.7'", - "version": "==4.2.0" + "version": "==4.2.1" }, "bleach": { "hashes": [ @@ -476,10 +476,10 @@ "socialaccount" ], "hashes": [ - "sha256:54bf0af8dc5c334254dd56f9069447c19b9b623110a095b2a0dcb82a414e1055" + "sha256:1f8281e2dc17d3b977bcd95b99538f128c5cd2fb2551346a7f8ad31aa76f17cc" ], "markers": "python_version >= '3.8'", - "version": "==64.2.1" + "version": "==65.0.1" }, "django-auditlog": { "hashes": [ @@ -594,12 +594,12 @@ }, "filelock": { "hashes": [ - "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec", - "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609" + "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", + "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==3.16.0" + "version": "==3.16.1" }, "flower": { "hashes": [ @@ -828,11 +828,11 @@ }, "idna": { "hashes": [ - "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", - "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" + "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" ], "markers": "python_version >= '3.6'", - "version": "==3.8" + "version": "==3.10" }, "imap-tools": { "hashes": [ @@ -874,11 +874,11 @@ }, "kombu": { "hashes": [ - "sha256:ad200a8dbdaaa2bbc5f26d2ee7d707d9a1fded353a0f4bd751ce8c7d9f449c60", - "sha256:c8dd99820467610b4febbc7a9e8a0d3d7da2d35116b67184418b51cc520ea6b6" + "sha256:14212f5ccf022fc0a70453bb025a1dcc32782a588c49ea866884047d66e14763", + "sha256:eef572dd2fd9fc614b37580e3caeafdd5af46c1eff31e7fba89138cdb406f2cf" ], "markers": "python_version >= '3.8'", - "version": "==5.4.0" + "version": "==5.4.2" }, "langdetect": { "hashes": [ @@ -1050,65 +1050,73 @@ }, "msgpack": { "hashes": [ - "sha256:00e073efcba9ea99db5acef3959efa45b52bc67b61b00823d2a1a6944bf45982", - "sha256:0726c282d188e204281ebd8de31724b7d749adebc086873a59efb8cf7ae27df3", - "sha256:0ceea77719d45c839fd73abcb190b8390412a890df2f83fb8cf49b2a4b5c2f40", - "sha256:114be227f5213ef8b215c22dde19532f5da9652e56e8ce969bf0a26d7c419fee", - "sha256:13577ec9e247f8741c84d06b9ece5f654920d8365a4b636ce0e44f15e07ec693", - "sha256:1876b0b653a808fcd50123b953af170c535027bf1d053b59790eebb0aeb38950", - "sha256:1ab0bbcd4d1f7b6991ee7c753655b481c50084294218de69365f8f1970d4c151", - "sha256:1cce488457370ffd1f953846f82323cb6b2ad2190987cd4d70b2713e17268d24", - "sha256:26ee97a8261e6e35885c2ecd2fd4a6d38252246f94a2aec23665a4e66d066305", - "sha256:3528807cbbb7f315bb81959d5961855e7ba52aa60a3097151cb21956fbc7502b", - "sha256:374a8e88ddab84b9ada695d255679fb99c53513c0a51778796fcf0944d6c789c", - "sha256:376081f471a2ef24828b83a641a02c575d6103a3ad7fd7dade5486cad10ea659", - "sha256:3923a1778f7e5ef31865893fdca12a8d7dc03a44b33e2a5f3295416314c09f5d", - "sha256:4916727e31c28be8beaf11cf117d6f6f188dcc36daae4e851fee88646f5b6b18", - "sha256:493c5c5e44b06d6c9268ce21b302c9ca055c1fd3484c25ba41d34476c76ee746", - "sha256:505fe3d03856ac7d215dbe005414bc28505d26f0c128906037e66d98c4e95868", - "sha256:5845fdf5e5d5b78a49b826fcdc0eb2e2aa7191980e3d2cfd2a30303a74f212e2", - "sha256:5c330eace3dd100bdb54b5653b966de7f51c26ec4a7d4e87132d9b4f738220ba", - "sha256:5dbf059fb4b7c240c873c1245ee112505be27497e90f7c6591261c7d3c3a8228", - "sha256:5e390971d082dba073c05dbd56322427d3280b7cc8b53484c9377adfbae67dc2", - "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273", - "sha256:64d0fcd436c5683fdd7c907eeae5e2cbb5eb872fafbc03a43609d7941840995c", - "sha256:69284049d07fce531c17404fcba2bb1df472bc2dcdac642ae71a2d079d950653", - "sha256:6a0e76621f6e1f908ae52860bdcb58e1ca85231a9b0545e64509c931dd34275a", - "sha256:73ee792784d48aa338bba28063e19a27e8d989344f34aad14ea6e1b9bd83f596", - "sha256:74398a4cf19de42e1498368c36eed45d9528f5fd0155241e82c4082b7e16cffd", - "sha256:7938111ed1358f536daf311be244f34df7bf3cdedb3ed883787aca97778b28d8", - "sha256:82d92c773fbc6942a7a8b520d22c11cfc8fd83bba86116bfcf962c2f5c2ecdaa", - "sha256:83b5c044f3eff2a6534768ccfd50425939e7a8b5cf9a7261c385de1e20dcfc85", - "sha256:8db8e423192303ed77cff4dce3a4b88dbfaf43979d280181558af5e2c3c71afc", - "sha256:9517004e21664f2b5a5fd6333b0731b9cf0817403a941b393d89a2f1dc2bd836", - "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3", - "sha256:99881222f4a8c2f641f25703963a5cefb076adffd959e0558dc9f803a52d6a58", - "sha256:9ee32dcb8e531adae1f1ca568822e9b3a738369b3b686d1477cbc643c4a9c128", - "sha256:a22e47578b30a3e199ab067a4d43d790249b3c0587d9a771921f86250c8435db", - "sha256:b5505774ea2a73a86ea176e8a9a4a7c8bf5d521050f0f6f8426afe798689243f", - "sha256:bd739c9251d01e0279ce729e37b39d49a08c0420d3fee7f2a4968c0576678f77", - "sha256:d16a786905034e7e34098634b184a7d81f91d4c3d246edc6bd7aefb2fd8ea6ad", - "sha256:d3420522057ebab1728b21ad473aa950026d07cb09da41103f8e597dfbfaeb13", - "sha256:d56fd9f1f1cdc8227d7b7918f55091349741904d9520c65f0139a9755952c9e8", - "sha256:d661dc4785affa9d0edfdd1e59ec056a58b3dbb9f196fa43587f3ddac654ac7b", - "sha256:dfe1f0f0ed5785c187144c46a292b8c34c1295c01da12e10ccddfc16def4448a", - "sha256:e1dd7839443592d00e96db831eddb4111a2a81a46b028f0facd60a09ebbdd543", - "sha256:e2872993e209f7ed04d963e4b4fbae72d034844ec66bc4ca403329db2074377b", - "sha256:e2f879ab92ce502a1e65fce390eab619774dda6a6ff719718069ac94084098ce", - "sha256:e3aa7e51d738e0ec0afbed661261513b38b3014754c9459508399baf14ae0c9d", - "sha256:e532dbd6ddfe13946de050d7474e3f5fb6ec774fbb1a188aaf469b08cf04189a", - "sha256:e6b7842518a63a9f17107eb176320960ec095a8ee3b4420b5f688e24bf50c53c", - "sha256:e75753aeda0ddc4c28dce4c32ba2f6ec30b1b02f6c0b14e547841ba5b24f753f", - "sha256:eadb9f826c138e6cf3c49d6f8de88225a3c0ab181a9b4ba792e006e5292d150e", - "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011", - "sha256:ef254a06bcea461e65ff0373d8a0dd1ed3aa004af48839f002a0c994a6f72d04", - "sha256:f3709997b228685fe53e8c433e2df9f0cdb5f4542bd5114ed17ac3c0129b0480", - "sha256:f51bab98d52739c50c56658cc303f190785f9a2cd97b823357e7aeae54c8f68a", - "sha256:f9904e24646570539a8950400602d66d2b2c492b9010ea7e965025cb71d0c86d", - "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d" + "sha256:06f5fd2f6bb2a7914922d935d3b8bb4a7fff3a9a91cfce6d06c13bc42bec975b", + "sha256:071603e2f0771c45ad9bc65719291c568d4edf120b44eb36324dcb02a13bfddf", + "sha256:0907e1a7119b337971a689153665764adc34e89175f9a34793307d9def08e6ca", + "sha256:0f92a83b84e7c0749e3f12821949d79485971f087604178026085f60ce109330", + "sha256:115a7af8ee9e8cddc10f87636767857e7e3717b7a2e97379dc2054712693e90f", + "sha256:13599f8829cfbe0158f6456374e9eea9f44eee08076291771d8ae93eda56607f", + "sha256:17fb65dd0bec285907f68b15734a993ad3fc94332b5bb21b0435846228de1f39", + "sha256:2137773500afa5494a61b1208619e3871f75f27b03bcfca7b3a7023284140247", + "sha256:3180065ec2abbe13a4ad37688b61b99d7f9e012a535b930e0e683ad6bc30155b", + "sha256:398b713459fea610861c8a7b62a6fec1882759f308ae0795b5413ff6a160cf3c", + "sha256:3d364a55082fb2a7416f6c63ae383fbd903adb5a6cf78c5b96cc6316dc1cedc7", + "sha256:3df7e6b05571b3814361e8464f9304c42d2196808e0119f55d0d3e62cd5ea044", + "sha256:41c991beebf175faf352fb940bf2af9ad1fb77fd25f38d9142053914947cdbf6", + "sha256:42f754515e0f683f9c79210a5d1cad631ec3d06cea5172214d2176a42e67e19b", + "sha256:452aff037287acb1d70a804ffd022b21fa2bb7c46bee884dbc864cc9024128a0", + "sha256:4676e5be1b472909b2ee6356ff425ebedf5142427842aa06b4dfd5117d1ca8a2", + "sha256:46c34e99110762a76e3911fc923222472c9d681f1094096ac4102c18319e6468", + "sha256:471e27a5787a2e3f974ba023f9e265a8c7cfd373632247deb225617e3100a3c7", + "sha256:4a1964df7b81285d00a84da4e70cb1383f2e665e0f1f2a7027e683956d04b734", + "sha256:4b51405e36e075193bc051315dbf29168d6141ae2500ba8cd80a522964e31434", + "sha256:4d1b7ff2d6146e16e8bd665ac726a89c74163ef8cd39fa8c1087d4e52d3a2325", + "sha256:53258eeb7a80fc46f62fd59c876957a2d0e15e6449a9e71842b6d24419d88ca1", + "sha256:534480ee5690ab3cbed89d4c8971a5c631b69a8c0883ecfea96c19118510c846", + "sha256:58638690ebd0a06427c5fe1a227bb6b8b9fdc2bd07701bec13c2335c82131a88", + "sha256:58dfc47f8b102da61e8949708b3eafc3504509a5728f8b4ddef84bd9e16ad420", + "sha256:59caf6a4ed0d164055ccff8fe31eddc0ebc07cf7326a2aaa0dbf7a4001cd823e", + "sha256:5dbad74103df937e1325cc4bfeaf57713be0b4f15e1c2da43ccdd836393e2ea2", + "sha256:5e1da8f11a3dd397f0a32c76165cf0c4eb95b31013a94f6ecc0b280c05c91b59", + "sha256:646afc8102935a388ffc3914b336d22d1c2d6209c773f3eb5dd4d6d3b6f8c1cb", + "sha256:64fc9068d701233effd61b19efb1485587560b66fe57b3e50d29c5d78e7fef68", + "sha256:65553c9b6da8166e819a6aa90ad15288599b340f91d18f60b2061f402b9a4915", + "sha256:685ec345eefc757a7c8af44a3032734a739f8c45d1b0ac45efc5d8977aa4720f", + "sha256:6ad622bf7756d5a497d5b6836e7fc3752e2dd6f4c648e24b1803f6048596f701", + "sha256:73322a6cc57fcee3c0c57c4463d828e9428275fb85a27aa2aa1a92fdc42afd7b", + "sha256:74bed8f63f8f14d75eec75cf3d04ad581da6b914001b474a5d3cd3372c8cc27d", + "sha256:79ec007767b9b56860e0372085f8504db5d06bd6a327a335449508bbee9648fa", + "sha256:7a946a8992941fea80ed4beae6bff74ffd7ee129a90b4dd5cf9c476a30e9708d", + "sha256:7ad442d527a7e358a469faf43fda45aaf4ac3249c8310a82f0ccff9164e5dccd", + "sha256:7c9a35ce2c2573bada929e0b7b3576de647b0defbd25f5139dcdaba0ae35a4cc", + "sha256:7e7b853bbc44fb03fbdba34feb4bd414322180135e2cb5164f20ce1c9795ee48", + "sha256:879a7b7b0ad82481c52d3c7eb99bf6f0645dbdec5134a4bddbd16f3506947feb", + "sha256:8a706d1e74dd3dea05cb54580d9bd8b2880e9264856ce5068027eed09680aa74", + "sha256:8a84efb768fb968381e525eeeb3d92857e4985aacc39f3c47ffd00eb4509315b", + "sha256:8cf9e8c3a2153934a23ac160cc4cba0ec035f6867c8013cc6077a79823370346", + "sha256:8da4bf6d54ceed70e8861f833f83ce0814a2b72102e890cbdfe4b34764cdd66e", + "sha256:8e59bca908d9ca0de3dc8684f21ebf9a690fe47b6be93236eb40b99af28b6ea6", + "sha256:914571a2a5b4e7606997e169f64ce53a8b1e06f2cf2c3a7273aa106236d43dd5", + "sha256:a51abd48c6d8ac89e0cfd4fe177c61481aca2d5e7ba42044fd218cfd8ea9899f", + "sha256:a52a1f3a5af7ba1c9ace055b659189f6c669cf3657095b50f9602af3a3ba0fe5", + "sha256:ad33e8400e4ec17ba782f7b9cf868977d867ed784a1f5f2ab46e7ba53b6e1e1b", + "sha256:b4c01941fd2ff87c2a934ee6055bda4ed353a7846b8d4f341c428109e9fcde8c", + "sha256:bce7d9e614a04d0883af0b3d4d501171fbfca038f12c77fa838d9f198147a23f", + "sha256:c40ffa9a15d74e05ba1fe2681ea33b9caffd886675412612d93ab17b58ea2fec", + "sha256:c5a91481a3cc573ac8c0d9aace09345d989dc4a0202b7fcb312c88c26d4e71a8", + "sha256:c921af52214dcbb75e6bdf6a661b23c3e6417f00c603dd2070bccb5c3ef499f5", + "sha256:d46cf9e3705ea9485687aa4001a76e44748b609d260af21c4ceea7f2212a501d", + "sha256:d8ce0b22b890be5d252de90d0e0d119f363012027cf256185fc3d474c44b1b9e", + "sha256:dd432ccc2c72b914e4cb77afce64aab761c1137cc698be3984eee260bcb2896e", + "sha256:e0856a2b7e8dcb874be44fea031d22e5b3a19121be92a1e098f46068a11b0870", + "sha256:e1f3c3d21f7cf67bcf2da8e494d30a75e4cf60041d98b3f79875afb5b96f3a3f", + "sha256:f1ba6136e650898082d9d5a5217d5906d1e138024f836ff48691784bbe1adf96", + "sha256:f3e9b4936df53b970513eac1758f3882c88658a220b58dcc1e39606dccaaf01c", + "sha256:f80bc7d47f76089633763f952e67f8214cb7b3ee6bfa489b3cb6a84cfac114cd", + "sha256:fd2906780f25c8ed5d7b323379f6138524ba793428db5d0e9d226d3fa6aa1788" ], "markers": "python_version >= '3.8'", - "version": "==1.0.8" + "version": "==1.1.0" }, "mysqlclient": { "hashes": [ @@ -1137,54 +1145,62 @@ }, "numpy": { "hashes": [ - "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", - "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", - "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", - "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", - "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", - "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", - "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", - "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", - "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", - "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", - "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", - "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", - "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", - "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", - "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", - "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", - "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", - "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", - "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", - "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", - "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", - "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", - "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", - "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", - "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", - "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", - "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", - "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", - "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", - "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", - "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", - "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", - "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", - "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", - "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", - "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", - "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", - "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", - "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", - "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", - "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", - "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", - "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", - "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", - "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd" + "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", + "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", + "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", + "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", + "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", + "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", + "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", + "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", + "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", + "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", + "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", + "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", + "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", + "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", + "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", + "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", + "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", + "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", + "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", + "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", + "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", + "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", + "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", + "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", + "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", + "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", + "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", + "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", + "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", + "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", + "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", + "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", + "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", + "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", + "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", + "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", + "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", + "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", + "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", + "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", + "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", + "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", + "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", + "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", + "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", + "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", + "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", + "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", + "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", + "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", + "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", + "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", + "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b" ], - "markers": "python_version >= '3.9'", - "version": "==2.0.2" + "markers": "python_version >= '3.10'", + "version": "==2.1.1" }, "oauthlib": { "hashes": [ @@ -1391,36 +1407,36 @@ }, "prometheus-client": { "hashes": [ - "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89", - "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7" + "sha256:4fa6b4dd0ac16d58bb587c04b1caae65b8c5043e85f778f42f5f632f6af2e166", + "sha256:96c83c606b71ff2b0a433c98889d275f51ffec6c5e267de37c7a2b5c9aa9233e" ], "markers": "python_version >= '3.8'", - "version": "==0.20.0" + "version": "==0.21.0" }, "prompt-toolkit": { "hashes": [ - "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", - "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" + "sha256:d6623ab0477a80df74e646bdbc93621143f5caf104206aa29294d53de1a03d90", + "sha256:f49a827f90062e411f1ce1f854f2aedb3c23353244f8108b89283587397ac10e" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.47" + "version": "==3.0.48" }, "psycopg": { "extras": [ "c" ], "hashes": [ - "sha256:dc8da6dc8729dacacda3cc2f17d2c9397a70a66cf0d2b69c91065d60d5f00cb7", - "sha256:ece385fb413a37db332f97c49208b36cf030ff02b199d7635ed2fbd378724175" + "sha256:8bad2e497ce22d556dac1464738cb948f8d6bab450d965cf1d8a8effd52412e0", + "sha256:babf565d459d8f72fb65da5e211dd0b58a52c51e4e1fa9cadecff42d6b7619b2" ], "markers": "python_version >= '3.8'", - "version": "==3.2.1" + "version": "==3.2.2" }, "psycopg-c": { "hashes": [ - "sha256:2d09943cc8a855c42c1e23b4298957b7ce8f27bf3683258c52fd139f601f7cda" + "sha256:de8cac75bc6640ef0f54ad9187b81e07c430206a83c566b73d4cca41ecccb7c8" ], - "version": "==3.2.1" + "version": "==3.2.2" }, "pycparser": { "hashes": [ @@ -1468,11 +1484,11 @@ }, "python-gnupg": { "hashes": [ - "sha256:01d8013931c9fa3f45824bbea7054c03d6e11f258a72e7e086e168dbcb91854c", - "sha256:72ce142af6da7f07e433fef148b445fb3e07854acd2f88739008838745c0e9f5" + "sha256:290d8ddb9cd63df96cfe9284b9b265f19fd6e145e5582dc58fd7271f026d0a47", + "sha256:2f8a4c6f63766feca6cc1416408f8b84e1b914fe7b54514e570fc5cbe92e9248" ], "index": "pypi", - "version": "==0.5.2" + "version": "==0.5.3" }, "python-ipware": { "hashes": [ @@ -1494,10 +1510,10 @@ }, "pytz": { "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" + "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", + "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725" ], - "version": "==2024.1" + "version": "==2024.2" }, "pyyaml": { "hashes": [ @@ -1568,118 +1584,98 @@ }, "rapidfuzz": { "hashes": [ - "sha256:03126f9a040ff21d2a110610bfd6b93b79377ce8b4121edcb791d61b7df6eec5", - "sha256:048d55d36c02c6685a2b2741688503c3d15149694506655b6169dcfd3b6c2585", - "sha256:057bb03f39e285047d7e9412e01ecf31bb2d42b9466a5409d715d587460dd59b", - "sha256:0b1c2d504eddf97bc0f2eba422c8915576dbf025062ceaca2d68aecd66324ad9", - "sha256:0d1415a732ee75e74a90af12020b77a0b396b36c60afae1bde3208a78cd2c9fc", - "sha256:0e9125377fa3d21a8abd4fbdbcf1c27be73e8b1850f0b61b5b711364bf3b59db", - "sha256:110b6294396bc0a447648627479c9320f095c2034c0537f687592e0f58622638", - "sha256:111a20a3c090cf244d9406e60500b6c34b2375ba3a5009e2b38fd806fe38e337", - "sha256:13d8675a1fa7e2b19650ca7ef9a6ec01391d4bb12ab9e0793e8eb024538b4a34", - "sha256:18669bb6cdf7d40738526d37e550df09ba065b5a7560f3d802287988b6cb63cf", - "sha256:19c64d8ddb2940b42a4567b23f1681af77f50a5ff6c9b8e85daba079c210716e", - "sha256:1dc516ac6d32027be2b0196bedf6d977ac26debd09ca182376322ad620460feb", - "sha256:1de91e7fd7f525e10ea79a6e62c559d1b0278ec097ad83d9da378b6fab65a265", - "sha256:1ee2086f490cb501d86b7e386c1eb4e3a0ccbb0c99067089efaa8c79012c8952", - "sha256:1ef6a1a8f0b12f8722f595f15c62950c9a02d5abc64742561299ffd49f6c6944", - "sha256:1f1a33e84056b7892c721d84475d3bde49a145126bc4c6efe0d6d0d59cb31c29", - "sha256:22589c0b8ccc6c391ce7f776c93a8c92c96ab8d34e1a19f1bd2b12a235332632", - "sha256:2379e0b2578ad3ac7004f223251550f08bca873ff76c169b09410ec562ad78d8", - "sha256:268f8e1ca50fc61c0736f3fe9d47891424adf62d96ed30196f30f4bd8216b41f", - "sha256:3171653212218a162540a3c8eb8ae7d3dcc8548540b69eaecaf3b47c14d89c90", - "sha256:32532af1d70c6ec02ea5ac7ee2766dfff7c8ae8c761abfe8da9e527314e634e8", - "sha256:3445a35c4c8d288f2b2011eb61bce1227c633ce85a3154e727170f37c0266bb2", - "sha256:3492c7a42b7fa9f0051d7fcce9893e95ed91c97c9ec7fb64346f3e070dd318ed", - "sha256:35d3044cb635ca6b1b2b7b67b3597bd19f34f1753b129eb6d2ae04cf98cd3945", - "sha256:364587827d7cbd41afa0782adc2d2d19e3f07d355b0750a02a8e33ad27a9c368", - "sha256:3665b92e788578c3bb334bd5b5fa7ee1a84bafd68be438e3110861d1578c63a0", - "sha256:36dd6e820379c37a1ffefc8a52b648758e867cd9d78ee5b5dc0c9a6a10145378", - "sha256:3ed5adb752f4308fcc8f4fb6f8eb7aa4082f9d12676fda0a74fa5564242a8107", - "sha256:47e92c155a14f44511ea8ebcc6bc1535a1fe8d0a7d67ad3cc47ba61606df7bcf", - "sha256:4ff196996240db7075f62c7bc4506f40a3c80cd4ae3ab0e79ac6892283a90859", - "sha256:521c58c72ed8a612b25cda378ff10dee17e6deb4ee99a070b723519a345527b9", - "sha256:5551d68264c1bb6943f542da83a4dc8940ede52c5847ef158698799cc28d14f5", - "sha256:578302828dd97ee2ba507d2f71d62164e28d2fc7bc73aad0d2d1d2afc021a5d5", - "sha256:579d107102c0725f7c79b4e79f16d3cf4d7c9208f29c66b064fa1fd4641d5155", - "sha256:591908240f4085e2ade5b685c6e8346e2ed44932cffeaac2fb32ddac95b55c7f", - "sha256:5a93c9e60904cb76e7aefef67afffb8b37c4894f81415ed513db090f29d01101", - "sha256:5d1eff95362f993b0276fd3839aee48625b09aac8938bb0c23b40d219cba5dc5", - "sha256:5d5262383634626eb45c536017204b8163a03bc43bda880cf1bdd7885db9a163", - "sha256:5f8bf3f0d02935751d8660abda6044821a861f6229f7d359f98bcdcc7e66c39b", - "sha256:603f48f621272a448ff58bb556feb4371252a02156593303391f5c3281dfaeac", - "sha256:675b75412a943bb83f1f53e2e54fd18c80ef15ed642dc6eb0382d1949419d904", - "sha256:68bd888eafd07b09585dcc8bc2716c5ecdb7eed62827470664d25588982b2873", - "sha256:696a79018ef989bf1c9abd9005841cee18005ccad4748bad8a4c274c47b6241a", - "sha256:6c5b32875646cb7f60c193ade99b2e4b124f19583492115293cd00f6fb198b17", - "sha256:6f83221db5755b8f34222e40607d87f1176a8d5d4dbda4a55a0f0b67d588a69c", - "sha256:6fb76e5a21034f0307c51c5a2fc08856f698c53a4c593b17d291f7d6e9d09ca3", - "sha256:7abe2dbae81120a64bb4f8d3fcafe9122f328c9f86d7f327f174187a5af4ed86", - "sha256:7b702de95666a1f7d5c6b47eacadfe2d2794af3742d63d2134767d13e5d1c713", - "sha256:7c20c1474b068c4bd45bf2fd0ad548df284f74e9a14a68b06746c56e3aa8eb70", - "sha256:836f4d88b8bd0fff2ebe815dcaab8aa6c8d07d1d566a7e21dd137cf6fe11ed5b", - "sha256:8501000a5eb8037c4b56857724797fe5a8b01853c363de91c8d0d0ad56bef319", - "sha256:8772b745668260c5c4d069c678bbaa68812e6c69830f3771eaad521af7bc17f8", - "sha256:8b01153c7466d0bad48fba77a303d5a768e66f24b763853469f47220b3de4661", - "sha256:8d92c552c6b7577402afdd547dcf5d31ea6c8ae31ad03f78226e055cfa37f3c6", - "sha256:9030e7238c0df51aed5c9c5ed8eee2bdd47a2ae788e562c1454af2851c3d1906", - "sha256:90db86fa196eecf96cb6db09f1083912ea945c50c57188039392d810d0b784e1", - "sha256:948dcee7aaa1cd14358b2a7ef08bf0be42bf89049c3a906669874a715fc2c937", - "sha256:94baaeea0b4f8632a6da69348b1e741043eba18d4e3088d674d3f76586b6223d", - "sha256:953b3780765c8846866faf891ee4290f6a41a6dacf4fbcd3926f78c9de412ca6", - "sha256:95b8292383e717e10455f2c917df45032b611141e43d1adf70f71b1566136b11", - "sha256:965693c2e9efd425b0f059f5be50ef830129f82892fa1858e220e424d9d0160f", - "sha256:97f2ce529d2a70a60c290f6ab269a2bbf1d3b47b9724dccc84339b85f7afb044", - "sha256:9b6a5de507b9be6de688dae40143b656f7a93b10995fb8bd90deb555e7875c60", - "sha256:9dba13d86806fcf3fe9c9919f58575e0090eadfb89c058bde02bcc7ab24e4548", - "sha256:9dc86aa6b29d174713c5f4caac35ffb7f232e3e649113e8d13812b35ab078228", - "sha256:9dcd14cf4876f04b488f6e54a7abd3e9b31db5f5a6aba0ce90659917aaa8c088", - "sha256:a3b36e1c61b796ae1777f3e9e11fd39898b09d351c9384baf6e3b7e6191d8ced", - "sha256:a3c0783910911f4f24655826d007c9f4360f08107410952c01ee3df98c713eb2", - "sha256:a40184c67db8252593ec518e17fb8a6e86d7259dc9f2d6c0bf4ff4db8cf1ad4b", - "sha256:a4da514d13f4433e16960a17f05b67e0af30ac771719c9a9fb877e5004f74477", - "sha256:a8feac9006d5c9758438906f093befffc4290de75663dbb2098461df7c7d28dd", - "sha256:a93cd834b3c315ab437f0565ee3a2f42dd33768dc885ccbabf9710b131cf70d2", - "sha256:ae1a38bade755aa9dd95a81cda949e1bf9cd92b79341ccc5e2189c9e7bdfc5ec", - "sha256:b23806fbdd6b510ba9ac93bb72d503066263b0fba44b71b835be9f063a84025f", - "sha256:b4f86e09d3064dca0b014cd48688964036a904a2d28048f00c8f4640796d06a8", - "sha256:b997ff3b39d4cee9fb025d6c46b0a24bd67595ce5a5b652a97fb3a9d60beb651", - "sha256:be3a1fc3e2ab3bdf93dc0c83c00acca8afd2a80602297d96cf4a0ba028333cdf", - "sha256:c12d180b17a22d107c8747de9c68d0b9c1d15dcda5445ff9bf9f4ccfb67c3e16", - "sha256:c1318d42610c26dcd68bd3279a1bf9e3605377260867c9a8ed22eafc1bd93a7c", - "sha256:c33211cfff9aec425bb1bfedaf94afcf337063aa273754f22779d6dadebef4c2", - "sha256:c4eebf6c93af0ae866c22b403a84747580bb5c10f0d7b51c82a87f25405d4dcb", - "sha256:c4f28f1930b09a2c300357d8465b388cecb7e8b2f454a5d5425561710b7fd07f", - "sha256:ca66676c8ef6557f9b81c5b2b519097817a7c776a6599b8d6fcc3e16edd216fe", - "sha256:ccf68e30b80e903f2309f90a438dbd640dd98e878eeb5ad361a288051ee5b75c", - "sha256:cd9360e30041690912525a210e48a897b49b230768cc8af1c702e5395690464f", - "sha256:cfa74aac64c85898b93d9c80bb935a96bf64985e28d4ee0f1a3d1f3bf11a5106", - "sha256:d098ce6162eb5e48fceb0745455bc950af059df6113eec83e916c129fca11408", - "sha256:d1230e0f9026851a6a432beaa0ce575dda7b39fe689b576f99a0704fbb81fc9c", - "sha256:d4ba2318ef670ce505f42881a5d2af70f948124646947341a3c6ccb33cd70369", - "sha256:d4e049d5ad61448c9a020d1061eba20944c4887d720c4069724beb6ea1692507", - "sha256:d73ee2df41224c87336448d279b5b6a3a75f36e41dd3dcf538c0c9cce36360d8", - "sha256:d7df9c2194c7ec930b33c991c55dbd0c10951bd25800c0b7a7b571994ebbced5", - "sha256:d95751f505a301af1aaf086c19f34536056d6c8efa91b2240de532a3db57b543", - "sha256:dd5fa6e3c6e0333051c1f3a49f0807b3366f4131c8d6ac8c3e05fd0d0ce3755c", - "sha256:df596ddd3db38aa513d4c0995611267b3946e7cbe5a8761b50e9306dfec720ee", - "sha256:e2957fdad10bb83b1982b02deb3604a3f6911a5e545f518b59c741086f92d152", - "sha256:e3dcfbe7266e74a707173a12a7b355a531f2dcfbdb32f09468e664330da14874", - "sha256:e6d9db2fa4e9be171e9bb31cf2d2575574774966b43f5b951062bb2e67885852", - "sha256:e9012d86c6397edbc9da4ac0132de7f8ee9d6ce857f4194d5684c4ddbcdd1c5c", - "sha256:e9fbf659537d246086d0297628b3795dc3e4a384101ecc01e5791c827b8d7345", - "sha256:ecc24af7f905f3d6efb371a01680116ffea8d64e266618fb9ad1602a9b4f7934", - "sha256:ece45eb2af8b00f90d10f7419322e8804bd42fb1129026f9bfe712c37508b514", - "sha256:f1c7296534c1afb6f495aa95871f14ccdc197c6db42965854e483100df313030", - "sha256:f847fb0fbfb72482b1c05c59cbb275c58a55b73708a7f77a83f8035ee3c86497", - "sha256:fbda3dd68d8b28ccb20ffb6f756fefd9b5ba570a772bedd7643ed441f5793308", - "sha256:fc3e6081069eea61593f1d6839029da53d00c8c9b205c5534853eaa3f031085c", - "sha256:fcf79b686962d7bec458a0babc904cb4fa319808805e036b9d5a531ee6b9b835", - "sha256:fde81b1da9a947f931711febe2e2bee694e891f6d3e6aa6bc02c1884702aea19" + "sha256:094c26116d55bf9c53abd840d08422f20da78ec4c4723e5024322321caedca48", + "sha256:0ec338d5f4ad8d9339a88a08db5c23e7f7a52c2b2a10510c48a0cef1fb3f0ddc", + "sha256:10fdad800441b9c97d471a937ba7d42625f1b530db05e572f1cb7d401d95c893", + "sha256:116c71a81e046ba56551d8ab68067ca7034d94b617545316d460a452c5c3c289", + "sha256:1af60988d47534246d9525f77288fdd9de652608a4842815d9018570b959acc6", + "sha256:2026651761bf83a0f31495cc0f70840d5c0d54388f41316e3f9cb51bd85e49a5", + "sha256:20bd153aacc244e4c907d772c703fea82754c4db14f8aa64d75ff81b7b8ab92d", + "sha256:26de93e6495078b6af4c4d93a42ca067b16cc0e95699526c82ab7d1025b4d3bf", + "sha256:288f6f6e7410cacb115fb851f3f18bf0e4231eb3f6cb5bd1cec0e7b25c4d039d", + "sha256:2db9187f3acf3cd33424ecdbaad75414c298ecd1513470df7bda885dcb68cc15", + "sha256:2e9be5d05cd960914024412b5406fb75a82f8562f45912ff86255acbfdbfb78e", + "sha256:2fe5783676f0afba4a522c80b15e99dbf4e393c149ab610308a8ef1f04c6bcc8", + "sha256:3084161fc3e963056232ef8d937449a2943852e07101f5a136c8f3cfa4119217", + "sha256:34f213d59219a9c3ca14e94a825f585811a68ac56b4118b4dc388b5b14afc108", + "sha256:399b9b79ccfcf50ca3bad7692bc098bb8eade88d7d5e15773b7f866c91156d0c", + "sha256:43dfc5e733808962a822ff6d9c29f3039a3cfb3620706f5953e17cfe4496724c", + "sha256:457827ba82261aa2ae6ac06a46d0043ab12ba7216b82d87ae1434ec0f29736d6", + "sha256:47aca565a39c9a6067927871973ca827023e8b65ba6c5747f4c228c8d7ddc04f", + "sha256:4bd1a7676ee2a4c8e2f7f2550bece994f9f89e58afb96088964145a83af7408b", + "sha256:4dd3d8443970eaa02ab5ae45ce584b061f2799cd9f7e875190e2617440c1f9d4", + "sha256:4df75b3ebbb8cfdb9bf8b213b168620b88fd92d0c16a8bc9f9234630b282db59", + "sha256:50484d563f8bfa723c74c944b0bb15b9e054db9c889348c8c307abcbee75ab92", + "sha256:50e3d0c72ea15391ba9531ead7f2068a67c5b18a6a365fef3127583aaadd1725", + "sha256:545fc04f2d592e4350f59deb0818886c1b444ffba3bec535b4fbb97191aaf769", + "sha256:56fd15ea8f4c948864fa5ebd9261c67cf7b89a1c517a0caef4df75446a7af18c", + "sha256:5897242d455461f2c5b82d7397b29341fd11e85bf3608a522177071044784ee8", + "sha256:5d350864269d56f51ab81ab750c9259ae5cad3152c0680baef143dcec92206a1", + "sha256:5dd6eec15b13329abe66cc241b484002ecb0e17d694491c944a22410a6a9e5e2", + "sha256:63e4c175cbce8c3adc22dca5e6154588ae673f6c55374d156f3dac732c88d7de", + "sha256:69ef5b363afff7150a1fbe788007e307b9802a2eb6ad92ed51ab94e6ad2674c6", + "sha256:6b62af27e65bb39276a66533655a2fa3c60a487b03935721c45b7809527979be", + "sha256:6cd67d3d017296d98ff505529104299f78433e4b8af31b55003d901a62bbebe9", + "sha256:718c9bd369288aca5fa929df6dbf66fdbe9768d90940a940c0b5cdc96ade4309", + "sha256:76a35e9e19a7c883c422ffa378e9a04bc98cb3b29648c5831596401298ee51e6", + "sha256:7947a425d1be3e744707ee58c6cb318b93a56e08f080722dcc0347e0b7a1bb9a", + "sha256:79e7f98525b60b3c14524e0a4e1fedf7654657b6e02eb25f1be897ab097706f3", + "sha256:7c4c82b1689b23b1b5e6a603164ed2be41b6f6de292a698b98ba2381e889eb9d", + "sha256:7dc87073ba3a40dd65591a2100aa71602107443bf10770579ff9c8a3242edb94", + "sha256:7f3a6aa6e70fc27e4ff5c479f13cc9fc26a56347610f5f8b50396a0d344c5f55", + "sha256:803f255f10d63420979b1909ef976e7d30dec42025c9b067fc1d2040cc365a7e", + "sha256:884453860de029380dded8f3c1918af2d8eb5adf8010261645c7e5c88c2b5428", + "sha256:886882367dbc985f5736356105798f2ae6e794e671fc605476cbe2e73838a9bb", + "sha256:8a6405d34c394c65e4f73a1d300c001f304f08e529d2ed6413b46ee3037956eb", + "sha256:916a6abf3632e592b937c3d04c00a6efadd8fd30539cdcd4e6e4d92be7ca5d90", + "sha256:9178277f72d144a6c7704d7ae7fa15b7b86f0f0796f0e1049c7b4ef748a662ef", + "sha256:949b5e9eeaa4ecb4c7e9c2a4689dddce60929dd1ff9c76a889cdbabe8bbf2171", + "sha256:94c48b4a2a4b1d22246f48e2b11cae01ec7d23f0c9123f8bb822839ad79d0a88", + "sha256:96ad46f5f56f70fab2be9e5f3165a21be58d633b90bf6e67fc52a856695e4bcf", + "sha256:98f6ebe28831a482981ecfeedc8237047878424ad0c1add2c7f366ba44a20452", + "sha256:9eac95b4278bd53115903d89118a2c908398ee8bdfd977ae844f1bd2b02b917c", + "sha256:a425a0a868cf8e9c6e93e1cda4b758cdfd314bb9a4fc916c5742c934e3613480", + "sha256:a68e3724b7dab761c01816aaa64b0903734d999d5589daf97c14ef5cc0629a8e", + "sha256:a86d5d1d75e61df060c1e56596b6b0a4422a929dff19cc3dbfd5eee762c86b61", + "sha256:a9b8f51e08c3f983d857c3889930af9ddecc768453822076683664772d87e374", + "sha256:aadce42147fc09dcef1afa892485311e824c050352e1aa6e47f56b9b27af4cf0", + "sha256:ae7966f205b5a7fde93b44ca8fed37c1c8539328d7f179b1197de34eceaceb5f", + "sha256:b0445fa9880ead81f5a7d0efc0b9c977a947d8052c43519aceeaf56eabaf6843", + "sha256:b0732343cdc4273b5921268026dd7266f75466eb21873cb7635a200d9d9c3fac", + "sha256:b11a127ac590fc991e8a02c2d7e1ac86e8141c92f78546f18b5c904064a0552c", + "sha256:b33e13e537e3afd1627d421a142a12bbbe601543558a391a6fae593356842f6e", + "sha256:b5363932a5aab67010ae1a6205c567d1ef256fb333bc23c27582481606be480c", + "sha256:b54853c2371bf0e38d67da379519deb6fbe70055efb32f6607081641af3dc752", + "sha256:b67cc21a14327a0eb0f47bc3d7e59ec08031c7c55220ece672f9476e7a8068d3", + "sha256:bb0013795b40db5cf361e6f21ee7cda09627cf294977149b50e217d7fe9a2f03", + "sha256:bd393683129f446a75d8634306aed7e377627098a1286ff3af2a4f1736742820", + "sha256:c038b9939da3035afb6cb2f465f18163e8f070aba0482923ecff9443def67178", + "sha256:c50bc308fa29767ed8f53a8d33b7633a9e14718ced038ed89d41b886e301da32", + "sha256:c582c46b1bb0b19f1a5f4c1312f1b640c21d78c371a6615c34025b16ee56369b", + "sha256:c77a7330dd15c7eb5fd3631dc646fc96327f98db8181138766bd14d3e905f0ba", + "sha256:c9e29a13d2fd9be3e7d8c26c7ef4ba60b5bc7efbc9dbdf24454c7e9ebba31768", + "sha256:ca366c2e2a54e2f663f4529b189fdeb6e14d419b1c78b754ec1744f3c01070d4", + "sha256:ce19887268e90ee81a3957eef5e46a70ecc000713796639f83828b950343f49e", + "sha256:cffbc50e0767396ed483900900dd58ce4351bc0d40e64bced8694bd41864cc71", + "sha256:d29d1b9857c65f8cb3a29270732e1591b9bacf89de9d13fa764f79f07d8f1fd2", + "sha256:d4688862f957c8629d557d084f20b2d803f8738b6c4066802a0b1cc472e088d9", + "sha256:e5ddb2388610799fc46abe389600625058f2a73867e63e20107c5ad5ffa57c47", + "sha256:e89605afebbd2d4b045bccfdc12a14b16fe8ccbae05f64b4b4c64a97dad1c891", + "sha256:ea2da0459b951ee461bd4e02b8904890bd1c4263999d291c5cd01e6620177ad4", + "sha256:ec9139baa3f85b65adc700eafa03ed04995ca8533dd56c924f0e458ffec044ab", + "sha256:eda4c661e68dddd56c8fbfe1ca35e40dd2afd973f7ebb1605f4d151edc63dff8", + "sha256:f0a547e4350d1fa32624d3eab51eff8cf329f4cae110b4ea0402486b1da8be40", + "sha256:f39a2a5ded23b9b9194ec45740dce57177b80f86c6d8eba953d3ff1a25c97766", + "sha256:f3a0bda83c18195c361b5500377d0767749f128564ca95b42c8849fd475bb327", + "sha256:f744b5eb1469bf92dd143d36570d2bdbbdc88fe5cb0b5405e53dd34f479cbd8a", + "sha256:f9f0bbfb6787b97c51516f3ccf97737d504db5d239ad44527673b81f598b84ab", + "sha256:fa9720e56663cc3649d62b4b5f3145e94b8f5611e8a8e1b46507777249d46aad", + "sha256:fb6ec40cef63b1922083d33bfef2f91fc0b0bc07b5b09bfee0b0f1717d558292", + "sha256:fe5231e8afd069c742ac5b4f96344a0fe4aff52df8e53ef87faebf77f827822c" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.9.7" + "markers": "python_version >= '3.9'", + "version": "==3.10.0" }, "redis": { "extras": [ @@ -1694,88 +1690,103 @@ }, "regex": { "hashes": [ - "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c", - "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535", - "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24", - "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce", - "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc", - "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5", - "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce", - "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53", - "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d", - "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c", - "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908", - "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8", - "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024", - "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281", - "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a", - "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169", - "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364", - "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa", - "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be", - "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53", - "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759", - "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e", - "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b", - "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52", - "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610", - "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05", - "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2", - "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca", - "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0", - "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293", - "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289", - "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e", - "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f", - "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c", - "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94", - "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad", - "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46", - "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9", - "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9", - "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee", - "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9", - "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1", - "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9", - "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799", - "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1", - "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b", - "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf", - "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5", - "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2", - "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e", - "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51", - "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506", - "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73", - "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7", - "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5", - "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57", - "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4", - "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd", - "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b", - "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41", - "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe", - "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59", - "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8", - "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f", - "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e", - "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750", - "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1", - "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96", - "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc", - "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440", - "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe", - "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38", - "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950", - "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2", - "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd", - "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce", - "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66", - "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3", - "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86" + "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623", + "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199", + "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664", + "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f", + "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca", + "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066", + "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca", + "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39", + "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d", + "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6", + "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35", + "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408", + "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5", + "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a", + "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9", + "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92", + "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766", + "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168", + "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca", + "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508", + "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df", + "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf", + "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b", + "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4", + "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268", + "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6", + "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c", + "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62", + "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231", + "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36", + "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba", + "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4", + "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e", + "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822", + "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4", + "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d", + "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71", + "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50", + "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d", + "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad", + "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8", + "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8", + "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8", + "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd", + "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16", + "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664", + "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a", + "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f", + "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd", + "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a", + "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9", + "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199", + "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d", + "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963", + "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009", + "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a", + "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679", + "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96", + "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42", + "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8", + "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e", + "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7", + "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8", + "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802", + "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366", + "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137", + "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784", + "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29", + "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3", + "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771", + "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60", + "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a", + "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4", + "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0", + "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84", + "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd", + "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1", + "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776", + "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142", + "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89", + "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c", + "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8", + "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35", + "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a", + "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86", + "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9", + "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64", + "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554", + "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85", + "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb", + "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0", + "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8", + "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb", + "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919" ], "markers": "python_version >= '3.8'", - "version": "==2024.7.24" + "version": "==2024.9.11" }, "reportlab": { "hashes": [ @@ -1802,70 +1813,78 @@ }, "rich": { "hashes": [ - "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc", - "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4" + "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06", + "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a" ], "markers": "python_full_version >= '3.7.0'", - "version": "==13.8.0" + "version": "==13.8.1" }, "scikit-learn": { "hashes": [ - "sha256:0828673c5b520e879f2af6a9e99eee0eefea69a2188be1ca68a6121b809055c1", - "sha256:0ea5d40c0e3951df445721927448755d3fe1d80833b0b7308ebff5d2a45e6414", - "sha256:10e49170691514a94bb2e03787aa921b82dbc507a4ea1f20fd95557862c98dc1", - "sha256:154297ee43c0b83af12464adeab378dee2d0a700ccd03979e2b821e7dd7cc1c2", - "sha256:161808750c267b77b4a9603cf9c93579c7a74ba8486b1336034c2f1579546d21", - "sha256:1bd8d3a19d4bd6dc5a7d4f358c8c3a60934dc058f363c34c0ac1e9e12a31421d", - "sha256:1ff4ba34c2abff5ec59c803ed1d97d61b036f659a17f55be102679e88f926fac", - "sha256:508907e5f81390e16d754e8815f7497e52139162fd69c4fdbd2dfa5d6cc88915", - "sha256:5944ce1faada31c55fb2ba20a5346b88e36811aab504ccafb9f0339e9f780395", - "sha256:5f57428de0c900a98389c4a433d4a3cf89de979b3aa24d1c1d251802aa15e44d", - "sha256:689b6f74b2c880276e365fe84fe4f1befd6a774f016339c65655eaff12e10cbf", - "sha256:781586c414f8cc58e71da4f3d7af311e0505a683e112f2f62919e3019abd3745", - "sha256:7b073a27797a283187a4ef4ee149959defc350b46cbf63a84d8514fe16b69855", - "sha256:88e0672c7ac21eb149d409c74cc29f1d611d5158175846e7a9c2427bd12b3956", - "sha256:909144d50f367a513cee6090873ae582dba019cb3fca063b38054fa42704c3a4", - "sha256:97625f217c5c0c5d0505fa2af28ae424bd37949bb2f16ace3ff5f2f81fb4498b", - "sha256:9a07f90846313a7639af6a019d849ff72baadfa4c74c778821ae0fad07b7275b", - "sha256:b59e3e62d2be870e5c74af4e793293753565c7383ae82943b83383fdcf5cc5c1", - "sha256:b5e865e9bd59396220de49cb4a57b17016256637c61b4c5cc81aaf16bc123bbe", - "sha256:da3f404e9e284d2b0a157e1b56b6566a34eb2798205cba35a211df3296ab7a74", - "sha256:f5b213bc29cc30a89a3130393b0e39c847a15d769d6e59539cd86b75d276b1a7" + "sha256:03b6158efa3faaf1feea3faa884c840ebd61b6484167c711548fce208ea09445", + "sha256:1ff45e26928d3b4eb767a8f14a9a6efbf1cbff7c05d1fb0f95f211a89fd4f5de", + "sha256:299406827fb9a4f862626d0fe6c122f5f87f8910b86fe5daa4c32dcd742139b6", + "sha256:2d4cad1119c77930b235579ad0dc25e65c917e756fe80cab96aa3b9428bd3fb0", + "sha256:394397841449853c2290a32050382edaec3da89e35b3e03d6cc966aebc6a8ae6", + "sha256:3a686885a4b3818d9e62904d91b57fa757fc2bed3e465c8b177be652f4dd37c8", + "sha256:3b923d119d65b7bd555c73be5423bf06c0105678ce7e1f558cb4b40b0a5502b1", + "sha256:3bed4909ba187aca80580fe2ef370d9180dcf18e621a27c4cf2ef10d279a7efe", + "sha256:52788f48b5d8bca5c0736c175fa6bdaab2ef00a8f536cda698db61bd89c551c1", + "sha256:57cc1786cfd6bd118220a92ede80270132aa353647684efa385a74244a41e3b1", + "sha256:643964678f4b5fbdc95cbf8aec638acc7aa70f5f79ee2cdad1eec3df4ba6ead8", + "sha256:6c16d84a0d45e4894832b3c4d0bf73050939e21b99b01b6fd59cbb0cf39163b6", + "sha256:757c7d514ddb00ae249832fe87100d9c73c6ea91423802872d9e74970a0e40b9", + "sha256:8c412ccc2ad9bf3755915e3908e677b367ebc8d010acbb3f182814524f2e5540", + "sha256:b4237ed7b3fdd0a4882792e68ef2545d5baa50aca3bb45aa7df468138ad8f94d", + "sha256:c15b1ca23d7c5f33cc2cb0a0d6aaacf893792271cddff0edbd6a40e8319bc113", + "sha256:ca64b3089a6d9b9363cd3546f8978229dcbb737aceb2c12144ee3f70f95684b7", + "sha256:f60021ec1574e56632be2a36b946f8143bf4e5e6af4a06d85281adc22938e0dd", + "sha256:f763897fe92d0e903aa4847b0aec0e68cadfff77e8a0687cabd946c89d17e675", + "sha256:f8b0ccd4a902836493e026c03256e8b206656f91fbcc4fde28c57a5b752561f1", + "sha256:f932a02c3f4956dfb981391ab24bda1dbd90fe3d628e4b42caef3e041c67707a" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==1.5.1" + "version": "==1.5.2" }, "scipy": { "hashes": [ - "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", - "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", - "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", - "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", - "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", - "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", - "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", - "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", - "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", - "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", - "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", - "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", - "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", - "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", - "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", - "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", - "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", - "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", - "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", - "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", - "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", - "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", - "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", - "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", - "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f" + "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e", + "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79", + "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37", + "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5", + "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675", + "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d", + "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f", + "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310", + "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617", + "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e", + "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e", + "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417", + "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d", + "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94", + "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad", + "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8", + "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0", + "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69", + "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066", + "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3", + "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5", + "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07", + "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2", + "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389", + "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d", + "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84", + "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2", + "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3", + "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73", + "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06", + "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc", + "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1", + "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2" ], - "markers": "python_version >= '3.9'", - "version": "==1.13.1" + "markers": "python_version >= '3.10'", + "version": "==1.14.1" }, "setproctitle": { "hashes": [ @@ -2039,11 +2058,11 @@ }, "tzdata": { "hashes": [ - "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", - "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" + "sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc", + "sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd" ], "markers": "python_version >= '2'", - "version": "==2024.1" + "version": "==2024.2" }, "tzlocal": { "hashes": [ @@ -2055,11 +2074,11 @@ }, "urllib3": { "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" + "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], "markers": "python_version >= '3.8'", - "version": "==2.2.2" + "version": "==2.2.3" }, "uvicorn": { "extras": [ @@ -2262,94 +2281,94 @@ }, "websockets": { "hashes": [ - "sha256:00fd961943b6c10ee6f0b1130753e50ac5dcd906130dcd77b0003c3ab797d026", - "sha256:03d3f9ba172e0a53e37fa4e636b86cc60c3ab2cfee4935e66ed1d7acaa4625ad", - "sha256:0513c727fb8adffa6d9bf4a4463b2bade0186cbd8c3604ae5540fae18a90cb99", - "sha256:05e70fec7c54aad4d71eae8e8cab50525e899791fc389ec6f77b95312e4e9920", - "sha256:0617fd0b1d14309c7eab6ba5deae8a7179959861846cbc5cb528a7531c249448", - "sha256:06c0a667e466fcb56a0886d924b5f29a7f0886199102f0a0e1c60a02a3751cb4", - "sha256:0f52504023b1480d458adf496dc1c9e9811df4ba4752f0bc1f89ae92f4f07d0c", - "sha256:10a0dc7242215d794fb1918f69c6bb235f1f627aaf19e77f05336d147fce7c37", - "sha256:11f9976ecbc530248cf162e359a92f37b7b282de88d1d194f2167b5e7ad80ce3", - "sha256:132511bfd42e77d152c919147078460c88a795af16b50e42a0bd14f0ad71ddd2", - "sha256:139add0f98206cb74109faf3611b7783ceafc928529c62b389917a037d4cfdf4", - "sha256:14b9c006cac63772b31abbcd3e3abb6228233eec966bf062e89e7fa7ae0b7333", - "sha256:15c7d62ee071fa94a2fc52c2b472fed4af258d43f9030479d9c4a2de885fd543", - "sha256:165bedf13556f985a2aa064309baa01462aa79bf6112fbd068ae38993a0e1f1b", - "sha256:17118647c0ea14796364299e942c330d72acc4b248e07e639d34b75067b3cdd8", - "sha256:1841c9082a3ba4a05ea824cf6d99570a6a2d8849ef0db16e9c826acb28089e8f", - "sha256:1a678532018e435396e37422a95e3ab87f75028ac79570ad11f5bf23cd2a7d8c", - "sha256:1ee4cc030a4bdab482a37462dbf3ffb7e09334d01dd37d1063be1136a0d825fa", - "sha256:1f3cf6d6ec1142412d4535adabc6bd72a63f5f148c43fe559f06298bc21953c9", - "sha256:1f613289f4a94142f914aafad6c6c87903de78eae1e140fa769a7385fb232fdf", - "sha256:1fa082ea38d5de51dd409434edc27c0dcbd5fed2b09b9be982deb6f0508d25bc", - "sha256:249aab278810bee585cd0d4de2f08cfd67eed4fc75bde623be163798ed4db2eb", - "sha256:254ecf35572fca01a9f789a1d0f543898e222f7b69ecd7d5381d8d8047627bdb", - "sha256:2a02b0161c43cc9e0232711eff846569fad6ec836a7acab16b3cf97b2344c060", - "sha256:30d3a1f041360f029765d8704eae606781e673e8918e6b2c792e0775de51352f", - "sha256:3624fd8664f2577cf8de996db3250662e259bfbc870dd8ebdcf5d7c6ac0b5185", - "sha256:3f55b36d17ac50aa8a171b771e15fbe1561217510c8768af3d546f56c7576cdc", - "sha256:46af561eba6f9b0848b2c9d2427086cabadf14e0abdd9fde9d72d447df268418", - "sha256:47236c13be337ef36546004ce8c5580f4b1150d9538b27bf8a5ad8edf23ccfab", - "sha256:4a365bcb7be554e6e1f9f3ed64016e67e2fa03d7b027a33e436aecf194febb63", - "sha256:4d6ece65099411cfd9a48d13701d7438d9c34f479046b34c50ff60bb8834e43e", - "sha256:4e85f46ce287f5c52438bb3703d86162263afccf034a5ef13dbe4318e98d86e7", - "sha256:4f0426d51c8f0926a4879390f53c7f5a855e42d68df95fff6032c82c888b5f36", - "sha256:518f90e6dd089d34eaade01101fd8a990921c3ba18ebbe9b0165b46ebff947f0", - "sha256:52aed6ef21a0f1a2a5e310fb5c42d7555e9c5855476bbd7173c3aa3d8a0302f2", - "sha256:556e70e4f69be1082e6ef26dcb70efcd08d1850f5d6c5f4f2bcb4e397e68f01f", - "sha256:56a952fa2ae57a42ba7951e6b2605e08a24801a4931b5644dfc68939e041bc7f", - "sha256:59197afd478545b1f73367620407b0083303569c5f2d043afe5363676f2697c9", - "sha256:5df891c86fe68b2c38da55b7aea7095beca105933c697d719f3f45f4220a5e0e", - "sha256:63848cdb6fcc0bf09d4a155464c46c64ffdb5807ede4fb251da2c2692559ce75", - "sha256:64a11aae1de4c178fa653b07d90f2fb1a2ed31919a5ea2361a38760192e1858b", - "sha256:6724b554b70d6195ba19650fef5759ef11346f946c07dbbe390e039bcaa7cc3d", - "sha256:67494e95d6565bf395476e9d040037ff69c8b3fa356a886b21d8422ad86ae075", - "sha256:67648f5e50231b5a7f6d83b32f9c525e319f0ddc841be0de64f24928cd75a603", - "sha256:68264802399aed6fe9652e89761031acc734fc4c653137a5911c2bfa995d6d6d", - "sha256:699ba9dd6a926f82a277063603fc8d586b89f4cb128efc353b749b641fcddda7", - "sha256:6aa74a45d4cdc028561a7d6ab3272c8b3018e23723100b12e58be9dfa5a24491", - "sha256:6b41a1b3b561f1cba8321fb32987552a024a8f67f0d05f06fcf29f0090a1b956", - "sha256:71e6e5a3a3728886caee9ab8752e8113670936a193284be9d6ad2176a137f376", - "sha256:7d20516990d8ad557b5abeb48127b8b779b0b7e6771a265fa3e91767596d7d97", - "sha256:80e4ba642fc87fa532bac07e5ed7e19d56940b6af6a8c61d4429be48718a380f", - "sha256:872afa52a9f4c414d6955c365b6588bc4401272c629ff8321a55f44e3f62b553", - "sha256:8eb2b9a318542153674c6e377eb8cb9ca0fc011c04475110d3477862f15d29f0", - "sha256:9bbc525f4be3e51b89b2a700f5746c2a6907d2e2ef4513a8daafc98198b92237", - "sha256:a1a2e272d067030048e1fe41aa1ec8cfbbaabce733b3d634304fa2b19e5c897f", - "sha256:a5dc0c42ded1557cc7c3f0240b24129aefbad88af4f09346164349391dea8e58", - "sha256:acab3539a027a85d568c2573291e864333ec9d912675107d6efceb7e2be5d980", - "sha256:acbebec8cb3d4df6e2488fbf34702cbc37fc39ac7abf9449392cefb3305562e9", - "sha256:ad327ac80ba7ee61da85383ca8822ff808ab5ada0e4a030d66703cc025b021c4", - "sha256:b448a0690ef43db5ef31b3a0d9aea79043882b4632cfc3eaab20105edecf6097", - "sha256:b5a06d7f60bc2fc378a333978470dfc4e1415ee52f5f0fce4f7853eb10c1e9df", - "sha256:b74593e9acf18ea5469c3edaa6b27fa7ecf97b30e9dabd5a94c4c940637ab96e", - "sha256:b79915a1179a91f6c5f04ece1e592e2e8a6bd245a0e45d12fd56b2b59e559a32", - "sha256:b80f0c51681c517604152eb6a572f5a9378f877763231fddb883ba2f968e8817", - "sha256:b8ac5b46fd798bbbf2ac6620e0437c36a202b08e1f827832c4bf050da081b501", - "sha256:c3c493d0e5141ec055a7d6809a28ac2b88d5b878bb22df8c621ebe79a61123d0", - "sha256:c44ca9ade59b2e376612df34e837013e2b273e6c92d7ed6636d0556b6f4db93d", - "sha256:c4a6343e3b0714e80da0b0893543bf9a5b5fa71b846ae640e56e9abc6fbc4c83", - "sha256:c5870b4a11b77e4caa3937142b650fbbc0914a3e07a0cf3131f35c0587489c1c", - "sha256:ca48914cdd9f2ccd94deab5bcb5ac98025a5ddce98881e5cce762854a5de330b", - "sha256:cf2fae6d85e5dc384bf846f8243ddaa9197f3a1a70044f59399af001fd1f51d4", - "sha256:d450f5a7a35662a9b91a64aefa852f0c0308ee256122f5218a42f1d13577d71e", - "sha256:d6716c087e4aa0b9260c4e579bb82e068f84faddb9bfba9906cb87726fa2e870", - "sha256:d93572720d781331fb10d3da9ca1067817d84ad1e7c31466e9f5e59965618096", - "sha256:dbb0b697cc0655719522406c059eae233abaa3243821cfdfab1215d02ac10231", - "sha256:e33505534f3f673270dd67f81e73550b11de5b538c56fe04435d63c02c3f26b5", - "sha256:e801ca2f448850685417d723ec70298feff3ce4ff687c6f20922c7474b4746ae", - "sha256:e82db3756ccb66266504f5a3de05ac6b32f287faacff72462612120074103329", - "sha256:ef48e4137e8799998a343706531e656fdec6797b80efd029117edacb74b0a10a", - "sha256:f1d3d1f2eb79fe7b0fb02e599b2bf76a7619c79300fc55f0b5e2d382881d4f7f", - "sha256:f3fea72e4e6edb983908f0db373ae0732b275628901d909c382aae3b592589f2", - "sha256:f40de079779acbcdbb6ed4c65af9f018f8b77c5ec4e17a4b737c05c2db554491", - "sha256:f73e676a46b0fe9426612ce8caeca54c9073191a77c3e9d5c94697aef99296af", - "sha256:f9c9e258e3d5efe199ec23903f5da0eeaad58cf6fccb3547b74fd4750e5ac47a", - "sha256:fac2d146ff30d9dd2fcf917e5d147db037a5c573f0446c564f16f1f94cf87462", - "sha256:faef9ec6354fe4f9a2c0bbb52fb1ff852effc897e2a4501e25eb3a47cb0a4f89" + "sha256:004280a140f220c812e65f36944a9ca92d766b6cc4560be652a0a3883a79ed8a", + "sha256:035233b7531fb92a76beefcbf479504db8c72eb3bff41da55aecce3a0f729e54", + "sha256:149e622dc48c10ccc3d2760e5f36753db9cacf3ad7bc7bbbfd7d9c819e286f23", + "sha256:163e7277e1a0bd9fb3c8842a71661ad19c6aa7bb3d6678dc7f89b17fbcc4aeb7", + "sha256:18503d2c5f3943e93819238bf20df71982d193f73dcecd26c94514f417f6b135", + "sha256:1971e62d2caa443e57588e1d82d15f663b29ff9dfe7446d9964a4b6f12c1e700", + "sha256:204e5107f43095012b00f1451374693267adbb832d29966a01ecc4ce1db26faf", + "sha256:2510c09d8e8df777177ee3d40cd35450dc169a81e747455cc4197e63f7e7bfe5", + "sha256:25c35bf84bf7c7369d247f0b8cfa157f989862c49104c5cf85cb5436a641d93e", + "sha256:2f85cf4f2a1ba8f602298a853cec8526c2ca42a9a4b947ec236eaedb8f2dc80c", + "sha256:308e20f22c2c77f3f39caca508e765f8725020b84aa963474e18c59accbf4c02", + "sha256:325b1ccdbf5e5725fdcb1b0e9ad4d2545056479d0eee392c291c1bf76206435a", + "sha256:327b74e915cf13c5931334c61e1a41040e365d380f812513a255aa804b183418", + "sha256:346bee67a65f189e0e33f520f253d5147ab76ae42493804319b5716e46dddf0f", + "sha256:38377f8b0cdeee97c552d20cf1865695fcd56aba155ad1b4ca8779a5b6ef4ac3", + "sha256:3c78383585f47ccb0fcf186dcb8a43f5438bd7d8f47d69e0b56f71bf431a0a68", + "sha256:4059f790b6ae8768471cddb65d3c4fe4792b0ab48e154c9f0a04cefaabcd5978", + "sha256:459bf774c754c35dbb487360b12c5727adab887f1622b8aed5755880a21c4a20", + "sha256:463e1c6ec853202dd3657f156123d6b4dad0c546ea2e2e38be2b3f7c5b8e7295", + "sha256:4676df3fe46956fbb0437d8800cd5f2b6d41143b6e7e842e60554398432cf29b", + "sha256:485307243237328c022bc908b90e4457d0daa8b5cf4b3723fd3c4a8012fce4c6", + "sha256:48a2ef1381632a2f0cb4efeff34efa97901c9fbc118e01951ad7cfc10601a9bb", + "sha256:4b889dbd1342820cc210ba44307cf75ae5f2f96226c0038094455a96e64fb07a", + "sha256:586a356928692c1fed0eca68b4d1c2cbbd1ca2acf2ac7e7ebd3b9052582deefa", + "sha256:58cf7e75dbf7e566088b07e36ea2e3e2bd5676e22216e4cad108d4df4a7402a0", + "sha256:5993260f483d05a9737073be197371940c01b257cc45ae3f1d5d7adb371b266a", + "sha256:5dd6da9bec02735931fccec99d97c29f47cc61f644264eb995ad6c0c27667238", + "sha256:5f2e75431f8dc4a47f31565a6e1355fb4f2ecaa99d6b89737527ea917066e26c", + "sha256:5f9fee94ebafbc3117c30be1844ed01a3b177bb6e39088bc6b2fa1dc15572084", + "sha256:61fc0dfcda609cda0fc9fe7977694c0c59cf9d749fbb17f4e9483929e3c48a19", + "sha256:624459daabeb310d3815b276c1adef475b3e6804abaf2d9d2c061c319f7f187d", + "sha256:62d516c325e6540e8a57b94abefc3459d7dab8ce52ac75c96cad5549e187e3a7", + "sha256:6548f29b0e401eea2b967b2fdc1c7c7b5ebb3eeb470ed23a54cd45ef078a0db9", + "sha256:6d2aad13a200e5934f5a6767492fb07151e1de1d6079c003ab31e1823733ae79", + "sha256:6d6855bbe70119872c05107e38fbc7f96b1d8cb047d95c2c50869a46c65a8e96", + "sha256:70c5be9f416aa72aab7a2a76c90ae0a4fe2755c1816c153c1a2bcc3333ce4ce6", + "sha256:730f42125ccb14602f455155084f978bd9e8e57e89b569b4d7f0f0c17a448ffe", + "sha256:7a43cfdcddd07f4ca2b1afb459824dd3c6d53a51410636a2c7fc97b9a8cf4842", + "sha256:7bd6abf1e070a6b72bfeb71049d6ad286852e285f146682bf30d0296f5fbadfa", + "sha256:7c1e90228c2f5cdde263253fa5db63e6653f1c00e7ec64108065a0b9713fa1b3", + "sha256:7c65ffa900e7cc958cd088b9a9157a8141c991f8c53d11087e6fb7277a03f81d", + "sha256:80c421e07973a89fbdd93e6f2003c17d20b69010458d3a8e37fb47874bd67d51", + "sha256:82d0ba76371769d6a4e56f7e83bb8e81846d17a6190971e38b5de108bde9b0d7", + "sha256:83f91d8a9bb404b8c2c41a707ac7f7f75b9442a0a876df295de27251a856ad09", + "sha256:87c6e35319b46b99e168eb98472d6c7d8634ee37750d7693656dc766395df096", + "sha256:8d23b88b9388ed85c6faf0e74d8dec4f4d3baf3ecf20a65a47b836d56260d4b9", + "sha256:9156c45750b37337f7b0b00e6248991a047be4aa44554c9886fe6bdd605aab3b", + "sha256:91a0fa841646320ec0d3accdff5b757b06e2e5c86ba32af2e0815c96c7a603c5", + "sha256:95858ca14a9f6fa8413d29e0a585b31b278388aa775b8a81fa24830123874678", + "sha256:95df24ca1e1bd93bbca51d94dd049a984609687cb2fb08a7f2c56ac84e9816ea", + "sha256:9b37c184f8b976f0c0a231a5f3d6efe10807d41ccbe4488df8c74174805eea7d", + "sha256:9b6f347deb3dcfbfde1c20baa21c2ac0751afaa73e64e5b693bb2b848efeaa49", + "sha256:9d75baf00138f80b48f1eac72ad1535aac0b6461265a0bcad391fc5aba875cfc", + "sha256:9ef8aa8bdbac47f4968a5d66462a2a0935d044bf35c0e5a8af152d58516dbeb5", + "sha256:a11e38ad8922c7961447f35c7b17bffa15de4d17c70abd07bfbe12d6faa3e027", + "sha256:a1b54689e38d1279a51d11e3467dd2f3a50f5f2e879012ce8f2d6943f00e83f0", + "sha256:a3b3366087c1bc0a2795111edcadddb8b3b59509d5db5d7ea3fdd69f954a8878", + "sha256:a569eb1b05d72f9bce2ebd28a1ce2054311b66677fcd46cf36204ad23acead8c", + "sha256:a7affedeb43a70351bb811dadf49493c9cfd1ed94c9c70095fd177e9cc1541fa", + "sha256:a9a396a6ad26130cdae92ae10c36af09d9bfe6cafe69670fd3b6da9b07b4044f", + "sha256:a9ab1e71d3d2e54a0aa646ab6d4eebfaa5f416fe78dfe4da2839525dc5d765c6", + "sha256:a9cd1af7e18e5221d2878378fbc287a14cd527fdd5939ed56a18df8a31136bb2", + "sha256:a9dcaf8b0cc72a392760bb8755922c03e17a5a54e08cca58e8b74f6902b433cf", + "sha256:b9d7439d7fab4dce00570bb906875734df13d9faa4b48e261c440a5fec6d9708", + "sha256:bcc03c8b72267e97b49149e4863d57c2d77f13fae12066622dc78fe322490fe6", + "sha256:c11d4d16e133f6df8916cc5b7e3e96ee4c44c936717d684a94f48f82edb7c92f", + "sha256:c1dca61c6db1166c48b95198c0b7d9c990b30c756fc2923cc66f68d17dc558fd", + "sha256:c518e84bb59c2baae725accd355c8dc517b4a3ed8db88b4bc93c78dae2974bf2", + "sha256:c7934fd0e920e70468e676fe7f1b7261c1efa0d6c037c6722278ca0228ad9d0d", + "sha256:c7e72ce6bda6fb9409cc1e8164dd41d7c91466fb599eb047cfda72fe758a34a7", + "sha256:c90d6dec6be2c7d03378a574de87af9b1efea77d0c52a8301dd831ece938452f", + "sha256:ceec59f59d092c5007e815def4ebb80c2de330e9588e101cf8bd94c143ec78a5", + "sha256:cf1781ef73c073e6b0f90af841aaf98501f975d306bbf6221683dd594ccc52b6", + "sha256:d04f13a1d75cb2b8382bdc16ae6fa58c97337253826dfe136195b7f89f661557", + "sha256:d6d300f8ec35c24025ceb9b9019ae9040c1ab2f01cddc2bcc0b518af31c75c14", + "sha256:d8dbb1bf0c0a4ae8b40bdc9be7f644e2f3fb4e8a9aca7145bfa510d4a374eeb7", + "sha256:de58647e3f9c42f13f90ac7e5f58900c80a39019848c5547bc691693098ae1bd", + "sha256:deeb929efe52bed518f6eb2ddc00cc496366a14c726005726ad62c2dd9017a3c", + "sha256:df01aea34b6e9e33572c35cd16bae5a47785e7d5c8cb2b54b2acdb9678315a17", + "sha256:e2620453c075abeb0daa949a292e19f56de518988e079c36478bacf9546ced23", + "sha256:e4450fc83a3df53dec45922b576e91e94f5578d06436871dce3a6be38e40f5db", + "sha256:e54affdeb21026329fb0744ad187cf812f7d3c2aa702a5edb562b325191fcab6", + "sha256:e9875a0143f07d74dc5e1ded1c4581f0d9f7ab86c78994e2ed9e95050073c94d", + "sha256:f1c3cf67185543730888b20682fb186fc8d0fa6f07ccc3ef4390831ab4b388d9", + "sha256:f48c749857f8fb598fb890a75f540e3221d0976ed0bf879cf3c7eef34151acee", + "sha256:f779498eeec470295a2b1a5d97aa1bc9814ecd25e1eb637bd9d1c73a327387f6" ], - "version": "==13.0.1" + "version": "==13.1" }, "whitenoise": { "hashes": [ @@ -2584,11 +2603,11 @@ "develop": { "anyio": { "hashes": [ - "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94", - "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7" + "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb", + "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a" ], - "markers": "python_version >= '3.8'", - "version": "==4.4.0" + "markers": "python_version >= '3.9'", + "version": "==4.6.0" }, "asgiref": { "hashes": [ @@ -2996,20 +3015,20 @@ }, "faker": { "hashes": [ - "sha256:4294d169255a045990720d6f3fa4134b764a4cdf46ef0d3c7553d2506f1adaa1", - "sha256:e59c01d1e8b8e20a83255ab8232c143cb2af3b4f5ab6a3f5ce495f385ad8ab4c" + "sha256:bf0207af5777950054a2a3b43f4b5bdc33b585918d2b28f1dab52ac0ffe2bac0", + "sha256:f0a60009150736c1c033bea31aa19ae63071c9dcf10adfaf9f1a87a3add84bc8" ], "markers": "python_version >= '3.8'", - "version": "==28.4.1" + "version": "==30.0.0" }, "filelock": { "hashes": [ - "sha256:81de9eb8453c769b63369f87f11131a7ab04e367f8d97ad39dc230daa07e3bec", - "sha256:f6ed4c963184f4c84dd5557ce8fece759a3724b37b80c6c4f20a2f63a4dc6609" + "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", + "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==3.16.0" + "version": "==3.16.1" }, "ghp-import": { "hashes": [ @@ -3054,19 +3073,19 @@ }, "identify": { "hashes": [ - "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", - "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0" + "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0", + "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98" ], "markers": "python_version >= '3.8'", - "version": "==2.6.0" + "version": "==2.6.1" }, "idna": { "hashes": [ - "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", - "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" + "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" ], "markers": "python_version >= '3.6'", - "version": "==3.8" + "version": "==3.10" }, "imagehash": { "hashes": [ @@ -3076,14 +3095,6 @@ "index": "pypi", "version": "==4.3.1" }, - "importlib-metadata": { - "hashes": [ - "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1", - "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5" - ], - "markers": "python_version < '3.10'", - "version": "==8.4.0" - }, "incremental": { "hashes": [ "sha256:8cb2c3431530bec48ad70513931a760f446ad6c25e8333ca5d95e24b0ed7b8fe", @@ -3216,12 +3227,12 @@ }, "mkdocs-material": { "hashes": [ - "sha256:1e60ddf716cfb5679dfd65900b8a25d277064ed82d9a53cd5190e3f894df7840", - "sha256:54caa8be708de2b75167fd4d3b9f3d949579294f49cb242515d4653dbee9227e" + "sha256:1843c5171ad6b489550aeaf7358e5b7128cc03ddcf0fb4d91d19aa1e691a63b8", + "sha256:d4779051d52ba9f1e7e344b34de95449c7c366c212b388e4a2db9a3db043c228" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==9.5.34" + "version": "==9.5.38" }, "mkdocs-material-extensions": { "hashes": [ @@ -3241,54 +3252,62 @@ }, "numpy": { "hashes": [ - "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", - "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", - "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", - "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", - "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", - "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", - "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", - "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", - "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", - "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", - "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", - "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", - "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", - "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", - "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", - "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", - "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", - "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", - "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", - "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", - "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", - "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", - "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", - "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", - "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", - "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", - "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", - "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", - "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", - "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", - "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", - "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", - "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", - "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", - "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", - "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", - "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", - "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", - "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", - "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", - "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", - "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", - "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", - "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", - "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd" + "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", + "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", + "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", + "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", + "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", + "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", + "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", + "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", + "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", + "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", + "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", + "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", + "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", + "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", + "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", + "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", + "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", + "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", + "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", + "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", + "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", + "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", + "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", + "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", + "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", + "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", + "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", + "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", + "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", + "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", + "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", + "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", + "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", + "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", + "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", + "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", + "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", + "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", + "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", + "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", + "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", + "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", + "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", + "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", + "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", + "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", + "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", + "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", + "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", + "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", + "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", + "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", + "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b" ], - "markers": "python_version >= '3.9'", - "version": "==2.0.2" + "markers": "python_version >= '3.10'", + "version": "==2.1.1" }, "packaging": { "hashes": [ @@ -3401,11 +3420,11 @@ }, "platformdirs": { "hashes": [ - "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c", - "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617" + "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", + "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb" ], "markers": "python_version >= '3.8'", - "version": "==4.3.2" + "version": "==4.3.6" }, "pluggy": { "hashes": [ @@ -3426,19 +3445,19 @@ }, "pyasn1": { "hashes": [ - "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", - "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473" + "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", + "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034" ], "markers": "python_version >= '3.8'", - "version": "==0.6.0" + "version": "==0.6.1" }, "pyasn1-modules": { "hashes": [ - "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", - "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b" + "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd", + "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c" ], "markers": "python_version >= '3.8'", - "version": "==0.4.0" + "version": "==0.4.1" }, "pycparser": { "hashes": [ @@ -3458,11 +3477,11 @@ }, "pymdown-extensions": { "hashes": [ - "sha256:6ff740bcd99ec4172a938970d42b96128bdc9d4b9bcad72494f29921dc69b753", - "sha256:d323f7e90d83c86113ee78f3fe62fc9dee5f56b54d912660703ea1816fed5626" + "sha256:513a9e9432b197cf0539356c8f1fc376e0d10b70ad150cadeb649a5628aacd45", + "sha256:65d82324ef2497931bc858c8320540c6264ab0d9a292707edb61f4fe0cd56633" ], "markers": "python_version >= '3.8'", - "version": "==10.9" + "version": "==10.10.2" }, "pyopenssl": { "hashes": [ @@ -3500,12 +3519,12 @@ }, "pytest-env": { "hashes": [ - "sha256:86653658da8f11c6844975db955746c458a9c09f1e64957603161e2ff93f5133", - "sha256:a4212056d4d440febef311a98fdca56c31256d58fb453d103cba4e8a532b721d" + "sha256:91209840aa0e43385073ac464a554ad2947cc2fd663a9debf88d03b01e0cc1cf", + "sha256:ce90cf8772878515c24b31cd97c7fa1f4481cd68d588419fd45f10ecaee6bc30" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.1.4" + "version": "==1.1.5" }, "pytest-httpx": { "hashes": [ @@ -3562,42 +3581,45 @@ }, "pywavelets": { "hashes": [ - "sha256:058a750477dde633ac53b8806f835af3559d52db6532fb2b93c1f4b5441365b8", - "sha256:0595c51472c9c5724fe087cb73e2797053fd25c788d6553fdad6ff61abc60e91", - "sha256:138471513bc0a4cd2ddc4e50c7ec04e3468c268e101a0d02f698f6aedd1d5e79", - "sha256:274bc47b289585383aa65519b3fcae5b4dee5e31db3d4198d4fad701a70e59f7", - "sha256:32198de321892743c1a3d1957fe1cd8a8ecc078bfbba6b8f3982518e897271d7", - "sha256:3b5302edb6d1d1ff6636d37c9ff29c4892f2a3648d736cc1df01f3f36e25c8cf", - "sha256:4021ef69ec9f3862f66580fc4417be728bd78722914394594b48212fd1fcaf21", - "sha256:42a22e68e345b6de7d387ef752111ab4530c98048d2b4bdac8ceefb078b4ead6", - "sha256:47b0314a22616c5f3f08760f0e00b4a15b7c7dadca5e39bb701cf7869a4207c5", - "sha256:47de024ba4f9df97e98b5f540340e1a9edd82d2c477450bef8c9b5381487128e", - "sha256:48b3813c6d1a7a8194f37dbb5dbbdf2fe1112152c91445ea2e54f64ff6350c36", - "sha256:4ef15a63a72afa67ae9f4f3b06c95c5382730fb3075e668d49a880e65f2f089c", - "sha256:4ffb484d096a5eb10af7121e0203546a03e1369328df321a33ef91f67bac40cf", - "sha256:538795d9c4181152b414285b5a7f72ac52581ecdcdce74b6cca3fa0b8a5ab0aa", - "sha256:627df378e63e9c789b6f2e7060cb4264ebae6f6b0efc1da287a2c060de454a1f", - "sha256:67936491ae3e5f957c428e34fdaed21f131535b8d60c7c729a1b539ce8864837", - "sha256:78feab4e0c25fa32034b6b64cb854c6ce15663b4f0ffb25d8f0ee58915300f9b", - "sha256:8fbf7b61b28b5457693c034e58a01622756d1fd60a80ae13ac5888b1d3e57e80", - "sha256:97ea9613bd6b7108ebb44b709060adc7e2d5fac73be7152342bdd5513d75f84e", - "sha256:9ec7d69b746a0eaa327b829a3252a63619f2345e263177be5dd9bf30d7933c8d", - "sha256:a413b51dc19e05243fe0b0864a8e8a16b5ca9bf2e4713da00a95b1b5747a5367", - "sha256:ab652112d3932d21f020e281e06926a751354c2b5629fb716f5eb9d0104b84e5", - "sha256:be36f08efe9bc3abf40cf40cd2ee0aa0db26e4894e13ce5ac178442864161e8c", - "sha256:be615c6c1873e189c265d4a76d1751ec49b17e29725e6dd2e9c74f1868f590b7", - "sha256:c5e655446e37a3c87213d5c6386b86f65c4d61736b4432d720171e7dd6523d6a", - "sha256:d6ec113386a432e04103f95e351d2657b42145bd1e1ed26513423391bcb5f011", - "sha256:d91aaaf6de53b758bcdc96c81cdb5a8607758602be49f691188c0e108cf1e738", - "sha256:dd798cee3d28fb3d32a26a00d9831a20bf316c36d685e4ced01b4e4a8f36f5ce", - "sha256:ddc1ff5ad706313d930f857f9656f565dfb81b85bbe58a9db16ad8fa7d1537c5", - "sha256:e2c44760c0906ddf2176920a2613287f6eea947f166ce7eee9546081b06a6835", - "sha256:e772f7f0c16bfc3be8ac3cd10d29a9920bb7a39781358856223c491b899e6e79", - "sha256:ea027c70977122c5fc27b2510f0a0d9528f9c3df6ea3e4c577ca55fd00325a5b", - "sha256:f58ddbb0a6cd243928876edfc463b990763a24fb94498607d6fea690e32cca4c" + "sha256:05dc2930cf9b7f61a24b2fe52b18e9d6046012fc46fc360355222781a95a1378", + "sha256:097bd03ee1b687942fa2f82ad0d35849879eef0ac82fc6f757d6ef881c53db6d", + "sha256:0b37212b7524438f694cb619cc4a0a3dc54ad77b63a18d0e8e6364f525fffd91", + "sha256:0bd2611076f5d2c4ad940421bbb3c450b6a53d8ca24bde02662455dc67c70dac", + "sha256:0cd599c78fc240cbadb63344d73912fc79e8dccbb0db8a8bd5143df400c3a519", + "sha256:0f402424288178fd105a5cb76e1818649dc67e4a08d1b9974c8c7ef01dc5feb3", + "sha256:0fc5e0e592678e43c18dd169b0d8471e9a5ffb5eb7ff4bdc8f447c882f78aa8b", + "sha256:105249d2bf824bddfb286e4e08934ff1e8829aa3077dab74ce3b2921a09caa43", + "sha256:1a550fdbe134040c04f1bb46cfe13a1a903c5dce13090b681106e4db99feba81", + "sha256:259ccf233879cf0ed66052ffd174dcabe6314e92b53aa2de25f4ae50b08ea1e3", + "sha256:29a912c074977db6adf3782dfbd414945805039b755d0c23979bc823f1b4e9c3", + "sha256:3740c84de06fab5081c8f08994f12f9ee94dc2eb4d818eaeace3bdb0b838e2fc", + "sha256:392553248aed33eac6f38647acacdba94dd6a8f283319c2d9852de7a871d6d0f", + "sha256:3e3c8c0fa44f4de7bf05c5d12883b227aaf6dcf46deb3f6f5a9fa5bb79c33283", + "sha256:40ebb994b332d48db3b0564e3c335c4f8ba236283939f5167de099766cf16517", + "sha256:4a2a8cc39901f09d82fc94007026f9aed63876e334ae043eb26caa601aee2551", + "sha256:4ff81dd8288afdd5f2eae6c44f963152b41e14e2e5fc647b608c97bd6f8270fe", + "sha256:5b7e1a212269d3e48318388744684b702c6a649a70758e35e9a88614316e9b91", + "sha256:6a322607b8c2985997ea45317d36cab58f0223ccf4c5b6540b612ed067d099ff", + "sha256:6ad14d8b5a412a621406276b8ae8ee1e369ba7a7f8e517fb87355bcb8106820f", + "sha256:71918b973950c013c17ff28c3fc2958dfff68ec767ef60cd927a3ac4ff5a7345", + "sha256:74e838e0225783f37ae346e60a9f783b4a31adc5731b9cb6d687ee5c93bd87b7", + "sha256:8565de589f42283bca17ddca298f1188a26ef8ee75cadc4a4744cadf5a79cfdf", + "sha256:8bdab6b1781f01c087c54782d656a4fc1df77796c241f122445adcbb24892839", + "sha256:953b877c43f1fa53204b1b0eedd04efa6739378a873e79fa34ee5296d47a9ca1", + "sha256:a0d8c641aa26e040d62166cbe2052dd3cd575e3e0c78c00c52770be6d7dd386b", + "sha256:a469a7e73f5ab1d59b52a525a89a4a280426d1ba08eb081261f8bc6775f101d6", + "sha256:ae3ae86ba69d75327b1c5cd368138fb9329bc7eb7418d6b0ce9504c5070974ef", + "sha256:b47250e5bb853e37db5db423bafc82847f4cde0ffdf7aebb06336a993bc174f6", + "sha256:badb7dc70ecd8042ddd98fdd41803d5e5b28bf7c90910bb1751906812326ab54", + "sha256:c7b47d94aefe6e03085f4d9ce74f6133741164d470ac2839af9906686c6c2ed1", + "sha256:d5fc7fbad53379c30b2c9d46c235130a4b96e0597653e32e7680a310da06bd07", + "sha256:d81d2486e4f9b65f7c6cab252f3e706c8e8e72bbd0311f72c1a5ec56c947d257", + "sha256:d99156b461f914cafbe6ee3b511612a83e90061addbe1f2660f522e9841fbdc4", + "sha256:e0611ffb6ceeee1b677bd224e657895193eec03ad39538f5263ce61db465f836", + "sha256:eac60fdb28bd421f72eb18824bd2e4f36c3dab0d7f4802ebfe4bbf68744a524a" ], - "markers": "python_version >= '3.9'", - "version": "==1.6.0" + "markers": "python_version >= '3.10'", + "version": "==1.7.0" }, "pyyaml": { "hashes": [ @@ -3667,88 +3689,103 @@ }, "regex": { "hashes": [ - "sha256:01b689e887f612610c869421241e075c02f2e3d1ae93a037cb14f88ab6a8934c", - "sha256:04ce29e2c5fedf296b1a1b0acc1724ba93a36fb14031f3abfb7abda2806c1535", - "sha256:0ffe3f9d430cd37d8fa5632ff6fb36d5b24818c5c986893063b4e5bdb84cdf24", - "sha256:18300a1d78cf1290fa583cd8b7cde26ecb73e9f5916690cf9d42de569c89b1ce", - "sha256:185e029368d6f89f36e526764cf12bf8d6f0e3a2a7737da625a76f594bdfcbfc", - "sha256:19c65b00d42804e3fbea9708f0937d157e53429a39b7c61253ff15670ff62cb5", - "sha256:228b0d3f567fafa0633aee87f08b9276c7062da9616931382993c03808bb68ce", - "sha256:23acc72f0f4e1a9e6e9843d6328177ae3074b4182167e34119ec7233dfeccf53", - "sha256:25419b70ba00a16abc90ee5fce061228206173231f004437730b67ac77323f0d", - "sha256:2dfbb8baf8ba2c2b9aa2807f44ed272f0913eeeba002478c4577b8d29cde215c", - "sha256:2f1baff13cc2521bea83ab2528e7a80cbe0ebb2c6f0bfad15be7da3aed443908", - "sha256:33e2614a7ce627f0cdf2ad104797d1f68342d967de3695678c0cb84f530709f8", - "sha256:3426de3b91d1bc73249042742f45c2148803c111d1175b283270177fdf669024", - "sha256:382281306e3adaaa7b8b9ebbb3ffb43358a7bbf585fa93821300a418bb975281", - "sha256:3d974d24edb231446f708c455fd08f94c41c1ff4f04bcf06e5f36df5ef50b95a", - "sha256:3f3b6ca8eae6d6c75a6cff525c8530c60e909a71a15e1b731723233331de4169", - "sha256:3fac296f99283ac232d8125be932c5cd7644084a30748fda013028c815ba3364", - "sha256:416c0e4f56308f34cdb18c3f59849479dde5b19febdcd6e6fa4d04b6c31c9faa", - "sha256:438d9f0f4bc64e8dea78274caa5af971ceff0f8771e1a2333620969936ba10be", - "sha256:43affe33137fcd679bdae93fb25924979517e011f9dea99163f80b82eadc7e53", - "sha256:44fc61b99035fd9b3b9453f1713234e5a7c92a04f3577252b45feefe1b327759", - "sha256:45104baae8b9f67569f0f1dca5e1f1ed77a54ae1cd8b0b07aba89272710db61e", - "sha256:4fdd1384619f406ad9037fe6b6eaa3de2749e2e12084abc80169e8e075377d3b", - "sha256:538d30cd96ed7d1416d3956f94d54e426a8daf7c14527f6e0d6d425fcb4cca52", - "sha256:558a57cfc32adcf19d3f791f62b5ff564922942e389e3cfdb538a23d65a6b610", - "sha256:5eefee9bfe23f6df09ffb6dfb23809f4d74a78acef004aa904dc7c88b9944b05", - "sha256:64bd50cf16bcc54b274e20235bf8edbb64184a30e1e53873ff8d444e7ac656b2", - "sha256:65fd3d2e228cae024c411c5ccdffae4c315271eee4a8b839291f84f796b34eca", - "sha256:66b4c0731a5c81921e938dcf1a88e978264e26e6ac4ec96a4d21ae0354581ae0", - "sha256:68a8f8c046c6466ac61a36b65bb2395c74451df2ffb8458492ef49900efed293", - "sha256:6a1141a1dcc32904c47f6846b040275c6e5de0bf73f17d7a409035d55b76f289", - "sha256:6b9fc7e9cc983e75e2518496ba1afc524227c163e43d706688a6bb9eca41617e", - "sha256:6f51f9556785e5a203713f5efd9c085b4a45aecd2a42573e2b5041881b588d1f", - "sha256:7214477bf9bd195894cf24005b1e7b496f46833337b5dedb7b2a6e33f66d962c", - "sha256:731fcd76bbdbf225e2eb85b7c38da9633ad3073822f5ab32379381e8c3c12e94", - "sha256:74007a5b25b7a678459f06559504f1eec2f0f17bca218c9d56f6a0a12bfffdad", - "sha256:7a5486ca56c8869070a966321d5ab416ff0f83f30e0e2da1ab48815c8d165d46", - "sha256:7c479f5ae937ec9985ecaf42e2e10631551d909f203e31308c12d703922742f9", - "sha256:7df9ea48641da022c2a3c9c641650cd09f0cd15e8908bf931ad538f5ca7919c9", - "sha256:7e37e809b9303ec3a179085415cb5f418ecf65ec98cdfe34f6a078b46ef823ee", - "sha256:80c811cfcb5c331237d9bad3bea2c391114588cf4131707e84d9493064d267f9", - "sha256:836d3cc225b3e8a943d0b02633fb2f28a66e281290302a79df0e1eaa984ff7c1", - "sha256:84c312cdf839e8b579f504afcd7b65f35d60b6285d892b19adea16355e8343c9", - "sha256:86b17ba823ea76256b1885652e3a141a99a5c4422f4a869189db328321b73799", - "sha256:871e3ab2838fbcb4e0865a6e01233975df3a15e6fce93b6f99d75cacbd9862d1", - "sha256:88ecc3afd7e776967fa16c80f974cb79399ee8dc6c96423321d6f7d4b881c92b", - "sha256:8bc593dcce679206b60a538c302d03c29b18e3d862609317cb560e18b66d10cf", - "sha256:8fd5afd101dcf86a270d254364e0e8dddedebe6bd1ab9d5f732f274fa00499a5", - "sha256:945352286a541406f99b2655c973852da7911b3f4264e010218bbc1cc73168f2", - "sha256:973335b1624859cb0e52f96062a28aa18f3a5fc77a96e4a3d6d76e29811a0e6e", - "sha256:994448ee01864501912abf2bad9203bffc34158e80fe8bfb5b031f4f8e16da51", - "sha256:9cfd009eed1a46b27c14039ad5bbc5e71b6367c5b2e6d5f5da0ea91600817506", - "sha256:a2ec4419a3fe6cf8a4795752596dfe0adb4aea40d3683a132bae9c30b81e8d73", - "sha256:a4997716674d36a82eab3e86f8fa77080a5d8d96a389a61ea1d0e3a94a582cf7", - "sha256:a512eed9dfd4117110b1881ba9a59b31433caed0c4101b361f768e7bcbaf93c5", - "sha256:a82465ebbc9b1c5c50738536fdfa7cab639a261a99b469c9d4c7dcbb2b3f1e57", - "sha256:ae2757ace61bc4061b69af19e4689fa4416e1a04840f33b441034202b5cd02d4", - "sha256:b16582783f44fbca6fcf46f61347340c787d7530d88b4d590a397a47583f31dd", - "sha256:ba2537ef2163db9e6ccdbeb6f6424282ae4dea43177402152c67ef869cf3978b", - "sha256:bf7a89eef64b5455835f5ed30254ec19bf41f7541cd94f266ab7cbd463f00c41", - "sha256:c0abb5e4e8ce71a61d9446040c1e86d4e6d23f9097275c5bd49ed978755ff0fe", - "sha256:c414cbda77dbf13c3bc88b073a1a9f375c7b0cb5e115e15d4b73ec3a2fbc6f59", - "sha256:c51edc3541e11fbe83f0c4d9412ef6c79f664a3745fab261457e84465ec9d5a8", - "sha256:c5e69fd3eb0b409432b537fe3c6f44ac089c458ab6b78dcec14478422879ec5f", - "sha256:c918b7a1e26b4ab40409820ddccc5d49871a82329640f5005f73572d5eaa9b5e", - "sha256:c9bb87fdf2ab2370f21e4d5636e5317775e5d51ff32ebff2cf389f71b9b13750", - "sha256:ca5b2028c2f7af4e13fb9fc29b28d0ce767c38c7facdf64f6c2cd040413055f1", - "sha256:d0a07763776188b4db4c9c7fb1b8c494049f84659bb387b71c73bbc07f189e96", - "sha256:d33a0021893ede5969876052796165bab6006559ab845fd7b515a30abdd990dc", - "sha256:d55588cba7553f0b6ec33130bc3e114b355570b45785cebdc9daed8c637dd440", - "sha256:dac8e84fff5d27420f3c1e879ce9929108e873667ec87e0c8eeb413a5311adfe", - "sha256:eaef80eac3b4cfbdd6de53c6e108b4c534c21ae055d1dbea2de6b3b8ff3def38", - "sha256:eb462f0e346fcf41a901a126b50f8781e9a474d3927930f3490f38a6e73b6950", - "sha256:eb563dd3aea54c797adf513eeec819c4213d7dbfc311874eb4fd28d10f2ff0f2", - "sha256:f273674b445bcb6e4409bf8d1be67bc4b58e8b46fd0d560055d515b8830063cd", - "sha256:f6442f0f0ff81775eaa5b05af8a0ffa1dda36e9cf6ec1e0d3d245e8564b684ce", - "sha256:fb168b5924bef397b5ba13aabd8cf5df7d3d93f10218d7b925e360d436863f66", - "sha256:fbf8c2f00904eaf63ff37718eb13acf8e178cb940520e47b2f05027f5bb34ce3", - "sha256:fe4ebef608553aff8deb845c7f4f1d0740ff76fa672c011cc0bacb2a00fbde86" + "sha256:01c2acb51f8a7d6494c8c5eafe3d8e06d76563d8a8a4643b37e9b2dd8a2ff623", + "sha256:02087ea0a03b4af1ed6ebab2c54d7118127fee8d71b26398e8e4b05b78963199", + "sha256:040562757795eeea356394a7fb13076ad4f99d3c62ab0f8bdfb21f99a1f85664", + "sha256:042c55879cfeb21a8adacc84ea347721d3d83a159da6acdf1116859e2427c43f", + "sha256:079400a8269544b955ffa9e31f186f01d96829110a3bf79dc338e9910f794fca", + "sha256:07f45f287469039ffc2c53caf6803cd506eb5f5f637f1d4acb37a738f71dd066", + "sha256:09d77559e80dcc9d24570da3745ab859a9cf91953062e4ab126ba9d5993688ca", + "sha256:0cbff728659ce4bbf4c30b2a1be040faafaa9eca6ecde40aaff86f7889f4ab39", + "sha256:0e12c481ad92d129c78f13a2a3662317e46ee7ef96c94fd332e1c29131875b7d", + "sha256:0ea51dcc0835eea2ea31d66456210a4e01a076d820e9039b04ae8d17ac11dee6", + "sha256:0ffbcf9221e04502fc35e54d1ce9567541979c3fdfb93d2c554f0ca583a19b35", + "sha256:1494fa8725c285a81d01dc8c06b55287a1ee5e0e382d8413adc0a9197aac6408", + "sha256:16e13a7929791ac1216afde26f712802e3df7bf0360b32e4914dca3ab8baeea5", + "sha256:18406efb2f5a0e57e3a5881cd9354c1512d3bb4f5c45d96d110a66114d84d23a", + "sha256:18e707ce6c92d7282dfce370cd205098384b8ee21544e7cb29b8aab955b66fa9", + "sha256:220e92a30b426daf23bb67a7962900ed4613589bab80382be09b48896d211e92", + "sha256:23b30c62d0f16827f2ae9f2bb87619bc4fba2044911e2e6c2eb1af0161cdb766", + "sha256:23f9985c8784e544d53fc2930fc1ac1a7319f5d5332d228437acc9f418f2f168", + "sha256:297f54910247508e6e5cae669f2bc308985c60540a4edd1c77203ef19bfa63ca", + "sha256:2b08fce89fbd45664d3df6ad93e554b6c16933ffa9d55cb7e01182baaf971508", + "sha256:2cce2449e5927a0bf084d346da6cd5eb016b2beca10d0013ab50e3c226ffc0df", + "sha256:313ea15e5ff2a8cbbad96ccef6be638393041b0a7863183c2d31e0c6116688cf", + "sha256:323c1f04be6b2968944d730e5c2091c8c89767903ecaa135203eec4565ed2b2b", + "sha256:35f4a6f96aa6cb3f2f7247027b07b15a374f0d5b912c0001418d1d55024d5cb4", + "sha256:3b37fa423beefa44919e009745ccbf353d8c981516e807995b2bd11c2c77d268", + "sha256:3ce4f1185db3fbde8ed8aa223fc9620f276c58de8b0d4f8cc86fd1360829edb6", + "sha256:46989629904bad940bbec2106528140a218b4a36bb3042d8406980be1941429c", + "sha256:4838e24ee015101d9f901988001038f7f0d90dc0c3b115541a1365fb439add62", + "sha256:49b0e06786ea663f933f3710a51e9385ce0cba0ea56b67107fd841a55d56a231", + "sha256:4db21ece84dfeefc5d8a3863f101995de646c6cb0536952c321a2650aa202c36", + "sha256:54c4a097b8bc5bb0dfc83ae498061d53ad7b5762e00f4adaa23bee22b012e6ba", + "sha256:54d9ff35d4515debf14bc27f1e3b38bfc453eff3220f5bce159642fa762fe5d4", + "sha256:55b96e7ce3a69a8449a66984c268062fbaa0d8ae437b285428e12797baefce7e", + "sha256:57fdd2e0b2694ce6fc2e5ccf189789c3e2962916fb38779d3e3521ff8fe7a822", + "sha256:587d4af3979376652010e400accc30404e6c16b7df574048ab1f581af82065e4", + "sha256:5b513b6997a0b2f10e4fd3a1313568e373926e8c252bd76c960f96fd039cd28d", + "sha256:5ddcd9a179c0a6fa8add279a4444015acddcd7f232a49071ae57fa6e278f1f71", + "sha256:6113c008a7780792efc80f9dfe10ba0cd043cbf8dc9a76ef757850f51b4edc50", + "sha256:635a1d96665f84b292e401c3d62775851aedc31d4f8784117b3c68c4fcd4118d", + "sha256:64ce2799bd75039b480cc0360907c4fb2f50022f030bf9e7a8705b636e408fad", + "sha256:69dee6a020693d12a3cf892aba4808fe168d2a4cef368eb9bf74f5398bfd4ee8", + "sha256:6a2644a93da36c784e546de579ec1806bfd2763ef47babc1b03d765fe560c9f8", + "sha256:6b41e1adc61fa347662b09398e31ad446afadff932a24807d3ceb955ed865cc8", + "sha256:6c188c307e8433bcb63dc1915022deb553b4203a70722fc542c363bf120a01fd", + "sha256:6edd623bae6a737f10ce853ea076f56f507fd7726bee96a41ee3d68d347e4d16", + "sha256:73d6d2f64f4d894c96626a75578b0bf7d9e56dcda8c3d037a2118fdfe9b1c664", + "sha256:7a22ccefd4db3f12b526eccb129390942fe874a3a9fdbdd24cf55773a1faab1a", + "sha256:7fb89ee5d106e4a7a51bce305ac4efb981536301895f7bdcf93ec92ae0d91c7f", + "sha256:846bc79ee753acf93aef4184c040d709940c9d001029ceb7b7a52747b80ed2dd", + "sha256:85ab7824093d8f10d44330fe1e6493f756f252d145323dd17ab6b48733ff6c0a", + "sha256:8dee5b4810a89447151999428fe096977346cf2f29f4d5e29609d2e19e0199c9", + "sha256:8e5fb5f77c8745a60105403a774fe2c1759b71d3e7b4ca237a5e67ad066c7199", + "sha256:98eeee2f2e63edae2181c886d7911ce502e1292794f4c5ee71e60e23e8d26b5d", + "sha256:9d4a76b96f398697fe01117093613166e6aa8195d63f1b4ec3f21ab637632963", + "sha256:9e8719792ca63c6b8340380352c24dcb8cd7ec49dae36e963742a275dfae6009", + "sha256:a0b2b80321c2ed3fcf0385ec9e51a12253c50f146fddb2abbb10f033fe3d049a", + "sha256:a4cc92bb6db56ab0c1cbd17294e14f5e9224f0cc6521167ef388332604e92679", + "sha256:a738b937d512b30bf75995c0159c0ddf9eec0775c9d72ac0202076c72f24aa96", + "sha256:a8f877c89719d759e52783f7fe6e1c67121076b87b40542966c02de5503ace42", + "sha256:a906ed5e47a0ce5f04b2c981af1c9acf9e8696066900bf03b9d7879a6f679fc8", + "sha256:ae2941333154baff9838e88aa71c1d84f4438189ecc6021a12c7573728b5838e", + "sha256:b0d0a6c64fcc4ef9c69bd5b3b3626cc3776520a1637d8abaa62b9edc147a58f7", + "sha256:b5b029322e6e7b94fff16cd120ab35a253236a5f99a79fb04fda7ae71ca20ae8", + "sha256:b7aaa315101c6567a9a45d2839322c51c8d6e81f67683d529512f5bcfb99c802", + "sha256:be1c8ed48c4c4065ecb19d882a0ce1afe0745dfad8ce48c49586b90a55f02366", + "sha256:c0256beda696edcf7d97ef16b2a33a8e5a875affd6fa6567b54f7c577b30a137", + "sha256:c157bb447303070f256e084668b702073db99bbb61d44f85d811025fcf38f784", + "sha256:c57d08ad67aba97af57a7263c2d9006d5c404d721c5f7542f077f109ec2a4a29", + "sha256:c69ada171c2d0e97a4b5aa78fbb835e0ffbb6b13fc5da968c09811346564f0d3", + "sha256:c94bb0a9f1db10a1d16c00880bdebd5f9faf267273b8f5bd1878126e0fbde771", + "sha256:cb130fccd1a37ed894824b8c046321540263013da72745d755f2d35114b81a60", + "sha256:ced479f601cd2f8ca1fd7b23925a7e0ad512a56d6e9476f79b8f381d9d37090a", + "sha256:d05ac6fa06959c4172eccd99a222e1fbf17b5670c4d596cb1e5cde99600674c4", + "sha256:d552c78411f60b1fdaafd117a1fca2f02e562e309223b9d44b7de8be451ec5e0", + "sha256:dd4490a33eb909ef5078ab20f5f000087afa2a4daa27b4c072ccb3cb3050ad84", + "sha256:df5cbb1fbc74a8305b6065d4ade43b993be03dbe0f8b30032cced0d7740994bd", + "sha256:e28f9faeb14b6f23ac55bfbbfd3643f5c7c18ede093977f1df249f73fd22c7b1", + "sha256:e464b467f1588e2c42d26814231edecbcfe77f5ac414d92cbf4e7b55b2c2a776", + "sha256:e4c22e1ac1f1ec1e09f72e6c44d8f2244173db7eb9629cc3a346a8d7ccc31142", + "sha256:e53b5fbab5d675aec9f0c501274c467c0f9a5d23696cfc94247e1fb56501ed89", + "sha256:e93f1c331ca8e86fe877a48ad64e77882c0c4da0097f2212873a69bbfea95d0c", + "sha256:e997fd30430c57138adc06bba4c7c2968fb13d101e57dd5bb9355bf8ce3fa7e8", + "sha256:e9a091b0550b3b0207784a7d6d0f1a00d1d1c8a11699c1a4d93db3fbefc3ad35", + "sha256:eab4bb380f15e189d1313195b062a6aa908f5bd687a0ceccd47c8211e9cf0d4a", + "sha256:eb1ae19e64c14c7ec1995f40bd932448713d3c73509e82d8cd7744dc00e29e86", + "sha256:ecea58b43a67b1b79805f1a0255730edaf5191ecef84dbc4cc85eb30bc8b63b9", + "sha256:ee439691d8c23e76f9802c42a95cfeebf9d47cf4ffd06f18489122dbb0a7ad64", + "sha256:eee9130eaad130649fd73e5cd92f60e55708952260ede70da64de420cdcad554", + "sha256:f47cd43a5bfa48f86925fe26fbdd0a488ff15b62468abb5d2a1e092a4fb10e85", + "sha256:f6fff13ef6b5f29221d6904aa816c34701462956aa72a77f1f151a8ec4f56aeb", + "sha256:f745ec09bc1b0bd15cfc73df6fa4f726dcc26bb16c23a03f9e3367d357eeedd0", + "sha256:f8404bf61298bb6f8224bb9176c1424548ee1181130818fcd2cbffddc768bed8", + "sha256:f9268774428ec173654985ce55fc6caf4c6d11ade0f6f914d48ef4719eb05ebb", + "sha256:faa3c142464efec496967359ca99696c896c591c56c53506bac1ad465f66e919" ], "markers": "python_version >= '3.8'", - "version": "==2024.7.24" + "version": "==2024.9.11" }, "requests": { "hashes": [ @@ -3760,59 +3797,67 @@ }, "ruff": { "hashes": [ - "sha256:005256d977021790cc52aa23d78f06bb5090dc0bfbd42de46d49c201533982ae", - "sha256:09c72a833fd3551135ceddcba5ebdb68ff89225d30758027280968c9acdc7810", - "sha256:381413ec47f71ce1d1c614f7779d88886f406f1fd53d289c77e4e533dc6ea200", - "sha256:3a8d42d11fff8d3143ff4da41742a98f8f233bf8890e9fe23077826818f8d680", - "sha256:3e42a57b58e3612051a636bc1ac4e6b838679530235520e8f095f7c44f706ff9", - "sha256:482c1e6bfeb615eafc5899127b805d28e387bd87db38b2c0c41d271f5e58d8cc", - "sha256:4d32d87fab433c0cf285c3683dd4dae63be05fd7a1d65b3f5bf7cdd05a6b96fb", - "sha256:51935067740773afdf97493ba9b8231279e9beef0f2a8079188c4776c25688e0", - "sha256:52e75a82bbc9b42e63c08d22ad0ac525117e72aee9729a069d7c4f235fc4d276", - "sha256:7291e64d7129f24d1b0c947ec3ec4c0076e958d1475c61202497c6aced35dd19", - "sha256:794ada3400a0d0b89e3015f1a7e01f4c97320ac665b7bc3ade24b50b54cb2972", - "sha256:7e4e308f16e07c95fc7753fc1aaac690a323b2bb9f4ec5e844a97bb7fbebd748", - "sha256:800c50371bdcb99b3c1551d5691e14d16d6f07063a518770254227f7f6e8c178", - "sha256:8e25ddd9cd63ba1f3bd51c1f09903904a6adf8429df34f17d728a8fa11174253", - "sha256:932cd69eefe4daf8c7d92bd6689f7e8182571cb934ea720af218929da7bd7d69", - "sha256:9ad7dfbd138d09d9a7e6931e6a7e797651ce29becd688be8a0d4d5f8177b4b0c", - "sha256:a50af6e828ee692fb10ff2dfe53f05caecf077f4210fae9677e06a808275754f", - "sha256:cf4d3fa53644137f6a4a27a2b397381d16454a1566ae5335855c187fbf67e4f5" + "sha256:007dee844738c3d2e6c24ab5bc7d43c99ba3e1943bd2d95d598582e9c1b27750", + "sha256:1085c455d1b3fdb8021ad534379c60353b81ba079712bce7a900e834859182fa", + "sha256:27b87e1801e786cd6ede4ada3faa5e254ce774de835e6723fd94551464c56b8c", + "sha256:5fd0d4b7b1457c49e435ee1e437900ced9b35cb8dc5178921dfb7d98d65a08d0", + "sha256:677e03c00f37c66cea033274295a983c7c546edea5043d0c798833adf4cf4c6f", + "sha256:6cfb227b932ba8ef6e56c9f875d987973cd5e35bc5d05f5abf045af78ad8e098", + "sha256:6ef0411eccfc3909269fed47c61ffebdcb84a04504bafa6b6df9b85c27e813b0", + "sha256:6f5a2f17c7d32991169195d52a04c95b256378bbf0de8cb98478351eb70d526f", + "sha256:70edf6a93b19481affd287d696d9e311388d808671bc209fb8907b46a8c3af44", + "sha256:77944bca110ff0a43b768f05a529fecd0706aac7bcce36d7f1eeb4cbfca5f0f2", + "sha256:792213f7be25316f9b46b854df80a77e0da87ec66691e8f012f887b4a671ab5a", + "sha256:8d3bb2e3fbb9875172119021a13eed38849e762499e3cfde9588e4b4d70968dc", + "sha256:9f1476236b3eacfacfc0f66aa9e6cd39f2a624cb73ea99189556015f27c0bdeb", + "sha256:a5bf44b1aa0adaf6d9d20f86162b34f7c593bfedabc51239953e446aefc8ce18", + "sha256:cd48f945da2a6334f1793d7f701725a76ba93bf3d73c36f6b21fb04d5338dcf5", + "sha256:ce60058d3cdd8490e5e5471ef086b3f1e90ab872b548814e35930e21d848c9ce", + "sha256:ec0517dc0f37cad14a5319ba7bba6e7e339d03fbf967a6d69b0907d61be7a263", + "sha256:f8034b19b993e9601f2ddf2c517451e17a6ab5cdb1c13fdff50c1442a7171d87" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==0.6.5" + "version": "==0.6.8" }, "scipy": { "hashes": [ - "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", - "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", - "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", - "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", - "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", - "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", - "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", - "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", - "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", - "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", - "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", - "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", - "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", - "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", - "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", - "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", - "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", - "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", - "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", - "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", - "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", - "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", - "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", - "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", - "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f" + "sha256:0c2f95de3b04e26f5f3ad5bb05e74ba7f68b837133a4492414b3afd79dfe540e", + "sha256:1729560c906963fc8389f6aac023739ff3983e727b1a4d87696b7bf108316a79", + "sha256:278266012eb69f4a720827bdd2dc54b2271c97d84255b2faaa8f161a158c3b37", + "sha256:2843f2d527d9eebec9a43e6b406fb7266f3af25a751aa91d62ff416f54170bc5", + "sha256:2da0469a4ef0ecd3693761acbdc20f2fdeafb69e6819cc081308cc978153c675", + "sha256:2ff0a7e01e422c15739ecd64432743cf7aae2b03f3084288f399affcefe5222d", + "sha256:2ff38e22128e6c03ff73b6bb0f85f897d2362f8c052e3b8ad00532198fbdae3f", + "sha256:30ac8812c1d2aab7131a79ba62933a2a76f582d5dbbc695192453dae67ad6310", + "sha256:3a1b111fac6baec1c1d92f27e76511c9e7218f1695d61b59e05e0fe04dc59617", + "sha256:4079b90df244709e675cdc8b93bfd8a395d59af40b72e339c2287c91860deb8e", + "sha256:5149e3fd2d686e42144a093b206aef01932a0059c2a33ddfa67f5f035bdfe13e", + "sha256:5a275584e726026a5699459aa72f828a610821006228e841b94275c4a7c08417", + "sha256:631f07b3734d34aced009aaf6fedfd0eb3498a97e581c3b1e5f14a04164a456d", + "sha256:716e389b694c4bb564b4fc0c51bc84d381735e0d39d3f26ec1af2556ec6aad94", + "sha256:8426251ad1e4ad903a4514712d2fa8fdd5382c978010d1c6f5f37ef286a713ad", + "sha256:8475230e55549ab3f207bff11ebfc91c805dc3463ef62eda3ccf593254524ce8", + "sha256:8bddf15838ba768bb5f5083c1ea012d64c9a444e16192762bd858f1e126196d0", + "sha256:8e32dced201274bf96899e6491d9ba3e9a5f6b336708656466ad0522d8528f69", + "sha256:8f9ea80f2e65bdaa0b7627fb00cbeb2daf163caa015e59b7516395fe3bd1e066", + "sha256:97c5dddd5932bd2a1a31c927ba5e1463a53b87ca96b5c9bdf5dfd6096e27efc3", + "sha256:a49f6ed96f83966f576b33a44257d869756df6cf1ef4934f59dd58b25e0327e5", + "sha256:af29a935803cc707ab2ed7791c44288a682f9c8107bc00f0eccc4f92c08d6e07", + "sha256:b05d43735bb2f07d689f56f7b474788a13ed8adc484a85aa65c0fd931cf9ccd2", + "sha256:b28d2ca4add7ac16ae8bb6632a3c86e4b9e4d52d3e34267f6e1b0c1f8d87e389", + "sha256:b99722ea48b7ea25e8e015e8341ae74624f72e5f21fc2abd45f3a93266de4c5d", + "sha256:baff393942b550823bfce952bb62270ee17504d02a1801d7fd0719534dfb9c84", + "sha256:c0ee987efa6737242745f347835da2cc5bb9f1b42996a4d97d5c7ff7928cb6f2", + "sha256:d0d2821003174de06b69e58cef2316a6622b60ee613121199cb2852a873f8cf3", + "sha256:e0cf28db0f24a38b2a0ca33a85a54852586e43cf6fd876365c86e0657cfe7d73", + "sha256:e4f5a7c49323533f9103d4dacf4e4f07078f360743dec7f7596949149efeec06", + "sha256:eb58ca0abd96911932f688528977858681a59d61a7ce908ffd355957f7025cfc", + "sha256:edaf02b82cd7639db00dbff629995ef185c8df4c3ffa71a5562a595765a06ce1", + "sha256:fef8c87f8abfb884dac04e97824b61299880c43f4ce675dd2cbeadd3c9b466d2" ], - "markers": "python_version >= '3.9'", - "version": "==1.13.1" + "markers": "python_version >= '3.10'", + "version": "==1.14.1" }, "service-identity": { "hashes": [ @@ -3823,11 +3868,11 @@ }, "setuptools": { "hashes": [ - "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308", - "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6" + "sha256:35ab7fd3bcd95e6b7fd704e4a1539513edad446c097797f2985e0e4b960772f2", + "sha256:d59a21b17a275fb872a9c3dae73963160ae079f1049ed956880cd7c09b120538" ], "markers": "python_version >= '3.8'", - "version": "==74.1.2" + "version": "==75.1.0" }, "six": { "hashes": [ @@ -3890,19 +3935,19 @@ }, "urllib3": { "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" + "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], "markers": "python_version >= '3.8'", - "version": "==2.2.2" + "version": "==2.2.3" }, "virtualenv": { "hashes": [ - "sha256:48f2695d9809277003f30776d155615ffc11328e6a0a8c1f0ec80188d7874a55", - "sha256:c17f4e0f3e6036e9f26700446f85c76ab11df65ff6d8a9cbfad9f71aabfcf23c" + "sha256:4f3ac17b81fba3ce3bd6f4ead2749a72da5929c01774948e243db9ba41df4ff6", + "sha256:ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4" ], "markers": "python_version >= '3.7'", - "version": "==20.26.4" + "version": "==20.26.5" }, "watchdog": { "hashes": [ @@ -3946,14 +3991,6 @@ "markers": "python_version >= '3.8'", "version": "==4.0.2" }, - "zipp": { - "hashes": [ - "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064", - "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b" - ], - "markers": "python_version >= '3.8'", - "version": "==3.20.1" - }, "zope-interface": { "hashes": [ "sha256:01e6e58078ad2799130c14a1d34ec89044ada0e1495329d72ee0407b9ae5100d", @@ -4190,20 +4227,6 @@ "markers": "python_full_version >= '3.7.0'", "version": "==3.3.2" }, - "coreapi": { - "hashes": [ - "sha256:46145fcc1f7017c076a2ef684969b641d18a2991051fddec9458ad3f78ffc1cb", - "sha256:bf39d118d6d3e171f10df9ede5666f63ad80bba9a29a8ec17726a66cf52ee6f3" - ], - "version": "==2.3.3" - }, - "coreschema": { - "hashes": [ - "sha256:5e6ef7bf38c1525d5e55a895934ab4273548629f16aed5c0a6caa74ebf45551f", - "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607" - ], - "version": "==0.0.4" - }, "cryptography": { "hashes": [ "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494", @@ -4259,119 +4282,38 @@ "compatible-mypy" ], "hashes": [ - "sha256:78e3764488fdfd2695f12502136548ec22f8d4b1780541a835042b8238d11514", - "sha256:c2502f5ecbae50c68f9a86d52b5b2447d8648fd205036dad0ccb41e19a445927" + "sha256:86128c228b65e6c9a85e5dc56eb1c6f41125917dae0e21e6cfecdf1b27e630c5", + "sha256:b98d49a80aa4adf1433a97407102d068de26c739c405431d93faad96dd282c40" ], "markers": "python_version >= '3.8'", - "version": "==5.0.4" + "version": "==5.1.0" }, "django-stubs-ext": { "hashes": [ - "sha256:85da065224204774208be29c7d02b4482d5a69218a728465c2fbe41725fdc819", - "sha256:910cbaff3d1e8e806a5c27d5ddd4088535aae8371ea921b7fd680fdfa5f14e30" + "sha256:a455fc222c90b30b29ad8c53319559f5b54a99b4197205ddbb385aede03b395d", + "sha256:ed7d51c0b731651879fc75f331fb0806d98b67bfab464e96e2724db6b46ef926" ], "markers": "python_version >= '3.8'", - "version": "==5.0.4" + "version": "==5.1.0" }, "djangorestframework-stubs": { "extras": [ "compatible-mypy" ], "hashes": [ - "sha256:037f0582b1e6c79366b6a839da861474d59210c4bfa1d36291545cb6ede6a0da", - "sha256:f6ed5fb19c12aa752288ddc6ad28d4ca7c81681ca7f28a19aba9064b2a69489c" + "sha256:34539871895d66d382b6ae3655d9f95c1de7733cf50bc29097638d367ed3117d", + "sha256:79dc9018f5d5fa420f9981eec9f1e820ecbd04719791f144419cdc6c5b8e29bd" ], - "markers": "python_version >= '3.6'", - "version": "==1.4.0" + "markers": "python_version >= '3.8'", + "version": "==3.15.1" }, "idna": { "hashes": [ - "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", - "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" + "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" ], "markers": "python_version >= '3.6'", - "version": "==3.8" - }, - "itypes": { - "hashes": [ - "sha256:03da6872ca89d29aef62773672b2d408f490f80db48b23079a4b194c86dd04c6", - "sha256:af886f129dea4a2a1e3d36595a2d139589e4dd287f5cab0b40e799ee81570ff1" - ], - "version": "==1.2.0" - }, - "jinja2": { - "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.4" - }, - "markupsafe": { - "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" + "version": "==3.10" }, "mypy": { "hashes": [ @@ -4544,11 +4486,11 @@ }, "types-pyyaml": { "hashes": [ - "sha256:b8f76ddbd7f65440a8bda5526a9607e4c7a322dc2f8e1a8c405644f9a6f4b9af", - "sha256:deda34c5c655265fc517b546c902aa6eed2ef8d3e921e4765fe606fe2afe8d35" + "sha256:392b267f1c0fe6022952462bf5d6523f31e37f6cea49b14cee7ad634b6301570", + "sha256:d1405a86f9576682234ef83bcb4e6fff7c9305c8b1fbad5e0bcd4f7dbdc9c587" ], "markers": "python_version >= '3.8'", - "version": "==6.0.12.20240808" + "version": "==6.0.12.20240917" }, "types-redis": { "hashes": [ @@ -4559,14 +4501,22 @@ "markers": "python_version >= '3.8'", "version": "==4.6.0.20240903" }, + "types-requests": { + "hashes": [ + "sha256:2850e178db3919d9bf809e434eef65ba49d0e7e33ac92d588f4a5e295fffd405", + "sha256:59c2f673eb55f32a99b2894faf6020e1a9f4a402ad0f192bfee0b64469054310" + ], + "markers": "python_version >= '3.8'", + "version": "==2.32.0.20240914" + }, "types-setuptools": { "hashes": [ - "sha256:0abdb082552ca966c1e5fc244e4853adc62971f6cd724fb1d8a3713b580e5a65", - "sha256:15b38c8e63ca34f42f6063ff4b1dd662ea20086166d5ad6a102e670a52574120" + "sha256:06f78307e68d1bbde6938072c57b81cf8a99bc84bd6dc7e4c5014730b097dc0c", + "sha256:12f12a165e7ed383f31def705e5c0fa1c26215dd466b0af34bd042f7d5331f55" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==74.1.0.20240907" + "version": "==75.1.0.20240917" }, "types-tqdm": { "hashes": [ @@ -4585,21 +4535,13 @@ "markers": "python_version < '3.11'", "version": "==4.12.2" }, - "uritemplate": { - "hashes": [ - "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0", - "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e" - ], - "markers": "python_version >= '3.6'", - "version": "==4.1.1" - }, "urllib3": { "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" + "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", + "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], "markers": "python_version >= '3.8'", - "version": "==2.2.2" + "version": "==2.2.3" } } } diff --git a/docs/setup.md b/docs/setup.md index 4fdd7227a..bb5c7ee65 100644 --- a/docs/setup.md +++ b/docs/setup.md @@ -250,7 +250,7 @@ a minimal installation of Debian/Buster, which is the current stable release at the time of writing. Windows is not and will never be supported. -Paperless requires Python 3. At this time, 3.9 - 3.11 are tested versions. +Paperless requires Python 3. At this time, 3.10 - 3.12 are tested versions. Newer versions may work, but some dependencies may not fully support newer versions. Support for older Python versions may be dropped as they reach end of life or as newer versions are released, dependency support is confirmed, etc. diff --git a/src/documents/barcodes.py b/src/documents/barcodes.py index 97177cbf6..746d6014d 100644 --- a/src/documents/barcodes.py +++ b/src/documents/barcodes.py @@ -3,7 +3,6 @@ import re import tempfile from dataclasses import dataclass from pathlib import Path -from typing import Optional from django.conf import settings from pdf2image import convert_from_path @@ -81,7 +80,7 @@ class BarcodePlugin(ConsumeTaskPlugin): self._tiff_conversion_done = False self.barcodes: list[Barcode] = [] - def run(self) -> Optional[str]: + def run(self) -> str | None: # Some operations may use PIL, override pixel setting if needed maybe_override_pixel_limit() @@ -299,7 +298,7 @@ class BarcodePlugin(ConsumeTaskPlugin): ) @property - def asn(self) -> Optional[int]: + def asn(self) -> int | None: """ Search the parsed barcodes for any ASNs. The first barcode that starts with CONSUMER_ASN_BARCODE_PREFIX @@ -334,7 +333,7 @@ class BarcodePlugin(ConsumeTaskPlugin): return asn @property - def tags(self) -> Optional[list[int]]: + def tags(self) -> list[int] | None: """ Search the parsed barcodes for any tags. Returns the detected tag ids (or empty list) diff --git a/src/documents/bulk_edit.py b/src/documents/bulk_edit.py index 4481b2b3f..1aba8f9ec 100644 --- a/src/documents/bulk_edit.py +++ b/src/documents/bulk_edit.py @@ -3,7 +3,6 @@ import itertools import logging import os import tempfile -from typing import Optional from celery import chain from celery import chord @@ -242,7 +241,7 @@ def rotate(doc_ids: list[int], degrees: int): def merge( doc_ids: list[int], - metadata_document_id: Optional[int] = None, + metadata_document_id: int | None = None, delete_originals: bool = False, user: User = None, ): diff --git a/src/documents/caching.py b/src/documents/caching.py index 4bcb22e21..6eb2b691f 100644 --- a/src/documents/caching.py +++ b/src/documents/caching.py @@ -19,8 +19,8 @@ logger = logging.getLogger("paperless.caching") class MetadataCacheData: original_checksum: str original_metadata: list - archive_checksum: Optional[str] - archive_metadata: Optional[list] + archive_checksum: str | None + archive_metadata: list | None @dataclass(frozen=True) @@ -46,7 +46,7 @@ def get_suggestion_cache_key(document_id: int) -> str: return f"doc_{document_id}_suggest" -def get_suggestion_cache(document_id: int) -> Optional[SuggestionCacheData]: +def get_suggestion_cache(document_id: int) -> SuggestionCacheData | None: """ If possible, return the cached suggestions for the given document ID. The classifier needs to be matching in format and hash and the suggestions need to @@ -121,13 +121,13 @@ def get_metadata_cache_key(document_id: int) -> str: return f"doc_{document_id}_metadata" -def get_metadata_cache(document_id: int) -> Optional[MetadataCacheData]: +def get_metadata_cache(document_id: int) -> MetadataCacheData | None: """ Returns the cached document metadata for the given document ID, as long as the metadata was cached once and the checksums have not changed """ doc_key = get_metadata_cache_key(document_id) - doc_metadata: Optional[MetadataCacheData] = cache.get(doc_key) + doc_metadata: MetadataCacheData | None = cache.get(doc_key) # The metadata exists in the cache if doc_metadata is not None: try: @@ -161,7 +161,7 @@ def get_metadata_cache(document_id: int) -> Optional[MetadataCacheData]: def set_metadata_cache( document: Document, original_metadata: list, - archive_metadata: Optional[list], + archive_metadata: list | None, *, timeout=CACHE_50_MINUTES, ) -> None: diff --git a/src/documents/classifier.py b/src/documents/classifier.py index 66b06d69d..26a1ae478 100644 --- a/src/documents/classifier.py +++ b/src/documents/classifier.py @@ -78,9 +78,9 @@ class DocumentClassifier: def __init__(self): # last time a document changed and therefore training might be required - self.last_doc_change_time: Optional[datetime] = None + self.last_doc_change_time: datetime | None = None # Hash of primary keys of AUTO matching values last used in training - self.last_auto_type_hash: Optional[bytes] = None + self.last_auto_type_hash: bytes | None = None self.data_vectorizer = None self.tags_binarizer = None @@ -408,7 +408,7 @@ class DocumentClassifier: return content - def predict_correspondent(self, content: str) -> Optional[int]: + def predict_correspondent(self, content: str) -> int | None: if self.correspondent_classifier: X = self.data_vectorizer.transform([self.preprocess_content(content)]) correspondent_id = self.correspondent_classifier.predict(X) @@ -419,7 +419,7 @@ class DocumentClassifier: else: return None - def predict_document_type(self, content: str) -> Optional[int]: + def predict_document_type(self, content: str) -> int | None: if self.document_type_classifier: X = self.data_vectorizer.transform([self.preprocess_content(content)]) document_type_id = self.document_type_classifier.predict(X) @@ -451,7 +451,7 @@ class DocumentClassifier: else: return [] - def predict_storage_path(self, content: str) -> Optional[int]: + def predict_storage_path(self, content: str) -> int | None: if self.storage_path_classifier: X = self.data_vectorizer.transform([self.preprocess_content(content)]) storage_path_id = self.storage_path_classifier.predict(X) diff --git a/src/documents/conditionals.py b/src/documents/conditionals.py index 14fe3096a..47d9bfe4b 100644 --- a/src/documents/conditionals.py +++ b/src/documents/conditionals.py @@ -1,6 +1,5 @@ from datetime import datetime from datetime import timezone -from typing import Optional from django.conf import settings from django.core.cache import cache @@ -15,7 +14,7 @@ from documents.classifier import DocumentClassifier from documents.models import Document -def suggestions_etag(request, pk: int) -> Optional[str]: +def suggestions_etag(request, pk: int) -> str | None: """ Returns an optional string for the ETag, allowing browser caching of suggestions if the classifier has not been changed and the suggested dates @@ -42,7 +41,7 @@ def suggestions_etag(request, pk: int) -> Optional[str]: return None -def suggestions_last_modified(request, pk: int) -> Optional[datetime]: +def suggestions_last_modified(request, pk: int) -> datetime | None: """ Returns the datetime of classifier last modification. This is slightly off, as there is not way to track the suggested date setting modification, but it seems @@ -67,7 +66,7 @@ def suggestions_last_modified(request, pk: int) -> Optional[datetime]: return None -def metadata_etag(request, pk: int) -> Optional[str]: +def metadata_etag(request, pk: int) -> str | None: """ Metadata is extracted from the original file, so use its checksum as the ETag @@ -80,7 +79,7 @@ def metadata_etag(request, pk: int) -> Optional[str]: return None -def metadata_last_modified(request, pk: int) -> Optional[datetime]: +def metadata_last_modified(request, pk: int) -> datetime | None: """ Metadata is extracted from the original file, so use its modified. Strictly speaking, this is not the modification of the original file, but of the database object, but might as well @@ -94,7 +93,7 @@ def metadata_last_modified(request, pk: int) -> Optional[datetime]: return None -def preview_etag(request, pk: int) -> Optional[str]: +def preview_etag(request, pk: int) -> str | None: """ ETag for the document preview, using the original or archive checksum, depending on the request """ @@ -110,7 +109,7 @@ def preview_etag(request, pk: int) -> Optional[str]: return None -def preview_last_modified(request, pk: int) -> Optional[datetime]: +def preview_last_modified(request, pk: int) -> datetime | None: """ Uses the documents modified time to set the Last-Modified header. Not strictly speaking correct, but close enough and quick @@ -123,7 +122,7 @@ def preview_last_modified(request, pk: int) -> Optional[datetime]: return None -def thumbnail_last_modified(request, pk: int) -> Optional[datetime]: +def thumbnail_last_modified(request, pk: int) -> datetime | None: """ Returns the filesystem last modified either from cache or from filesystem. Cache should be (slightly?) faster than filesystem diff --git a/src/documents/consumer.py b/src/documents/consumer.py index 97910e24b..803d82510 100644 --- a/src/documents/consumer.py +++ b/src/documents/consumer.py @@ -5,8 +5,6 @@ import tempfile from enum import Enum from pathlib import Path from typing import TYPE_CHECKING -from typing import Optional -from typing import Union import magic from django.conf import settings @@ -61,7 +59,7 @@ class WorkflowTriggerPlugin( ): NAME: str = "WorkflowTriggerPlugin" - def run(self) -> Optional[str]: + def run(self) -> str | None: """ Get overrides from matching workflows """ @@ -278,7 +276,7 @@ class ConsumerPlugin( current_progress: int, max_progress: int, status: ProgressStatusOptions, - message: Optional[Union[ConsumerStatusShortMessage, str]] = None, + message: ConsumerStatusShortMessage | str | None = None, document_id=None, ): # pragma: no cover self.status_mgr.send_progress( @@ -294,10 +292,10 @@ class ConsumerPlugin( def _fail( self, - message: Union[ConsumerStatusShortMessage, str], - log_message: Optional[str] = None, + message: ConsumerStatusShortMessage | str, + log_message: str | None = None, exc_info=None, - exception: Optional[Exception] = None, + exception: Exception | None = None, ): self._send_progress(100, 100, ProgressStatusOptions.FAILED, message) self.log.error(log_message or message, exc_info=exc_info) @@ -572,10 +570,8 @@ class ConsumerPlugin( self.log.error(f"Error attempting to clean PDF: {e}") # Based on the mime type, get the parser for that type - parser_class: Optional[type[DocumentParser]] = ( - get_parser_class_for_mime_type( - mime_type, - ) + parser_class: type[DocumentParser] | None = get_parser_class_for_mime_type( + mime_type, ) if not parser_class: tempdir.cleanup() @@ -832,8 +828,8 @@ class ConsumerPlugin( def _store( self, text: str, - date: Optional[datetime.datetime], - page_count: Optional[int], + date: datetime.datetime | None, + page_count: int | None, mime_type: str, ) -> Document: # If someone gave us the original filename, use it instead of doc. @@ -961,7 +957,7 @@ def parse_doc_title_w_placeholders( owner_username: str, local_added: datetime.datetime, original_filename: str, - created: Optional[datetime.datetime] = None, + created: datetime.datetime | None = None, ) -> str: """ Available title placeholders for Workflows depend on what has already been assigned, diff --git a/src/documents/data_models.py b/src/documents/data_models.py index b99c8511d..231e59005 100644 --- a/src/documents/data_models.py +++ b/src/documents/data_models.py @@ -2,7 +2,6 @@ import dataclasses import datetime from enum import IntEnum from pathlib import Path -from typing import Optional import magic from guardian.shortcuts import get_groups_with_perms @@ -17,20 +16,20 @@ class DocumentMetadataOverrides: meaning no override is happening """ - filename: Optional[str] = None - title: Optional[str] = None - correspondent_id: Optional[int] = None - document_type_id: Optional[int] = None - tag_ids: Optional[list[int]] = None - storage_path_id: Optional[int] = None - created: Optional[datetime.datetime] = None - asn: Optional[int] = None - owner_id: Optional[int] = None - view_users: Optional[list[int]] = None - view_groups: Optional[list[int]] = None - change_users: Optional[list[int]] = None - change_groups: Optional[list[int]] = None - custom_field_ids: Optional[list[int]] = None + filename: str | None = None + title: str | None = None + correspondent_id: int | None = None + document_type_id: int | None = None + tag_ids: list[int] | None = None + storage_path_id: int | None = None + created: datetime.datetime | None = None + asn: int | None = None + owner_id: int | None = None + view_users: list[int] | None = None + view_groups: list[int] | None = None + change_users: list[int] | None = None + change_groups: list[int] | None = None + custom_field_ids: list[int] | None = None def update(self, other: "DocumentMetadataOverrides") -> "DocumentMetadataOverrides": """ @@ -156,7 +155,7 @@ class ConsumableDocument: source: DocumentSource original_file: Path - mailrule_id: Optional[int] = None + mailrule_id: int | None = None mime_type: str = dataclasses.field(init=False, default=None) def __post_init__(self): diff --git a/src/documents/double_sided.py b/src/documents/double_sided.py index bfe66f4fe..3c3ec4723 100644 --- a/src/documents/double_sided.py +++ b/src/documents/double_sided.py @@ -4,7 +4,6 @@ import os import shutil from pathlib import Path from typing import Final -from typing import Optional from django.conf import settings from pikepdf import Pdf @@ -37,7 +36,7 @@ class CollatePlugin(NoCleanupPluginMixin, NoSetupPluginMixin, ConsumeTaskPlugin) in self.input_doc.original_file.parts ) - def run(self) -> Optional[str]: + def run(self) -> str | None: """ Tries to collate pages from 2 single sided scans of a double sided document. diff --git a/src/documents/filters.py b/src/documents/filters.py index 5288bd45c..25e840141 100644 --- a/src/documents/filters.py +++ b/src/documents/filters.py @@ -2,9 +2,8 @@ import functools import inspect import json import operator +from collections.abc import Callable from contextlib import contextmanager -from typing import Callable -from typing import Union from django.contrib.contenttypes.models import ContentType from django.db.models import CharField @@ -332,7 +331,7 @@ class CustomFieldLookupParser: `max_query_depth` and `max_atom_count` can be set to guard against generating arbitrarily complex SQL queries. """ - self._custom_fields: dict[Union[int, str], CustomField] = {} + self._custom_fields: dict[int | str, CustomField] = {} self._validation_prefix = validation_prefix # Dummy ModelSerializer used to convert a Django models.Field to serializers.Field. self._model_serializer = serializers.ModelSerializer() @@ -366,7 +365,7 @@ class CustomFieldLookupParser: Applies rule (1, 2, 3) or (4, 5, 6) based on the length of the expr. """ with self._track_query_depth(): - if isinstance(expr, (list, tuple)): + if isinstance(expr, list | tuple): if len(expr) == 2: return self._parse_logical_expr(*expr) elif len(expr) == 3: @@ -380,7 +379,7 @@ class CustomFieldLookupParser: """ Handles [`q0`, `q1`, ..., `qn`] in rule 4 & 5. """ - if not isinstance(exprs, (list, tuple)) or not exprs: + if not isinstance(exprs, list | tuple) or not exprs: raise serializers.ValidationError( [_("Invalid expression list. Must be nonempty.")], ) diff --git a/src/documents/index.py b/src/documents/index.py index 03b8c4f35..eacd1f99b 100644 --- a/src/documents/index.py +++ b/src/documents/index.py @@ -6,7 +6,6 @@ from contextlib import contextmanager from datetime import datetime from datetime import timezone from shutil import rmtree -from typing import Optional from django.conf import settings from django.db.models import QuerySet @@ -389,7 +388,7 @@ def autocomplete( ix: FileIndex, term: str, limit: int = 10, - user: Optional[User] = None, + user: User | None = None, ): """ Mimics whoosh.reading.IndexReader.most_distinctive_terms with permissions @@ -425,7 +424,7 @@ def autocomplete( return terms -def get_permissions_criterias(user: Optional[User] = None): +def get_permissions_criterias(user: User | None = None): user_criterias = [query.Term("has_owner", False)] if user is not None: if user.is_superuser: # superusers see all docs diff --git a/src/documents/management/commands/document_consumer.py b/src/documents/management/commands/document_consumer.py index 97f9fcc59..1eb2f6541 100644 --- a/src/documents/management/commands/document_consumer.py +++ b/src/documents/management/commands/document_consumer.py @@ -251,7 +251,7 @@ class Command(BaseCommand): self.handle_inotify(directory, recursive, options["testing"]) else: if INotify is None and settings.CONSUMER_POLLING == 0: # pragma: no cover - logger.warn("Using polling as INotify import failed") + logger.warning("Using polling as INotify import failed") self.handle_polling(directory, recursive, options["testing"]) logger.debug("Consumer exiting.") @@ -267,7 +267,7 @@ class Command(BaseCommand): polling_interval = settings.CONSUMER_POLLING if polling_interval == 0: # pragma: no cover # Only happens if INotify failed to import - logger.warn("Using polling of 10s, consider setting this") + logger.warning("Using polling of 10s, consider setting this") polling_interval = 10 with ThreadPoolExecutor(max_workers=4) as pool: diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py index 618c1a4e5..3d7352c1a 100644 --- a/src/documents/management/commands/document_exporter.py +++ b/src/documents/management/commands/document_exporter.py @@ -6,7 +6,6 @@ import tempfile import time from pathlib import Path from typing import TYPE_CHECKING -from typing import Optional import tqdm from django.conf import settings @@ -183,7 +182,7 @@ class Command(CryptMixin, BaseCommand): self.zip_export: bool = options["zip"] self.data_only: bool = options["data_only"] self.no_progress_bar: bool = options["no_progress_bar"] - self.passphrase: Optional[str] = options.get("passphrase") + self.passphrase: str | None = options.get("passphrase") self.files_in_export_dir: set[Path] = set() self.exported_files: set[str] = set() @@ -427,7 +426,7 @@ class Command(CryptMixin, BaseCommand): document: Document, base_name: str, document_dict: dict, - ) -> tuple[Path, Optional[Path], Optional[Path]]: + ) -> tuple[Path, Path | None, Path | None]: """ Generates the targets for a given document, including the original file, archive file and thumbnail (depending on settings). """ @@ -461,8 +460,8 @@ class Command(CryptMixin, BaseCommand): self, document: Document, original_target: Path, - thumbnail_target: Optional[Path], - archive_target: Optional[Path], + thumbnail_target: Path | None, + archive_target: Path | None, ) -> None: """ Copies files from the document storage location to the specified target location. @@ -512,7 +511,7 @@ class Command(CryptMixin, BaseCommand): def check_and_copy( self, source: Path, - source_checksum: Optional[str], + source_checksum: str | None, target: Path, ): """ diff --git a/src/documents/management/commands/document_importer.py b/src/documents/management/commands/document_importer.py index 3535e1476..a402466f4 100644 --- a/src/documents/management/commands/document_importer.py +++ b/src/documents/management/commands/document_importer.py @@ -3,7 +3,6 @@ import logging import os from contextlib import contextmanager from pathlib import Path -from typing import Optional import tqdm from django.conf import settings @@ -228,8 +227,8 @@ class Command(CryptMixin, BaseCommand): self.data_only: bool = options["data_only"] self.no_progress_bar: bool = options["no_progress_bar"] self.passphrase: str | None = options.get("passphrase") - self.version: Optional[str] = None - self.salt: Optional[str] = None + self.version: str | None = None + self.salt: str | None = None self.manifest_paths = [] self.manifest = [] diff --git a/src/documents/management/commands/mixins.py b/src/documents/management/commands/mixins.py index 823631586..212ecf597 100644 --- a/src/documents/management/commands/mixins.py +++ b/src/documents/management/commands/mixins.py @@ -1,9 +1,7 @@ import base64 import os from argparse import ArgumentParser -from typing import Optional from typing import TypedDict -from typing import Union from cryptography.fernet import Fernet from cryptography.hazmat.primitives import hashes @@ -103,7 +101,7 @@ class CryptMixin: }, ] - def get_crypt_params(self) -> dict[str, dict[str, Union[str, int]]]: + def get_crypt_params(self) -> dict[str, dict[str, str | int]]: return { EXPORTER_CRYPTO_SETTINGS_NAME: { EXPORTER_CRYPTO_ALGO_NAME: self.kdf_algorithm, @@ -128,7 +126,7 @@ class CryptMixin: EXPORTER_CRYPTO_SALT_NAME ] - def setup_crypto(self, *, passphrase: str, salt: Optional[str] = None): + def setup_crypto(self, *, passphrase: str, salt: str | None = None): """ Constructs a class for encryption or decryption using the specified passphrase and salt diff --git a/src/documents/matching.py b/src/documents/matching.py index 586ca3a6a..36fa9a2c6 100644 --- a/src/documents/matching.py +++ b/src/documents/matching.py @@ -1,7 +1,6 @@ import logging import re from fnmatch import fnmatch -from typing import Union from documents.classifier import DocumentClassifier from documents.data_models import ConsumableDocument @@ -20,7 +19,7 @@ logger = logging.getLogger("paperless.matching") def log_reason( - matching_model: Union[MatchingModel, WorkflowTrigger], + matching_model: MatchingModel | WorkflowTrigger, document: Document, reason: str, ): @@ -386,7 +385,7 @@ def existing_document_matches_workflow( def document_matches_workflow( - document: Union[ConsumableDocument, Document], + document: ConsumableDocument | Document, workflow: Workflow, trigger_type: WorkflowTrigger.WorkflowTriggerType, ) -> bool: diff --git a/src/documents/models.py b/src/documents/models.py index 772e10fde..6dae8ba65 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -5,7 +5,6 @@ import re from collections import OrderedDict from pathlib import Path from typing import Final -from typing import Optional import dateutil.parser import pathvalidate @@ -326,7 +325,7 @@ class Document(SoftDeleteModel, ModelWithOwner): return self.archive_filename is not None @property - def archive_path(self) -> Optional[Path]: + def archive_path(self) -> Path | None: if self.has_archive_version: return (settings.ARCHIVE_DIR / Path(str(self.archive_filename))).resolve() else: diff --git a/src/documents/parsers.py b/src/documents/parsers.py index 63599c0c5..2d73dc63f 100644 --- a/src/documents/parsers.py +++ b/src/documents/parsers.py @@ -10,7 +10,6 @@ from collections.abc import Iterator from functools import lru_cache from pathlib import Path from re import Match -from typing import Optional from django.conf import settings from django.utils import timezone @@ -107,7 +106,7 @@ def get_supported_file_extensions() -> set[str]: return extensions -def get_parser_class_for_mime_type(mime_type: str) -> Optional[type["DocumentParser"]]: +def get_parser_class_for_mime_type(mime_type: str) -> type["DocumentParser"] | None: """ Returns the best parser (by weight) for the given mimetype or None if no parser exists @@ -252,7 +251,7 @@ def make_thumbnail_from_pdf(in_path, temp_dir, logging_group=None) -> Path: return out_path -def parse_date(filename, text) -> Optional[datetime.datetime]: +def parse_date(filename, text) -> datetime.datetime | None: return next(parse_date_generator(filename, text), None) @@ -277,7 +276,7 @@ def parse_date_generator(filename, text) -> Iterator[datetime.datetime]: }, ) - def __filter(date: datetime.datetime) -> Optional[datetime.datetime]: + def __filter(date: datetime.datetime) -> datetime.datetime | None: if ( date is not None and date.year > 1900 @@ -290,7 +289,7 @@ def parse_date_generator(filename, text) -> Iterator[datetime.datetime]: def __process_match( match: Match[str], date_order: str, - ) -> Optional[datetime.datetime]: + ) -> datetime.datetime | None: date_string = match.group(0) try: @@ -339,7 +338,7 @@ class DocumentParser(LoggingMixin): self.archive_path = None self.text = None - self.date: Optional[datetime.datetime] = None + self.date: datetime.datetime | None = None self.progress_callback = progress_callback def progress(self, current_progress, max_progress): @@ -385,7 +384,7 @@ class DocumentParser(LoggingMixin): def get_text(self): return self.text - def get_date(self) -> Optional[datetime.datetime]: + def get_date(self) -> datetime.datetime | None: return self.date def cleanup(self): diff --git a/src/documents/plugins/base.py b/src/documents/plugins/base.py index 14d6ea696..81f0c86c3 100644 --- a/src/documents/plugins/base.py +++ b/src/documents/plugins/base.py @@ -1,7 +1,6 @@ import abc from pathlib import Path from typing import Final -from typing import Optional from documents.data_models import ConsumableDocument from documents.data_models import DocumentMetadataOverrides @@ -88,7 +87,7 @@ class ConsumeTaskPlugin(abc.ABC): """ @abc.abstractmethod - def run(self) -> Optional[str]: + def run(self) -> str | None: """ The bulk of plugin processing, this does whatever action the plugin is for. diff --git a/src/documents/plugins/helpers.py b/src/documents/plugins/helpers.py index 2d3686db4..20380b852 100644 --- a/src/documents/plugins/helpers.py +++ b/src/documents/plugins/helpers.py @@ -1,7 +1,5 @@ import enum from typing import TYPE_CHECKING -from typing import Optional -from typing import Union from asgiref.sync import async_to_sync from channels.layers import get_channel_layer @@ -23,9 +21,9 @@ class ProgressManager: of the open/close of the layer to ensure messages go out and everything is cleaned up """ - def __init__(self, filename: str, task_id: Optional[str] = None) -> None: + def __init__(self, filename: str, task_id: str | None = None) -> None: self.filename = filename - self._channel: Optional[RedisPubSubChannelLayer] = None + self._channel: RedisPubSubChannelLayer | None = None self.task_id = task_id def __enter__(self): @@ -57,7 +55,7 @@ class ProgressManager: message: str, current_progress: int, max_progress: int, - extra_args: Optional[dict[str, Union[str, int, None]]] = None, + extra_args: dict[str, str | int | None] | None = None, ) -> None: # Ensure the layer is open self.open() diff --git a/src/documents/signals/handlers.py b/src/documents/signals/handlers.py index 2cf73ca41..cf6733dd5 100644 --- a/src/documents/signals/handlers.py +++ b/src/documents/signals/handlers.py @@ -1,7 +1,6 @@ import logging import os import shutil -from typing import Optional from celery import states from celery.signals import before_task_publish @@ -62,7 +61,7 @@ def _suggestion_printer( suggestion_type: str, document: Document, selected: MatchingModel, - base_url: Optional[str] = None, + base_url: str | None = None, ): """ Smaller helper to reduce duplication when just outputting suggestions to the console @@ -80,7 +79,7 @@ def set_correspondent( sender, document: Document, logging_group=None, - classifier: Optional[DocumentClassifier] = None, + classifier: DocumentClassifier | None = None, replace=False, use_first=True, suggest=False, @@ -135,7 +134,7 @@ def set_document_type( sender, document: Document, logging_group=None, - classifier: Optional[DocumentClassifier] = None, + classifier: DocumentClassifier | None = None, replace=False, use_first=True, suggest=False, @@ -191,7 +190,7 @@ def set_tags( sender, document: Document, logging_group=None, - classifier: Optional[DocumentClassifier] = None, + classifier: DocumentClassifier | None = None, replace=False, suggest=False, base_url=None, @@ -246,7 +245,7 @@ def set_storage_path( sender, document: Document, logging_group=None, - classifier: Optional[DocumentClassifier] = None, + classifier: DocumentClassifier | None = None, replace=False, use_first=True, suggest=False, diff --git a/src/documents/tasks.py b/src/documents/tasks.py index 2f1bc2ee4..8f5ee51bc 100644 --- a/src/documents/tasks.py +++ b/src/documents/tasks.py @@ -5,7 +5,6 @@ import uuid from datetime import timedelta from pathlib import Path from tempfile import TemporaryDirectory -from typing import Optional import tqdm from celery import Task @@ -106,7 +105,7 @@ def train_classifier(): def consume_file( self: Task, input_doc: ConsumableDocument, - overrides: Optional[DocumentMetadataOverrides] = None, + overrides: DocumentMetadataOverrides | None = None, ): # Default no overrides if overrides is None: diff --git a/src/documents/tests/test_api_filter_by_custom_fields.py b/src/documents/tests/test_api_filter_by_custom_fields.py index 9ab96d068..0f7da0a61 100644 --- a/src/documents/tests/test_api_filter_by_custom_fields.py +++ b/src/documents/tests/test_api_filter_by_custom_fields.py @@ -1,7 +1,7 @@ import json import re +from collections.abc import Callable from datetime import date -from typing import Callable from unittest.mock import Mock from urllib.parse import quote diff --git a/src/documents/tests/test_double_sided.py b/src/documents/tests/test_double_sided.py index 64cd7be48..5d068b735 100644 --- a/src/documents/tests/test_double_sided.py +++ b/src/documents/tests/test_double_sided.py @@ -2,7 +2,6 @@ import datetime as dt import os import shutil from pathlib import Path -from typing import Union from unittest import mock from django.test import TestCase @@ -34,7 +33,7 @@ class TestDoubleSided(DirectoriesMixin, FileSystemAssertsMixin, TestCase): self.dirs.double_sided_dir.mkdir() self.staging_file = self.dirs.scratch_dir / STAGING_FILE_NAME - def consume_file(self, srcname, dstname: Union[str, Path] = "foo.pdf"): + def consume_file(self, srcname, dstname: str | Path = "foo.pdf"): """ Starts the consume process and also ensures the destination file does not exist afterwards diff --git a/src/documents/tests/test_migration_archive_files.py b/src/documents/tests/test_migration_archive_files.py index 17dc8f040..5039e13de 100644 --- a/src/documents/tests/test_migration_archive_files.py +++ b/src/documents/tests/test_migration_archive_files.py @@ -3,7 +3,6 @@ import importlib import os import shutil from pathlib import Path -from typing import Optional from unittest import mock from django.conf import settings @@ -66,8 +65,8 @@ def make_test_document( mime_type: str, original: str, original_filename: str, - archive: Optional[str] = None, - archive_filename: Optional[str] = None, + archive: str | None = None, + archive_filename: str | None = None, ): doc = document_class() doc.filename = original_filename diff --git a/src/documents/tests/test_migration_encrypted_webp_conversion.py b/src/documents/tests/test_migration_encrypted_webp_conversion.py index 35a711901..0660df368 100644 --- a/src/documents/tests/test_migration_encrypted_webp_conversion.py +++ b/src/documents/tests/test_migration_encrypted_webp_conversion.py @@ -1,10 +1,9 @@ import importlib import shutil import tempfile +from collections.abc import Callable from collections.abc import Iterable from pathlib import Path -from typing import Callable -from typing import Union from unittest import mock from django.test import override_settings @@ -115,7 +114,7 @@ class TestMigrateToEncrytpedWebPThumbnails(TestMigrations): def assert_file_count_by_extension( self, ext: str, - dir: Union[str, Path], + dir: str | Path, expected_count: int, ): """ diff --git a/src/documents/tests/test_migration_webp_conversion.py b/src/documents/tests/test_migration_webp_conversion.py index cf0ee22a8..cd148ed6f 100644 --- a/src/documents/tests/test_migration_webp_conversion.py +++ b/src/documents/tests/test_migration_webp_conversion.py @@ -1,10 +1,9 @@ import importlib import shutil import tempfile +from collections.abc import Callable from collections.abc import Iterable from pathlib import Path -from typing import Callable -from typing import Union from unittest import mock from django.test import override_settings @@ -86,7 +85,7 @@ class TestMigrateWebPThumbnails(TestMigrations): def assert_file_count_by_extension( self, ext: str, - dir: Union[str, Path], + dir: str | Path, expected_count: int, ): """ diff --git a/src/documents/tests/utils.py b/src/documents/tests/utils.py index 4ec0851df..cd4db84e6 100644 --- a/src/documents/tests/utils.py +++ b/src/documents/tests/utils.py @@ -3,15 +3,13 @@ import tempfile import time import warnings from collections import namedtuple +from collections.abc import Callable from collections.abc import Generator from collections.abc import Iterator from contextlib import contextmanager from os import PathLike from pathlib import Path from typing import Any -from typing import Callable -from typing import Optional -from typing import Union from unittest import mock import httpx @@ -91,7 +89,7 @@ def paperless_environment(): def util_call_with_backoff( method_or_callable: Callable, - args: Union[list, tuple], + args: list | tuple, *, skip_on_50x_err=True, ) -> tuple[bool, Any]: @@ -170,22 +168,22 @@ class FileSystemAssertsMixin: Utilities for checks various state information of the file system """ - def assertIsFile(self, path: Union[PathLike, str]): + def assertIsFile(self, path: PathLike | str): self.assertTrue(Path(path).resolve().is_file(), f"File does not exist: {path}") - def assertIsNotFile(self, path: Union[PathLike, str]): + def assertIsNotFile(self, path: PathLike | str): self.assertFalse(Path(path).resolve().is_file(), f"File does exist: {path}") - def assertIsDir(self, path: Union[PathLike, str]): + def assertIsDir(self, path: PathLike | str): self.assertTrue(Path(path).resolve().is_dir(), f"Dir does not exist: {path}") - def assertIsNotDir(self, path: Union[PathLike, str]): + def assertIsNotDir(self, path: PathLike | str): self.assertFalse(Path(path).resolve().is_dir(), f"Dir does exist: {path}") def assertFilesEqual( self, - path1: Union[PathLike, str], - path2: Union[PathLike, str], + path1: PathLike | str, + path2: PathLike | str, ): path1 = Path(path1) path2 = Path(path2) @@ -196,7 +194,7 @@ class FileSystemAssertsMixin: self.assertEqual(hash1, hash2, "File SHA256 mismatch") - def assertFileCountInDir(self, path: Union[PathLike, str], count: int): + def assertFileCountInDir(self, path: PathLike | str, count: int): path = Path(path).resolve() self.assertTrue(path.is_dir(), f"Path {path} is not a directory") files = [x for x in path.iterdir() if x.is_file()] @@ -340,7 +338,7 @@ class GetConsumerMixin: def get_consumer( self, filepath: Path, - overrides: Union[DocumentMetadataOverrides, None] = None, + overrides: DocumentMetadataOverrides | None = None, source: DocumentSource = DocumentSource.ConsumeFolder, ) -> Generator[ConsumerPlugin, None, None]: # Store this for verification @@ -368,7 +366,7 @@ class DummyProgressManager: mock.patch("documents.tasks.ProgressManager", DummyProgressManager) """ - def __init__(self, filename: str, task_id: Optional[str] = None) -> None: + def __init__(self, filename: str, task_id: str | None = None) -> None: self.filename = filename self.task_id = task_id self.payloads = [] @@ -392,7 +390,7 @@ class DummyProgressManager: message: str, current_progress: int, max_progress: int, - extra_args: Optional[dict[str, Union[str, int]]] = None, + extra_args: dict[str, str | int] | None = None, ) -> None: # Ensure the layer is open self.open() diff --git a/src/documents/utils.py b/src/documents/utils.py index 0af1f54e3..d8a8e8ab2 100644 --- a/src/documents/utils.py +++ b/src/documents/utils.py @@ -4,21 +4,19 @@ from os import utime from pathlib import Path from subprocess import CompletedProcess from subprocess import run -from typing import Optional -from typing import Union from django.conf import settings from PIL import Image def _coerce_to_path( - source: Union[Path, str], - dest: Union[Path, str], + source: Path | str, + dest: Path | str, ) -> tuple[Path, Path]: return Path(source).resolve(), Path(dest).resolve() -def copy_basic_file_stats(source: Union[Path, str], dest: Union[Path, str]) -> None: +def copy_basic_file_stats(source: Path | str, dest: Path | str) -> None: """ Copies only the m_time and a_time attributes from source to destination. Both are expected to exist. @@ -33,8 +31,8 @@ def copy_basic_file_stats(source: Union[Path, str], dest: Union[Path, str]) -> N def copy_file_with_basic_stats( - source: Union[Path, str], - dest: Union[Path, str], + source: Path | str, + dest: Path | str, ) -> None: """ A sort of simpler copy2 that doesn't copy extended file attributes, @@ -53,7 +51,7 @@ def maybe_override_pixel_limit() -> None: """ Maybe overrides the PIL limit on pixel count, if configured to allow it """ - limit: Optional[Union[float, int]] = settings.MAX_IMAGE_PIXELS + limit: float | int | None = settings.MAX_IMAGE_PIXELS if limit is not None and limit >= 0: pixel_count = limit if pixel_count == 0: @@ -63,8 +61,8 @@ def maybe_override_pixel_limit() -> None: def run_subprocess( arguments: list[str], - env: Optional[dict[str, str]] = None, - logger: Optional[logging.Logger] = None, + env: dict[str, str] | None = None, + logger: logging.Logger | None = None, *, check_exit_code: bool = True, log_stdout: bool = True, diff --git a/src/documents/views.py b/src/documents/views.py index 723eddd00..c870c15b5 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -1638,9 +1638,8 @@ class RemoteVersionView(GenericAPIView): try: remote_json = json.loads(remote) remote_version = remote_json["tag_name"] - # Basically PEP 616 but that only went in 3.9 - if remote_version.startswith("ngx-"): - remote_version = remote_version[len("ngx-") :] + # Some early tags used ngx-x.y.z + remote_version = remote_version.removeprefix("ngx-") except ValueError: logger.debug("An error occurred parsing remote version json") except urllib.error.URLError: diff --git a/src/paperless/config.py b/src/paperless/config.py index 00afb2a13..8a40fc6c6 100644 --- a/src/paperless/config.py +++ b/src/paperless/config.py @@ -1,6 +1,5 @@ import dataclasses import json -from typing import Optional from django.conf import settings @@ -44,18 +43,18 @@ class OcrConfig(OutputTypeConfig): correspond almost directly to the OCRMyPDF options """ - pages: Optional[int] = dataclasses.field(init=False) + pages: int | None = dataclasses.field(init=False) language: str = dataclasses.field(init=False) mode: str = dataclasses.field(init=False) skip_archive_file: str = dataclasses.field(init=False) - image_dpi: Optional[int] = dataclasses.field(init=False) + image_dpi: int | None = dataclasses.field(init=False) clean: str = dataclasses.field(init=False) deskew: bool = dataclasses.field(init=False) rotate: bool = dataclasses.field(init=False) rotate_threshold: float = dataclasses.field(init=False) - max_image_pixel: Optional[float] = dataclasses.field(init=False) + max_image_pixel: float | None = dataclasses.field(init=False) color_conversion_strategy: str = dataclasses.field(init=False) - user_args: Optional[dict[str, str]] = dataclasses.field(init=False) + user_args: dict[str, str] | None = dataclasses.field(init=False) def __post_init__(self) -> None: super().__post_init__() diff --git a/src/paperless/settings.py b/src/paperless/settings.py index 2da0b49f1..023e826c9 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -9,8 +9,6 @@ from os import PathLike from pathlib import Path from platform import machine from typing import Final -from typing import Optional -from typing import Union from urllib.parse import urlparse from celery.schedules import crontab @@ -57,7 +55,7 @@ def __get_int(key: str, default: int) -> int: return int(os.getenv(key, default)) -def __get_optional_int(key: str) -> Optional[int]: +def __get_optional_int(key: str) -> int | None: """ Returns None if the environment key is not present, otherwise an integer """ @@ -75,7 +73,7 @@ def __get_float(key: str, default: float) -> float: def __get_path( key: str, - default: Union[PathLike, str], + default: PathLike | str, ) -> Path: """ Return a normalized, absolute path based on the environment variable or a default, @@ -86,7 +84,7 @@ def __get_path( return Path(default).resolve() -def __get_optional_path(key: str) -> Optional[Path]: +def __get_optional_path(key: str) -> Path | None: """ Returns None if the environment key is not present, otherwise a fully resolved Path """ @@ -97,7 +95,7 @@ def __get_optional_path(key: str) -> Optional[Path]: def __get_list( key: str, - default: Optional[list[str]] = None, + default: list[str] | None = None, sep: str = ",", ) -> list[str]: """ @@ -112,7 +110,7 @@ def __get_list( return [] -def _parse_redis_url(env_redis: Optional[str]) -> tuple[str, str]: +def _parse_redis_url(env_redis: str | None) -> tuple[str, str]: """ Gets the Redis information from the environment or a default and handles converting from incompatible django_channels and celery formats. @@ -989,7 +987,7 @@ OCR_ROTATE_PAGES_THRESHOLD: Final[float] = __get_float( 12.0, ) -OCR_MAX_IMAGE_PIXELS: Final[Optional[int]] = __get_optional_int( +OCR_MAX_IMAGE_PIXELS: Final[int | None] = __get_optional_int( "PAPERLESS_OCR_MAX_IMAGE_PIXELS", ) @@ -1000,7 +998,7 @@ OCR_COLOR_CONVERSION_STRATEGY = os.getenv( OCR_USER_ARGS = os.getenv("PAPERLESS_OCR_USER_ARGS") -MAX_IMAGE_PIXELS: Final[Optional[int]] = __get_optional_int( +MAX_IMAGE_PIXELS: Final[int | None] = __get_optional_int( "PAPERLESS_MAX_IMAGE_PIXELS", ) @@ -1128,7 +1126,7 @@ APP_LOGO = os.getenv("PAPERLESS_APP_LOGO", None) ############################################################################### -def _get_nltk_language_setting(ocr_lang: str) -> Optional[str]: +def _get_nltk_language_setting(ocr_lang: str) -> str | None: """ Maps an ISO-639-1 language code supported by Tesseract into an optional NLTK language name. This is the set of common supported @@ -1165,7 +1163,7 @@ def _get_nltk_language_setting(ocr_lang: str) -> Optional[str]: NLTK_ENABLED: Final[bool] = __get_boolean("PAPERLESS_ENABLE_NLTK", "yes") -NLTK_LANGUAGE: Optional[str] = _get_nltk_language_setting(OCR_LANGUAGE) +NLTK_LANGUAGE: str | None = _get_nltk_language_setting(OCR_LANGUAGE) ############################################################################### # Email (SMTP) Backend # @@ -1187,7 +1185,7 @@ if DEBUG: # pragma: no cover # Email Preprocessors # ############################################################################### -EMAIL_GNUPG_HOME: Final[Optional[str]] = os.getenv("PAPERLESS_EMAIL_GNUPG_HOME") +EMAIL_GNUPG_HOME: Final[str | None] = os.getenv("PAPERLESS_EMAIL_GNUPG_HOME") EMAIL_ENABLE_GPG_DECRYPTOR: Final[bool] = __get_boolean( "PAPERLESS_ENABLE_GPG_DECRYPTOR", ) diff --git a/src/paperless_mail/mail.py b/src/paperless_mail/mail.py index 4ecd44659..b52a2ebe4 100644 --- a/src/paperless_mail/mail.py +++ b/src/paperless_mail/mail.py @@ -10,8 +10,6 @@ from datetime import timedelta from fnmatch import fnmatch from pathlib import Path from typing import TYPE_CHECKING -from typing import Optional -from typing import Union import magic import pathvalidate @@ -84,7 +82,7 @@ class BaseMailAction: read mails when the action is to mark mails as read). """ - def get_criteria(self) -> Union[dict, LogicOperator]: + def get_criteria(self) -> dict | LogicOperator: """ Returns filtering criteria/query for this mail action. """ @@ -453,7 +451,7 @@ class MailAccountHandler(LoggingMixin): else: self.log.debug(f"Skipping mail preprocessor {preprocessor_type.NAME}") - def _correspondent_from_name(self, name: str) -> Optional[Correspondent]: + def _correspondent_from_name(self, name: str) -> Correspondent | None: try: return Correspondent.objects.get_or_create(name=name)[0] except DatabaseError as e: @@ -465,7 +463,7 @@ class MailAccountHandler(LoggingMixin): message: MailMessage, att: MailAttachment, rule: MailRule, - ) -> Optional[str]: + ) -> str | None: if rule.assign_title_from == MailRule.TitleSource.FROM_SUBJECT: return message.subject @@ -484,7 +482,7 @@ class MailAccountHandler(LoggingMixin): self, message: MailMessage, rule: MailRule, - ) -> Optional[Correspondent]: + ) -> Correspondent | None: c_from = rule.assign_correspondent_from if c_from == MailRule.CorrespondentSource.FROM_NOTHING: @@ -688,7 +686,7 @@ class MailAccountHandler(LoggingMixin): def filename_inclusion_matches( self, - filter_attachment_filename_include: Optional[str], + filter_attachment_filename_include: str | None, filename: str, ) -> bool: if filter_attachment_filename_include: @@ -707,7 +705,7 @@ class MailAccountHandler(LoggingMixin): def filename_exclusion_matches( self, - filter_attachment_filename_exclude: Optional[str], + filter_attachment_filename_exclude: str | None, filename: str, ) -> bool: if filter_attachment_filename_exclude: diff --git a/src/paperless_mail/parsers.py b/src/paperless_mail/parsers.py index 4e83844e2..d98fb7238 100644 --- a/src/paperless_mail/parsers.py +++ b/src/paperless_mail/parsers.py @@ -1,7 +1,6 @@ import re from html import escape from pathlib import Path -from typing import Optional from bleach import clean from bleach import linkify @@ -33,7 +32,7 @@ class MailDocumentParser(DocumentParser): logging_name = "paperless.parsing.mail" - def _settings_to_gotenberg_pdfa(self) -> Optional[PdfAFormat]: + def _settings_to_gotenberg_pdfa(self) -> PdfAFormat | None: """ Converts our requested PDF/A output into the Gotenberg API format @@ -44,7 +43,7 @@ class MailDocumentParser(DocumentParser): }: return PdfAFormat.A2b elif settings.OCR_OUTPUT_TYPE == OutputTypeChoices.PDF_A1: # pragma: no cover - self.log.warn( + self.log.warning( "Gotenberg does not support PDF/A-1a, choosing PDF/A-2b instead", ) return PdfAFormat.A2b diff --git a/src/paperless_mail/tests/test_mail.py b/src/paperless_mail/tests/test_mail.py index bdadc7450..c12b54ffe 100644 --- a/src/paperless_mail/tests/test_mail.py +++ b/src/paperless_mail/tests/test_mail.py @@ -4,8 +4,6 @@ import random import uuid from collections import namedtuple from contextlib import AbstractContextManager -from typing import Optional -from typing import Union from unittest import mock import pytest @@ -199,11 +197,11 @@ class MessageBuilder: def create_message( self, - attachments: Union[int, list[_AttachmentDef]] = 1, + attachments: int | list[_AttachmentDef] = 1, body: str = "", subject: str = "the subject", from_: str = "no_one@mail.com", - to: Optional[list[str]] = None, + to: list[str] | None = None, seen: bool = False, flagged: bool = False, processed: bool = False, @@ -622,8 +620,8 @@ class TestMail( @dataclasses.dataclass(frozen=True) class FilterTestCase: name: str - include_pattern: Optional[str] - exclude_pattern: Optional[str] + include_pattern: str | None + exclude_pattern: str | None expected_matches: list[str] tests = [ diff --git a/src/paperless_tesseract/parsers.py b/src/paperless_tesseract/parsers.py index 5731fe037..6b9ec3d93 100644 --- a/src/paperless_tesseract/parsers.py +++ b/src/paperless_tesseract/parsers.py @@ -3,7 +3,6 @@ import re import tempfile from pathlib import Path from typing import TYPE_CHECKING -from typing import Optional from django.conf import settings from PIL import Image @@ -124,7 +123,7 @@ class RasterisedDocumentParser(DocumentParser): ) return no_alpha_image - def get_dpi(self, image) -> Optional[int]: + def get_dpi(self, image) -> int | None: try: with Image.open(image) as im: x, y = im.info["dpi"] @@ -133,7 +132,7 @@ class RasterisedDocumentParser(DocumentParser): self.log.warning(f"Error while getting DPI from image {image}: {e}") return None - def calculate_a4_dpi(self, image) -> Optional[int]: + def calculate_a4_dpi(self, image) -> int | None: try: with Image.open(image) as im: width, height = im.size @@ -148,9 +147,9 @@ class RasterisedDocumentParser(DocumentParser): def extract_text( self, - sidecar_file: Optional[Path], + sidecar_file: Path | None, pdf_file: Path, - ) -> Optional[str]: + ) -> str | None: # When re-doing OCR, the sidecar contains ONLY the new text, not # the whole text, so do not utilize it in that case if ( diff --git a/src/paperless_tika/parsers.py b/src/paperless_tika/parsers.py index 519f6c6ae..f51a03916 100644 --- a/src/paperless_tika/parsers.py +++ b/src/paperless_tika/parsers.py @@ -102,7 +102,7 @@ class TikaDocumentParser(DocumentParser): }: route.pdf_format(PdfAFormat.A2b) elif settings.OCR_OUTPUT_TYPE == OutputTypeChoices.PDF_A1: - self.log.warn( + self.log.warning( "Gotenberg does not support PDF/A-1a, choosing PDF/A-2b instead", ) route.pdf_format(PdfAFormat.A2b)